使用 Scikit-Learn API 时如何调整 XGBoost 分类器中的概率阈值

劉金喜*_*劉金喜 9 python-3.x scikit-learn xgboost

我有一个关于带有 sklearn API 的 xgboost 分类器的问题。似乎它有一个参数来告诉应该返回多少概率为 True,但我找不到它。

通常,xgb.predict将返回布尔值并xgb.predict_proba返回区间 [0,1] 内的概率。我认为结果是相关的。应该有一个概率阈值来决定样本的类别。

dtrain, dtest = train_test_split(data, test_size=0.1, random_state=22)

param_dict={'base_score': 0.5,
 'booster': 'gbtree',
 'colsample_bylevel': 1,
 'colsample_bytree': 1,
 'gamma': 0,
 'learning_rate': 0.1,
 'max_delta_step': 0,
 'max_depth': 4,
 'min_child_weight': 6,
 'missing': None,
 'n_estimators': 1000,
 'objective': 'binary:logistic',
 'reg_alpha': 0,
 'reg_lambda': 1,
 'scale_pos_weight': 1,
 'subsample': 1}

xgb = XGBClassifier(**param_dict,n_jobs=2)

xgb.fit(dtrain[features], dtrain['target'])

result_boolean = xgb.predict(dtest[features])
print(np.sum(result_boolean))
Output:936

result_proba = xgb.predict_proba(dtest[features])
result_boolean2= (result_proba[:,1] > 0.5) 
print(np.sum(result_boolean2))
Output:936
Run Code Online (Sandbox Code Playgroud)

看起来默认概率阈值为 0.5,因此结果数组具有相同数量的 True。但是我在代码中找不到调整它的位置。 predict(data, output_margin=False, ntree_limit=None, validate_features=True)另外,我已经测试过base_score,但它并没有影响结果。

我想改变概率阈值的主要原因是我想XGBClassifier通过GridSearchCV方法用不同的概率阈值进行测试。xgb.predict_proba好像不能合并到GridSearchCV. 如何改变概率阈值XGBClassifier

jon*_*nor 2

当您使用ROC AUC(ROC=接收者操作特征,AUC=曲线下面积)作为评分函数时,网格搜索将使用predict_proba()完成。所选的分类器超参数将是在所有可能的决策阈值上具有最佳整体性能的分类器超参数。

GridSearchCV(scoring='roc_auc', ....)

然后,您可以绘制 ROC 曲线,以确定决策阈值,从而实现精确率与召回率/真阳性与假阴性之间的所需平衡。

在此输入图像描述

有关 ROC 的 scikit-learn 文档中的更多信息

  • 是我还是这没有回答问题? (6认同)
  • 谢谢。我认为 ROC-AUC 对于我的情况很有用。但是是否可以更改 XGBClassifier 的决策阈值,这样我就不需要使用“predict_proba”然后自己设置决策阈值? (4认同)