常见的评价指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 score、ROC曲线(Receiver Operating Characteristic Curve)等。
第一步,理解混淆矩阵,如下图:
P表示Positive,即正例或者阳性,N表示Negative,即负例或者阴性。
FP表示实际为负但被预测为正的样本数量,TN表示实际为负被预测为负的样本的数量,
TP表示实际为正被预测为正的样本数量,FN表示实际为正但被预测为负的样本的数量。
其中:
TP+FP=P’'表示所有被预测为正的样本数量,FN+TN=N’'为所有被预测为负的样本数量,
TP+FN=P表示所有实际为正的样本数量,FP+TN=N表示所有实际为负的样本数量。
准确率是分类正确的样本占总样本个数的比例,即:
准确率是分类问题中最简单直观的评价指标,但是当不同类别样本的比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。比如如果样本中有99%的样本为正样本,那么分类器只需要一直预测为正,就可以得到99%的准确率,但其实际性能是非常低下的。
sklearn中计算准确率的示例:
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
print(accuracy_score(y_true, y_pred)) # 0.5
print(accuracy_score(y_true, y_pred, normalize=False)) # 2
# 在具有二元标签指示符的多标签分类案例中
print(accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))) # 0.5
精确率指模型预测为正的样本中实际也为正的样本占被预测为正的样本的比例,即:
精确率是分类问题中的重要评价指标之一,直观地可以说是分类器不将负样本标记为正样本的能力。
sklearn中计算准确率的示例:
from sklearn.metrics import precision_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(precision_score(y_true, y_pred, average='macro')) # 0.2222222222222222
print(precision_score(y_true, y_pred, average='micro')) # 0.3333333333333333
print(precision_score(y_true, y_pred, average='weighted')) # 0.2222222222222222
print(precision_score(y_true, y_pred, average=None)) # [0.66666667 0. 0. ]
召回率指实际为正的样本中被预测为正的样本所占实际为正的样本的比例,即:
召回率=TP/(TP+FN)
召回率也是分类问题中的重要评价指标之一,直观地可以说是分类器找到所有正样本的能力。
sklearn中计算准确率的示例:
from sklearn.metrics import recall_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(recall_score(y_true, y_pred, average='macro')) # 0.3333333333333333
print(recall_score(y_true, y_pred, average='micro')) # 0.3333333333333333
print(recall_score(y_true, y_pred, average='weighted')) # 0.3333333333333333
print(recall_score(y_true, y_pred, average=None)) # [1. 0. 0.]
F1 score是精确率和召回率的调和平均值,计算公式为:
Precision体现了模型对负样本的区分能力,Precision越高,模型对负样本的区分能力越强;
Recall体现了模型对正样本的识别能力,Recall越高,模型对正样本的识别能力越强;
F1 score是两者的综合,F1 score越高,说明模型越稳健。
sklearn中计算准确率的示例:
from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(f1_score(y_true, y_pred, average='macro')) # 0.26666666666666666
print(f1_score(y_true, y_pred, average='micro')) # 0.3333333333333333
print(f1_score(y_true, y_pred, average='weighted')) # 0.26666666666666666
print(f1_score(y_true, y_pred, average=None)) # [0.8 0. 0. ]
因篇幅问题不能全部显示,请点此查看更多更全内容