📈

LightGBM (scikit-learn API) で ROC 曲線を描く

2023/10/26に公開

前文

注意

  • これはメモである。正確性を保証しない。

環境とライブラリの前提

  • 環境:WSL + mamba
  • ライブラリ:scikit-learn, lightgbm, seaborn
  • LightGBM は scikit-learn API から呼び出す。

本編

モデルの準備と予想

(X_train, y_train)と (X_test, y_test) はそれぞれ学習と検証に用いる説明変数と目的変数のデータセットである。その他の詳細は割愛する。

import lightgbm as lgb

model = lgb.LGBMClassifier(...)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

ここで y_predX_test のデータに基づいた二値(0 | 1)の予想結果とする。y_pred は ROC 曲線の描画には直接用いないが、AUC の計算に用いるためここで計算する。

ROC 曲線の描画

from sklearn.metrics import roc_auc_score, roc_curve
import seaborn as sns
sns.set_style("whitegrid")

prob = model.predict_proba(X_test)[:, 1]
fpr, tpr, threshold = roc_curve(y_test, prob)
auc = roc_auc_score(y_test, y_pred)

sns.lineplot(x=fpr, y=tpr, label=f"AUC = {auc}", estimator=None)
sns.scatterplot(x=fpr, y=tpr)

結果は次のようになる。
ROC Curve

ここでは Seaborn で ROC 曲線本体と各地点の散布図を合成したものを出力している。

付記

描画するときの注意事項

sklearn.metrics.roc_curve によれば、roc_curve の第二引数に与える値は次の制約がある。

y_score : array-like of shape (n_samples,)
Target scores, can either be probability estimates of the positive class, confidence values, or non-thresholded measure of decisions (as returned by “decision_function” on some classifiers).

つまり第二引数(y_score)には二値的な予想を与えてはならず、確率的な予想を与えなければならない[1]。なお、私はこのあたりがよく分かっていないため、多くは言及しない。

前述を理由として、ROC 曲線を描画する際は y_score として LGBMClassifier.predict_proba などのメソッドから計算したものを与える。

参考

脚注
  1. もし二値的な予想を与えると三点しか出力されない曲線が出来上がったりする。 ↩︎

Discussion