系列目录
《Web安全之机器学习入门》笔记:第八章 8.2 逻辑回归hello world
《Web安全之机器学习入门》笔记:第八章 8.3 逻辑回归算法检测Java溢出攻击
《Web安全之机器学习入门》笔记:第八章 8.4 逻辑回归算法识别mnist验证码
目录
本系列是《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图片效果一般般,这里只是展示一种用法,不要太较真。
博客介绍了使用逻辑回归算法对mnist数据集进行数字识别,效果比nb算法好。还提及原作者代码存在报错和报警问题,并给出修改方法,展示了可在python3环境运行的完整代码,指出交叉验证情况,强调逻辑回归测试mnist图片易达90%以上准确率。
825

被折叠的 条评论
为什么被折叠?



