『Instagramに投稿された写真から投稿者が「うつ病かどうか」を人間の医師を上回る70％の精度で判定するAI登場』で「精度」を振り返る

# はじめに
みなさんこんにちは。精度警察です。
最近、AIで○○が精度××%で実現！みたいなニュース記事をよく見かけますね。その度に私は、その「精度」ってなんやねん！とモヤモヤするのですが、[Instagramに投稿された写真から投稿者が「うつ病かどうか」を人間の医師を上回る70％の精度で判定するAI登場](http://gigazine.net/news/20170809-instagram-photo-predictive-depression/)という記事を読んで、丁度良いのでその辺りのことを書いてみようと思います。

# 元記事の内容
元記事が取り上げているのは、SpringerのオープンアクセスジャーナルであるEPJ Data Scienceに掲載された、 "[Instagram photos reveal predictive markers of depression](https://epjdatascience.springeropen.com/articles/10.1140/epjds/s13688-017-0110-z)" という論文です。内容はほぼタイトル通りで、Instagramに投稿される写真の色彩情報等の統計情報を機械学習にかけることで、投稿者がうつ病かどうかを判定することができるというものです。

元記事には「実験ではAIを使用して70％の精度でInstagramに投稿された写真からうつ状態の人々を特定することに成功しました」とあります。
さて、この精度70%とは何を意味しているか分かりますか？
最も一般的な解釈は、『実験で扱った投稿者についてそれぞれ「うつ病かどうか」をAIが判定し、うつ病の人をうつ病と、そうでない人をそうでないと判定した率（正確度）』であると思います。
しかしながら、元論文を読むと分かりますが、正解は「投稿者のうちうつ病である人を、うつ病であると判定した率（再現率）」なのです！

元記事はこう続きます。
「これに対して、医師がうつ病を診断した際の成功率は42％とのことで、AIがいかに正確にうつ状態の人々を特定したかがよくわかります。」
さて、この「成功率は42％」とは何を意味しているのでしょうか。
この文脈では、（精度と成功率という単語の違いに違和感を感じながらも）先の「70%の精度」と同じ指標であると考えるのが自然です。
ところがなんと、元論文を読むと正解は「医師がうつ病と判断した人のうち、実際にうつ病である人の率（適合率）」なのです！

当然、違う指標の値の大小を比較すること自体ナンセンスですが、単体の指標の値自体を見ることも危険です。例えば、先の「投稿者のうちうつ病である人を、うつ病であると判定した率」などは、投稿者全員をうつ病と判定すれば100%にすることができます。この場合は、誤ってうつ病と判定された人の率を考慮しなければなりません。

以上のように、元記事（より正確には[元記事の翻訳元の記事](http://www.independent.co.uk/news/science/depression-colour-blue-instagram-filters-social-media-university-vermont-research-study-a7882166.html)）が違う指標の値を比べて優劣を結論付ける酷さが先行しますが、現実問題として精度指標は複数あり、それらを適切に解釈することの大切さが分かると思います。
ちなみに、優劣の結論（「AIがいかに正確にうつ状態の人々を特定したかがよくわかります」）は実は翻訳元の記事にはなく、こうやって尾ヒレがついていくのかというのも体感することができます。

# 精度指標
ここで精度の指標について概観してみます。
2値分類（上の例でいうとうつ病であるかどうか）においては、まず、精度を検証するサンプルについて、真のクラス（正解）および予測結果が、陽性（Positive, P）・陰性（Negative, N）どちらであったかに基づいて頻度をまとめた混同行列を作成します。

|  |正解がP|正解がN|
|:-:|:-:|:-:|
|予測がP|True Positive (TP)|False Positive (FP)|
|予測がN|False Negative (FN)|True Negative (TN)|

全てのサンプルが4種類に分類され、例えばTrue Positiveは正解が陽性であり、予測結果も陽性と正しく判定されたサンプルの数になります。名前の読み方としては、前半が予測が合っているかどうか（合っていればTrue）、後半が予測結果を表しています。

上記の混同行列を元に、下記のような精度指標を求めることができます。

- **正確度（Accuracy）**：`(TP+TN)/(TP+FP+FN+TN)`
  - サンプル全体の判定自体の精度
- **適合率（Precision）**：`TP/(TP+FP)`
  -  陽性と判定されたサンプルのうち、実際に正解が陽性である率（誤検出の少なさ）
- **再現率（Recall）、感度（Sensitivity）、真陽性率（True positive rate）**：`TP/(TP+FN)`
  - 正解が陽性であるサンプルのうち、正しく陽性と判定された率（見落としの少なさ）
- **偽陽性率（False positive rate）**：`FP/(TN+FP)`
  - 正解が陰性であるサンプルのうち、誤って陽性と判定された率（誤検出の多さ）
- **特異度（Specificity）**：`TN/(TN+FP)`
  - 正解が陰性であるサンプルのうち、正しく陰性であると判定された率
- **陰性的中率（Negative Predictive Value）**：`TN/(TN+FN)`
  - 陰性と判定されたサンプルのうち、実際に正解が陰性である率
- **F値（F-measure）**：`2*Precision*Recall/(Precision+Recall)`
  - 適合率と再現率の調和平均

ニュース記事で良く「精度」と言われるものは、上記の「正確度」であると思われますが、個人的には「適合率」および「再現率」の観点で精度を記述して欲しいと常々思っております。
一つは、例えばサンプルの99%が陰性であるようなケースだと、全てのサンプルを陰性と判定することで「正確度」は99%になってしまうので、そのアルゴリズムが実際どの程度凄いのかが分かりづらいためです。

# 実用で使える精度、使えない精度
さて、実応用上AIに求められる精度はどのようなものでしょうか？
完全にタスクや前提依存ではありますが、**適合率または再現率のどちらかがほぼ100%**であることが多いと思います。
つまり、正確度が同じであっても、適合率と再現率がどちらも90%のAIより、適合率100%・再現率80%のAIや適合率80%・再現率100%のAIのほうが望ましいということです。
勿論、適合率と再現率はトレードオフの関係にあり、片方を100%に近づけるともう片方の値はかなり低くなってしまう傾向にありますが、たとえ適合率50%・再現率100%だとしてもこちらのほうが必要とされるケースは多いと思います（こちらほうが正確度やF値が低いにもかかわらず）。

これは、実応用では、誤検出もしくは未検出の損害の大きさが偏っているケースが多いためです。
例えば、スパムメールのフィルタ機能では、スパムメールが受信箱に入ってくる（未検出）のはまぁ許せますが、重要なメールがゴミ箱に勝手に入る（誤検出）は許されません。

他の例として、これまで人力で行っているフィルタリング作業の自動化（省力化）を考えます。AIがまず判定を行い、その後問題がありそうなコンテンツだけをこれまで通り人力でフィルタリングするとすると、この場合は再現率がほぼ100%であることが求められます。逆に（その後人が判定するので）適合率はなんでも良く、人の作業量が全体の陽性率まで削減できることになります。

とは言え、適合率や再現率を実際に100%にすることはかなり難しい（特に再現率）ので、結局AIで何かすると言っても、人手が入る前提でシステムの設計を行い、いかに作業をする人が効率的に作業ができるかというUI・UXを頑張って考えるほうが重要ではないかと個人的には思っています。