精准率和召回率(Precision&Recall)

Contents

一、背景

有时候分类算法,模型准确性并不能评价一个算法的好坏。
比如针对一个癌症预测系统,输入体检信息,可以判断是否有癌症,预测准确度为 99.9%,这个系统是还是坏呢?
如果癌症系统产生的概率只有 0.1% ,我们的系统预测所有人都是健康的,即可达到 99.9%的准确率,这样一来看起来我们的系统什么都没做,即可到达 99.9% 的准确度。
我们再极端一点的话,如果癌症系统产生的概率只有 0.01% ,我们的系统预测所有人都是健康的,即可达到 99.99%的准确率。
所以当数据集为极度偏斜(Skewed Data)的数据时,只使用分类准确度是远远不够的。

二、混淆矩阵(Confudion Matrix)

对于二分类问题 image1 (图片来自于网络)

三、精准率和召回率

在有偏的数据中,将分类1作为真正关注的对象。比如得癌症为1,金融有风险为1

精准率: 预测数据为1,相对的预测对的概率为多少。
召回率: 召回率:真实值为1,预测准确度为多少

对于极度有偏的数据,为什么精准率和召回率比起分类准确度来说,是更好的指标。
我们可以看看下面这个例子 image2 我们自己知道这个预测系统没有什么意义,但它的准确率仍为99.9%

四、实例

这里以手写数字识别的例子进行举例分析

import numpy as np
from sklearn import datasets

digits = datasets.load_digits()
x = digits.data 
y = digits.target.copy()

# 构造偏斜数据,=9 为1 ,!=9的为0
y[digits.target == 9] = 1
y[digits.target  != 9] = 0

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 666)

from sklearn.linear_model import LogisticRegression

log_reg = LogisticRegression()
log_reg.fit(x_train, y_train)
log_reg.score(x_test, y_test)

输出

0.9755555555555555
# 调用log_reg.predict方法,传入x_test
y_log_predict = log_reg.predict(x_test)

from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_log_predict)

输出

array([[403,   2],  
       [  9,  36]], dtype=int64)  
from sklearn.metrics import precision_score
print('precision_score:', precision_score(y_test,y_log_predict)  

from sklearn.metrics import recall_score
print('recall_score:', recall_score(y_test,y_log_predict))    

输出

precision_score: 0.947368421053
recall_score: 0.8

五、小结

当数据极度偏斜时,只使用分类准确度是远远不够的,需要用精准率和召回率进行进一步评价。


转载请注明:yezuolin的博客 » 点击阅读原文