[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), 则为过拟合。