Menu
CoddyTech

適合率と再現率

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 22/58。

2つの質問で、インフルエンザ検査の回答を評価します。インフルエンザ陽性と判定されたうち、正しかったのはいくつですか?実際にインフルエンザだったケースのうち、検出できたのはいくつですか?

インフルエンザ検査の混同行列を2つ並べて示した図。左は「適合率 42 / 45 = 0.933」と題され、インフルエンザの列が強調表示されている。誤警報が3件、検出が42件。右は「再現率 42 / 47 = 0.894」と題され、インフルエンザの行が強調表示されている。見逃しが5件、検出が42件

適合率は最初の問いに答えます:45件のアラームのうち42件。再現率は2つ目の問いに答えます:47件のケースのうち42件。

from sklearn.metrics import precision_score, recall_score

print(f"{precision_score(y_test, pred):.3f}")
print(f"{recall_score(y_test, pred):.3f}")

:.3f は常に小数点以下3桁を表示するため、0.9 は 0.900 と出力されます。これは次のように出力します:

0.933
0.894

よりコストの高い誤りに基づいて選びましょう。インフルエンザの見逃しは感染を広げるため、この検査には再現率が必要です。本物のメールを埋もれさせてしまうスパムフィルターには適合率が必要です。

challenge icon

チャレンジ

中級

ある店のフィルターは、偽物に見えるレビューを非表示にします。スターターコードでは、1つのモデルからstrict_predとeager_predという2つのバージョンを作り、どちらの間違いのほうが問題になるかを読み取ります。missed(偽物のレビューが掲載されたままになる)か、hidden(本物のレビューが非表示になる)です。

  1. 各フィルターの適合率と再現率を、小数点以下3桁で出力します。
  2. 下記のように、その間違いをより少なくするフィルターを出力します(missedの場合:Fewer fakes missed: ...)。

別の店でhiddenの場合:

Strict: precision 0.900, recall 0.450
Eager: precision 0.640, recall 0.800
Fewer real reviews hidden: strict

自分で試してみよう

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score

# どちらの間違いのほうが深刻か:missed(偽のレビューを公開したままにする)か、hidden(本物のレビューを非表示にする)か
worse = input()

# レビューごとに1行:fake の 1 は、そのレビューが依頼を受けて書かれたことを意味する
reviews = pd.read_csv("reviews.csv")
features = ["words", "exclamations", "account_days", "user_reviews", "stars", "photo"]
X_train, X_test, y_train, y_test = train_test_split(reviews[features], reviews["fake"], test_size=0.25, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
proba = model.predict_proba(X_test)[:, 1]

# 同じモデルを使う2つのフィルター:strict は偽のレビューである確率が 0.7 以上なら非表示にし、eager は 0.3 以上なら非表示にする
strict_pred = proba >= 0.7
eager_pred = proba >= 0.3

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師あり学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ