【笔记】几个常见评价指标:Accuracy、Precision、Recall、F-measure和ROC曲线

在之前的练习中,评价模型的好坏我都采用了准确率(accuracy),准确率即分类正确的样本数占总样本数的比例。与准确率对应的还有错误率,即分类错误的样本数占总样本数的比例。以下引用西瓜书(《机器学习》)中的例子。准确率和错误率就是在一车西瓜中,有多少比例的瓜被判断正确或判断错误。假如我们的关注点不仅仅在分类是否正确,而是要知道有多少瓜是好瓜,好瓜有多少被正确的分类出来,那么用准确率是不太直观的,所以还有其他的评价方法,如精确率(Precision)、召回率(Recall)、F-measure和ROC曲线。

混淆矩阵

对于二分类问题,根据分类结果与实际结果相比较,可以将分类结果分为四种
在这里插入图片描述
TP+FN+FP+TN=样本总数
以分类结果1/0为例
TP:预测结果为1,实际结果为1
FN:预测结果为0,实际结果为1
FP:预测结果为1,实际结果为0
TN:预测结果为0,实际结果为0

精确率

还是以西瓜为例,精确率就是挑出的西瓜中,有多少比例是好瓜。这句话中,挑出的西瓜就是我们模型预测结果为正例的那些西瓜,就是模型认为是好瓜的那些西瓜,这其中包括真的是好瓜的西瓜和不是好瓜而被模型认为的好瓜的西瓜…
精确率就是真正的好瓜和挑出西瓜的百分比,即: P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP乍看之下精确度好像并不没有什么突出的地方。但如果以公安系统的人脸识别为例,根据人脸图像分类为嫌疑犯和非嫌疑犯,嫌疑犯就是上述的挑出瓜,那肯定希望在嫌疑犯中,是罪犯(好瓜)的人数越多越好,这是就需要精确率P越高越好。

召回率

召回率就是在全部好瓜中,有多少好瓜能被正确的挑出来。全部好瓜就是被模型预测为好瓜的好瓜+被模型预测为坏瓜的好瓜,即TP+FN,所以召回率表达式为: R = T P T P + F N R=\frac{TP}{TP+FN} R=TP+FNTP

召回率与精确率是相互矛盾的。比如,我们要使召回率较高,可以多挑几个瓜,没准其中就有好瓜,但是这种方法,会掺杂进坏瓜,让挑出的西瓜中,好瓜的比例降低,即精确率降低了。

P-R图

根据精确率和召回率两者矛盾的关系,我们可以以P为Y轴,R为X轴做一个两者的关系图。
一般的机器模型的预测结果,会按照“最可能”是正例至“最不可能”是正例的样本进行排序。我们可以计算每个样本点的P(精确率)和R(召回率),并在图上将这个样本点表示出来,最后将整个数据集的样本点都连起来,就得到P-R曲线。
在这里插入图片描述
上图是西瓜书中所给的例图,查准率就是精确率,查全率就是召回率。
可以看到有A、B、C三条曲线,A、B、C是对于同一个数据集的机器学习模型,加入一个模型的P-R曲线能完全“包"住另一个模型的P-R曲线,可以认为前者优于后者,如图中的A与C,A的曲线包住了C,所以A模型优于C。但如果两个P-R曲线有相交,并完全包住,这时则需要根据实际来考虑,根据数据集对P要求高还是对R要求高,即P、R的权重,常用F值来判断。

F-measure(F值)

当需要协调P和R的矛盾时,常用F-measure的方法。
F-measure是对P和R的加权和平均,表达式是:
F β = ( β 2 + 1 ) ⋅ P ⋅ R β 2 ⋅ P ⋅ R F_β=\frac{(β^2+1)·P·R}{β^2·P·R} Fβ=β2PR(β2+1)PR将它写成倒数形式更加直观
1 F β = 1 1 + β 2 ⋅ ( 1 P + β 2 R ) \frac{1}{F_β}=\frac{1}{1+β^2}·(\frac{1}{P}+\frac{β^2}{R}) Fβ1=1+β21(P1+Rβ2)
当β=1时,为 F 1 = 2 ⋅ P ⋅ R P ⋅ R F_1=\frac{2·P·R}{P·R} F1=PR2PR
当β>1时,召回率较为重要
当β<1时,精确率较为重要
所以,可以根据需求设置β值

ROC曲线与AUC

ROC(Receiver Operating Characteristic)受试者特征曲线
AUC(Area under Curve )意思是曲线下面积。
以下内容参考:机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)是怎么一回事
ROC图很像P-R图,不同的就是它的横纵坐标变了
在这里插入图片描述
ROC曲线是以真正率(TPR=TP/(TP+FN))为纵坐标,以假正率(FPR,FPR=FP/(FP+TN))为横坐标。
我们分类时,通常使用0.5作为阈值,若分类结果大于0.5就认为为正,小于0.5为负。若我们调整阈值,混淆矩阵中四种分类结果的数量将会发生改变,此时的真正率为X,假正率为Y,记点(X,Y)。在0~1不断调整阈值,会有许多点(X,Y),根据这些点可做出ROC曲线
曲线与轴围成的面积为AUG,曲线下面积,AUC值越大的分类器,正确率越高。

ROC曲线相较于单独的精确率或召回率要显得更为合理,但存在一个问题就是ROC曲线在高度不平衡的数据条件下的的表现仍然过于理想,不能够很好的展示实际情况,这时不妨采用P-R图试试。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,可以使用sklearn.metrics模块中的函数来计算随机森林的各项性能指标。下面是一个示例代码: ```python from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, roc_curve, precision_recall_curve, auc from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt # 加载数据集 data = load_iris() X = data.data y = data.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 训练随机森林模型 rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X_train, y_train) # 在测试集上进行预测 y_pred = rf.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) # 计算混淆矩阵 cm = confusion_matrix(y_test, y_pred) print('Confusion matrix:\n', cm) # 输出分类报告 report = classification_report(y_test, y_pred) print('Classification report:\n', report) # 计算ROC曲线和AUC值 y_proba = rf.predict_proba(X_test) fpr, tpr, thresholds = roc_curve(y_test, y_proba[:, 1], pos_label=2) roc_auc = auc(fpr, tpr) print('ROC AUC:', roc_auc) # 绘制ROC曲线 plt.figure() plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (AUC = %0.2f)' % roc_auc) plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver operating characteristic') plt.legend(loc="lower right") plt.show() # 计算PRC曲线和AUC值 precision, recall, thresholds = precision_recall_curve(y_test, y_proba[:, 1], pos_label=2) prc_auc = auc(recall, precision) print('PRC AUC:', prc_auc) # 绘制PRC曲线 plt.figure() plt.plot(recall, precision, color='darkorange', lw=2, label='PRC curve (AUC = %0.2f)' % prc_auc) 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() ``` 在上述代码中,首先使用load_iris函数加载鸢尾花数据集,然后将数据集划分为训练集和测试集。接着,使用RandomForestClassifier函数创建随机森林模型并在训练集上进行训练,然后在测试集上进行预测。然后,使用sklearn.metrics模块中的函数计算准确率、混淆矩阵、分类报告、ROC曲线和AUC值、PRC曲线和AUC值,并使用matplotlib库绘制ROC曲线和PRC曲线。 需要注意的是,以上代码中的y_proba[:, 1]是指预测为正例的概率,这里默认将类别为2的鸢尾花作为正例。如果需要将其他类别作为正例,需要将pos_label参数设置为相应的类别标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值