數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。
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.無量綱化方法
- 標準化:轉換成標準正態分佈
from sklearn.preprocessing import StandardScaler
- 區間縮放法:
如:
from sklearn.preprocessing import MinMaxScaler
2.2.歸一化
依照特徵矩陣的行處理數據。
目的:將樣本向量轉化爲單位向量。使樣本向量在點乘運算或其他核函數計算相似性時,擁有統一的標準。
標準化是依照特徵矩陣的列處理數據,其通過z-score的方法,將樣本的特徵值轉換到同一量綱下。
規則爲L2的歸一化公式如下:
from sklearn.preprocessing import Normalizer
2.3.定性特徵One-hot/啞編碼
from sklearn.preprocessing import OneHotEncoder
其實One-hot和啞編碼是有區別的(詳見博文)。啞編碼就是去除了One-hot的冗餘變量。
2.4.定量特徵二值化
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的樣本頻數的觀察值與期望的差距,構建統計量:
from sklearn.feature_selection import SelectKBest, chi2
#參數k爲選擇的特徵個數
X_new = SelectKBest(chi2, k = 20).fit_transform(X, y)
3.1.4.互信息法
利用相關性。
- 評價定性自變量對定性因變量的相關性。
- 定量數據:最大信息係數法。
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