Pandas Dataframe para DMatrix

14

Estou tentando executar o xgboost no scikit learn. E eu só uso o Pandas para carregar dados no dataframe. Como eu devo usar pandas df com xgboost. Estou confuso com a rotina do DMatrix necessária para executar o xgboost algo.

Fantasma na Concha
fonte

Respostas:

21

Você pode usar o .valuesmétodo do quadro de dados para acessar dados brutos depois de manipular as colunas conforme necessário.

Por exemplo

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, pode ser necessário alterar as colunas que você solta ou usa como destino do treinamento. O exposto acima foi para uma competição do Kaggle, portanto não havia dados de destino para xgtest(eles são retidos pelos organizadores).

Neil Slater
fonte
Ao tentar desta forma xgb.DMatrix(X_train.values, y_train.values)eu estou vendoTypeError: can not initialize DMatrix from dict
javadba
@javadba: Definitivamente funcionou em 2016 no meu mcahine! Não posso testar isso no momento, pois não consigo instalar o xgboost. É possível que algum código da biblioteca tenha sido alterado. É mais provável que exista algo diferente na sua situação. Eu encontrei stackoverflow.com/questions/35402461/... mas que simplesmente aconselha a fazer exatamente o que esta resposta faz (ou seja, utilização .values)
Neil Slater
7

Agora você pode usar os DataFrames do Pandas diretamente com o XGBoost. Definitivamente funciona com o xgboost 0.81.

Por exemplo, onde X_train, X_val, y_train e y_val são 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
fonte