特徵工程的方法和步驟


數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。

0.示意圖

在這裏插入圖片描述
原圖

1.特徵類別

1.1.類別特徵

  • one-hot encoding
  • hash encoding
  • label encoding
  • count encoding
  • label-count encoding
  • target encoding
  • category embedding
  • Nan encoding
  • polynomial encoding
  • expansion encoding
  • consolidation encoding

1.2.數值特徵

  • rounding
  • binning
  • scaling
  • imputation
  • interactions
  • no linear encoding
  • row statistics

1.3.時間特徵

1.4.空間特徵

1.5.自然語言處理

1.6.深度學習/神經網絡

1.7.圖特徵

1.7.Leakage

1.8.統計聚合

1.9.自動化特徵工程

2.數據預處理

利用Sklearn的preprocessing庫。

2.1.無量綱化方法

  • 標準化:轉換成標準正態分佈x=xXSx'=\frac{x-{\overline X}}{S}
from sklearn.preprocessing import StandardScaler
  • 區間縮放法:
    如:x=xminmaxminx'=\frac{x-{min}}{max-min}
from sklearn.preprocessing import MinMaxScaler

2.2.歸一化

依照特徵矩陣的處理數據。
目的:將樣本向量轉化爲單位向量。使樣本向量在點乘運算或其他核函數計算相似性時,擁有統一的標準。

標準化是依照特徵矩陣的處理數據,其通過z-score的方法,將樣本的特徵值轉換到同一量綱下。

規則爲L2的歸一化公式如下:
x=xjmxj2x'=\frac{x}{\sqrt {\sum_j^mx_j^2}}

from sklearn.preprocessing import Normalizer

2.3.定性特徵One-hot/啞編碼

from sklearn.preprocessing import OneHotEncoder

其實One-hot和啞編碼是有區別的(詳見博文)。啞編碼就是去除了One-hot的冗餘變量。

2.4.定量特徵二值化

x={1,x>threshold0,xthresholdx=\begin{cases}1,x>threshold \\0,x\leqslant threshold\end{cases}

from sklearn.preprocessing import Binarizer
Binarizer(threshold=3).fit_transform(iris.data)

2.5.缺失值填充

列平均值、0/1

from sklearn.preprocessing import Imputer
# 缺失值計算,返回值爲結算缺失值後的數據
# 參數 missing_value爲缺失值的表示形式,默認爲NaN
# 參數 strategy爲填充方式,默認爲“均值填充”
Imputer().fit_transform(data)))

2.6.數據變換

提高算法對特徵的信息利用率。

  • 多項式變換
from sklearn.preprocessing import PolynomialFeatures
# 參數degree爲度
PolynomialFeatures().fit_transform(iris.data)
  • 指數變換、對數變換等
from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
# 自定義轉換函數爲對數函數的數據變換
# 第一個參數是單變元函數
FunctionTransformer(log1p).fit_transform(iris.data)

3.特徵選擇

sklearn中的feature_selection庫
選擇有意義的特徵進行訓練。通常從兩個方面來考慮:

  • 特徵是否發散: 如果一個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。
  • 特徵與Y的相關性: 與目標相關性高的特徵,應當優先選擇。

3.1.Filter過濾法

按照發散性相關性對各個特徵進行評分,設定閾值特徵個數,選擇特徵。

3.1.1.方差選擇法

利用發散性
計算各個特徵的方差,選擇方差>閾值的特徵。

from sklearn.feature_selection import VarianceThreshold
VarianceThreshold(threshold = 3).fit_transform(iris.data)

3.1.2.相關係數法

利用相關性
計算各個特徵對目標值Y的相關係數的評分。

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
# 參數k爲選擇的特徵個數
# 第一個參數爲計算評估特徵是否好的函數,該函數輸入特徵矩陣和目標向量,輸出二元組(評分,P值)的數組,數組第i項爲第i個特徵的評分和P值。在此定義爲計算相關係數。
SelectKBest(lambda X,Y:np.array(list(map(lambda x:pearsonr(x,Y),X.T))).T,k = 2)
.fit_transform(X_test,y_test)

3.1.3.卡方檢驗

利用相關性
檢驗定性自變量對定性因變量的相關性。
假設自變量有N種取值,因變量有M種取值,考慮自變量等於i且因變量等於j的樣本頻數觀察值與期望的差距,構建統計量:
χ2=(AE)2E\chi^2=\sum\frac{(A-E)^2}{E}

from sklearn.feature_selection import SelectKBest, chi2
#參數k爲選擇的特徵個數
X_new = SelectKBest(chi2, k = 20).fit_transform(X, y)

3.1.4.互信息法

利用相關性

  1. 評價定性自變量對定性因變量的相關性。
    I(X;Y)=xXyYp(x,y)logp(x,y)p(x)p(y)I(X;Y)=\displaystyle\sum_{x\in X}\displaystyle\sum_{y\in Y}p(x,y)log\frac{p(x,y)}{p(x)p(y)}
  2. 定量數據:最大信息係數法。
from sklearn.feature_selection import SelectKBest
from minepy import MINE # 最大信息係數法

# 由於MINE的設計不是函數式,定義mic方法將其改爲函數式的,返回一個二元組,二元組的第2項設置成固定的P值0.5
def mic(x,y):
    m = MINE()
    m.compute_score(x,y)
    return (m.mic(),0.5)

SelectKBest(lambda X, Y: array(list(map(lambda x:mic(x, Y), X.T))).T, k = 2).fit_transform(iris.data, iris.target)

3.2.Wrapper包裝法

根據目標函數/預測效果評分,每次選擇若干特徵,或排除若干特徵。

3.2.1.遞歸特徵消除法

使用一個基模型來進行多輪訓練
每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。

假如有50個特徵,最終只保留10個特徵。運行50次estimator,每次刪掉一個特徵,對50次的模型性能排序。特徵刪掉後,模型性能顯著降低的將被留下。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
RFE(estimator=LogisticRegression(),n_features_to_select=2).fit_transform(iris.data,iris.target)

3.3.Embedded嵌入法

 先使用某些機器學習的算法模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。
 類似於Filter法,但是通過訓練來確定特徵的優劣。

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
selector = SelectFromModel(estimator=LogisticRegression()).fit(X, y)
print(selector.estimator_.coef_)
selector.transform(X)

樹模型(如GBDT)也可以用來作爲基模型。

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data,iris.target)

3.3.1.基於懲罰項

使用帶懲罰項(L1、L2正則化)的基模型,除了篩選出特徵外,同時也進行了降維。

正則化會將一些特徵的權重降低。

4.特徵降維

特徵矩陣過大,會導致計算量大、訓練時間長。

4.1.正則化

損失函數添加對權重的懲罰項。

4.2.主成分分析法(PCA)

from sklearn.decomposition import PCA
# 參數n_components爲主成分數目
PCA(n_components = 2).fit_transform(iris.data)

4.3.線性判別分析(LDA)

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
# 參數n_components爲降維後的維數
LDA(n_components = 2).fit_transform(iris.data,iris.target)

PCA和LDA有很多的相似點,其本質都是要將原始的樣本映射到維度更低的樣本空間中
但是PCA和LDA的映射目標不一樣:

  • PCA是爲了讓映射後的樣本具有最大的發散性
  • LDA是爲了讓映射後的樣本有最好的分類性能

因此,PCA是無監督的降維方法,而LDA是有監督的降維方法。

5.特徵衍生

從原始數據中構建新的特徵,也屬於特徵選擇的一種手段。特徵構建工作並不完全依賴於技術,它要求我們具備相關領域豐富的知識或者實踐經驗,基於業務,花時間去觀察和分析原始數據,思考問題的潛在形式和數據結構,從原始數據中找出一些具有物理意義的特徵。
還沒太懂,具體參考

5.1.特徵擴展

如:特徵離散化、One-hot

5.2.特徵組合

將兩個或多個特徵通過數學運算進行組合。

  • 數值運算:對特徵進行加,減,乘,除等。
  • 特徵交叉:對多個特徵進行交,並,補,笛卡爾積等。注意,暴力交叉可能產生稀疏問題。

再來一個示意圖

在這裏插入圖片描述

參考

https://www.zhihu.com/question/29316149
https://www.jianshu.com/p/7066558bd386
https://blog.csdn.net/sunyaowu315/article/details/95446244

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章