XgBoost 脚本未正确输出二进制文件
XgBoost Script is not outputing binary properly
我正在学习使用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)
当您 运行 具有 objective binary:logistic
的 xgb
模型时,您会得到每个样本的概率数组。这些概率是样本属于 class i
.
的机会
假设您有 3 classes [A, B, C]
。样本 y
的输出如 [0.2, 0.6, 0.4]
表明该样本可能属于 class B.
如果您只想要更可能的 class,请使用此类概率数组中最大元素的索引,例如使用 numpy
函数 argmax.
您可以在 xgb
包参数的 documentation 中找到更多信息。
您只需要这样做:
from xgboost import XGBClassifier
调用predict,输出将是0或1,如果调用predict_proba,输出将是概率类.
对不起我的英语。
我正在学习使用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)
当您 运行 具有 objective binary:logistic
的 xgb
模型时,您会得到每个样本的概率数组。这些概率是样本属于 class i
.
假设您有 3 classes [A, B, C]
。样本 y
的输出如 [0.2, 0.6, 0.4]
表明该样本可能属于 class B.
如果您只想要更可能的 class,请使用此类概率数组中最大元素的索引,例如使用 numpy
函数 argmax.
您可以在 xgb
包参数的 documentation 中找到更多信息。
您只需要这样做:
from xgboost import XGBClassifier
调用predict,输出将是0或1,如果调用predict_proba,输出将是概率类.
对不起我的英语。