Menu
CoddyTech

F1 分数

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

模型可以通过牺牲另一项指标来让精确率或召回率达到最大值。F1 分数综合了这两项指标,只有两者都很高时,F1 分数才会高:

两个模型的柱状图。不平衡:精确率为 1,召回率为 0.1,简单平均值为 0.55,F1 仅为 0.18。平衡:精确率为 0.8,召回率为 0.7,简单平均值为 0.75,F1 为 0.75

用 P 表示精确率,用 R 表示召回率,F1 的计算公式为 2 * P * R / (P + R)。对于天气模型:

from sklearn.metrics import f1_score, classification_report

y_test = ["sun", "sun", "rain", "rain", "snow", "sun", "rain", "snow"]
pred   = ["sun", "rain", "rain", "rain", "snow", "sun", "sun", "rain"]
print(f1_score(y_test, pred, average=None))  # 每个类别一个,已排序
print(classification_report(y_test, pred))

这会打印:

[0.57142857 0.66666667 0.66666667]
              precision    recall  f1-score   support

        rain       0.50      0.67      0.57         3
        snow       1.00      0.50      0.67         2
         sun       0.67      0.67      0.67         3

    accuracy                           0.62         8
   macro avg       0.72      0.61      0.63         8
weighted avg       0.69      0.62      0.63         8

报告会为每个类评分;support统计该类的测试行数。最弱的一行会告诉你应该先修复什么。

challenge icon

挑战

中等

一家回收厂的摄像头会把物品分到玻璃、金属、纸张和塑料箱中。程序会读取 k,入门代码会训练摄像头的 k-NN 模型、填充 pred 并列出 bins。

  1. 打印分类报告。
  2. 找出 F1 最低的箱子并打印,然后按下方格式打印它较弱的一项,即精确率或召回率(保留 3 位小数)。

报告之后,针对另一家回收厂:

Weakest bin: metal, F1 0.667
Its weaker side: recall 0.571

亲手试试

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, f1_score, precision_score, recall_score

k = int(input())

# 传送带上的每件物品占一行,并标明它所属的分类箱
items = pd.read_csv("recycling.csv")
features = ["weight_g", "shine", "see_through", "bend"]
X_train, X_test, y_train, y_test = train_test_split(items[features], items["material"], test_size=0.25, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 摄像头的模型
model = KNeighborsClassifier(n_neighbors=k)
model.fit(X_train, y_train)
pred = model.predict(X_test)
# 分类箱的顺序与各类别得分的顺序一致
bins = model.classes_

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

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

监督学习中的所有课

自己练习: Python 在线编译器