特征工程 - 机器学习
特征工程
特征 => 數據中抽取出來的對結果預測有用的信息。
特征工程 => 使用專業背景知識和技巧處理數據,使得特征能在機器學習算法上發揮更好的作用的過程。
更好的特征意味著
- 更強的靈活度
- 可用更簡單的模型
- 更好的結果
本文介紹一些簡單的特征工程方法以及特征選擇和特征降維的方法。
范圍調整, 歸一化
# X是numpy數組(矩陣或向量) # min max min_max_scaler = sklearn.preprocessing.MinMaxScaler() X_minmax = min_max_scaler.fit_transform(X) # 0均值,單位方差 X_scaled = sklearn.preprocessing.scale(X) #X_scaled.mean(axis=0);X_scaled.std(axis=0)scaler = sklearn.preprocessing.StandardScaler().fit(X) scaler.transform(X2)統計
# 創造數據 series = pandas.Series(np,random.randn(500)) # 統計描述,參數為百分比點 series.describe(percentiles=[.05, .25, .75, .95])離散化
pandas的cut和qcut函數可以將一個序列離散到幾個區間中.
特征處理-類別型
- one-hot編碼/啞變量
將多種類別進行編碼時每個類別用一個長度為類別數的01序列表示,將類別對應的位置置1,其它位置置0,別名是啞變量.這是sklearn的標簽值的存儲方式,pandas的get_dummies也可以得到此編碼,特征表示由一列變為多列.
- Histogram映射
若輸入X中包含性別這一特征,目標y為興趣愛好.則可以通過統計每一性別在愛好上的分布作為一個特征來表征每種性別.如男性:[1/4(散步),1/2(看電視),1/4(其它)];再比如每一年齡中各興趣的分布.
特征處理-文本型
- 詞袋bag of words
文本數據預處理后,去掉停用詞,剩下的詞組成的list,在詞庫中的映射稀疏向量.通俗講,就是矩陣的每行是對應的一篇文檔的各個詞或詞組的詞頻.
Python處理可以使用sklearn.feature_extraction.text.CountVectorizer,以壓縮的稀疏矩陣形式存儲.支持n-gram,即多個連續詞組成的詞組.需設置參數ngram_range,token_pattern.
- word2vec
兩個單詞之間建立一個向量,具有距離的概念.
工具: Google word2vec
特征選擇
如果存在冗余特征或某些特征對結果會有負影響(噪聲),則可以進行特征選擇.與降維不同,降維做的是特征的計算組合構建新的特征.
- 過濾型 (單個特征與結果的相關度)
- 包裹型(遞歸特征刪除)
- 嵌入型(基于L1正則化)
過濾型
篩選器: 評估單個特征和結果值之間的相關程度,排序留下Top相關的特征部分。
相關度: Pearson相關系數,互信息,距離相關度.
缺點: 沒有考慮到特征之間的關聯作用,可能把有用的關聯特征誤踢掉。
相關的python包(sklearn中)有SelectKBest,SelectPercentile,GenericUnivariateSelect.
對于兩個變量,可以用皮爾遜相關系數(Pearson correlation coefficient)計算相關性.代碼可用scipy.stat.pearsonr([1,2,3],[1,2,3.2])來計算Cor(X1,X2)。對于每組特征,如果相關性較高,可以認為存在冗余的特征,保留其中一個。
缺點:只能檢測出線性關系,無法檢測其它關系(如二次函數關系)。
香農信息熵:
\[H(X)=-\sum_{i=1}^n p(X_i)log_2 p(X_i)\]
對于兩個相關聯的特征X、Y,若P(X)=0.1,P(Y)=0.9,則可用scipy.stats.entropy([0.1,0.9],base=2)來計算,其中基數為2是log函數的基數,也可以換成10、e等對結果的判斷影響不大。下面擴展上述公式使之適用于多特征。
互信息量定義:
\[I(X;Y)=\sum_{i=1}^m \sum_{j=1}^n P(X_i,Y_j)log_2 \frac{P(X_i,Y_j)}{P(X_i)P(Y_j)}\]
歸一化(使結果限定在[0,1]區間),需要將其除以每個獨立變量的信息熵之和:
\[NI(X;Y)=\frac{I(X;Y)}{H(X)H(Y)}\]
缺點:計算每對特征之間的歸一化互信息量時的計算量比較大,扔掉了獨立使用時沒有用處的特征。但實際情況往往是,一些特征看起來跟目標變量完全獨立,但當它們組合在一起時就有效用了。要保留這些特征,我們需要包裹型封裝器。
包裹型
把特征選擇看做一個特征子集搜索問題,篩選各種特征子集,用模型評估效果。
典型的包裹型算法為遞歸特征消除法(Recursive Feature Elimination, RFE), 它只選取具有最大絕對權重的特征.
流程:
Python包sklearn.feature_selection中含有各種優秀的封裝器類.代表性的有RFE,它會把一個估算器和預期數量的特征當做參數,然后只要發現一個足夠小的特征子集,就在這個特征集合里訓練估算器。另外還有RFECV在交叉驗證循環中執行RFE來找最優的特征數量。
from sklearn.feature_selection import RFE max_features = 4 rfe = RFE(model, max_features).fit(X,Y) # 這里的model可選擇sklearn的大多數模型,如LinearRegression. # 而KNeighborsRegressor由于不支持特征加權,所以不能用RFE mask = rfe.support_ # 布爾值列表,被選擇的特征對應True另外常用的特征選擇方法有: 迭代選擇(前向選擇與后向排除法).
前向選擇是從沒有特征開始,逐步尋找最好的特征進行添加. 第一次迭代,僅使用一個特征, 遍歷N個特征,從中選擇出具有最佳交叉驗證準確率的特征. 第二次迭代,從剩余的N-1個特征中選擇一個與已確定的特征組合,選擇最佳. 而每次交叉驗證需要構建k個模型, 因此總共會構建 k[N+(N-1)+...+1] 個模型.
后向排除法(反向消除)是從所有特征中逐個進行刪除, 計算量與前向相同.
迭代選擇相比全局搜索計算復雜度低很多,但是當特征數量較大時,計算量仍然較大.
嵌入型
根據模型來分析特征的重要性(通過分析產生的模型權重等)。常見的方式為用正則化方式來做特征選擇。
基于L1的特征選擇:
使用L1正則的線性模型在訓練之后許多系數會是0,因此可以從這個模型中選擇非0的系數.sklearn中的feature_selection.SelectFromModel可以達到此目的.這里可以使用的模型包括linear_model.Lasso,LogisticRegression(回歸),svm.LinearSVC(分類).
模型內置特征選擇方法: 某些模型,如線性回歸、邏輯回歸(特征加權)、決策樹(特征重要度)、集成方法(隨機森林每棵樹采用子特征)。這些特征選擇方法相比通用的方法計算更有效率,可以捕獲特征被隨機噪聲替代后的模型準確度下降程度。
特征降維
特征降維與核函數的作用正好相反。核函數主要的工作是增加維度,把原本在低維度里的樣本,映射到更高的維度里,將本來不可以線性分類的點,變成可以線性分類的。
- 特征抽取法
將原始特征空間轉換為一個低維特征空間,方法:- 主成分分析(Principal Component Analysis,PCA) (線性)
- 線性判別式分析(Linear Discriminant Analysis,LDA)
- 多維標度法(MultiDimentsional Scaling,MDS) (非線性)
刪減特征的意義
轉載于:https://www.cnblogs.com/makefile/p/feature-engine.html
總結
以上是生活随笔為你收集整理的特征工程 - 机器学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初学总结--------Java修饰符与
- 下一篇: 网易对象存储NOS图床神器