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() を呼び出す) |
初心者向き | やや複雑 | 直感的に使える |
EarlyStopping | callbacks=[early_stopping()]で必要 | early_stopping_rounds=… で書ける |
・lgb.Dataset
https://lightgbm.readthedocs.io/en/stable/pythonapi/lightgbm.Dataset.html#lightgbm.Dataset
classlightgbm.Dataset(data, label=None, reference=None, weight=None, group=None, init_score=None, feature_name=’auto’, categorical_feature=’auto’, params=None, free_raw_data=True, position=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 Parameters | GPUを使う場合の設定(device_type, gpu_platform_id, gpu_device_idなど) |
今回設定したパラメータ4つを見ていく。
objective
🔗︎, default =regression
, type = enum, options:regression
,regression_l1
,huber
,fair
,poisson
,quantile
,mape
,gamma
,tweedie
,binary
,multiclass
,multiclassova
,cross_entropy
,cross_entropy_lambda
,lambdarank
,rank_xendcg
, aliases:objective_type
,app
,application
,loss
objective:目的関数を指定する。デフォルトでは回帰。今回は分類なので、binary。
metric
🔗︎, default =""
, type = multi-enum, aliases:metrics
,metric_types
metric:モデルの性能を測るための評価指標。AUCを指定。
boosting
🔗︎, default =gbdt
, type = enum, options:gbdt
,rf
,dart
, aliases:boosting_type
,boost
gbdt
, traditional Gradient Boosting Decision Tree, aliases:gbrt
rf
, Random Forest, aliases:random_forest
dart
, Dropouts meet Multiple Additive Regression Trees
- Note: internally, LightGBM uses
gbdt
mode for the first1 / 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(params, train_set, num_boost_round=100, valid_sets=None, valid_names=None, feval=None, init_model=None, keep_training_booster=False, callbacks=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) をクラスごとに出してくれるレポート
(スポンサーリンク)
コメント