5.7 观察正确率的背后:准确率和召回率
让我们回过头来再想想我们正在尝试实现什么。到现在为止我们是用正确率来衡量效果的,但事实上,我们并不需要一个分类器来完美地预测出好答案和坏答案。只需要把分类器调到对某一个类别预测的效果特别好,我们就可以把它反馈给用户。例如,如果我们的分类器总能对劣质答案做出正确预测,那在检测到一个劣质答案之前就无需反馈。反之,如果分类器总能正确预测优质答案,那么我们就可以在开始阶段为用户提供有帮助的评论,然后在分类器说它是优质答案的时候把这些评论删除。
要弄清现在所处的位置,我们需要理解如何评估准确率和召回率。要理解这些,需要深入看一下4种不同的分类结果,如下表所示:
被分类成 | |||
正例 | 负例 | ||
事实上是 | 正例 | 真正例(TP) | 假负例(FN) |
负例 | 假正例(FP) | 真负例(TN) |
例如,如果分类器把一个样本预测为正例,而这个样本确实是正例,那么这就是一个真正例。另一方面,如果分类器把样本分错了,比如将样本识别为负例,但实际上是正例,那这个样本就是假负例。
我们需要的是在预测帖子好坏的时候有一个高成功率,但并不一定两者都要。这是说,我们想要的是尽可能多的真正例。也就是准确率 :
相反,如果我们的目标是检测出尽可能多的好/坏答案,我们就会对召回率 更感兴趣:
下图显示了所有的好答案,以及被分类成好答案的答案。
在前面的图表中,准确率是与右圈相交的部分,而召回率是与左圈相交的部分。
那么,我们应该如何优化准确率呢?到现在为止,我们一直是把0.5当做判别答案好坏的阈值。我们现在可以做的是,在0到1这个区间内变换阈值,同时统计TP、FP和FN样本的数量。有了这些统计值,我们就可以画出在不同召回率上的准确率。
矩阵模块中的precision_recall_curve() 函数已经把所有这些都计算好了,如下面代码所示:
>>> from sklearn.metrics import precision_recall_curve >>> precision, recall, thresholds = precision_recall_curve(y_test, clf.predict(X_test)
一个类别的预测效果可接受,并不意味着对其他类别的预测也总是可接受的。这可以从下面两个图中看出来。我们画出了准确率/召回率曲线,分别针对劣质答案分类(左图)和优质答案分类(右图):
提示 在前图中,我们还使用了一个更好的描述分类器性能的方法:曲线下面积 (AUC)。这个可以理解为分类器的平均准确率,它是一种用于比较不同分类器效果的好方法。
可以看到,我们基本上可以不用考虑预测劣质答案了(左图)。这是因为预测劣质答案的准确率下降得非常快,并停留在难以接受的60%上,同时召回率也已经很低了。
然而,对于优质答案的预测,我们可以得到大于80%的准确率,同时召回率几乎为40%。让我们用下列代码找出所需要的阈值:
>>> thresholds = np.hstack(([0],thresholds[medium])) >>> idx80 = precisions>=0.8 >>> print("P=%.2f R=%.2f thresh=%.2f" % \ (precision[idx80][0], recall[idx80][0], threshold[idx80][0])) P=0.81 R=0.37 thresh=0.63
将阈值设为0.63,我们会看到,在检测优质答案的时候,如果可以接受37%的低召回率的话,我们仍然可以得到一个大于80%的准确率。这意味着,在3个好(原文有错)答案中我们只能检测到1个,但对这些已经检测到的答案,我们比较确定。
要把这个阈值应用到预测过程中,我们需要使用predict_proba() (它可以返回每个类别的概率)而不是predict() (它返回预测的类别本身)。
>>> thresh80 = threshold[idx80][0] >>> probs_for_good = clf.predict_proba(answer_features)[:,1] >>> answer_class = probs_for_good>thresh80
我们可以用classification_report 确认我们得到了预期的准确率和召回率1 :
>>> from sklearn.metrics import classification_report >>> print(classification_report(y_test, clf.predict_proba [:,1]>0.63, target_names=['not accepted', 'accepted'])) precision recall f1-score support not accepted 0.63 0.93 0.75 108 accepted 0.80 0.36 0.50 92 avg / total 0.71 0.67 0.63 200
1。下方代码中的一些译文如下:Precision为“准确率”,recall为“召回率”,f1-score为“f1分值”,support为“支持”,not accepted为“不接受的”,accepted为“接受的”,avg / total为“平均/总量”。——译者注
注意 使用这个阈值并不能保证我们总是能够得到高于之前用这个阈值所确定的准确率和召回率。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论