extreme boosting python scikit-learn xgboost

boosting - xgboost python



¿Cómo obtener predicciones con XGBoost y XGBoost usando Scikit-Learn Wrapper para que coincida? (1)

Soy nuevo en XGBoost en Python, así que me disculpo si la respuesta aquí es obvia, pero estoy tratando de tomar un dataframe panda y obtener XGBoost en Python para darme las mismas predicciones que obtengo cuando uso el envoltorio Scikit-Learn para el mismo ejercicio. Hasta ahora no he podido hacerlo. Para dar un ejemplo, aquí tomo el conjunto de datos de Boston, convierto en un marco de datos panda, entreno en las primeras 500 observaciones del conjunto de datos y luego predigo los últimos 6. Lo hago primero con XGBoost y luego con el envoltorio Scikit-Learn y Recibo diferentes predicciones a pesar de que he establecido los parámetros del modelo para que sean los mismos. Específicamente, las predicciones de la matriz se ven muy diferentes de las predicciones de la matriz2 (ver el código a continuación). ¡Cualquier ayuda sería muy apreciada!

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)


Mire esta respuesta aquí

xgboost.train ignorará el parámetro n_estimators, mientras que xgboost.XGBRegressor acepta. En xgboost.train, el aumento de iteraciones (es decir, n_estimators) está controlado por num_boost_round (valor predeterminado: 10)

Sugiere eliminar n_estimators de params suministrados a xgb.train y reemplazarlo con num_boost_round .

Así que cambia tus parámetros de esta manera:

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

Y entrena xgb.train de esta manera:

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

Y obtendrás los mismos resultados.

Alternativamente, mantenga el xgb.train tal como está y cambie el XGBRegressor así:

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'')

Entonces también obtendrás los mismos resultados.