亦菲喊你来学机器学习(9) --逻辑回归实现手写数字识别

2024-08-23 15:04

本文主要是介绍亦菲喊你来学机器学习(9) --逻辑回归实现手写数字识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 逻辑回归
  • 实现手写数字识别
    • 训练模型
    • 测试模型
  • 总结

逻辑回归

逻辑回归(Logistic Regression)虽然是一种广泛使用的分类算法,但它通常更适用于二分类问题。然而,通过一些策略(如一对多分类,也称为OvR或One-vs-Rest),逻辑回归也可以被扩展到多分类问题,如手写数字识别(通常是0到9的10个类别)。

本篇我们就来尝试一下如何通过逻辑回归来实现手写数字识别

  1. 训练模型
  2. 测试模型

实现手写数字识别

训练模型

  1. 收集数据

在这里插入图片描述

  1. 读取图片

使用opencv处理图片,将图片的像素数值读取进来,并返回的是一个三维(高,宽,颜色)numpy数组:

 pip install opencv-python==3.4.11.45
import cv2
img = cv2.imread("digits.png")
  1. 转为灰度图

将图片转化为灰度图,从而让三维数组变成二位的数组:

grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  1. 处理图片信息

对图片进行处理:将其先垂直切分(横向)成50份,再将每一份水平切分(竖向)成100份,这样我们的每份图片的像素值都为20*20(训练的图片比较规范)共500个,比如:

在这里插入图片描述

import numpy as np
img_info = [np.hsplit(row,100) for row in np.vsplit(grey,50)]
  1. 装进array数组

将切分的每一份图片像素数据都装进array数组中:

x = np.array(img_info)
  1. 分隔训练集与测试集

将数据竖着分隔一半,一半作为训练集,一般作为测试集:

train_x = x[:,:50]
test_x = x[:,50:100]
  1. 调整数据结构

由于我们最后要将数据放在逻辑回归模型中训练,我们得将数据结构调整为适合逻辑回归算法训练的结构,那么我们就来改变每份图片数组的维度:reshape:

new_train_x = train_x.reshape(-1,400).astype(np.float32)
new_test_x = test_x.reshape(-1,400).astype(np.float32)
  1. Z-score标准化

逻辑回归算法进行手写数字识别时,对数据进行标准化是为了提高优化算法的收敛速度、提升模型的预测性能,并避免潜在的数值问题。将数据都进行表示话,避免参数的影响:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
fin_train = scaler.fit_transform(new_train_x)
fin_test = scaler.fit_transform(new_test_x)
  1. 分配标签

我们训练着那么多的数据,却没有给他们具体的类别标签(图像的实际值),因为我们之前的图像处理都是在寻找图像特征,但是并没有给他们一个具体对应的类别,只有空荡荡的特征,无法分类,所以我们得给切分的每份图片打上它们对应的标签:

k = np.arange(10)
train_y = np.repeat(k,250)
test_y = np.repeat(k,250)
train_y = train_y.ravel()
  1. 交叉验证

在逻辑回归的算法中,逻辑模型的参数中,有一参数为正则化强度C,越小的数值表示越强的正则化。我们要进行调参数,看看哪个惩罚因子最为合适,使模型拟合效果更好:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score#交叉验证选择较优的惩罚因子
scores = []
c_param_range = [0.01,0.1,1,10,100] #参数:一般常用的惩罚因子for i in c_param_range:lr = LogisticRegression(C = i,penalty='l2',solver='lbfgs',max_iter=1000,random_state=0)# C表示正则化强度,越小的数值表示越强的正则化。防止过拟合score = cross_val_score(lr,fin_train,train_y,cv=10,scoring='recall_macro')#交叉验证,将模型和数据集传入,对其进行划分,每份轮流作为测试集来测试模型。返回一个列表对象score_mean = sum(score)/len(score)scores.append(score_mean)
c_choose = c_parma[np.argmax(scores)] #argmax取出最大值的索引位置
  1. 训练模型
lr_model = LogisticRegression(C = c_choose,max_iter=1000,random_state=0)
lr_model.fit(fin_train,train_y)

测试模型

  1. 先用训练数据再次进入模型测试,查看他本身的模型训练效果怎么样:
from sklearn import metrics
train_predict = lr_model.predict(fin_train)
print(metrics.classification_report(train_y,train_predict))  #查看混淆矩阵
-------------------------------precision    recall  f1-score   support0       0.99      1.00      0.99       2501       0.98      1.00      0.99       2502       1.00      0.98      0.99       2503       0.98      0.98      0.98       2504       1.00      1.00      1.00       2505       0.98      0.98      0.98       2506       0.99      1.00      1.00       2507       0.98      0.99      0.98       2508       0.98      0.99      0.99       2509       0.99      0.97      0.98       250accuracy                           0.99      2500macro avg       0.99      0.99      0.99      2500
weighted avg       0.99      0.99      0.99      2500
  1. 再用分割的测试集来测试模型:
test_predict = lr_model.predict(fin_test)
print(metrics.classification_report(test_y,test_predict))
---------------------------precision    recall  f1-score   support0       0.95      0.96      0.95       2501       0.94      0.96      0.95       2502       0.88      0.86      0.87       2503       0.90      0.86      0.88       2504       0.92      0.84      0.88       2505       0.84      0.90      0.87       2506       0.92      0.95      0.93       2507       0.89      0.93      0.91       2508       0.89      0.84      0.86       2509       0.83      0.86      0.85       250accuracy                           0.90      2500macro avg       0.90      0.90      0.89      2500
weighted avg       0.90      0.90      0.89      2500

到这为止!!我们就训练好一个关于手写数字识别的逻辑回归模型啦!!

总结

本篇介绍了如何用逻辑回归算法实现手写数字识别:

  1. 逻辑回归更适合二分类算法,但是也可以通过一些策略,扩展到多分类问题。
  2. 注意要将读取的数据进行标准化操作,灰度图图片数据相差过大。
  3. 学会调整参数,优化模型,比如本篇在交叉验证中找寻最优的惩罚因子。

这篇关于亦菲喊你来学机器学习(9) --逻辑回归实现手写数字识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099719

相关文章

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义