实话说,我第一次学逻辑回归的时候,是很懵的。刚把线性回归的“用一条直线拟合数据”搞明白,紧接着就来了个逻辑回归,名字里带着“回归”,结果干的全是分类的活儿。查资料看到一堆 sigmoid、极大似然、梯度下降的术语,代码倒是几行能跑,但心里一直没底。
后来在项目里反复用、又把损失函数的推导自己推了两遍之后,我才算真正“看透”了逻辑回归。它之所以是入门机器学习绕不开的算法,就是因为它是从线性模型通向分类问题的桥:原理不复杂,可视化起来非常直观,代码写出来也短,但背后那些设计逻辑,足够让初学者理解很多机器学习的核心思想。
这篇文章我想用一组代码示例和可视化图,把逻辑回归拆开讲清楚。适合刚学完线性回归、准备接触分类问题的读者,也适合那些用 sklearn 调包调了很久、但始终没想明白模型背后在干什么的朋友。我会先讲它解决什么问题,再拆 sigmoid 和决策边界,然后带你手写一遍梯度下降,最后用完整代码画出决策边界和损失曲线。全程配代码,你可以直接复制到自己环境里跑。
1. 为什么叫“回归”却在做分类:先搞清楚它解决什么问题
1.1 线性回归在分类任务上的挫败
很多初学者对逻辑回归的第一个困惑是:既然是分类算法,为什么不叫“逻辑分类”?
要回答这个问题,得先看线性回归直接拿来分类会出什么洋相。
假设我们要根据肿瘤大小判断良性还是恶性,把“良性”编码成0、“恶性”编码成1,然后用线性回归去拟合。看起来好像可行:模型输出接近0就是良性,接近1就是恶性。
但问题来了。如果数据里出现一个特别大的肿瘤尺寸,线性回归为了拉低这个点的误差,会把整条直线往下压,导致原本该输出0.8、0.9的样本被压到0.4、0.5,分类就乱了。更麻烦的是,线性回归的输出范围是负无穷到正无穷,你怎么解释“输出 -0.3 是良性还是恶性”?没法解释。
我当初试着把线性回归硬用在二分类上,效果可以说是一塌糊涂。尤其是特征分布不太均匀的时候,那条回归直线为了照顾极端值,把决策边界带得完全偏离直觉。
1.2 “逻辑”到底加在了哪里
逻辑回归的核心改动只有一处:把线性回归的输出套进一个叫做 sigmoid 的函数里,把负无穷到正无穷的实数,压缩到 0 到 1 之间。
这样一来,模型输出的含义就变了——不再是“预测值”,而是“属于正类的概率”。一旦有了概率,我们就能设定阈值(通常是0.5),大于阈值判为正类,小于等于阈值判为负类。
所以“逻辑回归”这个名字里的“逻辑”,指的就是这个 sigmoid 函数。它本质上还是在做回归——先算一个线性得分,只是最后加了一个逻辑变换,把输出变成了概率。这就是为什么它叫“回归”,却常被用来分类。
理解了这一步,逻辑回归的大框架就清楚了:
code复制线性得分 z = w1*x1 + w2*x2 + ... + wn*xn + b
概率输出 p = sigmoid(z) = 1 / (1 + e^(-z))
分类结果 = (p > 0.5) ? 正类 : 负类
整条链路非常干净,没有任何黑魔法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. sigmoid 函数和决策边界:把数学公式变成看得懂的图
2.1 sigmoid 函数:把任意实数压到 0 到 1 之间
sigmoid 的数学形式是:
code复制sigmoid(z) = 1 / (1 + exp(-z))
它的图形长得像一个拉长的 S。z 趋近正无穷时,输出趋近 1;z 趋近负无穷时,输出趋近 0;z = 0 时,输出刚好是 0.5。
第一次看到这个函数时,我心里想的是:这不就是把一个数掰弯了吗?线性输出是一条直线,经过 sigmoid 之后就变成了一条平滑的 S 曲线。
但这条曲线妙就妙在两个地方:
- 处处可导,梯度下降可以顺利使用。
- 在 z 接近0的地方斜率最大,也就是对“模棱两可”的区域最敏感;离0越远,曲线越平缓,输出越接近0或1,确定性越高。
你可以把 sigmoid 想成一个“概率挤压器”:模型先自由地算出一个可能很大的得分,然后 sigmoid 负责把这个得分掰成一个符合概率意义的 0~1 数值。
2.2 决策边界是怎么画出来的
当逻辑回归的输入是两个特征时,我们可以在二维平面上画一条线,这条线就是决策边界。
怎么算?非常简单。决策边界就是模型输出的概率刚好等于 0.5 的地方,而概率等于 0.5 等价于 z = 0。所以决策边界的方程是:
code复制w1*x1 + w2*x2 + b = 0
这是一条直线。
这就是逻辑回归最可爱的地方:它的决策边界天生是线性的。二维是一条直线,三维是一个平面,更高维就是一个超平面。
初学者常常误以为逻辑回归只能做简单的分类,其实不是。它只是“决策边界是线性”的,但如果我们在特征工程里给模型喂入 x1^2、x1*x2 这样的组合特征,它也能画出圆形的决策边界。后面我会在代码示例里展示这个进阶玩法,先记住结论:逻辑回归对“特征组合”是开放的,它的线性限制不等于能力上限。
2.3 阈值为什么默认是 0.5,以及什么时候要改
很多教程会告诉你:p > 0.5 判为正类,否则判为负类。但你想过没有,为什么是 0.5?
因为 0.5 表示“两种类别概率相同”,是天然的平分点。当正负样本数量相当时,0.5 是合理的默认选择。
但实际项目很少
