2023/10/25時点でのgoogle colabのバージョンでのlightgbmベースコードメモです。
githubにも同じコード置いてあります
今回blog作成のモチベーションは以下。
- lightgbmのタスクを直近で色々試す必要があった
- earlystopping、verbose_evalなどのパラメータの指定方法がコールバック関数に変更されたようでWEB上でサクッと試せるサンプルコードを見つけられなかった
- 上記変更コードを含めたサンプルをWEB上に残したかった
モジュールのインストール
!pip install shap
ライブラリのインポート
# 内容に応じて適宜追加変更 import lightgbm as lgb from sklearn import datasets from sklearn.model_selection import train_test_split import numpy as np import pandas as pd import shap pd.set_option('display.max_rows', 100) from sklearn import metrics import matplotlib.pyplot as plt %matplotlib inline
データの準備(sklearnのdatasetsからbreast_cancerを取得)
## ここは実務で使うデータを読み込んでpandasDataFrameに変換すればOK # X: 説明変数 # y: 目的変数(2値分類なので、 0 と 1 にする) # Breast Cancer をsklearnのdatasetsから読み込む bc = datasets.load_breast_cancer() X = pd.DataFrame(bc.data, columns=bc.feature_names) # 説明変数を設定 y = pd.DataFrame(bc.target) # 目的変数を設定 # 件数と項目数の確認 print(X.shape) print(y.shape)
モデルの学習と保存
# 訓練データとテストデータに分割する X_train, X_test, y_train, y_test = train_test_split(X, y) # lightgbm用のデータセットを生成する lgb_train = lgb.Dataset(X_train, y_train) lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train) # LightGBM のハイパーパラメータ params = { 'objective': 'binary', 'metric': 'binary_logloss', 'boosting_type': 'gbdt', 'learning_rate': 0.05, 'verbosity': -1 } # モデルの学習 vervose_evel = 20 # ここで学習時のスコア推移がコマンドライン表示(-1:最終行の表示, 0:表示なし, 1:1行ずつ表示, 20:20行ずつ表示) model = lgb.train(params, lgb_train, valid_sets=lgb_eval, callbacks=[lgb.early_stopping(stopping_rounds=10, verbose=True), # early_stopping用コールバック関数 lgb.log_evaluation(vervose_evel)] # コマンドライン出力用コールバック関数 ) # モデルの保存 model.save_model('model.txt')
モデルを使った予測と評価
# テストデータを使って予測する y_pred = model.predict(X_test, num_iteration=model.best_iteration) # AUC (Area Under the Curve) を計算する fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred) auc = metrics.auc(fpr, tpr) print(f'AUC: {auc}') # ROC曲線をプロット plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc) plt.legend() plt.title('ROC curve') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.grid(True)
モデルで算出された変数重要度を可視化
# 特徴量の重要度を棒グラフで可視化(max_num_featuresで重要度の高い10項目のみ出力) lgb.plot_importance(model, max_num_features=10)
shapで目的変数への項目毎の寄与度を確認
# shap値を使用して、各説明変数の重要度や寄与度を可視化 explainer = shap.Explainer(model, X_test) shap_values = explainer(X_test) # summary_plotのmax_displayで寄与度の高い10項目まで出力) shap.summary_plot(shap_values, X_test, max_display=10) print('--') shap.summary_plot(shap_values, X_test, plot_type='bar', max_display=10)