matplotlibでROC曲線を描画する(2. データ準備編)
ROC曲線をpython3で描画したいと思ったときに,用意すればいいもの,コード,を説明する.今回は何をimport し, これの入力はなにか,を説明する.
1つの記事を大きくするするのは可読性が低くなるので分割する.
全体の流れ(今回は1)
1,2のサンプルコードは次の通り
イメージは次の通り
from sklearn.metrics import roc_curve <--(1で説明済) from sklearn.metrics import auc <--(1で説明済) y_true = [用意してあげる] <--(今回はここを説明する) y_score = [用意してあげる] <--(今回はここを説明する) fpr, tpr, th = roc_curve(y_true, y_score) <--(1で説明済) auc_value = auc(fpr, tpr) <--(1で説明済) (描画:3で説明する)
用意するデータとは
y_trueとy_scoreはそれぞれ,次に例を挙げる.
y_true | y_score |
---|---|
0 | 1.0 |
0 | 1.5 |
0 | 1.3 |
.. | ... |
1 | 1.6 |
1 | 1.9 |
1 | 2.2 |
1 | 0.3 |
これを見てわかるように, y_true
はラベルであり, y_score
は何らかのスコアを表している.
y_scoreは対数尤度であったり, 再構成誤差であったり,確率であったりと様々だ.
用意するデータの形
y_true, y_scoreはそれぞれドキュメントで
array, shape = [n_samples]
と型と大きさを教えてくれている.ここでは, array型であり, 大きさは[サンプル数]分用意してくれ,とのこと.
前の例だと,行数を長さn_sampleをすると,
y_true | y_score |
---|---|
0 | 1.0 |
0 | 1.5 |
0 | 1.3 |
.. | ... |
1 | 1.6 |
1 | 1.9 |
1 | 2.2 |
1 | 0.3 |
を
y_true.shape = (n_sample, ) y_score.shape = (n_sample, )
となる. ゴールとなるのは,
y_true = np.array([ ...., ..., ...., ]) y_score = np.array([..., ..., ..., )
サンプルコードをみていただけるとわかると思うが,
ROCで評価しようとするときに, 最初からy_trueの形で得られるわけではない. ラベルごとに分けて計算しているケースが多いだろう.
zero_samples = np.array((.......)) one_samples = np.array((.......)) def calc_score(i_data); return hoge_scoring(data) _y_zero_score = np.asarray([calc_score(i) for i in zero_samples]) _y_one_score = np.asarray([calc_score(i) for i in one_samples])
こんな感じでラベル毎にスコアを計算することになると思う. これを連結しなければy_scoreになりえないので, 連結作業を行う. ここが一番こけやすい.
np.concatenate([_y_zero_score, _y_one_score], axis=0)
np.concatenate()を使って,連結する.
np.concatenate([連結したいもの, 連結したいもの, 連結したいもの, ....], axis=[0か1]) のように使う. これを使って,y_scoreを用意しよう.
次はy_trueはラベルの情報で, 最初に用意していない場合はある. そのときは,
_zero = np.zeros(_y_zero_score.shape[0]) _one = np.ones(_y_one_score.shape[0])
を使ってあげる.これを,np.concatenateを使って連結する.結合するラベルの順番(ゼロ,イチの順番で結合するのか, イチ,ゼロの順番で結合するのか)に注意する.
以上により, データ準備が終わった.
はてぶにコードをベタ打ちして書くより,jupyter notebookにたくさん書くほうがよさそうに思えてきた.実行結果が見える形のほうがわかりやすいだろうし.