【机器学习基础笔记(二)】模型评估与选择

212 阅读2分钟

第二章 模型评估与选择

2.1 经验误差与过拟合

术语解释
错误率分类错误的样本占样本总数比率
精度1-错误率
误差学习器实际预测输出与样本的真实输出之间的差异
经验误差学习器在训练集上的误差
泛化误差学习器在预测集上的误差
过拟合指模型在训练集误差很小,但测试集上误差很大,主要因为模型学习到了训练集上的一些噪声性质。
欠拟合模型不能在训练集上获得足够小的误差,对训练样本的一些性质还未学好。

机器学习面临的是NP难问题,P≠NP,过拟合不可避免。

2.2 模型评估方法

image.png

图1 机器学习流程

利用测试误差作为泛化误差的近似(当然假设测试样本也是从真实样本中独立同分布采样而得)。测试集与训练集尽量互斥。
以下是几种从数据集D中获取训练集S和测试集T的方法:

2.2.1 留出法

直接将数据集D划分为互斥的集合,一个集合作为训练集,另一个作为测试集,即: D=STD=S\cup TST=S\cap T=\emptyset。 需要尽可能保持数据分布一致性,避免引入额外偏差。保留类别比例的采样称为“分层采样”(stratified sampling). 由于单次留出法由于取样顺序导致的结果不稳定,可以取若干次随机划分、重复实验评估后取平均值作为评估结果。

image.png

图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)

缺点:评估结果不够稳定准确,训练集SD的差别将导致评估的模型与D训练出的模型差距。

2.2.2 交叉验证法

image.png

图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个样本,若k=mk=m,即为“留一法”(LOO)。留一法不受随机样本划分的影响,被实际评估的模型与D训练出的模型更近似。

# Leave One Out(LOO)
from sklearn.model_selection import LeaveOneOut  
X = [1234]  
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次采样中始终不被采样到的概率是:

limx(11m)m=1e0.368\lim\limits_{x\rightarrow\infty} (1-\frac{1}{m})^m = \frac{1}{e} \approx 0.368

1702400014909.png

image.png

图4 自助法(bootstrapping)

也就是说,初始数据集中约36.8%样本未出现在采样数据集D'中。这样,实际评估的模型和期望评估的模型都使用m个样本,另有1/3的测试样本。在数据集较小时很有用,有利于集成学习。但改变了数据集的分布,会引入估计偏差。

2.2.4 调参与最终模型

参数调节:网格搜索,贝叶斯搜索等。

2.3 性能度量

使用不同的性能度量往往会导致不同的评判结果。

例如,f(x)为预测结果,y为真实标记。

回归问题中,最常用的性能度量为“均方误差”:

E(f;D)=1mi=1m(f(xi)yi)2E(f;D)=\frac{1}{m}\sum_{i=1}^m(f(x_i)-y_i)^2

更一般的,对于数据分布D和概率密度函数p(⋅),均方误差可描述为:

E(f;D)=xD(f(x)y)2p(x)dxE(f;D)=\int_{x\sim D}(f(x)-y)^2 p(x)dx

2.3.1 错误率与精度

错误率与精度是评价学习模型泛化能力的最常用的方法;
错误率:

E(f;D)=xDΠ(f(x)y)p(x)dxE(f;D)=\int_{x\sim D}\Pi (f(x)\neq y)p(x)dx

精度:

acc(f;D)=xDΠ(f(x)=y)p(x)dx=1E(f;D)acc(f;D)=\int_{x\sim D}\Pi (f(x)=y)p(x)dx=1-E(f;D)

2.3.2 从查准率和查全率的角度来评价学习模型泛化能力的优劣,并引用了P-R曲线和度量参数F1;

  • 查准率,亦称“准确率”:precision
  • 查全率,亦称“召回率”:recall

image.png

image.png

image.png

一般情况下,查全率和查准率是一对矛盾的度量。

  • “P-R”曲线
    根据学习器的预测结果对样例进行排序,排在前面的是学习器认为“最可能”是正例的样本,排在最后的则是学习器认为“最不可能”是正例的样本,按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率。[4]

  • 绘制“P-R”曲线的步骤:

  1. 预测为正例的概率从大到小排列。
  2. 构建二维直角坐标系,横轴为查全率,纵轴为查准率。
  3. 阈值在(0)处时,有TP=FP=0,即分类器预测全为负例,此时P=R=0,得到“P-R曲线”的第一个点(0,0)。
  4. 阈值在(1)处时,大于该阈值的样本被预测为正例,小于该阈值的样本被预测为负例,结合样本的真实标记构建混淆矩阵,从而计算查准率和查全率,得到第二个点的坐标。
  5. 其余点以此类推。
  6. 阈值在(n)时,得到最后一个点,分类器预测全为正例,FN=TN=0,此时查全率为1,查准率实际为数据集中正例所占的比例(如果数据集为平衡数据,P≈0.5,此时最后一个点的坐标为(1,0.5))。

因此,根据上述步骤,将得到的多个点连接起来,得到“P-R曲线”(或者叫“P-R图”)。

image.png

若一个学习器的“P-R曲线”被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者,如上图中学习器A的性能优于学习器C。

如果两个学习器的“P-R曲线”发生了交叉,例如A和B,则难以一般性地断言两者孰优孰劣,只能在具体的查准率或查全率下进行比较。

  • 常用的比较方法有以下三种:
  1. 曲线下面积。
  2. 平衡点(Break-Event Point,简称BEP),它是“查准率=查全率”时的取值。如C的BEP=0.64,A优于B(因为A的BEP>B的BEP)等。
  3. 引入F值[4]。
Fβ=(1+β2)×P×R(β2×P)+RF_\beta=\frac{(1+\beta^2)\times P\times R}{(\beta^2 \times P)+R}

其中β(β>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,代价敏感错误率,代价曲线