数据降维处理(PCALAD)
from sklearn.decomposition import PCA
簡介:
主成分分析(Principal Components Analysis),簡稱PCA,是一種數據降維技術,用于數據預處理。
PCA的一般步驟是:先對原始數據均值化,然后求協方差矩陣,接著對協方差矩陣求特征向量和特征值,這些特征向量組成了新的特征空間。
參數說明:
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
參數:
n_components: 這個參數可以幫我們指定希望PCA降維后的特征維度數目。最常用的做法是直接指定降維到的維度數目,此時n_components是一個大于等于1的整數。當然,我們也可以指定主成分的方差和所占的最小比例閾值,讓PCA類自己去根據樣本特征方差來決定降維到的維度數,此時n_components是一個(0,1]之間的數。當然,我們還可以將參數設置為"mle", 此時PCA類會用MLE算法根據特征的方差分布情況自己去選擇一定數量的主成分特征來降維。我們也可以用默認值,即不輸入n_components,此時n_components=min(樣本數,特征數)。
copy:
類型:bool,True或者False,缺省時默認為True。
意義:表示是否在運行算法時,將原始訓練數據復制一份。若為True,則運行PCA算法后,原始訓練數據的值不會有任何改變,因為是在原始數據的副本上進行運算;若為False,則運行PCA算法后,原始訓練數據的值會改,因為是在原始數據上進行降維計算。
whiten:
類型:bool,缺省時默認為False
意義:白化,使得每個特征具有相同的方差。所謂白化,就是對降維后的數據的每個特征進行歸一化,讓方差都為1.對于PCA降維本身來說,一般不需要白化。如果你PCA降維后有后續的數據處理動作,可以考慮白化。默認值是False,即不進行白化。
svd_solver:即指定奇異值分解SVD的方法,由于特征分解是奇異值分解SVD的一個特例,一般的PCA庫都是基于SVD實現的。有4個可以選擇的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized一般適用于數據量大,數據維度多同時主成分數目比例又較低的PCA降維,它使用了一些加快SVD的隨機算法。 full則是傳統意義上的SVD,使用了scipy庫對應的實現。arpack和randomized的適用場景類似,區別是randomized使用的是scikit-learn自己的SVD實現,而arpack直接使用了scipy庫的sparse SVD實現。默認是auto,即PCA類會自己去在前面講到的三種算法里面去權衡,選擇一個合適的SVD算法來降維。一般來說,使用默認值就夠了。
PCA屬性:
- components_ :返回具有最大方差的成分。
- n_components_:返回所保留的成分個數n。
- mean_:
- noise_variance_:
- explained_variance_,它代表降維后的各主成分的方差值。方差值越大,則說明越是重要的主成分。
- explained_variance_ratio_:返回所保留的n個成分各自的方差百分比。比例越大,則越是重要的主成分。
PCA方法:
- fit(X,y=None)
fit(X),表示用數據X來訓練PCA模型。
函數返回值:調用fit方法的對象本身。比如pca.fit(X),表示用X對pca這個對象進行訓練。
拓展:fit()可以說是scikit-learn中通用的方法,每個需要訓練的算法都會有fit()方法,它其實就是算法中的“訓練”這一步驟。因為PCA是無監督學習算法,此處y自然等于None. - 2.fit_transform(X)
用X來訓練PCA模型,同時返回降維后的數據。
newX=pca.fit_transform(X),newX就是降維后的數據。 - 3.inverse_transform()
將降維后的數據轉換成原始數據,X=pca.inverse_transform(newX) - 4.transform(X)
將數據X轉換成降維后的數據。當模型訓練好后,對于新輸入的數據,都可以用transform方法來降維。
此外,還有get_covariance()、get_precision()、get_params(deep=True)、score(X, y=None)等方法。
案例分析
- 首先生成隨機數據并可視化
三維數據的分布圖如下:
- 我們先只對數據進行投影,看看投影后的三個維度的方差分布,代碼如下:
輸出結果如下:
[0.98318212 0.00850037 0.00831751]
[3.78521638 0.03272613 0.03202212]
可以看出投影后三個特征維度的方差比例大約為98.3% 0.8% 0.8% 。投影后第一個特征占了絕大多數的主成分比例。
現在我們來進行降維,從三維降到二維,代碼如下:
輸出結果如下:
[0.98318212 0.00850037]
[3.78521638 0.03272613]
這個結果其實可以預料,因為上面三個投影后的特征維度的方差分別為:[3.78521638 0.03272613 0.03202212] ,投影到二維后選擇的肯定是錢兩個特征,而拋棄第三個特征。
為了有直觀的認識,我們看看此時轉化后的數據分布,代碼如下:
X_new = pca.transform(X)
- 指定降維后的主成分方差和比例。
上面我們指定了主成分至少占95% ,輸出如下:
[0.98318212]
[3.78521638]
1
可見只有第一個投影特征被保留,這也很好理解,我們的第一個主成分占投影特征的方差比例高達98%。只選擇這一個特征維度便可以滿足95%的閾值。我們現在選擇閾值99%看看,代碼如下:
pca = PCA(n_components = 0.99) pca.fit(X) print(pca.explained_variance_ratio_) print(pca.explained_variance_) print(pca.n_components_)此時輸出的結果:
[0.98318212 0.00850037]
[3.78521638 0.03272613]
2
這個結果也很好理解,因為我們第一個主成分占了98.3%的方差比例,第二個主成分占了0.8%的方差比例,兩者一起可以滿足我們的閾值。
最后我們看看讓MLE算法自己選擇降維維度的效果,代碼如下:
pca = PCA(n_components = 'mle') pca.fit(X) print(pca.explained_variance_ratio_) print(pca.explained_variance_) print(pca.n_components_)輸出結果如下:
[0.98318212]
[3.78521638]
1
可見由于我們的數據的第一個投影特征的方差占比高達98.3%,MLE算法只保留了我們的第一個特征。
補充
- Incremental PCA
當要分解的數據集太大而無法放入內存時,增量主成分分析(IPCA)通常用作主成分分析(PCA)的替代。IPCA主要是為了解決單機內存限制的,有時候我們的樣本量可能是上百萬+,維度可能也是上千,直接去擬合數據可能會讓內存爆掉,此時我們可以使用Incremental PCA類來解決這個問題。
IPCA 是將數據分成多個batch,然后對每個batch依次遞增調用partial_fit函數,這樣一步步的得到最終的樣本最優降維。
參考博客
線性判別分析(帶有分類數據的降維)
sklearn.discriminant_analysis.LinearDiscriminantAnalysis
1.1)參數說明
LinearDiscriminantAnalysis(solver=‘svd’, shrinkage=None, priors=None, n_components=None, store_covariance=False, tol=0.0001, covariance_estimator=None)
?
主要參數說明 :
solver {‘svd’, ‘lsqr’, ‘eigen’}, default=’svd’
“svd”:奇異值分解(默認值)。不計算協方差矩陣,因此建議對具有大量特征的數據使用此解算器。
“lsqr”:最小二乘解。可以與收縮或自定義協方差估計器相結合。
“eigen”:特征值分解。可以與收縮或自定義協方差估計器相結合。
?
priors : 類的先驗概率。默認情況下,將從訓練數據推斷類比例。降維時一般不需要關注這個參數。
?
n_components : 用于降維的組件數量(<= min(n_classes - 1, n_features))。如果我們不是用于降維,則這個值可以用默認的None。
?
store_covariance : 如果為True,則當解算器為“svd”時,明確計算加權類內協方差矩陣。始終為其他解算器計算和存儲矩陣。
?
shrinkage:正則化參數,可以增強LDA分類的泛化能力。如果僅僅只是為了降維,則一般可以忽略這個參數。默認是None,即不進行正則化。可以選擇"auto",讓算法自己決定是否正則化。當然我們也可以選擇不同的[0,1]之間的值進行交叉驗證調參。注意shrinkage只在solver為最小二乘"lsqr"和特征分解"eigen"時有效。
?
covariance_estimator : 協方差估計量
?
屬性 :
coef_ : 權重向量。 intercept_ : 截取項。 covariance_ : 加權類內協方差矩陣。
means_ : Class-wise means. priors_ : 類別優先級(總和為1)
scalings_ : 在類質心跨越的空間中縮放特征。僅適用于“奇異值分解”和“特征值”解算器。
xbar_ : 總平均數。僅當解算器為“svd”時出現。 classes_ : 唯一的類標簽。
?
方法 :
fit(X, y) : 根據給定的參數擬合線性微分分析模型
transform(X) : 項目數據以最大化類分離。
fit_transform(X, y=None, ** fit_params) : 適應數據,然后對其進行轉換。
decision_function(X) : 將決策函數應用于樣本數組。
predict(X) : 預測X中樣本的類標簽。
predict_proba(X) : 估計概率。
score(X, y, sample_weight=None) : 返回給定測試數據和標簽的平均精度。
1.2)代碼示例
????1.2.1)使用線性判別分析來降維
from sklearn import datasets import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.discriminant_analysis import LinearDiscriminantAnalysis# 加載數據集 iris = datasets.load_iris() X = iris.data y = iris.target columns = iris.target_namespca = PCA(n_components=2) x1 = pca.fit_transform(X) # 返回降維后的數據lda = LinearDiscriminantAnalysis(n_components=2) # 降維 x2 = lda.fit(X,y).transform(X) # 返回降維后的數據# 畫圖 plt.figure() colors = ['navy', 'turquoise', 'darkorange'] lw = 2for color, i, target_name in zip(colors, [0,1,2],columns):plt.scatter(x1[y == i, 0], x1[y == i, 1], color=color, alpha=.8, lw=lw,label=target_name)plt.legend(loc='best', shadow=False, scatterpoints=1) plt.title('PCA of IRIS dataset')plt.figure() for color, i, target_name in zip(colors, [0, 1, 2], columns):plt.scatter(x2[y == i, 0], x2[y == i, 1], alpha=.8, color=color,label=target_name) plt.legend(loc='best', shadow=False, scatterpoints=1) plt.title('LDA of IRIS dataset') plt.show()????1.3)方法講解
LDA通過把輸入的數據投影到由最大化類之間分離的方向所組成的線性子空間,可以執行有監督降維。輸出的維度必然會比原來的類別數量更少的。因此它總體而言是十分強大的降維方式,同樣也僅僅在多分類環境下才能感覺到。實現方式在 discriminant_analysis.LinearDiscriminantAnalysis.transform 中。關于維度的數量可以通過 n_components 參數來調節。 值得注意的是,這個參數不會對 discriminant_analysis.LinearDiscriminantAnalysis.fit 或者 discriminant_analysis.LinearDiscriminantAnalysis.predict 產生影響。
同時兩種方法天生具有多分類的特性,在實踐中已經被證明很有效,并且無需調參。
LDA既可以用于分類又可以用于降維。當然,應用場景最多的還是降維。和PCA類似,LDA降維基本也不用調參,只需要指定降維到的維數即可.
總結
以上是生活随笔為你收集整理的数据降维处理(PCALAD)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 买笔记本要注意什么呢?
- 下一篇: 易班总是显示服务器出错,易班