大家好,我是Bryce。
这次和大家分享机器学习涉及到的内容——分类器性能评估,包括准确率、精确率、召回率、PR曲线、ROC曲线等。
一、准确率(Accuracy)
准确率并不是一个很好的分类器性能指标,尤其是当处理的数据集存在偏差时(一些类比其他类多得多)。比如有9个苹果和1个香蕉,那我猜测10个都不是香蕉的准确率也高达90%。
在Python中,准确率指标可以使用cross_val_score()函数评估,同时使用K折交叉验证。具体形式如下,其中,cv=3表示3折。
from sklearn.model_selection import cross_val_score
cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring='accuracy')
二、混淆矩阵
如上图所示,混淆矩阵每一行代表一个实际的结果,每一列代表一个预测的结果。分别有TP、FN、FP、TN四种结果,有Accuracy(准确率)、Precision(精确率)、Sensitivity(召回率或灵敏度)、Specificity(特异度)和Negative Predictive Value(反例预测率)5种衡量指标,它们的计算公式如上图。
还是以苹果、香蕉举例子(苹果为正例,香蕉为反例):
- TP:真正例,把苹果认成了苹果;
- FN:伪反例,把苹果认成了香蕉;
- FP:伪正例,把香蕉认成了苹果;
- TN:真反例,把香蕉认成了香蕉。
Accuracy(准确率):不管正负例,预测对的占多少。
Precision(精确率):找了这么多正例,找对了多少。
Sensitivity(召回率):有这么多正例,找出了多少。
在Python中计算混淆矩阵比较简单,如下:
from sklearn.metrics import confusion_matrix
confusion_matrix(y_train, y_train_pred)
其中,y_train表示训练值,y_train_pred表示预测值。
衡量指标中用的比较多的是精确率和召回率,它们的值可以在计算出混淆矩阵后,按照上图公式计算,也可以直接调用对应的函数。
from sklearn.metrics import precision_score, recall_score
precision_score(y_train, y_train_pred)
recall_score(y_train, y_train_pred)
其中,precision_score表示精确率,recall_score表示召回率。
F1值
F1值结合了精确率和召回率,是它们的调和平均。普通的平均值平等看待所有值,而调和平均会给小的值更大的权重。要想获得一个高的F1值,精确率和召回率要同时高。
from sklearn.metrics import f1_score
f1_score(y_train, y_train_pred)
精确率和召回率之间存在一种折中关系,提高精确率会降低召回率。到底需要较高的精确率还是较高的召回率,不能一概而论,具体场景具体分析。需要找得对就需要高的精确率,也就是想要的一定是好的;不想把想要的漏掉太多,就需要较高的召回率。
某模型的精确率、召回率与阈值的关系曲线如下,横坐标表示算法判断的阈值(大于阈值为正,否则为负):
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train, y_scores) # y_scores是决策分数,不是预测值
从图中就可以看出精确率和召回率之间的博弈关系。
仔细看我们会发现,召回率曲线比较平滑,而精确率曲线在性能较高时会有波动,这表示提高阈值,精确率并不一定会提高。
精确率和召回率之间的关系曲线(PR曲线)如下:
三、ROC曲线
ROC曲线横坐标为FPR(伪正例率),纵坐标为TPR(真正例率,也即召回率),其中FPR=1-TNR,TNR就是特异性。
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train, y_scores)
一个评估分类器好坏的方法是:计算ROC曲线下的面积,roc_auc_score()可实现。面积越大,性能越好,从图来看,就是更靠近左上角。(PR曲线应该尽可能的靠近右上角)
from sklearn.metrics import roc_auc_score
roc_auc_score(y_train, y_scores)
PR曲线还是ROC曲线?
当正例非常少或者你更关注伪正例(FP)而不是伪反例(FN)时,你应该选择PR曲线, 反之则是ROC曲线。
本文转载自微信公众号「且听数据说」,作者「Bryce」,可以通过以下二维码关注。
转载本文请联系「且听数据说」公众号。