[toc]
2.1 经验误差和过拟合
-
错误率(error rate) = 样本分类错误个数a/ 样本总数b
-
精度(accuracy)= 1 - 错误率
-
训练误差(training error): 训练集上的误差。 也叫经验误差(empirical error)
-
在新样本上的误差称为 泛化误差(generalization error)
-
过拟合(overfitting): 把训练样本的所有特点当作必要条件。 例如训练集中的树叶都有锯齿, 于是看到不带锯齿的树叶,它就认为一定不是树叶。
-
欠拟合(underfitting) : 训练样本的一般性质尚未学好
过拟合无法避免,因为我们无法解决NP=P问题
训练集和测试集的划分(评估方法)
即如何把手头的数据集划分成训练集和测试集, 测试集用来评估泛化误差。
留出法
把数据集划分为2个互斥的集合
结果的比例(例如好瓜坏瓜),在2个集中应该一样
使用留出法时,一般要采用若干次随机划分, 重复进行实验评估后,取随机值作为评估结果。
例如进行100次随机二分, 得到100个评估结果,这个平均值才是实际评估值。
缺点:
训练集和测试集 因为分成2块了,可能导致集合之间差别非常大。而我们还无法控制
交叉验证法(cross validation)
把数据分成m份
每次取1份作为测试集, 其他m-1份都是训练集,做训练
同样操作进行m次,每次取1份不同的作为测试集。
最后对结果求平均
也叫k折交叉验证
留一法:
数据正好只有m个,于是每一份只有1个。 因为测试集很小, 训练集很大, 所以留一法会比较准确。
缺点: 开销太大, 如果一百万个样本, 留一法的训练时间指数级增加。
自助法
每次从m个样本中随机取1个样本,复制1份之后,放入训练集中。 进行m次。
m如果足够大, 求极限之后, (1-1/m)^m的极限概率为36.8%
大概1/3的数据会被选为训练集。
那么剩下的就是测试集。
好处是训练集和测试机存在共有数据
如果数据量比较小, 可以使用自助法,避免数据太少没法分。
最终模型
当使用数据集D 划分训练和测试, 进行各种训练后, 得到模型时, 还不是最终模型。
我们需要最后用D再做1次训练, 这时候才是我们准备提交给用户的最终模型。
2.2 性能度量
回归任务中, 最常用的性能度量, 就是均方误差
如果是数据分布,则是求积分。
错误率
分类错误的总概率
精度
分类正确的总概率
查准率、查重率
二分类问题,有
真正例TP true positive(预测是好瓜,实际也是好瓜)
假正例FP false positive(预测是好瓜,实际时坏瓜)
真反例TN true negative(预测是坏瓜,实际也是坏瓜)
假反例FN false negative
查准率P= TP/ (TP+FP)
即等于我选出的好瓜准不准
查全率R=TP/(TP+FN)
即等于我选出的所有瓜中,好瓜多不多
二者并不平衡,比如为了好瓜多,就会加大数量,这样可能造成查准率低。
P-R曲线:
查全率为横坐标,查冲率为纵坐标
按照好瓜概率,把样本排序
则第一个好瓜必定查准率100%。
接着慢慢按我预测的概率顺序放入瓜
慢慢查准率会下降,而查全率会上升。
如果1个P-R曲线完全包住另一个曲线, 则前者是好的模型。
BEP:P-R曲线平衡点:
查全率=查冲率时的值
越高越好
F1度量:
F1 = 2* P * R / (P + R)
带查准或者查重偏好的
b = 查全率重要性/查准率重要性
Fb = (1+b^2)* P * R/(b^2 * P) + R
b<1, 则查准率更中鞥要
如果是经过多次训练得到的模型, 则可以把TP、FN之类的都取平均,再去计算 micro-P \micro-R还有micro-F1
ROC曲线
学习器会给每个样本划定一个概率
在我们规定了正例的概率阈值时, 才能把每个样本是否是正例给预测出来。
而这个阈值(截断点)是通过人工来设置的。
如果这个阈值舍得很高(即0.9以上才是正例),则被预测准确的正例就会很少, 而预测准确的反例就会变多
预测准确的正例概率,叫做TPR曲线(True postive rate), 即全部真实正例中,被我预测准的正例。 作为纵轴
预测错误的正例概率,叫做FPR曲线(false postive rate),即明明是反例,被我当作正例了。作为横轴
假设学习器给每个样本都做了概率预测。
那么接着我们就要划定阈值。
阈值从样本中选取。样本按照概率从大到小排列。
假设概率最高的样本是0.99
则认为0.99以上的才是正例,0.99以下的是反例。
那么我们很大概率TRP会很小(即很少能有正例能中), 而FPR也很小(即很少有正例会被误判)
接着逐步减小阈值,慢慢就得到一个ROC曲线。
ROC包围的面积AUC越大,则我们认为这个学习器越好(即对与我们标定的概率,他能综合表现最佳)。
代价敏感错误率和代价曲线
判别错误的代价有所不同
如果把好的判别成坏的, 代价为cost10
把坏的判别成好的,代价为cost01
大部分情况下,把坏的判别成好的,都是很严重的。代价会高一点
- 代价敏感错误率:
把样本中判别错误的情况出现的概率分别乘上代价。
代价曲线:
把ROC曲线的每一点, 都得到该点(该阈值)对应的FPR和FNR, 分别以(正例概率代价为0, FPR) 和(正例概率为1, FNR) 画直线,然后得到一个被一堆直线包起来的下界。。。
2.3比较校验
当上头给我们的指标是要求 实际错误率是10%。
但我们只有测试样本,怎么去假设我们很接近实际错误率了呢?
即我们有1000个样本, 那么测试错误率至少为多少时,我们觉得实际错误率<10%才是可信的?
我们指定可接受误差α为0.05
使用二项检验临界值公式, 算出一个临界值
当测试样本小于临界值时, 在0.0.5的误差范围内,可以假设学习器的实际错误率不会大于10%
如果大于临界值,则认为这个假设大概率不成立。
实际上会做多次训练测试, 最终得到的概率分布服从t分布。
t分布概念:
交叉验证t检验
怎么使用假设检验, 确认2个不同的学习器之间的性能是否一致?
把2个学习器做k折交叉验证的差值, 分别求个平均和方差, 然后判断某个计算式是否小于临界值txx。。
为了避免不同轮次的训练,会有一定程度重叠,采用
5x2交叉验证, 每次2折交叉验证之前,把数据打乱, 是的5次交叉验证中的数据划分不重复。。 从而得到的差值是包含了第一折和第二折的。
这时候在t分布的假设下做检验。
McNemar检验
二分类问题中, 通过“A算法错误,B算法正确”和“A算法正确 ,B算法错误” 这2个集合之间的差值, 判断是否服从某分布, 来假设A算法和B算法的性能是否相同
Friedman检验
如果数据集有很多组(前面的检验都是针对一组数据集的),则怎么利用这么多组数据集,来验证A\B\C算法的性能呢?
把每个数据集的ABC训练结果排序
D1数据集中, A排第1, B排第2,C排第3
D2数据集中, B排第1, A排第2.5,C排第2.5(排名相等的话就平分这个排名,5/2=2.5)
…
然后可以得到每个算法的平均序值。
使用Frieddman公式来判断性能是否一致。
如果Friedman公式判断 所有算法的性能不一致, 则使用Nemenyi做后续检验。
Nemenyi可以判断2个算法之间的性能是否一致
偏差和方差
偏差——方差分解, 解释学习算法性能的重要工具。
偏差(bias)指 预测输出与真实标记的差别
度量了学习算法的期望预测与真实结果的偏离程度。刻画了算法本身的拟合能力
方差就是 一堆预测输出数据的方差。
方差度量了同样大小的训练集的变动所导致的性能变化。刻画了数据扰动所造成的影响。
噪声是 真实标记自身的方差(为了区分,叫做噪声)
表达了当前任务上,任何学习算法所能达到的最好期望误差(即实际的都有这么多误差),刻画了学习问题本身的难度。
泛化误差分解 偏差、方差、噪声之和。
偏差和方差之间是由冲突的。
训练不足时,学习器的拟合能力不强,扰动不足, 则主要是偏差比较大。
随着训练变多,偏差变小, 而方差之间就体现出来了。
如果训练数据全部被学习器拟合(偏差为0), 则为过拟合。