超参数调优 XGBClassifier

数据挖掘 xgboost 交叉验证 超参数调整
2022-01-19 21:25:12

我正在为一场比赛研究一个高度不平衡的数据集。

训练数据形状为:(166573, 14)

train['outcome'].value_counts()

0    159730 
1      6843

我正在使用 XGBClassifier 构建模型,我手动设置的唯一参数是scale_pos_weight : 23.34 (0 value counts / 1 value counts)

它在 AUC 指标下给出了大约 82%。

我想如果我对所有其他参数进行超调,我可以获得更高的准确性。

XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
       colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,
       max_depth=3, min_child_weight=1, missing=None, n_estimators=100,
       n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,
       reg_alpha=0, reg_lambda=1, scale_pos_weight=23.4, seed=None,
       silent=True, subsample=1)

我尝试了 GridSearchCV,但在我的本地机器上完成需要很长时间,而且我无法获得任何结果。

clf = XGBClassifier()
grid = GridSearchCV(clf,
                    params, n_jobs=-1,
                    scoring="roc_auc",
                    cv=3)

grid.fit(X_train, y_train)
print("Best: %f using %s" % (grid.best_score_, grid.best_params_))

考虑到高度不平衡的数据集以及如何运行它,我应该针对哪些其他参数进行调整,以便我实际上可以得到一些结果?

2个回答

1)如果通常比网格更好,则随机搜索 https://www.analyticsindiamag.com/why-is-random-search-better-than-grid-search-for-machine-learning/ 尝试:

#clf = RandomizedSearchCV(clf ,param_distributions = params, cv=kfold, scoring="accuracy", n_jobs= 10, verbose = 1)

2)对于不平衡的数据集:

  • 重采样:欠采样或过采样
  • 创建新数据点

https://towardsdatascience.com/methods-for-dealing-with-imbalanced-data-5b761be45a18

我认为您在这里解决了两个不同的问题:

  1. 不平衡数据集
  2. XGBoost 的超参数优化

处理不平衡数据集的技术有很多,其中一种可能是为您的小班添加更高的权重,或者另一种方法可能是重新采样您的数据,为小班提供更多机会。

对于 XGBoost,我建议固定学习率,使早期停止的树数达到 300 左右,然后首先处理树数和最小子权重,这些是最重要的参数。