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
Essaye ça
train_store['StateHoliday'] = pd.to_numeric(train_store['StateHoliday'])
train_store['Assortment'] = pd.to_numeric(train_store['Assortment'])
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.
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.
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é)