MENU

    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をコピーしました!

    コメント

    コメントする

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

    目次