本文收录于专栏 《经典机器学习实战》
摘要:配好一套全程复用的 conda 环境,用 diabetes 数据集五步跑通第一个线性回归(R² 0.316),再上手 USDA 南瓜真实脏数据:四步清洗 1757 行到 415 行、按蒲式耳归一化价格,学会建模前的可视化侦察。
关键字:线性回归,scikit-learn,数据清洗,pandas,数据可视化,conda环境,最小二乘,特征工程
阶段 2 · 回归(南瓜项目)| 来源:【原·05+06 合并】| 知识更新至 2026-10本课实战:
stage2/assets/stage2_demos.py,【已实测 2026-10】
概念讲解
2.1 环境:一次配好,全程复用
本阶段开始正式写代码。环境只需要配一次,后面所有课全用它:
bash
# conda 是默认推荐路径(依赖解析稳,跨平台一致)
conda create -n ml-course python=3.11 scikit-learn pandas matplotlib jupyter flask nltk -y
conda activate ml-course
# 补充包走 pip(国内镜像加速)
pip install textblob statsmodels onnx gym skl2onnx seaborn \
-i https://pypi.tuna.tsinghua.edu.cn/simple
本课程实测环境:conda env ml-course,scikit-learn 1.9.1 / pandas 3.0.6 / matplotlib。编辑器任选:VS Code、VSCodium、PyCharm 或纯命令行都行------本课程的代码全部是顺序执行的脚本,不挑 IDE。
Jupyter Notebook (.ipynb)是数据科学的通用工作方式:代码一格一格写、一格一格跑,格子之间穿插文字和图。它和普通脚本的区别在于交互性 ------改一行、跑一行、立刻看到输出,适合探索式工作。原课练习以 notebook 形式提供,本课程把同样的代码整理成可粘贴的代码块,notebook 或 .py 脚本跑都一样。
2.2 Scikit-learn:三行代码的 API 哲学
Scikit-learn 是本课程的主力库。它最出色的设计是所有模型的用法完全同构,学会一个就会全部:
python
model = SomeModel(...) # 1. 选模型、设参数
model.fit(X_train, y_train) # 2. 训练(拟合)
pred = model.predict(X_test) # 3. 预测
score = model.score(X_test, y_test) # 4. 评估
fit / predict / score 三件套贯穿全部课程。以后换任何算法------线性回归、逻辑回归、KNN、SVM、随机森林------代码骨架一行都不用改。
2.3 回归任务:预测数值
监督学习里每个训练样本都有目标值(y) ,按目标类型分两类:回归 (预测数值------房价、气温、南瓜多少钱)和分类 (预测类别------是不是巧克力、橙色还是白色)。本课是回归第一站:线性回归------找到一条直线,让数据点到这条线的总误差最小。数学细节下一课展开,本课先把全流程跑通。
两份练习数据:scikit-learn 内置的 diabetes (442 名患者 × 10 生理指标,预测一年后病情进展)和 USDA 南瓜交易数据(1757 行 × 26 列的真实脏数据)。前者教流程,后者教清洗------这正是数据工作的两半。
2.4 真实数据从来不会"开箱即用"
diabetes 是教学特供:标准化好、零缺失、零异常。南瓜数据不这样:空值、字符串与数字混杂、Package 列里装着 "sacks"、"bins"、"1 1/9 bushel cartons" 等各种计量方式。
向数据问对问题是第一步。对南瓜数据,回归能回答的问题是:"预测某个月份南瓜的价格。"拿到问题再回头看数据,才知道留什么、扔什么。清洗四步:
第 1 步:统一计量口径------只留 bushel(蒲式耳)。口径不一的价格没法比较:
python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
实测:1757 行 → 415 行。数据量小了,但每行都可比------脏数据再多也是噪声,干净数据再少也是信号。
第 2 步:只留需要的列(Package / Low Price / High Price / Date)。
第 3 步:构造目标与特征------高低价取均值为当日价格,从日期提取月份:
python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
month = pd.DatetimeIndex(pumpkins['Date']).month
第 4 步:按蒲式耳归一化 。"1 1/9 bushel"(大箱)和 "1/2 bushel"(小篮)标价不可比,统一折算成每蒲式耳价格。蒲式耳是体积单位,半蒲式耳的小南瓜反而贵------小个头每蒲式耳装更多个。不折腾单位换算,统一按蒲式耳计价,这就是理解数据业务含义的意义。
一个 pandas 3.0 的新坑:pd.to_datetime() 解析 Date 列会报 Could not infer format 警告------3.0 明确要求显式指定格式。稳妥写法:
python
pd.to_datetime(pumpkins['Date'], format='mixed') # 或给具体格式 '%m/%d/%Y'
2.5 可视化:建模前的侦察
数据科学家的基本功是用图说话 。散点图(price vs month)只能看到"某月有一堆点";分组柱状图 (每月均价)立刻看出价格高峰在 9-10 月 。

seaborn 热力图一次看清所有数值列两两相关系数:
python
corr = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()
sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f")

实测相关矩阵里有个重要现象:Month 与 Price 相关只有 -0.149(弱相关),但柱状图明明显示 9-10 月有价格高峰 。不矛盾------相关系数只度量直线关系 ,季节高峰是非线性模式 (中间高两头低),直线测不出山峰。建模前最重要的侦察结论:相关系数低 ≠ 没关系,图和数要一起看。
案例实战
实测环境:conda env
ml-course(scikit-learn 1.9.1 / pandas 3.0.6)完整脚本:
stage2/assets/stage2_demos.py
实战 1:diabetes------五步跑通第一个模型
目标:加载数据 → 选特征 → 划分 → 训练 → 画图,全流程一次走通。
python
import numpy as np
from sklearn import datasets, model_selection, linear_model
X, y = datasets.load_diabetes(return_X_y=True) # (442, 10)
X = X[:, 2].reshape((-1, 1)) # 只用 BMI(第 3 列)
X_train, X_test, y_train, y_test = model_selection.train_test_split(
X, y, test_size=0.33, random_state=42)
model = linear_model.LinearRegression().fit(X_train, y_train)
真实输出:
X.shape = (442, 10) # 数据已标准化,所以都是小数
coef_ = 972.8763 intercept_ = 150.2627
R² (test) = 0.3164
- coef_ = 972.88:BMI 每升 1 个标准差,病情进展指标平均升约 973 个单位------方向符合医学常识;
- R² = 0.3164 :单特征只能解释 31.6% 的变异。不是模型失败,是单特征的诚实上限 ------下一课加多特征。
-
这条蓝线就是模型本身:给定新 BMI,在线上读出 y 就是预测。线性回归 = 最小二乘法找出的总误差最小的那条直线。
实战 2:南瓜------清洗出建模可用的数据
原始数据体检:
原始行数 = 1757
缺失统计(前几列): Type 缺 1712, Sub Variety 缺 1461, Grade 缺 1757
缺失严重但集中在与"月份-价格"无关的列------整列弃用。清洗流水线输出:
bushel 过滤后行数 = 415
月均价格(美元/蒲式耳):
8 24.37
9 28.54
10 28.36
11 25.07
12 15.41
南瓜交易集中在 8-12 月(收获季),9-10 月最贵(约 28.5,万圣节需求旺),12 月腰斩(15.41)------节日过了价格跳水。这就是柱状图里季节模式的数字版。
教学数据 vs 真实数据(本课两份实测数据的对照):
| diabetes(教学) | 南瓜(真实) | |
|---|---|---|
| 缺失值 | 零 | Type 缺 97%,Grade 全缺 |
| 特征类型 | 已标准化的数值 | 字符串+数值混杂 |
| 量纲 | 统一 | 蒲式耳口径不一,需归一化 |
| 清洗代码行数 | 0 行 | 4 步流水线 |
| 教学角色 | 教流程 | 教清洗与侦察 |
小结
- 环境一次配好(conda + 清华镜像);scikit-learn API 全同构:
fit/predict/score三件套贯穿全课程。 - 回归预测数值、分类预测类别;diabetes 教流程、南瓜教清洗------数据工作的两半。
- 清洗四步:筛 bushel(1757→415)→ 选列 → 均价+月份 → 按蒲式耳归一化;pandas 3.0 日期解析要显式 format。
- 可视化是建模前的侦察:Month-Price 相关仅 -0.149 但 9-10 月有明显高峰------相关系数只测直线,图和数要一起看。
- 实测:BMI 单特征 R² 0.3164(单特征诚实上限);南瓜月均 9-10 月 28.5 / 12 月 15.41。
- 数据备好了,建模:参见第 3 课《线性回归与多项式回归(南瓜)》。
扩展阅读
- 原课第 2-3 课(Tools + Data):https://github.com/microsoft/ML-For-Beginners/tree/main/2-Regression
- Scikit-learn 线性回归官方案例:https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html
- diabetes 数据集官方说明:https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset
- USDA 特种作物市场报告(南瓜数据来源):https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice
- Seaborn 官方教程:https://seaborn.pydata.org/tutorial.html
系列导航
- 上一篇:第 01 课《导论------是什么、简史、负责任 AI 与标准流程》
- 下一篇:第 03 课《线性回归与多项式回归(南瓜)》
更多专栏:
| 蛋白 / 抗体 / 多肽 / 核酸 | 分子模拟 / 动力学 / 对接 | 药物 / 设计 / 案例 | AI / Agent / 大模型 |
|---|---|---|---|
| 开源蛋白结构预测 | 分子模拟基础 | 小分子药物设计案例 | AI Agent系列 |
| 开源蛋白生成方法实践 | 分子动力学模拟-Amber | 蛋白药物设计案例 | 化学大模型 |
| 开源多肽设计模型 | 分子动力学模拟-Gromacs | 多肽药物设计案例 | 《AI Agent原理与实战》 |
| 开源多肽性质预测 | 分子动力学模拟-OpenMM | 开源小分子生成设计 | CADD中的机器学习模型 |
| DNA/RNA药物设计 | 結合自由能 | 高效计算配置 | 《MCP 入门实战》 |
| siRNA药物设计模型 | UCSF DOCK系列 | 我胡师兄说药 | 《AI入门实战2026》 |
| ASO药物设计模型 | rDock系列 LeDock系列 gnina系列 | 《经典机器学习实战》 |