《经典机器学习实战》第 4 课:逻辑回归:预测类别(南瓜)

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

摘要:从回归跨到分类:逻辑回归用 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')、或换更灵活的模型------而不是调算法参数硬挤。

小结

  1. 逻辑回归是分类器:线性输出经 sigmoid 压成 0-1 概率,0.5 为界判两类。
  2. 编码按性质分:有序用 OrdinalEncoder,无序用 OneHotEncoder,标签用 LabelEncoder;ColumnTransformer 组合成一步。
  3. 实测:991 行、48 维编码,accuracy 0.92 / F1 0.7458 / AUC 0.975;白色 recall 0.67 是短板------少数类样本少。
  4. 类别不平衡时 accuracy 会骗人,看 per-class precision/recall 和混淆矩阵才有判断。
  5. 更多分类器(SVC/KNN/集成)与选择方法参见第 7 课《分类器:选择思路与多分类器对比》;先把本课模型用起来------参见第 5 课《把模型做成 Web 应用(UFO)》。

扩展阅读


系列导航

  • 上一篇:第 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系列 《经典机器学习实战》
相关推荐
AI源码7 小时前
基于深度学习的日常服饰分类与推荐系统设计
人工智能·深度学习·分类
电科_银尘1 天前
【深度学习项目实战·13】服装图像分类:在相同条件下比较MLP与CNN
深度学习·分类·cnn
ManageEngineITSM3 天前
工单分类怎么设计?类别、子类别与自动分派的实用方法
大数据·服务器·数据库·人工智能·分类·数据挖掘
听风吹等浪起3 天前
第30章:MobileNetV3全家桶实现MRI脑肿瘤四分类(含Streamlit网页推理+Mermaid结构图)
人工智能·分类·数据挖掘
计算机毕业编程指导师4 天前
基于深度学习的花卉图像分类识别系统(PyTorch + ResNet50 + Django)
pytorch·python·深度学习·分类·毕业设计·迁移学习·图像分类
阿俊-全栈开发4 天前
LikeShop 多商户标准版智能商品分类与标签自动打标:大模型+向量检索二开实践
大数据·人工智能·分类·likeshop·likeshop开源商城
皮皮学姐分享-ppx4 天前
上市公司研发费用分类操纵强度数据(2011—2025)
人工智能·分类·数据挖掘
小王师傅664 天前
分类是科学的基础
人工智能·分类
FL16238631295 天前
芒果果实病害图像分类数据集862张5类别
人工智能·分类·数据挖掘