こんにちは!
データサイエンティストのウマたん(@statistics1012)です!
今回はROC曲線・AUCについて解説していきます。簡単な説明をすると、ROC曲線は縦軸に真陽性率、横軸に偽陽性率を取ったときのグラフとして描かれます。そしてAUCはグラフの下の部分の面積のことを指します!
この記事では、そんなROC曲線・AUCの定義と関係性について解説していきながらPythonで実装していきます!
・ROC曲線・AUCの定義について解説!
・ROC曲線・AUCの性質について解説!
・PythonでROC曲線・AUCを見てみよう!
以下のYoutube動画でも解説していますのでこちらもあわせてチェックしてみてください!
混同行列について解説!
それでは混同行列を解説していきます!
混同行列とは「元の教師ラベルと予測結果の2つを表した行列」と定義されています。
教師ラベルは元からサンプルについているラベル(正常・異常)を指します.そして予測結果はデータから推定されたラベル(正常・異常)を指します.したがって混同行列は2×2の行列を示していることが分かりますね!
このような混同行列は分類問題における様々な指標で用いられています!
今回はROC曲線で用いる真陽性率(TPR)、偽陽性率(FPR)を見ていきましょう!
真陽性率(TPR)とは全てのPositiveのうち,実際にPositiveだったものを正しくPositiveと判定した割合です。一方、偽陽性率(FPR)は全てのNegativeのうち、実際はNegativeだがPositiveと誤判定した割合です。
\(TPR\) = \(\frac{TP}{TP+FN}\)
\(FPR\) = \(\frac{FP}{FP+TN}\)
この真陽性率(TPR)・偽陽性率(FPR)はROC曲線で必ず必要な概念ですので、覚えておきましょう!
ROC曲線について解説!
次にROC曲線について解説していきます!ROC曲線とは縦軸が真陽性率(TPR)、横軸を(FPR)のグラフを指します.そして各軸の閾値を変化させたときに曲線が生成されます。
次にこの閾値を左にずらしてみると、実際はNegativeだけどPositiveと間違える割合FPが変化するので偽陽性率(FPR)も変化することが分かります。つまり閾値を変化させることで正常か異常かの判定が変わってしまうことになります!
これを踏まえると、ROC曲線は閾値によって変化した真陽性率(TPR)・偽陽性率(FPR)をプロットして線でつないだ曲線と言い換えることができます!
しかしこれだけだと本当に良い分類器かわかりませんので、ROC曲線から求められるAUCについて解説していきます!
AUCについて解説!
それではAUCについて解説していきます!
AUCはROC曲線の下の部分の面積と定義されています!まず初めに、なぜAUCが指標として用いられているか見ていきましょう!青の分布がNegative、オレンジ色の分布がPositive、緑の線(閾値)の右をPositiveと判定、左をNegativeと判定するとします。
例えばPositiveの分布とNegativeの分布は重なっていない場合を考えます。
この時、閾値がオレンジの分布に入った時、TPRは小さくなりますが、FPRはずっと0のままであることが考えられますね!何故ならNegativeは全てNegativeと予測しているのでFPは0だからです!
逆に閾値が青の分布に入ると、TPRはずっと1のままで、FPRは大きくなることが分かります!
したがって、このようなROC曲線となります。この時のAUCは1です!
一方、Positiveの分布とNegativeの分布が完全に重なった場合、閾値をどう動かしてもFPR、TPRは同じ値をとります!何故ならTP=FP、TN=FNとなるため、先程の式を見てみるとFPR=TPRとなりますね!
したがってROC曲線はこのようになります。この時のAUCは0.5となります。
つまりAUCは0.5~1.0の範囲において、PositiveとNegativeを綺麗に分けることができるなら1に近づき、ランダムに分けるなら0.5に近づく性質を持っています!
実際にROC曲線・AUCをPythonで実装してみよう!
実際にPythonで混同行列とROC曲線・AUCを実装して見ていきましょう!
混同行列はsklearn.metricsのconfusion_matrix関数、ROC曲線はsklearn.metricsのroc_curve関数、AUCはsklearn.metricsのauc関数を使って実装できます!
import numpy as np
from sklearn.metrics import roc_curve,confusion_matrix, auc
y_true = [0, 1, 0, 1, 0, 1, 1, 1, 1, 1]
y_pred = [0, 1, 1, 1, 1, 0, 0, 0, 1, 1]
y_score = [0.4, 0.3, 0.1, 0.7, 0.3, 0.2, 0.7, 0.5, 0.6, 0.4]
#混同行列は右下がTP,左上がTNなので注意!
mat = confusion_matrix(y_true, y_pred)
print("confusion_matrix:\n",mat)
roc = roc_curve(y_true, y_score)
fpr, tpr, thresholds = roc_curve(y_true, y_score)
auc = auc(fpr,tpr)
print("auc:{}".format(auc))
plt.plot(fpr, tpr, marker='o')
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.grid()
AUCを見てみると約0.8であり、優れた分類モデルであることが分かりますね!
このようにROC曲線・AUCを使うことで、精度に頼らず優れた分類モデルであるか判断できるところが利点であると考えられます!
ROC曲線・AUC まとめ
本記事ではROC曲線・AUCについてまとめました!
分類問題ではROC曲線・AUCやAccuracy(精度)を用いることがありますが、予測問題の場合決定係数やRMSEといった指標を用いることがあるため、問題の設定によって評価指標を適切に使い分ける必要があります!
そうしたデータサイエンスの力を身に付けるためにはスタビジの記事やスクールを活用すると良いでしょう。
そして僕の経験を詰め込んだデータサイエンス特化のスクール「スタアカ(スタビジアカデミー)」を運営していますので,興味のある方はぜひチェックしてみてください!
AIデータサイエンス特化スクール「スタアカ」
【価格】 | ライトプラン:1280円/月 プレミアムプラン:149,800円 |
---|---|
【オススメ度】 | |
【サポート体制】 | |
【受講形式】 | オンライン形式 |
【学習範囲】 | データサイエンスを網羅的に学ぶ 実践的なビジネスフレームワークを学ぶ SQLとPythonを組みあわせて実データを使った様々なワークを行う マーケティングの実行プラン策定 マーケティングとデータ分析の掛け合わせで集客マネタイズ |
データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「スタアカ」!!
当メディアが運営するスクールです。
24時間以内の質問対応と現役データサイエンティストによる複数回のメンタリングを実施します!
カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください!
他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。
そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解などもあわせて学べるボリューム満点のコースになっています!
Pythonが初めての人でも学べるようなカリキュラムしておりますので是非チェックしてみてください!
ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったり・Webサイト構築してデータ基盤構築してWebマーケ×データ分析実践してもらったりする盛りだくさんの内容になってます!
・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析
・世界最大手小売企業のウォルマートの実データを用いた需要予測
・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定
・Webサイト構築してデータ基盤構築してWebマーケ×データ分析実践して稼ぐ
データサイエンスに関する記事はこちら!
データサイエンスを勉強できるスクールやサイトは、ぜひこちらを参考にしてみてください!