机器学习系列(二十)——PCA在手写数字数据集的应用

本篇将在真实数据集——手写数字数据集上使用PCA。

PCA应用到真实数据集

简单手写数字数据集包括1797个样本,每个样本都是一个8×8的灰度图像,可以看作每个样本有64个特征。导入手写数字数据集:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

digits = datasets.load_digits()
X = digits.data
y = digits.target

首先不做pca降维直接用knn算法对其分类:

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)
X_train.shape
%%time
'''不对数据降维,使用knn对手写数字分类并测试性能'''
from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train,y_train)

时间消耗和准确率:

knn时间消耗
准确率

有上面的结果看到,直接使用knn准确率达到98.7%。接下来将数据降到2维,再使用knn算法:

'''PCA降维后,使用knn'''
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)
%%time
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_reduction,y_train)

降维后时间消耗和准确率:

2维时间消耗
2维准确率

降到2维后由于数据量减少,训练速度比未降维的时候快的多,不过准确率却只有60.7%,这是因为数据由64维到2维,损失太多信息了,也许应该降到10维,20维什么的。实际上我们可以通过不断搜索不同维数进行数据集训练以得到更合适的维数。不过sklearn的pca中提供了一个指标explained_variance_ratio_,对于降到2维,该指标为:

e_v_r2

这个指标结果表示第一个轴方向能解释0.146原数据的方差,第二个轴能解释0.137原数据的方差,而剩下70%多的方差则由于降维而丢失。该指标大小是从大到小排列的,其数值即对应每个方向(主成分)的重要程度。下面对该64维数据提取其所有主成分,并给出该指标:

pca = PCA(n_components=X_train.shape[1])
pca.fit(X_train)
pca.explained_variance_ratio_

指标如下:

主成分重要程度排序

可以发现最后几个轴方向解释的方差还不到0.0001%,因此最后几个主成分是可以忽略的。
将主成分个数和它们能解释的总方差百分比绘图:

'''表示取前n个主成分能解释多少百分比的方差'''
plt.plot([i for i in range(X_train.shape[1])],\
         [np.sum(pca.explained_variance_ratio_[:i+1]) for i in range(X_train.shape[1])])
plt.show()
主成分解释方差百分比

由图看出如果我们需要解释原方差的95%,则取前大约30个主成分即可。这在sklearn的pca中也是能直接求的,比如我们要求主成分个数应能至少解释95%的方差:

pca = PCA(0.95)
pca.fit(X_train)
pca.n_components_
解释95%方差需要的主成分

可见需要28个主成分。取前28个主成分后的数据集进行训练结果如下:

训练结果

达到了98%的准确率。虽然比未降维的数据准确率要低,但0.006的差距也还可以接受,而且时间消耗要少的多。有时我们愿意用微小的准确率差换取时间性能的优势。


PCA用于MNIST数据集

MNIST数据集是机器学习领域中非常经典的一个数据集,共有70000个样本,由60000个训练样本和10000个测试样本组成,每个样本有784个特征,是一张28 * 28像素的灰度手写数字图片。
首先是从sklearn下下载sklearn数据集,这里要注意的是,不同机器学习框架下都有mnist数据集,他们可能格式不太一样。

from sklearn.datasets import fetch_openml
mnist = fetch_openml("MNIST original",data_home = 'datasets')

当然第一次下载可能需要一会儿时间,或者下载报错,这里给出笔者下载好的保存在百度云的mnist数据集链接:
链接: https://pan.baidu.com/s/1L8F9e3fHF3Nnd8yhvS7_zw 提取码: wb52
下面对数据进行训练:

X,y = mnist['data'],mnist['target']
X_train = np.array(X[:60000],dtype=float)
y_train = np.array(y[:60000],dtype=float)
X_test = np.array(X[60000:],dtype=float)
y_test = np.array(y[60000:],dtype=float)
'''使用knn'''
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()
%time knn_clf.fit(X_train,y_train)
knn训练时间消耗

对训练的模型进行准确率评价:

准确率

由于knn算法预测过程需要所有训练数据参与,而mnist数据量庞大,因此及其消耗时间,在笔者的PC上用时13分钟,准确率96.9%
接下来用PCA对数据进行降维,然后再用knn训练:

from sklearn.decomposition import PCA
pca = PCA(0.9)
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)

这里PCA中参数给了0.9,扔掉了训练数据集10%的信息:

降维数据shape

此时784个特征只剩下87了,执行训练过程:

'''降维后使用knn'''
knn_clf1 = KNeighborsClassifier()
%time knn_clf1.fit(X_train_reduction,y_train)
降维后knn训练

准确率:

降维后准确率

发现预测过程用时明显减少,而且准确率97.3%比之前高,咦?为什么丢掉数据10%的信息准确率却更高了呢?这涉及到PCA的一个很重要的应用,那就是数据降噪,丢掉的数据很大程度上是噪声。降噪的更多例子将在下篇介绍。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,601评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,367评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,249评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,539评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,967评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,929评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,098评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,825评论 0 207
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,609评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,796评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,282评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,603评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,277评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,159评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,959评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,079评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,874评论 2 277

推荐阅读更多精彩内容