机器学习案例7:基于PCA和SVM的数字识别

案例7:基于PCA和SVM的数字识别

为什么写本博客

​ 前人种树,后人乘凉。希望自己的学习笔记可以帮助到需要的人。

需要的基础

​ 懂不懂原理不重要,本系列的目标是使用python实现机器学习。

​ 必须会的东西:python基础、numpy、pandas、matplotlib和库的使用技巧。

说明

​ 完整的代码在最后,另外之前案例中出现过的方法不会再讲解。

目录结构

1. 涉及的新方法:

PCA降维

from sklearn.decomposition import PCA
pca_model = PCA(n_components=xxx)
# 参数n_components,整数表示降维后输出的特征数,小数表示保留原本多少的信息
# 训练
pca.fit(x_train)
# 处理
x_train_pca = pca.transform(x_train)
x_val_pca = pca.transform(x_val)
# 查看输出多少特征
print(pca.n_components_)

2. 说明:

​ 在之前的案例中,我们仅仅使用了4万多条中的几千条数据来训练模型,这明显是有点不合理的,但是当时由于我没有学习过PCA的知识,所以没有使用它来降维,现在来补充上这一点。另外,我们的主要目的是探究如何取得好的参数和PCA的作用。

​ 我,首先把之前的代码拷贝了过来(数据和代码可以在上一个案例中获取),并做出了修改(删除了画图的部分和一些注释,另外把正则化因子C设置为1.2):

import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# 加载数据
data = pd.read_csv('./data/MNIST/train.csv')
# print(data.head())
# print(data.shape) # (42000, 785)
# 提取x和y
x_train = data.iloc[:,1:]
y_train = data.iloc[:,0]
# print(y_train.head())

# 归一化处理
x_train = x_train.values / 255
y_train = y_train.values
# 数据集划分
x_train,x_test,y_train,y_test = train_test_split(x_train,y_train,test_size=0.2,random_state=2)


# 创建模型
model = SVC(C=1.2)
model.fit(x_train,y_train)
# 评估
score = model.score(x_test,y_test)
print('准确率:',score)

3. PCA降维和SVM训练:

​ 下面,将降维的部分加上去。不过有一点很关键,降维的参数应该填写多少,这一点我们可以简单的通过多次测试来获取大致值。

​ 首先,定义一个模型处理函数:

# 定义一个函数,来验证比较好的参数取值
def get_parameter(n,x_train,y_train,x_test,y_test):
    '''
    参数n : 即我们的PCA关键参数
    思路: 通过记录时间和准确率来判断参数好坏
    '''

​ 那么首先,需要定一个变量来存储运行时间:

# 开始时间
start_time = time.time()
# 结束时间
end_time = time.time()
# 打印运行时间
print('cost: ',end_time-start_time)
print('-' * 50) # 间隔、分隔符

​ 然后,在其中添加我们的PCA和SVM模型代码:

# PCA
pca = PCA(n_components=n)
print('PCA参数为:',n)
pca.fit(x_train) # 训练
x_train_pca = pca.transform(x_train)  # 对训练集和测试集降维
x_test_pca = pca.transform(x_test)
# SVM
# 创建模型
model = SVC(C=1.2)
model.fit(x_train_pca, y_train)
# 评估
score = model.score(x_test_pca, y_test)
print('准确率:', score)

​ 完整的函数代码为:

# 定义一个函数,来验证比较好的参数取值
def get_parameter(n,x_train,y_train,x_test,y_test):
    '''
    参数n : 即我们的PCA关键参数
    思路: 通过记录时间和准确率来判断参数好坏
    '''
    # 开始时间
    start_time = time.time()
    # PCA
    pca = PCA(n_components=n)
    print('PCA参数为:', n)
    pca.fit(x_train) # 训练
    x_train_pca = pca.transform(x_train)  # 对训练集和测试集降维
    x_test_pca = pca.transform(x_test)
    # SVM
    # 创建模型
    model = SVC(C=1.2)
    model.fit(x_train_pca, y_train)
    # 评估
    score = model.score(x_test_pca, y_test)
    print('准确率:', score)
    # 结束时间
    end_time = time.time()
    # 打印运行时间
    print('cost: ',end_time-start_time)
    print('-' * 50)

4. 评估:

​ 下面,进行参数、模型的评估,这里很简单,我们只需要定义一个序列,然后传输给函数即可:

# 评估
parameter_list = np.linspace(0.7,0.9,10)
for n in parameter_list:
    get_parameter(n,x_train,y_train,x_test,y_test)

​ 运行后结果如下表所示:

PCA参数为: 0.7
准确率: 0.975
cost:  14.256069421768188
--------------------------------------------------
PCA参数为: 0.7222222222222222
准确率: 0.9769047619047619
cost:  15.389269828796387
--------------------------------------------------
PCA参数为: 0.7444444444444445
准确率: 0.9773809523809524
cost:  14.335153579711914
--------------------------------------------------
PCA参数为: 0.7666666666666666
准确率: 0.9782142857142857
cost:  14.826223373413086
--------------------------------------------------
PCA参数为: 0.7888888888888889
准确率: 0.9782142857142857
cost:  15.88146686553955
--------------------------------------------------
PCA参数为: 0.8111111111111111
准确率: 0.9782142857142857
cost:  17.445827960968018
--------------------------------------------------
PCA参数为: 0.8333333333333334
准确率: 0.9792857142857143
cost:  16.939074993133545
--------------------------------------------------
PCA参数为: 0.8555555555555556
准确率: 0.9794047619047619
cost:  19.237072944641113
--------------------------------------------------
PCA参数为: 0.8777777777777778
准确率: 0.9797619047619047
cost:  19.231031894683838
--------------------------------------------------
PCA参数为: 0.9
准确率: 0.9794047619047619
cost:  23.06061029434204
--------------------------------------------------

5. 总结:

​ 通过上面的结果,可以看到:PCA降维后,每个模型运行时间大致都在20s左右,这是一个完全可以接受的结果,并且由于利用到了所有的数据,因此准确率也是在0.97左右徘徊。而之前单纯使用SVM并且由于训练时间太长,只能使用几千个数据,这样的准确率才0.94左右。

​ 因此,在使用机器学习的时候,降维也是很有作用的。

完整代码

# author: baiCai
# 导包
import  time
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# 加载数据
data = pd.read_csv('./data/MNIST/train.csv')
# print(data.head())
# print(data.shape) # (42000, 785)
# 提取x和y
x_train = data.iloc[:,1:]
y_train = data.iloc[:,0]
# print(y_train.head())

# 归一化处理
x_train = x_train.values / 255
y_train = y_train.values
# 数据集划分
x_train,x_test,y_train,y_test = train_test_split(x_train,y_train,test_size=0.2,random_state=2)

# 定义一个函数,来验证比较好的参数取值
def get_parameter(n,x_train,y_train,x_test,y_test):
    '''
    参数n : 即我们的PCA关键参数
    思路: 通过记录时间和准确率来判断参数好坏
    '''
    # 开始时间
    start_time = time.time()
    # PCA
    pca = PCA(n_components=n)
    print('PCA参数为:', n)
    pca.fit(x_train) # 训练
    x_train_pca = pca.transform(x_train)  # 对训练集和测试集降维
    x_test_pca = pca.transform(x_test)
    # SVM
    # 创建模型
    model = SVC(C=1.2)
    model.fit(x_train_pca, y_train)
    # 评估
    score = model.score(x_test_pca, y_test)
    print('准确率:', score)
    # 结束时间
    end_time = time.time()
    # 打印运行时间
    print('cost: ',end_time-start_time)
    print('-' * 50)

# 评估
parameter_list = np.linspace(0.7,0.9,10)
for n in parameter_list:
    get_parameter(n,x_train,y_train,x_test,y_test)
'''
PCA参数为: 0.7
准确率: 0.975
cost:  14.256069421768188
--------------------------------------------------
PCA参数为: 0.7222222222222222
准确率: 0.9769047619047619
cost:  15.389269828796387
--------------------------------------------------
PCA参数为: 0.7444444444444445
准确率: 0.9773809523809524
cost:  14.335153579711914
--------------------------------------------------
PCA参数为: 0.7666666666666666
准确率: 0.9782142857142857
cost:  14.826223373413086
--------------------------------------------------
PCA参数为: 0.7888888888888889
准确率: 0.9782142857142857
cost:  15.88146686553955
--------------------------------------------------
PCA参数为: 0.8111111111111111
准确率: 0.9782142857142857
cost:  17.445827960968018
--------------------------------------------------
PCA参数为: 0.8333333333333334
准确率: 0.9792857142857143
cost:  16.939074993133545
--------------------------------------------------
PCA参数为: 0.8555555555555556
准确率: 0.9794047619047619
cost:  19.237072944641113
--------------------------------------------------
PCA参数为: 0.8777777777777778
准确率: 0.9797619047619047
cost:  19.231031894683838
--------------------------------------------------
PCA参数为: 0.9
准确率: 0.9794047619047619
cost:  23.06061029434204
--------------------------------------------------
'''

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值