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 quexgboost.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.