F1 Score
May 20, 2019
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