📈
LightGBM (scikit-learn API) で ROC 曲線を描く
前文
注意
- これはメモである。正確性を保証しない。
環境とライブラリの前提
- 環境: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_pred
は X_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)
結果は次のようになる。
ここでは 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
などのメソッドから計算したものを与える。
参考
- sklearn.metrics.roc_curve — scikit-learn 1.3.2 documentation
- python - Why does roc_curve return only 3 values? - Stack Overflow
-
もし二値的な予想を与えると三点しか出力されない曲線が出来上がったりする。 ↩︎
Discussion