【问题标题】:XgBoost Script is not outputing binary properlyXgBoost 脚本未正确输出二进制文件
【发布时间】:2016-06-20 00:17:23
【问题描述】:

我正在学习使用xgboost,并且我已经阅读了文档! 但是,我不明白为什么我的脚本输出在0~~2 之间。 首先,我认为它应该是 0 或 1,因为它是 binary 分类,但后来,我读到它的概率是 0 或 1,但是,一些输出是 1.5+(至少在 CSV ),这对我来说没有意义!

我不确定问题出在 xgboost 参数上还是在 csv 创建中! 这条线,np.expm1(preds),我不确定它应该是np.expm1,但我不知道我可以改变它!

总之,我的问题是:

为什么输出不是 0 或 1,而是 0.0xxx 和 1.xxx?

这是我的脚本:

import numpy as np
import xgboost as xgb
import pandas as pd

train = pd.read_csv('../dataset/train.csv')
train = train.drop('ID', axis=1)

y = train['TARGET']

train = train.drop('TARGET', axis=1)
x = train

dtrain = xgb.DMatrix(x.as_matrix(), label=y.tolist())

test = pd.read_csv('../dataset/test.csv')

test = test.drop('ID', axis=1)
dtest = xgb.DMatrix(test.as_matrix())


# XGBoost params:
def get_params():
    #
    params = {}
    params["objective"] = "binary:logistic"
    params["booster"] = "gbtree"
    params["eval_metric"] = "auc"
    params["eta"] = 0.3  #
    params["subsample"] = 0.50
    params["colsample_bytree"] = 1.0
    params["max_depth"] = 20
    params["nthread"] = 4
    plst = list(params.items())
    #
    return plst


bst = xgb.train(get_params(), dtrain, 1000)

preds = bst.predict(dtest)

print np.max(preds)
print np.min(preds)
print np.average(preds)

# Make Submission
test_aux = pd.read_csv('../dataset/test.csv')
result = pd.DataFrame({"Id": test_aux["ID"], 'TARGET': np.expm1(preds)})

result.to_csv("xgboost_submission.csv", index=False)

【问题讨论】:

    标签: python machine-learning xgboost


    【解决方案1】:

    你只需要这样做:

    from xgboost import XGBClassifier
    

    调用predict,输出为0或1,如果调用predict_proba,输出为类的概率。

    对不起我的英语。

    【讨论】:

      【解决方案2】:

      当您以目标 binary:logistic 运行 xgb 模型时,您将获得每个样本的概率数组。这些概率是样本属于i 类的机会。

      假设您有 3 个课程 [A, B, C]。样本 y 的输出(如 [0.2, 0.6, 0.4])表明该样本可能属于 B 类。

      如果您只想要更可能的类,请获取此类概率数组中最大元素的索引,例如使用numpy 函数argmax

      您可以在xgb 包参数的documentation 找到更多信息。

      【讨论】:

      • 喜欢这个?结果 = pd.DataFrame({"Id": test_aux["ID"], 'TARGET': np.argmax(preds)})
      • 注意 np.argmax 可以采用 axis 参数。如果您不想进行标签预测,请尝试使用 np.argmax(preds, axis=1)
      • 它没用,axis=1 因为只有 1 个轴,当它的axis=0 时,它只是用 66390 填充所有内容
      • preds 变量的形状是什么?
      • 你能给我们一个你的preds数组的样本吗?
      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2019-06-18
      相关资源
      最近更新 更多