第二章 模型评估与选择
2.1 经验误差与过拟合
| 术语 | 解释 |
|---|---|
| 错误率 | 分类错误的样本占样本总数比率 |
| 精度 | 1-错误率 |
| 误差 | 学习器实际预测输出与样本的真实输出之间的差异 |
| 经验误差 | 学习器在训练集上的误差 |
| 泛化误差 | 学习器在预测集上的误差 |
| 过拟合 | 指模型在训练集误差很小,但测试集上误差很大,主要因为模型学习到了训练集上的一些噪声性质。 |
| 欠拟合 | 模型不能在训练集上获得足够小的误差,对训练样本的一些性质还未学好。 |
机器学习面临的是NP难问题,P≠NP,过拟合不可避免。
2.2 模型评估方法
图1 机器学习流程
利用测试误差作为泛化误差的近似(当然假设测试样本也是从真实样本中独立同分布采样而得)。测试集与训练集尽量互斥。
以下是几种从数据集D中获取训练集S和测试集T的方法:
2.2.1 留出法
直接将数据集D划分为互斥的集合,一个集合作为训练集,另一个作为测试集,即: ,。 需要尽可能保持数据分布一致性,避免引入额外偏差。保留类别比例的采样称为“分层采样”(stratified sampling). 由于单次留出法由于取样顺序导致的结果不稳定,可以取若干次随机划分、重复实验评估后取平均值作为评估结果。
图2 测试数据集对泛化能力的影响
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)
缺点:评估结果不够稳定准确,训练集S与D的差别将导致评估的模型与D训练出的模型差距。
2.2.2 交叉验证法
图3 k折交叉验证
from sklearn.model_selection import KFold
X = ["a", "b", "c", "d"]
kf = KFold(n_splits=2)
for train, test in kf.split(X):
print("%s %s" % (train, test))
[2 3] [0 1]
[0 1] [2 3]
特例,假定数据集D中包含m个样本,若,即为“留一法”(LOO)。留一法不受随机样本划分的影响,被实际评估的模型与D训练出的模型更近似。
# Leave One Out(LOO)
from sklearn.model_selection import LeaveOneOut
X = [1, 2, 3, 4]
loo = LeaveOneOut()
for train, test in loo.split(X):
print("%s %s" % (train, test))
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]
缺点: 数据集较大时,训练m个模型的计算开销可能难以忍受。效果未必永远比其他评估方法准确(NFL)。
2.2.3 自助法(bootstrapping)
从数据集D中自助采样产生数据集D':
每次随机从D中挑选一个样本,将其拷贝放入D',再放回;过程重复进行m次后,得到了包含m个样本的数据集D'。样本在m次采样中始终不被采样到的概率是:
图4 自助法(bootstrapping)
也就是说,初始数据集中约36.8%样本未出现在采样数据集D'中。这样,实际评估的模型和期望评估的模型都使用m个样本,另有1/3的测试样本。在数据集较小时很有用,有利于集成学习。但改变了数据集的分布,会引入估计偏差。
2.2.4 调参与最终模型
参数调节:网格搜索,贝叶斯搜索等。
2.3 性能度量
使用不同的性能度量往往会导致不同的评判结果。
例如,f(x)为预测结果,y为真实标记。
回归问题中,最常用的性能度量为“均方误差”:
更一般的,对于数据分布D和概率密度函数p(⋅),均方误差可描述为:
2.3.1 错误率与精度
错误率与精度是评价学习模型泛化能力的最常用的方法;
错误率:
精度:
2.3.2 从查准率和查全率的角度来评价学习模型泛化能力的优劣,并引用了P-R曲线和度量参数F1;
- 查准率,亦称“准确率”:precision
- 查全率,亦称“召回率”:recall
一般情况下,查全率和查准率是一对矛盾的度量。
-
“P-R”曲线
根据学习器的预测结果对样例进行排序,排在前面的是学习器认为“最可能”是正例的样本,排在最后的则是学习器认为“最不可能”是正例的样本,按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率。[4] -
绘制“P-R”曲线的步骤:
- 预测为正例的概率从大到小排列。
- 构建二维直角坐标系,横轴为查全率,纵轴为查准率。
- 阈值在
(0)处时,有TP=FP=0,即分类器预测全为负例,此时P=R=0,得到“P-R曲线”的第一个点(0,0)。 - 阈值在
(1)处时,大于该阈值的样本被预测为正例,小于该阈值的样本被预测为负例,结合样本的真实标记构建混淆矩阵,从而计算查准率和查全率,得到第二个点的坐标。 - 其余点以此类推。
- 阈值在
(n)时,得到最后一个点,分类器预测全为正例,FN=TN=0,此时查全率为1,查准率实际为数据集中正例所占的比例(如果数据集为平衡数据,P≈0.5,此时最后一个点的坐标为(1,0.5))。
因此,根据上述步骤,将得到的多个点连接起来,得到“P-R曲线”(或者叫“P-R图”)。
若一个学习器的“P-R曲线”被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者,如上图中学习器A的性能优于学习器C。
如果两个学习器的“P-R曲线”发生了交叉,例如A和B,则难以一般性地断言两者孰优孰劣,只能在具体的查准率或查全率下进行比较。
- 常用的比较方法有以下三种:
- 曲线下面积。
- 平衡点(Break-Event Point,简称BEP),它是“查准率=查全率”时的取值。如C的BEP=0.64,A优于B(因为A的BEP>B的BEP)等。
- 引入F值[4]。
其中β(β>0)度量了查全率对查准率的相对重要性。
- β=1时,即F1,查全率和查准率的重要性相当。
- β>1时,查全率有更大影响。
- β<1时,查准率有更大影响。
(3)ROC(Receiver Opreating Characteristic,受试者工作特征)曲线则评价“一般情况下”学习模型的泛化能力,并引用了度量参数AUC(Area Under Curve,曲线下的面积);
(4)P-R曲线和ROC曲线认为学习器对不同类的分类错误产生的代价损失相同,则实际情况可能是不同类的分类错误产生的代价损失不相同,即非均衡代价,因此。从非均衡代价的角度去分析模型性能的优劣,并引用了代价曲线和期望总体代价。
参考文献:
[1]机器学习模型性能评估(一):错误率与精度(天池)
[2]交叉验证:评估模型表现(scikit-learn中文社区)
[3]自助(抽样)法(机器之心)
[4]【机器学习基础】第三课:模型性能度量-查全率,查准率,F值,P-R曲线,ROC,AUC,代价敏感错误率,代价曲线