天天看点

Bobo老师机器学习笔记第七课-使用PCA对MNIST数据集进行降噪

问题1:什么是MNIST数据集?

  MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据。该问题解决的是把28x28像素的灰度手写数字图片识别为相应的数字,其中数字的范围从0到9

Bobo老师机器学习笔记第七课-使用PCA对MNIST数据集进行降噪

问题2: 利用sklearn如何加载MNIST数据集?

import numpy as np 
from sklearn.datasets import fetch_mldata

mnist = fetch_mldata('MNIST original')
print mnist 
X, y = mnist['data'], mnist['target']
print X.shape
           

注意是利用fetch_mldata方法。 如果报Socket Error,请检查能否访问http://mldata.org/repository/data/download/matlab/mnist-original 链接。如果加载成功的话,这个数据是7w条,特征值是784, 因为这个是一个28*28像素的图片。 

问题3: 如果sklearn下载一直报socket error,那怎么办?

答:有时由于网络问题无法访问上面链接。那可以访问这个路径,通过这个路径就可以直接把文件下载下来。然后把文件放到data_home路径下。可以通过以下代码获取data_home路径。 

from sklearn.datasets import get_data_home
print get_data_home()
           

实例代码:

from timeit import timeit
from sklearn.datasets import fetch_mldata
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.decomposition import PCA
mnist = fetch_mldata('MNIST original')
X, y = mnist['data'], mnist['target']

def test():
    print X.shape
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
    knn_clf = KNeighborsClassifier()
    # knn_clf.fit(X_train, y_train)
    # # 0.9707428571428571
    # print X_train.shape
    # print knn_clf.score(X_test, y_test)


    pca = PCA(0.9)
    pca.fit(X_train, y_train)
    print pca
    X_train_reduction = pca.transform(X_train)
    X_test_reduction = pca.transform(X_test)
    knn_clf.fit(X_train_reduction, y_train)
    print knn_clf.score(X_test_reduction, y_test)
           

运行结论:

1、不用PCA的时候,运行大概15min左右,准确度在97%左右

2、使用PCA后,降维到87维,准确率大概在98%以上,运行时间在2分钟以内,这说明使用PCA后把数据中的一些噪音去掉了,从而是准确度提高了,并且节省了时间。

参考资料:

1、 详解 MNIST 数据集 

2、MNIST 数据介绍

3、使用PCA + KNN对MNIST数据集进行手写数字识别

继续阅读