机器学习项目实战7-Python实现决策树算法分类伪钞项目实战
off999 2024-11-26 07:24 20 浏览 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
相关推荐
- PYTHON-简易计算器的元素介绍
-
[烟花]了解模板代码的组成importPySimpleGUIassg#1)导入库layout=[[],[],[]]#2)定义布局,确定行数window=sg.Window(...
- 如何使用Python编写一个简单的计算器程序
-
Python是一种简单易学的编程语言,非常适合初学者入门。本文将教您如何使用Python编写一个简单易用的计算器程序,帮助您快速进行基本的数学运算。无需任何高深的数学知识,只需跟随本文的步骤,即可轻松...
- 用Python打造一个简洁美观的桌面计算器
-
最近在学习PythonGUI编程,顺手用Tkinter实现了一个简易桌面计算器,功能虽然不复杂,但非常适合新手练手。如果你正在学习Python,不妨一起来看看这个项目吧!项目背景Tkint...
- 用Python制作一个带图形界面的计算器
-
大家好,今天我要带大家使用Python制作一个具有图形界面的计算器应用程序。这个项目不仅可以帮助你巩固Python编程基础,还可以让你初步体验图形化编程的乐趣。我们将使用Python的tkinter库...
- 用python怎么做最简单的桌面计算器
-
有网友问,用python怎么做一个最简单的桌面计算器。如果只强调简单,在本机运行,不考虑安全性和容错等的话,你能想到的最简单的方案是什么呢?我觉得用tkinter加eval就够简单的。现在开整。首先创...
- 说好的《Think Python 2e》更新呢!
-
编程派微信号:codingpy本周三脱更了,不过发现好多朋友在那天去访问《ThinkPython2e》的在线版,感觉有点对不住呢(实在是没抽出时间来更新)。不过还好本周六的更新可以实现,要不就放一...
- 构建AI系统(三):使用Python设置您的第一个MCP服务器
-
是时候动手实践了!在这一部分中,我们将设置开发环境并创建我们的第一个MCP服务器。如果您从未编写过代码,也不用担心-我们将一步一步来。我们要构建什么还记得第1部分中Maria的咖啡馆吗?我们正在创...
- 函数还是类?90%程序员都踩过的Python认知误区
-
那个深夜,你在调试代码,一行行检查变量类型。突然,一个TypeError错误蹦出来,你盯着那句"strobjectisnotcallable",咖啡杯在桌上留下了一圈深色...
- 《Think Python 2e》中译版更新啦!
-
【回复“python”,送你十本电子书】又到了周三,一周快过去一半了。小编按计划更新《ThinkPython2e》最新版中译。今天更新的是第五章:条件和递归。具体内容请点击阅读原文查看。其他章节的...
- Python mysql批量更新数据(兼容动态数据库字段、表名)
-
一、应用场景上篇文章我们学会了在pymysql事务中批量插入数据的复用代码,既然有了批量插入,那批量更新和批量删除的操作也少不了。二、解决思路为了解决批量删除和批量更新的问题,提出如下思路:所有更新语...
- Python Pandas 库:解锁 combine、update 和compare函数的强大功能
-
在Python的数据处理领域,Pandas库提供了丰富且实用的函数,帮助我们高效地处理和分析数据。今天,咱们就来深入探索Pandas库中四个功能独特的函数:combine、combine_fi...
- 记录Python3.7.4更新到Python.3.7.8
-
Python官网Python安装包下载下载文件名称运行后选择升级选项等待安装安装完毕打开IDLE使用Python...
- Python千叶网原图爬虫:界面化升级实践
-
该工具以Python爬虫技术为核心,实现千叶网原图的精准抓取,突破缩略图限制,直达高清资源。新增图形化界面(GUI)后,操作门槛大幅降低:-界面集成URL输入、存储路径选择、线程设置等核心功能,...
- __future__模块:Python语言版本演进的桥梁
-
摘要Python作为一门持续演进的编程语言,在版本迭代过程中不可避免地引入了破坏性变更。__future__模块作为Python兼容性管理的核心机制,为开发者提供了在旧版本中体验新特性的能力。本文深入...
- Python 集合隐藏技能:add 与 update 的致命区别,90% 开发者都踩过坑
-
add函数的使用场景及错误注意添加单一元素:正确示例:pythons={1,2}s.add(3)print(s)#{1,2,3}错误场景:试图添加可变对象(如列表)会报错(Pytho...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)