Menu
CoddyTech

精确率与召回率

本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 22 课,共 58 课。

有两个问题可以评估检测流感的答案。在所有流感警报中,有多少是正确的?在真实的流感病例中,检测到了多少?

流感检测的混淆矩阵显示了两次。左侧标题为精确率 42 / 45 = 0.933,标记为流感的列亮起:3 次误报,检测到 42 例。右侧标题为召回率 42 / 47 = 0.894,流感行亮起:漏掉 5 例,检测到 42 例

精确率回答第一个问题:45 个警报中有 42 个。召回率回答第二个问题: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

挑战

中等

商店的过滤器会隐藏看起来像假评论的内容。起始代码用一个模型生成两个版本,strict_pred 和 eager_pred,并读取哪种错误危害更大: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

# 哪种错误影响更大:漏判(虚假评论仍然显示)还是误隐藏(真实评论被隐藏)?
worse = input()

# 每条评论占一行: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]

# 同一个模型的两种筛选方式:strict 在评论为虚假的概率达到 0.7 时将其隐藏,eager 则在达到 0.3 时隐藏
strict_pred = proba >= 0.7
eager_pred = proba >= 0.3

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

监督学习中的所有课

自己练习: Python 在线编译器