1. 程式人生 > >降維:特徵選擇與特徵提取

降維:特徵選擇與特徵提取

對於降維,我看可以簡單理解為減少資料的維度,說白了就是減少變數個數。文末的視訊牆裂推薦觀看一下。
特徵選擇: 不改變變數的含義,僅僅只是做出篩選,留下對目標影響較大的變數。

  • Backward Elimination(反向淘汰)
  • Forward Selection(正向選擇)
  • Bidirectional Elimination(雙向淘汰)
  • Score Comparison(資訊量比較)

前面三種機制差不多,反向淘汰其實之前的文章寫過例項應用的:反向淘汰
對於正向選擇,其實大致就是反向淘汰的逆過程。每個變數在加入模型前進行顯著水平與設定的顯著閾值進行比較,小於則加入模型,否則不加入。
雙向淘汰是反向淘汰結合正向淘汰,因此需要設定兩個水平顯著值,一個用於反向淘汰判斷變數是否該剔除出模型,一個用於正向選擇判斷變數是否應該加入模型。
資訊量比較

也寫過例項:資訊量比較

特徵提取: 從資料集中的m個變數中提取p個新的變數(p<=m),這p個變數可以很好的解釋自變數的差異性(數學上的表現為方差),這一步相當於資料預處理的一步,與因變數無關,因而是個無監督問題。常用到PCA(主成分分析)和KernelPCA(核函式主成分分析)-特殊PCA
PCA工作其實是在尋找最大方差所屬的方向------摘自某套教程的解釋。
並且PCA中特徵縮放是必須的,因為必須保證變數在同一個數量級,否則,數值大的貢獻很大,導致我們可能忽略了數值小卻很至關重要的特徵。
在這裡插入圖片描述
PCA基本工作步驟:

  1. 將X記為包含了m個自變數的矩陣,對x進行特徵縮放
  2. 計算x的方差矩陣,記作A
  3. 計算矩陣A的特徵值和特徵向量,對特徵值進行自大到小排序
  4. 選擇需要解釋方差的百分比P,藉此進行特徵選擇p個(這裡的特徵是我們提取到的,區別於m中的任意一個變數)
  5. 這裡的p個特徵就是我們留下的新特徵了
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
x = ss.fit_transform(x)
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,
y,test_size = 0.25,random_state = 0) from sklearn.decomposition import PCA pca = PCA(n_components=None) #當為None時我們只是取p = m,並沒有進行取捨。 x_train = pca.fit_transform(x_train) x_test = pca.transform(x_test) print('各個變數的解釋方差能力:'+str(pca.explained_variance_)) #這個步驟會自動得出每個變數的解釋方差的能力,並自大到小排序。方便我們進行取捨。

假設我們的P設定為80%,則我們需要用到上述程式碼的結果的p個變數解釋方差達到80%。這裡就確定了p的取值。接下來可以在運用一次:

from sklearn.decomposition import PCA
pca = PCA(n_components=p)  	#這裡的p時上個程式碼片得出的p
x_train = pca.fit_transform(x_train)
x_test = pca.transform(x_test)

注意重新生成的變數是我們高度概括的結果。區別於原來的變數。
核函式PCA也差不多一樣的步驟,不過用到的是別的包:

from sklearn.decomposition import KernelPCA

核函式PCA可以將原本線性不可分的變數,投射到更高維的空間,從而變得線性可分,在將結果投射回低維。關於這個過程,這裡有一個youtebe的演示視訊,可以很好的幫助理解。
連結:https://pan.baidu.com/s/1NQG5QGDZId-IcEUs1HcwfA 密碼:a7m0
詳細用法可以自行檢視官方的文件。