AUC
混淆矩阵
混淆矩阵正确率和召回率很难兼得
• 准确度Accuracy:(50+35)/(35+5+10+50)=85%
• 正确率Precision(y1):50/(50+5)=90.9%
• 召回率Recall(y1):50/(50+10)=83.3%
预测与实际类别
-
正确率Precision:TP/(TP+FP)
– 预测为正例的样本中的真正正例的比例 -
召回率Recall:TP/(TP+FN)
– 预测正例的真实正例占所有真实正例的比例
x:召回率 y:准确率 -
很容易构造一个高正确率或高召回率的分类器,但很难保证两全其美
-
一般情况下准确率高、召回率就低,召回率高、准确率低
-
搜索场景:
– 保证召回为前提,提升准确 -
疾病监测、反垃圾场景:
– 保证准确为前提,提升召回
合并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是个曲线
预测与实际类别
真阳率与假阳率
- 纵轴:真阳率(召回率):TP/(TP+FN)
– Recall -
横轴:假阳率:FP/(FP+TN)
AUC和ROC的关系
AUC的面积不可能低于0.5
在虚拟机图形化界面中执行命令 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
- 另一种理解AUC的方法:
– 负样本排在正样本前面的概率
cat auc.raw | sort -t$'\t' -k2g |awk -F'\t' '($1==-1){++x;a+=y;}($1==1){++y;}END{print 1.0-a/(x*y);}‘ - 1:正例 -1为负例
- cat auc.raw | sort -t$'\t' -k2g :从小到大排序
- ($1==-1){++x;a+=y;}发现一个负例 x+1 y默认为0 这时候y一直为0
- ($1==1){++y;}发现一个正例 y+1 所以y为正例的个数 x为负例的个数 a表示正例在负例前面分错的次数
- x*y:正负样本pair对
- a:错误的pair对
- a/x*y:错误的概率
- 1-a/x*y:正确的概率
备注
如果安装了多个conda python环境切换python环境
网友评论