
我有一个二元分类问题。我使用精确召回曲线下的面积作为评估指标。我的数据的维度是 (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 并在看不见的测试集上对其进行测试时。它的表现相当糟糕。由于我的数据很少,我怀疑它可能是欠拟合的,但这只是一种预感。在这方面的任何建议都会有所帮助。