0%

04模型求解与评价指标

模型求解与评价指标

这一篇回答两个问题(原文档标注【重点】):

  1. 最优模型怎么找出来?——解析法、梯度下降、牛顿法(求解算法)
  2. 找出来的模型怎么打分?——回归指标 MAE/MSE/RMSE/R²,分类指标混淆矩阵、Accuracy/Precision/Recall/F1、ROC/AUC(性能度量)

第一部分:模型是怎么求解出来的

1. 求解到底在解什么问题?

30 秒先懂

训练模型 = 让「损失函数(含正则化项)」取得最小值。这是一个以参数为未知数的最优化问题,求解路线有两条:解析法(解方程一步到位)和迭代法(下山,一步步逼近)。

为什么需要两条路线?解析法虽好,但要求目标函数可导、且导数方程能解出公式——条件很苛刻。损失函数一旦变复杂、特征维度一高,公式解就不存在或算不动了,这时候只能迭代。


2. 解析法

适用条件与优缺点

  • 适用条件:目标函数可导,且导数方程存在解析解;
  • 优点:直接、精确、计算高效——一步得到全局最优;
  • 缺点:条件苛刻;特征维度大时矩阵求逆的复杂度极高。

手算一次:一元线性回归的最小二乘解

一元线性回归的损失函数是平方损失:

$$J(w, b) = \sum_{i=1}^{n}\big(y_i - (w x_i + b)\big)^2$$

分别对 $w$、$b$ 求偏导、令偏导等于 0,解方程组,得到:

$$w = \frac{\sum_{i}(x_i-\bar{x})(y_i-\bar{y})}{\sum_{i}(x_i-\bar{x})^2} \qquad b = \bar{y} - w\bar{x}$$

手算一次:取 3 个点 $x=[1,2,3]$、$y=[2,4,6]$:

  • 均值:$\bar{x}=2$,$\bar{y}=4$;偏差 $dx=[-1,0,1]$,$dy=[-2,0,2]$
  • $w = \dfrac{(-1)(-2)+0+ (1)(2)}{1+0+1} = \dfrac{4}{2} = 2$
  • $b = 4 - 2\times2 = 0$

得到 $\hat{y} = 2x$——数据本来就在这条线上,解析解一步命中。换成真实的 10 个「学习时长 → 成绩」样本,同一公式算出 $w \approx 2.87$、$b \approx 41.45$,即「每多学 1 小时约提 2.9 分」。

多元版:正规方程

把样本堆成矩阵($X$ 里加一列全 1 与截距相乘),解析解可以写成矩阵形式,即正规方程:

$$w = \left(X^\top X\right)^{-1} X^\top y$$

带 L2 正则化时(岭回归)只是在对角线上加一个 $\lambda I$:

$$w = \left(X^\top X + \lambda I\right)^{-1} X^\top y$$

补充 两点:① 正规方程的软肋在 $\left(X^\top X\right)^{-1}$ 这一步——求逆的复杂度约为特征维数的三次方,10 个特征毫无压力、1 万个特征就算不动了,且 $X^\top X$ 还可能不可逆,这时候就该迭代法登场;② 区分「数学推导」与「数值实现」:教材的闭式解写作 $(X^\top X)^{-1}X^\top y$,但实际数值计算不会真的去构造逆矩阵——sklearn 的 LinearRegression 求解的是同一个最小二乘问题,底层用基于 SVD/QR 的最小二乘求解器,数值上远比显式求逆稳定。


3. 梯度下降法(Gradient Descent)

1. 它解决什么问题?

损失函数太复杂、参数维度太高、解析解不存在或算不起——梯度下降用「迭代」代替「解方程」:先随机取一组参数,然后沿着让损失下降最快的方向一小步一小步更新,直到走到(局部)最低点。 它是求解无约束优化问题最简单、最经典的方法。

2. 核心直觉

想象蒙着眼睛在山上找最低谷:

  • 你看不见全局,但能感觉出脚下的坡往哪边最陡;
  • 每次沿最陡的下坡方向迈一小步,反复如此,总能走到某个谷底。

术语对应:

  • 梯度方向 = 函数值上升最快的方向(最陡上坡);
  • 负梯度方向 = 函数值下降最快的方向(最陡下坡);
  • 学习率 $\eta$ = 每一步迈多大。

梯度下降:沿负梯度方向在损失曲面上一步步下行

3. 数学表达 / 公式

参数更新公式(讲超参数时露过一面的那个式子,现在正式认识一遍):

$$w_{new} = w_{old} - \eta \frac{\partial J}{\partial w}$$

符号 含义
$J(w)$ 目标函数(损失 + 正则化项),参数的函数
$\dfrac{\partial J}{\partial w}$ 梯度:当前点上坡最陡的方向和陡峭程度
$\eta$ 学习率(超参数):每步走多远
$w_{new},\ w_{old}$ 更新后 / 更新前的参数

手算一次。目标函数 $J(x) = (x^2 - 2)^2$,它的最小值在 $x = \sqrt{2} \approx 1.4142$ 处($J=0$)。梯度:

$$J’(x) = 4x(x^2-2)$$

取初始值 $x=1$、学习率 $\eta=0.1$,代入 $x_{new} = x - 0.1 \times J’(x)$:

轮次 $x$ $J(x)$ $J’(x)$ 更新
0 1.0000 1.0000 $-4$ $x = 1 - 0.1\times(-4) = 1.4$
1 1.4000 0.0016 $-0.224$ $x = 1.4 + 0.0224 = 1.4224$
2 1.4224 0.00054 $+0.132$ $x = 1.4224 - 0.0132 = 1.4092$
3 1.4092 0.00020 $-0.080$ $x = 1.4092 + 0.0080 = 1.4172$

$J$ 从 1 一路跌到万分之二,$x$ 在谷底附近小幅震荡着逼近 $1.4142$——注意「震荡」:因为步长是固定的,越到谷底越容易迈过头,但幅度越来越小。

4. 模型是怎么训练出来的?

梯度下降的完整循环只有四步:

1
2
3
4
5
6
7
1. 初始化参数(随机给一组初值)
↓
2. 计算梯度(当前参数下,损失对每个参数的偏导)
↓
3. 更新参数(沿负梯度方向走 η 一步)
↓
4. 重复 2~3,直到满足停止条件

停止条件通常是三选一:梯度接近零、达到最大迭代次数、损失值的变化量小于容差 tol。

学习率 $\eta$ 怎么选(超参数,只能试):

  • 过大:一步跨过最优解。就用上面的例子,把 $\eta$ 从 0.1 改成 1——第一步 $x$ 直接从 1 跳到 5,损失从 1 暴涨到 529,越走越远(发散);
  • 过小:收敛极慢,几万轮还没走到;
  • 经验:从 0.01 / 0.1 量级开始试,或交给自适应优化器(Adam、Adagrad 会自动调整步长)。

5. Python / sklearn 怎么实现?

不借助任何库,十几行就能看到梯度下降完整跑起来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def J(x):
"""目标函数"""
return (x**2 - 2) ** 2

def gradient(x):
"""梯度"""
return 4 * x**3 - 8 * x

x = 1 # 初始值
alpha = 0.1 # 学习率

while (j := J(x)) > 1e-30: # 损失足够小就停(:= 海象运算符:赋值的同时参与判断)
print(f"x={x}\tJ={j}")
grad = gradient(x) # ① 求梯度
x = x - alpha * grad # ② 沿负梯度更新

运行打印的 $x$ 序列正是手算表里那串数字,最终稳定在 $\sqrt{2}$ 附近;把它画出来就是一条在谷底两侧来回衰减的轨迹:

梯度下降轨迹:在谷底震荡着逼近最小值

实际训练模型时不手写循环,直接用 SGDRegressor(用随机梯度下降解回归):

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.linear_model import SGDRegressor

model = SGDRegressor(
loss="squared_error", # 损失函数,默认均方误差
penalty=None, # 它默认自带 L2 正则化;想要纯最小二乘要显式关掉
fit_intercept=True, # 是否学习偏置 b
learning_rate="constant", # 学习率策略
eta0=0.1, # 初始学习率(超参数)
max_iter=1000, # 最大迭代次数(停止条件之一)
tol=1e-8, # 损失变化小于它就提前停止
)
model.fit(X, y)
print(model.coef_, model.intercept_) # 学到的参数

6. 三种变体与常见问题

梯度 = 用数据算出来的。一轮更新用多少数据,衍生出三种变体:

变体 每次更新用多少数据 优点 缺点
批量梯度下降 BGD 全部训练数据 方向准,稳定收敛 数据一大,一步更新贵到算不动
随机梯度下降 SGD 随机 1 个样本 快,适合大规模数据 方向噪声大、震荡剧烈,可能难收敛
小批量梯度下降 MBGD 一小批(如 32、64 个) 稳定与速度的平衡 ——

MBGD 是深度学习时代的事实标准,「batch size = 32/64」说的就是它。

两个常见坑:

  1. 局部极小值与鞍点:负梯度只保证「往低走」,不保证走到全局最低——可能困在半山腰的小坑(局部最优)或坡度全零的鞍点。缓解:动量(Momentum)、Adam 等优化器、多次随机初始化。
  2. 特征尺度不一时收敛慢:某特征 01、另一特征 010000,损失面的等高线是又扁又斜的椭圆,梯度方向来回弹锯齿。这就是做模型前要标准化/归一化的另一个原因。

4. 牛顿法与拟牛顿法(了解)

30 秒先懂

梯度下降只用一阶信息(坡往哪边斜),牛顿法再用上二阶信息(坡度本身变化多快,即曲率),于是每一步该迈多大可以直接算出来——收敛快得多,但每一步也贵得多。

更新公式:

$$w_{new} = w_{old} - H^{-1} \nabla J(w)$$

其中 $H$ 是黑塞矩阵(二阶偏导组成的矩阵),$H^{-1}$ 相当于「按曲率自动缩放过的步长」。

手算对比:还是求 $x^2 = 2$。牛顿法解方程 $f(x)=x^2-2=0$ 的迭代式是 $x_{new} = x - \dfrac{f(x)}{f’(x)}$:

轮次 $x$
0 1
1 $1 - \dfrac{-1}{2} = 1.5$
2 $1.5 - \dfrac{0.25}{3} \approx 1.41667$
3 $\approx 1.414216$

3 轮就精确到小数点后 6 位($\sqrt2 = 1.414214$),而梯度下降 3 轮还在 1.41 附近震荡——这就是二阶信息的威力。

代价:$H$ 是 $d \times d$ 矩阵,参数一多,存储和求逆都吃不消,还可能发散。拟牛顿法用一个正定矩阵近似 $H^{-1}$(代表算法 BFGS / L-BFGS),省掉黑塞矩阵。两者一般用于中小规模的凸优化问题;sklearn 里逻辑回归默认的求解器 lbfgs 就是拟牛顿法。

一句话总结:解析法是「解方程」,梯度下降是「一阶迭代,慢而通用」,牛顿法是「二阶迭代,快而昂贵」。


第二部分:模型评价指标

指标是给模型打分的尺子。同一组预测,用不同的尺子量,结论可能完全不同——所以先弄清每把尺子量的是什么,再谈公式。


5. 回归模型评价指标

一把尺子为什么不够?因为「误差」可以关心不同侧面:平均偏多少?大误差罚不罚重?误差用什么单位?比「无脑猜平均」好多少?四个指标正好回答四个问题。

本节全部用同一组预测做手算:

$$y_{true} = [3,\ 5,\ 2] \qquad y_{pred} = [2,\ 5,\ 4] \qquad 误差 = [1,\ 0,\ -2]$$

5.1 MAE 平均绝对误差(Mean Absolute Error)

$$MAE = \frac{1}{n}\sum_{i=1}^{n}\vert y_i - \hat{y}_i \vert = \frac{1+0+2}{3} = 1$$

直觉:平均每个预测偏了 1(和目标值同单位,解释最直观)。绝对值不放大误差,因此对异常值不敏感——适合数据里有异常值的场景。

5.2 MSE 均方误差(Mean Squared Error)

$$MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 = \frac{1+0+4}{3} \approx 1.67$$

直觉:先平方再平均。偏 2 的样本被平方成 4,一个「大错」抵得上四个「小错」——对大误差和异常值敏感。平方让它处处可导、且是凸函数(只有一个全局最低点),解析法和梯度下降都好使,因此它是回归默认的损失函数。

5.3 RMSE 均方根误差(Root Mean Squared Error)

$$RMSE = \sqrt{MSE} = \sqrt{1.67} \approx 1.29$$

直觉:就是给 MSE 开个根号,让量纲回到目标值本身——「平均偏了约 1.29」,可以直接和原始数据对话。注意(原文档提醒):一味追求降 RMSE,模型会拼命迁就异常值,反而容易过拟合。

5.4 R² 决定系数

$$R^2 = 1 - \frac{\sum_{i}(y_i - \hat{y}i)^2}{\sum{i}(y_i - \bar{y})^2}$$

符号 含义
分子 模型残差的平方和(模型犯的总错)
分母 「永远预测均值 $\bar{y}$」这个无脑基线犯的总错

直觉一句话:R² 回答「你比无脑猜平均值好多少」。

手算一次:$\bar{y} = 10/3 \approx 3.33$;分子 $= 1+0+4 = 5$;分母 $= (3-3.33)^2+(5-3.33)^2+(2-3.33)^2 \approx 0.11+2.78+1.78 = 4.67$:

$$R^2 = 1 - \frac{5}{4.67} \approx -0.07$$

负数! 含义很残酷:这组预测比「永远猜平均值」还要差一点。R² 是唯一会给出负分的常用指标——它拿你和最笨的基线比。换一组好一点的预测 $\hat{y}=[2,6,2]$(分子降为 2),$R^2 = 1 - 2/4.67 \approx 0.57$,即「解释了约 57% 的差异」。

R² 取值 含义
接近 1 解释能力强,模型远好于均值基线
0 左右 和「永远猜均值」没区别
负数 比无脑猜均值还烂

5.5 怎么选

场景 推荐
常规训练(当损失函数用) MSE(可导、好优化)
数据里有异常值 MAE(不被极端值带偏)
要向业务解释「平均偏多少」 RMSE / MAE(量纲一致)
想知道「比基线好多少」 R²

补充 实践中常多个指标一起看:MSE 说明优化目标、RMSE 说明误差量级、R² 说明相对水平,互相不冲突。


6. 分类模型评价指标

先把整套指标体系挂在一棵树上——分类模型输出的通常是一个概率,从概率到「分数」有三条不同的评价路线:

1
2
3
4
5
6
7
分类指标
├── 阈值切分后的对错(先按 0.5 之类切成类别再数)
│ Accuracy / Precision / Recall / F1
├── 排序能力(不看切在哪儿,看正类是否排在负类前面)
│ ROC-AUC / PR 曲线与 AP
└── 概率质量(概率本身给得准不准、敢不敢直接用)
Log Loss / Brier Score / 校准(Calibration)

同一个模型这三种分数完全可以一好一坏:排序很强但概率虚高、准确率高但正类全漏。评价前先想清楚「我要评的是哪一层」,再挑指标。

6.1 混淆矩阵:一切分类指标的源头

为什么需要它? 先看准确率(Accuracy)怎么骗人:1000 人体检,990 个健康、10 个患病。模型无脑输出「全部健康」,准确率高达 **99%**——但一个病人都没抓到,这个模型一文不值。问题出在:Accuracy 把「四种对错」揉成了一个数。混淆矩阵把这四种情况摊开:

混淆矩阵:行是真实值,列是预测值

四个格子的记法:第二个字母(P/N)是模型说的,第一个字母(T/F)是模型说得对不对:

  • TP 真正例:真是正例,也判成了正例(判对);
  • FN 假负例:真是正例,却判成了负例(漏报,判错);
  • FP 假正例:真是负例,却判成了正例(误报,判错);
  • TN 真负例:真是负例,也判成了负例(判对)。

一个例子贯穿本节:10 个样本,6 只猫、4 只狗;以猫为正例。模型判对了 5 只猫、2 只狗:

猫狗分类的混淆矩阵

即 TP=5(真猫判成猫)、FN=1(真猫判成狗)、FP=2(真狗判成猫)、TN=2(真狗判成狗)。

1
2
3
4
5
6
7
8
9
from sklearn.metrics import confusion_matrix

label = ["猫", "狗"] # 标签
y_true = ["猫", "猫", "猫", "猫", "猫", "猫", "狗", "狗", "狗", "狗"]
y_pred = ["猫", "猫", "狗", "猫", "猫", "猫", "猫", "猫", "狗", "狗"]

matrix = confusion_matrix(y_true, y_pred, labels=label) # 行=真实,列=预测
print(matrix) # [[5 1]
# [2 2]]

6.2 Accuracy / Precision / Recall / F1

Accuracy 准确率——整体判对的比例:

$$Accuracy = \frac{TP + TN}{TP + TN + FP + FN} = \frac{5+2}{10} = 0.7$$

直觉简单,但回到体检那个例子就失效:正负样本越不平衡,它越接近「无脑报多数类」的分数。

Precision 精确率(查准率)——模型喊「正」的时候,有多少把握:

$$Precision = \frac{TP}{TP + FP} = \frac{5}{5+2} \approx 0.714$$

手算含义:模型一共判了 7 个「猫」(TP+FP),其中真猫只有 5 个——每 7 次喊「猫」约有 5 次是真的。关注的是「误报」的代价。

Recall 召回率(查全率)——真正的正例,被抓住了多少:

$$Recall = \frac{TP}{TP + FN} = \frac{5}{5+1} \approx 0.833$$

手算含义:真猫共 6 只(TP+FN),抓到 5 只——6 只真猫抓住了 5 只。关注的是「漏报」的代价。

Precision 和 Recall 是一对跷跷板:判正的门槛调高(更谨慎),误报少了 Precision 升,但漏掉的也多了 Recall 降;门槛调低则反过来。按业务代价选边:

场景 更在乎 原因
病症筛查 Recall 漏诊(FN)可能致命,误报只是多做一次检查
垃圾邮件拦截 Precision 误删正常邮件(FP)代价高,漏一封垃圾邮件无所谓
风控拦截欺诈 视情况 误冻正常账户 vs 放过欺诈,看哪个更贵

F1 分数——把两者按调和平均绑成一个数:

$$F1 = \frac{2 \times Precision \times Recall}{Precision + Recall} = \frac{2 \times \frac{5}{7} \times \frac{5}{6}}{\frac{5}{7} + \frac{5}{6}} = \frac{50/42}{65/42} = \frac{10}{13} \approx 0.769$$

为什么用调和平均不用算术平均? 手算一次就明白:若 $Precision=1$、$Recall=0$,算术平均 = 0.5(看起来还行),调和平均 = 0(暴露偏科)——调和平均会重罚「一条腿走路」的模型。

1
2
3
4
5
from sklearn.metrics import classification_report

# 一次生成每个类别的 Precision / Recall / F1 和支持样本数
report = classification_report(y_true, y_pred)
print(report)

6.3 ROC 曲线与 AUC

为什么还需要它们? 上面的指标都有一个隐藏前提:先用某个阈值(通常是 0.5)把模型输出的概率切成类别,再数格子。可阈值一换,所有指标跟着变——阈值 0.3 时 Recall 0.95 但 Precision 0.4,阈值 0.8 时反过来。有没有一个与阈值无关、衡量模型排序能力的指标? 这就是 ROC 和 AUC。

先认识两个量:

$$TPR = \frac{TP}{TP+FN} \qquad FPR = \frac{FP}{FP+TN}$$

  • TPR 真正例率:真正例中被抓到的比例——其实就是 Recall;
  • FPR 假正例率:真负例中被误伤的比例——分母是全部真负例,和 Precision(分母是「预测为正」)完全不同,别混。

ROC 曲线的画法:让阈值从高到低扫一遍(比如从 1 扫到 0),每个阈值算出一对 (FPR, TPR),画成点连成线。直觉:阈值最高时什么都不判正,落在 (0,0);阈值最低时全判正,落在 (1,1);曲线越靠左上角鼓,说明低误报下也能高召回——模型好;贴着对角线 = 等于抛硬币。

ROC 曲线:越靠左上越好,对角线是随机猜测

手算一次:8 个样本,模型给每个的「为正的打分」从高到低排列:

样本 真实标签 打分
A 1 0.9
B 1 0.8
C 0 0.7
D 1 0.6
E 0 0.5
F 0 0.4
G 1 0.3
H 0 0.2

共 4 正 4 负。让阈值从 0.9 逐步降到 0.2(打分 ≥ 阈值判为正):

阈值 判为正的样本 TP FP TPR FPR 坐标点
0.9 A 1 0 0.25 0 (0, 0.25)
0.8 A,B 2 0 0.50 0 (0, 0.50)
0.7 A,B,C 2 1 0.50 0.25 (0.25, 0.50)
0.6 A,B,C,D 3 1 0.75 0.25 (0.25, 0.75)
0.5 +E 3 2 0.75 0.50 (0.50, 0.75)
0.4 +F 3 3 0.75 0.75 (0.75, 0.75)
0.3 +G 4 3 1.00 0.75 (0.75, 1.00)
0.2 全部 4 4 1.00 1.00 (1, 1)

把这些点连起来,正是下面这张阶梯图:

按阈值表画出的 ROC 阶梯曲线

AUC:ROC 曲线下的面积。手算两种方法,结果应当一致:

方法一(数格子):曲线下由四段矩形组成——

$$AUC = 0.25\times0.5 + 0.25\times0.75 + 0.25\times0.75 + 0.25\times1 = 0.75$$

方法二(配对法,更直观):随机抽一个正样本和一个负样本,正样本打分更高的概率。4 正 × 4 负 = 16 个配对,逐对检查:0.9 压过 4 个负、0.8 压过 4 个、0.6 压过 3 个(0.5/0.4/0.2)、0.3 压过 1 个(0.2)——共 12 对,$12/16 = 0.75$。两种算法完全一致。

AUC 含义
1.0 完美:所有正样本都排在负样本前面
0.75 随机抽一正一负,75% 的概率正样本得分更高
0.5 等价于随机猜测
< 0.5 比随机猜还差(把预测反过来用反而更好)
1
2
3
4
from sklearn.metrics import roc_auc_score

# y_true:真实标签(0/1);y_score:模型给出的正例概率,不是类别!
auc = roc_auc_score(y_true, y_score)

补充 注意 roc_auc_score 的第二个参数是正例的概率/打分(predict_proba(X)[:, 1]),传成预测类别会算错。

6.4 PR 曲线与 AP:不平衡数据的另一把尺子

ROC-AUC 回答的是「随机抽一正一负,正样本排在前面吗」。但正类极稀少时(欺诈率 0.1%、患病率 1%),即便 Precision 已经很难看,ROC-AUC 仍可能显得体面——数量庞大的负类把 FPR 稀释了。这时更该看 PR 曲线:

  • 横轴 Recall、纵轴 Precision——正是 6.2 节那对跷跷板;
  • 画法与 ROC 类似:阈值从高到低扫一遍,每个阈值算一对 (Recall, Precision),连成线;
  • 曲线越靠右上越好(高召回的同时保住高精确率);注意基线不再是 0.5 的对角线,而是「正类占比」的水平线。

AP(Average Precision,平均精度)是 PR 曲线的汇总数字,直觉一句话:

从模型认为最可能为正的样本开始往下找,在不断召回正样本的过程中,Precision 保持得有多好。

1
2
3
4
from sklearn.metrics import precision_recall_curve, average_precision_score

precision, recall, thresholds = precision_recall_curve(y_true, y_score)
ap = average_precision_score(y_true, y_score) # 越接近 1 越好

选择口诀:正负均衡、关心整体排序 → ROC-AUC;正类稀少、关心「抓出来的正类准不准」→ PR 曲线与 AP。

6.5 概率质量指标:概率给得准不准

predict_proba 输出的概率本身也有质量高低,常用两把尺子加一个概念:

  • Log Loss(对数损失):逻辑回归的训练损失换个身份当指标——对「自信的错误」罚得极重,适合要求概率审慎的场景;
  • Brier Score:$\frac{1}{n}\sum (p_i - y_i)^2$,即「概率 vs 真实标签」的均方误差,0~1 之间、越小越好,比 Log Loss 温和直观;
  • 校准(Calibration):所有预测 0.8 的样本,长期看是否真有约 80% 是正类——概率要拿去做风险定价、期望收益计算,就必须先校准。
1
2
3
4
from sklearn.metrics import log_loss, brier_score_loss

print(log_loss(y_true, y_score)) # 越小越好
print(brier_score_loss(y_true, y_score)) # 越小越好

6.6 多分类的平均方式

多分类下 Precision/Recall/F1 要先「每个类各算一份」再汇总——汇总方式不同,结论可能明显不同:

方式 逻辑 适合
macro 每个类的分数简单平均 关心少数类(少数类与大类同权重)
weighted 按类别样本数加权平均 想反映整体、又保留类别差异
micro 汇总所有 TP/FP/FN 后统一计算 多标签/极度偏斜场景,约等于看整体准确率

classification_report 输出末尾的 macro avg / weighted avg 两行就是它们——现在那份报告可以完整看懂了。

6.7 分类指标选择速查

场景 首选
样本均衡、粗看整体 Accuracy
样本极不平衡 Precision / Recall / F1(别只看 Accuracy)
漏报代价大(疾病筛查) Recall
误报代价大(垃圾邮件) Precision
要兼顾查准查全 F1
比较模型整体排序能力、与阈值无关 AUC

7. 易混淆点

易混对 一句话区分
解析法 vs 梯度下降 解方程一步到位(条件苛刻、维度大算不动)vs 迭代逼近(通用、可能局部最优)
梯度方向 vs 负梯度方向 前者上升最快,后者下降最快——更新参数用的是负梯度
梯度下降 vs 牛顿法 一阶(只用坡度方向)慢而便宜;二阶(再加曲率)快而昂贵
BGD / SGD / MBGD 一次更新用全部 / 1 个 / 一小批数据;MBGD 是主流
MSE vs RMSE RMSE = √MSE,量纲与目标值一致,可以直接和原始数据对话
MAE vs MSE MSE 平方放大了大误差、对异常值敏感;MAE 一视同仁、更鲁棒
R² = 0 不是「零分」,而是「和永远猜均值一个水平」;负数 = 比猜均值还差
Precision vs Recall 查准(喊「正」时多有把握)vs 查全(真正例抓住了多少);分母不同
TPR vs FPR 都是「占真实类的比例」:TPR 分母是全部真正例,FPR 分母是全部真负例
Accuracy vs AUC Accuracy 依赖阈值、怕不平衡;AUC 阈值无关、看排序能力
ROC-AUC vs AP 都看排序:均衡数据用 ROC-AUC;正类稀少时 AP(PR 曲线)更有解释力
混淆矩阵的行和列 sklearn 默认行 = 真实值,列 = 预测值,读表前先确认方向
加载中...