在处理不平衡数据集问题(7%对93%)时,我想使用网格搜索交叉验证找出xgboost模型的最佳结构注意:我使用分层k折叠交叉验证来确保每个折叠都有正确的少数类比例
我的情况如下,我注意到GridSearchCV有一个名为"评分"的参数,我可以通过不止一个sklearn.metrics,如下所示。然而,xgboost还有一个名为"eval_metric"的参数,我对这两者有点混淆。你能解释一下有什么不同吗?指定它的正确位置在哪里?
我将附上一点代码来说明它:
params_grid = {
'n_estimators': [100, 300],
'learning_rate': [0.01, 0.1, 0.3],
'colsample_bytree': [0.3, 0.5],
}
params_fixed = {
'objective':'binary:logistic',
'silent':1,
'eval_metric':'auc'
}
n_folds = 5
skf = StratifiedKFold(n_splits=n_folds,random_state=seed,shuffle=True)
# create xgboost classifier
xgb = XGBClassifier(**params_fixed, seed=seed)
grid_search = GridSearchCV(estimator=xgb, param_grid=params_grid,
cv=skf.split(X_train, y_train), scoring='balanced_accuracy')
此外,在我的情况下,你会推荐使用哪个功能?它可以来自skearn.metrics,甚至是自定义的,但我还不知道如何编写。注意,我的问题是回忆和精度之间的权衡问题,但回忆对我来说是最重要的,因为我想在99%的情况下检测少数类。
将我的评论转化为答案,没有任何绕过,一切仍然有效,但这没有意义。每个算法都会最大化你告诉它的度量,所以在你的例子中,xgboost会构建树来最大化auc,网格搜索会找到最大化精度的超参数。这显然毫无意义。
因此,你应该将两个指标设置为相同的,无论是AUC、召回率还是你认为适合你的问题的任何指标;对于不平衡的数据集,AUC是一个很好的选择,或者你可以选择在回忆方面更平衡的F分数。