Pandas Dataframe a DMatrix

14

Estoy tratando de ejecutar xgboost en scikit learn. Y solo uso Pandas para cargar datos en el marco de datos. ¿Cómo se supone que debo usar pandas df con xgboost? Estoy confundido por la rutina DMatrix requerida para ejecutar xgboost algo.

Fantasma en la concha
fuente

Respuestas:

21

Puede usar el .valuesmétodo del marco de datos para acceder a datos sin procesar una vez que haya manipulado las columnas según las necesite.

P.ej

train = pd.read_csv("train.csv")
target = train['target']
train = train.drop(['ID','target'],axis=1)
test = pd.read_csv("test.csv")
test = test.drop(['ID'],axis=1)

xgtrain = xgb.DMatrix(train.values, target.values)
xgtest = xgb.DMatrix(test.values)

Obviamente, es posible que deba cambiar las columnas que suelta o usa como objetivo de entrenamiento. Lo anterior fue para una competencia de Kaggle, por lo que no hubo datos objetivo para xgtest(los organizadores lo retienen ).

Neil Slater
fuente
Cuando intento de esta manera xgb.DMatrix(X_train.values, y_train.values), estoy viendoTypeError: can not initialize DMatrix from dict
javadba
@javadba: ¡Definitivamente funcionó en 2016 en mi mcahine! No puedo probar esto en este momento ya que no puedo instalar xgboost. Es posible que algún código de biblioteca haya cambiado. Lo más probable es que haya algo diferente en su situación. Encontré stackoverflow.com/questions/35402461/… pero eso simplemente le aconseja que haga exactamente lo que hace esta respuesta (es decir, usar .values)
Neil Slater
7

Ahora puede usar Pandas DataFrames directamente con XGBoost. Definitivamente funciona con xgboost 0.81.

Por ejemplo, donde X_train, X_val, y_train e y_val son DataFrames:

import xgboost as xgb

mod = xgb.XGBRegressor(
    gamma=1,                 
    learning_rate=0.01,
    max_depth=3,
    n_estimators=10000,                                                                    
    subsample=0.8,
    random_state=34
) 

mod.fit(X_train, y_train)
predictions = mod.predict(X_val)
rmse = sqrt(mean_squared_error(y_val, predictions))
print("score: {0:,.0f}".format(rmse))
jeffhale
fuente