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

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习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)

加油!

感谢!

努力!

以上是关于机器学习SVM算法案例:数字识别器的主要内容,如果未能解决你的问题,请参考以下文章

[机器学习案例1]基于KNN手写数字识别

手写数字识别基于matlab GUI SVM手写数字识别含Matlab源码 676期

手写数字识别基于支持向量机SVM实现手写数字识别matlab源码含GUI

手写数字识别基于支持向量机SVM实现手写数字识别matlab源码含GUI

OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字

OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字