条件付き確率:「陽性だった人のうち」を考える
問題:検査で陽性なら、本当に病気なのか
ある病気の検査について、次のことが分かっているとします(説明のための仮の数値で、特定の病気や検査を指すものではありません)。
- この病気の人は、100人に1人(1%)
- 病気の人が検査を受けると、99%が陽性になる
- 病気でない人が検査を受けても、5%が陽性になってしまう
ある人が検査で陽性になりました。この人が本当に病気である確率は、どれくらいでしょうか。「99%の人が陽性になる検査だから、99%くらい」と考えたくなりますが、実際に数えてみましょう。
1万人で数える
1万人が検査を受けたとします。
- 病気の人は1万人の1%で100人。そのうち99%の99人が陽性
- 病気でない人は9900人。そのうち5%の495人が陽性
陽性になった人は、99 + 495 = 594人 です。そのうち、本当に病気なのは99人だけなので、陽性の人が病気である確率は次のとおりです。
59499≈0.167
約17%、6人に1人です。陽性になった人の大半(495人)は、病気でない人でした。病気でない人がとても多いので、その5%の誤りでも、病気の人の数を大きく上回ってしまうのです。
条件付き確率
「陽性だった人 のうち、病気である確率」のように、ある条件の下で考える確率を 条件付き確率 と呼び、次のように書きます。
P(病気∣陽性)=59499≈0.167
縦の棒 ∣ の右側が「条件」で、「陽性だと分かったとき、病気である確率」と読みます。注意したいのは、条件と結果を入れ替えると、まったく違う確率になる ことです。
- P(陽性∣病気)=10099=0.99: 病気の人のうち、陽性になる割合(検査の性能)
- P(病気∣陽性)=59499≈0.167: 陽性の人のうち、病気である割合(陽性と言われた人が知りたいこと)
表でいえば、前者は「病気の人」の行だけを見て、後者は「陽性」の列だけを見ています。第5章・第9章の言葉でいえば、前者は 再現率、後者は 適合率 にあたります。
ベイズの定理:新しい情報で、確率を更新する
表の数え方を、式にする
前のスライドの表の数え方を、確率の言葉に置き換えます。
- 病気で、かつ 陽性である確率: P(病気かつ陽性)=1000099=0.0099。2つのことが同時に起こる確率を 同時確率 と呼びます。これは「病気である確率 × 病気の人が陽性になる確率」で、0.01×0.99=0.0099 と計算できます
- 陽性である確率: P(陽性)=10000594=0.0594。「病気で陽性」と「病気でなくて陽性」を足したもので、0.01×0.99+0.99×0.05=0.0594 です。このように、同時確率を、もう一方(病気かどうか)のすべての場合について足し合わせたものを 周辺確率 と呼びます(表の一番下の「合計」の行にあたります)
もし「病気かどうか」と「陽性かどうか」が無関係なら、同時確率は、それぞれの確率の単純な掛け算 P(病気)×P(陽性) になります。このような関係を、2つのことが 独立 であると言います。検査は病気を見つけるためのものなので、この2つは独立ではありません(0.01×0.0594≈0.0006 で、実際の同時確率0.0099とは違います)。ナイーブベイズの「特徴量どうしは互いに関係ない」という仮定も、この独立の考え方です。
陽性の人のうち病気である確率は、この2つの割り算でした。
P(病気∣陽性)=P(陽性)P(病気かつ陽性)=P(陽性)P(陽性∣病気)×P(病気)=0.05940.99×0.01≈0.167
この式を ベイズの定理 と呼びます。「条件と結果を入れ替えた確率 P(陽性∣病気)」から、「知りたい確率 P(病気∣陽性)」を求める式です。
式の3つの部分には、名前が付いています。
ベイズの定理は、「事前確率を、観測した結果(データ)で、事後確率に更新する」手順だと見ることができます。
事前確率が変わると、事後確率も大きく変わる
同じ検査(病気なら99%陽性、病気でなくても5%陽性)で、病気の人の割合(事前確率)だけを変えて、陽性の人が病気である確率を計算しました。
同じ検査でも、めずらしい病気ほど、陽性の結果は当てにならなくなります。症状があって病院に来た人(病気の人の割合が高い集団)と、症状のない人の検診とでは、同じ「陽性」でも意味が違うのです。
もう一度検査すると
1回目で陽性だった人が、同じ性能の別の検査をもう一度受けて、また陽性だったとします。今度は、1回目の事後確率0.167を、新しい事前確率として使います(2回の検査の誤りは、互いに関係なく起こるものとします)。
0.99×0.167+0.05×0.8330.99×0.167≈0.80
2回続けて陽性なら、約80%まで上がります。このように、データを得るたびに事後確率を次の事前確率にして、少しずつ確率を更新していけることが、ベイズの定理の大きな特徴です。
ベイズの定理で分類する:ナイーブベイズ
迷惑メールの判定
ベイズの定理は、分類のモデルにも使えます。例えば、メールが迷惑メールかどうかを判定するとき、次のように考えます。
- 事前確率: 届くメールのうち、迷惑メールの割合
- 尤度: 迷惑メールだとしたら、「当選」「今すぐ」のような単語がどれくらい出てきやすいか(迷惑メールと、ふつうのメールのそれぞれで、過去のメールから数えておく)
- 事後確率: この単語を含むメールが、迷惑メールである確率
単語がたくさんあるときは、「迷惑メールかどうかが決まれば、それぞれの単語が出るかどうかは、互いに関係なく決まる」と仮定して、単語ごとの尤度を 掛け算 します。
P(迷惑)×P(「当選」∣迷惑)×P(「今すぐ」∣迷惑)×⋯
これを「ふつうのメール」についても計算し、大きい方のクラスに分類します(ベイズの定理の分母 P(単語) は、どちらのクラスでも同じなので、比べるだけなら計算しなくて済みます)。
この方法を ナイーブベイズ と呼びます。「ナイーブ」(単純な、素朴な)は、「特徴量どうしは互いに関係ない」という、現実にはあまり成り立たない単純な仮定を置いていることを表しています(実際には、「当選」と「賞金」は一緒に出やすいはずです)。
実験:ロジスティック回帰と比べる
数値の特徴量では、クラスごとに、各特徴量が正規分布に従うと考えて尤度を計算します(scikit-learn の GaussianNB)。テストデータ3割で比べました。
どちらのデータでも、ナイーブベイズの方が低くなりました。乳がんのデータには細胞の半径・周の長さ・面積のような、手書き数字には隣り合った画素のような、互いに強く関係する特徴量が多く、「互いに関係ない」という仮定が成り立たないためだと考えられます。
一方で、ナイーブベイズは、平均と分散を数えるだけで学習が終わるので、とても速く、データが少なくても使えます。文章の分類では、今でも最初に試す方法の1つです。レッスン6では、このナイーブベイズを、ライブラリを使わずに自分で作ります。
from sklearn.naive_bayes import GaussianNB
model = GaussianNB().fit(X_train, y_train) # クラスごとに、特徴量の平均と分散を求める
print(model.score(X_test, y_test)) # 正解率
print(model.predict_proba(X_test[:1])) # 事後確率(クラスごと)
よくある誤解
- 「99%陽性になる検査で陽性なら、99%病気」: 99%は P(陽性∣病気) です。知りたいのは P(病気∣陽性) で、病気の人の割合(事前確率)によって大きく変わります
- 「事前確率は、ただの思い込みだから無視してよい」: めずらしいことは、めずらしい。事前確率を無視すると、陽性の結果を過大に信じてしまいます(基準率の無視 と呼ばれる、よくある誤りです)
- 「ナイーブベイズは仮定が単純なので、使い物にならない」: 正解率は他の方法に劣ることもありますが、速く、少ないデータで動き、結果の理由(どの単語が効いたか)も分かりやすい方法です
振り返り
- 条件付き確率 P(A∣B) は、「B だと分かったとき、A である確率」。条件と結果を入れ替えると、別の確率になる
- ベイズの定理は、事前確率を、データ(尤度)で事後確率に更新する式
- ナイーブベイズは、特徴量が互いに関係ないと仮定して、ベイズの定理で分類する