Python XGBoost predict_proba 返回非常高或低的概率

数据挖掘 机器学习 Python 分类 xgboost
2021-09-29 17:58:26

我使用 GridSearchCV 在 python 中使用 XGBoost 训练了我的数据,如下所示:

parameters = {'nthread':[6], 
              'objective':['binary:logistic'],
              'learning_rate': [0.01, 0.1],
              'max_depth': [5,8,13],
              'n_estimators': [200,500,1000,3000],
              'seed': [1337]}

xgb_model = xgb.XGBClassifier()

clf = GridSearchCV(xgb_model, parameters, n_jobs=-1, 
                   cv = StratifiedKFold(shuffle=True,n_splits=5), 
                   scoring='accuracy',
                   verbose=2, refit=True)

clf.fit(scaled_X_train.values, y_train)

在测试测试中,我得到了 0.9 的准确度,这是可以接受的。然而,当我预测概率时,predict_proba我看到概率大多分别位于 0 和 1 类的 0-0.1 和 0.9-1 范围之间。

由于我尝试根据模型获得分数,因此那些密集的概率并不是那么有用。

那么这种密集概率分布的主要原因是什么?这是坏事吗?以及如何改进我的工作流程以使概率获得更广泛的分数范围?

提前致谢!

2个回答

如果您追求的是经过良好校准的分数(也就是说,您的模型输出的分数在某种意义上可以解释为概率,至少根据您在训练集中经验观察到的情况),那么准确性不是优化的正确函数(我会争辩说,优化从来都不是一个好的功能,但我不会进入这个)。可以通过提供不一定反映数据集中观察到的经验概率的分数来优化准确性:例如:假设真实标签 = (1, 1, 0, 1) 并且您有两个分类器 (0.51, 0.51, 0.3, 0.51 ) 与 (0.9, 0.9, 0.1, 0.9)。假设阈值为 0.5,两者具有相同的准确度,但得分明显不同。

将您的目标切换到日志损失,只有当您提供经过良好校准/真实的潜在概率时才会优化。此外,如果您发现对数损失性能不令人满意,请查看概率校准(如 platt/isotonic/multiple width binning)。

是的,树不是获得概率的最佳方法,但它们非常擅长硬预测。

决策树概率估计是根据叶子的频率进行的自然计算,可以系统地向 0 和 1 倾斜,因为叶子基本上由一个类控制

这是算法的工作方式,概率偏向于每个预测的可能类别。

拉普拉斯估计、m 估计和集成能够克服由决策树的轴平行分裂引起的估计偏差,从而实现更平滑的估计