对准确率(Accuracy)、精确率(Precision)、召回率(Recall)、PR曲线、ROC曲线、F1 Score的理解

  • 混淆矩阵
           对于一个二分类问题,预测类别与实际类别有如下表的对应关系,又称为混淆矩阵。
    在这里插入图片描述
  • 准确率(Accuracy)
           是系统最常见的评价指标,公式 ACCR=(TP+TN)/(TP+TN+FP+FN),其含义为,所有样本中预测正确样本(TP+TN)的占比,一般来说系统的准确率越高,性能越好。但是,对于正负样本数量极不均衡的情况,只通过准确率(Accuracy)往往难以反映系统的真实性能。
           举例说明,对于一个地震预测系统,假设所有样本中,1000天中有1天发生地震,记:0:不地震,1:地震,分类器不假思索的将所有样本分类为0,即可得到99.99%的准确率,当地震真正来临时,并不能成功预测,这种结果是我们不能接受的。
  • 精确率(Precision)
           又叫查准率,PR=TP/(TP+FP),其含义为,预测为真的样本中实际为真的样本的占比。
  • 召回率(Recall)
           又称查全率,TPR=TP/(TP+FN),其含义为,所有实际为真的样本中,预测为真的样本的占比。顾名思义,“查全”表明预测为真覆盖到了多少实际为真的样本,换句话说遗漏了多少。
           举例说明:对于预测病人是否患有癌症系统,假如100个人中20个人患有癌症。
           如果为了保证查准率,特别有把握的才诊断为癌症,可能结果是诊断10个人患有癌症,实际9个人患有癌症,那么查准率为9/10=90%,查全率为9/20=45%,查全率较低,说明有11个癌症病人没有被确诊为癌症,会因此延误有效的治疗时机,这个结果是难以接受的。
           如果为了保证查全率,诊断40人患有癌症,实际有18个人患有癌症,那么查全率为18/20=90%,而查准率为18/40=45%,查准率较低,结果是有22个人误诊为癌症,会接受极大损害身体的治疗,也造成经济损失,这样的结果也是不能接受的。
  • 查准率-查全率曲线(PR曲线)
    在这里插入图片描述
           从上面的例子中可以看出,查准率和查全率是一对矛盾的性能指标,我们期望有一个理想的系统使得两者的概率都能无限逼近1。也就是上图中的查准率-查全率曲线(PR曲线),尽可能的接近坐标(1,1)。
           通常情况下,做搜索任务,在保证查全率的情况下,提升查准率;做疾病判别、反垃圾任务,保证查准率的前提下,提升查全率。
  • ROC曲线和AUC
           ROC全称:Receiver Operating Characteristic。ROC有两个指标,分别是:
           1.TPR=TP/(TP+FN),True Positive Rate,又叫查全率,表明将正例分类正确的概率,ROC的纵坐标。
           2.FPR=FP/(FP+TN),False Positive Rate,将负例错分为正例的概率,ROC的横坐标。
           我们期望一个好的系统,TPR尽可能高,FPR尽可能低,所以下图中的曲线最理想的点是(0,1),最差的点是(1,0),图中的虚线代表了随机分类器,一般的分类器的ROC在虚线之上。那么如何评价图中三条曲线的好坏呢?一个通用的办法是比较三者跟横坐标之间的面积,即AUC(Area Under Curve),面积越大,则性能越好。
    在这里插入图片描述
  • ROC曲线和PR曲线的区别
           1.当正负原本数量比较均衡的时候,两者差别不大,当数量比例失衡时,ROC曲线不如PR曲线能更好的反映出分类器的真实性能,通过PR曲线的查准率指标反映出来。
           2.PR曲线比ROC曲线更关注正样本,ROC曲线兼顾了两者。
  • F1 Score
    在这里插入图片描述
           如图所示,如何通过查准率和查全率去评定一个分类器算法的好坏?直观的想法是用两者的平均,即(P+R)/2,但这样有个问题,对于无脑判定所有样例为真的垃圾分类器,查全率很高甚至接近1,完全放弃了查准率,或者完全放弃查全率,一味追求查准率,两者通过公式(P+R)/2综合的得分不会太低,这样的结果是我们不希望的。而F1 Score公式(2PR)/(P+R)则引入了对小值的惩罚,当P或R中某项指标很小,分子PR的值则趋近于0,只有当两者比较大,都趋近于1时,公式整体的值才会趋近于1。
  • 参考文章
  1. https://blog.youkuaiyun.com/u012879957/article/details/80564148
  2. https://www.cnblogs.com/Zhi-Z/p/8728168.html
  3. https://blog.youkuaiyun.com/tsq292978891/article/details/82997808
  4. https://study.163.com/course/courseLearn.htm?courseId=1004570029#/learn/video?lessonId=1051925288&courseId=1004570029
<think>好的,我现在需要解决用户的问题,即编写Python代码来计算分类模型在训练集和测试集上的准确率精确召回率F1分数和AUC值,并绘制ROC曲线。同时,用户还希望得到相关的解释。我得仔细思考如何一步步实现这些指标的计算,并确保代码正确无误。首先,用户提到的几个指标都是分类任务中常用的评估指标。我需要回忆每个指标的计算方法和所需的库。准确率是正确预测的比例,精确是正例预测中真实正例的比例,召回率是真实正例中被正确预测的比例,F1精确召回率的调和平均。AUC值则需要计算ROC曲线下的面积,而ROC曲线是以假正为横轴,真正为纵轴绘制的曲线。 接下来,我需要考虑使用哪些Python库。通常,scikit-learn(sklearn)提供了这些指标的计算函数,比如accuracy_scoreprecision_scorerecall_scoref1_scoreroc_auc_score,以及绘制ROC曲线所需的roc_curve。此外,可能需要matplotlib来绘图。然后,我需要确保用户已经有了训练好的分类模型。假设用户已经将模型训练好,并且对训练集和测试集进行了预测,得到了概预测结果(如y_train_pred_prob和y_test_pred_prob)。通常,为了得到精确等指标,需要将概转换为类别标签,比如通过设置阈值(默认0.5)来决定正类和负类。 接下来,代码的结构应该是这样的:1. 导入必要的库。 2. 使用模型对训练集和测试集进行预测,得到预测标签和预测概。3. 分别计算各个指标,对训练集和测试集分别处理。 4.绘制ROC曲线,需要计算每个数据集的fpr和tpr,然后使用matplotlib绘图。 需要注意的问题包括: - 确保预测概是正类的概,通常roc_auc_score需要传入正类的概。 -处理多分类问题时可能需要调整参数,但用户的问题可能默认是二分类,所以假设是二分类的情况。- 在计算精确召回率时,如果数据不平衡,可能需要指定average参数,比如average='binary'或者'micro'等,需要根据情况调整。这里假设二分类,使用默认的average参数。 现在,编写代码的大致步骤: 首先,导入所需的库: from sklearn.metrics import accuracy_score, precision_score,recall_score, f1_score, roc_auc_score, roc_curve import matplotlib.pyplot as plt然后,假设model是已经训练好的分类器,X_train, X_test是训练和测试特征,y_train, y_test是真实标签。 对训练集和测试集进行预测:y_train_pred =model.predict(X_train) y_train_pred_prob = model.predict_proba(X_train)[:, 1] #获取正类的概y_test_pred= model.predict(X_test) y_test_pred_prob = model.predict_proba(X_test)[:,1] 然后,计算各个指标:对于训练集:train_accuracy =accuracy_score(y_train, y_train_pred) train_precision= precision_score(y_train, y_train_pred) train_recall = recall_score(y_train, y_train_pred) train_f1 = f1_score(y_train, y_train_pred) train_auc= roc_auc_score(y_train, y_train_pred_prob) 同样地,测试集的计算类似。 接下来,绘制ROC曲线,需要分别计算训练集和测试集的fpr和tpr: fpr_train, tpr_train, _ =roc_curve(y_train, y_train_pred_prob)fpr_test,tpr_test,_ = roc_curve(y_test, y_test_pred_prob) 然后使用plt绘图,添加图例、标题等。 最后,将所有的指标打印出来,或者以表格形式展示。但是,用户可能需要将训练集和测试集的指标分开显示,所以可能需要分别处理。 现在,将这些步骤整合成代码。需要注意的是,有些模型可能没有predict_proba方法,比如SVM默认没有,需要设置probability=True。但用户的问题中可能使用的是逻辑回归等有概输出的模型。假设这里模型支持predict_proba。 现在,编写完整的代码示例: ```pythonfrom sklearn.metrics import accuracy_score, precision_score,recall_score, f1_score, roc_auc_score, roc_curve import matplotlib.pyplot as pltdef evaluate_model(model, X_train,y_train, X_test, y_test): #训练集预测y_train_pred= model.predict(X_train) y_train_prob = model.predict_proba(X_train)[:,1]# 测试集预测 y_test_pred = model.predict(X_test)y_test_prob= model.predict_proba(X_test)[:, 1]#计算训练集指标train_metrics = {'Accuracy': accuracy_score(y_train,y_train_pred),'Precision': precision_score(y_train, y_train_pred), 'Recall': recall_score(y_train, y_train_pred),'F1':f1_score(y_train, y_train_pred), 'AUC': roc_auc_score(y_train, y_train_prob)} #计算测试集指标 test_metrics = {'Accuracy':accuracy_score(y_test, y_test_pred), 'Precision': precision_score(y_test, y_test_pred),'Recall': recall_score(y_test,y_test_pred),'F1': f1_score(y_test, y_test_pred),'AUC':roc_auc_score(y_test,y_test_prob)}# 打印结果print("训练集指标:")for metric,value in train_metrics.items():print(f"{metric}: {value:.4f}")print("\n测试集指标:")for metric,value in test_metrics.items():print(f"{metric}: {value:.4f}")# 绘制ROC曲线plt.figure(figsize=(8,6))# 训练集ROCfpr_train,tpr_train,_ = roc_curve(y_train, y_train_prob) plt.plot(fpr_train,tpr_train,label=f'TrainAUC = {train_metrics["AUC"]:.2f}')# 测试集ROC fpr_test, tpr_test, _= roc_curve(y_test,y_test_prob)plt.plot(fpr_test, tpr_test, label=f'Test AUC= {test_metrics["AUC"]:.2f}') plt.plot([0,1], [0, 1], 'k--') #绘制对角线plt.xlabel('FalsePositive Rate')plt.ylabel('TruePositive Rate')plt.title('ROCCurve') plt.legend(loc='lower right')plt.show()# 示例使用: # 假设model是已训练好的分类器,X_train, y_train等数据已准备好 # evaluate_model(model, X_train, y_train, X_test,y_test) ```解释代码: -evaluate_model函数接受模型和训练测试数据,计算各项指标。 -使用model.predict得到预测标签,model.predict_proba得到概。 -计算各指标并存储到字典中,便于打印。- 绘制ROC曲线时,分别计算训练集和测试集的FPR和TPR,并绘制曲线,同时显示AUC值。 -绘制对角线作为参考线,表示随机猜测的效果。 需要注意的是,如果数据中存在多分类的情况,上述代码可能需要调整,比如在计算precisionrecall等指标时指定average参数。例如,对于多分类问题,可能需要使用average='macro'或其他选项。但用户的问题中可能默认是二分类,所以暂时按二分类处理。相关问题可能涉及这些指标的含义、如何处理多分类、不同模型对概输出的支持情况,或者如何调整阈值来影响这些指标等。</think>以下是计算分类模型评估指标并绘制ROC曲线的Python代码实现: ```python from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve) import matplotlib.pyplot as plt def evaluate_model(model, X_train, y_train, X_test, y_test): # 训练集预测 y_train_pred = model.predict(X_train) y_train_proba = model.predict_proba(X_train)[:, 1] # 测试集预测 y_test_pred = model.predict(X_test) y_test_proba = model.predict_proba(X_test)[:, 1] # 训练集指标计算 train_metrics = { 'Accuracy': accuracy_score(y_train, y_train_pred), 'Precision': precision_score(y_train, y_train_pred), 'Recall': recall_score(y_train, y_train_pred), 'F1': f1_score(y_train, y_train_pred), 'AUC': roc_auc_score(y_train, y_train_proba) } # 测试集指标计算 test_metrics = { 'Accuracy': accuracy_score(y_test, y_test_pred), 'Precision': precision_score(y_test, y_test_pred), 'Recall': recall_score(y_test, y_test_pred), 'F1': f1_score(y_test, y_test_pred), 'AUC': roc_auc_score(y_test, y_test_proba) } # 打印指标结果 print("训练集评估指标:") for metric, value in train_metrics.items(): print(f"{metric}: {value:.4f}") print("\n测试集评估指标:") for metric, value in test_metrics.items(): print(f"{metric}: {value:.4f}") # 绘制ROC曲线 plt.figure(figsize=(10, 6)) # 训练集ROC fpr_train, tpr_train, _ = roc_curve(y_train, y_train_proba) plt.plot(fpr_train, tpr_train, label=f'Train ROC (AUC = {train_metrics["AUC"]:.2f})') # 测试集ROC fpr_test, tpr_test, _ = roc_curve(y_test, y_test_proba) plt.plot(fpr_test, tpr_test, label=f'Test ROC (AUC = {test_metrics["AUC"]:.2f})') plt.plot([0, 1], [0, 1], 'k--', label='Random Guessing') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic (ROC) Curve') plt.legend(loc='lower right') plt.show() # 使用示例(需要替换为实际模型和数据): # from sklearn.linear_model import LogisticRegression # model = LogisticRegression().fit(X_train, y_train) # evaluate_model(model, X_train, y_train, X_test, y_test) ``` 代码解释: 1. `accuracy_score`:计算正确预测样本占总样本的比例 2. `precision_score`:计算预测为正类的样本中实际为正类的比例 3. `recall_score`:计算实际为正类的样本中被正确预测的比例 4. `f1_score`:精确召回率的调和平均数 5. `roc_auc_score`:计算ROC曲线下方面积值 6. `roc_curve`:计算绘制ROC曲线所需的FPR和TPR值 7. 函数最终会输出表格形式的评估指标和可视化的ROC曲线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值