LightGBMの使い方(備忘録)

Kaggleでテーブルデータのタスクでは、初手はとりあえずGBDTと言われるぐらいLightGBMが使用されています。

しかしながら、LightGBMの使用法に関して述べている書籍やサイトは、ほとんどないのが現状です。
この記事は、自分の備忘録も含めて、LightGBMのコードの使い方に関してみていきます。
LightGBMの理論に関しては、他サイトで分かりやすく説明しているので、APIやパラメーターを中心に記載していきます。

目次

LightGBM、Scikit-learnの公式ドキュメント

「まずは、公式ドキュメントをよめ。」と言われますが、パラメーターの数の多さにびびります。
公式ドキュメントを参照しながら、進めていきます。

・LightGBMの公式ドキュメント
https://lightgbm.readthedocs.io/en/stable/index.html

・Scikit-learnの公式ドキュメント
https://scikit-learn.org/stable/user_guide.html

LightGBMの基本コード(分類)

初手として、ハイパーパラメーターのチューニングは行わずに、特徴量の重要度の可視化を目的として行います。

!pip install lightgbm
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, roc_auc_score, classification_report
import pandas as pd
import matplotlib.pyplot as plt

# サンプルデータ
X = data.drop("y", axis=1)
y = data["y"]

# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# データセット形式に変換
train_data = lgb.Dataset(X_train, label=y_train)
valid_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

# パラメータ設定(初期設定)
params = {
    'objective': 'binary',
    'metric': 'binary_logloss',
    'boosting_type': 'gbdt',
    'verbosity': -1
}

# モデル学習
model = lgb.train(
   params, 
   train_data, 
   valid_sets=[valid_data],
   num_boost_round=100,
   callbakcks=[lgb.early_stopping=10]
)

# 予測、精度評価
y_pred_prob = model.predict(X_test)
y_pred = (y_pred_prob > 0.5).astype(int)

print("Accuracy:", accuracy_score(y_test, y_pred))
print("AUC:", roc_auc_score(y_test, y_pred_prob))
print(classification_report(y_test, y_pred))

# 特徴量重要度の可視化
lgb.plot_importance(model, max_num_features=20, importance_type='gain')
plt.title("Feature Importance (gain)")
plt.tight_layout()
plt.show()

データセット形式に変換

# データセット形式に変換
train_data = lgb.Dataset(X_train, label=y_train)
valid_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

LightGBM は、学習に必要な情報を含んだ 専用形式(lgb.Dataset に変換することで、高速かつ効率的に学習できる!

lgb.train()を使う場合は、DataFrameからlgb.Datasetに変換する必要がある。

LGBMClassifierを使用する場合は、DataFrameのままでよい。

lgb.train()とLGBMClassifier()を使用する場合を比較は下記を参照。

項目lgb.train()LGBMClassifier()(Scikit-Learn API)
データ形式lgb.Dataset が必要pandas, numpy OK(普通の形式で学習できる)
Scikit-learn連携できないGridSearchCVなどそのまま使える
柔軟性(パラメータ) 非常に細かく設定可能ある程度可能(内部で train() を呼び出す)
初心者向きやや複雑直感的に使える
EarlyStoppingcallbacks=[early_stopping()]で必要early_stopping_rounds=… で書ける

・lgb.Dataset
https://lightgbm.readthedocs.io/en/stable/pythonapi/lightgbm.Dataset.html#lightgbm.Dataset

classlightgbm.Dataset(datalabel=Nonereference=Noneweight=Nonegroup=Noneinit_score=Nonefeature_name=’auto’categorical_feature=’auto’params=Nonefree_raw_data=Trueposition=None)

reference (Dataset or None, optional (default=None)) – If this is Dataset for validation, training data should be used as reference.

分からなかった引数は、reference。

検証用データを作るときには、訓練用データを reference に指定しよう、ということらしい。

なぜ reference を指定するのか?

LightGBM は内部的に、

  • カテゴリ変数の取り扱い
  • 特徴量の構造(列の並びや型)

を「訓練データと揃えて使いたい」ってときがある。

だから検証用データには「この訓練データを基準にしてね(reference)」って教えてあげる必要がある。

パラメータ設定

# パラメータ設定(初期設定)
params = {
    'objective': 'binary',
    'metric': 'binary_logloss',
    'boosting_type': 'gbdt',
    'verbosity': -1
}

パラメータは公式ドキュメントを見ると大きく分けて7つに分けられている。

分類名主な役割・用途
Core Parametersモデルの基本設定(boosting, num_iterationsなど)
Learning Control Parameters学習の挙動を制御(learning_rate, num_leaves, min_data_in_leafなど)
IO Parameters入出力に関する設定(データの保存や読み込み、verbosityなど)
Objective Parametersタスクの種類(分類/回帰など)に関する設定(objective, is_unbalanceなど)
Metric Parameters評価指標(metric, eval_at, ndcg_eval_atなど)
Network Parameters分散学習時の通信に関する設定(クラスタで学習するとき)
GPU ParametersGPUを使う場合の設定(device_type, gpu_platform_id, gpu_device_idなど)

今回設定したパラメータ4つを見ていく。

objective 🔗︎, default = regression, type = enum, options: regressionregression_l1huberfairpoissonquantilemapegammatweediebinarymulticlassmulticlassovacross_entropycross_entropy_lambdalambdarankrank_xendcg, aliases: objective_typeappapplicationloss

objective:目的関数を指定する。デフォルトでは回帰。今回は分類なので、binary。

metric 🔗︎, default = "", type = multi-enum, aliases: metricsmetric_types

metric:モデルの性能を測るための評価指標。AUCを指定。

  • boosting🔗︎, default = gbdt, type = enum, options: gbdtrfdart, aliases: boosting_typeboost
    • gbdt, traditional Gradient Boosting Decision Tree, aliases: gbrt
    • rf, Random Forest, aliases: random_forest
    • dartDropouts meet Multiple Additive Regression Trees
      • Note: internally, LightGBM uses gbdt mode for the first 1 / learning_rate iterations

boosting_type:LightGBMが使う「学習アルゴリズムのタイプ」。ここでは GBDT(勾配ブースティング木)を使う。

  • verbosity🔗︎, default = 1, type = int, aliases: verbose
    • controls the level of LightGBM’s verbosity
    • < 0: Fatal, = 0: Error (Warning), = 1: Info, > 1: Debug

モデル学習

# モデル学習
model = lgb.train(
   params, 
   train_data, 
   valid_sets=[valid_data],
   num_boost_round=100,
   callbakcks=[lgb.early_stopping=10]
)

・lightgbm.train
https://lightgbm.readthedocs.io/en/stable/pythonapi/lightgbm.train.html

lightgbm.train(paramstrain_setnum_boost_round=100valid_sets=Nonevalid_names=Nonefeval=Noneinit_model=Nonekeep_training_booster=Falsecallbacks=None)[source]

valid_sets (list of Dataset, or None, optional (default=None)) – List of data to be evaluated on during training.

valid_sets:学習中にモデルの性能を評価するためのデータセット(検証用)を指定する引数。これを指定すると、各ラウンド(木を1本増やすごと)に 評価指標(AUCやloglossなど) を出してくれる。

num_boost_round (int, optional (default=100)) – Number of boosting iterations.

num_boost_round:木を最大で何本作るか(ブースティングの回数)を指定する引数。

early_stopping:本数を多めに指定しておいて、途中で「もうこれ以上よくならない」と判断したら止める方法。「木が多いほど強い?」と思いがちだが、多すぎると過学習になるので、early_stoppingを使用する。

予測、精度評価

# 予測、精度評価
y_pred_prob = model.predict(X_test)
y_pred = (y_pred_prob > 0.5).astype(int)

print("Accuracy:", accuracy_score(y_test, y_pred))
print("AUC:", roc_auc_score(y_test, y_pred_prob))
print(classification_report(y_test, y_pred))

classification_report() は、分類モデルの予測結果に対して、精度(Precision)・再現率(Recall)・F1スコア・サポート数(Support) をクラスごとに出してくれるレポート

(スポンサーリンク)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次