前回は、ナイーブベイズ分類器という
機械学習の分類を行うアルゴリズムを紹介した。
で、方法を解説したのだが、
これがどの程度正しく推測できているか
が気になるところだ。
というわけで、今回はこの
分類器の評価方法を解説していこう。
ちょっとサンプルソースも作ってみたので、
後で紹介しよう。
なお、本講座は以下の本を参考に進めている。
もしよかったら、中身を覗いてみて欲しい。
分類器の評価方法
早速だが、内容に入っていこう。
混同行列と評価値
正解ラベルとセットになっているデータについて、
特徴ベクトルのみを入力し、
想定している正解ラベルが得られるか
を確認することになる。
この、評価に用いるデータのことを、
そのままテストデータと呼ぶ。
で、これによって混同行列と
呼ばれる表を作成する。
イメージは以下のようなものだ。
正解 | |||||
ラベル1 | ラベル2 | … | ラベルn | ||
出力 | ラベル1 | ||||
ラベル2 | |||||
… | |||||
ラベルn |
…ちょっと色が変なのは気にしないで欲しい。
これは、例えば正解ラベルが1で、
出力されたラベルも1だったら、
一番左上にカウントされる、という書き方をする。
もちろん、正解と出力が一致していた方がいいので、
左上から右下に向かう対角線上に集まるのが望ましい、
ということになる。
ここから、いくつかの数値を出し、
それを評価していく。
まず、正解率。
これは非常に単純で、全テストデータのうち、
推測が正しいデータ数の割合を指す。
$$正解率 = \frac{推測が正しいテストデータ数}{全テストデータ数}$$
その他、特定のラベル\(c\)に着目した
適合率、再現率、F値という値も求めることができる。
$$適合率 = \frac{正解ラベルcを正しく推測したテストデータ数}{ラベルcが出力されたテストデータ数}$$
$$再現率 = \frac{正解ラベルcを正しく推測したテストデータ数}{正解ラベルがcであるテストデータ数}$$
$$F値 = \frac{2 \times 適合率 \times 再現率}{適合率 + 再現率}$$
テスト方法
テストの方法には、大きく二つある。
一つは、学習データ、あるいはその一部を
用いて評価するクローズドテスト。
こちらは、100%まではいかなくとも、
ある程度高い精度が得られることが多い。
そもそも、学習に使ったデータなので、
高くなって当然だろう。
それに対し、学習データと異なるデータを使って
評価するのをオープンテストという。
メインは、このオープンテストを使う。
で、いちいちこれら用のデータを用意するのではなく、
用意したデータを学習データ、テストデータに分類して
繰り返し学習と評価を行う交差確認法という手法もある。
これは、オープンテストの一種と考えることができるだろう。
まず、全部のデータを\(k\)等分する。
そして、ある1塊のデータをテストデータ、
残りの\(k-1\)塊を学習データとし、
学習と評価を行う。
これを、テストデータとする塊を変えながら全部行い、
最終的に得られた評価結果の平均を用いるのだ。
サンプル作ったよ
ここまで、色々と説明してきた。
折角勉強したのだ、何か作ってみよう。
というわけで、これまで解説した
ナイーブベイズ分類器を、JavaScriptで実装してみた。
ソースコードのリファクタリングや見た目の調整は
まだしていないが、公開してみよう。
以下のページだ。
ここでは、一番上に学習・テストデータを入力する。
入力は一行が一つのデータ。
コンマ区切りで、一つ目に正解ラベル、
二つ目以降に特徴量を入れる。
例えば、前回例に出したデータなら、
以下の入力で再現できる。
1,1,1,0,0,0,0,0
2,1,1,1,0,0,0,1
1,1,1,0,1,0,0,0
1,1,1,1,1,1,1,0
1,1,1,1,0,0,0,0
2,1,0,0,1,0,0,0
1,1,1,1,1,1,1,0
2,0,0,0,0,0,0,1
1,1,1,0,0,1,0,0
2,0,1,0,0,0,0,1
2,0,0,1,1,0,0,1
1,1,1,1,1,0,0,0
1,0,0,1,1,1,1,0
1,0,0,0,1,1,1,0
2,0,1,1,1,0,0,0
2,0,0,0,1,0,0,1
2,0,0,0,1,0,0,1
2,0,0,0,1,0,0,0
2,0,0,0,1,1,1,1
1,0,0,0,1,1,1,0
で、ハイパーパラメータ\(\alpha\)も
ここから入力できるようにした。
概定値は1、0.1刻みで入力できる。
で、「データ入力」ボタンを押すと、
入力を解析して、データに落とし込む。
まずはこのボタンを押してほしい。
上手く読み込めると、
読み込んだ内容をテーブルに出力する。
そうしたら、「学習開始」ボタンを押すことで、
最後以外のデータを学習データとして学習、
最後のデータを実際に分類する。
さらに、「評価開始」ボタンを押すと、
2個ずつのデータに分けて
交差確認法で混同行列を作り出す。
各評価値を計算してみよう
では、このサンプルを使って混同行列を作り、
実際に評価をしてみよう。
サンプルデータは上に貼ったものにしよう。
また、\(\alpha\)は1とする。
これを実行すると、以下の混同行列が得られる。
正解ラベル1 | 正解ラベル2 | |
出力ラベル1 | 9 | 2 |
出力ラベル2 | 1 | 8 |
まずは正解率から。
全データは20個、
うち正解と出力が合致しているものは17個なので、
$$\frac{17}{20} = 0.85$$
というわけで85%という数値が出てきた。
次に、ラベル1について
適合率、再現率、F値をそれぞれ求めてみよう。
それぞれの求め方は以下の通りだった。
$$適合率 = \frac{正解ラベルcを正しく推測したテストデータ数}{ラベルcが出力されたテストデータ数}$$
$$再現率 = \frac{正解ラベルcを正しく推測したテストデータ数}{正解ラベルがcであるテストデータ数}$$
$$F値 = \frac{2 \times 適合率 \times 再現率}{適合率 + 再現率}$$
まず、適合率。
$$\frac{9}{9 + 2} = \frac{9}{11} \sim 0.818$$
約82%だ。
次に、再現率。
$$\frac{9}{9 + 1} = \frac{9}{10} = 0.9$$
キリよく90%。
最後に、F値。
$$\frac{2 \times \frac{9}{11} \times \frac{9}{10}}{\frac{9}{11} + \frac{9}{10}} \sim 0.857$$
というわけで、86%となった。
なお、参考図書にはこれらの数値が
どの程度ならいいのか、という指標は
今のところ記載がない。
もし分かったら、ここに追記するとしよう。
おわりに
ようやく、一つの分類器に関して
一通りの解説が終わった。
だが、これで最も簡単らしい。
…実際、本で一個次に出てくる
SVMという分類器で今手こずっている。
もしかしたら、厳密な議論は抜きに概要だけ説明し、
あとは使えるツールを紹介する程度に
留めるかもしれない。
で、次回なのだが…
このあたりを一回すっ飛ばして、
テキスト解析の話に入ろう。
メインは自然言語処理なのだ、
あまりここに時間をかけてもしょうがない。
残りの機械学習パートは、
必要になったら、あるいは理解できたら続けるとしよう。
コメント