《Web安全之机器学习入门》笔记:第八章 8.4 逻辑回归算法识别mnist验证码

博客介绍了使用逻辑回归算法对mnist数据集进行数字识别,效果比nb算法好。还提及原作者代码存在报错和报警问题,并给出修改方法,展示了可在python3环境运行的完整代码,指出交叉验证情况,强调逻辑回归测试mnist图片易达90%以上准确率。

系列目录

《Web安全之机器学习入门》笔记:第八章 8.2 逻辑回归hello world

《Web安全之机器学习入门》笔记:第八章 8.3 逻辑回归算法检测Java溢出攻击

《Web安全之机器学习入门》笔记:第八章 8.4 逻辑回归算法识别mnist验证码

目录

一、逻辑回归

二、MNIST 数据集

三、代码实现

1、源码修改

(1)报错

 (2)报警

2、完整代码

3、运行结果


本系列是《Web安全之机器学习入门》的笔记集合,包含书中第五章-第十七章的内容。本文这一小节主要内容是讲解第8章使用逻辑回归算法的基本用法,本小节是通过使用逻辑回归算法对mnist数据集的数字识别,效果只能说勉强凑合,不过比7.8节的nb算法好一些。

一、逻辑回归

逻辑回归(Logistic Regression)虽名为 “回归”,实则是经典的有监督分类算法,广泛应用于二分类与多分类任务。它基于线性回归模型,通过 Sigmoid 函数将线性组合结果映射到 0 到 1 区间,输出值代表样本属于某类别的概率。例如在邮件分类中,根据邮件关键词、发件人等特征,计算出该邮件为垃圾邮件的概率,超过阈值则判定为垃圾邮件。

训练时,逻辑回归采用极大似然估计,通过梯度下降等优化算法最小化对数损失函数,调整模型参数。其优势在于模型简单、计算高效,特征权重直观反映对分类的影响,便于解释。但该算法假设数据线性可分,对复杂非线性关系处理能力有限,且易受异常值干扰,适用于风险评估、疾病诊断、文本分类等场景 。

二、MNIST 数据集

MNIST 数据集是图像识别领域最具代表性的基准数据集之一,由 6 万张训练图像、1 万张测试图像构成,均为 28×28 像素的手写数字灰度图,涵盖 0 - 9 十个数字类别。这些图像源自美国国家标准与技术研究院(NIST),经标准化处理后,每个图像被展平为 784 维向量,便于计算机处理。因其规模适中、标注精确且手写风格多样,MNIST 常作为入门级数据集用于测试机器学习算法,从传统的支持向量机、逻辑回归,到复杂的卷积神经网络,都以此验证模型在图像分类任务中的基础性能。

MNIST数据集概览如下表所示。

属性描述
类型图像分类数据集
数据内容手写数字0-9的灰度图片
图片尺寸28×28像素
颜色通道单通道(灰度值0-255)
样本总量70,000(60,000训练集 + 10,000测试集)

三、代码实现

1、源码修改

作者的代码会报错以及报警,故而需要修改代码才能调通code。

(1)报错

Traceback (most recent call last):
  File "C:/Users/liujiannan/PycharmProjects/pythonProject/Web安全之机器学习入门/code/8-3.py", line 15, in <module>
    training_data, valid_data, test_data=load_data()
  File "C:/Users/liujiannan/PycharmProjects/pythonProject/Web安全之机器学习入门/code/8-3.py", line 10, in load_data
    training_data, valid_data, test_data = pickle.load(fp)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)

修改方法如下所示。

def load_data():
    with gzip.open('../data/MNIST/mnist.pkl.gz') as fp:
        training_data, valid_data, test_data = pickle.load(fp, encoding="bytes")
    return training_data, valid_data, test_data

 (2)报警

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
  FutureWarning)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.
  "this warning.", FutureWarning)

源码修改如下所示。

    logreg = linear_model.LogisticRegression(C=1e5, solver='liblinear', multi_class='ovr')

2、完整代码

本文使用逻辑回归分类器识别 MNIST 手写数字。加载 MNIST 数据集(含训练、验证、测试集),提取训练集(6 万样本)和测试集(1 万样本)的 784 维图像特征与标签,初始化逻辑回归模型(高正则化强度,liblinear 求解器),训练后在测试集上交叉验证,输出各折准确率及均值,实现手写数字分类及性能评估。

  • 数据加载:从 gzip 文件读取 MNIST 数据集,含三类数据
  • 数据拆分:提取训练集特征与标签、测试集特征与标签
  • 模型初始化:创建逻辑回归模型,设置参数确保多类分类
  • 模型训练:用训练集特征和标签拟合逻辑回归模型
  • 交叉验证:在测试集上做交叉验证,以准确率为指标
  • 结果输出:打印各折交叉验证得分及平均准确率
  • 任务实现:完成手写数字识别的分类与性能评估
# -*- coding:utf-8 -*-
# 导入必要的库
from sklearn import model_selection  # 模型评估工具(交叉验证)
from sklearn.naive_bayes import GaussianNB  # 高斯朴素贝叶斯分类器
import pickle  # Python对象序列化工具
import gzip  # 文件压缩解压工具

def load_data():
    """加载MNIST数据集(gzip压缩的pkl格式)
    Returns:
        tuple: 包含三个元组(training_data, valid_data, test_data),
               每个元组为(特征数据, 标签)的格式
    """
    # 使用gzip打开压缩文件(原始MNIST数据为28x28图像,已展平为784维向量)
    with gzip.open('../data/MNIST/mnist.pkl.gz') as fp:
        # pickle加载数据(注意Python3需要指定encoding="bytes")
        training_data, valid_data, test_data = pickle.load(fp, encoding="bytes")
    return training_data, valid_data, test_data

if __name__ == '__main__':
    # 1. 数据加载
    training_data, valid_data, test_data = load_data()
    x1, y1 = training_data  # 训练集:60,000个样本,784维特征
    x2, y2 = test_data      # 测试集:10,000个样本,784维特征

    # 2. 模型训练与评估
    logreg = linear_model.LogisticRegression(C=1e5, solver='liblinear', multi_class='auto')
    logreg.fit(x1, y1)
    score = model_selection.cross_val_score(logreg, x2, y2, scoring="accuracy")
    print(score)
    print(score.mean())

        不过,我们看一下,交叉验证使用的是x2和y2,相当于用x2和y2既训练又测试得到的结果。

3、运行结果

[0.76482924 0.8529853  0.8639231 ]
0.8272458792084002

本例虽然作者示例有点问题,逻辑回归测试mnist图片效果一般般,这里只是展示一种用法,不要太较真。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值