樣本
正樣本:即屬於某一類(一般是所求的那一類)的樣本。在本例中是及格的學生。
負樣本:即不屬於這一類的樣本。在本例中是不及格的學生。
y_pred = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
上述 0 代表不及格,1 代表及格。這裡正樣本代表及格。
TP、FP、FN、TN
正類 | 負類 | |
---|---|---|
被檢索 | True Positive | False Positive |
未檢索 | False Negative | True Negative |
- TP:被檢索到正樣本,實際也是正樣本(正確識別)
在本例表現為:預測及格,實際也及格。本例 TP=2
- FP:被檢索到正樣本,實際是負樣本(一類錯誤識別)
在本例表現為:預測及格,實際不及格。本例 FP=2
- FN:未被檢索到正樣本,實際是正樣本。(二類錯誤識別)
在本例表現為:預測不及格,實際及格了。本例 FN=2
- TN:未被檢索到正樣本,實際也是負樣本。(正確識別)
在本例表現為:預測不及格,實際也不及格。本例 TN=4
from sklearn.metrics import confusion_matrix
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
y_pred = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
TN, FP, FN, TP = confusion_matrix(y_true, y_pred).ravel()
print(TN, FP, FN, TP)
結果:4 2 2 2
Accuracy(準確率、精度)
$\operatorname{acc}(f ; D) =\frac{1}{m} \sum \limits _{i=1}^{m} \mathbb{I}\left(f\left(\boldsymbol{x}_{i}\right)=y_{i}\right) =1-E(f ; D)$$A C C=\frac{T P+T N}{T P+T N+F P+F N}$
y_pred = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
from sklearn.metrics import accuracy_score
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
y_pred = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
print(accuracy_score(y_true, y_pred))
結果:
0.6
Precision(精確率、查準率)
$P=\frac{T P}{T P+F P}$y_pred = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
-
- 不及格類:檢索到 6人,正確檢索 4人,所以Precision = 4 / 6 = 0.6667.
- 及格類:檢索到 4 人,正確檢索 2人,所以Precision = 2 / 4 = 0.5.
程式碼:
from sklearn.metrics import precision_score
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
y_pred = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
print(precision_score(y_true, y_pred, average=None)) #4/6 2/4
結果:
[0.66666667 0.5 ]
Recall (召回率、查全率)
$P=\frac{T P}{T P+F P}$
被正確檢索 (y_pred) 的樣本數 與 應當被檢索 (y_true) 到的樣本數之比。(這裡暫時先不適應上述相同樣本資料,否則和Precision結果一樣,怕搞混)
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
y_pred = [0, 0, 0, 1, 1, 1, 1, 0, 1, 1]
在本例中,
-
- 不及格類:應當檢索到 6人,正確檢索 3人,所以 Recall = 3 / 6 = 0.5.
- 及格類:應當檢索到 4 人,正確檢索 3人,所以 Recall = 3 / 4 = 0.75.
結果:
[0.5 0.75]
F1 Score
$F 1=\frac{2 \times P \times R}{P+R}$
在本例中,
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
y_pred = [0, 0, 0, 1, 1, 1, 1, 0, 1, 1]
-
- 不及格類:P=3/4, R=3/6
- 及格類:P=3/6, R=3/4
程式碼:
from sklearn.metrics import recall_score,precision_score,f1_score
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
y_pred = [0, 0, 0, 1, 1, 1, 1, 0, 1, 1]
print(precision_score(y_true, y_pred, average=None))
print(recall_score(y_true, y_pred, average=None))
print( f1_score(y_true, y_pred, average=None ))
# 不及格類
p=3/4
r=3/6
print((2*p*r)/(p+r))
# 及格類
p=3/6
r=3/4
print((2*p*r)/(p+r))
結果:
[0.75 0.5 ]
[0.5 0.75]
[0.6 0.6]
0.6
0.6
巨集平均
是先對每一個類統計指標值,然後在對所有類求算術平均值。
$macro-P =\frac{1}{n} \sum \limits _{i=1}^{n} P_{i}$
$macro -R =\frac{1}{n} \sum \limits _{i=1}^{n} R_{i}$
$macro -F1 =\frac{2 \times macro-P \times macro-R}{macro-P+macro-R}$
程式碼:
from sklearn.metrics import recall_score,precision_score,f1_score
y_true = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
y_pred = [0, 0, 0, 1, 1, 1, 1, 0, 1, 1]
print(precision_score(y_true, y_pred, average=None))
print(recall_score(y_true, y_pred, average=None))
print(precision_score(y_true, y_pred, average="macro"))
print(recall_score(y_true, y_pred, average="macro"))
print(f1_score(y_true, y_pred, average="macro"))
結果:
[0.75 0.5 ]
[0.5 0.75]
0.625
0.625
0.6
微平均
是對資料集中的每一個例項不分類別進行統計建立全域性混淆矩陣,然後計算相應指標。
$micro-P=\frac{\overline{T P}}{\overline{T P}+\overline{F P}} $
$micro-R=\frac{\overline{T P}}{\overline{T P}+\overline{F N}} $
$micro-F 1=\frac{2 \times micro-P \times micro-R}{ micro-P+\text { micro }-R}$
看成一類,造成的結果是 $micro-P = micro-R $。
程式碼:
from sklearn.metrics import recall_score,precision_score,f1_score
y_true = [0, 2, 2, 0, 1, 1, 1, 1, 0, 0]
y_pred = [0, 0, 2, 1, 1, 1, 1, 0, 1, 1]
print(precision_score(y_true, y_pred, average="micro"))
print(recall_score(y_true, y_pred, average="micro"))
print(f1_score(y_true, y_pred, average="micro"))
結果:
0.5
0.5
0.5
混淆矩陣
第 $i$ 行代表第 $i$-th class,每列表示把 $i$-th class 分配到 $j$-th class 中的個數
程式碼:
from sklearn.metrics import confusion_matrix
y_true = [1, 1, 1, 2, 2, 3]
y_pred = [1, 1, 2, 1, 2, 3]
print(confusion_matrix(y_true, y_pred))
結果:
[[2 1 0]
[1 1 0]
[0 0 1]]
程式碼:
y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]
y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]
print(confusion_matrix(y_true, y_pred, labels=["ant", "bird", "cat"]))
結果:
[[2 0 0]
[0 0 1]
[1 0 2]]
分類報告
將上述結果,用report的形式展示出來
程式碼:
from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 0]
y_pred = [0, 0, 2, 2, 0]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
結果:
真正率、假正率
真正率 (TPR ) = 靈敏度/召回率 = TP/(TP+FN)TP/(TP+FN) 正例中有多少樣本被檢測出
假正率 (FPR ) = 1- 特異度 = FP/(FP+TN)FP/(FP+TN) 負例中有多少樣本被錯誤覆蓋
P-R曲線
- 若一個學習演算法的PR曲線被另一個學習演算法的曲線完全“包住”,則可認為後者的效能優於前者,如A優於C;
- 若兩個學習演算法的PR曲線發生交叉(如A和B),則難以判斷孰優孰劣,只能在具體的查準率和查全率條件下進行比較;
- 可通過比較P-R曲線下的面積(PR-AUC)
- 利用平衡點(即P=R時的取值)
- 利用F1度量
ROC
AUC
代價敏感錯誤率
略