目录

Python-机器学习小项目手写数字识别MNIST-数据集

Python 机器学习小项目:手写数字识别(MNIST 数据集)

本项目将使用 scikit-learn 库,基于 支持向量机(SVM) 模型来构建一个手写数字识别系统。数据集选用 MNIST ,其中包含 0-9 的手写数字图像,每张图片是 8×8 像素的灰度图。

项目步骤

  1. 安装必要的库
  2. 加载数据集
  3. 数据预处理
  4. 划分训练集和测试集
  5. 训练 SVM 模型
  6. 模型评估
  7. 测试并可视化结果

1. 安装必要的库

确保你的 Python 环境已安装以下库:

pip install numpy pandas scikit-learn matplotlib

2. 加载数据集

我们使用 sklearn.datasets.load_digits() 加载 MNIST 数据集的一个小型版本(8×8 图像)。

from sklearn import datasets

# 加载手写数字数据集
digits = datasets.load_digits()

# 查看数据集的大小
print(f"数据集样本数量: {len(digits.images)}")

3. 数据预处理

我们需要将 8×8 的图像转换为 一维数组 (64 个特征),以便输入到 SVM 模型中。

import matplotlib.pyplot as plt
import numpy as np

# 显示前 5 张图片
fig, axes = plt.subplots(1, 5, figsize=(10, 3))
for i, ax in enumerate(axes):
    ax.imshow(digits.images[i], cmap='gray')
    ax.set_title(f"Label: {digits.target[i]}")
plt.show()

# 将数据转换为 (n_samples, n_features) 形式
X = digits.images.reshape((len(digits.images), -1))
y = digits.target

4. 划分训练集和测试集

我们使用 train_test_split 将数据集拆分为 80% 训练集20% 测试集

from sklearn.model_selection import train_test_split

# 划分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(f"训练集样本数: {len(X_train)}, 测试集样本数: {len(X_test)}")

5. 训练 SVM 模型

支持向量机(SVM)是一个强大的分类算法,特别适合中小型数据集。

from sklearn.svm import SVC

# 创建 SVM 分类器
clf = SVC(kernel='linear')

# 训练模型
clf.fit(X_train, y_train)

print("模型训练完成!")

6. 评估模型

我们在测试集上评估模型的准确率。

from sklearn.metrics import accuracy_score

# 进行预测
y_pred = clf.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")

7. 测试并可视化结果

我们从测试集中随机选取一些样本进行预测,并显示结果。

import random

# 随机选择 5 个样本
sample_indices = random.sample(range(len(X_test)), 5)
sample_images = X_test[sample_indices].reshape(-1, 8, 8)  # 变回 8×8 形状
sample_labels = y_test[sample_indices]
sample_preds = clf.predict(X_test[sample_indices])

# 显示预测结果
fig, axes = plt.subplots(1, 5, figsize=(10, 3))
for i, ax in enumerate(axes):
    ax.imshow(sample_images[i], cmap='gray')
    ax.set_title(f"真实: {sample_labels[i]}\n预测: {sample_preds[i]}")
plt.show()

总结

通过本项目,我们完成了一个完整的 机器学习分类任务 : ✅ 加载数据

数据预处理 (转换 8×8 图像为 64 维特征)

划分数据集

训练 SVM 分类器

模型评估 (计算准确率)

可视化预测结果