我一直在尝试使用 R 中的 caret 包使用多元逻辑回归构建二元分类模型。我的数据集包含大约 20000 个观察值,其中 >99% 属于 X 类,只有 <1% 属于 Y 类,并且因此它是一个不平衡的数据集。
根据 Max Kuhn 和 Kjell Johnson 的书(Applied Predictive Modeling,Springer 2013),可以通过在训练模型之前对多数类进行下采样或对数据集的少数类进行上采样来管理类不平衡。我决定使用相同的训练数据集测试这两种解决方案来比较结果。
下采样数据集由 822 个观测值(每类 411 个)组成,上采样数据集由 45272 个观测值(每类 22636 个)组成。两个数据集现在都是“平衡的”,但我不确定选择哪种方法。下面我向您展示模型在训练数据集中的表现(10 倍 CV 重复 5 次)。
在灵敏度和特异性方面,两个选项(上采样和下采样)都给了我相似的结果,尽管下采样情况下参数的标准偏差要大 10 倍:
上采样结果:
ROC
0.7711678
Sens
0.7011926
Spec
0.697951
ROC SD
0.005977932
Sens SD
0.00834598
Spec SD
0.009579698
下采样结果:
ROC
0.7781663
Sens
0.7212311
Spec
0.4199943
ROC SD
0.0445779
Sens SD
0.06813285
Spec SD
0.0724861
然而,就预测变量的重要性而言,对于下采样的情况,只有四个预测变量是显着的:
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -6.561091 1.507289 -4.353 1.34e-05 ***
sexFemale -0.002311 0.217136 -0.011 0.992
age 0.044491 0.006457 6.890 5.57e-12 ***
smokingSi 0.004606 0.234458 0.020 0.984
drinkingSi 0.017497 0.185291 0.094 0.925
diabHistSi 0.732457 0.163528 4.479 7.50e-06 ***
htDXSi 0.010499 0.222508 0.047 0.962
height -0.007022 0.007923 -0.886 0.375
waist 0.022091 0.005598 3.947 7.93e-05 ***
aveSP 0.024395 0.005420 4.501 6.77e-06 ***
相比之下,对于上采样案例,所有预测变量都很显着:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -6.0755790 0.2305014 -26.358 < 2e-16 ***
sexFemale -0.1409143 0.0302186 -4.663 3.11e-06 ***
age 0.0304018 0.0008032 37.849 < 2e-16 ***
smokingSi -0.0691276 0.0309232 -2.235 0.02539 *
drinkingSi 0.0538318 0.0243686 2.209 0.02717 *
diabHistSi 0.6493554 0.0214752 30.238 < 2e-16 ***
htDXSi -0.0809236 0.0281700 -2.873 0.00407 **
height -0.0105632 0.0012510 -8.444 < 2e-16 ***
waist 0.0312969 0.0008087 38.699 < 2e-16 ***
aveSP 0.0237232 0.0006948 34.146 < 2e-16 ***
你觉得哪一个更好?一方面,对数据集进行下采样,我忽略了属于多数类的近 20000 个观察值。另一方面,当我对少数类进行上采样时,我会多次复制相同的 400 个观察结果......
我知道我可以在 ROC 曲线中寻找不同的分类阈值,而不是使用下采样或上采样来管理原始不平衡数据集,但我已经尝试过了,但没有得到好的结果。
我也知道支持向量机等其他方法可以使用成本函数来识别少数类的情况,但我需要模型是可解释的和“用户友好的”。这就是我使用逻辑回归的原因。