今回は,分類タスクの代表的な評価指標であるROC曲線の解説とPythonで実装する方法をお伝えしていこうと思います。本記事はpython実践講座シリーズの内容になります。その他の記事は,こちらの「Python入門講座/実践講座まとめ」をご覧ください。
ROCの概要
ROC曲線(Receiver Operatorating Characteristic curve)は,受信者動作特性曲線とも呼ばれており,二値分類タスクの評価指標です。
具体的には,各データに対してスコアを定めて,ある閾値を上回るか下回るかで二値に識別するタスクにおいて,閾値を変化させることで「FPR」と「TPR」がどのように変化していくかを表した図がROC曲線になります。ROC曲線の横軸は「FPR」,縦軸は「TPR」になっています。
となりますよね。そこで,まずは機械学習全般に通ずる評価指標の話をお伝えしていきたいと思います。詳しくは,コチラの記事をご参照ください。(F値についてご存じの方は飛ばしてください)
上の記事をご覧いただいた前提で話を進めると,ROC曲線はモデルの出力スコアと正解ラベルが与えられたとき,閾値を変化させたときのFPRとTPRの関係を表した図になっています。
となりますよね。少し,分類問題の目的に立ち戻ってみましょう。分類問題では,機械学習モデルが出力したスコアを,「閾値を下回ったか,上回ったか」で「正か負か」を判断します。例えば,ニューラルネットワークのモデルを「患者がガンである確率値」を出力するように学習させた場合を考えます。このとき,単純にはニューラルネットワークの出力が0.5を上回っていれば「ガン陽性」,下回っていれば「ガン陰性」と判断することができます。
このように,閾値を変えることで陽性と判断される患者と陰性と判断される患者の数が変化していきます。このとき,「本当は陰性なのに陽性と判断された割合(FPR)」と「本当は陽性でしっかりと陽性と判断された場合」の関係性を図示したものがROC曲線です。
AUC
AUC(Area Under the Curve)は,ROC曲線の下側面積のことを指します。一般に,AUCは大きければ大きいほど良いとされています。なぜなら,AUCが1ということは,閾値を適切に定めれば「陽性と判断して陰性と間違う可能性がない」ことを意味します。いわば,テストデータの陽性に対して完ぺきな分類器が生成できていることを意味します。
逆に,AUCが0.5に近いということは,ランダムな分類器ができてしまっていることを意味します。陰性と陽性の出力をランダムにすれば,正解する割合も0.5であるため,AUCは0.5に近づくからです。
pythonでの実装例
ここでは,scikitlearnのライブラリを使ってROC曲線を描画する方法をお伝えしていこうと思います。
必要なライブラリのインポート
import numpy as np
from sklearn import metrics
スコアと正解ラベルのセット
y_score = np.random.rand(100)
y_true = (np.random.rand(100) < 0.7)*1
AUCの計算とROCの描画
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_score)
auc = metrics.auc(fpr, tpr)
plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc)
plt.legend()
plt.xlabel('FPR: False positive rate')
plt.ylabel('TPR: True positive rate')
plt.grid()
plt.show()
まとめ
本当は確率分布の図を用いながら,第一種の過誤などと絡めながら説明したいところでした。そこら辺の説明は「はじパタ」が詳しいので,ぜひ参考にしてみていただければと思います。