之前有个读者私信我,说复习模式识别课程时被一道题卡住了:为什么Logistic回归的损失函数是交叉熵而不是均方误差?这个问题的确很典型,很多人在期末复习阶段对Logistic回归的理解还停留在"用sigmoid函数把线性输出压到0到1之间",但一到推导、证明、做实验就露怯了。
这篇内容是我结合课程L4的知识点以及自己跑实验的经验整理的,覆盖了Logistic回归的建模动机、非线性变换的原理与代价、损失函数推导、正则化处理、多分类扩展,以及几个非常容易踩的实现细节。适合正在学模式识别与机器学习课程、准备期末复习、或者刚入门想亲手实现分类器的同学参考,已经熟练用sklearn的朋友也能从中找到一些容易被忽视的底层逻辑。
1. 从"回归"说起:Logistic回归本质解决的是分类问题
1.1 线性回归的输出范围根本不适合做类别判断
先看一个很容易混淆的地方——既然名字里带"回归",那Logistic回归是不是回归问题?不是。它是分类模型,只是借用了线性回归中"特征加权求和"的框架。
线性回归拟合的目标是连续值,输出范围是整个实数轴。如果用来做二分类,最直接的想法是设一个阈值,比如大于0.5判为正类,小于0.5判为负类。这样看起来能工作,但有一个致命问题:线性回归对离群点极其敏感。假设正类样本集中在x=1附近,负类样本集中在x=2附近,这时候只要在x=100的地方出现一个正类离群点,整个回归直线就会被拉偏,导致原本清晰的分类边界被扭曲。这类现象在真实数据里非常常见,因为真实数据几乎总有噪声和离群样本。
另外,线性回归输出的数值本身没有概率语义。输出是5还是50,只能说明"离边界远",但不能解释成"正类的概率是某个值"。而分类问题在数学上最自然的表达是条件概率P(y=1|x),这个值必须落在[0,1]区间内。线性模型做不到这一点,所以我们需要在模型输出端做一个变换。
1.2 sigmoid函数为什么长这样——它不只是"压到0到1"
把实数轴上的值压缩到(0,1)区间的函数很多,比如tanh、分段函数,但Logistic回归选择的是sigmoid:
[
\sigma(z) = \frac{1}{1 + e^{-z}}
]
它的性质很漂亮:单调递增、处处可微、当z趋近正无穷时输出趋近1,当z趋近负无穷时输出趋近0,在z=0附近近似线性。但更本质的原因是,sigmoid和"几率"(odds)这个概念是一对天然的数学组合。
在统计里,一件事情发生的几率定义为p/(1-p),也就是"发生概率与不发生概率的比值"。如果取对数得到对数几率(log-odds),事情就有意思了:
[
\ln\frac{p}{1-p} = z = w^Tx
]
这意味着Logistic回归本质上是在假设"对数几率是输入特征的线性函数"。反过来,从这个等式解出p,得到的就是sigmoid函数。所以sigmoid不是拍脑袋选出来的,而是从"用线性模型建模对数几率"这个假设自然推导出来的结果。这也是为什么Logistic回归属于广义线性模型,因为它连接的是经sigmoid变换后的概率而非原始输出。
1.3 从几率到系数解释:为什么考试总喜欢考"系数含义"
既然对数几率是w^Tx,那系数w_j的含义就可以直接解读:在其它特征不变的情况下,x_j每增加一个单位,对数几率的变化量是w_j。如果换算成几率本身,变化倍数是e^{w_j}。
我见过很多同学在理解这个点的时候卡住,其实只要记住"对数"是为了把乘法变成加法。几率原本是乘性变化的,取了对数之后变成加性变化,和线性模型的结构正好对齐。这也是Logistic回归在工业界仍然被广泛使用的原因之一——它虽然预测能力不如复杂模型,但参数有明确的可解释性,这在风控、医疗、金融等领域至关重要。
决策规则也随之清晰:当P(y=1|x)>0.5时判为正类,等价于z>0。也就是说,模型的决策边界就是超平面w^Tx=0。换句话说,标准的Logistic回归天然只能产生线性决策边界。要处理线性不可分的数据,就需要下面介绍的非线性变换。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 面对线性不可分的数据——非线性变换在干什么
2.1 线性决策边界的天然局限
很多入门教程都用二维平面上的例子来演示Logistic回归,数据恰好是线性可分的,决策边界画一条直线就完事。但现实问题里,特征和类别之间的关系几乎不会是简单的直线。
举一个最简单的例子:二维平面上,正类样本分布在以原点为中心半径为1的圆内,负类样本分布在圆外。这组数据用一条直线无论怎么摆都没法把圆内和圆外分开。类似的还有异或(XOR)模式,四个点分布在(0,0)、(1,1)为正类,(0,1)、(1,0)为负类,这个数据也是线性不可分的。
面对这种情况,有两条路:一是换一个非线性模型,比如决策树、神经网络;二是在原有线性模型框架内,对特征做非线性变换,让数据在新的特征空间里变得线性可分。Logistic回归走的是第二条路,这也是它从"线性分类器"升级为"能处理复杂边界"的关键一步。
2.2 低维线性不可分和高维线性可分——把纸揉皱再展开
非线性变换的核心思想可以类比成:一张纸上有两类点,在纸平面上画直线分不开,但如果把这张纸揉成一团,把其中一类点抬到高处,再在三维空间里找一个平面,就能把它们分开了。特征映射做的就是"把纸揉皱"这个动作,只不过它是通过构造新的特征维度来实现的。
具体到公式上,设原始特征是x=(x_1, x_2),我们构造一个映射函数φ(x),把x映射到一个新的特征空间:
[
\phi(x) = (x_1,\ x_2,\ x_1^2,\ x_1x_2,\ x_2^2)
]
然后在这个新的五维特征空间里做Logistic回归,决策边界变成w^Tφ(x)=0。这个等式对应到原始x_1, x_2平面上,可能是一个圆、一条椭圆曲线、双曲线,甚至更高阶的曲线。这就是非线性变换的直观效果:模型在原始特征空间里拥有了复杂的分界能力,但在参数求解层面,它做的依然是标准的线性模型运算。
2.3 多项式特征与更一般的基函数展开
最常用的非线性变换是多项式特征。给定d阶多项式,全部单项式的组合数量是C(m+d, d)个(m为原始特征维度)。比如m=2、d=2时,特征数从2变成6?严格说会产生x_1, x_2, x_1^2, x_1x_2, x_2^2(如果加上偏置项是6)——特征维数涨得很快。
除多项式外,还有几类常用的基函数:
- 高斯基函数:φ_j(x)=exp(-||x-μ_j||^2/(2s^2)),每个基函数对应一个局部中心,常用于RBF网络。
- sigmoid基函数:φ_j(x)=σ((x-μ_j)/s),相当于基础神经网络单元的激活形式。
- 样条基函数:分段多项式,适合处理平滑变化的特征。
选择哪种基函数取决于数据的先验结构。比如数据存在周期模式,可以考虑正弦基函数;局部聚簇明显,高斯基函数更合适。如果什么都不确定,多项式特征和后面的正则化组合是性价比比较高的方案。
2.4 一个数值例子:圆形边界的实现过程
回到圆内圆外的例子。数据生成方式如下:从[-1.5, 1.5]×[-1.5, 1.5]均匀采样二维点,如果x_1^2+x_2^2<1则标记为正类,否则为负类。
在这个数据上直接用原始特征x_1, x_2训练Logistic回归,无论怎么调参,准确率都很难超过80%,决策边界就是一条直线。但构造φ=(x_1, x_2, x_1^2, x_2^2)之后(这里我故意不包含x_1x_2项,是为了让结果更接近标准圆),训练得到的决策边界方程是:
[
w_1x_1 + w_2x_2 + w_3x_1^2 + w_4x_2^2 + b = 0
]
因为数据是对称的,实际学出来的w_1和w_2会接近0,w_3和w_4接近同一数值,于是方程可以化成w_3(x_1^2+x_2^2)+b=0——这正是一个圆方程。实际实验中训练精度可以达到99%以上,决策边界和真实边界基本重合。
你可能会问:既然w_1、w_2接近0,那留不留这两个特征无所谓?理论上是这样,但在实际训练中,因为样本有限、优化未必收敛到全局最优,这些项可能残余一点值,导致边界略微变形。这是正常的,后面讲正则化时会进一步讨论如何控制这种变形。
2.5 维度爆炸与过拟合——非线性变换的代价
非线性变换带来了强大的拟合能力,代价也很直接:特征维度急剧膨胀。m=10个原始特征,用三阶多项式变换,特征数量会到几百个;m=100时,二阶多项式特征就是5000多个。
高维特征空间带来的问题有两方面:
- 计算开销增大,训练变慢。
- 更严重的是过拟合:模型在训练集上拟合得极好,甚至记住了每一个样本,但在新样本上表现明显下降。
一个典型的实验现象是:三阶多项式变换后的Logistic回归在训练集上准确率接近100%,测试集上却只有70%出头。对比一阶(线性)模型的"双低"(训练和测试都偏低)和二阶模型的"训练略高于测试"可以清楚看到,模型复杂度从欠拟合走到过拟合是一个连续变化的过程,而正则化就是在这一过程中找平衡点。
3. 损失函数为什么是交叉熵——从最大似然说起
3.1 从概率假设推出损失函数
Logistic回归的建模假设是:
[
P(y=1|x;w) = \sigma(w^Tx), \quad P(y=0|x;w) = 1-\sigma(w^Tx)
]
把两个式子合成一个表达式就是:
[
P(y|x;w) = [\sigma(w^Tx)]^y [1-\sigma(w^Tx)]^{1-y}
]
给定训练集D={(x_i,y_i)},假设样本独立同分布,似然函数为所有样本概率的乘积。求最大似然等价于求最大对数似然,而对数似然取负号就得到损失函数:
[
L(w) = -\sum_{i=1}^N \left[ y_i \ln \sigma(w^Tx_i) + (1-y_i) \ln(1-\sigma(w^Tx_i)) \right]
]
这个形式就是二元交叉熵。最小化损失函数和最大化似然是同一件事的两面。很多教材直接写"Logistic回归用交叉熵作为损失函数",但真正的推导路径是从概率假设出发的,理解这一点对回答"为什么不能随便换损失函数"非常关键。
3.2 为什么不能换成均方误差——非凸性问题
这个问题几乎每年期末考试都会出现。用MSE作为Logistic回归的损失函数,形式是:
[
L_{MSE}(w) = \sum_i (\sigma(w^Tx_i) - y_i)^2
]
由于sigmoid是非线性函数,这个损失关于w不是凸函数,有多个局部极小值。使用梯度下降很容易陷入局部最优。而交叉熵损失函数关于w是凸的(严格来说,在特征矩阵满秩且加入适当正则化的情况下是严格凸的),这意味着梯度下降找到的局部最优就是全局最优。
为什么交叉熵是凸的而MSE不是?可以从Hessian矩阵的正定性来看。交叉熵的Hessian可以表示成X^TSX,其中S是对角矩阵,第i个对角元素为σ(z_i)(1-σ(z_i)),由于σ(z_i)在(0,1)区间,σ(1-σ)恒为正,所以X^TSX是一个半正定矩阵。而MSE的Hessian中包含σ'(z)的导数项,无法保证恒正定,凸性被破坏。
一个直观感受是:当预测错误且置信度很高时(比如正类样本的σ输出只有0.01),MSE的梯度会因为σ'(z)趋近于0而变得很小,模型几乎学不动;交叉熵的梯度却依然保持一个稳定的纠错信号,促使参数快速调整。这个性质在实际训练中非常明显,换了损失函数之后收敛速度天差地别。
3.3 梯度推导与三种更新方式
对交叉熵损失求偏导,结果是:
[
\frac{\partial L}{\partial w_j} = \sum_{i=1}^N (\sigma(w^Tx_i) - y_i) x_{ij}
]
这个形式非常简洁,形式上和线性回归的平方损失梯度一模一样,但请注意σ(w^Tx_i)本身是关于w的非线性函数,所以这里并不是简单的线性最小二乘。
梯度下降更新公式(批量模式):
[
w_j^{(t+1)} = w_j^{(t)} - \eta \sum_{i=1}^N (\sigma(w^Tx_i^{(t)}) - y_i) x_{ij}
]
工程中更常使用随机梯度下降(SGD),每次只取一个样本更新,或者小批量随机梯度下降,每次取一小批样本做平均梯度。小批量方式在训练速度和收敛稳定性之间取得了较好的平衡。
3.4 牛顿法与迭代加权最小二乘
梯度下降是一阶优化方法,收敛速度较慢。Logistic回归的损失函数是凸的,而且二阶导(Hessian矩阵)可以解析求出,所以可以用牛顿法加速。牛顿法的迭代公式是:
[
w^{(t+1)} = w^{(t)} - H^{-1}\nabla L
]
其中Hessian矩阵H = X^TSX。这里的S是依赖当前w的对角矩阵,所以牛顿法的每次迭代都要重新计算S和H^{-1},这实际上就是迭代加权最小二乘(IRLS)的思想:每次把问题当作一个加权线性回归来求解,权重就是当前模型给出的σ(1-σ)。
牛顿法一般几次迭代就能收敛到很高精度,代价是每步需要求Hessian的逆,特征维度高的时候计算代价很大。实践中的取舍是:小规模问题上用牛顿法很舒服,大规模稀疏特征场景还是用L-BFGS这类拟牛顿法或者SGD更实际。sklearn中的LogisticRegression默认使用liblinear或lbfgs,就是针对不同规模数据的实现选择。
这一段的重点是理解凸性与优化算法的关系——考试和面试常考,而且理解了之后,你能解释清楚为什么实现Logistic回归时默认用梯度类方法就能得到稳定结果。
4. 特征空间变大之后——正则化如何拉回失控的模型
4.1 非线性变换后过拟合的直观表现
用前面圆内圆外的例子继续实验,把多项式阶数从2升到10,你会看到决策边界开始出现奇怪的凸起和扭曲,训练精度仍然接近100%,但测试精度明显下降。边界在靠近点簇的地方出现了"蛇形"走向,这正是模型在强行记忆训练样本分布细节的典型信号。
在参数层面,过拟合时学出来的权重向量w会出现很大的绝对值。个别特征对应的权重可能到数百甚至数千,模型对输入的微小扰动非常敏感。因此,控制权重规模就成了抑制过拟合的直接手段。
4.2 L2正则化与权重衰减
在损失函数中加入对权重平方和的惩罚,就是L2正则化:
[
L_{reg}(w) = L(w) + \frac{\lambda}{2}|w|^2
]
求梯度时,多出一项λw。于是梯度下降更新公式变为:
[
w_j^{(t+1)} = w_j^{(t)} - \eta \left( \sum_i (\sigma(w^Tx_i) - y_i)x_{ij} + \lambda w_j^{(t)} \right)
]
可以看到,每一步更新都在朝零的方向压缩权重,所以也叫权重衰减(weight decay)。L2正则化的特点是把权重整体向小数值压缩,但不会让它们严格变成0。这在高维特征场景中尤其重要,因为几百个多项式特征几乎不可能都有独立贡献,L2能让模型保持平滑。
在sklearn里对应的参数是C,注意它是正则化强度的倒数,C越小惩罚越大。很多初学者在这里被坑过:以为C调大能加强正则化,结果C越大过拟合越严重。实际使用时要先把C的含义弄清楚。
4.3 L1正则化——特征选择的几何逻辑
L1正则化在损失函数中加的是权重绝对值之和:
[
L_{reg}(w) = L(w) + \lambda |w|_1
]
L1和L2最大的区别在于:L1会把一部分权重精确变成0,相当于自动做特征选择。这在多项式特征个数非常多的时候很实用——模型自动把不重要的特征权重清零,只保留少数关键特征。
几何上很好理解:L1惩罚项对应的约束区域是菱形,和损失函数等值线的交点更容易落在坐标轴上;L2约束区域是圆形,交点一般落在非坐标位置,所以权重很少归零。这也是为什么Lasso(L1回归)常被用来做稀疏建模的原因。
不过L1的代价是损失函数在零处不可导,用普通梯度下降处理起来略微麻烦,工程上一般用坐标下降或者近端梯度方法。sklearn里设置penalty='l1'之后,底层优化器会自动切换。
4.4 正则化强度λ到底怎么选
拿L2举例,正则化强度λ的合适取值通常通过验证集或交叉验证来确定。常见做法是取λ在[1e-4, 1e-1]之间按对数间隔取几个候选值,分别训练模型,选择验证集精度最高或验证损失最小的那个。
实践中有几个经验:
- λ太小,模型仍然过拟合,训练精度和验证精度差距大。
- λ太大,模型把所有权重都压向零,决策边界接近一条直线,欠拟合,验证精度也下降。
- 合适的λ大约在"训练精度略高于验证精度"的位置,两者的差距越小越安全。
我自己做实验时习惯先把λ设得偏大(比如1.0),看损失曲线是否快速平滑,然后逐步缩小。这样能快速感知λ的量级范围,比盲目从0.0001开始搜索效率高得多。
4.5 正则化之外的补充:早停与数据增强
除了调整损失函数,还可以用两个工程技巧抑制过拟合。
- 早停(early stopping):训练过程中监控验证集损失,当验证损失连续若干个epoch不再下降时停止训练。这在SGD训练中尤其有效。
- 数据增强:对训练样本做小幅扰动,比如给特征加少量高斯噪声或做随机坐标偏移,相当于让模型看到更多变体。
非线性变换学习的本质是找到原始特征空间中的合适表示,数据太少的时正则化能起到的作用有限,加噪声往往能直接缓解过拟合。我在生成模拟数据时经常对特征加入标准差0.02左右的高斯噪声,模型泛化能力会有可感知的提升。
5. 不止两类情况——从二分类到Softmax回归
5.1 一对多策略的简单与局限
多分类问题最简单的处理策略是一对多(One-vs-Rest,OvR):类别数为K,训练K个二分类器,第k个分类器把第k类当正类、其余所有类当负类。预测时把样本输入K个分类器,取输出概率最大的那个类作为最终结果。
这个策略实现很简单,但存在一个隐患:每个分类器训练的负类样本是其余所有类别样本的并集,数量通常远大于正类样本,类别不平衡会影响概率估计。而且K个分类器的概率输出尺度并不严格一致,直接比较它们的原始输出不够严谨。
5.2 Softmax回归——sigmoid的多分类推广
Softmax回归(也叫多项Logistic回归)是更自然的多分类扩展。对类别k,计算线性得分z_k = w_k^Tx,然后:
[
P(y=k|x;W) = \frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}}
]
当K=2时,Softmax会退化为sigmoid形式的二分类。
相应的损失函数是:
[
L(W) = -\sum_{i=1}^N \sum_{k=1}^K y_{ik} \ln P(y=k|x_i;W)
]
其中y_{ik}是one-hot编码,只有样本真实类别对应的位置为1,其余为0。
学习到这一步,你会发现CrossEntropy Loss、Softmax、Logistic回归是环环相扣的:Logistic回归是二分类的交叉熵,Softmax回归是多分类的交叉熵,而神经网络输出层大多也是这种组合。想通这个脉络,以后再接触深度学习模型时会有一种"原来都是老朋友"的感觉。
5.3 参数冗余与实现细节
Softmax回归有一个容易忽略的性质:如果对所有k的w_k同时加上同一个向量v,模型的输出概率完全不变。因为分子分母的e^{z_k+v^Tx}同时多乘了一个e^{v^Tx},约分后抵消。这意味着Softmax的参数存在冗余,最优解不是唯一的。
在实际实现中,如果不加正则化,矩阵W可能出现数值不稳定问题;加了L2正则化之后,冗余自由度被约束,求解会稳定很多。这个细节在期末考试里经常考,面试时也是常见的追问点。
5.4 数值稳定性处理
计算Softmax时,如果某个z_k很大(比如1000),e^{1000}直接超出浮点数表示范围。标准做法是对所有z_k都减去其最大值:
[
P(y=k|x;W) = \frac{e^{z_k - z_{max}}}{\sum_{j=1}^K e^{z_j - z_{max}}}
]
这个操作不改变概率值,因为分子分母同时缩小了e^{z_{max}}倍。几乎所有深度学习框架的Softmax实现内部都做了这一处理,理解原理后,自己写代码时也会养成这个习惯。
6. 实验环节的常见坑——特征缩放、收敛判断与决策边界可视化
6.1 不标准化特征,梯度下降会原地转圈
特征缩放对Logistic回归的影响在多项式特征场景中更加明显。假设一个特征是"年龄"范围在[0,80],另一个特征是"收入"范围在[10000, 1000000],两者数值尺度相差上万倍。如果直接做梯度下降,梯度更新的步长在数量级大的特征方向上被主导,数量级小的特征几乎学不到东西,损失曲线表现为一种震荡下降、收敛极慢的状态。
标准化最简单有效的方法是z-score:
[
x' = \frac{x - \mu}{\sigma}
]
即每个特征减去均值再除以标准差,让所有特征落在相近的尺度范围内。注意:均值和标准差只能用训练集计算,然后应用到验证集和测试集,绝对不能用全部数据计算,否则会造成信息泄露,验证结果会偏乐观。
我在实验里实际对比过:不标准化的Logistic回归迭代几千轮还没有收敛,标准化之后几百轮损失就降到很低的水平。如果你的模型训练迟迟不收敛,先检查特征缩放,这往往比调学习率更有效。
6.2 学习率怎么调——先发散再收缩
学习率太大,损失函数会在最小值附近来回震荡甚至发散;学习率太小,收敛速度让人着急。一个工程上常用的策略是:
- 先设一个较大的学习率比如0.1,观察损失曲线是否震荡。
- 若震荡,就按0.1的十分之一逐步下调,直到损失曲线平滑下降。
- 用小批量训练时,学习率通常可以比全批量SGD设得稍大一些,因为小批量的梯度噪声本身有一定正则化效果。
收敛判断不要只看训练损失绝对值,更常用的做法是监控验证集损失:当验证损失连续多个epoch(比如10~20轮)不再改善时,保存当前模型并停止训练。这样既能避免浪费计算资源,也能减少过拟合风险。
6.3 完整小案例:非线性变换+Logistic回归实现圆形边界
用Python的numpy手写一个最简实现:
python复制import numpy as np
from sklearn.linear_model import LogisticRegression
np.random.seed(42)
n = 2000
X = np.random.uniform(-1.5, 1.5, size=(n, 2))
y = (X[:, 0]**2 + X[:, 1]**2 < 1).astype(int)
# 构造二次多项式特征(保留x1^2和x2^2已足够,这里用全部二次项)
X_poly = np.column_stack([X[:, 0], X[:, 1],
X[:, 0]**2, X[:, 0]*X[:, 1], X[:, 1]**2])
model = LogisticRegression(C=1.0, penalty='l2', solver='lbfgs', max_iter=1000)
model.fit(X_poly, y)
acc_train = model.score(X_poly, y)
print(f"训练集准确率: {acc_train:.4f}")
# 预测时也要做同样的特征变换
X_test = np.random.uniform(-1.5, 1.5, size=(500, 2))
y_test = (X_test[:, 0]**2 + X_test[:, 1]**2 < 1).astype(int)
X_test_poly = np.column_stack([X_test[:, 0], X_test[:, 1],
X_test[:, 0]**2, X_test[:, 0]*X_test[:, 1], X_test[:, 1]**2])
acc_test = model.score(X_test_poly, y_test)
print(f"测试集准确率: {acc_test:.4f}")
这段代码里有一个非常关键的细节:测试集的每条样本必须先做成和训练集完全相同的特征映射,再去调predict,否则特征维度对不上,模型根本没法工作。很多同学在作业里把测试集的原始特征直接塞给模型,报错维度不匹配就是这个原因。
把学到的权重打印出来观察,你会发现w_1和w_2对应的系数绝对值明显小于w_3和w_4,这从参数层面印证了"圆内圆外问题主要由二次项决定"的直觉。如果加入正则化,线性项的系数会被压得更狠,决策边界更干净。
6.4 可视化决策边界的正确姿势
绘制决策边界时最容易翻车的地方是网格范围和网格密度设置不合理。标准做法是:
- 取训练数据在x1和x2两个维度的最小值和最大值,向外扩展一点留出边距。
- 生成一个密集网格(比如每维200个点),把网格点做同样的特征变换后喂给模型。
- 用predict_proba得到每个网格点的正类概率,画等高线图或填充图。
等高线层级的选择也有讲究。像圆形边界这种数据,把等概率线画在[0.1, 0.3, 0.5, 0.7, 0.9]五条线上,能看到非常接近真实圆的位置。只会画0.5这条线的同学会漏掉很多关于模型置信度分布的信息,比如哪些区域模型更犹豫、哪些区域模型更自信,这些往往才是调试模型最有价值的信息。
6.5 关于判别式模型与生成式模型的一点延伸
最后补充一个经常和Logistic回归一起出现的概念:判别式模型与生成式模型的区别。Logistic回归直接对条件概率P(y|x)建模,是判别式模型的代表;而朴素贝叶斯对联合概率P(x,y)建模,属于生成式模型。判别式模型只需要估计决策边界,对特征分布做很少假设,通常在有充足训练数据时表现更好;生成式模型则能从数据中学到更多结构信息,在数据量较少时也不容易崩溃,两者各有所长。
我个人的体会是,学习Logistic回归时不要只盯着"怎么用sklearn调一个模型",而是把从概率假设到损失函数、从线性边界到非线性变换、从二分类到多分类这条逻辑链完整走通。这条链上的每一个环节,都会在后面学习SVM、神经网络、甚至深度学习时反复出现。做实验时多打印几组中间结果——损失曲线、权重数值、验证精度——比整天调参更能训练出对模型行为的直觉。
