/
lightgbm_training_api_cv_lgbcv_old.py
41 lines (38 loc) · 2.26 KB
/
lightgbm_training_api_cv_lgbcv_old.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# %% Training API + 旧指定方法(early_stopping_rounds) + lightgbm.cv()メソッドのクロスバリデーション
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error
import lightgbm as lgb
from sklearn.model_selection import KFold
# データセット読込(カリフォルニア住宅価格)
TARGET_VARIABLE = 'price' # 目的変数名
USE_EXPLANATORY = ['MedInc', 'AveOccup', 'Latitude', 'HouseAge'] # 説明変数名
california_housing = pd.DataFrame(np.column_stack((fetch_california_housing().data, fetch_california_housing().target)),
columns = np.append(fetch_california_housing().feature_names, TARGET_VARIABLE))
california_housing = california_housing.sample(n=1000, random_state=42) # データ数多いので1000にサンプリング
y = california_housing[TARGET_VARIABLE].values # 目的変数のnumpy配列
X = california_housing[USE_EXPLANATORY].values # 説明変数のnumpy配列
# クロスバリデーション用のScikit-Learnクラス(5分割KFold)
cv = KFold(n_splits=5, shuffle=True, random_state=42)
###### ここからがLightGBMの実装 ######
# データをDatasetクラスに格納
dcv = lgb.Dataset(X, label=y) # クロスバリデーション用
# 使用するパラメータ
params = {'objective': 'regression', # 最小化させるべき損失関数
'metric': 'rmse', # 学習時に使用する評価指標(early_stoppingの評価指標にも同じ値が使用される)
'random_state': 42, # 乱数シード
'boosting_type': 'gbdt', # boosting_type
'verbose': -1 # これを指定しないと`No further splits with positive gain, best gain: -inf`というWarningが表示される
}
verbose_eval = 0 # この数字を1にすると学習時のスコア推移がコマンドライン表示される
# early_stoppingを指定してLightGBMをクロスバリデーション
cv_result = lgb.cv(params, dcv,
num_boost_round=10000, # 最大学習サイクル数。early_stopping使用時は大きな値を入力
early_stopping_rounds=10,
verbose_eval=verbose_eval,
folds=cv
)
print(cv_result)
print(f'RMSE mean={cv_result["rmse-mean"][-1]}')
# %%