评价指标是针对将相同的数据,输入不同的算法模型,或者输入不同参数的同一种算法模型,而给出这个算法或者参数好坏的定量指标。
在模型评估过程中,往往需要使用多种不同的指标进行评估,在诸多的评价指标中,大部分指标只能片面的反应模型的一部分性能,如果不能合理的运用评估指标,不仅不能发现模型本身的问题,而且会得出错误的结论。
下面是几个常见的评价指标:
1.准确率
准确率是最常见的几个指标之一,即预测成功结果占总结果的百分比。下面是使用案例
from sklearn.metrics import accuracy_score
y_pred = [0,1,2,3]
y_true = [0,2,1,3]
accuracy_score(y_true,y_pred)
以上代码会输出准确率。
优点:计算简单易懂
缺点:当样本不平衡的时候,准确率会失效。例如以下情况:
y_pred = [1,1,1,1,1,1,1,1,1,1,1,1,1]
y_true = [1,1,1,1,0,1,1,1,1,1,1,1,1]
这时候,如果模型全部预测1,准确率也会高达90%
处理办法:将样本进行重采样,过采样,欠采样,或更换评价指标为f1_score它不仅考虑错误数量,还考虑错误类型。
2.混淆矩阵
混淆矩阵是将预测值和真实值分别放置到横轴和纵轴,每个类别作为纵轴和横轴上的坐标。有几种真实值就有几个坐标,然后观察其对角线上的元素的准确率,分别代表各个类别的准确率。
其python代码为
import matplotlib.pyplot as plt
import scikitplot as akplt
y_pred = [1,1,1,1,1,1,1,1,1,1,1,1,1]
y_true = [1,1,1,1,0,1,1,1,1,1,1,1,1]
#生成混淆矩阵
skplt.metrics.plot_confusion_matrix(y_true,y_pred,normalize = True)
plt.show()
3.精准率和召回率
精准率就是我们所预测的为真的样本种真正为真的占比。我们在很需要为真的结果时,精准率越高越好。例如股票上涨情况,我们需要认为它真的上涨了。
召回率就是我们所预测为真的样本中对真正为真的样本的覆盖率,如果预测了一千次会发生地震,而其中的十次刚好在其范围内,它的召回率就是100%,而精准率就是1%。其python代码如下
from sklearn.metrics import precision_score,recall_score
y_true = [0,0,0,1,1,1,1,1,1,1]
y_pred = [0,0,0,0,0,0,0,0,1,1]
#精准率
precision_score(y_true,y_pred,average = None)
#对于1和0的精准率取简单平均
precision_score(y_true,y_pred,average = "macro")
#对于1和0的精准率取加权平均
precision_score(y_true,y_pred,average = "weighted")
#与准确率相同
precision_score(y_true,y_pred,average = "micro")
#与之前类似,不做重复叙述
recall_score(y_true,y_pred,average = None)
recall_score(y_true,y_pred,average = "macro")
recall_score(y_true,y_pred,average = "weighted")
recall_score(y_true,y_pred,average = "micro")
4.f1_score
f1_score的预测就是精准率和召回率取调和平均数,就相当于对于精准率和召回率的一个加权平均。它的特点是对于越高的值,取越低的权重。否则,我们认为精准率和召回率是可以相互替代的。因为精准率和召回率都是0.8,和精准率和召回率分别为0.9和0.7是相同的分数,这样显然不合适,因为不同模型的需求是不同的。这样就避免了因为一个指标高,另一个指标低造成的均值虚高的情况。
from sklearn.matrics import f1_score
y_true = [0,0,0,1,1,1,1,1,1,1]
y_pred = [0,0,0,0,0,0,0,0,1,1]
#与之前类似
f1_score(y_true,y_pred,average = None)
f1_score(y_true,y_pred,average = "macro")
f1_score(y_true,y_pred,average = "weighted")
f1_score(y_true,y_pred,average = "micro")