0

我在类标签为 0、1 和 2 的不平衡数据集上使用 xgboost 分类器,分别由 74%、20% 和 6% 的标签组成。在对训练集进行随机过采样并缩放训练集和测试集之后,我构建了 xgbclassifier:

model = xgb.XGBClassifier(n_estimators=15, max_depth=15, learning_rate=0.1, objective='multi:softmax',
                          num_class=3, subsample=0.9, use_label_encoder=False, eval_metric='mlogloss')
#cross validation
stratk = StratifiedKFold(n_splits=20)
results = cross_val_score(model, x_train, y_train, cv=stratk, scoring='balanced_accuracy')

model.fit(x_train,y_train, eval_metric='mlogloss', eval_set=[(x_train, y_train),(x_test, y_test)], verbose=False, early_stopping_rounds=10)

我在训练中的平衡精度非常高,但在测试集中的平衡精度很低:

mat_train = confusion_matrix(y_train, y_pred_train)
train_acc_class = mat_train.diagonal()/mat_train.sum(axis=1)
print('train accuracy by class', train_acc_class)
train accuracy by class [0.94514343 0.98288878 1.        ]

y_pred = model.predict(x_test)
test_acc = balanced_accuracy_score(y_test, y_pred)
print('balanced test accuracy', test_acc)
test accuracy by class [0.62679426 0.65697674 0.03448276]

这是我的模型使用 eval_metric= -mlogloss 的学习曲线。 测试集损失在 6 个 epoch 后停止下降

我知道我的模型过度拟合。但是,当我减小 n_estimators 和 max_depth 时,它只会降低训练精度,而不会提高测试精度。此外,即使在我对两个少数类进行过采样后,当类标签 = 2 时,测试准确率仍然很低。我应该怎么做才能提高测试准确性,尤其是在第 2 类中?

4

0 回答 0