【机器学习】SVM算法案例:数字识别器

1. 案例背景介绍

在这里插入图片描述
MNIST(“修改后的国家标准与技术研究所”)是计算机视觉事实上的“hello world”数据集。⾃1999年发布以来,这⼀经 典的⼿写图像数据集已成为分类算法基准测试的基础。随着新的机器学习技术的出现,MNIST仍然是研究⼈员和学习者 的可靠资源。

本次案例中,我们的⽬标是从数万个⼿写图像的数据集中正确识别数字。

2. 数据介绍

数据文件train.csv和test.csv包含从0到9的⼿绘数字的灰度图像。

每个图像的⾼度为28个像素,宽度为28个像素,总共为784个像素。

每个像素具有与其相关联的单个像素值,指示该像素的亮度或暗度,较⾼的数字意味着较暗。该像素值是0到255之间的整数,包括0和255。

训练数据集(train.csv)有785列。第⼀列称为“标签”,是⽤户绘制的数字。其余列包含关联图像的像素值。

训练集中的每个像素列都具有像pixelx这样的名称,其中x是0到783之间的整数,包括0和783。为了在图像上定位该像 素,假设我们已经将x分解为x = i * 28 + j,其中i和j是0到27之间的整数,包括0和27。然后,pixelx位于28 x 28矩阵的 第i⾏和第j列上(索引为零)。

例如,pixel31表示从左边开始的第四列中的像素,以及从顶部开始的第⼆⾏,如下⾯的ascii图中所示。

在视觉上,如果我们省略“像素”前缀,像素组成图像如下:

在这里插入图片描述

在这里插入图片描述

测试数据集(test.csv)与训练集相同,只是它不包含“标签”列。

3. 案例实现

3.1 获取数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.model_selection import train_test_split
train = pd.read_csv('./data/train.csv')

在这里插入图片描述

train.shape
(42000, 785)

3.1.1 确定特征值\目标值

train_image = train.iloc[:, 1:]  # 切片操作
train_image.head()

在这里插入图片描述

train_label = train.iloc[:, 0]

在这里插入图片描述

3.1.2 查看具体图像

num = train_image.iloc[0,].values.reshape(28, 28)
plt.imshow(num) 
plt.axis('off')  # 把x轴关掉
plt.show()

在这里插入图片描述

def to_plot(n):
    num = train_image.iloc[n,].values.reshape(28, 28)
    plt.imshow(num) 
    plt.axis('off')  # 把x轴关掉
    plt.show()
to_plot(n=40)

在这里插入图片描述

3.2 数据基本处理

train_image.head()

在这里插入图片描述

3.2.1 数据归一化处理

# 对数据特征值归一化处理
train_image = train_image.values / 255
train_image

在这里插入图片描述

train_label = train_label.values

在这里插入图片描述

3.2.2 数据集分割

x_train, x_val, y_train, y_val = train_test_split(train_image, train_label, train_size = 0.8, random_state=0)
print(x_train.shape, x_val.shape)
(33600, 784) (8400, 784)

3.3 特征降维和模型训练

import time
from sklearn.decomposition import PCA

# 多次使用pca,确定最后的最优模型

def n_components_analysis(n, x_train, y_train, x_val, y_val):
    # 记录开始时间
    start = time.time()
    
    # pca降维实现
    pca = PCA(n_components=n)
    print('特征降维,传递的参数为:{}'.format(n))
    pca.fit(x_train)
    
    # 在训练集和测试集进行降维
    x_train_pca = pca.transform(x_train)
    x_val_pca = pca.transform(x_val)
    
    # 利用svc进行训练
    print('开始使用svc进行训练')
    ss = svm.SVC()
    ss.fit(x_train_pca, y_train)
    
    # 获取accuracy
    accuracy = ss.score(x_val_pca, y_val)
    
    # 记录结束时间
    end = time.time()
    print('准确率是:{},消耗时间是:{}s'.format(accuracy, int(end-start))) 
    
    return accuracy
# 传递多个n_components,寻找合理的n_compoents

n_s = np.linspace(0.70, 0.85, num=5)

accuracy = []

for n in n_s:
    tmp = n_components_analysis(n, x_train, y_train, x_val, y_val)
    accuracy.append(tmp)
特征降维,传递的参数为:0.7
开始使用svc进行训练
准确率是:0.9761904761904762,消耗时间是:247s
特征降维,传递的参数为:0.7374999999999999
开始使用svc进行训练
准确率是:0.9779761904761904,消耗时间是:25s
特征降维,传递的参数为:0.7749999999999999
开始使用svc进行训练
准确率是:0.9783333333333334,消耗时间是:26s
特征降维,传递的参数为:0.8125
开始使用svc进行训练
准确率是:0.9798809523809524,消耗时间是:28s
特征降维,传递的参数为:0.85
开始使用svc进行训练
准确率是:0.9803571428571428,消耗时间是:30s

在这里插入图片描述

# 准确率可视化
plt.plot(n_s, np.array(accuracy), 'r')
plt.show()

在这里插入图片描述
经过图像展示,选择合理的n-components,最后综合考虑确定结果为0.80

3.4 确定最优模型

pca = PCA(n_com[onents=0.80])

pca.fit(x_train)
pca.n_components_
# 降维
x_train_pca = pca.transform(x_train)
x_val_pca = pca.transform(x_val)
print(x_train_pca.shape, x_val_pca)
# 训练比较优秀的模型,计算accuracy

ss1 = svm.SVC()

ss1.fit(x_train_pca, y_train)

ss1.score(x_val_pca, y_train_val)

在这里插入图片描述

加油!

感谢!

努力!

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chaser&upper

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

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

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

打赏作者

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

抵扣说明:

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

余额充值