【机器学习】精确率(precision)、召回率(recall)以及F1分数的概念讲解加python代码实现
概念理解:一、理解查准率(precision)& 查全率(recall)我们在平时常用到的模型评估指标是精度(accuracy)和错误率(error rate),错误率是:分类错误的样本数站样本总数的比例,即E=n/m(如果在m个样本中有n个样本分类错误),那么1-a/m就是精度。除此之外,还会有查准率和查全率,下面举例解释。按照周志华《机器学习》中的例子,以西瓜问题为例。错误率:有多少比
概念理解:
一、理解查准率(precision)& 查全率(recall)
我们在平时常用到的模型评估指标是精度(accuracy)和错误率(error rate),错误率是:分类错误的样本数站样本总数的比例,即E=n/m(如果在m个样本中有n个样本分类错误),那么1-a/m就是精度。除此之外,还会有查准率和查全率,下面举例解释。按照周志华《机器学习》中的例子,以西瓜问题为例。
错误率:有多少比例的西瓜被判断错误;
查准率(precision):算法挑出来的西瓜中有多少比例是好西瓜;
查全率(recall):所有的好西瓜中有多少比例被算法跳了出来。
继续按照上述前提,对于二分类问题,我们根据真实类别与算法预测类别会有下面四个名词:
在写下面四个名词前,需要给一些关于T(true)、F(false)、P(positive)、N(negative)的解释:P表示算法预测这个样本为1(好西瓜)、N表示算法预测这个样本为0(坏西瓜);T表示算法预测的和真实情况一样,即算法预测正确,F表示算法预测的和真实情况不一样,即算法预测不对。
TP:正确地标记为正,即算法预测它为好西瓜,这个西瓜真实情况也是好西瓜(双重肯定是肯定);
FP:错误地标记为正,即算法预测它是好西瓜,但这个西瓜真实情况是坏西瓜;
FN:错误地标记为负,即算法预测为坏西瓜,(F算法预测的不对)但这个西瓜真实情况是好西瓜(双重否定也是肯定);
TN:正确地标记为负,即算法标记为坏西瓜,(T算法预测的正确)这个西瓜真实情况是坏西瓜。公式如下:
二、查准率(precision)& 查全率(recall)的关系
查准率和查全率是一对矛盾的指标,一般说,当查准率高的时候,查全率一般很低;查全率高时,查准率一般很低。比如:若我们希望选出的西瓜中好瓜尽可能多,即查准率高,则只挑选最优把握的西瓜,算法挑选出来的西瓜(TP+FP)会减少,相对挑选出的西瓜确实是好瓜(TP)也相应减少,但是分母(TP+FP)减少的更快,所以查准率变大;在查全率公式中,分母(所有好瓜的总数)是不会变的,分子(TP)在减小,所以查全率变小。
在实际的模型评估中,单用Precision或者Recall来评价模型是不完整的,评价模型时必须用Precision/Recall两个值。这里介绍三种使用方法:平衡点(Break-Even Point,BEP)、F1度量、F1度量的一般化形式。
BEP是产准率和查全率曲线中查准率=查全率时的取值,如下:P-R曲线与平衡点
从图中明显看出算法效果:A>B>C
- F1度量的准则是:F1值越大算法性能越好。
- 在一些实际使用中,可能会对查准率或者查全率有偏重,比如:逃犯信息检索系统中,更希望尽量少的漏掉逃犯,此时的查全率比较重要。会有下面F1的一般形式。
当beta>1时查全率重要,beta<1时查准率重要。
PYTHON实现+简单概念说明:
1. 四个概念定义:TP、FP、TN、FN
先看四个概念定义:
- TP,True Positive
- FP,False Positive
- TN,True Negative
- FN,False Negative如何理解记忆这四个概念定义呢?
举个简单的二元分类问题 例子:
假设,我们要对某一封邮件做出一个判定,判定这封邮件是垃圾邮件、还是这封邮件不是垃圾邮件?
如果判定是垃圾邮件,那就是做出(Positive)的判定;
如果判定不是垃圾邮件,那就做出(Negative)的判定。True Positive(TP):预测为正,判断正确;
False Positive(FP):预测为正,判断错误;
True Negative(TN):预测为负,判断正确;
False Negative(FN):预测为负,判断错误。
代码实现:
import numpy as np y_true = np.array([0, 1, 1, 0, 1, 0]) y_pred = np.array([1, 1, 1, 0, 0, 1]) #true positive TP = np.sum(np.logical_and(np.equal(y_true,1),np.equal(y_pred,1))) print(TP) #false positive FP = np.sum(np.logical_and(np.equal(y_true,0),np.equal(y_pred,1))) print(FP) #true negative TN = np.sum(np.logical_and(np.equal(y_true,1),np.equal(y_pred,0))) print(TN) #false negative FN = np.sum(np.logical_and(np.equal(y_true,0),np.equal(y_pred,0))) print(FN)
2. Precision、Recall、Accuracy、Error rate、F1 Score(F Score,F Measure)
五个概念定义:- precision = TP / (TP + FP)
- recall = TP / (TP + FN)
- accuracy = (TP + TN) / (TP + FP + TN + FN)
- error rate = (FN + FP) / (TP + FP + TN + FN)
- F1 Score = 2*P*R/(P+R),其中P和R分别为 precision 和 recall为什么要有F1 Score?也称F1 Measure,这是因为通常情况下,precision高的话,recall就会低;precision低的时候,recall往往比较高。为了权衡这种关系(tradeoff),所以有了F值。
当=1时候,也就是我们常说的F1 Score。
此外,还有TPR(True Positive Rate,纵轴)与FPR(False Positive Rate,横轴)构成的ROC(Receiver Operating Characteristic)曲线,以及AUC(Area Under Curve),即ROC曲线下面的面积。
- TPR = Recall = TP / (TP + FN)
- FPR = FP / (TN + FP)还有Precision(纵轴)和Recall(横轴)形成的PR曲线
代码实现:#请先安装sklearn、numpy库 from sklearn.metrics import precision_score, recall_score, f1_score import numpy as np y_true = np.array([[0, 1, 1], [0, 1, 0]]) y_pred = np.array([[1, 1, 1], [0, 0, 1]]) y_true = np.reshape(y_true, [-1]) y_pred = np.reshape(y_pred, [-1]) p = precision_score(y_true, y_pred, average='binary') r = recall_score(y_true, y_pred, average='binary') f1score = f1_score(y_true, y_pred, average='binary') print(p) print(r) print(f1score)
3.在推荐系统里实现precision、recall以及F1 Score:
R(u)表示根据用户在训练集上的行为给用户做出的Top-n推荐列表,
T(u)表示系统向用户推荐物品后,用户实际选择的物品集
代码实现:
def Precision_Recall_F1Score(train,test,N): hit = 0 n_recall = 0 n_precision = 0 for user in train.keys(): tu = test[user] rank = Recommend(user,N) for item ,pui in rank: if item in tu: hit += 1 n_recall += len(tu) n_precision += N recall = hit / (1.0 * n_recall) precision = hit / (1.0 * n_precision) F1 = (2 * precision * recall) / (precision + recall) return [precision, recall, F1]
其中Recommend()函数为推荐算法,本文仅给出使用precision,recall以及F值来作为评测指标的代码实现部分。
如需更多内容,请关注如下微信公众号:
添加胖哥微信:zy10178083,胖哥拉你进去python学习交流群,胖哥会不定期分享干货!
微信公众号:胖哥真不错。
更多推荐
所有评论(0)