<-- home

F1 Score

F1 score

精准率召回率出现不一致:

  • 有时候我们注重精准率。如股票预测(我们更注重做的所有股票升多少是正确的。而不是有多少上升被预测了出来,即而不是尽可能预测出所有上升)

  • 有时候我们注重召回率。如病人诊断(我们更注重尽可能预测出所有病人,准确率低误诊可以进一步检查,此时不太注重准确率)

  • 还有一些时候我们希望获得这两个指标之间的一种平衡,这时候我们引入一个新得指标 F1 Score

F1 Score

\[F1 = \frac{2 \cdot precision \cdot recall}{precision + recall}\]

F1 Score 描绘的是 precision 和 recall 的调和平均值

\[\frac{1}{F1} = \frac{1}{2}(\frac{1}{precision} + \frac{1}{recall})\]

调和平均值的特点:二者之中有一个非常低,一个特别高的时候,结果会比较低

import numpy as np
def f1_score(precision, recall):
    try:
        return 2 * precision * recall / (precision + recall) 
    except:
        return 0
f1_score(0.5, 0.5)

0.5

f1_score(0.1, 0.9)

0.18000000000000002

f1_score(1, 0)

0.0

from sklearn import datasets

digits = datasets.load_digits()
X = digits.data
y = digits.target.copy()

y[digits.target == 9] = 1
y[digits.target != 9] = 0
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
from sklearn.linear_model import LogisticRegression

log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
log_reg.score(X_test, y_test)

0.9755555555555555

from sklearn.metrics import precision_score
from sklearn.metrics import recall_score

y_log_predict = log_reg.predict(X_test)

f1_score(precision_score(y_test, y_log_predict), recall_score(y_test, y_log_predict))

0.8674698795180723

precision_score(y_test, y_log_predict)

0.9473684210526315

recall_score(y_test, y_log_predict)

0.8

from sklearn.metrics import f1_score

f1_score(y_test, y_log_predict)

0.8674698795180723