【问题标题】:How to get Predictions with XGBoost and XGBoost using Scikit-Learn Wrapper to match?如何使用 Scikit-Learn Wrapper 获得 XGBoost 和 XGBoost 的预测以进行匹配?
【发布时间】:2020-03-28 03:18:41
【问题描述】:

我是 Python 中 XGBoost 的新手,所以如果这里的答案很明显,我深表歉意,但我正在尝试使用 panda 数据帧并在 Python 中获取 XGBoost,以提供与使用 Scikit-Learn 包装器时相同的预测做同样的练习。到目前为止,我一直无法这样做。举个例子,这里我取 boston 数据集,转换为 panda 数据帧,对数据集的前 500 个观察值进行训练,然后预测最后 6 个。我首先使用 XGBoost,然后使用 Scikit-Learn 包装器和即使我将模型的参数设置为相同,我也会得到不同的预测。具体来说,数组预测看起来与数组预测非常不同(参见下面的代码)。任何帮助将不胜感激!

from sklearn import datasets
import pandas as pd
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from xgboost.sklearn import XGBRegressor

### Use the boston data as an example, train on first 500, predict last 6 
boston_data = datasets.load_boston()
df_boston = pd.DataFrame(boston_data.data,columns=boston_data.feature_names)
df_boston['target'] = pd.Series(boston_data.target)


#### Code using XGBoost
Sub_train = df_boston.head(500)
target = Sub_train["target"]
Sub_train = Sub_train.drop('target', axis=1) 

Sub_predict = df_boston.tail(6)
Sub_predict = Sub_predict.drop('target', axis=1)  

xgtrain = xgb.DMatrix(Sub_train.as_matrix(), label=target.tolist())
xgtest = xgb.DMatrix(Sub_predict.as_matrix())

params = {'booster': 'gblinear', 'objective': 'reg:linear', 
      'max_depth': 2, 'learning_rate': .1, 'n_estimators': 500,    'min_child_weight': 3, 'colsample_bytree': .7,
      'subsample': .8, 'gamma': 0, 'reg_alpha': 1}

model = xgb.train(dtrain=xgtrain, params=params)

predictions = model.predict(xgtest)

#### Code using Sk learn Wrapper for XGBoost
model = XGBRegressor(learning_rate =.1, n_estimators=500,
max_depth=2, min_child_weight=3, gamma=0, 
subsample=.8, colsample_bytree=.7, reg_alpha=1, 
objective= 'reg:linear')

target = "target"

Sub_train = df_boston.head(500)
Sub_predict = df_boston.tail(6)
Sub_predict = Sub_predict.drop('target', axis=1)

Ex_List = ['target']

predictors = [i for i in Sub_train.columns if i not in Ex_List]

model = model.fit(Sub_train[predictors],Sub_train[target])

predictions2 = model.predict(Sub_predict)

【问题讨论】:

    标签: python scikit-learn xgboost


    【解决方案1】:

    请看this answer here

    xgboost.train 将忽略参数 n_estimators,而 xgboost.XGBRegressor 接受。在 xgboost.train 中,提升迭代次数 (即 n_estimators)由 num_boost_round 控制(默认值:10)

    它建议从提供给xgb.train 的参数中删除n_estimators,并将其替换为num_boost_round

    所以像这样改变你的参数:

    params = {'objective': 'reg:linear', 
          'max_depth': 2, 'learning_rate': .1,    
          'min_child_weight': 3, 'colsample_bytree': .7,
          'subsample': .8, 'gamma': 0, 'alpha': 1}
    

    然后像这样训练 xgb.train:

    model = xgb.train(dtrain=xgtrain, params=params,num_boost_round=500)
    

    你会得到同样的结果。

    或者,保持 xgb.train 不变并像这样更改 XGBRegressor:

    model = XGBRegressor(learning_rate =.1, n_estimators=10,
                         max_depth=2, min_child_weight=3, gamma=0, 
                         subsample=.8, colsample_bytree=.7, reg_alpha=1, 
                         objective= 'reg:linear')
    

    那么你也会得到同样的结果。

    【讨论】:

    • 非常感谢!我使用您建议的第一组更改重新运行代码,现在数组(预测和预测2)完美匹配。
    • @VivekKumar:请问,您如何在 XGBRepressor 中从 xgb.train 复制 num_boost_round=500?同样,您如何在 xgb.train 中指定您将使用分类器或回归器的事实?目标函数可能会这样做,但是您可以在 XGBregressor 中指定任何组合,例如 binary:logistic,我猜这不是用于此的参数。谢谢。
    • @AndoJurai 您需要为此使用 n_estimators = 500。但我没有得到你问题的第二部分。请详细说明您想要什么?
    • @AndoJurai 在这里查看:xgboost.readthedocs.io/en/latest/…。如果仍然不满意,请使用相关信息开始一个新问题。
    • @AndoJurai 您是否查看了链接页面上的目标参数。那里的所有选项都有效。 "reg:linear" 用于回归。请参阅标题:“学习任务参数”
    猜你喜欢
    • 2018-12-31
    • 2017-09-27
    • 2020-07-17
    • 2017-08-01
    • 2017-07-30
    • 2017-08-21
    • 1970-01-01
    • 2022-10-16
    相关资源
    最近更新 更多