基于决策树模型和支持向量机模型的手写数字识别

news2024/9/29 14:46:41

目录

1、导入库和手写数字数据集

2、 把数据可视化

3、把数据分成训练数据集和测试数据集

4、训练SVM模型

5、训练决策树模型

6、对所使用的模型进行评估

7、对手写数字图像进行预测


本项目实现了

第一个功能:可以通过导入库和数据集、通过对数据集的预处理、读取、可视化,将数据集划分为训练集和测试级,更换不同的模型,并对模型进行评估,多方面对比不同的机器学习方法,对数据模型的影响。

第二个功能:将训练出来的数据进行预测,通过图片预测直观的方式将模型进行可视化,方便对比不同的机器学习算法。

机器学习算法优缺点:

SVM:

优点

1、非线性间隔映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射。

2、SVM的目标是找到对特征空间划分的最优超平面,SVM方法的核心是最大化分类边际的思想。

3、SVM的训练结果是支持向量,在分类决策中起到决定性作用。

4、SVM是一种小样本的学习方法,从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预测样本的“转导推理”,简化了通常的分类和回归问题。

5、SVM最终的决策函数只由少数的支持向量决定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,在某种意义上避免了“维数灾难”。

6、有较好的鲁棒性:增删非支持向量样本对模型没有影响,SVM方法对核的选取不敏感。

不足

1、SVM算法对大规模训练样本难以实施。

2、SVM对解决多分类问题存在困难。

决策树:

优点

1、决策树易于理解和实现,通过解释人们都有能力去理解决策树表达的意义。

2、数据处理前应当去掉多余的或者空白的属性。

3、能够同时处理数据型和常规型的属性,可以接受数据属性的多样性。

4、对缺失值不敏感。

5、可以处理不相关的特征数据。

6、只需构建一次,便可以反复使用,每一次预测的最大计算次数不超过决策树的深度。

缺点

1、容易造成过拟合,即将训练集自身的一些特点作为所有数据的一般性质,导致过拟合,需要进行剪枝处理。

2、对于有时间顺序的数据,需要很多的预处理的工作。

3、当类别太多时,错误可能就会增加的比较快。

4、只能根据一个字段进行分类。

5、在处理特征关联性比较强的数据时,表现不好。

1、导入库和手写数字数据集

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier, export_graphviz
digits = datasets.load_digits()
X = digits.data
y = digits.target

2、 把数据可视化

# 把数据所代表的图片显示出来

images_and_labels = list(zip(digits.images, digits.target))

plt.figure(figsize=(8, 8), dpi=200)        #设置figsize为8*8,分辨率dpi为200

for index, (image, label) in enumerate(images_and_labels[:10]):

    plt.subplot(2, 5, index + 1)

    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')

    plt.title('Digit: %i' % label, fontsize=20)

plt.show()   #操作环境在pycharm,所以放在循环外,绘制在同一张图片上
#打印图片的数量和尺寸,方便查看以及后续操作

print("图片的数量和尺寸为: {0}".format(digits.images.shape))

print("图片数据的尺寸为: {0}".format(digits.data.shape))

 

 

3、把数据分成训练数据集和测试数据集

# 把数据分成训练数据集和测试数据集

X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2, random_state=42)
这一步是把数据分为百分之80的训练数据集和百分之20的测试数据集

4、训练SVM模型

clf = svm.SVC(gamma=0.001, C=100., probability=True)

clf.fit(X_train, Y_train)
 使用支持向量机来训练模型,这里调整了gamma值为0.001,参数C的值为100,probability设置为True

5、训练决策树模型

model = DecisionTreeClassifier(criterion="entropy")

model.fit(X_train, Y_train)

       决策树学习的目的是为了产生一棵泛化能力强,即处理未见实例能力强的决策树,其基本流程遵循简单且直观的“分而治之”的策略。决策树学习最关键的在于如何选择最优划分属性。

6、对所使用的模型进行评估

# 评估模型的准确度

Y_pre = clf.predict(X_test)

accuracy_score(Y_test, Y_pre)

# 打印模型的精确度

print(clf.score(X_test, Y_test))
SVM模型的正确率为   0.9888888888888889
决策树模型的正确率为  0.8972222222222223

7、对手写数字图像进行预测

for i, ax in enumerate(axes.flat):

    ax.imshow(X_test[i].reshape(8, 8), cmap=plt.cm.gray_r, interpolation='nearest')

    #图像预测正确则数字为绿色,不正确的预测则为红色

    ax.text(0.05, 0.05, str(Y_pre[i]), fontsize=32,

            transform=ax.transAxes,

            color='green' if Y_pre[i] == Y_test[i] else 'red')

    #标签数据设置为黑色放在图像右下角

    ax.text(0.8, 0.05, str(Y_test[i]), fontsize=32,

            transform=ax.transAxes,

            color='black')

    ax.set_xticks([])

    ax.set_yticks([])

plt.show()

SVM模型的预测

决策树模型的预测

 完整代码如下:

1、决策树模型


import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier, export_graphviz
digits = datasets.load_digits()
X = digits.data
y = digits.target

# 把数据所代表的图片显示出来
images_and_labels = list(zip(digits.images, digits.target))
plt.figure(figsize=(8, 8), dpi=200)        #设置figsize为8*8,分辨率dpi为200
for index, (image, label) in enumerate(images_and_labels[:10]):
    plt.subplot(2, 5, index + 1)
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('Digit: %i' % label, fontsize=20)
plt.show()   #操作环境在pycharm,所以放在循环外,绘制在同一张图片上


#打印图片的数量和尺寸,方便查看以及后续操作
print("图片的数量和尺寸为: {0}".format(digits.images.shape))
print("图片数据的尺寸为: {0}".format(digits.data.shape))
# 把数据分成训练数据集和测试数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2, random_state=42)



# 使用决策树模型
model = DecisionTreeClassifier(criterion="entropy")
model.fit(X_train, Y_train)

# 评估模型的准确度
Y_pre = model.predict(X_test)
accuracy_score(Y_test, Y_pre)
# 打印模型的精确度
print(model.score(X_test, Y_test))

# 查看预测的情况,采用4*4张数据图片来预测和label对比
fig, axes = plt.subplots(4, 4, figsize=(8, 8))
fig.subplots_adjust(hspace=0.1, wspace=0.1)

for i, ax in enumerate(axes.flat):
    ax.imshow(X_test[i].reshape(8, 8), cmap=plt.cm.gray_r, interpolation='nearest')
    #图像预测正确则数字为绿色,不正确的预测则为红色
    ax.text(0.05, 0.05, str(Y_pre[i]), fontsize=32,
            transform=ax.transAxes,
            color='green' if Y_pre[i] == Y_test[i] else 'red')
    #标签数据设置为黑色放在图像右下角
    ax.text(0.8, 0.05, str(Y_test[i]), fontsize=32,
            transform=ax.transAxes,
            color='black')
    ax.set_xticks([])
    ax.set_yticks([])
plt.show()

2、SVM支持向量机模型 


import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score

digits = datasets.load_digits()
X = digits.data
y = digits.target

# 把数据所代表的图片显示出来
images_and_labels = list(zip(digits.images, digits.target))
plt.figure(figsize=(8, 8), dpi=200)        #设置figsize为8*8,分辨率dpi为200
for index, (image, label) in enumerate(images_and_labels[:10]):
    plt.subplot(2, 5, index + 1)
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('Digit: %i' % label, fontsize=20)
plt.show()   #操作环境在pycharm,所以放在循环外,绘制在同一张图片上


#打印图片的数量和尺寸,方便查看以及后续操作
print("图片的数量和尺寸为: {0}".format(digits.images.shape))
print("图片数据的尺寸为: {0}".format(digits.data.shape))
# 把数据分成训练数据集和测试数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2, random_state=42)



# 使用支持向量机来训练模型,这里调整了gamma值为0.001,参数C的值为100,probability设置为True
clf = svm.SVC(gamma=0.001, C=100., probability=True)
clf.fit(X_train, Y_train)

# 评估模型的准确度
Y_pre = clf.predict(X_test)
accuracy_score(Y_test, Y_pre)
# 打印模型的精确度
print(clf.score(X_test, Y_test))

# 查看预测的情况,采用4*4张数据图片来预测和label对比
fig, axes = plt.subplots(4, 4, figsize=(8, 8))
fig.subplots_adjust(hspace=0.1, wspace=0.1)

for i, ax in enumerate(axes.flat):
    ax.imshow(X_test[i].reshape(8, 8), cmap=plt.cm.gray_r, interpolation='nearest')
    #图像预测正确则数字为绿色,不正确的预测则为红色
    ax.text(0.05, 0.05, str(Y_pre[i]), fontsize=32,
            transform=ax.transAxes,
            color='green' if Y_pre[i] == Y_test[i] else 'red')
    #标签数据设置为黑色放在图像右下角
    ax.text(0.8, 0.05, str(Y_test[i]), fontsize=32,
            transform=ax.transAxes,
            color='black')
    ax.set_xticks([])
    ax.set_yticks([])
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript基础(17)_Function方法(call、apply)、arguments

概念 call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性,可以通过函数对象来调用。 a…

2023牛客寒假算法基础集训营3 赛时思路+正解

这场数学和思维偏多,特别是数学,五个小时过于充实了,而且更加考验你的心态。 这场不乏码量大的毒瘤题,也不乏人类智慧妙妙题。 A 不断减损的时间 题意 给定一个数组aaa,我们可以执行任意次操作,该操作定义…

Rethinking Performance Gains in Image Dehazing Networks

论文源码:https://download.csdn.net/download/zhouaho2010/87393184 Abstract 图像去雾是低层视觉中的一个活跃话题,随着深度学习的快速发展,许多图像去雾网络被提出。尽管这些网络的工作良好,但提高图像去雾性能的关键机制仍不…

守望者的逃离

题目说明【问题描述】恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去&#…

【java入门系列五】java基础-面向对象**

学习记录🤔类与对象内存中的布局堆栈成员方法 类内的函数传参机制传进来的是一个数组/对象,类似于py的list调用递归-在栈空间方法递归汉诺塔八皇后方法重载overload可变参数作用域**scope构造器/构造方法:新对象的初始化构造器细节对象创建流…

pytorch 笔记:torch.nn.init

这个模块中的所有函数都是用来初始化神经网络参数的,所以它们都在torch.no_grad()模式下运行,不会被autograd所考虑。 1 计算gain value 1.1 介绍 这个在后面的一些nn.init初始化中会用到 1.2 用法 torch.nn.init.calculate_gain(nonlinearity, para…

【LeetCode】回溯算法总结

回溯法解决的问题 回溯法模板 返回值:一般为void参数:先写逻辑,用到啥参数,再填啥参数终止条件:到达叶子节点,保存当前结果,返回遍历过程:回溯法一般在集合中递归搜索,集…

使用DiskGenius进行硬盘数据迁移

克隆硬盘 - DiskGenius 1.迁移磁盘 选择自己想要迁移的磁盘,点击工具-克隆磁盘 首先选择源硬盘,点击确定 之后选择想要迁移到的硬盘,点击确定 检查一下原硬盘和目标硬盘是否正确,此外还可以对这个空间进行二次调整。最终如果没有…

Android 中关于 FileObserver类监听文件状态的实践

文章目录需求背景走进源码实现示例参考需求背景 当某一个目录的文件发生变化(创建、修改、删除、移动)时,需要给一个回调事件给其他端调用。 其他场景:阅后即焚等等。 比如在 Android 的 VR 设备中,有一个用于部署的文…

Oracle P6 Professional专业版 22.12 中的热门新功能

目录 并排查看项目 在复制与 WBS 元素的关系时具有更大的灵活性 更轻松地确定要分配的正确基线 复制并粘贴电子表格中的单元格区域 更好地控制导入数据 检查 P6 专业版中提供的时间表报告 在排序对话框中排列字段顺序 创建导入和导出模板的副本 指定完成日期筛选器如何…

光流估计(一) 光流的简介与操作

今天是大年29,明天要贴春联了!算是在年前赶出来一篇文章发(太长时间没发东西了O。o),也算是自己在光流估计深度学习部分研究的开始~ 明年开学就是研二下学期了,时间过得飞快,毕设、实习、工作等…

MyBatis | 使用插件better-mybatis-generator自动生成dao、pojo

0️⃣简介🗼简介在我们编写MyBatis的项目时,常常需要为数据表编写大量的SQL语句以及dao类。better-mybatis-generator作为一款IDEA插件,可以自动为我们生成所需要的pojo类、dao类,并提供相当多的SQL单表查询操作。利用该插件&…

Python小技巧:富比较方法的妙用,__lt__、__le__、__eq__、__ne__、__gt__、__ge__。。。

前言 这里是Python小技巧的系列文章。这是第二篇&#xff0c;富比较方法的妙用。 在 Python中&#xff0c;富比较方法共6个&#xff0c;如下表所示&#xff1a; 见名知意&#xff0c;富比较主要用于比较。 富比较方法使用释义释义object.__lt__(self, other)x.__lt__(y)x<…

Springboot+mybatis使用PageHelper实现vue前端分页

Springbootmybatis使用PageHelper实现vue前端分页1、未分页前的vue前端效果图2、Springbootmybatis使用PageHelper分页逻辑&#xff1a;&#xff08;1&#xff09;Springboot、mybatis、PageHelper的版本&#xff1a;&#xff08;2&#xff09;yml文件配置pagehelper&#xff1…

带你了解docker是什么----初始篇

docker容器docker简介docker、虚拟环境与虚拟机docker 的核心概念Docker 镜像Docker 仓库Docker容器镜像、容器、仓库&#xff0c;三者之间的联系容器 容器一词的英文是container&#xff0c;其实container还有集装箱的意思&#xff0c;集装箱绝对是商业史上了不起的一项发明&…

11.3 关联容器操作

文章目录关联容器迭代器关键字成员不可修改&#xff0c;值可修改关于泛型算法添加元素向set插入元素向map插入数据insert操作总结检测insert的返回值展开递增语句向multiset和multimap添加元素删除元素map下标操作访问元素类型别名&#xff1a;类型别名说明key_type关键字类型&…

第一个Spring、第一个SpringBoot、Spring-Mybatis整合、SpringBoot-Mybatis整合

目录一、第一个Spring程序二、第一个SpringBoot三、Spring-Mybatis整合四、SpringBoot-Mybatis整合第一个程序一、第一个Spring程序 添加依赖——用以支持spring <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</a…

线程池的简单介绍以及实现一个线程池

文章目录1、线程池存在的意义2、什么是线程池&#xff1f;3、线程池的使用2、java标准库中的线程池3、认识一下不同的线程池&#xff1a;4、认识一下线程池里的参数&#xff1a;4、实现一个简单的线程池1、线程池存在的意义 线程存在的意义&#xff1a;使用进程来实现并发编程…

鼠标右键没有git bash here(图文详解)

升级Win11后突然发现右键没有git bash here了解决&#xff1a;1. winr键&#xff0c;打开命令窗口,输入regedit打开注册表2. 在注册表中按照路径打开\HKEY_CLASSES_ROOT\Directory\Background\shell\3. 在shell上右键新建项&#xff0c;取名Git Bash Here&#xff0c;再点击Git…

SpringCloudConsul

上篇文章注册中心选出了Consul 和 K8S&#xff0c;现在我需要把他们集成到SpringCloud里&#xff0c;体验一下他们的服务注册发现、动态配置与权限分配难易 问题&#xff0c;以便选出更适合我们的。SpringCloudConsul首先用Docker搭建出Consul集群&#xff0c;这一步忽略了&…