數據降維就是降低數據的維度,有兩種方式:
1、一種是特征選擇:直接選取原有維度的一部分參與后續的計算和建模過程,用選擇的維度替代所有維度,整個過程不產生新的維度。
方法:
(1)經驗法:根據業務經驗選擇
(2)測算法:通過不斷測試多種維度選擇參與計算,通過結果來反復驗證和調整並最終找到最佳特征方案
(3)統計分析方法:通過相關性分析不同維度間的線性相關性,在相關性高的維度中進行人工去除或篩選;通過計算不同維度間的互信息,找到具有較高互信息的特征集,然后把其中的一個特征去除或留下
(4)機器學習:通過機器學習算法得到不同特征的特征值或權重,然后再根據權重來選擇較大的特征,例用決策樹得出不同變量的重要程度。
2、另一種是特征提取:按照一定的數學變換方法,將高維空間的數據點映射到低維空間中,然后利用映射后的變量特征來表示原有的總體特征。
方法:常用算法有獨立成分分析(ICA)、主成分分析(PCA)、因子分析(FA)、線性判別分析(LDA)、局部線性嵌入(LLE)、核主成分分析(Kernel PCA)等
主成分分析(PCA):
把給定的一組相關變量(維度)通過線性變換轉換成另一組不相關的變量,這些新的變量按照方差依次遞減的順序排序。第一變量具有最大方差,稱第一主成分,第二變量的方差次大,稱第二主成分。
主成分分析基本步驟:
(1)對原始d維數據做標准化處理
(2)構造樣本的協方差矩陣
(3)計算協方差矩陣的特征值和相應的特征向量
(4)選擇與前k個最大特征值對應的特征向量,其中k為新特征空間的維度(k<=d)
(5)通過前k個特征向量構建映射矩陣W
(6)通過映射矩陣W將d維的輸入數據集X轉換到新的k維特征子空間
#導入庫
import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn import datasets
#導入數據 iris=datasets.load_iris() #加載鳶尾花數據集 x=iris.data print(x[:10])
[[ 5.1 3.5 1.4 0.2]
[ 4.9 3. 1.4 0.2]
[ 4.7 3.2 1.3 0.2]
[ 4.6 3.1 1.5 0.2]
[ 5. 3.6 1.4 0.2]
[ 5.4 3.9 1.7 0.4]
[ 4.6 3.4 1.4 0.3]
[ 5. 3.4 1.5 0.2]
[ 4.4 2.9 1.4 0.2]
[ 4.9 3.1 1.5 0.1]]
#建立模型 pca=PCA(n_components=2) #建立PCA模型對象,n_components是數據要降到的維度 pca.fit(x) #將數據輸入模型 x_r=pca.transform(x) #對數據集進行轉換映射 print(x_r[:10])
[[-2.68420713 0.32660731]
[-2.71539062 -0.16955685]
[-2.88981954 -0.13734561]
[-2.7464372 -0.31112432]
[-2.72859298 0.33392456]
[-2.27989736 0.74778271]
[-2.82089068 -0.08210451]
[-2.62648199 0.17040535]
[-2.88795857 -0.57079803]
[-2.67384469 -0.1066917 ]]
#輸出轉換后的主成分 components=pca.components_ #獲取轉換后的主成分 var=pca.explained_variance_ #獲取轉換后的主成分的方差 var_ratio=pca.explained_variance_ratio_ #獲取轉換后的主成分的方差占比 print('components',components) print('variance',var) print('variance ratio',var_ratio)
components [[ 0.36158968 -0.08226889 0.85657211 0.35884393]
[ 0.65653988 0.72971237 -0.1757674 -0.07470647]]
variance [ 4.22484077 0.24224357]
variance ratio [ 0.92461621 0.05301557]
上述輸出結果中,主成分的方差占比是選擇主成分數量的關鍵,主成分方差占比之和在70%以上就可以選擇該主成分參與后續模型計算。
因子分析(FA):
從變量中提取共性因子。
因子分析要求原有變量間具有較強的相關性,否則,因子分析無法提取變量間的共性特征,如果相關系數小於0.3,則變量間的共線性較小,不適合因子分析;因子分析得到因子和原變量的關系,因此能夠對因子進行解釋。
import numpy as np import pandas as pd from sklearn import datasets from sklearn.decomposition import FactorAnalysis iris=datasets.load_iris() x=iris.data fa=FactorAnalysis(n_components=3) #指定3個因子作為新變量 fa.fit(x) tran_x=fa.transform(x) print(tran_x[:10]) #輸出新因子
[[ -1.31686745e+00 5.97520018e-01 1.11217811e-03]
[ -1.32710651e+00 -3.28650685e-01 -3.88642995e-01]
[ -1.39619171e+00 -2.84417674e-01 1.31593688e-01]
[ -1.33067991e+00 -5.98068260e-01 1.15421214e-03]
[ -1.33261365e+00 6.06424839e-01 2.31749197e-01]
[ -1.11358590e+00 1.37362223e+00 5.32582144e-01]
[ -1.34512235e+00 -1.98028671e-01 6.99463537e-01]
[ -1.28894846e+00 3.10292800e-01 -7.03646521e-02]
[ -1.38762034e+00 -1.09325259e+00 3.50884895e-02]
[ -1.32480883e+00 -1.89272934e-01 -6.00649914e-01]]
線性判別分析(LDA):
線性判別將高維的模式樣本投影到最佳鑒別矢量空間,以達到抽取分類信息和壓縮特征空間維度的效果,投影后保證模式樣本在新的子空間有最大的類間距離和最小的類內距離,即模式在該空間有最佳的可分離性。線性判別通過一個已知類別的“訓練樣本”來建立判別准則,並通過預測變量來為未知類別的數據進行分類。
import numpy as np import pandas as pd from sklearn import datasets from sklearn.lda import LDA iris=datasets.load_iris() x=iris.data y=iris.target print(x[:5],y[:5]) lda=LDA() lda.fit(x,y) x_r=lda.transform(x) print(x_r[:5])
參考:
http://www.dataivy.cn/blog/%E5%9B%A0%E5%AD%90%E5%88%86%E6%9E%90factor-analysis/