评价指标ROC、AUC

2018-05-21  本文已影响459人  ForgetThatNight

AUC

混淆矩阵

混淆矩阵

正确率和召回率很难兼得
• 准确度Accuracy:(50+35)/(35+5+10+50)=85%
• 正确率Precision(y1):50/(50+5)=90.9%
• 召回率Recall(y1):50/(50+10)=83.3%


预测与实际类别

合并a8a.t和a8a两个文件 python merge_label.py data/a8a.t output_res > auc.raw


merge_label.py

file1:真实标签文件 a8a.t,只取第一列
如果预测标签和真实标签的长度不相等

cat auc.raw | awk '{print $2}' | sort -nq | head 
cat auc.raw | awk '{print $2}' | sort -nq | tail

可以看到范围-1.1~1.5之间
按照预测值排序

cat auc.raw | sort -t$'\t' -k2rg > auc.raw.sort  从小到大
cat auc.raw | sort -t$'\t' -k2g -nr > auc.raw.sort 从大到小

设置阈值--兼顾正确率和召回率

按照此例子如果阈值=1.3,那么正确率会是100%,而此时召回率很低(因为很多正例是分正确却因为阈值而被分到负例去了)
按照此例子如果阈值=-1.1.42,那么召回率会是100%,而此时正确率很低(因为大于该值的很多本应该是负例却被划分到正例去了)

ROC

• ROC是个曲线


预测与实际类别
真阳率与假阳率

在虚拟机图形化界面中执行命令 python plot_roc.py /root/svm_test/auc.raw
securecrt不显示图形界面

#得先安装Anaconda,默认会添加环境变量 conda install scikit-learn
#分类模型的评价指标,没有固定阈值,只能自己决定,视业务情况决定兼顾正确率还是召回率
print(__doc__)

import sys
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc, precision_recall_curve
#输入文件 即 head /root/svm_test/auc.raw
inputfile = sys.argv[1]

label_list = []
score_list = []
with open(inputfile, 'r') as fd:
    #每一行\t分割
    for line in fd:
        fs = line.strip().split('\t')
        label = int(fs[0]) #第一列为真实标签
        score = float(fs[1])¥第二列为回归分数
        label_list.append(label)
        score_list.append(score)
#sklearn计算auc
fpr, tpr, _ = roc_curve(label_list, score_list)
auc = auc(fpr, tpr)
#得到准确率和召回率
precision, recall, _ = precision_recall_curve(label_list, score_list)

##############################################################################
# Plot of a ROC curve for a specific class
plt.figure()
plt.plot(fpr, tpr)
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC curve (auc = %.2f)' % auc)
plt.legend(loc="lower right")
plt.show()

plt.figure()
plt.plot(recall, precision)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('recall')
plt.ylabel('precision')
plt.title('Precision-Recall curve')
plt.legend(loc="lower right")
plt.show()

比如阈值=0.25,音乐推荐item3
阈值=0.05,则音乐推荐item1、item2、item3

备注

如果安装了多个conda python环境
切换python环境
上一篇 下一篇

猜你喜欢

热点阅读