• 六、模型评估与选择


    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 e 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}} ight)^m}$, 取极限得到,

    [mathop {lim }limits_{m o infty } {left( {1 - frac{1}{m}} ight)^m} mapsto frac{1}{e} approx 0.368]

    即通过自助来样,初始数据集 D 中约有 36.8% 的样本未出现在采样数据集 D'中.于是我们可将 D' 用作训练集 , DD' 用作测试集;这样,实际评估的模型与期望评估的模型都使用 m 个训练样本,而我们仍有数据总量约 1/3 的、没在训练集中出现的样本用于测试。这样的测试结果,亦称"包外估计" (out-of-bag estimate).

    自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处.然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差.因此,在初始数据量足够时,留出法和交叉验证法更常用一些.

    3. 性能度量

     回归任务最常用的性能度量是“均方误差”

    [Eleft( {f;D} ight) = frac{1}{m}sumlimits_{i = 1}^m {{{left( {f({{f{x}}_i}) - {y_i}} ight)}^2}} ]

    更一般地,对于数据分布D和概率密度函数p(),

    [Eleft( {f;D} ight) = int_{x~D} {{{left( {f({f{x}}) - y} ight)}^2}p({f{x}})d{f{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分别定义为,

    [egin{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度量

     [{ m{F1 = }}frac{{2 imes { m{TP}}}}{{{ m{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) ,两者分别定义为,

    [egin{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}sumlimits_{i = 1}^{m - 1} {left( {{x_{i + 1}} - {x_i}} ight)left( {{y_i} + {y_{i + 1}}} ight)} ]

    3.4 代价敏感错误率与代价曲线

    为权衡不同类型错误所造成的不同损失,可为错误赋予"非均等代价" (unequal cost).
    以二分类任务为例,我们可根据任务的领域知识设定一个"代价矩阵" (cost matrix) 

  • 相关阅读:
    5、python中的列表
    Linux---配置新服务器的常见操作(CentOS7)
    MapReduce原理篇
    用MR实现Join逻辑的两种方法
    Linux静态库与共享库
    mysql命令查看表结构及注释
    mysql 数据同步到 elastsearch7 数字类型精度丢失
    canal client-adapter 将mysql数据同步到 es elasticsearch 日期时间少8小时问题解决
    如何用redis做活跃用户统计-HyperLoglog
    jvm 虚拟机内存布局
  • 原文地址:https://www.cnblogs.com/yijuncheng/p/10082070.html
Copyright © 2020-2023  润新知