本文收录于专栏 《经典机器学习实战》
摘要:配好一套全程复用的 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 环境:一次配好,全程复用
本阶段开始正式写代码。环境只需要配一次,后面所有课全用它:
# conda 是默认推荐路径(依赖解析稳,跨平台一致)conda create-nml-coursepython=3.11scikit-learn pandas matplotlib jupyter flask nltk-yconda activate ml-course# 补充包走 pip(国内镜像加速)pipinstalltextblob statsmodels onnx gym skl2onnx seaborn\-ihttps://pypi.tuna.tsinghua.edu.cn/simple本课程实测环境:conda envml-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 是本课程的主力库。它最出色的设计是所有模型的用法完全同构,学会一个就会全部:
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(蒲式耳)。口径不一的价格没法比较:
pumpkins=pumpkins[pumpkins['Package'].str.contains('bushel',case=True,regex=True)]实测:1757 行 →415 行。数据量小了,但每行都可比——脏数据再多也是噪声,干净数据再少也是信号。
第 2 步:只留需要的列(Package / Low Price / High Price / Date)。
第 3 步:构造目标与特征——高低价取均值为当日价格,从日期提取月份:
price=(pumpkins['Low Price']+pumpkins['High Price'])/2month=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 明确要求显式指定格式。稳妥写法:
pd.to_datetime(pumpkins['Date'],format='mixed')# 或给具体格式 '%m/%d/%Y'2.5 可视化:建模前的侦察
数据科学家的基本功是用图说话。散点图(price vs month)只能看到"某月有一堆点";分组柱状图(每月均价)立刻看出价格高峰在9-10 月。
seaborn 热力图一次看清所有数值列两两相关系数:
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——五步跑通第一个模型
目标:加载数据 → 选特征 → 划分 → 训练 → 画图,全流程一次走通。
importnumpyasnpfromsklearnimportdatasets,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系列 | 《经典机器学习实战》 |