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) 
おすすめの記事