web-dev-qa-db-fra.com

Difficulté à la formation XGoost sur la colonne catégorique

J'essaie d'exécuter un Python cahier (- link ). À la ligne ci-dessous dans [446]: Où l'auteur Train XGBoost, je reçois un Erreur

ValueError: Dataframe.dypes de données pour les données doit être INT, flotter ou BOOL. Ne s'attendait pas aux types de données dans les domaines de l'état de l'État, de l'assortiment

# XGB with xgboost library
dtrain = xgb.DMatrix(X_train[predictors], y_train)
dtest = xgb.DMatrix(X_test[predictors], y_test)

watchlist = [(dtrain, 'train'), (dtest, 'test')]

xgb_model = xgb.train(params, dtrain, 300, evals = watchlist,
                      early_stopping_rounds = 50, feval = rmspe_xg, verbose_eval = True)

Voici le code minimal pour les tests

import pickle
import numpy as np
import xgboost as xgb
from sklearn.model_selection import train_test_split

with open('train_store', 'rb') as f:
    train_store = pickle.load(f)

train_store.shape

predictors = ['Store', 'DayOfWeek', 'Open', 'Promo', 'StateHoliday', 'SchoolHoliday', 'Year', 'Month', 'Day', 
              'WeekOfYear', 'StoreType', 'Assortment', 'CompetitionDistance', 'CompetitionOpenSinceMonth', 
              'CompetitionOpenSinceYear', 'Promo2', 'Promo2SinceWeek', 'Promo2SinceYear', 'CompetitionOpen', 
              'PromoOpen']

y = np.log(train_store.Sales) # log transformation of Sales
X = train_store

# split the data into train/test set
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size = 0.3, # 30% for the evaluation set
                                                    random_state = 42)

# base parameters
params = {
    'booster': 'gbtree', 
    'objective': 'reg:linear', # regression task
    'subsample': 0.8,          # 80% of data to grow trees and prevent overfitting
    'colsample_bytree': 0.85,  # 85% of features used
    'eta': 0.1, 
    'max_depth': 10, 
    'seed': 42} # for reproducible results

num_round = 60 # default 300

dtrain = xgb.DMatrix(X_train[predictors], y_train)
dtest  = xgb.DMatrix(X_test[predictors],  y_test)

watchlist = [(dtrain, 'train'), (dtest, 'test')]

xgb_model = xgb.train(params, dtrain, num_round, evals = watchlist,
                      early_stopping_rounds = 50, feval = rmspe_xg, verbose_eval = True)

Lien vers le fichier de données Train_Store: link 1

8
arush1836

Essaye ça

train_store['StateHoliday'] = pd.to_numeric(train_store['StateHoliday'])
train_store['Assortment'] = pd.to_numeric(train_store['Assortment'])
2
Atinesh

J'ai rencontré le même problème lorsque je fais un projet de prédiction des ventes de Rossmann. Il semble que la nouvelle version de XGoost n'accepte pas le type de données de Stateholiday , Assortiment , et Storetype . Vous pouvez vérifier le type de données comme mykhailo lisovyi suggéré en utilisant

print(test_train.dtypes)

Vous devez remplacer Test_train ici avec votre x_train

vous pourriez peut-être obtenir

DayOfWeek                      int64
Promo                          int64
StateHoliday                   int64
SchoolHoliday                  int64
StoreType                     object
Assortment                    object
CompetitionDistance          float64
CompetitionOpenSinceMonth    float64
CompetitionOpenSinceYear     float64
Promo2                         int64
Promo2SinceWeek              float64
Promo2SinceYear              float64
Year                           int64
Month                          int64
Day                            int64

l'erreur soulevée jusqu'à -objet Type. Vous pouvez les convertir avec

from sklearn import preprocessing
lbl = preprocessing.LabelEncoder()
test_train['StoreType'] = lbl.fit_transform(test_train['StoreType'].astype(str))
test_train['Assortment'] = lbl.fit_transform(test_train['Assortment'].astype(str))

Tout ira bien après ces étapes.

2
Zhi Yuan

La version XGboost dans le paquet H2O peut gérer des variables catégoriques (mais pas trop nombreuses!) Mais il semble que XGboost comme son propre paquet ne puisse.

J'ai essayé cela avec pandas Dataframes mais Xgboost n'aimais pas

categoricals = ['StoreType', ] . # etc.
pdf[categorical] = pdf[categorical].astype('category')

Pour utiliser H2O avec des catégories, vous devrez convertir les chaînes en catégories d'abord:

h2odf[categoricals] = h2odf[categoricals].asfactor()

Notez également que H2O a ses propres dataframes différents de Pandas.

0
Clem Wang

Comme le suggère le message d'erreur, xgboost est malheureux, que vous essayez de l'alimenter des types inconnus. Il dit qu'il ne peut pas traiter des fonctionnalités catégoriques ou DateTime. Vérifiez le type de StateHoliday, Assortment Caractéristiques et les codez en chiffres d'une manière ou d'une autre (par exemple, codage à une fois, codage d'étiquettes (fonctionne pour les modèles basés sur les arbres) ou codage ciblé)

0
Mischa Lisovyi