Hike News
Hike News

機器學習-特徵工程-降維

Introduction

降維不是將array的維度減少(3D陣列->2D陣列),而使指將特徵的數量減少
DecreaseDimension

  • 有些特徵與目標值較無關係,會選擇將此特徵剃除,稱之為降維

數據降維通常有兩種方式:

  1. 特徵選擇
  2. 主成分分析

特徵選擇(feature_selection)

從眾多特徵中選出部分特徵當作最後機器學習輸入的訓練集,通常須人為的挑選,同時也必須了解相關業務知識
選擇後的特徵維數肯定比選擇前小,特徵在選擇和選擇後可以改變值

  • 冗餘特徵:部份特徵相關度高,容易消耗計算性能
  • 噪聲特徵(不需要的特徵):對預測結果造成影響

主要方法

  • Filter(過濾式):VarianceThreshold
  • Embedded(嵌入式):正則化、決策樹
  • Wrapper(包裹式) -> 較不常使用

VarianceThreshold(方差門檻)

  • 將方差較小的特徵刪除:樣本間特徵集中(相似),較不易影響最後結果
  • 使用sklearn.feature_selection.VarianceThreshold

VarianceThreshold(threshold = 0.0)

刪除所有低方差的特徵

  • threshold:指定方差小於多少則刪除特徵,預設為0

fit_transform(X)

  • X: numpy array格式的數據[n_sample, n_features]
  • 返回值: 訓練集差異低於threshold的特徵將被刪除
  • 預設值是保留所有非零方差的特徵,即刪除所有樣本中具有相同值的特徵

流程

  1. 初始化VarianceThreshold
    • 指定方差的threshold
  2. 調用fit_transform

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from sklearn.feature_selection import VarianceThreshold

UnFS_data = [[90,2,1000,0.8,1],
[120,5,2500,0.75,1],
[45,10,1800,0.38,1],
[45, 10, 1800, 0.38,1],
[30, 7, 3500, 0.11,1],
[75, 8, 2700, 0.29,1],]

def featureSelect_VT():
VT = VarianceThreshold(threshold=0.0)
FS_data = VT.fit_transform(UnFS_data)
print(FS_data)

if __name__ == '__main__':
featureSelect_VT()
  • 記得設置threshold之值,默認為0

特徵篩選後

1
2
3
4
5
6
[[9.0e+01 2.0e+00 1.0e+03 8.0e-01]
[1.2e+02 5.0e+00 2.5e+03 7.5e-01]
[4.5e+01 1.0e+01 1.8e+03 3.8e-01]
[4.5e+01 1.0e+01 1.8e+03 3.8e-01]
[3.0e+01 7.0e+00 3.5e+03 1.1e-01]
[7.5e+01 8.0e+00 2.7e+03 2.9e-01]]

其他特徵選擇方法

  • 神經網路

主成分分析(PCA)

是一種分析、簡化數據集的技術。
雖然主要用於減少維度,但仍希望信息盡可能的表示完整,不會損耗太多
目的:使數據維數壓縮,盡可能降低原數據的維度(複雜度),但損失最少量信息
作用:可以削減回歸分析或者聚類分析中特徵的數量
應用場景:當特徵數量達到上百時,才會考慮用PCA去簡化數據

高維度數據的問題

  • 特徵之間容易出現一些相關的特徵

PCA

  • 使用sklearn.decomposition

PCA(n_components=None)

  • 將數據分解為較低維數空間
  • n_components可以有兩種形式:
    • 浮點數形式(介於0-1):保留多少百分比的信息(例如0.9為90%),人為可控參數,建議90%-95%
    • 整數形式:減少到多少特徵數量(一般較少使用)

fit_transform(X)

X: numpy array格式的數據[n_sample, n_features]
返回值: 轉換後指定維度的array

流程

  1. 初始化PCA
    • 指定減少後的維度(整數) 或 保留多少%信息(浮點數)
  2. 調用fit_transform

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from sklearn.decomposition import PCA

UnDD_data = [[90,2,1000,0.8,1],
[120,5,2500,0.75,1],
[45,10,1800,0.38,1],
[45, 10, 1800, 0.38,1],
[30, 7, 3500, 0.11,1],
[75, 8, 2700, 0.29,1],]

# 主成分分析進行特徵降維
def DecreaseDimension_PCA():
pca = PCA(n_components=0.95)
DD_data = pca.fit_transform(UnDD_data)
print(DD_data)

if __name__ == '__main__':
DecreaseDimension_PCA()

降維結果

1
2
3
4
5
6
[[-1216.836117  ]
[ 282.78600381]
[ -416.41490377]
[ -416.41490377]
[ 1283.6463807 ]
[ 483.23354004]]

tips

  • 通常會對擁有高維度的數據進行降維處理