アカデミック

【超初心者向け】ROC曲線の解説とPythonでの実装例。

二値分類タスクを評価したい!
ROC?AUC?よく分からへんな…

 

今回は,分類タスクの代表的な評価指標であるROC曲線の解説とPythonで実装する方法をお伝えしていこうと思います。本記事はpython実践講座シリーズの内容になります。その他の記事は,こちらの「Python入門講座/実践講座まとめ」をご覧ください。

【超初心者向け】python入門講座/実践講座まとめ目次 入門講座 1.実行環境2.文字の出力3.データ型4.変数5.更新と変換6.比較演算子7.論理演算子8.条件分岐9.リスト10.辞...
コーディングに関して未熟な部分がたくさんあると思いますので,もし何かお気づきの方は教えていただけると幸いです。また,誤りについてもご指摘していただけると非常に助かります。

ROCの概要

ROC曲線(Receiver Operatorating Characteristic curve)は,受信者動作特性曲線とも呼ばれており,二値分類タスクの評価指標です。

第二次世界大戦中に米国のレーダー研究から生まれた概念らしいです。(出典:Receiver operating characteristic [wikipedia]

 

具体的には,各データに対してスコアを定めて,ある閾値を上回るか下回るかで二値に識別するタスクにおいて,閾値を変化させることで「FPR」「TPR」がどのように変化していくかを表した図がROC曲線になります。ROC曲線の横軸は「FPR」,縦軸は「TPR」になっています。

●TPR:モデルが正と判断して正解だった割合
●FPR:モデルが正と判断して不正解だった割合
ある二値分類タスクの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()
描画されたROC曲線

 

まとめ

本当は確率分布の図を用いながら,第一種の過誤などと絡めながら説明したいところでした。そこら辺の説明は「はじパタ」が詳しいので,ぜひ参考にしてみていただければと思います。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です