一、混淆矩阵
分类问题中,不管建模人员使用什么模型都难以到达100%的预测准确率,所以人们普遍使用分类错误率来衡量一个模型的优劣。但是在实际生产过程中分类问题经常存在样本不均衡问题,所以仅仅使用错误率是不能很好的表现模型的好坏,也不能直观的体现每一类数据的分类准确性。例如:一个二分类样本中0:1占比为9:1,当一个分类器将所有的样本都识别为0,此时模型的错误率为10%,准确率为90%,如果仅仅看错误率是比较低的,但是根本没有起到数据分类的效果。因此在机器学习中,有一个普遍适用的称为混淆矩阵(confusion matrix)的工具,它可以帮助人们更好地了解分类中的错误。
一个二分类问题的混淆矩阵如下图:
若一个实例是正类并且被预测为正类,即为真正类(True Postive TP)
若一个实例是正类,但是被预测成为负类,即为假负类(False Negative FN)
若一个实例是负类,但是被预测成为正类,即为假正类(False Postive FP)
若一个实例是负类,但是被预测成为负类,即为真负类(True Negative TN)
二、ROC曲线
横轴:负正类率(false postive rate FPR)特异度,划分实例中所有负例占所有负例的比例;(1-Specificity)
纵轴:真正类率(true postive rate TPR)灵敏度,Sensitivity(正类覆盖率)
由混淆矩阵可得出横,纵轴的计算公式:
(1)真正类率(True Postive Rate)TPR:TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。Sensitivity
(2)负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。1-Specificity
python实现:
#===================ROC曲线函数===================#
def PlotROC(preds, labels, plot_chart=True):
fpr, tpr, threshold = roc_curve(labels, preds) ### 计算真正率和假正率
roc_auc = auc(fpr, tpr) ### 计算auc值
print('auc_value is' + str(np.round(roc_auc,4)))
if plot_chart==True:
lw = 2
plt.gca().set(title='model_ROC'
,xlabel='FPR'
,ylabel='TPR'
,xlim=[0,1]
,ylim=[0,1]
,aspect='equal')
# test
# plt.text(0.5,0.95,'ROC',fontsize=15,horizontatalignment='certer')
plt.text(0.5,0.45,'AUC:'+str(round(roc_auc,4)),horizontatalignment='center',color='b')
plt.plot(fpr, tpr, color='blue'
,lw=lw,label='ROC curve (area = %0.2f)' % roc_auc) ###假正率为横坐标,真正率为纵坐标做曲线
plt.plot([0,1],[0,1],color='red',lw=lw,linestyle='--')
plt.fill_between(fpr, 0, tpr, color='blue', alpha=0.1)
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.0])
plt.xlabel('Flase Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('model-ROC')
plt.legend(loc='lower right')
plt.show()