web-dev-qa-db-ja.com

カテゴリー列でのxgboostのトレーニングの問題

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

5
arush1836

これを試して

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

Rossmann Sales Prediction Projectを実行しているときにも、まったく同じ問題に遭遇しました。 xgboostの新しいバージョンはStateHolidayAssortmentStoreTypeのデータ型を受け入れないようです。 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))

これらの手順の後、すべてがうまくいきます。

2
Zhi Yuan

H2OパッケージのXGBoostバージョンはカテゴリ変数を処理できます(ただし、多すぎません!)が、XGBoostは独自のパッケージとして処理できないようです。

pandas dataframesでこれを試しましたが、xgboostはそれを好きではありませんでした

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

カテゴリカルでH2Oを使用するには、まず文字列をカテゴリカルに変換する必要があります。

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

また、h2oにはパンダとは異なる独自のデータフレームがあることに注意してください。

0
Clem Wang

エラーメッセージが示すように、xgboostは不幸です。未知のタイプをフィードしようとしています。それはカテゴリー的または日時的特徴を扱うことができないと言います。 StateHoliday, Assortment機能のタイプを確認し、何らかの方法で数値にエンコードします(たとえば、ワンホットエンコーディング、ラベルエンコーディング(ツリーベースのモデルで機能)、またはターゲットエンコーディング)

0
Mischa Lisovyi