機器學習:PCA(實例:MNIST數據集)
阿新 • • 發佈:2018-07-03
還需要 bsp ase rom clas fit 疑問 現象 arr
一、數據
-
獲取數據
import numpy as np from sklearn.datasets import fetch_mldata mnist = fetch_mldata("MNIST original")
- sklearn 的 datasets 中,一個特有的方法:fetch_mldata,使用此方法可以直接從一個官方網站中下載各種機器學習數據;
- 格式:datas = fetch_mldata("字符串");
-
查看數據
mnist # 輸出: {‘COL_NAMES‘: [‘label‘, ‘data‘], ‘DESCR‘: ‘mldata.org dataset: mnist-original
- mnist 是一個字典:‘COL_NAMES‘、‘DESCR‘、‘data‘、‘target‘;
- ‘DESCR‘:表示 MNIST 數據集所在的網站;
-
處理數據
X, y = mnist[‘data‘], mnist[‘target‘] X.shape # 輸出:(70000, 784) 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) # 輸出:44.9 s knn_clf.score(X_test, y_test) # 輸出:0.9688
- kNN 算法中還需要進行調參:k、weight
-
使用 kNN算法進行識別操作(PCA降維數據)
from sklearn.decomposition import PCA # 只保留樣本的 90% 的信息 pca = PCA(0.9) pca.fit(X_train) X_train_reduction = pca.transform(X_train) X_train_reduction.shape # 輸出:(60000, 87) knn_clf = KNeighborsClassifier() %time knn_clf.fit(X_train_reduction, y_train) # 輸出:602 s X_test_reduction = pca.transform(X_test) %time knn_clf.score(X_test_reduction, y_test) # 輸出:1 min 27 s 0.9728
- PCA(0.9):只保留樣本的 90% 的信息,也就是能解釋 90% 原是數據方差的前 n 個主成分;
- (60000, 87):將樣本從 784 維,降低至 87 維,保留了樣本 90% 的信息;
-
分析:數據使用 PCA 降維前後的效果
- 現象:識別準確度提高了,預測時間縮短了;
- 使用 PCA 將數據降維後的優點:識別準確度提高了,預測時間縮短了,減小了數據和存儲空間;
- 疑問:為什麽 PCA 的過程中丟失了 10% 的信息,識別準確度反而提高了?
- 答疑:實際上 PCA 這個過程中,不僅僅對原始數據進行了降維,更有可能在降維的過程中將原有的數據所包含的噪音消除了,使得數據集中更好的特征,以至於識別準確率得到提升;
機器學習:PCA(實例:MNIST數據集)