XGBoost生成预测结果和概率。

16

我可能在文档中看漏了,但我想知道是否有一种方法可以在XGBoost中生成预测结果和概率?在我的情况下,我正在尝试预测一个多类分类器。如果我能返回"Medium - 88%"就太好了。

  • 分类器 = Medium
  • 预测概率 = 88%

参数

params = {
    'max_depth': 3,
    'objective': 'multi:softmax',  # error evaluation for multiclass training
    'num_class': 3,
    'n_gpus': 0
}

预测

pred = model.predict(D_test)
结果
array([2., 2., 1., ..., 1., 2., 2.], dtype=float32)

易于使用的(标签编码器)

pred_int = pred.astype(int)
label_encoder.inverse_transform(pred_int[:5])
array(['Medium', 'Medium', 'Low', 'Low', 'Medium'], dtype=object)

编辑: @Reveille建议使用predict_proba。我没有实例化XGBClassifer()。如果应该这样做,我该如何修改我的管道来使用它?

params = {
    'max_depth': 3,
    'objective': 'multi:softmax',  # error evaluation for multiclass training
    'num_class': 3,
    'n_gpus': 0
}

steps = 20  # The number of training iterations

model = xgb.train(params, D_train, steps)

您请求的结果不清楚;您的意思是“*中等 - 88%*”是什么? - desertnaut
@desertnaut 更新了我的问题。 - scarpacci
1个回答

21

你可以尝试 pred_p = model.predict_proba(D_test)

我有一个相关的例子(不过不是多分类):

import xgboost as xgb
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

X, y = make_moons(noise=0.3, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

xgb_clf = xgb.XGBClassifier()
xgb_clf = xgb_clf.fit(X_train, y_train)

print(xgb_clf.predict(X_test))
print(xgb_clf.predict_proba(X_test))


[1 1 1 0 1 0 1 0 0 1]
[[0.0394336  0.9605664 ]
 [0.03201818 0.9679818 ]
 [0.1275925  0.8724075 ]
 [0.94218    0.05782   ]
 [0.01464975 0.98535025]
 [0.966953   0.03304701]
 [0.01640552 0.9835945 ]
 [0.9297296  0.07027044]
 [0.9580196  0.0419804 ]
 [0.02849442 0.9715056 ]]

请注意,如@scarpacci在评论中所提到的(参考链接):

predict_proba()方法仅适用于Scikit-learn接口


我没有实例化XGBClassifier来使用它(也许我应该这样做?)。参数 = { 'max_depth': 3, 'objective': 'multi:softmax', # 多类别训练的错误评估 'num_class': 3, 'n_gpus': 0 }步骤=20 # 训练迭代次数模型=xgb.train(params, D_train, steps) - scarpacci
如果 predict 方法运行正常(从您的代码看来似乎是这样),那么 predict_proba 方法也应该如此。我能想到的唯一原因是您的情况是多类别的。这个 可能会有所帮助。 - Reveille
我明白了。你因为某些原因不想使用scikit-learn接口? - Reveille
1
我认为我将不得不修改它才能使用。我并不反对,只是我的管道建立方式不同。感谢您的帮助! - scarpacci
完美!谢谢。非常感激。 - scarpacci
非常愉快!我还将您分享的链接添加到答案中,以便更好地展示。 - Reveille

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