MachineLearning-10.模型评估与优化
条评论模型评估和优化是机器学习中非常重要一环,不同的机器学习任务有着不同的评价指标,同时同一种机器学习任务也有着不同的评价指标,每个指标的着重点不一样。在实际情况中,会用不同的度量去评估模型,度量的选择,完全取决于模型的类型和模型的用处。[1]
模型评估
性能度量
错误率与精度
错误率和精度是分类问题中常用的性能度量指标,既适用于二分类任务,也适用于多分类任务.
- 错误率(error rate):指分类错误的样本占样本总数的比例,即 ( 分类错误的数量 / 样本总数数量)
- 精度(accuracy):指分类正确的样本占样本总数的比例,即 (分类正确的数量 / 样本总数数量)
$$精度 = 1 - 错误率$$
查准率、召回率与F1得分
错误率和精度虽然常用,但并不能满足所有的任务需求。例如,在一次疾病检测中,我们更关注以下两个问题:
- 检测出感染的个体中有多少是真正病毒携带者?
- 所有真正病毒携带者中,有多大比例被检测了出来?
类似的问题在很多分类场景下都会出现,“查准率”(precision)与“召回率”(recall)是更为适合的度量标准。对于二分类问题,可以将真实类别、预测类别组合为“真正例”(true positive)、“假正例”(false positive)、“真反例”(true negative)、“假反例”(false negative)四种情形,见下表:
![](/images/ml/confusion_matrix.png)
样例总数:TP + FP + TN + FN
查准率: TP / (TP + FP),表示分的准不准
召回率:TP / (TP + FN),表示分的全不全,又称为“查全率”
F1得分:
$$
f1 = \frac{2 * 查准率 * 召回率}{查准率 + 召回率}
$$
查准率和召回率是一对矛盾的度量。一般来说,查准率高时,召回率往往偏低;召回率高时,查准率往往偏低。例如,在病毒感染者检测中,若要提高查准率,只需要采取更严格的标准即可,这样会导致漏掉部分感染者,召回率就变低了;反之,放松检测标准,更多的人被检测为感染,召回率升高了,查准率又降低了. 通常只有在一些简单任务中,才能同时获得较高查准率和召回率。
查准率和召回率在不同应用中重要性也不同。例如,在商品推荐中,为了尽可能少打扰客户,更希望推荐的内容是用户感兴趣的,此时查准率更重要;而在逃犯信息检索系统中,希望让更少的逃犯漏网,此时召回率更重要。
混淆矩阵
混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。每一行(数量之和)表示一个真实类别的样本,每一列(数量之和)表示一个预测类别的样本。
根据混淆矩阵,查准率、召回率也可表示为:
查准率 = 主对角线上的值 / 该值所在列的和
召回率 = 主对角线上的值 / 该值所在行的和
实验
利用sklearn提供的朴素贝叶斯分类器分类,并打印查准率、召回率、R2得分和混淆矩阵:
1 | # 混淆矩阵示例 |
打印输出:
1 | recall: 0.9910714285714286 |
训练集与测试集
通常情况下,评估一个模型性能的好坏,将样本数据划分为两部分,一部分专门用于模型训练,这部分称为“训练集”,一部分用于对模型进行测试,这部分被称为“测试集”,训练集和测试集一般不存在重叠部分. 常用的训练集、测试集比例有:9:1, 8:2, 7:3等. 训练集和测试的划分,尽量保持均衡、随机,不能集中于某个或少量类别.
有些公共数据集在创建时,已经进行了划分. 有时候,我们需要自己对数据集进行划分,划分的方式是先打乱数据集,然后使用一种计算方法,将一部分数据划入训练集,一部分数据划入测试集.
交叉验证法
交叉验证定义
在样本数量较少的情况下,如果将样本划分为训练集、测试集,可能导致单个集合样本数量更少,可以采取交叉验证法来训练和测试模型.
将所有数据,划分成N等分,用每份都去训练,用每份都去测试
所有的数据,都去训练,所有的数据都去测试
“交叉验证法”(cross validation)先将数据集D划分为k个大小相同(或相似)的、互不相交的子集,每个子集称为一个”折叠”(fold),每次训练,轮流使用其中的一个作为测试集、其它作为训练集. 这样,就相当于获得了k组训练集、测试集,最终的预测结果为k个测试结果的平均值.
![](/images/ml/cross_validation.png)
交叉验证实现
sklearn中,提供了cross_val_score函数来实现交叉验证并返回评估指标值:
1 | import sklearn.model_selection as ms |
拿到鸢尾花数据集,想要去做分类预测,用逻辑回归先用交叉验证,验证一下当前模型是否可用,再去进行训练。朴素贝叶斯模型的交叉验证实现:
1 | # 交叉验证示例 |
执行结果:
1 | precision: 0.996822033898305 |
模型优化
验证曲线与学习曲线
验证曲线
验证曲线是指根据不同的评估系数,来评估模型的优劣。 构建随机森林,树的数量不同,模型预测准确度不同。验证曲线示例:
1 | import numpy as np |
执行结果:
![](/images/ml/validation_curve.png)
学习曲线
学习曲线是用来评估不同大小的训练集下模型的优劣程度,如果预测结果随着训练集样本的增加而变化不大,那么增加样本数量不会对模型产生明显优化作用. 以下是一个学习曲线的示例:
1 | # 学习曲线示例 |
执行结果:
![](/images/ml/learn_curve.png)
超参数优化
超参数定义
超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。超参数的设置主要依赖于经验、实验或经过比较的优选值。以下是一些模型中常见的超参数:
- 决策树模型树的最大深度;
- 随机森林模型树的数量;
- 交叉验证中折叠的额数量;
- 训练集/测试集的比例等等.
超参数选择主要有随机搜索、网格搜索等方法。
网格搜索
网格搜索指将主要参数以及这些参数的主要取值,通过穷举法产生不同组合,计算并比较预测结果,来寻找这些参数的最优组合。
以下是利用网格搜索法,寻找SVM的最优超参数的示例:
1 | # 网格搜索示例 |
打印输出:
1 | best_score_: 0.95 |
执行结果可视化:
![](/images/ml/grid_search.png)
随机搜索
随机搜索的思想与网格搜索比较相似,只是不再测试上界和下界之间的所有值,而是在搜索范围中随机选取样本点。它的理论依据是,如果样本点集足够大,那么通过随机采样也能大概率地找到全局最优值,或其近似值。随机搜索一般会比网格搜索要快一些,但是和网格搜索的快速版一样,它的结果没法保证。