为什么要使用分层交叉验证?为什么这不损害与差异相关的利益?


29

有人告诉我使用分层交叉验证是有益的,尤其是在响应类不平衡时。如果交叉验证的一个目的是帮助解释我们原始训练数据样本的随机性,那么除非您确定原始训练集具有代表性的阶级分布,否则确保使每一折具有相同的类别分布将不利于此。

我的逻辑有缺陷吗?

编辑 我对这种方法是否会损害简历的价值很感兴趣。我可以理解为什么如果您的样本量很小/类别非常不平衡/两者都有,那么为了避免没有一个代表次要类别的代表,为什么有必要这样做。

本文苹果对苹果在交叉验证研究:陷阱在分类绩效考核提出了分层的情况很好,但所有的论据似乎量“分层提供了保障和更多的一致性”,但没有安全保障就需要给予足够的数据。

答案仅仅是“由于缺乏足够的数据,我们出于必要而使用它”。

Answers:


18

Bootstrapping试图模拟从总体中抽取新样本的效果,而不是试图确保不同的测试集(从N个采样中替换掉N个采样后的N个残差)。

RxK-fold交叉验证可确保K个不同的测试折叠,但随后对不同的随机分区重复R次,以使K-CV的独立性假设成立,但这会因重复而丢失。

分层交叉验证违反了原则,即在计算统计量之前不应该查看测试标签,但这通常被认为是无害的,因为唯一的作用是平衡折痕,但确实会导致多样性丧失(不必要的方差损失)。它与Boostrap的想法相去甚远,后者的想法是构建一个样本,该样本类似于您从整个人群中自然抽取的样本。可以说,分层很重要的主要原因是要解决分类算法中的缺陷,因为它们很容易因类的过高或过低表示而产生偏差。使用平衡技术(通过选择或加权)或优化机会校正度量(Kappa或最好是Informedness)的算法受此影响较小,尽管即使这样的算法也可以

强制每个折叠至少具有m个每个类的实例(对于一些m个实例)是分层的替代方法,该方法适用于Bootstrapping和CV。它确实具有平滑度偏差,使折痕往往比预期的要平衡得多。

重新整合和多样性:如果将在训练折叠中学习到的分类器用于融合,而不仅仅是对泛化误差的估计,则与Bootstrap,强制性Bootstrap相比,CV刚性增加,分层的Bootstrap和分层的CV会导致多样性丧失和潜在的弹性。和强制简历。


请提供一些参考文件,说明在强制引导“更好”的情况下分层引导“失败”的程度如何?
usεr11852恢复单胞菌说,

16

也许您可以这样想。假设您有一个数据集,其中有100个样本,“ A”类为90个,“ B”类为10个。在这种非常不平衡的设计中,如果您进行正常的随机分组,则最终可能会使用“ B”类中的极少数(甚至没有!)来构建模型。如果您要建立一个训练有素的模型,而该模型的数据很少,甚至没有,那么您如何期望它有效地预测稀有群体呢?分层交叉验证可实现随机化,但也可确保这些不平衡数据集同时具有这两个类别。

为了消除对将分层CV与更多“平衡”数据集一起使用的担忧,让我们看一个使用R代码的示例。

require(mlbench)
require(caret)
require(cvTools)

# using the Sonar dataset (208 samples)
data(Sonar)

# see the distribution of classes are very well balanced
prop.table(table(Sonar$Class))

> prop.table(table(Sonar$Class))

M         R 
0.5336538 0.4663462 

# stratified
# set seed for consistency
# caret::createFolds does stratified folds by default
set.seed(123)
strat <- createFolds(Sonar$Class, k=10)

# non-stratified using cvTools
set.seed(123)
folds <- cvFolds(nrow(Sonar), K=10, type="random")
df <- data.frame(fold = folds$which, index = folds$subsets)
non_strat <- lapply(split(df, df$fold), FUN=function(x) x$index)

# calculate the average class distribution of the folds
strat_dist <- colMeans(do.call("rbind", lapply(strat, FUN = function(x) prop.table(table(Sonar$Class[x])))))
    non_strat_dist <- colMeans(do.call("rbind", lapply(non_strat, FUN = function(x) prop.table(table(Sonar$Class[x])))))
strat_dist
> strat_dist
M         R 
0.5338312 0.4661688 
non_strat_dist
> non_strat_dist
M         R 
0.5328571 0.4671429 

如您所见,在平衡良好的数据集中,褶皱的随机机会具有相似的分布。因此,在这种情况下,分层简历只是一种保证措施。但是,要解决差异,您需要查看每个折的分布。在某些情况下(甚至从50-50开始),您可能会遇到随机折叠30-70的折叠(您可以运行上面的代码,看看这实际上是怎么回事!)。这可能会导致性能更差的模型,因为它没有足够的一类准确地预测它,从而增加了总体CV方差。当您拥有“有限”样本时,分布更有极端的差异,这显然更为重要。

现在有了非常大的数据集,分层可能就没有必要了,因为褶皱足够大,以至于仍可能包含至少一部分“稀有”类。但是,如果您的样本不平衡,无论您个人拥有多少数据,实际上都不会造成计算上的损失,也没有真正的理由放弃分层。


是的,这很有意义。但是,这是一个非常特殊的情况,您正在这样做以解决数据不足的问题。如果您有10,000个样本,您会这样做吗?我的问题是,理想情况下,如果有足够的数据,这是一个好主意吗?
James Owers 2014年

1
@kungfujam,这取决于您数据的不平衡程度。即使拥有大量数据,您最终也可能得到很少的其他类(随机)。关于此有一些研究。尽管过时了,但科阿维报道stratifcation is generally a better scheme, both in terms of bias and variance, when compared to regular cross-validation。没有完美的采样方案,但是在不平衡的设计中,分层是一种很好的方法。
cdeterman 2014年

这次真是万分感谢。我刚刚找到了Kohavi纸。老但黄金。我可以看到,一般来说类的平衡不是很好,数据也很有限=>分层通常更好...但是,只要有合理的平衡,我觉得这似乎违反了!
James Owers 2014年

@kungfujam,您认为哪一部分违反了?k折叠是随机的,除非它们特别需要一定比例的不同组。您可以将其视为从每个组中随机创建的折叠,并将它们组合在一起形成一个总折叠,从而保留您所关注的随机性。给定合理的平衡度(例如60%-40%),无论有无分层,折痕都可能具有相似的比例(当然有些变化)。
cdeterman 2014年

1
我觉得这很关键。您最初的样本是“随机”。因此,我认为CV应该尝试解决这个问题,产生变化的重采样,并通过惩罚随输入数据变化而变化的模型,使您产生更健壮的变化模型。如果您限制折叠以匹配原始样本的比例,从某种意义上讲,我觉得您正在停止这样做。您可能会产生一个偏差较小的模型,但我认为它会有较高的方差。
James Owers 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.