在使用过采样或欠采样处理类别不均衡的数据后,如何正确的做交叉验证?

本文讨论了在处理类别不均衡数据时如何正确进行交叉验证。在医疗领域等存在类别不均衡问题的场景中,直接应用交叉验证可能导致模型偏向多数类。文章通过早产预测的例子,解释了过采样和欠采样对模型的影响,强调过采样应在交叉验证内部进行,以避免过拟合。推荐使用SMOTE方法并结合适当的交叉验证策略,确保模型的泛化性能。
摘要由CSDN通过智能技术生成
本文讲的是在使用过采样或欠采样处理类别不均衡的数据后,如何正确的做交叉验证?,

几个星期前我阅读了一篇交叉验证的技术文档(Cross Validation Done Wrong), 在交叉验证的过程中,我们希望能够了解到我们的模型的泛化性能,以及它是如何预测我们感兴趣的未知样本的。基于这个出发点,作者提出了很多好的观点(尤其是关于特征选择的)。我们的确经常在进行交叉验证之前进行特征选择,但是需要注意的是我们在特征选择的时候,不能将验证集的数据加入到特征选择这个环节中去。

但是,这篇文章并没有涉及到我们在实际应用经常出现的问题。例如,如何在不均衡的数据上合理的进行交叉验证。在医疗领域,我们所拥有的数据集一般只包含两种类别的数据, 正常 样本和 相关 样本。譬如说在癌症检查的应用我们可能只有很小一部分病人患上了癌症(相关样本)而其余的大部分样本都是健康的个体。就算不在医疗领域,这种情况也存在(甚至更多),比如欺诈识别,它们的数据集中的相关样本和正常样本的比例都有可能会是 1:100000。

手头的问题

因为分类器对数据中类别占比较大的数据比较敏感,而对占比较小的数据则没那么敏感,所以我们需要在交叉验证之前对不均衡数据进行预处理。所以如果我们不处理类别不均衡的数据,分类器的输出结果就会存在偏差,也就是在预测过程中大多数情况下都会给出偏向于某个类别的结果,这个类别是训练的时候占比较大的那个类别。这个问题并不是我的研究领域,但是自从我在做早产预测的工作的时候经常会遇到这种问题。早产是指短于 37 周的妊娠,大部分欧洲国家的早产率约占 6-7%,美国的早产率为 11%,因此我们可以看到数据是非常不均衡的。

我最近无意中发现两篇关于早产预测的文章,他们是使用 Electrohysterography (EHG)数据来做预测的。作者只使用了一个单独的 EHG 横截面数据(通过捕获子宫电活动获得)训练出来的模型就声称在预测早产的时候具备很高的精度( [2], 对比没有使用过采样时的 AUC = 0.52-0.60,他的模型的 AUC 可以达到 0.99 ).

这个结果给我们的感觉像是 过拟合和错误的交叉验证 所造成的,在我解释原因之前,让我们先来观看下面的数据:

Picture

这四张密度图表示的是他所用到的四个特征的在两个类别上的分布,这两个类别为正常分娩与早产(f = false,表示正常分娩,使用红色的线表示;t = true, 则表示为早产,用蓝色的线表示)。我们从图中可以看到这四个特征并没有很强的区分两个类别的能力。他所提取出来的特征在两个特征上的分布基本上就是重叠的。我们可以认为这是一个无用输入,无用输出的例子,而不是说这个模型缺少数据。

只要稍微思考一下该问题所在的领域,我们就会对 auc=0.99 这个结果提出质疑。因为区分正常分娩和早产没有一个很明确的区分。假设我们设置 37 周就为正常的分娩时间。 那么如果你在第 36 周后的第 6 天分娩,那么我们则标记为早产。反之,如果在 37 周后 1 天妊娠,我们则标记为在正常的妊娠期内。 很明显,这两种情况下区分早产和正常分娩是没有意义的,37 周只是一个惯例,因此,预测结果会大受影响并且对于分娩时间在 37 周左右的样本,结果会非常不精确。

这里可以下载到所使用的数据集。在这篇文章中我会重复的展示数据集中的一部分特点,并且展示我们在过采样的情况下该如何进行合适的交叉验证。希望我在这个问题上所提出的一些矫正方案能够在未来让我们避免再犯这样的错误。

数据集,特征,性能评估和交叉验证技术

数据集

我们使用的数据来自于卢布尔雅那医学中心大学妇产科,数据中涵盖了从1997 年到 2005 年斯洛维尼亚地区的妊娠记录。他包含了从正常怀孕的 EHG 截面数据。 这个数据是非常不均衡的,因为 300 个记录中只有 38 条才是早孕。 更加详细的信息可以在 [3] 中找到。简单来说,我们选择 EHG 截面的理由是因为 EHG 测量的是子宫的电活动图,而这个活动图在怀孕期间会不断的变化,直到导致子宫收缩分娩出孩子。因此,研究推断非侵入性情况下监测怀孕活动可以尽早的发现哪些孕妇会早产。

特征与分类器

在 Physionet 上,你可以找到所有关于该研究的原始数据,但是为了让下面的实验不那么复杂,我们用到的是作者提供的另外一份数据来进行分析,这份数据中包含的特征是从原始数据中筛选出来的,筛选的条件是根据特征与 EHG 活动之间的相关频率。我们有四个特征(EHG信号的均方根,中值频率,频率峰值和样本熵,这里 有关如何计算这些特征值的更多信息)。据收集数据集的研究人员所说,大部分有价值的信息都是来自于渠道 3,因此我将使用从渠道 3 预提取出来的特征。详细的数据集也在 github 可以找到。因为我们是要训练分类器分类器,所以我使用了一些常见的训练分类器的算法:逻辑回归、分类树、SVM 和随机森林。在博客中我不会做任何特征选择,而是将所有的数据都用来训练模型。

评测指标

在这里我们使用 召回率 , 真假率 和 AUC 作为评测指标,关于指标的含义可以查看 wikipedia

交叉验证

我决定使用 留一法 来做交叉验证。这种技术在使用数据集时或者当欠采样时不会有任何错误的余地。但是,当过采样时,情况又会有点不一样,所以让我们看下面的分析。

类别不均衡的数据

当我们遇到数据不均衡的时候,我们该如何做:

  • 忽略这个问题
  • 对占比较大的类别进行欠采样
  • 对占比较小的类别进行过采样

忽略这个问题

如果我们使用不均衡的数据来训练分类器,那么训练出来的分类器在预测数据的时候总会返回数据集中占比最大的数据所对应的类别作为结果。这样的分类器具备太大的偏差,下面是训练这样的分类器所对应的代码:

#leave one participant out cross-validation
results_lr <- rep(NA, nrow(data_to_use))
results_tree <- rep(NA, nrow(data_to_use))
results_svm <- rep(NA, nrow(data_to_use))
results_rf <- rep(NA, nrow(data_to_use))

for(index_subj  in 1:nrow(data_to_use))
{
  #remove subject to validate
  training_data <- data_to_use[-index_subj, ]
  training_data_formula <- training_data[, c("preterm", features)]

  #select features in the validation set
  validation_data <- data_to_use[index_subj, features]

  #logistic regression
  glm.fit <- glm(
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值