《经典机器学习实战》第 2 课:回归入门——环境、工具与数据准备

本文收录于专栏 《经典机器学习实战》

摘要:配好一套全程复用的 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 步流水线
教学角色 教流程 教清洗与侦察

小结

  1. 环境一次配好(conda + 清华镜像);scikit-learn API 全同构:fit/predict/score 三件套贯穿全课程。
  2. 回归预测数值、分类预测类别;diabetes 教流程、南瓜教清洗------数据工作的两半。
  3. 清洗四步:筛 bushel(1757→415)→ 选列 → 均价+月份 → 按蒲式耳归一化;pandas 3.0 日期解析要显式 format。
  4. 可视化是建模前的侦察:Month-Price 相关仅 -0.149 但 9-10 月有明显高峰------相关系数只测直线,图和数要一起看。
  5. 实测:BMI 单特征 R² 0.3164(单特征诚实上限);南瓜月均 9-10 月 28.5 / 12 月 15.41。
  6. 数据备好了,建模:参见第 3 课《线性回归与多项式回归(南瓜)》。

扩展阅读


系列导航

  • 上一篇:第 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系列 《经典机器学习实战》
相关推荐
阿琳a_3 小时前
b-map-viewer:面向 Vue 3 的地图可视化 SDK,从接入到展示再到交互分析
前端·javascript·vue.js·gis·数据可视化·地图
烂蜻蜓16 小时前
Pandas入门教程(十六):常用函数速查手册——读写、清洗、选择、排序、分组与统计
pandas
MetWeave21 小时前
一朵玫瑰,装下一年的风(《风不是一个数》系列第 5 篇
前端·数据可视化
Blockbuater_drug1 天前
《经典机器学习实战》第 1 课:导论——是什么、简史、负责任 AI 与标准流程
机器学习·scikit-learn·监督学习·数据清洗·过拟合·训练集测试集·公平性
quantdash_cc1 天前
个人开发者用 QuantDash 读取港股行情:00700.HK 的 Python 函数封装与校验实践
python·数据分析·pandas·量化交易·股票数据·quantdash
Frag0ut1 天前
Notepad++ 正则表达式完全手册:文本处理的终极武器(2026实战版)
正则表达式·notepad++·数据清洗·日志分析·正则替换·提取ip·正则表达式实战
databook2 天前
Pandas 与 Polars:语法、性能和资源占用方面的对比
python·数据分析·pandas
桑年2 天前
四、Pandas数据处理
人工智能·python·线性代数·pandas·数据可视化·数据处理
第九序言T2 天前
Python 数据处理进阶(二十四)把脚本变成工具:argparse、logging 与定时任务
python·自动化·pandas