本文收录于专栏 《经典机器学习实战》
摘要:从回归跨到分类:逻辑回归用 S 曲线预测南瓜是橙色还是白色。实测准确率 0.92、AUC 0.975,并拆解 precision/recall/F1/混淆矩阵/ROC 这套分类评估词汇表,看清白色南瓜召回率只有 0.67 的原因。
关键字:逻辑回归,分类,ROC曲线,AUC,混淆矩阵,精确率,召回率,二分类
阶段 2 · 回归(南瓜项目)| 来源:【原·08】| 知识更新至 2026-10
概念讲解
4.1 名字叫"回归"的分类器
先纠正一个 ML 术语里的历史误会:逻辑回归(logistic regression)是分类方法,不是回归方法。它放在回归单元纯属惯例------它和线性回归一样是线性模型,只是输出经过 sigmoid 函数压成了概率。
它回答的问题:"这个南瓜更可能是橙色 🎃 还是白色 👻?""这颗糖是巧克力吗?""这个病人会被传染吗?"------二分类是它的主场。变种还有多项分类(multinomial,多选一)和有序分类(ordinal,类别有大小顺序,如尺码 mini/sm/med/lg)。
4.2 sigmoid:把直线压成概率
线性回归输出任意实数,分类需要"是/否"的概率。sigmoid 函数完成这个转换:S 形曲线,输入任何实数,输出压到 0-1 之间。输出 > 0.5 判类别 1,否则判类别 0。训练时用最大似然(maximum likelihood)估计参数------直觉就是"让真实标签出现的概率最大"。
与线性回归的两个重要差别:
- 变量不必相关。线性回归要求特征-目标有直线关系才表现好;逻辑回归没有这个要求。南瓜数据各特征与颜色的关系本来就弱,正好适用。
- 需要大量干净数据。逻辑回归对数据量和清洁度更敏感------我们只有约一千行干净数据,模型上限会受影响,实测时会看到。
4.3 编码三件套:把字符串喂给模型
南瓜数据的 City Name、Package、Variety、Origin、Item Size、Color 全是字符串。模型只认数字,编码方式按数据性质分三种:
| 编码器 | 适用 | 例子 | 产出 |
|---|---|---|---|
| OrdinalEncoder | 有序类别 | Item Size(sml < med < med-lge < lge < xlge < jbo < exjbo) |
一列 0-6 整数 |
| OneHotEncoder | 无序类别 | City Name、Variety 等 |
每类一列 0/1 |
| LabelEncoder | 标签列 | Color(ORANGE/WHITE) |
0/1 |
特征列里两种编码要同时用------ColumnTransformer 把它们组合成一步:
python
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder, LabelEncoder
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', OrdinalEncoder(categories=[['sml','med','med-lge','lge','xlge','jbo','exjbo']]), ['Item Size']),
('cat', OneHotEncoder(sparse_output=False), ['City Name','Package','Variety','Origin'])
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)
encoded_label = LabelEncoder().fit_transform(pumpkins['Color'])
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
set_output(transform='pandas') 让输出保持 DataFrame 格式(列名可读),这是较新版本 sklearn 的便利写法。
4.4 分类模型的评估词汇表
二分类的评估比回归多几个词,先把定义摆正(以"预测白色 WHITE=1"为正类):
- precision(精确率):预测为白色的南瓜里,真白色的占比------"说它白,它真白"的可信度;
- recall(召回率):所有真白色南瓜里,被抓出来的占比------"白的有没有漏";
- F1:precision 与 recall 的调和平均,两者都高才高;
- confusion matrix(混淆矩阵):2×2 表格,行是真实标签、列是预测标签,对角线是猜对的;
- ROC 曲线与 AUC:横轴假阳性率、纵轴真阳性率,曲线越贴左上角越好;AUC(曲线下面积)0.5 = 抛硬币,1.0 = 完美。
案例实战:预测南瓜颜色
实测环境:conda env
ml-course(scikit-learn 1.9.1 / pandas 3.0.6)完整脚本:
stage2/assets/stage2_demos.py
目标:用城市、包装、品种、产地、尺寸预测南瓜颜色(ORANGE vs WHITE)。
数据 :选 6 列后 dropna,剩 991 行:ORANGE 835 / WHITE 156------类别不平衡(约 5.3:1),记住这个数字,评估时要用到。
编码 :OrdinalEncoder(Item Size)+ OneHotEncoder(4 个无序列)→ 特征从 5 列变 48 列;LabelEncoder 把 Color 映射为 ORANGE=0、WHITE=1。
训练与评估:
python
X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
y = encoded_pumpkins['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
model = LogisticRegression(max_iter=1000).fit(X_train, y_train)
predictions = model.predict(X_test)
真实输出:
precision recall f1-score support
0 0.94 0.98 0.96 166
1 0.85 0.67 0.75 33
accuracy 0.92 199
F1-score: 0.7458
confusion matrix:
[[162 4]
[ 11 22]]
AUC = 0.9750

逐行读这组结果:
- accuracy 0.92 看着不错,但注意类别不平衡:全部猜 ORANGE 也能拿 166/199 = 83.4%。所以 accuracy 在这份数据上参考价值有限。
- 橙色(0 类):precision 0.94 / recall 0.98------基本全对,因为训练样本多。
- 白色(1 类):precision 0.85 但 recall 只有 0.67------33 个真白色漏了 11 个。少数类样本少(训练集约 125 个白色),模型对它们学得不够。这就是 8.2 说的"需要大量数据"在现实中的样子。
- 混淆矩阵
[[162, 4], [11, 22]]:162 个橙色猜对,4 个橙色误判为白;22 个白色猜对,11 个白色误判为橙。漏报白色(11)远多于误报橙色(4),与 recall 读数一致。 - AUC 0.975:总体区分能力很强------如果业务允许调阈值(比如更重视"别漏白色"),可以把 0.5 的判定线往下移,牺牲一点 precision 换 recall。
调试思路预演 (第 7 课会系统展开):想提升白色 recall,方向是更多白色样本(数据)、类别权重(class_weight='balanced')、或换更灵活的模型------而不是调算法参数硬挤。
小结
- 逻辑回归是分类器:线性输出经 sigmoid 压成 0-1 概率,0.5 为界判两类。
- 编码按性质分:有序用 OrdinalEncoder,无序用 OneHotEncoder,标签用 LabelEncoder;ColumnTransformer 组合成一步。
- 实测:991 行、48 维编码,accuracy 0.92 / F1 0.7458 / AUC 0.975;白色 recall 0.67 是短板------少数类样本少。
- 类别不平衡时 accuracy 会骗人,看 per-class precision/recall 和混淆矩阵才有判断。
- 更多分类器(SVC/KNN/集成)与选择方法参见第 7 课《分类器:选择思路与多分类器对比》;先把本课模型用起来------参见第 5 课《把模型做成 Web 应用(UFO)》。
扩展阅读
- 原课第 4 课:https://github.com/microsoft/ML-For-Beginners/tree/main/2-Regression/4-Logistic
- Scikit-learn 逻辑回归文档:https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
- classification_report 指标定义:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html
- 混淆矩阵(维基百科):https://wikipedia.org/wiki/Confusion_matrix
系列导航
- 上一篇:第 03 课《线性回归与多项式回归(南瓜)》
- 下一篇:第 05 课《把模型做成 Web 应用(UFO)》
更多专栏:
| 蛋白 / 抗体 / 多肽 / 核酸 | 分子模拟 / 动力学 / 对接 | 药物 / 设计 / 案例 | AI / Agent / 大模型 |
|---|---|---|---|
| 开源蛋白结构预测 | 分子模拟基础 | 小分子药物设计案例 | AI Agent系列 |
| 开源蛋白生成方法实践 | 分子动力学模拟-Amber | 蛋白药物设计案例 | 化学大模型 |
| 开源多肽设计模型 | 分子动力学模拟-Gromacs | 多肽药物设计案例 | 《AI Agent原理与实战》 |
| 开源多肽性质预测 | 分子动力学模拟-OpenMM | 开源小分子生成设计 | CADD中的机器学习模型 |
| DNA/RNA药物设计 | 結合自由能 | 高效计算配置 | 《MCP 入门实战》 |
| siRNA药物设计模型 | UCSF DOCK系列 | 我胡师兄说药 | 《AI入门实战2026》 |
| ASO药物设计模型 | rDock系列 LeDock系列 gnina系列 | 《经典机器学习实战》 |