草庐IT

【超详细】机器学习sklearn之分类模型评估 混淆矩阵、ROC曲线、召回率与精度、F1分数

笑裹群鏖 2024-07-06 原文

学习目标:

机器学习之分类模型的评估

学习内容:

学习分类模型评估的方法:
1、混淆矩阵
2、分类结果汇总
3、ROC曲线
4、召回率与精度
5、F1分数

基本知识:

一、评估分类器性能的度量
1、真正(true positive, TP)或f++,对应的是被分类模型正确预测的正样本数。
2、假负(false negative, FN)或f±对应的是被分类模型错误预测为负类的正样本数。
3、假正(false positive, FP)或f-+, .对应的是被分类模型错误预测为正类的负样本数。
4、真负(ture negative, TN)或f–, 对应的是被分类模型正确预测的负样本数。

实验步骤:

一、混淆矩阵

1、导入鸢尾花数据集

from sklearn.datasets import load_iris
iris = load_iris()

2、二分法拆分数据

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.3,random_state = 666)

3、构建决策树模型

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(x_train, y_train)

结果为:

DecisionTreeClassifier()

4、模型预测

dt.predict(x_test)

结果为:

array([1, 2, 1, 2, 0, 1, 1, 2, 1, 1, 1, 0, 0, 0, 2, 1, 0, 2, 2, 2, 1, 0,
       2, 0, 1, 1, 0, 1, 2, 2, 0, 0, 1, 2, 1, 1, 2, 2, 0, 1, 2, 2, 1, 1,
       0])

5、模型评估

from sklearn.metrics import classification_report#导入混淆矩阵对应的库
print(classification_report(y_test,dt.predict(x_test)))

结果为:

                precision    recall  f1-score   support

           0       1.00      1.00      1.00        12
           1       1.00      1.00      1.00        18
           2       1.00      1.00      1.00        15

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45

6、输出训练集上的混淆矩阵

#混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_train,dt.predict(x_train))
cm

结果为:

array([[38,  0,  0],
       [ 0, 32,  0],
       [ 0,  0, 35]], dtype=int64)
#自定义类别顺序输出混淆矩阵
confusion_matrix(y_train,dt.predict(x_train),labels = [2,1,0])

结果为:

array([[35,  0,  0],
       [ 0, 32,  0],
       [ 0,  0, 38]], dtype=int64)

7、用热力图展示混淆矩阵

#用热力图展示混淆矩阵
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.heatmap(cm,cmap = sns.color_palette("Blues"),annot = True)

结果如图:

**【注意】:**在热力图中需要提前电脑安装matplotlib库,否则无法使用热力图
安装matplotlib库方法:打Anaconda => Anaconda Prompt => 输入 pip install matplotlib
等待安装完成即可。

**

二分类结果汇总

**

from sklearn.metrics import classification_report
a = classification_report(y_train,
                          dt.predict(x_train),
                          digits = 3,#小数点后保留的位数
                          labels = [2,1,0],#类别的排序
                          target_names = ['第2类','第1类','第0类'],#类别的名称
                          output_dict = False)#结果是否以字典的形式输出
print(a)

结果为:

三、ROC曲线

1、导入所需要的库
数据集如下:

from sklearn.metrics import roc_curve
#录入数据
import numpy as np
y_true = np.array([1,1,0,1,1,0,0,0,1,0])
y_score = np.array([0.9,0.8,0.7,0.6,0.55,0.54,0.53,0.51,0.50,0.40])

2、调用roc_curve 求出fpr与tpr

fpr,tpr,thresholds = roc_curve(y_true,y_score)

3、打印结果

print(fpr,tpr,thresholds,sep = '\n')

结果为:

[0.  0.  0.  0.2 0.2 0.8 0.8 1. ]
[0.  0.2 0.4 0.4 0.8 0.8 1.  1. ]
[1.9  0.9  0.8  0.7  0.55 0.51 0.5  0.4 ]

4、修改参数drop_intermediate 值为False

fpr1,tpr1,thresholds1 = roc_curve(y_true,y_score,drop_intermediate = False)

输出结果:

print(fpr1,tpr1,thresholds1,sep = '\n')

结果:

[0.  0.  0.  0.2 0.2 0.2 0.4 0.6 0.8 0.8 1. ]
[0.  0.2 0.4 0.4 0.6 0.8 0.8 0.8 0.8 1.  1. ]
[1.9  0.9  0.8  0.7  0.6  0.55 0.54 0.53 0.51 0.5  0.4 ]

5、绘制ROC曲线

plt.plot(fpr1,tpr1,'r*-')
plt.plot([0,1],[0,1])
plt.plot("FPR")
plt.plot("TPR")
plt.title("ROC Curve")


6、计算ROC曲线下的面积

from sklearn.metrics import roc_auc_score
roc_auc_score(y_true,y_score)

结果为:

0.76

四、召回率与精度

模型评估:

1、导入所需的库

import numpy as np
from sklearn.metrics import precision_recall_curve

2、录入数据

y_true = np.array([0,0,0,0,0,1,1,1,1,1])
y_scores = np.array([0.1,0.2,0.25,0.4,0.6,0.2,0.45,0.6,0.75,0.8])

3、召回率与精度的计算

precision,recall,thresholds = precision_recall_curve(y_true,y_scores)
len(precision),len(recall),len(thresholds)

结果为:

(8, 8, 7)
thresholds

结果为:

array([0.2 , 0.25, 0.4 , 0.45, 0.6 , 0.75, 0.8 ])

召回率:

precision

结果为:

array([0.55555556, 0.57142857, 0.66666667, 0.8       , 0.75      ,
       1.        , 1.        , 1.        ])

精度:

recall

结果为:

array([1. , 0.8, 0.8, 0.8, 0.6, 0.4, 0.2, 0. ])

#plt.grid()

plt.scatter(thresholds,precision[:-1])

结果为:

召回率散点图:

plt.scatter(thresholds,recall[:-1])

结果为:

精度散点图:

plt.scatter(recall,precision)

plt.plot(recall,precision,'r-*')


4、多值预测问题需要转化为二值预测问题进行评估

from sklearn.preprocessing import binarize
y = binarize(iris.target.reshape(-1,1))

5、输出预测的平均精确率

from sklearn.metrics import average_precision_score
average_precision = average_precision_score(y_true,y_scores)
average_precision

结果为:

0.8211111111111111

*

五、F1分数

1、导入所需的库

from sklearn.metrics import f1_score
from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier()
mlp.fit(iris.data,iris.target)

2、进行F1分数计算

f1_score(iris.target,mlp.predict(iris.data),average = 'micro')
0.9733333333333334
f1_score(iris.target,mlp.predict(iris.data),average = 'macro')
0.9732905982905983
f1_score(iris.target,mlp.predict(iris.data),average = 'weighted')
0.9732905982905984

有关【超详细】机器学习sklearn之分类模型评估 混淆矩阵、ROC曲线、召回率与精度、F1分数的更多相关文章

  1. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  6. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  7. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  8. ruby-on-rails - ruby on rails 模型验证中的浮点精度 - 2

    我正在尝试使用正则表达式验证美元金额:^[0-9]+\.[0-9]{2}$这工作正常,但每当用户提交表单并且美元金额以0(零)结尾时,ruby(或rails?)将0砍掉。所以500.00变成500.0,因此正则表达式验证失败。有没有办法让ruby​​/rails保持用户输入的格式,而不管尾随零? 最佳答案 我假设您的美元金额是小数类型。因此,用户在字段中输入的任何值在保存到数据库之前都会从字符串转换为适当的类型。验证适用于已转换为数字类型的值,因此在您的情况下,正则表达式并不是真正合适的验证过滤器。不过,您有几种可能性可以解决这个问

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

随机推荐