一、基礎
- 疑問1:具體使用算法時,怎么通過精准率和召回率判斷算法優劣?
- 根據具體使用場景而定:
- 例1:股票預測,未來該股票是升還是降?業務要求更精准的找到能夠上升的股票;此情況下,模型精准率越高越優。
- 例2:病人診斷,就診人員是否患病?業務要求更全面的找出所有患病的病人,而且盡量不漏掉一個患者;甚至說即使將正常人員判斷為病人也沒關系,只要不將病人判斷成健康人員就好。此情況,模型召回率越高越優。
- 疑問2::有些情況下,即需要考慮精准率又需要考慮召回率,二者所占權重一樣,怎么中歐那個判斷?
- 方法:采用新的評價標准,F1 Score;
二、F1 Score
- F1 Score:兼顧降准了和召回率,當急需要考慮精准率又需要考慮召回率,可查看模型的 F1 Score,根據 F1 Score 的大小判斷模型的優劣;
- F1 = 2 * Precision * recall / (precision + recall),是二者的調和平均值;
- F1 是 precision 和 recall 的調和平均值;
- 調和平均值:如果 1/a = (1/b + 1/c) / 2,則稱 a 是 b 和 c 的調和平均值;
- 調和平均值特點:|b - c| 越大,a 越小;當 b - c = 0 時,a = b = c,a 達到最大值;
- 具體到精准率和召回率,只有當二者大小均衡時,F1 指標才高,
三、F1 Score 的使用
- F1 Score 指標在 scikit-learn 中封裝在了 sklearn.metrics 模塊下的 f1_score() 方法中
from sklearn.metrics import f1_score f1_score(y_test, y_log_predict) # 0.8674698795180723
-
import numpy as np 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) y_log_predict = log_reg.predict(X_test) from sklearn.metrics import precision_score precision_score(y_test, y_log_predict) # 精准率:0.9473684210526315 from sklearn.metrics import recall_score recall_score(y_test, y_log_predict) # 召回率:0.8 from sklearn.metrics import f1_score f1_score(y_test, y_log_predict) # F1 Score 指標:0.8674698795180723
- 使用scikit-learn 中 sklearn.metrics 模塊下的 confusion_matrix()、precision_score()、recall_score()、f1_score() 方法時,所需要的參數都是 y_test、y_predict;