web-dev-qa-db-ja.com

Scikit-Learn Wrapperを使用してXGBoostとXGBoostで予測を取得するにはどうすればよいですか?

私はPythonでXGBoostを初めて使用するので、ここでの答えが明らかな場合はお詫びしますが、パンダのデータフレームを取得してPython to同じ演習でScikit-Learnラッパーを使用したときに得られるのと同じ予測を教えてください。これまではそうすることができませんでした。例を挙げると、ここではボストンデータセットを取得し、パンダデータフレームに変換します。データセットの最初の500個の観測値をトレーニングし、最後の6個を予測します。最初にXGBoostを使用し、次にScikit-Learnラッパーを使用して実行します。モデルのパラメーターを同じに設定しても、異なる予測が得られます。 。具体的には、配列予測は配列予測2とは大きく異なります(以下のコードを参照)。助けていただければ幸いです。

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)
10
Joseph E

見てください この答えはここにあります

xgboost.trainはパラメータn_estimatorsを無視し、xgboost.XGBRegressorは受け入れます。 xgboost.trainでは、ブースティングの反復(つまり、n_estimators)はnum_boost_round(デフォルト:10)によって制御されます。

n_estimatorsに提供されたパラメータからxgb.trainを削除し、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')

その後も同じ結果が得られます。

15
Vivek Kumar