本篇参照周志华《机器学习》第2章编写
主要介绍了机器学习的基础知识。从学习器的性能出发,讲解了不同的评估方法(怎么样划分训练集和测试集来通过测试误差代替泛化误差来评估学习器的性能);然后讲解了性能度量方法(怎么样计算测试误差)。有了评估方法和性能度量方法,我们可以轻松比较不同学习器的性能。
2.1 经验误差与过拟合
学习器的预测结果和样本的实际值的差异叫做:误差(error)。分为以下几种
- 训练集上的误差叫做“训练误差(training error)”或者“经验误差(empirical error)”
- 测试集上的误差叫做“测试误差 (test error)”
- 所有新样本上的误差叫做“泛化误差(generalization error)”
我们显然想要得到泛化误差最小的学习器,应该从样本中学习到所有潜在样本的“普遍规律”,但是当学习器把训练用的样本学习的“太好的”时候,很可能把训练样本本身的特点当成所有样本普适的特点 这时候就会产生过拟合(overfitting)。
过拟合问题是当前机器学习主要面临的问题。
2.2 评估方法
现实问题中,我们想要一个泛化误差最小的学习器。但是由于泛化误差的定义来说,所有未见过的样本都应该用来算泛化误差,显然这个泛化误差是不可得的。所以我们用测试集的测试误差代替泛化误差来衡量一个学习器能力的好坏。最好的要求是测试集的样本最好不要在训练集中出现过。
这里举一个栗子来理解一哈。老师给你讲10个题目,现在要考察你对这个知识点的掌握情况,当然不能出这讲过的10个题目,因为你已经掌握了讲过的题目。这个时候最好的衡量你的方法就是选择其他的你没见过的题目,即上面提过的测试集。
但是,实际情况中,我们只有一个包含 m 个样本的数据集 D,所以就要采用合适的方法来划分训练集和测试集。
2.2.1 留出法
即把样本数据集 D 划分为两个互斥的集合,流出一个集合作为训练集S,另一个作为测试集 T。常见的划分方法是:大约 2/3--4/5 的样本作为训练,剩下的样本作为测试。有一个点需要注意,就是为了保持数据分布的一致性,避免由于数据分布引来额外的偏差,我们采取 “分层抽样”。由于划分存在随机性,所以留出法一般要多次随机划分,重复试验,最终取平均值。
2.2.2 交叉验证法
注意的是,一次“10折验证” 进行了10次的 训练/测试。
2.2.3 自助法
在前面的“留出法”和“交叉验证法”中,由于要拿一部分样本来做测试,所以实际评估的模型所使用的训练集比D小,这必然会引入一些因为训练样本规模不同而导致产生估计偏差。这个时候我们采用“自助法”。
基本思想是:给定数据集D,做可放回的随机取样,重复 m 次,这样就有一个包含 m 个样本的 D1。
可以看到,有大约 1/3 的样本没有出现在 D1中,于是我们用 D1作为训练集,用剩下的 D-D1 作为测试集。
自助法在数据集 D 较小,难以有效划分 测试集/训练集 时很有用。但是由于其随机抽样改变了初始数据集的分布,引入了估计偏差,所以在数据集足够多的时候,一般使用 留出法 和 交叉验证法。
2.2.4 调参
绝大多数学习算法都有参数(parameter)需要设定,不同参数直接导致了学习器性能的显著差别。而“调参”(parameter tuning)也是一步重要的工作。
机器学习中的“参数”分为两种,一种是算法的参数,称为“超参”;另外一种是模型的参数,比如神经网络中的神经元连接权重。前者一般在10个以内,而后者在大型模型中往往非常多。需要注意的是:我们所谓的调参是“调超参”。而模型的参数一般通过我们模型自身的限制条件迭代停止得到。
我们要知道,很多参数是在实数范围内取值的,所以配置出所有参数的所有取值情况是不可能的。一般常用的做法是,对每个参数设置变化范围和步长。比如[0,0.5],步长为0.1。即取值为5个。
最终需要注意的是,定好模型和调参之后,还要用初始的数据集D来重新训练一哈模型,即让最初划分的测试集也用来训练,增强训练效果。举一个栗子:考试之后,要把考试中的题目也都消化掉,即用测试集再训练一遍。
2.3 性能度量
性能度量(performance measure)是衡量学习器泛化能力的评价标准。在对比不同的学习器时,使用不同的性能度量标准往往会导致不同的评判结果。
2.3.1 一般的性能度量指标
在回归问题中,最常用的性能度量是“均方误差(mean squared error)”
下面介绍分类问题中度量指标的选择。
而在分类任务中,最常用的性能度量指标是 "错误率(error rate)" 和“精度(accuracy)”。二者加和为1。
2.3.2 查准率、查全率、F1
错误率和精度是常用的。考虑这样一个情景:在推荐系统中,我们只关心推送给用户的内容是不是用户感兴趣的(即查准率 precision),或者说用户感兴趣的东西我们推荐了多少(查全率 recall)。
看一下上图,可以发现 precision 代表预测正例中,预测准确的概率;recall 代表实际正例中,预测准确的概率。这里需要注意的是,实际正例= TP + FN
显而易见,precsion & recall 是一对矛盾的参数。如果想要尽量推荐用户喜欢的内容,那就推荐一些有把握的,这样的话就漏掉了一些用户感兴趣的内容,recall 就低了;反之同理。
而“P-R曲线”正是描述二者之间关系变化的曲线。根据学习器的预测结果对样例进行排序,调整判决的 threshold,得到不同的分类结果,对应不同的 P-R,最终根据不同的(P,R)来作图即可。
那如何根据 P-R曲线图来衡量学习器的性能好坏。极端情况下,如果一个学习器的 P-R 曲线完全包住另外一个的,则这个学习器的性能优于另外一个(对应相同的P有更好的R,相同的R有更好的P)。然而一般情况下,我们用“平衡点(Break Even Point)”来衡量,即 P=R 的点。显然图中 A 学习器的性能最好。 越靠近(1,1)点越好,查的又准又全。
P&R 指标会出现矛盾的情况,我们需要综合考量,最常见的方法就是 F-Measure,是 P&R的加权调和平均。
特别的,当β=1时,就是我们常用的 F1 度量,当 F1的值较高时,模型的性能越好。
常常我们会遇到多个二分类混淆矩阵,例如多次训练或者在多个数据集上面训练,此时需要估计全局的性能,有两种解决方法:宏观和微。简单理解,宏观就是说先计算每个混淆矩阵的 P-R,然后算出平均P和平均 R 再求 F1。微观则是求出平均 TP/FP/TN/FN,再求 F1。
2.3.3 ROC 和 AUC
学习器都是产生一系列预测实值或者概率,进行排序,然后根据不同的 cut point 来划分最终的预测结果。如果我们更加重视 precision 就可以把 cut point 选的靠前一些。因此这些预测的实值的排序就代表着学习器的泛化性能的好坏,而 ROC 曲线就是从这个角度出发,衡量学习器的性能。即 ROC 曲线偏重研究基于测试样本评估值的排序好坏。
总之,从另外一个角度来研究 学习器 的性能好坏。与 ROC 是不同的角度。
左上角(0,1)称为 perfect classfication点,即预测全部为True Positive。
性能比较,包住也是代表绝对优于。通常我们用曲线包围的面积AUC(Area Under ROC curve)来代表性能。
2.3.4 代价敏感错误率 与 代价曲线
上面的方法中,我们将学习器犯的错误同等对待。但实际上,将正确预测称为错误和将错误预测成为正确所付出的代价往往是天壤之别。以二分裂为例,我们引入了代价矩阵(cost matrix)。
在非均等代价的条件下,我们追求整体代价最小化。于是我们定义“代价敏感”错误率为:
在非均等代价下,ROC 曲线演化称为“代价曲线”。其中横轴是取值在[0,1] 之间的正例概率代价,式子中的 p 表示正例的概率;纵轴是取值为[0,1]的归一化代价。二者都是基于 ROC 曲线中的横轴 TPR 和纵轴 FPR 算出来的。
ROC曲线上的每一个点对应代价曲线的一条线段。所有线段围城的面积即为所有添加下学习器的期望总体代价。
2.4 比较检验
这一节是基于这几个点来说的:
- 测试集性能 != 泛化性能(可以代替但是不等于)
- 测试集性能与测试集的选取有关
- 机器学习的算法有随机性
所以这一节就说说,在两个学习器的测试性能有一个比较,但是不是绝对代表二者的泛化性能的比较。在多大的置信区间上,多高的概率上,一个优于另外一个。就是之前概率论那些 假设检验。这里不多说。