1、前言
对于相同的数据及问题,可以有不同的算法模型解决,那么如何评价不通算法的优劣,以及最终应该选择哪一种?针对这些问题,本文将做简单介绍。
2、常见术语
- 过拟合::模型由于学习的“太好”,在训练集上表现很好(训练误差小),而在新样本上表现很差(泛化误差大)。
- 欠拟合::与过拟合相对的概念,模型对训练集还没有完全学习好,在训练集上就表现不好(训练误差大)。
- 误差::模型预测值与真实值之间的差异。
- 训练误差(经验误差)::模型在训练集上的误差。
- 泛化误差::模型在新样本上的误差。
3、模型性能度量
3.1 回归任务
假设为真实数据,为预测结果数据,则:
-
均方误差(平方损失)MSE:回归任务中常用的性能度量
-
均方根误差 (root mean squared error)RMSE:
-
平均绝对误差 (mean absolute error) MAE:
-
均方根对数误差 (root mean squared logarithmic error) RMSLE:
3.2 分类任务
- 错误率:分类错误样本数占总样本数的比例。
- 精度:分类正确样本数占总样本数的比例,精度 = 1 - 错误率。
-
混淆矩阵:
对于二分类问题,根据分类结果可以得到以下混淆矩阵:
真实情况 | 预测结果 | - |
---|---|---|
- | 正例 | 反例 |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(假正例) | TN(真反例) |
-
查准率:预测为正例的结果中,预测正确的占比
-
查全率(召回率):真实正例中,预测正确的占比
-
P-R曲线(查准率-查全率曲线):查准率为纵轴,查全率为横轴
上图中A曲线将C曲线完全包住,则A优于C;
A与B有交点,则比较A与B平衡点(" 查准率=查全率"),所以A有于B
-
F1度量:直接用平衡点去度量有些简化,在实际评估中,更多的是用F1度量(基于查准率与查全率的调和平均)
-
度量:在实际应用中,可能对查全率与查准率重视程度不同,是加权调和平均:,表达式如下:
代表查全率对查准率的重要性,当则变为F1;查全率更重要,查准率更重要。 -
宏F1()度量:在实际应用中,可能会<1>对样本进行多次训练/测试、<2>对不同样本进行训练/测试、<3>多分类任务,对没两个类别组个成一个混淆矩阵 等。这些都会产生n个混淆矩阵,最终我们想根据这n个混淆矩阵去度量模型。所以有了以下表达式:
其中:
宏查准率()
宏查全率()
-
微F1()度量:在宏F1计算中,先根据每个混淆矩阵计算其查全率与查准率,最后进行平均;我们也可以先对所有混淆矩阵求TP、FP、TN、FN的平均值,然后再进行求解,此时得到微F1()度量:
其中:
"微查准率" (micro-P):
"微查全率" (micro-R):
-
ROC曲线:纵轴为:真正例率(TPR),横轴为:假正例率(FPR)(这里可以做如下设想:预测结果是0-1的概率,则对于二分类问题,阈值越接近0,则FPR会逐渐增大,但是TPR也会增大)
"真正例率" (TPR): 真实正例中,预测正确的占比(与查全率\召回率相同)
"假正例率" (FPR): 真实反例中,预测错误的占比(真实为反例,却预测成正例的占比)
当模型A将B的ROC曲线完全包住,则模型A优于B;
当两个模型有交集,则与坐标轴围成的右下角面积越大,则约优。 - AUC:ROC曲线下方面积,面积越大,模型越好。理想目标:TPR=1,FPR=0,即上图a中(0,1)点,所以ROC曲线越靠拢(0,1)点,越偏离45度对角线越好。
-
代价敏感错误率与代价曲线:在实际应用中,对一些类别的误判可能造成的后果是不同的。例如:在医学生,将患者误判为健康人,与将健康人误判为患者的代价是不同的。所以此时需要考虑不代价敏感错误率。令 与分别代表样本集D 的正子集和反子集,则"代价敏感" (cost-sensitive)错误率为:
其中,表示将第i 类样本预测为第j 类样本的代价,m为总样本数。
关于代价曲线这里不做太多介绍,有兴趣可以参考知乎上一篇帖子知乎上一篇帖子,分析的比较详细。这里只需要知道对于不同的分类错误,会有不同的代价,具体需根据实际情况进行设计。
4、模型评估方法
利用训练样本(“训练集”)之外的测试样本(“测试集”),对模型性能进行评估,将模型在测试集上的表现(“测试误差”)近似为模型的泛化能力(“泛化误差”)
4.1 留出法
对样本进行分层采样,例如对于二分类样本中,正、反样本各有500个,留30%作为测试样本,则应该分别对正、反样本采样150个作为测试样本(分层采样)。
利用不同的训练样本,其训练的模型也是有差异的,所以一般会采用多次留出法,最后对每次结果进行平均作为最终模型的评估结果。
该方法中涉及留出一定比例的样本作为测试集,但是这个比例是无法计算的。留的太多,则训练的模型可能离真实模型比较远;留的太少,则评估结果可能不够准确。一般选择1/5-1/3比例的样本作为测试样本。
4.2 交叉验证
交叉验证法通常称为“k折交叉验证”(“k-fold cross validation”),k最常见的取值为10,下图是10折交叉验证示意图:
交叉验证通常会对样本重复划分p次,每次进行k此交叉验证,例如:“10次10折交叉验证”。
留一法:交叉验证的特例,每次只留一个样本作为测试集,如果有m个样本,则k=m时变成了“留一法”。该方法对于样本量较大时的时间开销将非常大,在实际中应用较少。
4.3 自助法
假设样本集共有m个样本,则对进行有放回采样m次,形成新的数据集,则中一共有m个样本,但是这些样本中有一些是重复的,在样本集中一直不被采到的概率为,取极限有:
利用的m个样本作为训练集,其余没有被采样到的数据作为测试集,这样的测试结果称为“包为估计”。这种方法经常用在样本集较少的情况下,因为通过采样之后,数据集的分布与原始的分布将有区别,这将会产生估计误差,所以在实际应用中,如果样本足够多,则一般会采用留出法和交叉验证法。
5、方差与偏差
- 方差():反映的是预测与真实结果之间的偏离程度,即反映了模型本身的拟合能力。
- 偏差():反映的是由于训练集的改变(样本量不变)所引起模型性能的变化。
-
噪声():反映的是问题本身的难度。
通过推导(详见周志华老师《机器学习》P45页),可以得到模型的泛化误差为:
-
偏差一方差窘境:一般情况下,如果将模型学习的太好,则可能会出现过拟合,测试偏差将非常小,但是方差将很大;如果偏差大,则可能是欠拟合,此时由于模型还没有学习好,所以方差会比较小。下图是偏差与方差,以及泛化误差的示意图:
所以,在实际应用中,要似泛化误差足够小,则应该去平衡方差与偏差,不能只最求某个足够小。
以上内容如有理解不当,请指出,谢谢!另,文章中有些内容来源于一些书籍或其他博客,这里就不一一列举,如有侵权,请与我联系删除。