決策樹是一種非參的監督性機器學習方法。它可以用來做分類判斷和回歸預測。決策樹的基本原理是通過學習現有數據的特徵,得到簡單的決策規律,再根據這些決策規律對目標進行判斷。
一、決策樹的概念
決策樹是在已知各種情況發生概率的基礎上,通過構成決策樹來判斷下一預測點,判斷其是否會發生的分析方法,是直觀運用概率分析的一種圖解法。由於這種決策樹分支的圖形很像樹的枝幹,故稱決策樹。下面是一個決策樹的例子:
在上面例子中我們需要對新的兔子進行判斷,根據這一問題建立一棵決策樹,上圖也展示了決策樹的組成部分:根節點,分支和葉子。首先上述決策樹的根節點是「毛色」,在這一基礎上延伸出兩個分支「黑褐色」和「白色」,倘若為黑褐色,進入葉子得到結論這是一隻「中國白兔;倘若為「白色」則進入下一個節點判斷,一直到沒有節點的葉子為止。對於一隻40釐米的白色成年兔子,首先判斷其毛色為白色,進入長度節點,然後長度大於30cm,基於此我們可判斷這隻成年兔子為紐西蘭兔。
決策樹本質上是基於過去的特徵信息對過去目標結論的判斷的總結,運用於金融預測領域直觀的解釋就是:由於這件事在過去相同特徵的環境下大概率發生,所以此時這件事也很可能會發生,及「歷史總是驚人的相似」。決策樹在機器學習領域的應用在於可以把人從浩如煙海的數據中解放出來,讓計算機去尋找數據之間的內在規律用於下一步研究,也可以直接使用決策樹的結論進行判斷,但不需要可視化的情況下目前更多的會去選擇Randomforest,Boosting等決策樹的改進。決策樹基於的假設較少,適用於大部分情況。
但其缺點也很明顯:
1、精度較低
2、他每次只會根據單一特徵劃分數據,不會根據數據組合切分。如下圖, 他只會根據年齡或經驗區分數據,但當兩者有聯繫時,決策樹只會用多次切分擬合這一情況。
3、受誤差值影響較大
二、決策樹的生成過程
了解了決策樹的原理,那如何根據問題生成決策樹呢?我們知道決策樹是由根節點,分叉,葉組成的,決策樹的生成就是尋找根節點、節點和如何生成分叉了。決策樹生成的核心思想就是找出更加純淨的子集,最好每個子集裡都是結論極其單一的數據。判斷純度的方法不同決策樹的生成也不同,常用的判斷方法有:
1、ID3算法使用信息增益作純度判斷;
2、C4.5算法使用信息增益率作純度判斷;
3、CART算法使用基尼係數作純度判斷。
決策樹生成過程:
1、尋找最適合分割的特徵
2、根據純度判斷方法,尋找最優的分割點,基於這一特徵把數據分割成純度更高的兩部分數據
3、判斷是否達到要求,若未達到,重複步驟一繼續分割,直到達到要求停止為止。
4、剪枝,防止過擬合。
純度判斷和過擬合的具體做法在下面兩部分講到
數據純淨度的判別
決策樹生成時,我們希望每個分支的數據儘量屬於同一類別,也就是尋找純淨的分類,判斷數據純淨程度的方法也決定了我們如何生成分支,目前主流的方法包括ID3,C4.5和CART三種。
在介紹這三種方法之前先簡單介紹信息熵:
信息熵:
熵是衡量系統混亂程度的一個指標,熵值越大表示對應的系統越混亂,決策樹中引入信息熵的概念來衡量數據的純淨程度。假定目標集合S中有n種樣本,第k種樣本所佔比例為pk(k=1,2,3,…,n),則S的信息熵為:
ID3算法:
ID3算法用信息增益來衡量混亂程度
信息增益:
Gain(k)=分裂前目標變量的信息熵-對特徵值k分裂後的目標變量信息熵
若總數據量為D,分裂後數據成為有M個葉節點的分叉樹,那麼Gain(k)為
分叉點的選擇:遍歷全部現有可能分叉點,選擇信息增益最大的分叉點建立新的分叉。
停止分裂的條件:
1,節點中全部樣本的目標變量同屬於一個類別
2,如果分叉後的樣本數目小於給定的閥值,也停止進行分叉。
葉節點的屬性:選擇葉節點裡數量最多的類別作為葉節點的類別
C4.5算法用信息增益率來衡量混亂程度
信息增益率: Gain_ratio(k)=信息增益率/被選分叉點本來的熵
其中,
Ent(Dk)和Ent(S)的區別是:一個計算的是總集合S的熵,一個計算的是總集合S中節點k的熵。
分叉點的選擇:遍歷全部現有可能分叉點,選擇信息增益率最大的分叉點建立新的分叉。
停止分裂的條件:
1 節點中全部樣本的目標變量同屬於一個類別
2 如果分叉後的樣本數目小於給定的閥值,也停止進行分叉。
葉節點的屬性:選擇葉節點裡數量最多的類別作為葉節點的類別
特徵:比起ID3算法來,C4.5更傾向於選擇區直更少的特徵值分叉。
CART算法用基尼指數來衡量數據集混亂程度
基尼值:
基尼值(S)指的是從數據S中隨機取兩個不同類別值的概率,因此Gini值越大意味著數據越混亂。
若總數據量為D,分裂後數據成為有M個葉節點的分叉樹,那麼Gini_index(k)為
基尼指數:
分叉點的選擇:遍歷全部現有可能分叉點,選擇基尼指數最小的分叉點建立新的分叉。
停止分裂的條件:
1,決策樹到達最大深度
2,分叉節點的樣本數小於閥值
3,分叉的葉內的樣本數小於閥值
葉節點的屬性:選擇葉節點裡數量最多的類別作為葉節點的類別
過擬合處理
在決策樹學習過程中,因為隨著子集樣本越小,混亂程度必然下降,這意味著決策樹分叉總是向著過擬合的方向。為了降低過擬合風險,需要主動去除一些分類效果不明顯的分叉來防止過擬合,這一過程被稱為剪枝。
剪枝主要有兩種方法:預剪枝和後剪枝
預剪枝:
預剪枝是在生成決策樹過程中,對節點劃分先進性預估,若節點分叉不能使決策樹得到泛化提升,則停止分叉生成葉。代表算法是悲觀錯誤剪枝法PEP(Pesimistic-Error Pruning)
後剪枝:
後剪枝是生成一顆完整的決策樹後,自下而上對每個葉片和節點進行評估,若減少分叉可以使決策樹得到泛化提升,則轉化分叉為一個葉。代表算法有錯誤率降低剪枝REP(Reduced-Error Pruning),代價複雜度剪枝CCP(Cost-Complexity Pruning)
三、決策樹的Python代碼實現
決策樹在實際中一般有兩個用處:
1、直接用於預測。
2、藉助決策樹的實現圖形尋找規律。
第一種很好理解,和大多數模型一樣,建立模型預測。
第二種的實現是基於決策樹的原理與人類思考接近。決策樹的實現過程本來就是純化子集的過程,生成決策樹後,他的每一個葉子都應該是比較純淨的,及它可以找到在某些特徵條件下結論較為一致的情境。研究者可以根據決策樹找到的一些純淨度比較高的情境,省去大量找規律的時間。
1、學習
首先我們使用機器學習庫sklearn中的數據來介紹決策樹的主要功能。
首先導入必要的包和數據,在這我們以預測第111個數據作為例子
查看用作例子的數據的各個特徵值,將其特徵值帶入建立好的決策樹預測,可以看到結果與真實值相同。
predict_proba可以用來觀察決策樹判斷的依據。決策樹的結論是: 這一數據屬於0,1,2的概率分別為0,0.22,0.978,選取最大概率,這一數據被認為屬於第2類。
featureimpertances可以用來查看各個因子的重要性。顯示因子4重要性佔所有因子的100%,整個決策樹完全依賴於因子4。
畫出決策樹,有兩個節點3片葉子,葉子的純度都比較高,都大於90%。
2、實驗
接下來舉個簡單的例子展示決策樹在實際股市分析預測中的運用。
已下是一個使用決策樹預測HS300漲跌測試函數,用市場平均的:
PCF,turnover_ratio,PE_rate,PB_rate,PS_rate,
以及宏觀數據:
pmi,pmi_rate,leading_idx_rate,M1_rate,M2_rate,CPI_rate,GDP_rate,LOAN6MONTH,LARGEFINANCIAL,SMALLFINANCIAL,dcg,URUR
這些數據使用決策樹算法對HS300的漲跌進行預測,預測結果有四種,分別是:『下跌大於5%』,『下跌介於5%與0%之間』,『上漲介於0%和5%』,『上漲大於5%』,。數據取了2005年5月到2017年11月的全部月數據,以其中70%做訓練,以30%數據做測試,所有宏觀數據都根據發布時間取了滯後兩個月或者一個季度的數據來做預測,以確保實際中可以取到這些值。
以上是決策樹建立的代碼,我們用CART的方法用『gini值』確定葉數據純度,並要求節點最少應該有10個數據,每片葉最少有5個數據。
決策樹模型的主要參數有:
criterion: 決定判斷節點純度的方法。目前sklearn支持」gini」和」entropy」兩種,分別對應用基尼指數和信息增益的CART和ID3兩種算法,默認算法是「gini」。
max_depth: 最大樹深度,達到最大數深度即停止分叉,最常用的約束,默認值為None
spliter: 決定如何分叉每個節點。目前sklearn支持「best」和「random」兩種,指的是選取特徵的最優分叉點分叉還是隨機分叉點分叉,默認值是「best」
max_features: 使用特徵值的最大數量,默認為None
max_leaf_nodes: 葉節點的數量,默認值為None
min_impurity_split: 最小純度門檻,假如純度小於最小純度,則會繼續切分,默認值為None
min_samples_leaf: 最小葉數據,達到則不再分叉,默認值為1
min_samples_split: 最小節點數據,達到則不再分叉,默認值是2
決策樹的參數一般依情況而定,可以根據需要不斷調整。也可以用sklearn的包GridSearchCV用cross validation的方法暴力遍歷指定範圍參數確定結果。調參在其他機器學習方法如神經網絡模型中也是核心問題,一般是使用者的經驗加計算機嘗試不同的值得到一個相對較好的結果。對於決策樹,初學者一般限定樹深度即可,其他設置可使用默認參數。
接下來即可使用決策樹進行預測
上述代碼即可使用計算機自動生成的決策樹圖解,其葉片都是比較純淨的子集,可以幫助研究者篩選規律。
以上是決策樹的整個圖解,挖掘到了一些特徵,例如最右邊的葉表示當市場平均的'PB_rate'<=-0.01, 『PS_rate』<=0.05時,歷史上6次這種情況下HS300都發生大跌。
這是取2005年5月到2017年11月全部數據後,取70%做訓練集,30%做測試驗證結果,得到的精度統計,表格如下所示:
精度很差,只是略高於一半而已。簡單的決策樹過於基礎,識別能力有限,用於預測股市顯然很一般。
不過決策樹是很多機器學習方法的基石,其改進模型往往會有較好表現。此外決策樹便於可視化,他的產生的分布圖可以用於數據研究,例如決策樹的每一片頁都是相對比較純淨的數據集,使用者可以抽出一些純度比較高的葉來研究為何在訓練集中這些葉上的數據集純度較高,從而發現新規律。
四、補充和擴展
寫在最後:
決策樹由於理論簡單,易於理解,在數據可視化,利用計算機尋找數據規律中有不小的作用。但其模型過於簡單,對於複雜的模型一般來說只是優於線性模型而已,對比其他算法並沒有太大優勢,其簡單的結構也不能充分利用目前強大的計算機計算能力,已經不怎麼活躍了。但是作為極易可視化,邏輯清晰的一種白盒算法,其不僅活躍於數據研究,而且也是其他高級算法的基石。決策樹的兩個主要改進方向是Randomforest 和 boosting,都在機器學習中有舉足輕重的地位。
- 聚寬精選 -
【量化課堂】隨機森林入門
商品期貨策略——BOLL信帶突破策略
商品期貨策略——海龜交易法
【聚寬精選】持續更新,敬請期待
長按二維碼,關注聚寬精選