六、模型评估与选择
1. 经验误差与过拟合
通常我们把分类错误的样本数占样本总数的比例称为“错误率”(error rate),相应的,“精度”(accuracy)为1-错误率。
更一般地,我们把学习模型的实际预测输出 与 样本的真实输出 之间的差异称为“误差”(error)。
学习模型在训练集上的误差称为“训练误差”(training error)或“经验误差”(empirical error),在新样本上的误差称为“泛化误差”(generalization error)。
显然我们希望得到的是泛化误差小的学习模型。
在训练集上表现太好,把训练样本的一些特点都当成是所有潜在样本的特点,会导致泛化性能下降,出现“过拟合”(overfitting);相对的,训练集的特点都没有学习好,“欠拟合”(underfitting)。
过拟合是机器学习面临的关键障碍
2. 评估方法
最直观的方法是,我们把样本集分为训练集和测试集,且它俩尽可能互斥。这样通过训练集训练的学习模型,我们利用它没有见过的测试集进行测试,最终得到泛化性能强的模型。
2.1 留出法
将数据集D直接划分为两个互斥的集合,训练集S和测试集T,$D = S \cup T, S \cap T = \emptyset $。在 S 上训练出模型后,用 T 来评估其测试误差,作为对泛化误差的估计。
训练/测试集的划分要尽可能保持数据分布的一致性,避免困数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似。如果从来样 (sampling) 的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为"分层采样" (stratified sampling)。
即使在给定训练/测试集的样本比例后,仍存在多种划分方式对初始数据集 D 进行分割。因此,单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
常见做法是将大约 2/3~4/5 的样本用于训练,剩余样本用于测试。
2.2 交叉验证法
"交叉验证法" (cross validation)先将数据集 D 划分为 k 个大小相似的互斥子集, 即$D = {D_1} \cup {D_2} \cup ... \cup {D_k},{D_i} \cap {D_j} = \emptyset (i \ne j)$ . 每个子集 $D_i$ 都尽可 能保持数据分布的一致性,即从 D 中 通过分层采样得到。然后,每次用k-1 个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得 k组训练/测试集,从而可进行 k 次训练和测试,最终返回的是这 k 个测试结果的均值 显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于 k的取值,为强调这一点,通常把交叉验证法称为 " k 折交叉验证" (k-fold crossvalidation)。k 最常用 的取值是 10,此时称为10折交叉验证 ; 其他常用的k值有 5、20 等。
与留出法相似,将数据集D划分为k个子集同样存在多种划分方式。为减小因样本划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,例如常见的有"10 次 10 折交叉验证 "。
2.3 自助法
我们希望评估的是用 D 训练出的模型。但在留出法和交叉验证法中,由于
保留了一部分样本用于测试,因此实际评估的模型所使用的训练集数量都比 D 小,这
必然会引入一些因训练样本规模不同而导致的估计偏差。
"自助法" (bootstrapping)是一个比较好的解决方案,它直接以自助采样法 (bootstrap sampling)为基础。给定包含 m 个样本的数据集 D , 我们对它进行采样产生数据集 D':每次随机从 D 中挑选一个样本,将其拷贝放入 DF' 然后再将该样本放回初始数据集 D 中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行 m 次后,我们就得到了包含 m个样本的数据集 D',这就是自助采样的结果。显然 ,D 中有一部分样本会在 D'中多次出现,而另一部分样本不出现,但数据规模一样。可以做一个简单的估计,样本在 m 次采样中始终不被采到的概率是${\left( {1 - \frac{1}{m}} \right)^m}$, 取极限得到,
\[\mathop {\lim }\limits_{m \to \infty } {\left( {1 - \frac{1}{m}} \right)^m} \mapsto \frac{1}{e} \approx 0.368\]
即通过自助来样,初始数据集 D 中约有 36.8% 的样本未出现在采样数据集 D'中.于是我们可将 D' 用作训练集 , D\D' 用作测试集;这样,实际评估的模型与期望评估的模型都使用 m 个训练样本,而我们仍有数据总量约 1/3 的、没在训练集中出现的样本用于测试。这样的测试结果,亦称"包外估计" (out-of-bag estimate).
自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处.然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差.因此,在初始数据量足够时,留出法和交叉验证法更常用一些.
3. 性能度量
回归任务最常用的性能度量是“均方误差”
\[E\left( {f;D} \right) = \frac{1}{m}\sum\limits_{i = 1}^m {{{\left( {f({{\bf{x}}_i}) - {y_i}} \right)}^2}} \]
更一般地,对于数据分布D和概率密度函数p(),
\[E\left( {f;D} \right) = \int_{x\~D} {{{\left( {f({\bf{x}}) - y} \right)}^2}p({\bf{x}})d{\bf{x}}} \]
下面主要介绍分类任务的性能度量,
3.1 错误率与精度
错误率是分类错误的样本数占样本总数的比例,精度则是分类正确的样本数占样本总数的比例。
3.2 查准率、查全率、F1
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例 (true positive)、假正例 (false positive)、真反倒 (true negative) 、假反例 (false negative) 四种情形,令 TP、 FP、 TN、 FN 分别表示其对应的样例数,则显然有 TP+FP+TN+FN=样例总数。分类结果的"混淆矩阵" (confusion matrix) 如表所示,
查准率P与查全率R分别定义为,
\[\begin{array}{l}
P = \frac{{TP}}{{TP + FP}}\\
R = \frac{{TP}}{{TP + FN}}
\end{array}\]
查准率和查全率是一对矛盾的度量.一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低. 在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为"最可能 "是正例的样本,排在最后的则是学习器认为"最不可能"是正例的样本.按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、 查准率以查准率为纵轴、查全率为横轴作图 ,就得到了查准率-查全率曲线,简称 " P-R曲线"显示该曲线的图称为"P-R图",下图给出了一个示意图
P-R 图直观地显示 出学习器在样本总 体上的查全率、 查准率 .在进行比较时,若一个学习器的P-R 曲线被另一个学习器的曲线完全"包住" , 则可断言后者的性能优于前者, 例如图中 学习器 A 的性能优于学习器 C;如果两个学习器的 P-R 曲线发生了交叉,如A 与 B ,则难以一般性地断言两者孰优孰劣,只能在具体的查准率或查全率条件下进行比较。然而,在很多情形下,人们往往仍希望把学习器 A 与 B 比出个高低 . 这时一个比较合理的判据是比较 P-R 曲线节面积的大小,它在一定程度上表征了学习器在查准率和查全率上取得相对"双高"的比例.但这个值不太容易估算, 因此,人们设计了一些综合考虑查准率 、 查全率的性能度量 .
F1度量
\[{\rm{F1 = }}\frac{{2 \times {\rm{TP}}}}{{{\rm{N + TP - TN}}}}\]
其中N表示样例总数。
很多时候我们有多个二分类混淆矩阵,例如进行多次训练/测试,每次得到一个混淆矩阵;或是在多个数据集上进行训练/测试,希望估计算法的"全局"性能;甚或是执行多分类任务,每两两类别的组合都对应一个混淆矩阵,总之,我们希望在 n 个二分类混淆矩阵上综合考察查准率和查全率。
3.3 ROC与AUC
很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阔值(threshold)进行比较,若大于|词值则分为正类,否则为反类.例如,神经网络在一般情形下是对每个测试样本预测出一个 [0.0,1.0] 之间的实值,然后将这个值与 0.5 进行比较,大于 0.5 则判为正例,否则为反例.这个实值或概率预测结果的好坏,直接决定了学习器的泛化能力.实际上,根据这个实值或概率预测结果,我们可将测试样本进行排序,"最可能"是正例的排在最前面,"最不可能"是正例的排在最后面.这样,分类过程就相当于在这个排序中以某个"截断点" (cut point)将样本分为两部分,前一部分判作正例,后一部分则判作反例.
我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值,分别以它们为横、纵坐标作图'就得到了 "ROC 曲线与 P-R 曲线使用查准率、查全率为纵、横轴不同, ROC 曲线的纵轴是"真正例率" (True Positive Rate,简称 TPR),横轴是"假正例率" (False Positive Rate,简称 FPR) ,两者分别定义为,
\[\begin{array}{l}
TPR = \frac{{TP}}{{TP + FN}}\\
FPR = \frac{{FP}}{{TN + FP}}
\end{array}\]
显示 ROC 曲线的图称为 "ROC 图",显然 ,对角线对应于 "随机猜测" 模型,而点 (0, 1) 则对应于将所有正例排在所有反例之前的"理想模型" 。现实任务中通常是利用有限个测试样例来绘制 ROC 图,此时仅能获得有限个(真正例率,假正例率)坐标对,无法产生左图中的光滑 ROC 曲线 , 只能绘制出右图所示的近似 ROC 曲线.绘图过程很简单:给定 m+ 个正例和m- 个反例,根据学习器预测结果对样例进行排序,然后把分类阔值设为 最大,即把所有样例均预测为反例,此时真正例率和假正例率均为 0 , 在坐标 (0, 0) 处标记一个点然后,将分类阐值依次设为每个样例的预测值,即依次将每个样例划分为正例.设前一个标记点坐标为 (X, y) , 当前若为真正例,则对应标记点的坐标为 (X , y + 1/m+ );当前若为假正例,则对应标记点的坐标为 (X + 1/m-,y) ,然后用线段连接相邻点即得.
进行学习器的比较时, 与 P-R 图相似, 若一个学习器的 ROC 曲线被另一个学习器的曲线完全"包住", 则可断言后者的性能优于前者;若两个学习器的 ROC 曲线发生交叉,则难以-般性地断言两者孰优孰劣 . 此时如果一定要进行比较,则较为合理的判据是比较ROC曲线下 的面积,即 AUC (Area Under ROC Curve) .
从定义可知, AUC 可通过对 ROC 曲 线下各部分的面积求和而得 . 假定 ROC 曲线是由坐标为 {(x1, y1), (x2,y2) ,. . ., (xm,ym)} 的点按序连接而形成(x1=0, xm=1) ; 参见右图 ,则 AUC 可估算为
\[AUC = \frac{1}{2}\sum\limits_{i = 1}^{m - 1} {\left( {{x_{i + 1}} - {x_i}} \right)\left( {{y_i} + {y_{i + 1}}} \right)} \]
3.4 代价敏感错误率与代价曲线
为权衡不同类型错误所造成的不同损失,可为错误赋予"非均等代价" (unequal cost).
以二分类任务为例,我们可根据任务的领域知识设定一个"代价矩阵" (cost matrix)