決策樹--CART樹詳解


1.CART簡介

CART是一棵二叉樹,每一次分裂會產生兩個子節點。CART樹分為分類樹和回歸樹。

分類樹主要針對目標標量為分類變量,比如預測一個動物是否是哺乳動物。

回歸樹針對目標變量為連續值的情況,比如預測一個動物的年齡。

如果是分類樹,將選擇能夠最小化分裂后節點GINI值的分裂屬性;

如果是回歸樹,選擇能夠最小化兩個節點樣本方差的分裂屬性。CART跟其他決策樹算法一樣,需要進行剪枝,才能防止算法過擬合從而保證算法的泛化性能。

2.CART分類樹

2.1算法詳解

CART分類樹預測分類離散型數據,采用基尼指數選擇最優特征,同時決定該特征的最優二值切分點。分類過程中,假設有K個類,樣本點屬於第k個類的概率為Pk,則概率分布的基尼指數定義為

根據基尼指數定義,可以得到樣本集合D的基尼指數,其中Ck表示數據集D中屬於第k類的樣本子集。

如果數據集D根據特征A在某一取值a上進行分割,得到D1,D2兩部分后,那么在特征A下集合D的基尼系數如下所示。其中基尼系數Gini(D)表示集合D的不確定性,基尼系數Gini(D,A)表示A=a分割后集合D的不確定性。基尼指數越大,樣本集合的不確定性越大。

對於屬性A,分別計算任意屬性值將數據集划分為兩部分之后的Gain_Gini,選取其中的最小值,作為屬性A得到的最優二分方案。然后對於訓練集S,計算所有屬性的最優二分方案,選取其中的最小值,作為樣本及S的最優二分方案。

2.1實例詳解

針對上述離散型數據,按照體溫為恆溫和非恆溫進行划分。其中恆溫時包括哺乳類5個、鳥類2個,非恆溫時包括爬行類3個、魚類3個、兩棲類2個,如下所示我們計算D1,D2的基尼指數。

然后計算得到特征體溫下數據集的Gini指數,最后我們選擇Gain_Gini最小的特征和相應的划分。



3.CART回歸樹

3.1算法詳解

CART回歸樹預測回歸連續型數據,假設X與Y分別是輸入和輸出變量,並且Y是連續變量。在訓練數據集所在的輸入空間中,遞歸的將每個區域划分為兩個子區域並決定每個子區域上的輸出值,構建二叉決策樹。

 

 

選擇最優切分變量j與切分點s:遍歷變量j,對規定的切分變量j掃描切分點s,選擇使下式得到最小值時的(j,s)對。其中Rm是被划分的輸入空間,cm是空間Rm對應的固定輸出值。

 

 用選定的(j,s)對,划分區域並決定相應的輸出值

 

 繼續對兩個子區域調用上述步驟,將輸入空間划分為M個區域R1,R2,…,Rm,生成決策樹。

 

 當輸入空間划分確定時,可以用平方誤差來表示回歸樹對於訓練數據的預測方法,用平方誤差最小的准則求解每個單元上的最優輸出值。

 

3.2實例詳解

 

 


考慮如上所示的連續性變量,根據給定的數據點,考慮1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5切分點。

對各切分點依次求出R1,R2,c1,c2及m(s),例如當切分點s=1.5時,得到R1={1},R2={2,3,4,5,6,7,8,9,10},其中c1,c2,m(s)如下所示。


依次改變(j,s)對,可以得到s及m(s)的計算結果,如下表所示。

當x=6.5時,此時R1={1,2,3,4,5,6},R2={7,8,9,10},c1=6.24,c2=8.9。回歸樹T1(x)為

然后我們利用f1(x)擬合訓練數據的殘差,如下表所示

用f1(x)擬合訓練數據得到平方誤差

第二步求T2(x)與求T1(x)方法相同,只是擬合的數據是上表的殘差。可以得到

用f2(x)擬合訓練數據的平方誤差

繼續求得T3(x)、T4(x)、T5(x)、T6(x),如下所示

用f6(x)擬合訓練數據的平方損失誤差如下所示,假設此時已經滿足誤差要求,那么f(x)=f6(x)便是所求的回歸樹。

4.CART剪枝

代價復雜度剪枝算法:

我們將一顆充分生長的樹稱為T0 ,希望減少樹的大小來防止過擬化。但同時去掉一些節點后預測的誤差可能會增大,那么如何達到這兩個變量之間的平衡則是問題的關鍵。因此我們用一個變量α 來平衡,定義損失函數如下

  • T為任意子樹,|T|為子樹T的葉子節點個數。
  • α是參數,權衡擬合程度與樹的復雜度。
  • C(T)為預測誤差,可以是平方誤差也可以是基尼指數,C(T)衡量訓練數據的擬合程度。

那么我們如何找到這個合適的α來使擬合程度與復雜度之間達到最好的平衡呢?准確的方法就是將α從0取到正無窮,對於每一個固定的α,我們都可以找到使得Cα(T)最小的最優子樹T(α)。

  • 當α很小的時候,T0 是這樣的最優子樹.
  • 當α很大的時候,單獨一個根節點就是最優子樹。

盡管α的取值無限多,但是T0的子樹是有限個。Tn是最后剩下的根結點,子樹生成是根據前一個子樹Ti,剪掉某個內部節點后,生成Ti+1。然后對這樣的子樹序列分別用測試集進行交叉驗證,找到最優的那個子樹作為我們的決策樹。子樹序列如下

因此CART剪枝分為兩部分,分別是生成子樹序列和交叉驗證。

5.sklearn

import pandas as pd
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) #返回預測的准確度accuracy

score

feature_name = ['酒精','蘋果酸','','灰的鹼性','','總酚','類黃酮','非黃烷類酚類','花青素','顏色強度','色調','od280/od315稀釋葡萄酒','脯氨酸']

import graphviz
dot_data = tree.export_graphviz(clf, out_file=".\Tree.dot"
                                ,feature_names = feature_name
                                ,class_names=["琴酒","雪莉","貝爾摩德"]
                                ,filled=True
                                ,rounded=True
                               ) 

 

import re
# 打開 dot_data.dot,修改 fontname="支持的中文字體"
f = open("./Tree.dot", "r+", encoding="utf-8")
open('./Tree_utf8.dot', 'w', encoding="utf-8").write(re.sub(r'fontname=helvetica', 'fontname="Microsoft YaHei"', f.read()))
f.close()

cmd:

dot -Tjpg Tree.dot -o tree.jpg

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM