Python Notebook( link )を実行しようとしています。[446]の下の行:著者の列車XGBoost
で、エラー
ValueError:データのDataFrame.dtypesは、int、float、またはboolである必要があります。フィールドStateHoliday、Assortmentのデータ型を期待していませんでした
# 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)
テスト用の最小限のコードは次のとおりです
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)
Train_storeデータファイルへのリンク: Link 1
これを試して
train_store['StateHoliday'] = pd.to_numeric(train_store['StateHoliday'])
train_store['Assortment'] = pd.to_numeric(train_store['Assortment'])
Rossmann Sales Prediction Projectを実行しているときにも、まったく同じ問題に遭遇しました。 xgboostの新しいバージョンはStateHoliday、Assortment、StoreTypeのデータ型を受け入れないようです。 Mykhailo Lisovyiが推奨するデータ型を使用して確認できます
print(test_train.dtypes)
ここでtest_trainをX_trainに置き換える必要があります
あなたは得ることができる
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
object typeまで発生したエラー。あなたはそれらを変換することができます
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))
これらの手順の後、すべてがうまくいきます。
H2OパッケージのXGBoostバージョンはカテゴリ変数を処理できます(ただし、多すぎません!)が、XGBoostは独自のパッケージとして処理できないようです。
pandas dataframesでこれを試しましたが、xgboostはそれを好きではありませんでした
categoricals = ['StoreType', ] . # etc.
pdf[categorical] = pdf[categorical].astype('category')
カテゴリカルでH2Oを使用するには、まず文字列をカテゴリカルに変換する必要があります。
h2odf[categoricals] = h2odf[categoricals].asfactor()
また、h2oにはパンダとは異なる独自のデータフレームがあることに注意してください。
エラーメッセージが示すように、xgboost
は不幸です。未知のタイプをフィードしようとしています。それはカテゴリー的または日時的特徴を扱うことができないと言います。 StateHoliday, Assortment
機能のタイプを確認し、何らかの方法で数値にエンコードします(たとえば、ワンホットエンコーディング、ラベルエンコーディング(ツリーベースのモデルで機能)、またはターゲットエンコーディング)