机器学习项目实战7-Python实现决策树算法分类伪钞项目实战
off999 2024-11-26 07:24 16 浏览 0 评论
预设条件
- 中级IDE使用经验(Jetbrain Pycharm优先)
- 了解Python运行环境及其命令使用
- 对Python编程语言有很好的理解
- 基本了解Pandas(处理数据框架)、Numpy、Scikit Learn和Matplot库
- 一些统计学知识,对分析数据是有帮助的
运行环境
以下运行软件的版本号是经过验证的可成功运行的版本号,以供参考。
编号 | 软件名称 | 版本号 |
1 | Python | 3.9.19 |
2 | conda | 22.9.0 |
3 | pip | 23.3.1 |
4 | numpy | 1.26.4 |
5 | pandas | 2.2.1 |
6 | matplotlib | 3.8.4 |
7 | scikit-learn | 1.4.2 |
8 | scipy | 1.13.0 |
9 | seaborn | 0.13.2 |
10 | statsmodels | 0.14.2 |
项目背景
决策树是最常用和最广泛使用的监督机器学习算法之一,它可以执行回归和分类任务。决策树算法背后的直觉很简单,但也非常强大。
对于数据集中的每个属性,决策树算法形成一个节点,其中最重要的属性放置在根节点上。决策树的决策流程是,从根节点开始,沿着条件或“决策”的相应节点向下执行,一直持续到达叶子节点,而叶子节点包含了决策树的预测或结果。
比如考虑这样一个场景:有一个人向你借车给他开,你需要决定是否把车借给他,这里有几个因素可以帮助你做出决定:
- 这个人是亲密的朋友还是只是熟人?如果对方只是熟人,那就拒绝这个请求;如果这个人是你的朋友,那就进入下一步。
- 这个人是第一次借车吗?如果是,把车借给他,否则进入下一步。
- 上次他还车的时候车坏了吗?如有,则拒绝;如果没有,就把车借给他。
上述场景的决策树如下所示:
决策树的优点
使用决策树进行预测分析有几个优点:
- 决策树可以用来预测连续值和离散值,也就是说,它们对回归和分类任务都很有效
- 只需要相对较少的算力来训练算法
- 可用于对非线性数据进行分类
- 与KNN和其他分类算法相比,非常快速和有效
数据获取
本篇项目实战数据来源于网络,数据项统计如下:
编号 | 变量名称 | 描述 |
1 | variance | 方差 |
2 | skewness | 偏度 |
3 | curtosis | 曲率 |
4 | entropy | 熵 |
5 | class | 分类 |
数据详情如下(部分展示):
数据预处理
查看元数据
使用pandas工具的info()方法查看元数据:
从图中可以看到:数据集的类型是pandas.core.frame.DataFrame,索引范围从0到1371,一共1372条数据,数据列一共有5个,以及列出了每个列的名称、非空个数、数据类型等信息。
查看数据
使用pandas工具的head()方法查看前5行数据:
使用pandas工具的tail()方法查看最后5行数据:
可以看到数据集有5个数据列,分别是variance、skewness、curtosis、entropy、class。在这5个数据列中,前4个是连续值,最后1个是离散值。
因为本篇是要预测银行现钞的真伪,所以需要基于前4个列来预测最后1列。
Variance是小波变换的方差。这个值用来测量数据点与平均值的距离远近。如果数据点与平均值距离近,则数据的分布就是一个正常分布,也叫对称分布,这种情况是一种良好的分布,是非常容易进行预测的。在当前图像上下文中,这是由小波变换产生的系数的方差。方差越小,系数越接近实际图像。
skewness是小波变换的偏度。偏度是一个连续值,表示分布的不对称性。如果在均值左侧有更多的值,则分布呈负偏态。如果在均值右侧有更多的值,则分布呈正偏态。如果均值,众数和中位数相同,则分布是对称的。分布越对称,越接近正态分布。在目前的情况下,这是由小波变换产生的系数的偏度。越对称,方差、偏度、曲率、熵的系数越接近实际图像。
curtosis(又叫kurtosis)是小波变换的峰度。峰度是一个连续值,像偏度一样,也描述了分布的形状。根据峰度系数(k)的不同,与正态分布相比,一个分布可能或多或少是平坦的,或者在其末端或尾部有或多或少的数据。当分布更加分散和平坦时,它被称为平丘;当它不那么分散而更集中在中间时,成为常峰态;当分布几乎完全集中在中间时,它被称为尖峰态。这与方差和偏度之前的情况相同,分布越常峰态,系数越接近实际图像。
entropy是图像熵。熵也是一个连续值,它通常衡量系统中的随机性或无序性。在图像的上下文中,熵测量像素与其相邻像素之间的差异。系数的熵越大,图像变换时的损失就越大,熵越小,信息损失就越小。
class是分类。class是离散值,有0和1两个值,用来表示钞票是真的还是伪造的。可以使用Pandas的unique()方法检查第5列是否包含0和1。
上面的方法返回一个值为0和1的数组。这意味着class行中包含的值只有0和1。它可以作为我们监督学习的目标。这是一个整数值,当图像是伪造的时为0,当图像是真实的时为1。由于我们有这个class列,其中包含真实和伪造图像的标签,这意味着我们的学习类型是有监督的。
数据描述性统计
通过Pandas工具的describe()方法来查看数据的个数(count)、平均值(mean)、标准差(std)、最小值(min)、分位数(25%位、50%位、75%位)、最大值(max)。如下图所示:
查看数据项比例
由于class列只有0和1,但是它们之间的比例有多少?是0多一些还是1多一些呢?亦或者0跟1一样多?为了获取每个值的比例,可以使用value_counts()方法。
关键代码:
执行结果如下:
从上面执行的结果中可以看到,0有762个,1有610个,0比1多152个,这意味着假钞只比真钞要多一点,但如果假设0有5500个,1有610个,那么会造成更大的差异,这样就会导致对最终结果的负面影响。
为更清晰看出百分比,可以对数据进行归一化处理,处理后的结果如下:
由上图可知,大约56%的数据集是伪造的,44%是真实的,也就是说56:44的比例率,有12%的差异,这在统计学上被认为是一个很小的差异,因为它只是略高于10%,所以数据被认为是平衡的,如果不是56:44的比例,而是80:20或70:30的比例,那么这样的数据就会被认为是不平衡的,对于步平衡的数据需要采取一定的措施消除不平衡,但本文的使用的数据不需要这么做。
通过绘制直方图,可以更加直观的查看数据,可视化结果如下:
从上图可以看出,只有variance基本符合正态分布。
关键代码:
数据缺失值查看
使用Pandas工具的isnull()方法来查看数据项的缺失值情况,如下图所示:
从上图中可以看出,variance、skewness、curtosis、entropy、class等字段都没有缺失值的情况,无须对缺失值情况进行额外处理。
探索性数据分析
特征数据项分布分析
使用双变量分析法查看数值型特征variance、skewness、curtosis、entropy与class数据项之间关系的分布情况,用散点图显示出来。
上面的图形都是两两配对,这里限于篇幅就不全部展示了,大家可以去执行程序来查看每两组特征构建的图形。
当然,也可以把所有的特征分布的散点图构建到一张图形里,这里使用Seaborn库的pairplot()方法来实现。
关键代码:
执行代码,显示出的每组散点图如下所示:
从上图中可以看出,curtosis和variance是最简单的特征组合,它们可以通过一条线就能区分,它们是线性可分隔的。
构建模型
本章节将采用sklearn库中的DecisionTreeClassifier类来构建基础模型,再用该模型进行训练和测试。
数据准备
首先第一步,将数据集中的class列提取出来作为目标特征,然后第二步,将数据集分隔成训练集和测试集。X数据集含variance、skewness、curtosis、entropy列。Y数据集含class列。
X数据集如图所示:
Y数据集如图所示:
关键代码:
把整个数据集分成两个部分,一个部分是训练集,另一个部分是测试集,训练集占整个数据集的80%,测试集占整个数据集的20%。train_test_split()是随机采样,为避免每次运行都会采集到不同的结果,可以给random_state定义一个种子SEED,本例的SEED设置为42。
X_train数据集如图:
X_test数据集如图:
y_train数据集如图:
y_test数据集如图:
关键代码:
统计各个数据集的shape,可以看到训练集有1097条采样数据,测试集油275条采样数据。
训练模型
数据已经准备完毕,我们可以使用sklearn的DecisionTreeClassifier库来对训练集来训练决策树模型。训练模型采用fit()方法进行。
关键代码:
预测数据
模型训练好之后,可以用来对测试集进行预测。
以下是预测代码:
预测出来的结果如下:
评估模型
有几种方法可以将预测结果与实际结果进行比较,它们度量的是分类的不同方面。一些最常用的分类指标如下:
- 混淆矩阵(confusion Matrix):
当需要知道每个类别有多少样本是正确的或错误的时候,引入混淆矩阵。混淆矩阵有四个变量,真正例(True Positive, TP)、假正例(False Positive, FP)、真负例(True Negative, TN)、假负例(False Negative, FN)。
Positive/Negative(P/N)是预测结果的正负,True/False(T/F)是对预测结果正确与否的判断。也就是说:
- TP是代表实际结果为正例且预测结果是正例,那说明判断是正确的,即TP为预测结果是正例(P),判断是正确的(T);
- TN是代表实际结果为负例且预测结果是负例,那说明判断是正确的,即TN为预测结果是负例(N),判断是正确的(T);
- FP是代表实际结果为正例但预测结果是负例,那说明判断是错误的,即FP为预测结果是正例(P),判断是错误的(F);
- FN是代表实际结果为负例但预测结果是正例,那说明判断是错误的,即FN为预测结果是负例(N),判断是错误的(F);
- 精度(Precision):
精度是模型判断为正例的样本中,判断正确的个数占比。
- 召回率(Recall):
召回率表示应当被预测的正例中,真正例有多少。
- F1评分(F1 score):
F1评分是精确度和召回率的平衡或调和的平均值。最小值为0,最大值为1。当F1评分等于1时,这意味着所有类都被正确预测了,但是这是一个很难用真实数据获得的分数,因为异常数据几乎总是存在的。
用以上指标来进行模型评估,需要导入sklearn的metrics库,这个库里包含了classification_report和confusion_matrix方法,classification_report返回精度、召回率和F1评分。
结果如下:
从上面的分类报告中,可以知道假钞预测的准确率为0.97,召回率为1.00,F1评分为0.98,这些测量值是使用148个样品获得的。与此同时,对于真钞,结果是低一个单位,预测精度为1.00,召回率为0.96,F1评分为0.98,这些测量值使用了127个样品获得的。
结果可视化
对混淆矩阵进行可视化操作,可以使用Seaborn的heatmap()方法。结果如下:
混淆矩阵的图示中,148个class为0的采样中,148个真正例,0个是假正例,同时127个class为1的采样中,122个是真正例,5个是假反例。
结论
本文主要介绍了通过使用决策树算法进行建模和预测的实战项目案例,希望能够帮助你学习和理解决策树算法的核心内容。如果你还想学习更多人工智能/机器学习/深度学习相关的知识,请继续阅读我编写的其他内容的文章。
本文涉及到的机器学习实战项目文件(附带数据+代码+文档)名称如下:
decision_tree.py
data_banknote_authentication.csv
MLAP7-机器学习项目实战7-Python实现决策树算法分类伪钞项目实战.pdf
相关推荐
- 面试官:来,讲一下枚举类型在开发时中实际应用场景!
-
一.基本介绍枚举是JDK1.5新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错...
- 一日一技:11个基本Python技巧和窍门
-
1.两个数字的交换.x,y=10,20print(x,y)x,y=y,xprint(x,y)输出:102020102.Python字符串取反a="Ge...
- Python Enum 技巧,让代码更简洁、更安全、更易维护
-
如果你是一名Python开发人员,你很可能使用过enum.Enum来创建可读性和可维护性代码。今天发现一个强大的技巧,可以让Enum的境界更进一层,这个技巧不仅能提高可读性,还能以最小的代价增...
- Python元组编程指导教程(python元组的概念)
-
1.元组基础概念1.1什么是元组元组(Tuple)是Python中一种不可变的序列类型,用于存储多个有序的元素。元组与列表(list)类似,但元组一旦创建就不能修改(不可变),这使得元组在某些场景...
- 你可能不知道的实用 Python 功能(python有哪些用)
-
1.超越文件处理的内容管理器大多数开发人员都熟悉使用with语句进行文件操作:withopen('file.txt','r')asfile:co...
- Python 2至3.13新特性总结(python 3.10新特性)
-
以下是Python2到Python3.13的主要新特性总结,按版本分类整理:Python2到Python3的重大变化Python3是一个不向后兼容的版本,主要改进包括:pri...
- Python中for循环访问索引值的方法
-
技术背景在Python编程中,我们经常需要在循环中访问元素的索引值。例如,在处理列表、元组等可迭代对象时,除了要获取元素本身,还需要知道元素的位置。Python提供了多种方式来实现这一需求,下面将详细...
- Python enumerate核心应用解析:索引遍历的高效实践方案
-
喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。根据GitHub代码分析统计,使用enumerate替代range(len())写法可减少38%的索引错误概率。本文通过12个生产...
- Python入门到脱坑经典案例—列表去重
-
列表去重是Python编程中常见的操作,下面我将介绍多种实现列表去重的方法,从基础到进阶,帮助初学者全面掌握这一技能。方法一:使用集合(set)去重(最简单)pythondefremove_dupl...
- Python枚举类工程实践:常量管理的标准化解决方案
-
本文通过7个生产案例,系统解析枚举类在工程实践中的应用,覆盖状态管理、配置选项、错误代码等场景,适用于Web服务开发、自动化测试及系统集成领域。一、基础概念与语法演进1.1传统常量与枚举类对比#传...
- 让Python枚举更强大!教你玩转Enum扩展
-
为什么你需要关注Enum?在日常开发中,你是否经常遇到这样的代码?ifstatus==1:print("开始处理")elifstatus==2:pri...
- Python枚举(Enum)技巧,你值得了解
-
枚举(Enum)提供了更清晰、结构化的方式来定义常量。通过为枚举添加行为、自动分配值和存储额外数据,可以提升代码的可读性、可维护性,并与数据库结合使用时,使用字符串代替数字能简化调试和查询。Pytho...
- 78行Python代码帮你复现微信撤回消息!
-
来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。[导读]Python曾经对我说:"时日不多,赶紧用Python"。于是看...
- 登录人人都是产品经理即可获得以下权益
-
文章介绍如何利用Cursor自动开发Playwright网页自动化脚本,实现从选题、写文、生图的全流程自动化,并将其打包成API供工作流调用,提高工作效率。虽然我前面文章介绍了很多AI工作流,但它们...
- Python常用小知识-第二弹(python常用方法总结)
-
一、Python中使用JsonPath提取字典中的值JsonPath是解析Json字符串用的,如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的,使用jsonpat...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python自定义函数 (53)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)