Hike News
Hike News

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

Introduction

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

  • 有些特徵與目標值較無關係,會選擇將此特徵剃除,稱之為降維
  • 得到一組"特徵間相互獨立(不相關)"主變量的過程

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

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

特徵選擇(feature_selection)

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

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

主要方法

  • Filter(過濾式):VarianceThreshold
    • 主要探究特徵本身特點、特徵和目標值之間關聯
    • 方差選擇法:低方差特徵過濾
    • 相關係數:得知特徵與特徵之間的相關程度
  • Embedded(嵌入式):算法自動選擇特徵(特徵與目標之間的關聯)
    • 正則化:L1、L2
    • 決策樹:信息熵、信息增益
    • 深度學習:巻積等
  • 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]]

其他特徵選擇方法

  • 神經網路

相關係數

降維的目的在於得到一組"特徵間相互獨立(不相關)"主變量的過程,因此得知特徵之間的相關性是極重要的

  • 相關係數可以知道特徵之間的相關程度
  • 較常用皮爾遜相關係數(Pearson Correlation Coefficient)
    • 反應變量之間相關關係密切程度的統計指標

特點

相關係數(r)值介於-1 至 1 之間,即-1 ≤ r ≤ 1,其性質如下:

  • 當 r > 0 時,表示兩變量正相關;r < 0 時,兩變量為負相關
  • 當 |r| = 1 時,表示兩變量為完全相關; r = 0 時,表示兩變量間無相關關係
  • 當 0 < |r| < 1 時,表示兩變量存在一定程度相關,且|r|越接近1,兩變量間線性關係越密切;且|r|越接近0,兩變量間線性相關越弱
  • 一般分為三個等級:
    • |r| < 0.4 為低度相關
    • 0.4 ≤ |r| < 0.7 為顯著性相關
    • 0.7 ≤ |r| < 1 為高度線性相關

Example

計算年廣告費投入與月均銷售額之間的關係

  • 有10個樣本數

Imgur

  • 最終計算的結果為0.9942

API

其位於scipy.stats中的pearsonr函數,其有兩個參數

  • x : 特徵x數據,為array_like形式
  • y : 特徵y數據,為array_like形式
  • 返回一元組,第一個值為r值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from scipy.stats import pearsonr

data = [[12.5,21.2],
[15.3,23.9],
[23.2,32.9],
[26.4,34.1],
[33.5,42.5],
[34.4,43.2],
[39.4,49.0],
[45.2,52.8],
[55.4,59.4],
[60.9,63.5]]

X = [x[0] for x in data]
Y = [x[1] for x in data]

r_value = pearsonr(X,Y)
print("Relation Coefficient : %s"%r_value[0])

Result

1
Relation Coefficient : 0.9941983762371883

tips

  • 特徵與特徵相關性很高的情況下,可在進行其處理
    • 選取其中一個特徵作為代表,刪除另一個特徵
    • 按一定權重求和作為新特徵
      • X特徵50% + Y特徵50%
    • 主成分分析

主成分分析(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

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