本节你会学到
- 说清楚「逻辑回归为什么叫回归,却用来做分类」解决的核心问题
- 知道它在「传统机器学习基础(21~34)」中的位置
- 把 分类与回归、机器学习、监督学习 这些关键词联系起来
理解线性分数、Sigmoid、概率和阈值,跑通第一个二分类逻辑回归示例。
学习路线:传统机器学习基础(21~34) · 第 29 课
补齐文本分类项目背后的数据处理、算法、评估和模型选择知识。
学完本阶段你能做到:拿到一份结构化表格数据,独立完成清洗、特征工程、建模、评估、模型选择和保存,并用规范流程比较多个算法。
推荐读法:建议系统读。做项目时遇到数据和模型选择问题,也可以按需回查。
查看完整阶段 · 14 篇先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。
合格答案不是复述标题,而是说清它在“数据进入模型、模型学习、结果评估或项目落地”中的作用。
它应该为下一课「KNN 分类:让距离最近的样本帮忙投票」铺路:读完后要知道下一课为什么自然出现。
学完线性回归后,很多人第一次看到“逻辑回归”都会困惑:它既然叫回归,为什么常被用来判断“是或否”“会或不会”这类分类问题?
关键在于它并不直接输出类别,而是先输出一个概率。例如“这条短信是垃圾短信的概率为 0.86”,然后我们再根据阈值把概率变成最终类别。
逻辑回归和线性回归一样,先把输入特征做加权求和:
z = wx + b
这个 z 是一个线性分数,可以是任意实数,例如 -4.2、0.7 或 12。但分类概率必须落在 0 到 1 之间,所以它还会经过一个 Sigmoid 函数:
p = 1 / (1 + e^(-z))
Sigmoid 会把很小的分数压到接近 0,把很大的分数压到接近 1。于是 p 就可以理解为“样本属于正类的概率”。
最常见的阈值是 0.5:
p >= 0.5 -> 正类(1)
p < 0.5 -> 负类(0)
例如:
0.86,在 0.5 阈值下判为垃圾短信;0.22,在 0.5 阈值下判为不流失。但阈值不是自然规律。信用风控中漏掉高风险用户的代价很大,可以把阈值调低,让模型更积极地提示风险;医学初筛中不希望漏检,也常会优先提高召回率。反过来,误报很昂贵时可以提高阈值。
| 对比项 | 线性回归 | 逻辑回归 |
|---|---|---|
| 任务 | 预测连续数值 | 预测类别概率 |
| 输出范围 | 任意实数 | 0 到 1 |
| 常见场景 | 房价、销量、温度 | 流失、欺诈、垃圾短信 |
| 常见评估 | MAE、RMSE、R² | 精确率、召回率、F1、AUC |
两者都包含“线性组合”这一部分,但最后的目标、损失函数和评估方式不同。逻辑回归的“回归”更多是在说它学习一个连续的分数和概率,而最终用途是分类。
下面以“是否通过考试”为例。输入是复习小时数,标签是是否通过:
import numpy as np
from sklearn.linear_model import LogisticRegression
# 每个样本只有一个特征:复习小时数
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8]])
y = np.array([0, 0, 0, 0, 1, 1, 1, 1])
model = LogisticRegression()
model.fit(X, y)
hours = np.array([[4.5]])
probability = model.predict_proba(hours)[0, 1]
label = model.predict(hours)[0]
print(f"通过概率:{probability:.2%}")
print(f"预测类别:{label}")
predict_proba() 很重要。它返回每个类别的概率,二分类时 [0, 1] 中索引为 1 的位置就是“正类”的概率。predict() 则使用模型默认阈值,直接返回类别标签。
如果你需要自定义阈值,可以先拿到概率,再自行判断:
threshold = 0.35
custom_label = int(probability >= threshold)
不过调阈值之前要先想清楚:误判正类和漏掉正类,哪一种代价更高?然后结合验证集上的混淆矩阵、精确率和召回率做选择。只凭感觉改成 0.3 或 0.8,通常会让模型更难解释。
逻辑回归训练快、可解释性强,对中小规模的表格数据是很好的基线。它还可以通过权重的正负大致判断特征和正类概率的关系方向。
但它的分类边界本质上是线性的。数据存在复杂的非线性关系时,可能需要构造交互特征,或者尝试 KNN、决策树、随机森林等模型。下一个模型 KNN 就完全不学习一条显式公式,而是让“最近的样本”参与投票。
predict() 当成概率predict() 返回的是最终类别,不是概率。想知道模型有多确信,应该使用 predict_proba()。
如果 99% 的样本都是“正常”,一个永远预测“正常”的模型准确率也可能是 99%。这时要结合精确率、召回率、F1、类别权重和采样策略,而不能只看准确率。
测试集是最后一次客观检查的机会。阈值选择应在训练集内部的验证集或交叉验证中完成,否则测试分数会被人为“调高”。
把示例中的 hours 改成 [[3.5]]、[[5.5]] 和 [[7.5]],记录每个样本的通过概率。然后分别用 0.5 和 0.7 作为阈值,观察最终类别如何变化。
predict_proba() 返回概率,predict() 返回类别;下一课我们学习 KNN 分类:模型不再先学一条公式,而是让距离最近的邻居来投票。
留言讨论