【发布时间】:2022-11-11 05:36:59
【问题描述】:
我正在使用 XGBoost 训练 BDT 对 22 个特征进行二进制分类。我有 1800 万个样本。 (60% 用于训练,40% 用于测试)
我在训练期间得到的 ROC AUC 不符合我得到的最终结果,我不明白这是怎么回事。此外,ROC AUC 显示出比任何其他指标都更多的过度训练,并且它似乎在测试数据上具有最大值。
有没有人遇到过类似的问题,或者知道我的模型有什么问题,或者我如何找出问题所在?
我的代码的本质:
params = {
"model_params": {
"n_estimators": 2000,
"max_depth": 4,
"learning_rate": 0.1,
"scale_pos_weight": 11.986832275943744,
"objective": "binary:logistic",
"tree_method": "hist"
},
"train_params": {
"eval_metric": [
"logloss",
"error",
"auc",
"aucpr",
"map"
]
}
}
model = xgb.XGBClassifier(**params["model_params"], use_label_encoder=False)
model.fit(X_train, y_train,
eval_set=[(X_train, y_train), (X_test, y_test)],
**params["train_params"])
train_history = model.evals_result()
...
plt.plot(iterations, train_history["validation_0"]["auc"], label="training data")
plt.plot(iterations, train_history["validation_1"]["auc"], label="test data")
...
y_pred_proba_train = model.predict_proba(X_train)
y_pred_proba_test = model.predict_proba(X_test)
fpr_test, tpr_test, _ = sklearn.metrics.roc_curve(y_test, y_pred_proba_test[:, 1])
fpr_train, tpr_train, _ = sklearn.metrics.roc_curve(y_train, y_pred_proba_train[:, 1])
auc_test = sklearn.metrics.auc(fpr_test, tpr_test)
auc_train = sklearn.metrics.auc(fpr_train, tpr_train)
...
plt.title(f"ROC curve, AUC=(test: {auc_test:.4f}, train: {auc_train:.4f})")
plt.plot(fpr_test, tpr_test, label="test data")
plt.plot(fpr_train, tpr_train, label="train data")
...
【问题讨论】:
-
scikit-learn默认采用macro average auc,我不确定xgboost是做什么的,但我怀疑它采用微观平均值。你的数据集不平衡吗?这可以解释它,特别是如果您的测试集没有分层。 -
我刚刚测试了这个。我手动使用
roc_curve+auc。这会产生与roc_auc_score和macro、weighted或None相同的结果。但是,roc_auc_score和micro对训练和测试数据产生的分数要低得多,为0.71。我不认为是这样,但有趣的观察!samples不知何故需要很长时间才能计算出来。 -
并回答您的问题:我的数据集与 12:1 不平衡(类别:0、1)我对
sklearn.model_selection.train_test_split进行了分层。 -
你是在集群上训练吗? XGBoost 平均每个节点的 auc。
-
是的,我正在一台具有多个 CPU 的服务器上进行培训。我不明白您的意思,您能否提供进一步阅读的链接或在答案中解释它?这听起来像是一个很有希望的解释。
标签: python machine-learning scikit-learn xgboost