如何评估具有不平衡数据二元分类的模型?

数据挖掘 机器学习 Python 阶级失衡
2022-02-28 20:17:16

具有 200 个组件的 PCA,然后是 TSNE以 2D 形式显示的特征我有一个二元分类问题。我使用精确召回曲线下的面积作为评估指标。我的数据的维度是 (211, 1361)。数据不平衡,因此我使用了各种采样技术来解决不平衡问题。我将数据分为训练集和测试集。

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state=RANDOM_STATE, stratify = y)

train set (147, 1361)
test set (64, 1361) 

我为此任务使用以下分类器:

RegressionModel    = LogisticRegression(random_state=RANDOM_STATE, penalty='l1')
RandomForrestModel = RandomForestClassifier(random_state=RANDOM_STATE)
ExtraTreesModel    = ExtraTreesClassifier(random_state=RANDOM_STATE)
AdaBoostModel      = AdaBoostClassifier(random_state=RANDOM_STATE)
SVM = SVC(random_state=RANDOM_STATE, probability=True)
mlp = MLPClassifier(random_state=RANDOM_STATE)
GradientBoostModel = GradientBoostingClassifier(random_state=RANDOM_STATE)

然后,我使用具有不同采样策略(随机过采样、随机下采样、SMOTE、ADASYN)的训练数据评估所有模型,并使用 k = 10 对 k 折交叉验证进行分层。我计算了测试分数的平均分数和标准差,以了解变化有多大我的预测超过 10 倍。重采样是在交叉验证内完成的

     RO_train    RO_test    RO_std     SMOTE_train  SMOTE_test  SMOTE_std   ADASYN_train ADASYN_test ADASYN_std RU_train    RU_test     RU_std

ADB 1.000000    0.922866    0.173459    1.000000    0.875644    0.226287    1.000000    0.899255    0.177378    1.000000    0.858810    0.168208
ET  1.000000    0.952778    0.116567    1.000000    0.940903    0.092280    1.000000    0.907361    0.159184    1.000000    0.904167    0.129441
GB  1.000000    0.898710    0.224462    1.000000    0.888294    0.139198    1.000000    0.921210    0.118537    1.000000    0.884722    0.157905
LR  1.000000    0.670480    0.322062    1.000000    0.653813    0.312906    1.000000    0.642494    0.303857    1.000000    0.556829    0.246005
RF  1.000000    0.858611    0.211937    1.000000    0.877778    0.148527    1.000000    0.939167    0.106592    1.000000    0.818889    0.159638
SVM 1.000000    0.652461    0.088840    1.000000    0.653519    0.088681    1.000000    0.653519    0.088681    0.266960    0.580982    0.011825
mlp 0.892356    0.676389    0.219603    0.873744    0.624167    0.227717    0.891931    0.702262    0.192916    0.787599    0.498948    0.240001

然后我根据上述简历结果计算了一些统计数据。

max std: LR 0.32206202775943316 Random Oversampling_test_std
min std: SVM 0.08884005857118661 Random Oversampling_test_std
max std: LR 0.3129063718366338 SMOTE_test_std
min std: SVM 0.0886812284028803 SMOTE_test_std
max std: LR 0.30385683057394436 ADASYN_test_std
min std: SVM 0.0886812284028803 ADASYN_test_std
max std: LR 0.2460049718614556 Random undersampling_test_std
min std: SVM 0.011825217886416502 Random undersampling_test_std

完成 cv 后,我在不属于 cv 的测试数据集上评估了我的模型。我没有对这些数据进行任何类型的重新采样。

Random Oversampling SMOTE   ADASYN  Random undersampling
ADB 0.810964    0.900719    0.974892    0.855232
ET  0.987879    0.898830    0.927410    0.988636
GB  0.809401    0.899905    0.902631    0.801022
LR  0.505468    0.585471    0.521210    0.679356
RF  0.971350    0.955276    0.979021    0.913223
SVM 0.628788    0.630200    0.630200    0.585938
mlp 0.773493    0.748242    0.670285    0.711538

这是测试数据的混淆矩阵:

    Random Oversampling       SMOTE              ADASYN        Random undersampling
ADB [[11, 0], [5, 48]]  [[11, 0], [5, 48]]  [[10, 1], [3, 50]]  [[10, 1], [7, 46]]
ET  [[9, 2], [0, 53]]   [[9, 2], [2, 51]]   [[9, 2], [1, 52]]   [[11, 0], [3, 50]]
GB  [[8, 3], [3, 50]]   [[8, 3], [2, 51]]   [[7, 4], [2, 51]]   [[11, 0], [6, 47]]
LR  [[10, 1], [7, 46]]  [[10, 1], [8, 45]]  [[10, 1], [7, 46]]  [[10, 1], [9, 44]]
RF  [[10, 1], [1, 52]]  [[9, 2], [1, 52]]   [[11, 0], [2, 51]]  [[11, 0], [3, 50]]
SVM [[0, 11], [0, 53]]  [[0, 11], [0, 53]]  [[0, 11], [0, 53]]  [[0, 11], [0, 53]]
mlp [[11, 0], [8, 45]]  [[8, 3], [4, 49]]   [[9, 2], [5, 48]]   [[11, 0], [15, 38]]

非集成分类器表现不佳,所以我决定使用集成方法。

我决定使用 [RF + ADASYN],因为它给出了 100% 的训练分数、93% 的交叉验证 AUPRC 和 97% 的最终看不见的数据。

当我在完整的 ADASYN 数据上训练 RF 并在看不见的测试集上对其进行测试时。它的表现相当糟糕。由于我的数据很少,我怀疑它可能是欠拟合的,但这只是一种预感。在这方面的任何建议都会有所帮助。

1个回答

你的方法很好。

如果您还没有看到例如如何使用不同的方法在 2D 中分布不同的类,我会建议对数据进行 EDA。您有低样本量问题,即数据中的 1150 个维度有 0 个信息。不管不同的算法如何处理高维数据,我建议删除大部分无信息维度。

我不知道您所说的“在 CV 中进行重采样”是什么意思。如果您解释得更多,也许我们可以讨论,但总的来说,如果您先生成重新采样的数据并简单地进行 CV,您将是安全的。一些重采样(如 SMOTE)适用于数据点的拓扑结构(只需在 n 维空间中的其他一些点之间放置一个点),在您的情况下,10-k CV 中的 211 个点意味着每折叠 20 个点。它可能不能很好地表示数据的几何形状。我建议先进行重新采样,以确保您的安全。

最后但并非最不重要的是 LOO(Leave-One-Out,在您的情况下只是 211 倍 CV)。在像你这样的情况下,我也会这样做。

最后,我有兴趣看到您的数据的 2D 投影。也许那时我们可以更深入地谈论它。