一、分類評估指標
- 准確率(最直白的指標)
缺點:受采樣影響極大,比如100個樣本中有99個為正例,所以即使模型很無腦地預測全部樣本為正例,依然有99%的正確率
適用范圍:二分類(准確率);二分類、多分類(平均准確率)
from sklearn.metrics import accuracy_score y_pred = [0, 2, 1, 3] y_true = [0, 1, 2, 3] accuracy_score(y_true, y_pred) 0.5 accuracy_score(y_true, y_pred, normalize=False) 2
from sklearn.metrics import balanced_accuracy_score y_true = [0, 1, 0, 0, 1, 0] y_pred = [0, 1, 0, 0, 0, 1] balanced_accuracy_score(y_true, y_pred) 0.625
- 混淆矩陣
適用范圍:所有分類模型,包括二分類、多分類
介紹:實質是一張交叉表,縱軸為真實值,橫軸為預測值
API介紹:
Example1:多分類任務,類別已經轉換為整數類型,分別為0,1,2三個類別from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1] y_pred = [0, 0, 2, 2, 0, 2] confusion_matrix(y_true, y_pred) array([[2, 0, 0], [0, 0, 1], [1, 0, 2]])
可以推導出混淆矩陣如下所示
Example2:多分類任務,類別沒有轉換為整型數值,而是作為字符串直接傳入from sklearn.metrics import confusion_matrix
y_true = ["cat", "ant", "cat", "cat", "ant", "bird"] y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"] confusion_matrix(y_true, y_pred, labels=["ant", "bird", "cat"]) array([[2, 0, 0], [0, 0, 1], [1, 0, 2]])證明該API可以直接傳入類別型字符串,混淆矩陣如下所示
Example3:二分類任務from sklearn.metrics import confusion_matrix confusion_matrix([0, 1, 0, 1], [1, 1, 1, 0]) array([[0, 2], [1, 1]], dtype=int64) tn, fp, fn, tp = confusion_matrix([0, 1, 0, 1], [1, 1, 1, 0]).ravel() (tn, fp, fn, tp) (0, 2, 1, 1)
此處“1”為正例,“0”為反例 -
Roc曲線及auc值
適用范圍:二分類
介紹:roc曲線為二維平面的一條曲線,橫坐標為fpr,縱坐標為tpr,auc(area under the curve)顧名思義,即為曲線與橫軸圍成的曲線下的面積
API:
sklearn中有三個關於roc計算相關的接口,分別為1 metrics.roc_auc_score() 2 metrics.roc_curve() 3 metrics.auc()
1)直接計算auc的值
from sklearn import metrics import numpy as np
y_true = np.array([0, 0, 1, 1]) y_scores = np.array([0.1, 0.4, 0.35, 0.8]) metrics.roc_auc_score(y_true, y_scores) 0.752)先計算fpr,tpr以及threshold(閾值),再通過fpr和tpr求auc
from sklearn import metrics import numpy as np y_true = np.array([0, 0, 1, 1]) y_scores = np.array([0.1, 0.4, 0.35, 0.8]) fpr, tpr, threshold = metrics.roc_curve(y_true, y_scores) (fpr, tpr, threshold) (array([0. , 0.5, 0.5, 1. ]), array([0.5, 0.5, 1. , 1. ]), array([0.8 , 0.4 , 0.35, 0.1 ])) metrics.auc(fpr, tpr) 0.75
注意接口接收的參數為類別的真實標簽以及模型輸出的概率(得分)值,而非模型預測的標簽(標簽需要通過概率+閾值來得到)
- PR曲線及F1-score
PR曲線為二維平面曲線,橫軸為Recall(召回率),縱軸為Precision(精確率),F1-score為recall和precision的調和平均數
適用范圍:二分類
API:
sklearn中有五個常用的與PR相關的接口
1 metrics.precision_recall_curve() 2 metrics.precision_recall_fscore_support() 3 metrics.precision_score() 4 metrics.recall_score() 5 metrics.fbeta_score()
1)計算pr曲線
接口接收兩個參數,其一為樣本的真實值,另一個為樣本的預測概率(得分),示例如下:import numpy as np from sklearn.metrics import precision_recall_curve y_true = np.array([0, 0, 1, 1]) y_scores = np.array([0.1, 0.4, 0.35, 0.8]) precision, recall, thresholds = precision_recall_curve(y_true, y_scores) precision, recall, thresholds (array([0.66666667, 0.5 , 1. , 1. ]), array([1. , 0.5, 0.5, 0. ]), array([0.35, 0.4 , 0.8 ]))
2)計算當預測值已經通過閾值轉化為類別后的具體某一閾值下的PR及F-score值
from sklearn import metrics #該函數可直接求出precision、recall和f-score
precision,recall,fbeta_score,support = metrics.precision_recall_fscore_support()
#以下三個函數可分別求出precision、recall和f-score
precision = metrics.precision_score()
recall = metrics.recall_score()
f-score = metrics.fbeta_score()
- ks曲線及ks值
適用范圍:二分類
ks曲線的橫坐標為閾值的分位數,縱坐標分別為tpr,fpr,ks值(tpr-fpr),所以可用2中與ROC相關的接口計算得出 - kappa系數、漢明損失、鉸鏈損失、傑卡德相關系數
適用范圍:多分類
1 metrics.cohen_kappa_score() 2 metrics.hamming_loss() 3 metrics.hinge_loss() 4 metrics.jaccard_score() 5 metrics.log_loss()
- 馬修斯相關系數(MCC)
適用范圍:二分類
from sklearn.metrics import matthews_corrcoef y_true = [+1, +1, +1, -1] y_pred = [+1, -1, +1, +1] matthews_corrcoef(y_true, y_pred) -0.33333333
二、回歸評估指標
- R2
- MSE
- MAE
睡了。。。明天再修改