lightGBMのクロスバリデーション サンプルコード

試行錯誤してなんとかmaeのクロスバリデーションができるようになったので残しておきます。

import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
pd.set_option('display.max_columns', None)

trdf=pd.read_csv('train.csv')

X=trdf[['TimeToReply','MaximumAccommodates']]

X.replace({'within an hour':0,
             'within a few hours':1,'within a day':2,
             'a few days or more':3},inplace=True)

y=trdf['Price']

X=np.array(X)

y=np.array(y)
FOLD = 5
NUM_ROUND = 100
VERBOSE_EVAL = -1

params = {
   'objective': 'regression',
   'verbose': -1,
}

valid_scores = []
models = []
kf = KFold(n_splits=FOLD, shuffle=True, random_state=42)

for fold, (train_indices, valid_indices) in enumerate(kf.split(X)):
   X_train, X_valid = X[train_indices], X[valid_indices]
   y_train, y_valid = y[train_indices], y[valid_indices]
   lgb_train = lgb.Dataset(X_train, y_train)
   lgb_eval = lgb.Dataset(X_valid, y_valid)

   model = lgb.train(
       params,
       lgb_train,
       valid_sets=lgb_eval,
       num_boost_round=NUM_ROUND,
       verbose_eval=VERBOSE_EVAL
   )

   y_valid_pred = model.predict(X_valid)
   score = mean_absolute_error(y_valid, y_valid_pred)
   print(f'fold {fold} MAE: {score}')
   valid_scores.append(score)

   models.append(model)

cv_score = np.mean(valid_scores)
print(f'CV score: {cv_score}')

画像1

:こんな感じで出てくるようになりました。2変数しか使ってないけど一番高くて101、一番低くて95だから6%ぐらいのブレが出てくると言うこと。

# データの特徴量をnp.ndarray型にしておく必要がある。のと、目的変数は1次元のarrayじゃないといけない。y=[['Price']]とすると2次元になってしまうから、y=['Price']と大括弧は1つで括る。y.shape()で確認できる。


いいなと思ったら応援しよう!