ゼッタノート

ゼッタが勉強したことをまとめたノート代わりのブログ。たまに日記になるかも。

パターン認識【第2回】

 かつてこれほどまでに更新間隔が短かったことがあったでしょうか、いやありませんでした。というわけで早速パターン認識の第2回記事です。今回は以前やったことあるベイズについてです。前回は単純ベイズのみのお話でしたが、今回はより深い内容となっています。

 ※注意!この記事は機械学習入門者が独自に調べ独自に解釈した内容により構成されているため、誤った記述が含まれている可能性があります。

最大事後確率基準に基づく識別規則

 まずは前々回の復習から。与えられたデータがどのクラスに属するかを判断する基準に、事後確率を見る方法があります。与えられたデータに対して、各クラスについて条件付き確率を計算して、一番確率が高かったクラスに属すると判断するものです。事後確率は式にすると以下のようになります。

p(C_{i}|\boldsymbol{x})=\frac{p(\boldsymbol{x}|C_{i})P(C_{i})}{p(\boldsymbol{x})}

 言葉で表すと、事後確率は尤度と周辺確率の比と事前確率の積で表される、となります。尤度と周辺確率の比を修正項と名付ければ、事後確率は事前確率を修正項で修正したもの、と考えることもできます。
 また、あるクラスC_iC_jがあって、その2つの識別境界は2つの事後確率p(C_i|\boldsymbol{x})p(C_j|\boldsymbol{x})が等しくなるところになります。以下の画像を見てもらえるとイメージしやすいのではないかと(マウス手書きクオリティで申し訳ない)

f:id:Zetta777:20190403152604p:plain
 2つのグラフの交点で値の大小が入れ替わります。なので、2つの値が等しくなる(交わる)点が識別境界となります。

最大事後確率基準の識別規則は誤り率が最小になる

 以前は、これがベイズのやり方なんだ、とそのまま受け入れていた事後確率による識別ですが、実はこの方法、とても良い面を持っていたんです。それは誤り率が最小であるということです。
 この方法での誤り率はどう算出すればよいか。分類する際、事後確率が高いほうに割り振るのですから、残りのクラスの事後確率分誤る可能性があります。2つのクラスC_iC_jに分類することを考えます。クラスC_iに識別される領域をR_iC_jに識別される領域をR_jとすると、誤り率は今までとは逆で、事後確率を計算した結果、常に値の小さいほうを取っていればよいことになるので、誤り率ε(\boldsymbol{x})

ε(\boldsymbol{x})=min[P(C_i|\boldsymbol{x}), P(C_j|\boldsymbol{x})]

 グラフで表すと以下のようになります。 f:id:Zetta777:20190403155643p:plain  赤い線が識別境界Θです。青色で塗りつぶしているところがC_iと判断すべきところをC_jと判断してしまった部分、オレンジ色で塗りつぶしたところがC_jと判断すべきところをC_iと判断してしまった部分です。誤り率は青色部分とオレンジ色部分の面積の和、ということになります。ここで、ほんの少しでも識別境界を動かしてみる(灰色部分)と、必ず面積が大きくなります。よって、最大事後確率基準の識別規則は誤り率が最小になります。また、これは事後確率基準のみでなく、次に説明する最小損失基準の場合も当てはまります。

最小損失基準に基づく識別規則

 実はベイズの識別規則は事後確率基準だけじゃなかったんです!知らなかった...どうやら最小損失基準なるものが存在するようです。例えば検査をして病気か健康かを判断するとき、健康な人を病気と判定するより、病気の人を健康と判定するほうがまずいですよね。そこで、前者より後者のほうが損失が大きいと考えます。この規則は損失が小さいクラスに割り振ります。真のクラスjのデータをクラスiに割り振った時の損失をL_{ij}とすると、観測データ\boldsymbol{x}をクラスC_iに割り振った時の損失r(C_i|\boldsymbol{x})

r(C_i|\boldsymbol{x})=\sum_{k=1}^{K}L_{ij}P(C_k|\boldsymbol{x})

 この式を全てのクラスについて計算して、一番損失が小さいクラスにデータを割り振ります。なお、事後確率基準の識別境界と最小損失基準の識別境界は異なるので注意してください。

リジェクト

 話を事後確率基準の識別規則に戻します。条件付きベイズ誤り率は先ほど述べた通り

ε(\boldsymbol{x})=min[P(C_i|\boldsymbol{x}), P(C_j|\boldsymbol{x})]

で表されます。事後確率基準の識別規則の場合、一番確率が高くなったクラスに分類するわけですが、一方でほかのクラスと僅差だった場合、そのまま分類するのはちょっと危ういと思いませんか?例えば2つのクラスに分類するとき、Aというクラスでは51%で、Bというクラスでは49%だった場合、果たしてAクラスに分類してしまってもよいのでしょうか。その点を考慮したものがリジェクトとなります。これはある値tを定めて、誤り率がtよりも大きかった場合、データがどこに属するかの判断を避けるというものです。そうすることで、判断しかねるデータに関して学習することを避けることができ、誤った方向に学習が進むのを防ぐことができます。また、以下のような式が書いてありました。

一般に、K個のクラスがある場合、リジェクトを含めた識別規則は {} $$ 識別クラス = \left\{ \begin{array}{} C_i\Leftarrow P(C_i|\boldsymbol{x})= \max_j P(C_j|\boldsymbol{x})>1-tの場合 \\ リジェクト \Leftarrow すべてのクラスについてP(C_i|\boldsymbol{x}) \leqq 1-tの場合 \end{array} \right. $$ とする。

ここでちょっと理解が止まったんですが、誤り率がt以上でリジェクトするということは、一番確からしいクラスに分類される確率は1-tとなるので、識別クラスの判断は上のようになります。誤り率を見てるのか一番確からしいものを見ているのかが反転していたので気を付けましょう。

ROC曲線

 ROC曲線とは識別性能の指標です。事後確率基準の識別規則で示した誤り率で性能を評価しようとしても、事前確率や尤度を知っておかなければ使えません。一方ROC曲線はそれらが必要ない上、クラスごとのデータ量に差があっても影響を受けないという利点があります。どういうことかというと、病気の人のデータより健康な人のデータのほうが圧倒的に多いという状況では、どんな人に対しても健康であると判断しておけば誤り率は小さくなりますが、そんな識別器は使えませんよね。そのような状況でも対応できるのがROC曲線の良いところです。また、次のサイトが分かりやすかったので、本を読んでもいまいち理解できなかった方は読んでみるといいかもしれません。
【ROC曲線とAUC】機械学習の評価指標についての基礎講座

前提知識

 ROC曲線に触れる前にいくつか用語を紹介しておきます。2つのクラス、p*(陽性)・n*(陰性)に分類する場合を考えます。*がついているのがそのデータの真のクラス、ついていないものが識別器が分類したクラスとします。あるデータをp・nに分類したとき、そのデータの真のクラスがp*かn*かで以下のように種類分けされます。 f:id:Zetta777:20190404114251p:plain
これにより、以下のような値を考えることができます。
真に陽性のデータ数 P = TP + FN
真に陰性のデータ数 N = FP + TN
 それぞれ真に陽性のデータ数と陰性のデータ数です。

偽陽性率 = \frac{FP}{N}
真陽性率 = \frac{TP}{P}
 偽陽性率は本当は陰性なのに陽性と判断したものの割合、真陽性率は実際に陽性だったもののうち、陽性と判断できたものの割合です。


適合率 = \frac{TP}{TP+FP}
 真と判断したもののうち、実際に陽性だったものの割合です。ネット検索を例に言うと、検索して出てきたページの内(真と判断したもののうち)、要求していたものと合致するサイト(実際に陽性だったもの)の割合となります。


再現率 = \frac{TP}{P}
 真に陽性のもののうち、真と判断できたものの割合です。式で見ると真陽性率と同じですが、実際は異なります。ネット検索をするとき、Pは「ユーザーが欲しがっている全ページ」となりますが、ネット上に何ページあるか、それは到底数えられるものではありません。再現率のPにはその推定値が入ります。一方真陽性率のPは推定値ではなく実際の値が入ります。


正確度 = \frac{TP+TN}{P+N}
どれだけ正しく識別できたかを表します。

 さて、再現率と適合率の間にはトレードオフが存在します。適合率を上げるためには、誤り(FP)を減らす必要があります。そのためにネット検索で出てくるページを減らそうとすると、欲しかったページが出てこなくなるので、再現率が小さくなります(Pが減るため)。そこで両者の調和平均を取ったF-値というものがあります。調和平均とは逆数の平均の逆数です。 F-値 = \frac{2}{\frac{1}{適合率}+\frac{1}{再現率}}

本題

 いろいろな値を書いてきましたが、これからの話で使っていくのは偽陽性率と真陽性率のみです。曲線、というぐらいですからグラフにプロットするわけですが、x軸に偽陽性率を、y軸に真陽性率を取ります。最初に陽性と陰性のデータ数に影響を受けないと書きましたが、偽陽性率も真陽性率も共に、真に陽・陰なものの中での割合なので、陽と陰のデータ数の比に影響を受けません。ROC曲線を描く場合は以下のように偽陽性率と真陽性率の面積比を表していると思ってよいでしょう。 左側の山が真に陽なデータの尤度、右側の山が真に陰なデータの尤度、真ん中に引いたオレンジ色の線が識別境界です。 f:id:Zetta777:20190404123404p:plain
 これを端から端まで動かしたときの偽陽性率と真陽性率をグラフにします。左端を識別境界にするとどのデータも陽と判断することがないため真陽性率0、偽陽性率0の原点となります。右端を識別境界にすると、どのデータも陽と判断するため、偽陽性率1、真陽性率1となり、それ以外の場所だとその間の値をとるようになります。
 ではこのグラフをどのように利用するのでしょうか。ROC曲線は偽陽性率と真陽性率の面積比と考えることができるので、2つのグラフの重なりが少ないほどグラフは左上方向にシフトします。また閾値を下げて真陽性率が小さくなることはないので、グラフが右に行くほど下がる、ということもありません。なのでROC曲線と偽陽性率軸との面積比で性能を比べます。これをROC曲線下面積、またはAUCと言います。完全な識別機の場合、曲線は(0,0)から(0,1)を通り、(1,1)を結ぶ直線となるので、AUCは1となります。2つの山が完全に分かれている場合がそれになります。原点と(1,1)を結んだ45度の直線はランダムな識別機となり、AUCは0.5となります。先ほどのグラフで2つが完全に重なっている場合がそれになります。AUCは0.5から1の間の値を取り、値が大きいほど性能が良いということになります。
 性能の比較のやり方はこれでわかりました。次に、良さそうな識別器ができたとして、識別境界をどこに定めるか(真陽性率と偽陽性率の組み合わせ、動作点)が問題になります。ここで先ほど示した損失の式を再度示します。

r(C_i|\boldsymbol{x})=\sum_{k=1}^{K}L_{ij}P(C_k|\boldsymbol{x})

これをクラスが2つの場合に限って話をすると、正しく識別できた場合の損失を0とすると、式は以下のようになります。

 r = L_{12}P(n*) ε_2+L_{21}P(p*) ε_1

どのような展開をしているかははじめてのパターン認識を参考にしてください。 ε_xはxの誤り確率です。これを、ROC曲線に合わせて1-ε_1 = αε_2+βの形にしましょう。1-ε_1は真陽性率です。クラス1(真に陽)からクラス1の誤り確率を引くと真陽性率となります。式を変形すると以下のようになります。

1-ε_1=\frac{L_{12}P(n*)}{L_{21}P(p*)}ε_2+ (1-\frac{r}{L_{21}P(p*)})=αε_2+h(r)

 これを損失rを変えながらROC曲線にプロットしていって、曲線と接したところが動作点となります。


 以上でパターン認識第2回終了です。以前単純ベイズをやっていたおかげで勉強がしやすかったので、勉強していってるなという感覚があってちょっとうれしかったです。次回のページをぱらぱらっとめくってみたのですが、どうやらかなり数学に寄ったお話っぽい...数式が多めになるかもしれませんね。
 それではまた次回お会いしましょう。