1.質問内容
lightGBMの回帰予測をしています。
GSCVをfitさせようとした時に、下記のエラーが出ます。
estimator should be an estimator implementing 'fit' method,<lightgbm.basic.Booster object at 0x7f3c8651d8d0> was passed
上記をgoogle検索した場合、「LightGBMはこのtrain()方法を使用してトレーニングされているfit()ため、このグリッド検索は使用できない。」
とありました。対処方法として、LGBMRegressorを使用するとありました。しかし、LGBMRegressorでの方法は、うまく回帰できない((注)今後に使いたい個人データに対しての話ですが、ある説明変数だけに依存していまいます)ので、pythonAPIのLightGBMを使用したいと考えています。
よって、pythonAPIのLightGBM使用時のGSCVの使い方が知りたいです。
2.参考コード
python
1# ライブラリのインポート 2import pandas as pd # 基本ライブラリ 3import numpy as np # 基本ライブラリ 4import matplotlib.pyplot as plt # グラフ描画用 5import seaborn as sns; sns.set() # グラフ描画用 6import warnings # 実行に関係ない警告を無視 7warnings.filterwarnings('ignore') 8import lightgbm as lgb #LightGBM 9from sklearn import datasets 10from sklearn.model_selection import train_test_split # データセット分割用 11from sklearn.metrics import mean_squared_error # モデル評価用(平均二乗誤差) 12from sklearn.metrics import r2_score # モデル評価用(決定係数) 13 14# データフレームを綺麗に出力する関数 15import IPython 16def display(*dfs, head=True): 17 for df in dfs: 18 IPython.display.display(df.head() if head else df) 19 20# Boston データセットの読み込み 21boston = datasets.load_boston() 22df = pd.DataFrame(boston.data, columns=boston.feature_names) # データフレームへの格納 23 24# データの確認 25print(df.shape) # データサイズの確認(データ数,特徴量数(変数の個数)) 26display(df) # df.head()に同じ(文中に入れるときはdisplay()を使う) 27 28# 説明変数,目的変数 29X = df.drop('CRIM',axis=1).values # 説明変数(CRIM以外の特徴量) 30y = df['CRIM'].values # 目的変数(CRIM) 31 32# トレーニングデータ,テストデータの分割 33X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.20, random_state=2) 34 35# 学習に使用するデータを設定 36lgb_train = lgb.Dataset(X_train, y_train) 37lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train) 38 39# LightGBM parameters 40params = { 41 'task': 'train', 42 'boosting_type': 'gbdt', 43 'objective': 'regression', # 目的 : 回帰 44 'metric': {'rmse'}, # 評価指標 : rsme(平均二乗誤差の平方根) 45 'num_iteration': 1000, #1000回学習 46 'verbose': 0 47} 48 49# モデルの学習 50model = lgb.train(params, # パラメータ 51 train_set=lgb_train, # トレーニングデータの指定 52 valid_sets=lgb_eval, # 検証データの指定 53 early_stopping_rounds=100 # 100回ごとに検証精度の改善を検討 → 精度が改善しないなら学習を終了(過学習に陥るのを防ぐ) 54 ) 55 56#GSCV 57import sklearn 58from sklearn.model_selection import GridSearchCV 59tuned_params = {'max_depth': [5, 10, 30], 'num_leaves':[6,12,23], 'min_data_in_leaf': [1,10,20],'learning_rate':[0.05,0.1,0.2]} 60gscv = GridSearchCV(model, param_grid=tuned_params, 61 cv=3, scoring='neg_mean_squared_error') 62gscv.fit(X_train, y_train)#error発生部分 63#パラメーターチューニング後のスコア 64params = { 65 'task': 'train', 66 'boosting_type': 'gbdt', 67 'objective': 'regression', # 目的 : 回帰 68 'metric': {'rmse'}, # 評価指標 : rsme(平均二乗誤差の平方根) 69 'num_iteration': 1000, #1000回学習 70 'learning_rate':gscv.best_params_['learning_rate'], 71 'num_leaves':gscv.best_params_['num_leaves'], 72 'min_data_in_leaf':gscv.best_params_['min_data_in_leaf'], 73 'max_depth':gscv.best_params_['max_depth'], 74 'verbose': 0 75} 76 77model = lgb.train(params, # パラメータ 78 train_set=lgb_train, # トレーニングデータの指定 79 valid_sets=lgb_eval, # 検証データの指定 80 early_stopping_rounds=100 # 100回ごとに検証精度の改善を検討 → 精度が改善しないなら学習を終了(過学習に陥るのを防ぐ) 81 ) 82# 訓練データ、テストデータの予測 83y_train_pred = model.predict(X_train) 84y_test_pred = model.predict(X_test) 85 86# 正解と予測のMSEを計算 87print('MSE train: %.2f, test: %.2f' % ( 88 mean_squared_error(y_train, y_train_pred), 89 mean_squared_error(y_test, y_test_pred))) 90
3.補足情報(FW/ツールのバージョンなど)
開発環境:Google Colaboratory
プログラム言語:python3
OS:windows10 Home
CPU:Intel(R) Core(TM) i7-7500U CPU@2.70GHz 2.90GHz
あなたの回答
tips
プレビュー