けいゆうのブログ

MENSA会員・TOEIC985・競馬AI回収率150%

lightGBMにおけるfitとtrainの違い【feature_importance、ハイパーパラメータの設定】

 

スポンサーリンク

はじめに

lightGBMで使用するAPIは主にTraining APIとscikit-learn APIの2種類です。

前者ではtrain()、後者ではfit()メソッドで学習を行います。

使い方の細かな違いを見ていきましょう。

ハイパーパラメータの設定

Training APIではtrain()メソッドの引数paramsで直接ハイパーパラメータを指定することが可能です。

params = {
	'objective': 'lambdarank',
	}

model = lgb.train(
	params,
	train,
	valid_sets = valid
	)

しかしsklearnのfit()メソッドではそれができません。

sklearnでパラメータを設定するにはset_params()メソッドを使います。

model = LGBMRanker()

params = {
	'objective': 'lambdarank',
	}

model.set_params(**params)      

model.fit(
	train,
	target,
	)

あるいはモデル作成の際LGBMClassifierやLGBMRankerメソッドで直接指定しましょう。
(指定できないパラメータがありそうなのでset_params()のほうが確実かも)

model = LGBMRanker(
	boosting_type='gbdt',
	num_leaves=31,
	max_depth=-1,
	learning_rate=0.1
	)

lightgbm.readthedocs.io

重要度の表示(splitとgain)

lightGBMでは学習後に特徴量の重要度を表示できます。

重要度の計算法は頻度とゲインの2種類です。

詳しい内容については以下の記事がわかりやすいかと思います。
www.simpletraveler.jp
基本的にゲインのほうが高精度なようですが、lightGBMでは頻度がデフォルトです。

計算法の設定はTraining APIとsklearnでやり方が異なります。
まずはTraining APIの場合。

params = {
	'objective': 'lambdarank',
	}

model = lgb.train(
	params,
	train,
	valid_sets=valid
	)

#importanceの表示
importance = pd.DataFrame(
	model.feature_importance(importance_type='gain'),
	index=train.columns,
	columns=['importance']).sort_values('importance', ascending=False)

Training APIではmodel.feature_importance()メソッドで重要度を取得できます。

importance_typeはfeature_importance()メソッドの引数で指定します。

頻度ならimportance_type='split'、ゲインなら'gain'です。


次はsklearnの場合。

model = LGBMRanker(importance_type = 'gain')

params = {
	'objective': 'lambdarank',
	}

model.set_params(**params)      

model.fit(
	train,
	target,
	)

importance = pd.DataFrame({
	'features': train.columns, 
	'importance': model.feature_importances
	}).sort_values('importance', ascending=False)

sklearnで重要度を取得するにはmodel.feature_importancesを使います。

importance_typeはLGBMClassifier()、LGBMRanker()メソッドなどでインスタンス化の際に指定します。