我正在研究一个具有不平衡类(10:1)的二元分类问题。由于对于二元分类,XGBoost 的目标函数是'binary:logistic',所以应该很好地校准概率。但是,我得到了一个非常令人费解的结果:
xgb_clf = xgb.XGBClassifier(n_estimators=1000,
learning_rate=0.01,
max_depth=3,
subsample=0.8,
colsample_bytree=1,
gamma=1,
objective='binary:logistic',
scale_pos_weight = 10)
y_score_xgb = cross_val_predict(estimator=xgb_clf, X=X, y=y, method='predict_proba', cv=5)
plot_calibration_curves(y_true=y, y_prob=y_score_xgb[:,1], n_bins=10)
这似乎是一条“不错的”(线性)可靠性曲线,但是斜率小于 45 度。
但是,如果我进行校准,生成的曲线看起来会更糟:
calibrated = CalibratedClassifierCV(xgb_clf, method='sigmoid', cv=5)
y_score_xgb_clb = cross_val_predict(estimator=calibrated, X=X, y=y, method='predict_proba', cv=5)
plot_calibration_curves(y_true=y, y_prob=y_score_xgb_clb[:,1], n_bins=10)
更奇怪的是,输出的概率现在限制在 ~0.75(我没有得到高于 0.75 的分数)。
我的方法有什么建议/缺陷吗?


