人工知能してみる

人工知能の中の人が機械学習とか統計とかAI的なことを書き連ねます

ROC曲線とAUC

機械学習や統計の評価指標は多々ありますが、その中でも基本になるROC曲線とAUCについて説明します。

TL;DR

Q: ROC曲線とは?
A: 横軸に偽陽性、縦軸に真陽性をとったグラフです

Q: AUCとは?
A: ROC曲線の右下側の面積です

ROC曲線とAUC

ある2値分類問題を考えてみます。モデルより得られた確率に対して閾値を設定することでPositive / Negativeを判断できます。このとき、真値のTrue / Falseと予測値のPositive / Negativeによって4つの割合が計算できます。このうちROC曲線では偽陽性と真陽性を使います。

f:id:Grahamian:20180509224551p:plain

閾値を移動させながらPositive / Negativeを判別していくことを考えます。そうすると閾値が0のときは全てNegativeに判断するので偽陽性は0になります。ここから閾値を増加させていくと偽陽性と真陽性が増加していきます。そして閾値が1となったとき全てPositiveと判断するので偽陽性は1になります。モデルの識別能力が高ければ左上に凸のグラフになりますが、識別能力が低ければグラフは対角線上に近づきます。このとき、ROC曲線の右下側の領域の面積がAUC: Area Under Curveとなります。

f:id:Grahamian:20180509230515p:plain

なぜROC曲線やAUCを使うのか?

ROC曲線を使うことでTrue / Falseのデータに偏りがあっても適切に評価することができます。例えばTrue : False = 8:2だとすると全てPositiveとするだけでAccuracy = 0.8となってしまいますが、Falseを識別できていないため偽陽性は0になりAUCは低い値を示します。このように偏りがあっても実際的な判断ができるためサンプルに偏りが発生しやすい医療や金融の分野では定番で使われる指標です。

AUCの計算方法

AUCを計算するだけならばPythonでもscikit-learnで簡単に算出することができます。このとき y_true は真偽値 0 / 1 のnumpy行列で y_scores はスコア(確率)0 ~ 1 のnumpy行列になります。ちなみにROC曲線の描写は面倒です。適当なライブラリも見つからなったので自力で実装するか、データ数が少ないならばスプレッドシートで計算した方が早そうです。

from sklearn.metrics import roc_auc_score
roc_auc_score(y_true, y_scores)

sklearn.metrics.roc_auc_score — scikit-learn 0.19.1 documentation

ジニ係数とAR値、AUCの関係

よく使われる指標としてジニ係数やAR値があるのですが、実はAUCと比例関係にあり 2 × AUC - 1 で示される同じものを見た指標です。金融ではARもAUCもジニ係数も使われますがどれを使ってもよさそうです。 ジニ係数とAUCの関係を説明します。AUCはグラフのうち凸曲線の右側の面積と言いましたが、このとき対角線より右側の面積は常に含まれます。そのため対角線より右側の面積0.5を除くことで曲線と対角線の間にある面積を算出できます。ジニ係数はこの曲線と対角線の間の面積の2倍なのでAUCからジニ係数を導出できます。

AR値とAUCの関係を説明します。ROC曲線に似たグラフとしてCAP曲線というものがあり、この曲線の右下の値をAR値と呼びます。CAP曲線は横軸に確率、縦軸に真値の累計をとります。つまり確率が低い順に並べて真である要素の累積を順番に数えていきプロットするだけです。実はROC曲線とCAP曲線はほぼおなじ形になります。このCAP曲線を使って計算するのがAR値ですが、定義はジニ係数と同じなのでやはりAUCからAR値は導出されます。

補足

上記の説明で分かりにくい場合は、こちらのQiita記事はアニメーションを使って説明していますのでより分かりやすいかもしれません。

https://qiita.com/kenmatsu4/items/550b38f4fa31e9af6f4fqiita.com