2.1 监督学习算法与损失函数关卡


2.1 监督学习算法与损失函数关卡

监督学习考点:KNN、线性回归、逻辑回归、决策树、支持向量机的特性边界,以及均方误差与交叉熵的选配逻辑。通关标准:给任务配对"算法 + 损失",并说出选错时的典型症状。承接第一章决策卡——归类完成后,这里回答"用什么武器打"。

遭遇战:关卡题目

关卡一(单选):下列算法中,天然不适合直接处理高维稀疏特征(如文本词袋向量)的是:

A. 逻辑回归 B. 线性回归 C. K 近邻 D. 决策树

关卡二(单选):三分类任务中,把 softmax 输出与独热标签的匹配程度作为优化目标,应选的损失函数是:

A. 均方误差 B. 交叉熵损失 C. 铰链损失 D. 余弦相似度

关卡三(简答):为什么逻辑回归做二分类通常不用均方误差而用交叉熵?从梯度角度作答。

关卡四(判断):"决策树对特征量纲敏感,使用前必须标准化。"对吗?

先攻提示

  • 关卡一想距离在高维空间的行为:维度一高,样本间距离的区分度发生什么变化?
  • 关卡二抓"概率分布对概率分布"的度量;
  • 关卡三把两个损失的梯度表达式写出来对比,看哪个在预测偏离大时梯度也大;
  • 关卡四回忆决策树的分裂准则用的是排序还是数值大小。

后核:标准解析

关卡一选 C。 K 近邻依赖样本间距离找邻居,高维稀疏向量下距离趋于同质化(俗称维度灾难),近邻失去意义;且预测时要现算与全部样本的距离,慢。逻辑回归与线性回归对稀疏特征友好;决策树按特征阈值分裂,稀疏特征也能处理。补充一个高频追问:KNN 是惰性学习(没有显式训练阶段),判别式模型。

关卡二选 B。 多分类标准配置是 softmax 输出加交叉熵损失:交叉熵度量预测分布与真实分布的差异,配合 softmax 时梯度形式简洁(误差恰好等于概率减标签)。铰链损失是支持向量机的标配;均方误差用在概率输出上梯度含导数衰减项,收敛慢。

关卡三:以 sigmoid 输出为例,配均方误差时,损失对输入的梯度含 sigmoid 的导数因子,当输出饱和(接近零或一)时该因子趋近于零,预测严重错误反而梯度几乎消失,学习停滞;配交叉熵时,化简后的梯度正比于预测概率与标签之差,错得越狠梯度越大,纠正越有力。这就是"分类用交叉熵"的梯度层面解释。

关卡四:错。 决策树按阈值划分,只关心特征值的大小次序,量纲缩放不改变分裂结果,无需标准化。需要标准化的典型是 KNN、SVM、线性模型的正则化场景(否则惩罚项对各特征不公平)。

用代码把"算法—是否需要标准化—适用场景"做成对照自测:

# 算法特性对照自测 algorithms = [ ("KNN", "需要", "小数据近邻分类", "惰性学习 无训练阶段"), ("线性回归", "建议", "数值型回归", "可解释性强"), ("逻辑回归", "建议", "二分类基线", "输出可作概率用"), ("决策树", "不需要", "表格数据分类", "对量纲不敏感"), ("SVM", "需要", "中小样本分类", "依赖距离与核函数"), ] print(f"{'算法':<8}{'标准化':<8}{'典型场景':<12}备注") for a, s, u, note in algorithms: print(f"{a:<8}{s:<8}{u:<14}{note}") # 输出: # 算法 标准化 典型场景 备注 # KNN 需要 小数据近邻分类 惰性学习 无训练阶段 # 线性回归 建议 数值型回归 可解释性强 # 逻辑回归 建议 二分类基线 输出可作概率用 # 决策树 不需要 表格数据分类 对量纲不敏感 # SVM 需要 中小样本分类 依赖距离与核函数

再手工复算交叉熵的数值,确认你能在没有框架时算出来。设真实类别是第二类,模型 softmax 输出为:

# 手工计算多分类交叉熵(含数值验算) import math logits = [2.0, 1.0, 0.1] m = max(logits) exp = [math.exp(v - m) for v in logits] # 减最大值防溢出 probs = [e / sum(exp) for e in exp] print("softmax 概率:", [round(p, 4) for p in probs]) true_label = 1 # 真实类为第二类 loss = -math.log(probs[true_label]) print(f"交叉熵损失 = -ln({probs[true_label]:.4f}) = {loss:.4f}") # 输出: # softmax 概率: [0.659, 0.2424, 0.0986] (四舍五入显示) # 交叉熵损失 = -ln(0.2424) = 1.4176

如果模型把正确类概率从当前值提到零点九,损失降到约零点一量级——把这个变化亲手算一遍,交叉熵"惩罚自信的错误"的手感就有了:

# 概率变化 → 损失变化:体会交叉熵的惩罚力度 for p in [0.2424, 0.5, 0.9, 0.99]: print(f"正确类概率 {p:.4f} → 损失 {-math.log(p):.4f}") # 输出: # 正确类概率 0.2424 → 损失 1.4176 # 正确类概率 0.5000 → 损失 0.6931 # 正确类概率 0.9000 → 损失 0.1054 # 正确类概率 0.9900 → 损失 0.0101

再从梯度角度做对照实验,量化"错得越狠、纠正越有力"这句结论:

# 均方误差与交叉熵的梯度对照:预测偏差拉大时的纠正力度 import math def sigmoid(x): return 1.0 / (1.0 + math.exp(-x)) for z in [-4.0, -2.0, 0.0, 2.0]: # 网络输入 z,真实标签 y = 1 p = sigmoid(z) grad_mse = 2 * (p - 1) * p * (1 - p) # MSE 梯度:多乘 sigmoid 的导数因子 grad_ce = p - 1 # 交叉熵梯度:恰为概率减标签 print(f"z={z:+.1f} 预测={p:.4f} MSE梯度={grad_mse:+.4f} 交叉熵梯度={grad_ce:+.4f}") # 输出: # z=-4.0 预测=0.0180 MSE梯度=+0.0000 交叉熵梯度=-0.9820 # z=-2.0 预测=0.1192 MSE梯度=-0.0371 交叉熵梯度=-0.8808 # z=+0.0 预测=0.5000 MSE梯度=-0.1250 交叉熵梯度=-0.5000 # z=+2.0 预测=0.8808 MSE梯度=-0.0371 交叉熵梯度=-0.1192

结果解读:错得最狠的首行(预测仅约零点零二),MSE 梯度被饱和因子压到几乎为零,纠正信号全灭;交叉熵梯度接近负一,火力全开。两个损失在同一份数据上的"手感"差距,这一张表就看清了。变式:把标签换成零重跑,观察全部梯度反号、机制完全对称——对称性说明差别不在标签,在损失结构本身。

复盘:易错点与变式

易错点一:"逻辑回归是回归算法"。名字坑:它是分类算法,"回归"指的是对概率的线性回归视角。面试黑话里它是二分类基线模型。

易错点二:均方误差与交叉熵混用。症状记两条:MSE 做分类收敛慢、饱和区梯度消失;交叉熵做回归则根本语义不通(标签不是分布)。看到"训练能跑但指标很差",先查损失配没配对。

变式一:题干改成"样本极度不平衡的欺诈检测,选什么算法与损失"。加分答法:算法上树模型或逻辑回归加类权重,损失上加权交叉熵或焦点损失;单纯换算法不解决不平衡,评估还得换指标(下一关的内容)。

变式二:面试官问"线性回归可以做分类吗"。可以但糟糕:用零点五阈值切连续输出,等效于用一个特殊缩放的感知器,对离群点敏感且输出不可解释为概率——能讲清这条推理链,说明你真正理解损失与模型的边界。

复盘产出:把算法对照表抄进决策卡;下一关用同一套数据算指标,看看这里选的逻辑回归在数值上到底表现如何。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U