決策樹(shù)理解與入門(mén)

原理

決策樹(shù)既可以解決分類(lèi)問(wèn)題,天然地可以解決多分類(lèi)問(wèn)題,也可以解決回歸問(wèn)題
如圖,當(dāng)我們建立好一棵樹(shù)之后,對(duì)于未知的數(shù)據(jù),我們就可以通過(guò)這樣的3次判斷來(lái)確定其分類(lèi)。


示意圖

那么最重要的問(wèn)題是:我們要如何進(jìn)行節(jié)點(diǎn)的選擇呢?
我們來(lái)看這樣一個(gè)判斷過(guò)程:


示例

對(duì)于每一個(gè)節(jié)點(diǎn),我們需要選擇哪一個(gè)維度,以及這個(gè)維度的劃分的分界點(diǎn)?
信息熵

我們引入信息熵的概率,你可能在信息論中學(xué)過(guò)這個(gè)知識(shí),
我們來(lái)簡(jiǎn)單認(rèn)識(shí)一下,其實(shí)和高中化學(xué)中的熵殊途同歸
信息熵代表隨機(jī)變量不確定度的度量,越小則表示數(shù)據(jù)不確定性越低
而我們做分類(lèi)問(wèn)題實(shí)際上就是確定他的分類(lèi),所以我們需要通過(guò)一次次判斷來(lái)降低其信息熵


信息熵計(jì)算公式

我們可以很容易的得出,若某一概率為1,則H為0,至于其他的概率為0的項(xiàng),通過(guò)微積分中最小項(xiàng)的知識(shí),我們?nèi)菀椎贸銎浣Y(jié)果為0,所以H為0達(dá)到最小
我們來(lái)看看二分類(lèi)中信息熵的函數(shù):


二分類(lèi)中信息熵函數(shù)
二分類(lèi)中信息熵函數(shù)曲線

這時(shí)候我們可以稍作思考,原來(lái)我們面臨的問(wèn)題是:“每個(gè)節(jié)點(diǎn)如何選擇維度?維度上哪個(gè)值進(jìn)行劃分?”現(xiàn)在問(wèn)題變成了:“我們可以通過(guò)劃分后信息熵能夠最大的降低判斷選擇的節(jié)點(diǎn)對(duì)不對(duì),恰不恰當(dāng)”
所以我們可以在每一個(gè)節(jié)點(diǎn)上一個(gè)個(gè)情況的試,最后選擇使得信息熵有效降低的那一組值。

代碼實(shí)現(xiàn)

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris= datasets.load_iris()
x=iris.data[:,2:]#保留后兩個(gè)特征
y=iris.target
def split(x,y,d,value):#d為維度,value為劃分值
    index_a=(x[:,d]<=value)
    index_b=(x[:,d]>value)
    return x[index_a],x[index_b],y[index_a],y[index_b]
from collections import Counter
from math import log
def entropy(y):
    counter=Counter(y)
    res=0.0
    for num in counter.values():
        p=num/len(y)
        res+=-p*log(p)
    return res
def try_split(x,y):
    best_intropy=float('inf')
    best_d,best_v=-1,-1
    for d in range(x.shape[1]):#遍歷每一列
        sort_index=np.argsort(x[:,d])#第d列排序
        for i in range(1,len(x)):
            if x[sort_index[i-1],d]!=x[sort_index[i],d]:#相等時(shí)是區(qū)分不開(kāi)的
                v=(x[sort_index[i-1],d]+x[sort_index[i],d])/2#作為備選value值
                x_l,x_r,y_l,y_r=split(x,y,d,v)
                e=entropy(y_l)+entropy(y_r)
                if e<best_intropy:
                    best_intropy,best_d,best_v=e,d,v
    return best_intropy,best_d,best_v
```
我們進(jìn)行第一次判斷
```
best_entropy,best_d,best_v= try_split(x,y)
x1_l,x1_r,y1_l,y1_r= split(x,y,best_d,best_v)
```
我們來(lái)看這時(shí)候左邊的熵和右邊的熵
![信息熵1](https://upload-images.jianshu.io/upload_images/19479038-a7dc68398b05b47a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可見(jiàn)左邊已經(jīng)劃分完畢了,我們對(duì)右邊繼續(xù)劃分
```
best_entropy2,best_d2,best_v2=try_split(x1_r,y1_r)
x2_l,x2_r,y2_l,y2_r= split(x1_r,y1_r,best_d2,best_v2)
```
![信息熵2](https://upload-images.jianshu.io/upload_images/19479038-7dc340e392139609.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可見(jiàn)右邊信息熵也一定程度的下降,實(shí)際上我們可以一直換分下去,直至信息熵足夠低
我們使用sklearn中的決策樹(shù)進(jìn)行查看
```
from sklearn.tree import DecisionTreeClassifier
dt_clf=DecisionTreeClassifier(max_depth=2,criterion="entropy")#entropy是信息熵方式
dt_clf.fit(x,y)
dt_clf.score(x,y)
```
![sklearn的結(jié)果](https://upload-images.jianshu.io/upload_images/19479038-ab94532720e64f04.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#####基尼系數(shù)
除了前面提到的信息熵,我們還可以采用基尼系數(shù)作為判據(jù)
![基尼系數(shù)公式](https://upload-images.jianshu.io/upload_images/19479038-06e936391552d232.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![二分類(lèi)中的基尼系數(shù)函數(shù)](https://upload-images.jianshu.io/upload_images/19479038-6d55da7d010e8666.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
對(duì)于相應(yīng)實(shí)現(xiàn),我們只需要將entropy函數(shù)改成基尼系數(shù)相應(yīng)的函數(shù)就可以了
需要注意的是,sklearn中默認(rèn)使用基尼系數(shù)而不是信息熵

#####CART
CART:根據(jù)某一個(gè)維度d和某一個(gè)閾值v進(jìn)行劃分
也就是我們前面構(gòu)建的方式,同時(shí)sklearn也是使用這種方式實(shí)現(xiàn)決策樹(shù)的
還有ID3,C4.5,C5.0等方式
現(xiàn)在我們來(lái)看看sklearn中決策樹(shù)模型的一些參數(shù)
max_depth決策樹(shù)深度
min_samples_split拆分需要的最少的數(shù)據(jù),少于這個(gè)值便不再拆分了,防止過(guò)擬合
min_samples_leaf對(duì)于一個(gè)結(jié)點(diǎn)最少需要的數(shù)據(jù),也就是最后分類(lèi)停下來(lái)的條件
max_leaf_nodes最對(duì)有的結(jié)點(diǎn)數(shù)
###決策樹(shù)解決回歸問(wèn)題
sklearn中有相應(yīng)的函數(shù)如下:
```
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
boston= datasets.load_boston()
x=boston.data
y=boston.target
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=666)
#實(shí)際上這里size默認(rèn)是0.2
from sklearn.tree import DecisionTreeRegressor
dt_reg=DecisionTreeRegressor()
dt_reg.fit(x_train,y_train)
dt_reg.score(x_test,y_test)
```
###總結(jié)
本文僅是作為決策樹(shù)知識(shí)的入門(mén),了解了基本的原理之后還有不少需要補(bǔ)充的知識(shí),后續(xù)還會(huì)再補(bǔ)上!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ??決策樹(shù)(Decision Tree)是一種基本的分類(lèi)與回歸方法,其模型呈樹(shù)狀結(jié)構(gòu),在分類(lèi)問(wèn)題中,表示基于特征對(duì)...
    殉道者之花火閱讀 4,930評(píng)論 2 2
  • 決策樹(shù)理論在決策樹(shù)理論中,有這樣一句話,“用較少的東西,照樣可以做很好的事情。越是小的決策樹(shù),越優(yōu)于大的決策樹(shù)”。...
    制杖灶灶閱讀 6,065評(píng)論 0 25
  • 一. 決策樹(shù)(decision tree):是一種基本的分類(lèi)與回歸方法,此處主要討論分類(lèi)的決策樹(shù)。在分類(lèi)問(wèn)題中,表...
    YCzhao閱讀 2,303評(píng)論 0 2
  • 一、決策樹(shù)應(yīng)用體驗(yàn) 分類(lèi) ??從上面可以看出,決策樹(shù)對(duì)分類(lèi)具有線性回歸無(wú)可比擬的優(yōu)勢(shì), 如果對(duì)未參與訓(xùn)練的數(shù)據(jù)集是...
    楊強(qiáng)AT南京閱讀 1,335評(píng)論 1 3
  • 1 前言 在了解樹(shù)模型之前,自然想到樹(shù)模型和線性模型,他們有什么區(qū)別呢? 樹(shù)形模型是一個(gè)一個(gè)特征進(jìn)行處理,之前線性...
    高永峰_GYF閱讀 1,505評(píng)論 0 1

友情鏈接更多精彩內(nèi)容