Menu
CoddyTech

F1スコア

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

モデルは、もう一方を犠牲にすれば、適合率または再現率を最大化できます。F1スコアはこの2つを組み合わせたもので、両方が高くない限り低いままです:

2つのモデルの棒グラフ。偏ったモデル:適合率 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))  # クラスごとに1つ、ソート済み
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())

# ベルト上の各アイテムにつき1行で、入れるべき箱も示す
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オンラインコンパイラ