##はじめに
こんにちは!
今回はクラス分類のために作ったモデルの精度が本当に良いものなのか調べるための概念を紹介したいと思います。
論文とまではいかないにせよ、研究結果をプレゼンで発表したい時などに使えますのでぜひチェックしてみてください。
AIに興味がある医学生や医師の方などにもぜひ読んでいただきたい記事となっています!
下手な絵ですみません。。。
ある病気を例にとって考えてみます。
イガイガしているのが病気で、笑顔なのが健康な状態だとしましょう。
この疾患の有無で2クラス分類した時に「これは病気だ」とAIが判断する確率を陽性率とすると、「真陽性率=AIが陽性と判断した中で本当に病気がある人の割合」、**「偽陽性率=本当に陰性の人をAIが陽性と判断した割合」**と定義できます。
#ROC曲線とAUC
では先ほどのモデルにおいて、陽性率が0.7以上のものを陽性とみなすとしましょう。
すると
このように赤い線で線引きができます。
ROC曲線とは**「この基準となる確率(pとする)以上のものを陽性とみなす」**という風に設定した場合の真陽性率を縦軸に、偽陽性率を横軸にとって点をプロットし、その基準となる確率を変えていくことでできる曲線です。
この場合、偽陽性率は1/4、真陽性率は2/3となるのでこんな点がプロットできます。
pが小さくなると縦軸も横軸も値が上昇するので点は右上に進んでいきます。
このAIの分類精度が高い時は縦軸の方が上昇が早いので、グラフは早い段階で右上に上昇していきます。
そのようにしてできた曲線の下の部分の面積を**AUC(Area Under Curve)**と言います。つまりは、AUCが大きいほどそのAIは優れた精度で分類ができていると言えるのです。
##AUCを自動計算
さて、ここまで読んでいただけた方は薄々気づいているかもしれませんが、AUCはどのように算出するのでしょうか?
手計算で積分?
いや、決してそんな面倒な手間はいりません
scikit-learnでチャチャッと求めてしまいましょう。
import numpy as np
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
#健康な状態を「0」、病気を「1」としてリストに格納
y = np.array([0,0,0,0,1,1,1])
#それぞれの陽性率もリストに格納
pred = np.array([0.1,0.2,0.3,0.8,0.5,0.7,0.9])
#AUCの出力
print(roc_auc_score(y, pred))
#ROC曲線の描出
roc = roc_curve(y,pred)
fpr, tpr, thresholds = roc_curve(y,pred)
plt.plot(fpr, tpr, marker='o')
plt.xlabel('FPR: False positive rate')
plt.ylabel('TPR: True positive rate')
plt.grid()
今回用いたデータで試すとこのようなコードになります。
実行すると、、、
こんなグラフがAUCとともに描出されるはずです!
AUCの最大値は1なので、0.8333...はまずまずかな?という精度です。
0.90を超えたあたりから優れたモデルと言えるのではないでしょうか。
##終わりに
いかがだったでしょうか?
このようにして簡単にAUCもROC曲線も求められますので、AIを開発したはいいけど結果のまとめ方に困っているなんて方はぜひ役立ててください!
最後に、医学生である僕が所属しているツカザキ病院眼科AIチームのページも見ていただけたら幸いです!ぜひご覧ください!
ツカザキ病院眼科AIチーム DeepOculus
僕が書いた記事もいくつかリンクを貼っておきます。
10分で分かるAIの歴史
プログラミングやディープラーニングの勉強、何から手をつければ良い!?
では、また次の記事で!