數據預處理與特征工程:降維算法
一、sklearn中的降維算法
sklearn中降維算法都被包括在模塊decomposition中,這個模塊本質是一個矩陣分解模塊。矩陣分解可以用在降維,深度學習,聚類分析,數據預處理,低緯度特征學習,推薦系統,大數據分析等領域。
SVD和主成分分析PCA都屬于矩陣分解算法中的入門算法,都是通過分解特征矩陣來進行降維
PCA使用的信息量衡量指標,就是樣本方差,又稱可解釋性方差,方差越大,特征所帶的信息量越多。
方差計算公式中為什么除數是n-1?這是為了得到樣本方差的無偏估計
2.降維究竟是怎樣實現?

找出n個新特征向量,讓數據能夠被壓縮到少數特征上并且總信息量不損失太多的技術就是矩陣分解。PCA和SVD是兩種不同的降維算法,但他們都遵從上面的過程來實現降維,只是兩種算法中矩陣分解的方法不同,信息量的衡量指標不同罷了。
思考:PCA和特征選擇技術都是特征工程的一部分,它們有什么不同?
特征工程中有三種方式:特征提取,特征創造和特征選擇。仔細觀察上面的降維例子和上周我們講解過的特征選擇,你發現有什么不同了嗎?特征選擇是從已存在的特征中選取攜帶信息最多的,選完之后的特征依然具有可解釋性,我們依然知道這個特征在原數據的哪個位置,代表著原數據上的什么含義。而PCA,是將已存在的特征進行壓縮,降維完畢后的特征不是原本的特征矩陣中的任何一個特征,而是通過某些方式組合起來的新特征。通常來說,在新的特征矩陣生成之前,我們無法知曉PCA都建立了怎樣的新特征向量,新特征矩陣生成之后也不具有可讀性,我們無法判斷新特征矩陣的特征是從原數據中的什么特征組合而來,新特征雖然帶有原始數據的信息,卻已經不是原數據上代表著的含義了。以PCA為代表的降維算法因此是特征創造(feature creation,或feature construction)的一種??梢韵?,PCA一般不適用于探索特征和標簽之間的關系的模型(如線性回歸),因為無法解釋的新特征和標簽之間的關系不具有意義。在線性回歸模型中,我們使用特征選擇。
3.sklearn中的PCA
PCA參數列表




1 import matplotlib.pyplot as plt 2 from sklearn.datasets import load_iris 3 from sklearn.decomposition import PCA 4 import pandas as pd 5 iris = load_iris() 6 y = iris.target 7 X = iris.data 8 pd.DataFrame(X) 9 pca = PCA(n_components= 2)#降低成2維 10 pca = pca.fit(x) 11 X_dr = pca.transform(x)
對降維后的數據進行可視化
1 plt.figure() 2 plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0]) 3 plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1]) 4 plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2]) 5 plt.legend() 6 plt.title('PCA of IRIS dataset') 7 plt.show()

探索降維后的數據
1 #屬性explained_variance_,查看降維后每個新特征向量上所帶的信息量大小(可解釋性方差的大?。?/span> 2 pca.explained_variance_ 3 #屬性explained_variance_ratio,查看降維后每個新特征向量所占的信息量占原始數據總信息量的百分比 4 #又叫做可解釋方差貢獻率 5 pca.explained_variance_ratio_ 6 #大部分信息都被有效地集中在了第一個特征上 7 pca.explained_variance_ratio_.sum()
選擇最好的n_components:累積可解釋方差貢獻率曲線
1 import numpy as np 2 pca_line = PCA().fit(x) 3 plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_)) 4 plt.xticks([1,2,3,4]) #這是為了限制坐標軸顯示為整數 5 plt.xlabel("number of components after dimension reduction") 6 plt.ylabel("cumulative explained variance ratio") 7 plt.show()

4.n_components的選擇
4.1最大似然估計自選超參數
1 pca_mle = PCA(n_components="mle")#讓PCA用最大似然估計(maximum likelihood 2 estimation)自選超參數的方法 3 pca_mle = pca_mle.fit(X) 4 X_mle = pca_mle.transform(X) 5 X_mle 6 #可以發現,mle為我們自動選擇了3個特征 7 pca_mle.explained_variance_ratio_.sum() 8 #得到了比設定2個特征時更高的信息含量,對于鳶尾花這個很小的數據集來說,3個特征對應這么高的信息含量,并不 9 需要去糾結于只保留2個特征,畢竟三個特征也可以可視化
4.2按信息量占比選超參數
1 #輸入[0,1]之間的浮點數,并且讓參數svd_solver =='full',表示希望降維后的總解釋性方差占比大于n_components指定的百分比,即是說,希望保留百分之多少的信息量。比如說,如果我們希望保留97%的信息量,就可以輸入
n_components = 0.97,PCA會自動選出能夠讓保留的信息量超過97%的特征數量。 4 pca_f = PCA(n_components=0.97,svd_solver="full") 5 pca_f = pca_f.fit(X) 6 X_f = pca_f.transform(X) 7 pca_f.explained_variance_ratio_
(資料來源:菜菜老師)
待更新···
浙公網安備 33010602011771號