机器学习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算法案例:数字识别器的主要内容,如果未能解决你的问题,请参考以下文章
手写数字识别基于matlab GUI SVM手写数字识别含Matlab源码 676期
手写数字识别基于支持向量机SVM实现手写数字识别matlab源码含GUI
手写数字识别基于支持向量机SVM实现手写数字识别matlab源码含GUI