sklearn を使わずに実装して理解する ROC 曲線 & PR 曲線 【機械学習】

分類問題の評価指標で出てくる ROC曲線や PR 曲線、初めて見た時からなかなか理解しづらく、これってなんなの?と思ったまま避けていました。

sklearn で用意されているメソッドを用いるとかんたんに描けたりはするのですが、あえて使わずにこれらカーブを描いてみて、理解してみようと思います。

 

おしながき

・データの用意

・ロジスティック回帰で予測

・sklearn のメソッドで曲線を書く

・使わずに曲線を書く

・PR 曲線も同様

データの用意

 

今回は、Kaggle のクレジットカードのデータセットを使わせてもらいます。

こちらから creditcard.csv をダウンロードして使わせてもらいます。

https://www.kaggle.com/mlg-ulb/creditcardfraud

欠損値がなく、カテゴリカル変数もないきれいなデータで扱いやすいです。

前処理で標準化を施しつつ、テストデータと訓練データに分けるところまで。

 

ロジスティック回帰で予測

 

ロジスティック回帰で学習して推論します。予測確率を使用するため。model.predict ではなく、 model.predict_proba を用います。

 

sklearn のメソッドで曲線を書く

まずは ROC曲線から見ていきます。

ROC曲線は、予測の閾値を動かしていった時の FPR (False Positive Rate) と TPR(True Positive Rate)の関係をプロットしたものです。

FPR は 異常でないもの全体の中でを、間違って異常だと言ってしまった割合(コスト)

TPR は 異常なもの全体の中で、異常を見つけることができた割合(ベネフィット)

です。両方合わせて分母ですべてのクラスをカバーしています。

予測の閾値とは、モデルが出力してくれた予測確率がたとえば 0.35 であった場合に、それをラベル 0 とするのか ラベル 1 とするのか決める際の基準です。仮に閾値が 0.5 であれば、この例ではラベル 0 と最終的に決めることになります。一方で、閾値を下げて、0.2 とすればこのサンプルはラベル 1 に属します。

 

roc_curve メソッドで、閾値ごとの FPR と TPR を取得することができます。

 

使わずに曲線を書く

 

では、先程のメソッドを用いずに曲線を書いてみます!

まずは TPR と FPR の定義を確認です。

TPR = TP / (TP + FN)

FPR = FP / (FP + TN)

※ TP, FP, TN, FN は以下のように考えると覚えやすい

・TP は Positive(1) と予測して正解(True)だった数

・FP は Positive(1)と予測して間違い(False)だった数

・TN は Negative(0)と予測して正解(True)だった数

・FN は Negative(0)と予測して間違い(False)だった数

まずは確率と正解ラベルを横に並べます。閾値を 0 ~ 1 まで 0.1 刻みで動かした TPR, FPR をもとめてリストに入れます。

プロットをしてみると、

あれ、なんか違う・・。もっと閾値を細かく刻まないと行けないようですね。今度は 50000 回刻むことにします。

いい感じになりました!次は PR曲線です。

 

PR 曲線も同様

PR 曲線は、Precison Recall Curve という名前の通り、Precison と Recall を縦軸横軸にとって、閾値を動かしたときの両者の関係性をプロットしたものです。

こちらも定義を見ておくと、以下のようになっています。

Precision = TP / (TP + FP)

Recall = TP / (TP + FN)

Precision は 異常だと言った中で実際に異常だった割合(”間違わずに”言い当てられたね、という割合。)

Recall は、TPR と定義が一緒で、異常なもの全体の中で、異常を見つけることができた割合(ちゃんと”見逃さずに”検出できたね、という割合。)です。

ROC 曲線と同じように実装できます。

sklearn を使う場合

sklearn を使わない場合

 

 

・・ちょっとだけわかったような気がしました。最後まで読んでいただきありがとうございました。