将数据集分层采样划分为k个大小相似的互斥子集,每次用k-1个子集的并集作为训练集,余下的子集作为测试集,最终返回k个测试结果的均值,k最常用的取值是10。
说明:D1,D2,D3……都是不同的子集,第一次测试
D
10
D_{10}
D10作为测试集,第二次测试
D
9
D_{9}
D9作为测试集……第10次测试
D
1
D_{1}
D1作为测试集,最终所有
测
试
结
果
1
测试结果_{1}
测试结果1~
测
试
结
果
10
测试结果_{10}
测试结果10取平均值作为测试误差。
与留出法类似,将数据集D划分为k个子集同样存在多种划分方式,为了减小因样本划分不同而引入的差别,k折交叉验证通常随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,例如常见的“10次10折交叉验证”。
交叉验证法的极限情况,当每一个子集只有一个元素的时候,就是留一法,留一法有以下特点:
以自助采样法为基础,对数据集D有放回采样m次得到训练集 , 用做测试集实际模型与预期模型都使用m个训练样本(m约占样本总数量的 1 3 \frac{1}{3} 31)
从初始数据集中产生多个不同的训练集,对集成学习有很大的好处
自助法在数据集较小、难以有效划分训练/测试集时很有用;由于改变了数据集分布可能引入估计偏差,在数据量足够时,留出法和交叉验证法更常用。
要评估模型的好坏光有评估方法还不行,还得确定评估指标。
将模型结果与真实情况进行比较,最常用的两个指标是准确率
和错误率
准确率:就是分对样本占测试样本总数的比例;
错误率:就是分错样本占测试样本总数的比例
真正:所有阳性中被分为正的比例
假正:所有阴性中被分为正的比例
可以通过积分来计算面积的大小!
关于性能比较有以下问题:
- 测试性能并不等于泛化性能
- 测试性能会随着测试集的变化而变化
- 很多机器学习算法本身有一定的随机性
所以,直接通过评估指标进行评价的做法是不可取的,因为我们获得的只是特定数据集上的表达效果,要想在数学上更加具有说服力,我们还需要进行假设检验。
假设检验为分类器的性能比较提供了重要依据,基于其结果我们可以推断出,若在测试集上观察到分类器A比B好,则A的泛化性能是否在统计意义上高于B,以及这个结论的把握有多大。
简单来说,分为以下步骤
成对双边t检验是在一个数据集上比较两个分类器的性能,而在很多时候,我们需要在一组数据集上比较多个分类器的性能,这就需要使用基于排序的Friedman 检验。
假定我们要在N个数据集上比较k个算法,首先使用留出法或者交叉验证法得到每个算法在每个数据集上的测试结果,然后在每个数据集上根据性能好坏排序,并赋序值1,2,…;若算法性能相同则平分序值,继而得到每个算法在所有数据集上的平均序值。
说明:上图在计算“卡方分布”
τ
χ
2
\tau_{\chi^2}
τχ2
N:数据集的数量
k:模型数量
然后计算F统计量
τ
F
\tau_F
τF
说明:根据N和k查表,然后和F统计量
τ
F
\tau_F
τF比较,如果
τ
F
<
常
用
临
界
值
\tau_F<常用临界值
τF<常用临界值,则认为比较的算法是相同的,否则认为算法是显著不同的,只有当认为算法是显著不同的情况下,才进行下一步的
N
e
m
e
n
y
i
检
验
Nemenyi检验
Nemenyi检验。
说明:计算CD值,
q
α
q_\alpha
qα通过算法数量查表得到(k,N已知)
说明:比较算法之间的平均序值之差和CD的大小,如果大于CD认为显著不同,小于CD认为没有显著差别。
说明:Friedman检验图可以直观的表示各算法之间性能的差别,只是一种直观的表示形式,并没有新的方法。