LightGBMリファレンスノート
22294 ワード
1.概要
コンテスト問題ではXGBoostアルゴリズムが非常に人気があり,多くの試合の大殺器であることが知られているが,使用中は訓練に時間がかかり,メモリの占有量が大きい.2017年1月にマイクロソフトはGitHubの上でLightGBMをオープンした.このアルゴリズムは精度を低下させることなく,速度を10倍程度向上させ,占有メモリを3倍程度低下させた.LightGBMは高速で分布的で高性能な決定木アルゴリズムに基づく勾配向上アルゴリズムである.ソート、分類、回帰、その他の多くの機械学習タスクに使用できます.その詳細な原理と操作内容の詳細は、LightGBM中国語ドキュメントを参照してください.
本文は主にLightGBMの2種類のパラメータ調整方法を説明する.
次の表は重要なパラメータの意味とどのように適用するかです.
ラーニングコントロールパラメータ
意味
使用法
ツリーの最大深さ
モデルがフィットしすぎる場合は、まず
葉が持つ可能性のある最小記録数
デフォルト20、オーバーフィット時
たとえば0.8の場合、反復ごとに80%のパラメータをランダムに選択してツリーを作成することを意味します.
boostingがrandom forestの場合
反復ごとのデータスケール
トレーニング速度の高速化とオーバーフィットの低減に使用
1回の検証データのメトリックが最近の
解析を高速化し、反復を減らします.
lambda
正規化の指定
0~1
分裂の最小gainを記述する
木の有用な分裂を制御する
グループ境界に分割点を見つける
カテゴリ数が多い場合、分割点を探してフィットしやすい場合
コアパラメータ
意味
使用法
Task
データの用途
trainまたはpredictの選択
application
モデルの用途
regressionの選択:回帰時、binary:二分類時、multiclass:多分類時
boosting
使用するアルゴリズム
gbdt, rf: random forest, dart: Dropouts meet Multiple Additive Regression Trees, goss:
反復回数
通常100+
1回の検証データのメトリックが最近の
通常0.1、0.001、0.003...
デフォルト31
device
cpuまたはgpu
metric
IOパラメータ
意味
featureが格納するbinの最大数を表す
このパラメータがtrueの場合、データセットはバイナリファイルとして保存され、次にデータを読むときに速度が速くなります
パラメトリック
IO parameter
意味
値は
これを大きな値に設定すると、深すぎるツリーを避けることができますが、underfittingが発生し、大きなデータセットで数百または数千に設定される可能性があります.
これも木の深さを制限できます
次の表はFaster Speed,better accuracy,over-fittingの3つの目的に対応している場合に調整できるパラメータです
Faster Speed
better accuracy
over-fitting
大きい
用
設定
training dataが多い
training dataが多い
直接categorical feature
用
ダートで
2.GridSearchCVパラメータ
LightGBMのパラメータ調整プロセスはRF、GBDTなどと類似しており、その基本的な流れは以下の通りである.まず、収束の速度を速めるために、より高い学習率、約0.1付近を選択します.これは参列調整に必要です. 決定ツリー基本パラメータへの参照 正規化パラメータ参照 最後に学習率を下げ、ここでは最後に精度を高めるため ステップ1:学習率と反復回数
私たちはまず学習を率先して高い値を決めます.ここでは
反復の回数は,残差木の数ともいえるが,パラメータ名は
その前に、他の重要なパラメータに初期値を与えなければなりません.初期値の意味は大きくありませんが、他のパラメータを容易に決定するためです.次に、初期値を指定します.
次のパラメータは、特定の項目の要件に基づいて決定されます.
以下は私が選択した初期値です.
次に、LightGBMのcv関数を使用して決定します.
出力結果は次のとおりです.
('best n_estimators:', 188) ('best cv score:', 0.99134716298085424)
以上の結果に基づいて、n_を取ります.estimators=188.
ステップ2:max_を決定depthとnum_leaves
これは精度を向上させる最も重要なパラメータである.ここでは
結果は次のとおりです(結果は長く、一部のみ表示されます).
結果に基づいてmax_を取りますdepth=4,num_leaves=10.
ステップ3:min_を決定するdata_in_leafとmax_bin in
結果は次のとおりです(結果は長く、一部のみ表示されます).
結果に基づいてmin_を取りますdata_in_leaf=51,max_bin in=15.
ステップ4:feature_を決定するfraction、bagging_fraction、bagging_freq
結果は次のとおりです(結果は長く、一部のみ表示されます).
ステップ5:lambda_を決定するl 1とlambda_l2
解果は以下の通りです:(結果は長く、一部のみ表示されます)
ステップ6:min_を決定するsplit_gain
結果は次のとおりです.
ステップ7:学習率の低下、反復回数の増加、モデルの検証
結果は次のとおりです.
('acc:', 0.97368421052631582) ('auc:', 0.9744363289933311)
既定のパラメータを使用すると、モデルは次のように表現されます.
正確率とAUCで得点が上がっていることがわかります.
3.LightGBMのcv関数パラメータ
この方式は比較的に手間が省け、コードを書くと自動的に最適化されるが、調整経験が必要であり、どのように良いパラメータ範囲を設定するかには一定の技術的な含有量があり、ここでは直接コードを与える.
結果は次のとおりです.
訓練で得られたパラメータをモデルに代入する
結果は次のとおりです.
コンテスト問題ではXGBoostアルゴリズムが非常に人気があり,多くの試合の大殺器であることが知られているが,使用中は訓練に時間がかかり,メモリの占有量が大きい.2017年1月にマイクロソフトはGitHubの上でLightGBMをオープンした.このアルゴリズムは精度を低下させることなく,速度を10倍程度向上させ,占有メモリを3倍程度低下させた.LightGBMは高速で分布的で高性能な決定木アルゴリズムに基づく勾配向上アルゴリズムである.ソート、分類、回帰、その他の多くの機械学習タスクに使用できます.その詳細な原理と操作内容の詳細は、LightGBM中国語ドキュメントを参照してください.
本文は主にLightGBMの2種類のパラメータ調整方法を説明する.
次の表は重要なパラメータの意味とどのように適用するかです.
ラーニングコントロールパラメータ
意味
使用法
max_depth
ツリーの最大深さ
モデルがフィットしすぎる場合は、まず
max_depth
を下げることが考えられる.min_data_in_leaf
葉が持つ可能性のある最小記録数
デフォルト20、オーバーフィット時
feature_fraction
たとえば0.8の場合、反復ごとに80%のパラメータをランダムに選択してツリーを作成することを意味します.
boostingがrandom forestの場合
bagging_fraction
反復ごとのデータスケール
トレーニング速度の高速化とオーバーフィットの低減に使用
early_stopping_round
1回の検証データのメトリックが最近の
early_stopping_round
ラウンドで向上しなかった場合、モデルはトレーニングを停止します.解析を高速化し、反復を減らします.
lambda
正規化の指定
0~1
min_gain_to_split
分裂の最小gainを記述する
木の有用な分裂を制御する
max_cat_group
グループ境界に分割点を見つける
カテゴリ数が多い場合、分割点を探してフィットしやすい場合
コアパラメータ
意味
使用法
Task
データの用途
trainまたはpredictの選択
application
モデルの用途
regressionの選択:回帰時、binary:二分類時、multiclass:多分類時
boosting
使用するアルゴリズム
gbdt, rf: random forest, dart: Dropouts meet Multiple Additive Regression Trees, goss:
Gradient-based One-Side Sampling
num_boost_round
反復回数
通常100+
learning_rate
1回の検証データのメトリックが最近の
early_stopping_round
ラウンドで向上しなかった場合、モデルはトレーニングを停止します.通常0.1、0.001、0.003...
num_leaves
デフォルト31
device
cpuまたはgpu
metric
mae: mean absolute error , mse: mean squared error , binary_logloss: loss for binary classification , multi_logloss: loss for multi classification
IOパラメータ
意味
max_bin
featureが格納するbinの最大数を表す
categorical_feature
categorical_features = 0,1,2
の場合、カラム0,1,2はcategorical変数です.ignore_column
categorical_features
と似ていますが、特定の列をcategoricalと見なすのではなく、完全に無視します.save_binary
このパラメータがtrueの場合、データセットはバイナリファイルとして保存され、次にデータを読むときに速度が速くなります
パラメトリック
IO parameter
意味
num_leaves
値は
<= 2 ^(max_depth)
で、この値を超えるとフィットしすぎます.min_data_in_leaf
これを大きな値に設定すると、深すぎるツリーを避けることができますが、underfittingが発生し、大きなデータセットで数百または数千に設定される可能性があります.
max_depth
これも木の深さを制限できます
次の表はFaster Speed,better accuracy,over-fittingの3つの目的に対応している場合に調整できるパラメータです
Faster Speed
better accuracy
over-fitting
max_bin
を小さく設定大きい
max_bin
でmax_bin
小さいnum_leaves
大きめnum_leaves
小さいfeature_fraction
でsub-sampling
用
feature_fraction
用bagging_fraction bagging_freq
設定
bagging_fraction bagging_freq
training dataが多い
training dataが多い
save_binary
でデータ・ロードを高速化直接categorical feature
用
gmin_data_in_leaf min_sum_hessian_in_leaf
parallel learningでダートで
lambda_l1, lambda_l2 ,min_gain_to_split
で正規化num_iterations
大きめ、learning_rate
小さめmax_depth
でツリーの深さを制御2.GridSearchCVパラメータ
LightGBMのパラメータ調整プロセスはRF、GBDTなどと類似しており、その基本的な流れは以下の通りである.
私たちはまず学習を率先して高い値を決めます.ここでは
learning_rate = 0.1
を取り、次に推定器boosting/boost/boosting_type
のタイプを決定しますが、デフォルトではgbdt
を選択します.反復の回数は,残差木の数ともいえるが,パラメータ名は
n_estimators/num_iterations/num_round/num_boost_round
である.このパラメータを大きな数に設定してから、コードなどの最適な反復回数をcv結果に表示できます.その前に、他の重要なパラメータに初期値を与えなければなりません.初期値の意味は大きくありませんが、他のパラメータを容易に決定するためです.次に、初期値を指定します.
次のパラメータは、特定の項目の要件に基づいて決定されます.
'boosting_type'/'boosting': 'gbdt'
'objective': 'binary'
'metric': 'auc'
以下は私が選択した初期値です.
'max_depth': 5 # , , 4-10 。
'num_leaves': 30 # lightGBM leaves_wise , 2^max_depth
'subsample'/'bagging_fraction':0.8 #
'colsample_bytree'/'feature_fraction': 0.8 #
次に、LightGBMのcv関数を使用して決定します.
import pandas as pd
import lightgbm as lgb
from sklearn.datasets import load_breast_cancer
from sklearn.cross_validation import train_test_split
canceData=load_breast_cancer()
X=canceData.data
y=canceData.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0,test_size=0.2)
params = {
'boosting_type': 'gbdt',
'objective': 'binary',
'metric': 'auc',
'nthread':4,
'learning_rate':0.1,
'num_leaves':30,
'max_depth': 5,
'subsample': 0.8,
'colsample_bytree': 0.8,
}
data_train = lgb.Dataset(X_train, y_train)
cv_results = lgb.cv(params, data_train, num_boost_round=1000, nfold=5, stratified=False, shuffle=True, metrics='auc',early_stopping_rounds=50,seed=0)
print('best n_estimators:', len(cv_results['auc-mean']))
print('best cv score:', pd.Series(cv_results['auc-mean']).max())
出力結果は次のとおりです.
('best n_estimators:', 188) ('best cv score:', 0.99134716298085424)
以上の結果に基づいて、n_を取ります.estimators=188.
ステップ2:max_を決定depthとnum_leaves
これは精度を向上させる最も重要なパラメータである.ここでは
sklearn
のGridSearchCV()
関数を導入して検索する.from sklearn.grid_search import GridSearchCV
params_test1={'max_depth': range(3,8,1), 'num_leaves':range(5, 100, 5)}
gsearch1 = GridSearchCV(estimator = lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',metrics='auc',learning_rate=0.1, n_estimators=188, max_depth=6, bagging_fraction = 0.8,feature_fraction = 0.8),
param_grid = params_test1, scoring='roc_auc',cv=5,n_jobs=-1)
gsearch1.fit(X_train,y_train)
gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_
結果は次のとおりです(結果は長く、一部のみ表示されます).
([mean: 0.99248, std: 0.01033, params: {'num_leaves': 5, 'max_depth': 3},
mean: 0.99227, std: 0.01013, params: {'num_leaves': 10, 'max_depth': 3},
mean: 0.99227, std: 0.01013, params: {'num_leaves': 15, 'max_depth': 3},
······
mean: 0.99331, std: 0.00775, params: {'num_leaves': 85, 'max_depth': 7},
mean: 0.99331, std: 0.00775, params: {'num_leaves': 90, 'max_depth': 7},
mean: 0.99331, std: 0.00775, params: {'num_leaves': 95, 'max_depth': 7}],
{'max_depth': 4, 'num_leaves': 10},
0.9943573667711598)
結果に基づいてmax_を取りますdepth=4,num_leaves=10.
ステップ3:min_を決定するdata_in_leafとmax_bin in
params_test2={'max_bin': range(5,256,10), 'min_data_in_leaf':range(1,102,10)}
gsearch2 = GridSearchCV(estimator = lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',metrics='auc',learning_rate=0.1, n_estimators=188, max_depth=4, num_leaves=10,bagging_fraction = 0.8,feature_fraction = 0.8),
param_grid = params_test2, scoring='roc_auc',cv=5,n_jobs=-1)
gsearch2.fit(X_train,y_train)
gsearch2.grid_scores_, gsearch2.best_params_, gsearch2.best_score_
結果は次のとおりです(結果は長く、一部のみ表示されます).
([mean: 0.98715, std: 0.01044, params: {'min_data_in_leaf': 1, 'max_bin': 5},
mean: 0.98809, std: 0.01095, params: {'min_data_in_leaf': 11, 'max_bin': 5},
mean: 0.98809, std: 0.00952, params: {'min_data_in_leaf': 21, 'max_bin': 5},
······
mean: 0.99363, std: 0.00812, params: {'min_data_in_leaf': 81, 'max_bin': 255},
mean: 0.99133, std: 0.00788, params: {'min_data_in_leaf': 91, 'max_bin': 255},
mean: 0.98882, std: 0.01223, params: {'min_data_in_leaf': 101, 'max_bin': 255}],
{'max_bin': 15, 'min_data_in_leaf': 51},
0.9952978056426331)
結果に基づいてmin_を取りますdata_in_leaf=51,max_bin in=15.
ステップ4:feature_を決定するfraction、bagging_fraction、bagging_freq
params_test3={'feature_fraction': [0.6,0.7,0.8,0.9,1.0],
'bagging_fraction': [0.6,0.7,0.8,0.9,1.0],
'bagging_freq': range(0,81,10)
}
gsearch3 = GridSearchCV(estimator = lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',metrics='auc',learning_rate=0.1, n_estimators=188, max_depth=4, num_leaves=10,max_bin=15,min_data_in_leaf=51),
param_grid = params_test3, scoring='roc_auc',cv=5,n_jobs=-1)
gsearch3.fit(X_train,y_train)
gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_
結果は次のとおりです(結果は長く、一部のみ表示されます).
([mean: 0.99467, std: 0.00710, params: {'bagging_freq': 0, 'bagging_fraction': 0.6, 'feature_fraction': 0.6},
mean: 0.99415, std: 0.00804, params: {'bagging_freq': 0, 'bagging_fraction': 0.6, 'feature_fraction': 0.7},
mean: 0.99530, std: 0.00722, params: {'bagging_freq': 0, 'bagging_fraction': 0.6, 'feature_fraction': 0.8},
······
mean: 0.99530, std: 0.00722, params: {'bagging_freq': 80, 'bagging_fraction': 1.0, 'feature_fraction': 0.8},
mean: 0.99383, std: 0.00731, params: {'bagging_freq': 80, 'bagging_fraction': 1.0, 'feature_fraction': 0.9},
mean: 0.99383, std: 0.00766, params: {'bagging_freq': 80, 'bagging_fraction': 1.0, 'feature_fraction': 1.0}],
{'bagging_fraction': 0.6, 'bagging_freq': 0, 'feature_fraction': 0.8},
0.9952978056426331)
ステップ5:lambda_を決定するl 1とlambda_l2
params_test4={'lambda_l1': [1e-5,1e-3,1e-1,0.0,0.1,0.3,0.5,0.7,0.9,1.0],
'lambda_l2': [1e-5,1e-3,1e-1,0.0,0.1,0.3,0.5,0.7,0.9,1.0]
}
gsearch4 = GridSearchCV(estimator = lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',metrics='auc',learning_rate=0.1, n_estimators=188, max_depth=4, num_leaves=10,max_bin=15,min_data_in_leaf=51,bagging_fraction=0.6,bagging_freq= 0, feature_fraction= 0.8),
param_grid = params_test4, scoring='roc_auc',cv=5,n_jobs=-1)
gsearch4.fit(X_train,y_train)
gsearch4.grid_scores_, gsearch4.best_params_, gsearch4.best_score_
解果は以下の通りです:(結果は長く、一部のみ表示されます)
([mean: 0.99530, std: 0.00722, params: {'lambda_l1': 1e-05, 'lambda_l2': 1e-05},
mean: 0.99415, std: 0.00804, params: {'lambda_l1': 1e-05, 'lambda_l2': 0.001},
mean: 0.99331, std: 0.00826, params: {'lambda_l1': 1e-05, 'lambda_l2': 0.1},
·····
mean: 0.99049, std: 0.01047, params: {'lambda_l1': 1.0, 'lambda_l2': 0.7},
mean: 0.99049, std: 0.01013, params: {'lambda_l1': 1.0, 'lambda_l2': 0.9},
mean: 0.99070, std: 0.01071, params: {'lambda_l1': 1.0, 'lambda_l2': 1.0}],
{'lambda_l1': 1e-05, 'lambda_l2': 1e-05},
0.9952978056426331)
ステップ6:min_を決定するsplit_gain
params_test5={'min_split_gain':[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]}
gsearch5 = GridSearchCV(estimator = lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',metrics='auc',learning_rate=0.1, n_estimators=188, max_depth=4, num_leaves=10,max_bin=15,min_data_in_leaf=51,bagging_fraction=0.6,bagging_freq= 0, feature_fraction= 0.8,
lambda_l1=1e-05,lambda_l2=1e-05),
param_grid = params_test5, scoring='roc_auc',cv=5,n_jobs=-1)
gsearch5.fit(X_train,y_train)
gsearch5.grid_scores_, gsearch5.best_params_, gsearch5.best_score_
結果は次のとおりです.
([mean: 0.99530, std: 0.00722, params: {'min_split_gain': 0.0},
mean: 0.99415, std: 0.00810, params: {'min_split_gain': 0.1},
mean: 0.99394, std: 0.00898, params: {'min_split_gain': 0.2},
mean: 0.99373, std: 0.00918, params: {'min_split_gain': 0.3},
mean: 0.99404, std: 0.00845, params: {'min_split_gain': 0.4},
mean: 0.99300, std: 0.00958, params: {'min_split_gain': 0.5},
mean: 0.99258, std: 0.00960, params: {'min_split_gain': 0.6},
mean: 0.99227, std: 0.01071, params: {'min_split_gain': 0.7},
mean: 0.99342, std: 0.00872, params: {'min_split_gain': 0.8},
mean: 0.99206, std: 0.01062, params: {'min_split_gain': 0.9},
mean: 0.99206, std: 0.01064, params: {'min_split_gain': 1.0}],
{'min_split_gain': 0.0},
0.9952978056426331)
ステップ7:学習率の低下、反復回数の増加、モデルの検証
model=lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',metrics='auc',learning_rate=0.01, n_estimators=1000, max_depth=4, num_leaves=10,max_bin=15,min_data_in_leaf=51,bagging_fraction=0.6,bagging_freq= 0, feature_fraction= 0.8,
lambda_l1=1e-05,lambda_l2=1e-05,min_split_gain=0)
model.fit(X_train,y_train)
y_pre=model.predict(X_test)
print("acc:",metrics.accuracy_score(y_test,y_pre))
print("auc:",metrics.roc_auc_score(y_test,y_pre))
結果は次のとおりです.
('acc:', 0.97368421052631582) ('auc:', 0.9744363289933311)
既定のパラメータを使用すると、モデルは次のように表現されます.
model=lgb.LGBMClassifier()
model.fit(X_train,y_train)
y_pre=model.predict(X_test)
print("acc:",metrics.accuracy_score(y_test,y_pre))
print("auc:",metrics.roc_auc_score(y_test,y_pre))
('acc:', 0.96491228070175439)
('auc:', 0.96379803112099083)
正確率とAUCで得点が上がっていることがわかります.
3.LightGBMのcv関数パラメータ
この方式は比較的に手間が省け、コードを書くと自動的に最適化されるが、調整経験が必要であり、どのように良いパラメータ範囲を設定するかには一定の技術的な含有量があり、ここでは直接コードを与える.
import pandas as pd
import lightgbm as lgb
from sklearn import metrics
from sklearn.datasets import load_breast_cancer
from sklearn.cross_validation import train_test_split
canceData=load_breast_cancer()
X=canceData.data
y=canceData.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0,test_size=0.2)
###
print(' ')
lgb_train = lgb.Dataset(X_train, y_train, free_raw_data=False)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train,free_raw_data=False)
### --
print(' ')
params = {
'boosting_type': 'gbdt',
'objective': 'binary',
'metric': 'auc',
'nthread':4,
'learning_rate':0.1
}
### ( )
print(' ')
max_auc = float('0')
best_params = {}
#
print(" 1: ")
for num_leaves in range(5,100,5):
for max_depth in range(3,8,1):
params['num_leaves'] = num_leaves
params['max_depth'] = max_depth
cv_results = lgb.cv(
params,
lgb_train,
seed=1,
nfold=5,
metrics=['auc'],
early_stopping_rounds=10,
verbose_eval=True
)
mean_auc = pd.Series(cv_results['auc-mean']).max()
boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
if mean_auc >= max_auc:
max_auc = mean_auc
best_params['num_leaves'] = num_leaves
best_params['max_depth'] = max_depth
if 'num_leaves' and 'max_depth' in best_params.keys():
params['num_leaves'] = best_params['num_leaves']
params['max_depth'] = best_params['max_depth']
#
print(" 2: ")
for max_bin in range(5,256,10):
for min_data_in_leaf in range(1,102,10):
params['max_bin'] = max_bin
params['min_data_in_leaf'] = min_data_in_leaf
cv_results = lgb.cv(
params,
lgb_train,
seed=1,
nfold=5,
metrics=['auc'],
early_stopping_rounds=10,
verbose_eval=True
)
mean_auc = pd.Series(cv_results['auc-mean']).max()
boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
if mean_auc >= max_auc:
max_auc = mean_auc
best_params['max_bin']= max_bin
best_params['min_data_in_leaf'] = min_data_in_leaf
if 'max_bin' and 'min_data_in_leaf' in best_params.keys():
params['min_data_in_leaf'] = best_params['min_data_in_leaf']
params['max_bin'] = best_params['max_bin']
print(" 3: ")
for feature_fraction in [0.6,0.7,0.8,0.9,1.0]:
for bagging_fraction in [0.6,0.7,0.8,0.9,1.0]:
for bagging_freq in range(0,50,5):
params['feature_fraction'] = feature_fraction
params['bagging_fraction'] = bagging_fraction
params['bagging_freq'] = bagging_freq
cv_results = lgb.cv(
params,
lgb_train,
seed=1,
nfold=5,
metrics=['auc'],
early_stopping_rounds=10,
verbose_eval=True
)
mean_auc = pd.Series(cv_results['auc-mean']).max()
boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
if mean_auc >= max_auc:
max_auc=mean_auc
best_params['feature_fraction'] = feature_fraction
best_params['bagging_fraction'] = bagging_fraction
best_params['bagging_freq'] = bagging_freq
if 'feature_fraction' and 'bagging_fraction' and 'bagging_freq' in best_params.keys():
params['feature_fraction'] = best_params['feature_fraction']
params['bagging_fraction'] = best_params['bagging_fraction']
params['bagging_freq'] = best_params['bagging_freq']
print(" 4: ")
for lambda_l1 in [1e-5,1e-3,1e-1,0.0,0.1,0.3,0.5,0.7,0.9,1.0]:
for lambda_l2 in [1e-5,1e-3,1e-1,0.0,0.1,0.4,0.6,0.7,0.9,1.0]:
params['lambda_l1'] = lambda_l1
params['lambda_l2'] = lambda_l2
cv_results = lgb.cv(
params,
lgb_train,
seed=1,
nfold=5,
metrics=['auc'],
early_stopping_rounds=10,
verbose_eval=True
)
mean_auc = pd.Series(cv_results['auc-mean']).max()
boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
if mean_auc >= max_auc:
max_auc=mean_auc
best_params['lambda_l1'] = lambda_l1
best_params['lambda_l2'] = lambda_l2
if 'lambda_l1' and 'lambda_l2' in best_params.keys():
params['lambda_l1'] = best_params['lambda_l1']
params['lambda_l2'] = best_params['lambda_l2']
print(" 5: 2")
for min_split_gain in [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]:
params['min_split_gain'] = min_split_gain
cv_results = lgb.cv(
params,
lgb_train,
seed=1,
nfold=5,
metrics=['auc'],
early_stopping_rounds=10,
verbose_eval=True
)
mean_auc = pd.Series(cv_results['auc-mean']).max()
boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
if mean_auc >= max_auc:
max_auc=mean_auc
best_params['min_split_gain'] = min_split_gain
if 'min_split_gain' in best_params.keys():
params['min_split_gain'] = best_params['min_split_gain']
print(best_params)
結果は次のとおりです.
{'bagging_fraction': 0.7,
'bagging_freq': 30,
'feature_fraction': 0.8,
'lambda_l1': 0.1,
'lambda_l2': 0.0,
'max_bin': 255,
'max_depth': 4,
'min_data_in_leaf': 81,
'min_split_gain': 0.1,
'num_leaves': 10}
訓練で得られたパラメータをモデルに代入する
model=lgb.LGBMClassifier(boosting_type='gbdt',objective='binary',metrics='auc',learning_rate=0.01, n_estimators=1000, max_depth=4, num_leaves=10,max_bin=255,min_data_in_leaf=81,bagging_fraction=0.7,bagging_freq= 30, feature_fraction= 0.8,
lambda_l1=0.1,lambda_l2=0,min_split_gain=0.1)
model.fit(X_train,y_train)
y_pre=model.predict(X_test)
print("acc:",metrics.accuracy_score(y_test,y_pre))
print("auc:",metrics.roc_auc_score(y_test,y_pre))
結果は次のとおりです.
('acc:', 0.98245614035087714)
('auc:', 0.98189901556049541)