樹模型的共線性問題
有一段時間沒有更新公眾號了。小編最近用決策樹比較多。今天打算更新一篇決策樹的文章。之前有個人和小編談到過決策樹,記得他說決策樹也需要考慮多重共線性的問題。就這個問題小編在本文也會給出自己的看法。當然了,本文的大部分內容來源於網路。
決策樹是一種非參數的監督學習演算法,既可以用於分類問題,也可以用於回歸問題,還經常被用於各種集成學習演算法(如隨機森林,xgboost,gbdt等)。決策樹模型非常簡單,它們是一種樹狀判斷的結構,可以用一些簡單 if-else-then 來表述。
雖然原理簡單,但決策樹可以變得很複雜。從下面這個圖可以看出,決策樹甚至可以用來擬合正弦曲線,樹越深,擬合結果越精細。
其中,ID3 演算法通過使用信息增益作為選擇分裂屬性的準則來構建多叉樹,但只支持分類型的屬性,並且容易選擇取值多的屬性分裂。
C4.5演算法是ID3演算法的改進版,使用信息增益率準則選擇分裂屬性,屬性可以是分類型,也可以是數值型的,同時還支持缺失值和剪枝處理。C4.5之後還有個C5.0,是個商用版,小編不太熟,這裡提一下,感興趣的同學可以研究一下。
CART演算法和C4.5也比較類似,但它的結構是二叉樹而非多叉樹,並且支持回歸問題。它使用的是Gini指數作為屬性的選擇準則,屬性也支持分類型,數值型,缺失值,支持剪枝。
python的sklearn庫實現的是改進的CART決策樹演算法(可以使用信息增益和gini做準則),但只接受數值型變數輸入。主要有兩個類,DecisionTreeClassifier 和 DecisionTreeRegressor。
DecisionTreeClassifier主要用於分類問題,訓練完成後可以用 export_graphviz 來可視化。除了二分類,還支持多分類,同學們遇到多分類問題時可以試試。
DecisionTreeRegressor用於回歸問題,比如前文中用來解決正弦函數回歸的問題。
決策樹演算法的優缺點
優點:
簡單易理解,具有很好的解釋性,能夠可視化。
無需過多的數據預處理操作。
訓練模型的演算法複雜度與數據集大小是log的關係。
支持分類型變數和數值型變數,不過sklearn只支持數值型的X。
屬於白盒模型,可以通過很簡單的布爾邏輯表述。
當對數據源的假設受到破壞時,也有比較好的效果。
缺點:
容易過擬合,可以通過剪枝來減輕,在sklearn里,可以調節最大深度max_depth,葉子節點數max_leaf_nodes,葉節點最小樣本數min_samples_leaf等參數。
不穩定,容易受干擾。
不是全局最優,而是啟發式演算法得到的局部最優。
難以學習複雜概念。
在正負樣本不均衡的情況下,決策樹偏差會很大。
下面我們來討論下決策樹的共線性問題,當小編聽說決策樹還需要考慮共線性的問題時,小編是表示懷疑的。
下面我們就用實際代碼,做個實驗來看看,到底決策樹需要不需要考慮共線性。
生成數據集
看下相關性:
x1和x2的相關性太強了有沒有?先看下不管共線性,建出的模型能有多差。
效果還好。那如果要考慮共線性,保留x1,刪除x2建模:
模型效果顯然很差。再看保留x2,刪除x1建模效果:
效果同樣不行。
小編得出的結論是,決策樹這類樹模型不同於邏輯回歸、線性回歸這類線性模型,它是一類無參數的模型,對屬性間的獨立性或相關性不做什麼假設,也就無需考慮什麼多重共線性啦。當然,這也是小編的一些個人觀點,如果大家有問題,歡迎一起討論。謝謝大家的支持~~
TAG:SAS中文論壇 |