使用XGBoost进行超参数网格搜索-评分函数与评估指标

3
处理不平衡数据集问题(7% vs 93%),我想使用网格搜索交叉验证来找出最佳的xgboost模型结构。 注意:我使用分层k折交叉验证来确保每个折叠具有少数类的正确比例。 我的情况如下,我注意到GridSearchCV有一个名为“scoring”的参数,我可以将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%的情况下检测到少数类别。
1个回答

1
将我的评论转换为答案,没有任何绕过方式,一切仍然有效,但它只是毫无意义。每个算法都会最大化您告诉它的度量标准,在您的示例中,xgboost将构建树以最大化auc,并且网格搜索将找到最大化准确性的超参数。这显然毫无意义。
因此,您应该将两个度量标准设置为相同的度量标准,无论是AUC、召回率还是您认为适合您问题的任何度量标准;对于不平衡的数据集,AUC是一个很好的选择,或者您可以选择更加平衡向召回率倾斜的F分数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接