前言:之前的文章(高維數據中特徵篩選方法的思考總結——單變量分析篩選法)中,對單變量分析篩選變量進行了初步考量,本文將進一步總結多變量分析篩選法。由於本文多處摘錄網上的博客,只是進行了歸納整理,因此筆者將本文定性爲轉載類。
多變量分析方法根據建模特點可以分爲線性降維和非線性降維。線性降維主要是 LASSO 和 PLS。非線性降維包括:XGBoost(GBDT的高效實現)、Random Forest 等。其實個人感覺CNN應該也是可以進行非線性降維的(但是目前CNN處理“非序列數據”並沒有優勢,筆者有個預處理的設想,準備嘗試一下拓寬CNN的適用範圍)。另外SVM這種強大的機器學習方法,似乎只能用來建模而不能篩選特徵。
LASSO和PLS都是線性模型的降維方法,也就是說,這兩種方法甚至包括上述單變量降維的方法,最終篩選的變量都是爲了建立線性模型而準備的,而不能孵育出非線性模型(如存在交互作用的模型、複雜的SVM模型、決策樹類模型以及複雜的神經網絡模型)。非線性模型的生物學解釋性很差(黑箱模型),一般不推薦使用。但是若強行想構建非線性模型,則僅採用上述線性降維的方法是不夠理想的,需要採用非線性降維。
注意一個問題的存在:我們篩選特徵往往基於訓練數據(選擇超參數或者最終建模常常會根據交叉驗證,但是變量的篩選卻常常只是基於訓練集)。在訓練數據中,變量的貢獻程度越大,並不意味着這個變量越有價值。可能某些變量在模型中表現很普通,但是始終十分穩定(經得起考驗);而有些變量在訓練數據中表現很好,但外推性卻較弱,表現波動大。因此變量的選擇有必要綜合訓練數據和驗證數據(如綜合CV或Bootstrapping篩選變量)。最後再由獨立測試數據進行檢驗。
篩選特徵及建模的科學觀念:模型的可重複性(多批數據)>大樣本建模>模型的準確性。有人提出(貌似是範劍青老師等人提出),“針對一個統計方法,統計準確性、模型可解釋性和計算複雜性是衡量其好壞的三個重要指標。”
(下面部分內容參考自:
一些變量篩選方法——2、《An Introduction to Statistical Learning with R》上的數據降維方法
剛剛從線性與否的角度對降維方法進行了分類概述。另外,An Introduction to Statistical Learning with R 這本書中將篩選變量的方法分爲:子集選擇法(Subset Selection)、係數壓縮法(Shrinkage)、映射降維法(Dimension Reduction)。
子集選擇法
子集選擇法分爲最優子集選擇、逐步篩選法等,這部分方法依賴於下述模型評判指標:
- Mallows 提出運用Cp去評估一個以普通最小二乘法(Ordinary Least Square或OLS)爲假設的線性迴歸模型的優良性,從而用於模型選擇。
- 日本學者 Akaike 在1974年基於極大似然方法提出了AIC準則,它建立在熵的概念基礎上,可以權衡所估計模型的複雜度和此模型擬合數據的優良性。
- Schwarz 在Bayes方法的基礎上提出BIC準則。與AIC相比,BIC加強了懲罰力度,考慮了樣本量,從而在選擇變量進入模型上更加謹慎。
- Seymour Geisser 提出了交叉驗證法(Cross validation),利用交叉驗證結合最小平方誤差的方法,是一種在沒有任何前提假定的情況下直接進行參數估計的變量選擇方法。
此外,還可以使用Adjusted R2進行評價來選擇特徵子集。這些指標的具體含義和使用方法,可參照An Introduction to Statistical Learning with R 或 一些變量篩選方法——2、《An Introduction to Statistical Learning with R》上的數據降維方法。
最優子集法(Best Subset Selection):其思想是將所有的特徵組合都進行建模,然後選擇最優的模型(最優的判斷依據都是前面敘述的幾種指標)。特點是能夠找到全局最優但是計算量較大。
逐步篩選法(Stepwise Selection)分爲向前逐步迴歸與向後逐步迴歸。其主要思想是:每一次迭代都只能沿着上一次迭代的方向繼續進行。向前逐步迴歸是指初始模型只有常數項,然後逐漸添加變量;向後逐步迴歸是指初始模型包含了所有變量,然後逐漸刪除變量。特點是僅關注局部最優(貪心策略)難以保證全局最優(注:向前與向後逐步迴歸篩選出的變量可能不一樣,但其思想完全一樣。)
係數壓縮法
係數壓縮法主要指LASSO。嶺迴歸只能實現係數壓縮而不能降維,但是可以通過合理的調參,將係數壓縮後對係數進行排序,從而實現降維(但既然LASSO已經還不錯了,沒必要強行使用嶺迴歸降維)。
LASSO可參考博客:LASSO迴歸
映射降維法
映射降維法主要指的是PLS。另外,PCR(主元迴歸法)是進行主成分分析(PCA)後,選取前幾個主成分進行建模,但實際上建模的效果很一般;PLS是基於PCA的思想,結合迴歸建模、典型關聯分析(CCA)以及擬合殘差(帶一點Gradient Boost)等各家思想,所孕育出的一種建模分析和降維方法。
PLS可參考博客:偏最小二乘法 Partial Least Squares
其他不錯的方法
除了上述三大類方法,樹結構的方法以及Boosting類的方法也是比較有效的,如:Random Forest、XGBoost(GBDT的高效實現)等。此外,Fan和Li 結合L0與L1範數提出的SCAD (Smoothly Clipped Absolute Deviation);Fan 提出的SIS(Sure Independence Screening)等。
Random Forest
隨機森林模型本身是用於預測的模型,但在預測過程中,可以對變量重要性進行排序,然後通過這種排序來進行變量篩選。
變量重要性評判用Gini指數爲標準,針對一棵樹中的每個節點 k,我們都可以計算一個Gini指數:
其中表示樣本在節點 k 屬於任意一類的概率估計值。
一個節點的重要性由節點分裂前後Gini指數的變化量來確定:
和 分別表示 產生的子節點。針對森林中的每棵樹,都用上述的標準來遞歸產生,最終隨機抽取樣本和變量,產生森林,假設森林共產生 T 棵樹。
森林中,如果變量 在第 t 棵樹中出現 M 次,則變量 在第 t 棵樹的重要性爲:
則 在整個森林中的變量重要性爲:
最終我們根據變量重要性來選擇變量,選擇的個數可以用SIS中的方法,選取n−1 或n/logn 個。
XGBoost
GBDT的建模過程是,一步步擬合殘差,那麼在一步步的擬合的過程中,也便是變量選擇的過程(從一定程度上實現了變量的篩選)(這種逐步擬合殘差的思想的方法還有PLS)。XGBoost是GBDT的高效實現方法。
GBDT的介紹可參考:GBDT
XGBoost 的介紹可參考:XGBoost
SCAD
與嶺迴歸相比,SCAD降低了模型的預測方差,與此同時與LASSO相比,SCAD又縮小了參數估計的偏差,因而受到了廣泛的關注。L0方法只會進行變量篩選,不會進行壓縮,L1(LASSO)既會進行變量篩選,也會對係數繼續一定的調整。而SCAD可以從圖中很明顯的其結合了兩種方法,對係數較大的變量不進行懲罰,對係數較少的進行壓縮或者刪去,因此這種方法既可以篩選變量,也有着Oracle的性質。SCAD雖然有相應的迭代算法,但是由於其複雜度高,所以計算速度相對較慢。
SCAD的產生,有點借鑑Elastic Net。
SIS
當遇到超高維數據,即維數P無窮大時,上述的算法會出現問題。針對這類超高維問題,Fan等人提出了SIS的方法。
針對線性迴歸模型(2),按照SIS的思想,首先Y爲中心化向量,計算Y與每一個自變量 的相關係數,記爲
其中,若越大,說明與Y 相關性越強。所以,可以根據 的大小來進行變量選擇。對任意的,對 進行從大到小排序,然後取其一個子集
其中,n是樣本數, 是 的整數部分,進而保證了,與之對應的自變量則入選模型。如果覺得選擇 不便於確定,可以選擇 n-1 或n/logn。
而關於相關係數,可以選用自己認爲合適的。本文後面的模擬選用傳統的Pearson相關係數,以及近幾年比較火的可用於檢驗獨立的無參數假設的距離相關性(Distance Covariance)(見:一些變量篩選方法——3、部分其它變量篩選方法)。
嚴格來說,SIS 屬於單變量分析方法。
另外,SIS有一些衍生版本,如DC-SIS及Qa-SIS等,其中Qa-SIS好像是可以處理非線性問題的(據說還是“異方差”)。
PDAS
原始對偶激活集算法(Primal Dual Active Set,PDAS)是一個非常新的方法,但做的事情是最優子集選擇的事情。其主要思想是引入激活集,對所有的 β 進行批量迭代更新。這個方法的優勢在於,可以處理超高維數據(上萬維),而最優子集選擇一旦超過了50維,基本就完全沒辦法進行運算。後面我們也將採用PDAS來進行模擬。
PDAS的介紹可參考:一些變量篩選方法——3、部分其它變量篩選方法
另外,有人總結了7種降維方法(七種降維方法):
- 缺失值比率 (Missing Values Ratio) ;
- 低方差濾波 (Low Variance Filter) ;
- 高相關濾波 (High Correlation Filter);
- 隨機森林/組合樹 (Random Forests);
- 主成分分析 (PCA);
- 反向特徵消除 (Backward Feature Elimination);
- 前向特徵構造 (Forward Feature Construction)。
本文的總結其實基本上都包含了這些內容。
也有人總結了12種降維方法(在以上7種方法基礎上加了5種)(來源:Analytics Vidhya:The Ultimate Guide to 12 Dimensionality Reduction Techniques (with Python codes),也可參考:12種降維方法終極指南(含Python代碼)):
- 缺失值比率:如果數據集的缺失值太多,我們可以用這種方法減少變量數。
- 低方差濾波器:這個方法可以從數據集中識別和刪除常量變量,方差小的變量對目標變量影響不大,所以可以放心刪去。
- 高相關濾波器:具有高相關性的一對變量會增加數據集中的多重共線性,所以用這種方法刪去其中一個是有必要的。
- 隨機森林:這是最常用的降維方法之一,它會明確算出數據集中每個特徵的重要性。
- 向後特徵消除:耗時較久,計算成本也都很高,所以只適用於輸入變量較少的數據集。
- 前向特徵選擇:思路類似於“向後特徵消除”。
- 因子分析:這種方法適合數據集中存在高度相關的變量集的情況。
- 主成分分析(PCA):這是處理線性數據最廣泛使用的技術之一。
- 獨立分量分析(ICA):我們可以用ICA將數據轉換爲獨立的分量,使用更少的分量來描述數據。
- 基於投影的方法:ISOMAP適合非線性數據處理。
- t分佈式隨機鄰域嵌入(t-SNE):也適合非線性數據處理,相較上一種方法,這種方法的可視化更直接。
- UMAP:用於高維數據,與t-SNE相比,這種方法速度更快。
之後有空可以再總結下 t-SNE(無監督降維方法,主要用於高維度數據的降維可視化)。
另外,scikit-learn機器學習工具包的官網也有一些特徵篩選的方法介紹,有博客基於此進行了介紹(原文:http://dataunion.org/14072.html,但是好像原文訪問不了了,可以看看轉載的博客,比如:幾種常用的特徵選擇方法,或 乾貨:結合Scikit-learn介紹幾種常用的特徵選擇方法 )。
除了這些,還有一些方法也值得一試,如:隨機投影(Random Projections),非負矩陣分解(N0n-negative Matrix Factorization),自動編碼(Auto-encoders),卡方檢測與信息增益(Chi-square and information gain), 多維標定(Multidimensional Scaling), 相關性分析(Coorespondence Analysis),聚類(Clustering)以及貝葉斯模型(Bayesian Models)。
基於聚類的方法,可以參考:
還有互信息法、模擬退火法以及一些組合策略等,之後再瞭解一下。參考:
特徵選擇(2):特徵選擇:方差選擇法、卡方檢驗、互信息法、遞歸特徵消除、L1範數
特徵選擇的策略--數據相關性(皮爾遜係數)與gini或者信息熵的的結合
自編碼器也是不錯的無監督降維方法,是一種神經網絡,之後可以研究下。
各種方法的對比評測及代碼示例
這部分內容可以參考:
參考資料
一些變量篩選方法——2、《An Introduction to Statistical Learning with R》上的數據降維方法
The Ultimate Guide to 12 Dimensionality Reduction Techniques (with Python codes)
Comprehensive Guide on t-SNE algorithm with implementation in R & Python