機(jī)器學(xué)習(xí)入門(十八)——PCA(下)

1.0?高維數(shù)據(jù)向低維數(shù)據(jù)映射

? ? ? ? 僅僅提取一個數(shù)據(jù)集的n個主成分并沒有對數(shù)據(jù)維度造成改變。但利用提取出的主成分能夠選出使樣本方差最大的(小于n個數(shù)的)維度,以此實現(xiàn)對數(shù)據(jù)降維的操作,將高維數(shù)據(jù)映射為低維數(shù)據(jù)。

? ? ? ? 對于維度選擇主要通過原數(shù)據(jù)集與主成分向量組成的矩陣進(jìn)行乘機(jī)即可獲得。例如,假設(shè)有以下兩個矩陣,X是包含m個n為特征的數(shù)據(jù)樣本,W_k是從X中提取的前k個主成分,W_k也是包含n個特征。

? ? ? ? 將X從n維降到k維,只需要將XW_k相乘即可:X_k=X·W_k^T。該乘法的本質(zhì)就是將X的每一行數(shù)據(jù)X^{(i)}映射到W_k構(gòu)成的k維空間中,進(jìn)而得到一組包含k個特征的向量,即完成了從n維到k維的映射。

? ??????降維的過程中可能會丟失信息。如果原先的數(shù)據(jù)中本身存在一些無用信息,降維也可能會有降噪效果。

2.0 sklearn中的PCA分析

? ? ? ? 首先準(zhǔn)備數(shù)據(jù)集:


import numpy as np

import matplotlib.pyplot as plt

from sklearn import datasets

from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsClassifier

digits = datasets.load_digits()

X = digits.data? ? ? ? # (1797, 64),64個特征

y = digits.target

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)



? ? ? ? 使用KNN算法進(jìn)行數(shù)據(jù)模擬,并查看分類效果:


knn_clf = KNeighborsClassifier()

knn_clf.fit(X_train, y_train)

knn_clf.score(X_test, y_test)? ? ? # 輸出:0.9866666666666667



? ? ? ? 使用PCA進(jìn)行降維,再使用KNN對降維后的數(shù)據(jù)進(jìn)行擬合:


from sklearn.decomposition import PCA

pca = PCA(n_components=3)? ? ? ? # 將數(shù)據(jù)集的特征數(shù)量降到3維

pca.fit(X_train)

X_train_reduction = pca.transform(X_train)

X_test_reduction = pca.transform(X_test)

knn_clf2 = KNeighborsClassifier()

knn_clf.fit(X_train_reduction, y_train)

knn_clf.score(X_test_reduction, y_test)????????# 輸出:0.7644444444444445


????????可以看到,數(shù)據(jù)經(jīng)過降維由64個特征降到3個特征之后,使用相同模型再進(jìn)行預(yù)測的精度也相應(yīng)的降低了。說明在數(shù)據(jù)降維過程中損失了一部分有用的信息。

3.0 解釋方差

? ? ? ? 為了應(yīng)對數(shù)據(jù)降維過程中的損失,PCA算法提供了一個特殊的指標(biāo)pca.explained_variance_ratio_(解釋方差比例),通過對方差水平的解釋程度,反映降維后的數(shù)據(jù)集所保持的原數(shù)據(jù)集信息量的水平。仍以上面的digits為例:


print(pca.explained_variance_ratio_)

array([0.14566817, 0.13735469, 0.11777729])


? ? ? ? 上面的打印結(jié)果就是主成分所解釋的方差比例。

????????對于現(xiàn)在的示例來說,0.14566817表示第一個主成分能夠解釋原數(shù)據(jù)14.56%的方差;0.13735469表示第二個主成分能夠解釋13.73%的方差,0.11777729第三個主成分能夠解釋11.78%的方差。三者之和約為40%,說明PCA降維后的數(shù)據(jù)涵蓋了原數(shù)據(jù)總方差的約40%,剩余的60%都在降維過程中丟失掉了。

? ? ? ? 再使用該示例,對于原來的64個特征的數(shù)據(jù)集提取64個主成分,結(jié)果能夠解釋100%的原數(shù)據(jù)方差。


pca = PCA(n_components=64)

pca.fit(X_train)

pca.explained_variance_ratio_? ? ? ??


? ? ? ? 上面的矩陣即為64個主成分對于原數(shù)據(jù)方差解釋程度的結(jié)果,將其求和得1.0000000000000002,說明解釋了100%的原數(shù)據(jù)方差。此外還能注意到,隨著主成分?jǐn)?shù)量的增加,新增主成分對于原數(shù)據(jù)方差解釋的比例在不斷降低,后幾個主成分甚至可忽略不計。因此,實際應(yīng)用中可以通過累加占比的方式找出合適的主成分?jǐn)?shù)量,使對原數(shù)據(jù)的方差解釋長度達(dá)到確定的水平,進(jìn)而達(dá)到滿意的降維效果。

????????繪制方差解釋度的帕累托圖:


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()



? ? ? ? sklearn中,可以指定方差解釋的程度,使程序自動選擇生成的主成分?jǐn)?shù)量。


pca = PCA(0.80)

pca.fit(X_train)

pca.n_components_? ? ? ? # 輸出:13


X_train_reduction2 = pca.transform(X_train)? ? ? # 用降維后的數(shù)據(jù)建模

X_test_reduction2 = pca.transform(X_test)

knn_clf3 = KNeighborsClassifier()

knn_clf3.fit(X_train_reduction2, y_train)

knn_clf3.score(X_test_reduction2, y_test)? ? ? # 輸出:0.9666666666666667


? ? ? ? 使用這種達(dá)到較高精度的降維數(shù)據(jù)去進(jìn)行模型訓(xùn)練,就能得到較好的結(jié)果。

4.0 PCA逆操作與降噪

? ? ? ? 實際數(shù)據(jù)中不可避免地出現(xiàn)各種噪音,這些噪音的出現(xiàn)可能會對數(shù)據(jù)的準(zhǔn)確性造成一定的影響。而主成分分析法還有一個用途就是降噪。

????????PCA通過選取主成分將原有數(shù)據(jù)映射到低維數(shù)據(jù)再映射回高維數(shù)據(jù)的方式進(jìn)行一定程度的降噪。構(gòu)造一組數(shù)據(jù)作為示例:


import numpy as np

import matplotlib.pyplot as plt

X = np.empty((100, 2))

np.random.seed(666)

X[:,0] = np.random.uniform(0., 100., size=100)

X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0, 5, size=100)

plt.scatter(X[:,0], X[:,1])

plt.show()



? ? ? ? 使用PCA降維后數(shù)據(jù)進(jìn)行inverse_transform,看數(shù)據(jù)集的變化:


from sklearn.decomposition import PCA

pca = PCA(n_components=1)

pca.fit(X)

X_reduction = pca.transform(X)

X_restore = pca.inverse_transform(X_reduction)

plt.scatter(X_restore[:,0], X_restore[:,1])

plt.show()


? ? ? ? 比較上面兩個圖,可以明顯看出還原后的數(shù)據(jù)不等同于原數(shù)據(jù)!這是因為在使用PCA降維時已經(jīng)丟失了部分的信息。因此在還原時都是基于保留信息進(jìn)行還原的,只能保證維度相同,但恢復(fù)的數(shù)據(jù)與原數(shù)據(jù)必然無法相同。

? ? ? ? 但這樣一來一回的操作,丟失掉部分信息就相當(dāng)于降噪了。

????????據(jù)降維還有一個作用是可視化,如將特征數(shù)量降到二維后就可以在平面坐標(biāo)系中繪圖顯示(類似于統(tǒng)計中的對應(yīng)分析)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容