模型的评估与选择
本文是笔者西瓜书第二章的学习笔记,如有谬误,请随时指出。
经验误差与过拟合
首先我们需要明确一些概念:
- 错误率(error rate): E = a / m E = a/m E=a/m,共 m m m个样本,其中 a a a个样本分类错误
- 精度(accuracy): A c c = 1 − E Acc = 1-E Acc=1−E
- 误差(error):代表学习器的实际预测值和样本的真实值之间的差异
- 经验误差(training error):代表学习器在训练过程中的误差,也称训练误差
- 泛化误差(generalization error):在新样本(没见过的样本)上的误差
我们实际上希望得到泛化误差最小化的学习器,但是由于训练集的局限性,我们无法得知那些新样本是什么样的,因此我们只能从已知的训练集中获取足够多的有效信息,即使经验误差降低,从而希望泛化误差降低。
但是实际上使经验误差降低时,泛化误差并不一定降低。当经验误差降低,而泛化误差升高,这就代表过拟合。当经验误差降低,而泛化误差还未降低到极小值点,这就代表欠拟合。
一般情况下,欠拟合比较容易克服,而过拟合一般无法彻底避免,我们能做的只有缓解。如果我们认为最小化经验误差,则代表最小化泛化误差,那么实际上我们就已经在多项式的时间内解决了一个 NP \text{NP} NP难问题,那么就构造的证明了 NP = P \text{NP}=\text{P} NP=P。因此只要认为 NP ≠ P \text{NP}\neq\text{P} NP=P,过拟合就无法避免。
那么既然不能直接获得泛化误差,并且训练误差由于过拟合的存在不适合作为标准,我们应该如何评估和选择模型呢?
评估方法
一般给定一个数据集,我们需要将其分割为测试集、训练集和验证集三部分:
- 测试集(testing set):给出学习器对新样本的判别能力,用于近似泛化误差。
- 训练集(training set):用于训练模型,降低经验误差。
- 验证集(validation set):用于在调整超参数的过程中,给出模型的性能评估。
一般情况下,测试集和训练集在一开始就会区分开来,之后我们再人工的从训练集中分割出一部分当作验证集。下文给出分割训练集的各种方法。
留出法(hold-out)
将数据集 D D D划分为两个互斥的集合 T , V T, V T,V,其中验证集 V V V需要用分层采样的方式采样,目的是尽可能保持数据分布一致。同时单次留出法的估计结果不够稳定,我们需要多次划分,重复评估取平均值。
但是使用留出法会导致用 D D D和 T T T训练出来的模型存在一定差异,并且 V V V越大二者差异越大。
交叉验证法(cross validation)
将数据集 D D D分割为 k k k个大小相似的互斥子集,并且采用分层抽样,保证数据分布的一致性。每次将 k − 1 k-1 k−1个子集当作训练集,余下的子集当作验证集,重复k次取平均即可。
当 k = m k=m k=m时,也就是交叉验证法的每个子集中只有一个样本时,称为:留一法(Leave-One-Out)。容易看出,留一法中评估的模型和用 D D D训练出来的模型十分相似,因此可以认为其结果比较准确,但是计算复杂度很高,一般不用。并且也未必比其他方法准确,No Free Lunch(NFL)定理依然适用。
自助法(bootstrapping)
给定包含 m m m个样本的数据集 D D D,在 D D D中有放回的采 m m m个样,得到 D ′ D' D′,将 D ′ D' D′当作训练集, D / D ′ D/D' D/D′当作验证集。容易估计出大约有 36.8 % 36.8\% 36.8%的样本在验证集中(计算始终不被采样到的概率即可)。
由于自助法改变了数据集的初始分布,这会引入估计偏差。一般在数据量较少的情况下使用。
性能度量
对于回归任务,常用均方误差(mean squared error)度量:
E
(
f
;
D
)
=
1
m
∑
i
=
1
m
(
f
(
x
i
−
y
i
)
)
2
,
D
=
{
(
x
1
,
y
1
)
,
…
,
(
x
m
,
y
m
)
}
E(f; D) = \frac{1}{m}\sum_{i=1}^m (f(\mathbf{x_i}-y_i))^2, D = \{(\mathbf{x_1}, y_1), \ldots, (\mathbf{x_m}, y_m)\}
E(f;D)=m1i=1∑m(f(xi−yi))2,D={(x1,y1),…,(xm,ym)}
如果确定了数据分布
D
\mathcal{D}
D和概率密度
p
(
⋅
)
p(\cdot)
p(⋅),均方误差为:
E
(
f
;
D
)
=
∫
x
∼
D
p
(
x
)
⋅
(
f
(
x
)
−
y
)
d
x
E(f; \mathcal{D}) = \int_{\mathbf{x}\sim\mathcal{D}}p(\mathbf{x})\cdot (f(\mathbf{x})-y)\text{d}\mathbf{x}
E(f;D)=∫x∼Dp(x)⋅(f(x)−y)dx
查全率(recall)、查准率(precision)和F1指标
二分类问题的混淆矩阵如下:
真实情况 | 预测结果 | 预测结果 |
---|---|---|
正例 | 反例 | |
正例 | TP | FN |
反例 | FP | TN |
进而可以得出查准率
P
P
P和查全率
R
R
R:
P
=
TP
TP
+
FP
R
=
TP
TP
+
FN
P = \frac{\text{TP}}{\text{TP}+\text{FP}} \qquad R = \frac{\text{TP}}{\text{TP}+\text{FN}}
P=TP+FPTPR=TP+FNTP
- 查准率:在预测为正例的样本中,真实的正例的占比
- 查全率:在真实为正例的样本中,预测为正例的占比
我们根据学习器的预测结果对样例排序,将学习器认为最有可能是正例的样本排在前面,然后将样本逐个预测为正类,计算当前的查全率和查准率,绘制图像(P-R曲线)。图像的横纵坐标分别是查准率和查全率,当一个学习器P-R曲线围成的面积大于另外一个学习器的P-R曲线围成的面积,说明该学习器性能更好。
但是面积往往不容易估算,我们需要一种更加简单的度量。可以用BEP(Break-Even Point),它是
P
=
R
P=R
P=R时的取值。同时也可以用F1指标:
1
F
1
=
1
2
⋅
(
1
P
+
1
R
)
=
2
×
TP
样例总数
+
TP
−
TN
\frac{1}{F1} = \frac{1}{2}\cdot \left(\frac{1}{P}+\frac{1}{R}\right) = \frac{2\times \text{TP}}{\text{样例总数}+\text{TP}-\text{TN}}
F11=21⋅(P1+R1)=样例总数+TP−TN2×TP
这里运用了调和平均定义,由于调和平均相对于算术平均和几何平均更注重较小值。
对于多分类问题,可以看成是
n
n
n个二分类问题,给出下述定义:
macro-
P
=
1
n
∑
i
=
1
n
P
i
macro-
R
=
1
n
∑
i
=
1
n
R
i
macro-
F
1
=
1
2
⋅
(
1
macro-
P
+
1
macro-
R
)
\text{macro-}P = \frac{1}{n}\sum_{i=1}^{n} P_i \\ \text{macro-}R = \frac{1}{n}\sum_{i=1}^{n} R_i \\ \text{macro-}F1 = \frac{1}{2}\cdot \left(\frac{1}{\text{macro-}P}+\frac{1}{\text{macro-}R}\right)
macro-P=n1i=1∑nPimacro-R=n1i=1∑nRimacro-F1=21⋅(macro-P1+macro-R1)
ROC与AUC
首先给出真正例率(True Positive Rate, TPR)和假正例率(False Positive Rate, FPR)的定义:
T
P
R
=
TP
TP
+
FN
F
P
R
=
FP
TN
+
FP
TPR = \frac{\text{TP}}{\text{TP}+\text{FN}}\qquad FPR = \frac{\text{FP}}{\text{TN}+\text{FP}}
TPR=TP+FNTPFPR=TN+FPFP
- 真正例率:在真实的正例中,被预测为正例的样本占比
- 假正例率:在真实的反例中,被预测为正例的样本占比
类似与P-R曲线,依然按相同方式排序后,依次将样本预测为正例,然后绘制ROC曲线,图像的纵轴是TPR,横轴是FPR。依然可以计算ROC的包裹的面积,面积大的性能更好,面积大小就是AUC。
偏差与方差
首先给出该部分的符号定义, x \mathbf{x} x代表测试样本, y D y_D yD是数据集中 x \mathbf{x} x的标记, y y y代表真实标记, f ( x ; D ) f(\mathbf{x};D) f(x;D)是在训练集 D D D上模型 f f f关于 x \mathbf{x} x的预测输出。
对于回归问题,学习算法(关于训练集,此时随机变量是训练集
D
D
D)的期望误差为:
f
ˉ
(
x
)
=
E
D
[
f
(
x
;
D
)
]
\bar{f}(\mathbf{x}) = \mathbb{E}_D[f(\mathbf{x}; D)]
fˉ(x)=ED[f(x;D)]
使用样本数相同的不同训练集产生的方差为
v
a
r
(
x
)
=
E
D
[
(
f
(
x
;
D
)
−
f
ˉ
(
x
)
)
2
]
var(\mathbf{x}) = \mathbb{E}_D[(f(\mathbf{x};D)-\bar{f}(\mathbf{x}))^2]
var(x)=ED[(f(x;D)−fˉ(x))2]
噪声为
ϵ
2
=
E
D
[
(
y
D
−
y
)
2
]
\epsilon^2 = \mathbb{E}_D[(y_D-y)^2]
ϵ2=ED[(yD−y)2]
期望输出与真实标记之间的偏差(bias)为
b
i
a
s
2
(
x
)
=
(
f
ˉ
(
x
)
−
y
)
2
bias^2(\mathbf{x}) = (\bar{f}(\mathbf{x})-y)^2
bias2(x)=(fˉ(x)−y)2
我们假设噪声期望为0,即
E
D
[
(
y
D
−
y
)
]
=
0
\mathbb{E}_D[(y_D-y)]=0
ED[(yD−y)]=0,可以得出算法的期望泛化误差:
E
(
f
;
D
)
=
E
D
[
(
f
(
x
;
D
)
−
y
D
)
2
]
=
b
i
a
s
2
(
x
)
+
v
a
r
(
x
)
+
ϵ
2
E(f; D) = \mathbb{E}_D[(f(\mathbf{x};D)-y_D)^2] = bias^2(\mathbf{x})+var(\mathbf{x})+\epsilon^2
E(f;D)=ED[(f(x;D)−yD)2]=bias2(x)+var(x)+ϵ2
因此泛化误差可以分解为偏差、方差与噪声之和。其中
- 偏差:刻画了学习算法本身的拟合能力
- 方差:刻画了数据扰动造成的学习性能的变化
- 噪声:刻画了任务的难度