強弱と高低

Python3をメインに

matplotlibでROC曲線を描画する(2. データ準備編)

ROC曲線をpython3で描画したいと思ったときに,用意すればいいもの,コード,を説明する.今回は何をimport し, これの入力はなにか,を説明する.

1つの記事を大きくするするのは可読性が低くなるので分割する.

全体の流れ(今回は1)

  1. ROCやAUCを描画・計算するためのライブラリをimport する
  2. ROCを描画できるようにデータを用意する
  3. matplotlibでROC曲線を描画する

1,2のサンプルコードは次の通り

github.com

イメージは次の通り

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にたくさん書くほうがよさそうに思えてきた.実行結果が見える形のほうがわかりやすいだろうし.