机器学习实战第3天:手写数字识别

 

☁️主页 Nowl

🔥专栏《机器学习实战》 《机器学习》

📑君子坐而论道,少年起而行之 

文章目录

一、任务描述

二、数据集描述

三、主要代码

(1)主要代码库的说明与导入方法

(2)数据预处理

(3)模型训练

(4)模型预测与性能评估

(5)除数据预处理外的完整代码

四、本章总结​ 


一、任务描述

手写数字识别是机器学习中的一个经典问题,通常涉及将手写数字的图像与其对应的数字进行关联。这种问题通常被认为是计算机视觉领域的一个入门任务,也是许多深度学习框架和算法的基础测试案例之一。

二、数据集描述

手写数字识别数据集包含了一列数字标签,每个数字标签有784个像素值,代表这个数字图片的像素值

三、主要代码

(1)主要代码库的说明与导入方法

import pandas as pd

pandas 是一个数据分析库,提供了灵活的数据结构,如 DataFrame,用于处理和分析结构化数据。它常被用于数据清洗、处理和分析。

import matplotlib.pyplot as plt

matplotlib 是一个用于绘制图表和可视化数据的库。pyplot模块是 matplotlib 的一个子模块,用于创建各种类型的图表,如折线图、散点图、直方图等。

import numpy as np

NumPy 是用于科学计算的库,提供了高性能的数组对象和各种数学函数。它在数据处理和数值计算中被广泛使用,尤其是在机器学习中。

import matplotlib as mpl

这里再次导入 matplotlib 库,但是这次将其别名设置为mpl。这样做是为了在代码中使用更短的别名,以提高代码的可读性。

from sklearn.model_selection import train_test_split

scikit-learn(sklearn)是一个用于机器学习的库。train_test_split函数用于将数据集划分为训练集和测试集,这是机器学习模型评估的一种常见方式。

from sklearn.neighbors import KNeighborsClassifier

这里导入了 scikit-learn 中的KNeighborsClassifier类,该类实现了 k-近邻分类器,用于进行基于邻近样本的分类。

from sklearn.metrics import accuracy_score

从 scikit-learn 中导入accuracy_score函数,用于计算分类模型的准确度分数。准确度是分类模型预测的正确样本数占总样本数的比例。

为确保代码能正常运行,请先复制以下代码,导入本文用到的所有库

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

 当代码无法运行时,还有可能是文件路径问题,注意改成自己的文件路径

(2)数据预处理

1.导入数据

使用pandas库导入数据集文件,文件路径要换成自己的

digit = pd.read_csv("datasets/digit-recognizer/train.csv")

2.划分训练集与测试集

使用train_test_split函数将数据集分为训练集和测试集,测试集比例为0.2

再将特征和标签分离出来

train, test = train_test_split(digit, test_size=0.2)train_x = train.drop(columns="label")
train_y = train["label"]
test_x = test.drop(columns="label")
test_y = test["label"]

 3.图片显示

我们可以使用matplotlib库将图片显示出来

  • train_x.iloc[2]选取训练集的第3行数据
  • np.array()将数组转化为numpy数组,以便使用reshape函数
  • .reshape(28,28)将原来的784个特征转化为(28,28)格式的数据,这代表一个正方形图片
  • cmap=mpl.cm.binary使图片颜色为黑白
  • plt.imshow()函数可以将一个像素数组转化为图片
plt.imshow(np.array(train_x.iloc[2]).reshape(28, 28), cmap=mpl.cm.binary)
plt.show()
print(train_y.iloc[2])

显示图片并打印数据标签

我们可以看到图像是一个数字9,打印标签也确实是9,接下来我们就来训练一个数字识别机器学习模型

(3)模型训练

由于这是一个分类任务,我们可以选择使用KNN近邻算法,第一步设置模型,第二步训练模型

model = KNeighborsClassifier(n_neighbors=3)
model.fit(train_x, train_y)

(4)模型预测与性能评估

寻找最优参数

对于大部分机器学习模型来说,设置不同的参数得到的模型性能都不同,我们可以绘制不同参数的准确率曲线图来寻找最优参数

accuracy = []for i in range(1, 10):model = KNeighborsClassifier(n_neighbors=i)model.fit(train_x, train_y)prediction = model.predict(test_x)accuracy.append(accuracy_score(prediction, test_y))print()plt.plot(range(1, 10), accuracy)
plt.xlabel("neighbors")
plt.ylabel("accuracy")
plt.show()

可以看到当neighbors为3时模型效果最好,我们在应用时就将模型参数设置为3

(5)除数据预处理外的完整代码

这里是舍弃了一些寻找特征等工作的完整模型训练代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_scoredigit = pd.read_csv("datasets/digit-recognizer/train.csv")train, test = train_test_split(digit, test_size=0.2)train_x = train.drop(columns="label")
train_y = train["label"]
test_x = test.drop(columns="label")
test_y = test["label"]model = KNeighborsClassifier(n_neighbors=3)
model.fit(train_x, train_y)
prediction = model.predict(test_x)
print(accuracy_score(prediction, test_y))

四、本章总结​ 

  • 学习了使用numpy处理图像数据的方法
  • 学习了打印准确率曲线来寻找最优参数的方法
  • 使用KNN模型来完成分类任务

当然,也可以自己处理特征,自己选择模型,调整参数,看看会不会获得更好的结果

 感谢阅读,觉得有用的话就订阅下本专栏吧

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

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

相关文章

2023-11-28 C语言if语句多个||或 与的时时候,会顺序执行,不满足条件则退出,不会再比较后面的内容,实例测试

一、if(i > 0 || image(0) > 5)或者if(i > 0 && image(0) > 5)&#xff0c;C语言if语句多个||或 与&&的时时候&#xff0c;会顺序执行&#xff0c;不满足条件则退出&#xff0c;不会再比较后面的内容。 二、测试代码 #include <stdio.h> #i…

题目标题:汽水瓶 c语言

1.问题描述 有这样一道智力题&#xff1a;“某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶&#xff0c;她最多可以换多少瓶汽水喝&#xff1f;”答案是5瓶&#xff0c;方法如下&#xff1a;先用9个空瓶子换3瓶汽水&#xff0c;喝掉3瓶满的&#x…

成为网络安全高手!教你如何做出专业级别的渗透测试

01、信息收集 1、域名、IP、端口 域名信息查询&#xff1a;信息可用于后续渗透 IP信息查询&#xff1a;确认域名对应IP&#xff0c;确认IP是否真实&#xff0c;确认通信是否正常 端口信息查询&#xff1a;NMap扫描&#xff0c;确认开放端口 发现&#xff1a;一共开放两…

Linux CentOS_7解决无法上网的问题

参考视频&#xff1a;保姆式教学虚拟机联网liunx(centos)_哔哩哔哩_bilibili 第一步&#xff1a;选择网络模式 第二步&#xff1a;配置网卡命令&#xff1a;打开终端执行命令&#xff1a; 1、先切换到根目录下&#xff0c;防止在第执行cd /etc/sysconfig/network-scripts命的…

java多线程-扩展知识一:进程线程、并发并行、同步异步

1、进程 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b;在当代面向线程…

云计算——ACA学习 阿里云云计算服务概述

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 前期回顾 本期介绍 前言了解 一…

QCheckBox通过qss实现状态切换显示不同图标

QString qss "QCheckBox::indicator:unchecked{ \image:url(:/resources/status_close.png); \} \QCheckBox::indicator:checked { \image: url(:/resources/status_open.png); \}";ui->checkBox->setStyleSheet(qss);ui->checkBox->setChecked(true);

【领域驱动设计 学习目标及大纲】从CRUD到架构设计

从2018年至今&#xff0c;已工作了5年有余&#xff0c;回望这5年的工作历程&#xff0c;虽然一直在学习、一直在积累&#xff0c;但其实都在术的层面上停留&#xff0c;也就是具体的技术点。这5年多的时间里其实也不是没有窥道的想法&#xff1a; 一次是2018年刚工作的时候&am…

FPGA模块——AD高速转换模块(并行输出转换的数据)

FPGA模块——AD高速转换模块&#xff08;并行输出转换的数据&#xff09; &#xff08;1&#xff09;AD9280/3PA9280芯片&#xff08;2&#xff09;代码 &#xff08;1&#xff09;AD9280/3PA9280芯片 AD9280/3PA9280芯片的引脚功能&#xff1a; 工作电压2.7到5.5v 数据对应&a…

采购申请的库存地点和MRP2的库存地点的关系

F类材料的采购申请的库存地点&#xff0c;带外部采购申请仓储地点 X类材料的采购申请的库存地点,从MRP2的生产仓储地点自动带到计划订单再到生产工单再到采购申请。

linux线程详解

线程 c版本1、线程概述2、创建线程3、线程退出4、线程回收使用子线程栈使用全局变量使用主线程栈 5、线程分离6、其他线程函数线程取消 6.2 线程ID比较 C版本1、构造函数2、公共成员函数2.1 get_id()2.2 join()2.3 detach()2.4 joinable()2.5 operator() 3、静态函数4、C线程命…

MSTP实验

目录 一、实验拓扑 二、实验要求 三、实验步骤 1、创建vlan 2、创建端口组&#xff0c;放通vlan 3、配置MSTP 4、配置主备奋根 一、实验拓扑 二、实验要求 1、所有交换机上创建vlan10&#xff0c;vlan20&#xff0c;vlan30和vlan40 2、所有交换机之间的端口配置为Trunk…

滑动窗口 -(LeetCode 209. 长度最小的子数组、904. 水果成篮)

跟着代码随想录完成了 leetcode 209.长度最小的子数组&#xff0c;学习到了滑动窗口的思想。于是做了904题。 题目意思是&#xff0c;遍历数组&#xff0c;找到包含两种元素的最长子串(字串就包含“连续”之意)&#xff0c;返回其长度。因此可以利用滑动数组的思想。 想法过程…

Redis(二):常见数据类型:String 和 哈希

引言 Redis 提供了 5 种数据结构&#xff0c;理解每种数据结构的特点对于 Redis 开发运维⾮常重要&#xff0c;同时掌握每 种数据结构的常⻅命令&#xff0c;会在使⽤ Redis 的时候做到游刃有余。 Redis 的命令有上百种&#xff0c;我们不可能全部死记硬背下来&#xff0c;但是…

vue3---自定义插件注册全局对象

① 在src/components文件夹下创建index.ts&#xff1a;用于注册components文件夹下全部的全局组件 // 引入项目中的全部全局组件 import SvgIcon from ./SvgIcon/index.vue import Pagination from ./Pagination/index.vue// 定义全局组件对象&#xff1a;用于存放所有要引入的…

【小白进阶】Linux 调试大法——gdb

初衷 gdb调试是每一个后端开发工程师所必备的技能&#xff0c;我们工作总是会用gdb协助我们去分析和调试问题。但是大部分同学的技能仅停留在最基础的查看问题。即gdb program -->r --> 问题复现 --> bt 查看源码中的哪一行出现了错误。再稍微熟练点的&#xff0c;可能…

配置ssh 免密登录 还是要密码才能登录

确认公钥已经发送到目标服务器 ssh-copy-id 目标ip文件权限验证(id_rsa&#xff0c;id_rsa.pub&#xff0c;authorized_keys&#xff0c;known_hosts) -rw------- #authorized_keys -rw------- #id_rsa -rw-r--r-- #id_rsa.pub -rw-r--r-- #known_hosts.ssh目录权限验证 确…

YoloV5改进策略:RefConv打造轻量化YoloV5利器

文章目录 摘要论文:《RefConv: 重参数化的重聚焦卷积》1、简介2、相关研究2.1、用于更好性能的架构设计2.2、结构重参数化2.3、权重重参数化方法3、重参数化的重聚焦卷积3.1、深度RefConv3.2、普通的RefConv3.3、重聚焦学习4、实验4.1、在ImageNet上的性能评估4.2、与其他重参…

创建对象的方法及一些方法

一、字面量 {} let obj {a:1,b:2} // obj.alet obj1 {a-b:3} //obj1[a-b]let obj2 {1:2,2:3} //obj2[1]//2let s1 Symbol(); let s2 Symbol(); var person { [s1]: "Lily", [s2]: 18, gender: "female" }; console.log(person[s2]); // 输出 18 二…

抖音视频如何无水印下载,怎么批量保存主页所有视频没水印?

现在最火的短视频平台莫过于抖音&#xff0c;当我们刷到一个视频想下载下来怎么办&#xff1f;我们知道可以通过保存到相册的方式下载&#xff0c;但用这种方法下载的视频带有水印&#xff0c;而且有些视频不能保存到相册&#xff08;这是视频作者设置了禁止下载&#xff09;。…