一文搞懂决策树原理
背景
- 參加了NUS人工智能的遠(yuǎn)程夏令營(yíng),老師一個(gè)小時(shí)講完決策樹,講的我頭暈?zāi)X脹,寫篇博客來(lái)總結(jié)一下。
前序知識(shí)
- 了解各種“學(xué)習(xí)”的類型。
- 如監(jiān)督學(xué)習(xí),非監(jiān)督學(xué)習(xí)等。
- 對(duì)概率知識(shí)有基本了解。
- 了解貝葉斯定理等(我下面也會(huì)解釋)。
- 基本的英語(yǔ)知識(shí)
- 有過算法或者編程相關(guān)的課程學(xué)習(xí)經(jīng)驗(yàn)。
先來(lái)看個(gè)案例: 案例1 是否打網(wǎng)球
- 這里有一個(gè)表格,記錄某個(gè)人在某些天氣情況下打不打網(wǎng)球。
- Outlook: 天氣,temp:溫度,Humidity:濕度,overcast: 陰天
- 從直覺來(lái)看,我們最希望找到一些很有用的數(shù)據(jù)來(lái)確定在某種情況下他一定會(huì)play tennis.
- 我們發(fā)現(xiàn)陰天的時(shí)候他一定會(huì)去打網(wǎng)球(雖然樣本比較小),但是它們即暗示著強(qiáng)烈的相關(guān)。
- 把這些相關(guān)的總結(jié)起來(lái),我們可以畫出一張這樣的樹圖。
- 這就是決策樹的基本概念。
- 補(bǔ)充:你可能會(huì)問,如果濕度給的是一個(gè)確定的數(shù)值該怎么辦呢?但其實(shí)所有的數(shù)值都可以轉(zhuǎn)換成一個(gè)二元變量,例如說濕度小于75%則為Normal,大于75%則為High。
案例2: 翻譯問題
- 這里有一個(gè)單詞run需要你翻譯,但是它有四個(gè)意思,分別是
- 跑得快(I ran to the store)
- 運(yùn)行(I run a store)
- 流(Water runs from the spring)
- 撕裂的線(Her stockings(長(zhǎng)襪) had a run.)
- 我們?cè)谟秒娔X讀入一個(gè)句子的時(shí)候,我們可以得到的信息有像位置(可以判斷自己所屬的詞性),和旁邊的詞,根據(jù)這些信息,我們可以獲得這個(gè)詞的意思。
- 一個(gè)決策樹的案例是:
- 從這個(gè)決策樹可以看出,我們可能的決策樹有非常多種。
- 你可能會(huì)感到疑惑,每棵決策樹究竟是不同在哪呢?實(shí)際上分類方法其實(shí)是固定的,只是根節(jié)點(diǎn)輸出的結(jié)果是可變的。
- 下面這張圖描述的是只有一個(gè)判定條件X,并且輸出分類只有兩種的所有決策樹。
- 感興趣的可以算算,n個(gè)二元判定條件X形成的決策樹(輸出是k分類),可能的決策樹的種類有多少?
- 所以找到?jīng)Q策樹的最優(yōu)解是NP-Hard問題。
- 但是實(shí)際運(yùn)行起來(lái),決策樹的效率還不錯(cuò)。
算法
- 直接上偽碼,我們一點(diǎn)點(diǎn)來(lái)理解。
- 首先S是訓(xùn)練集,其中x是輸入向量,y是輸出結(jié)果。
- 算法的核心思想是貪心,就是選出最好的屬性,然后繼續(xù)下去進(jìn)行分類。
- 不要混淆x,x\bold{x}, xx,x,xxx代表著不同的內(nèi)容,例如對(duì)于打網(wǎng)球問題的x1{x1}\bold{x_1}\{x_1\}x1?{x1?}代表的是第一行的第一個(gè)屬性的值(也就是sunny)。
- 而算法這里把所有的屬性都假設(shè)為了0或1。
- 這個(gè)算法的意思是
- 如果對(duì)于某個(gè)<x,y>∈S<\bold{x},y>\in S<x,y>∈S,是的所有的y都是0分類或者1分類,那么就把它歸到某個(gè)葉子上,分類就結(jié)束了。
- 如果不是,我們就發(fā)現(xiàn)某一些是0有一些是1,我們就要選擇一個(gè)最好的算法來(lái)判斷那個(gè)屬性最好,然后加進(jìn)去。
判斷該選擇哪個(gè)屬性
- 那我們應(yīng)該選擇哪個(gè)屬性作為最好的屬性呢?
- 現(xiàn)在我們四個(gè)屬性,到底應(yīng)該選擇哪個(gè)來(lái)進(jìn)行第一個(gè)分類最好呢?
- 從一個(gè)直覺的角度來(lái)看,我們應(yīng)該選擇分類內(nèi)容最單一的(即purity最高的):
- 因?yàn)榉诸悆?nèi)容最單一的,就說明它劃分得最好。
- 所以我們需要一個(gè)很好的方法來(lái)衡量purity。
哪一個(gè)的信息更好呢?
- 舉例:我們現(xiàn)在有兩個(gè)屬性可以選擇:一個(gè)是當(dāng)前工資,一個(gè)是是否被面試者被雇傭。
- 我們可以假設(shè)十字是“信用高”,綠圈是“信用低”,那么我們可以看到圖b的分隔(即按照是否被雇傭來(lái)評(píng)價(jià)表現(xiàn)得更好);
- a有不確定性,不是所有的小于25k的都是信用低,不是所有大于25k都是信用高。
- 小結(jié)論: 不純性 = 不確定性
熵(Entropy): 用于衡量不確定性的方法
- 熵的公式長(zhǎng)成這樣H(X)=∑i?pilog2(pi)H(X) = \sum_i-p_ilog_2(p_i)H(X)=∑i??pi?log2?(pi?)
- pip_ipi?就是類型i的可能性,也是在第i類的占比。
- 熵 = 不確定性 = 不純度
- 對(duì)于一個(gè)只有兩類的問題,當(dāng)?shù)?類占比為x軸時(shí),熵的變化如下圖所示:
-
如果對(duì)于一個(gè)屬性產(chǎn)生的結(jié)果(例如無(wú)論是否小于25k,都是信用低的人),它的熵值為0,根據(jù)上圖,它的占比是1,所以熵值是0。
-
對(duì)于占比為50%的樣本,它的熵值即是1。這是一個(gè)好的訓(xùn)練集。
-
看到這里你可能很奇怪,因?yàn)閷?duì)于一個(gè)分類的子集,不是熵值越低越好嗎?
-
實(shí)際上,對(duì)于訓(xùn)練集來(lái)說,熵值是越高約好的,熵值很低的數(shù)據(jù)無(wú)法進(jìn)行訓(xùn)練。
-
但對(duì)于訓(xùn)練的結(jié)果,肯定是熵值低才好,說明訓(xùn)練的結(jié)果可解釋并且有序。
信息增益
- 我們想要確定訓(xùn)練集中哪個(gè)屬性對(duì)區(qū)分要學(xué)習(xí)的類最有用。
- 這其實(shí)就是剛才在講的問題,我們希望了解“某個(gè)屬性”對(duì)于降低“熵值”做出的貢獻(xiàn)有多大,這個(gè)貢獻(xiàn)就是“信息增益”。
- 信息增益:I(X;Y)=H(Y)?H(Y∣X)=H(X)?H(X∣Y)I(X;Y) = H(Y)-H(Y|X) = H(X)-H(X|Y)I(X;Y)=H(Y)?H(Y∣X)=H(X)?H(X∣Y)
- H(Y∣X)H(Y|X)H(Y∣X)代表的是 條件熵。
- 舉個(gè)例子:
- 某屬性對(duì)應(yīng)著30個(gè)結(jié)果,其中分別16個(gè)的結(jié)果是1,14個(gè)的結(jié)果是0。
- 我們把這個(gè)屬性進(jìn)行分類:第一類有17個(gè)單例,其中4個(gè)的結(jié)果是1,13個(gè)的結(jié)果是0;第二類13個(gè)單例,其中12個(gè)的結(jié)果是1,1一個(gè)的結(jié)果是0。
- 那么首先,屬性本身的熵為:
- ?(1430?log21430)?(1630?log21630)=0.996-(\frac{14}{30}\cdot log_2\frac{14}{30})-(\frac{16}{30}\cdot log_2\frac{16}{30}) = 0.996?(3014??log2?3014?)?(3016??log2?3016?)=0.996
- 第一分類的熵為
- ?(1317?log21317)?(417?log2417)=0.787-(\frac{13}{17}\cdot log_2\frac{13}{17})-(\frac{4}{17}\cdot log_2\frac{4}{17}) = 0.787?(1713??log2?1713?)?(174??log2?174?)=0.787
- 第二分類的熵為
- ?(113?log2113)?(1213?log21213)=0.391-(\frac{1}{13}\cdot log_2\frac{1}{13})-(\frac{12}{13}\cdot log_2\frac{12}{13}) = 0.391?(131??log2?131?)?(1312??log2?1312?)=0.391
- 第一二分類的加權(quán)平均熵為
- (1730?0.787)+(1330?0.391)=0.615(\frac{17}{30}\cdot 0.787)+(\frac{13}{30}\cdot 0.391)= 0.615(3017??0.787)+(3013??0.391)=0.615
- 信息增益為:0.996?0.615=0.380.996-0.615 = 0.380.996?0.615=0.38
- 但其實(shí)我們還有一個(gè)方法(這里只給出這個(gè)方法的公式):
- 對(duì)于I(C;F)I(C;F)I(C;F),輸出可能的類別為為{c1,c2,...,cm}\{c_1,c_2,...,c_m\}{c1?,c2?,...,cm?},對(duì)應(yīng)的特征種類是{f1,f2,...,fd}\{f_1,f_2,..., f_d\}{f1?,f2?,...,fd?},公式被定義為:
- I(C;F)=∑i=1m∑j=1dP(C=ci,F=fj)log2P(C=ci,F=fj)P(C=ci)P(F=fj)I(C;F) = \sum_{i=1}^m\sum_{j=1}^dP(C=c_i,F=f_j)log_2\frac{P(C=c_i, F=f_j)}{P(C=c_i)P(F=f_j)}I(C;F)=∑i=1m?∑j=1d?P(C=ci?,F=fj?)log2?P(C=ci?)P(F=fj?)P(C=ci?,F=fj?)?
- 其中:
- P(C=ci)P(C=c_i)P(C=ci?)是類別C值為cic_ici?的可能性。
- P(F=fj)P(F=f_j)P(F=fj?)是特征F有fjf_jfj?的可能性。
- P(C=ci,F=fj)P(C=c_i, F=f_j)P(C=ci?,F=fj?)是兩個(gè)共同的可能性
- 對(duì)于I(C;F)I(C;F)I(C;F),輸出可能的類別為為{c1,c2,...,cm}\{c_1,c_2,...,c_m\}{c1?,c2?,...,cm?},對(duì)應(yīng)的特征種類是{f1,f2,...,fd}\{f_1,f_2,..., f_d\}{f1?,f2?,...,fd?},公式被定義為:
- 我們這里以這張圖為例,我們想看看X,Y,Z哪個(gè)的信息增益最大,給出的計(jì)算公式如圖所示。
- 雖然這里有算法的詳細(xì)步驟,但是既然有包可以調(diào),不用自己手寫,那也就不詳細(xì)介紹了。
衡量不確定性的方法
除了熵可以衡量不確定性,“基尼指數(shù)”和“分類誤差”也可以衡量,他們的公式是這樣的
- 基尼指數(shù)
- Gini=1?∑jpj2Gini = 1-\sum_j{p_j^2}Gini=1?∑j?pj2?
- 分類誤差
- classificationError=1?max?pjclassificationError = 1 - \max{p_j}classificationError=1?maxpj?
過擬合問題
- 過擬合的其實(shí)主要就是看訓(xùn)練集和測(cè)試集的數(shù)值變化,如果訓(xùn)練集效果好但是測(cè)試集效果差,那么就是過擬合了。
- 奧卡姆剃刀(Occam’s Razor)
- 如果兩個(gè)理論都能夠解釋這個(gè)問題,那么我們更傾向于簡(jiǎn)單的理論。
- 因?yàn)閺?fù)雜的理論解釋更像是巧合(越多復(fù)雜的事情同時(shí)發(fā)生的概率就越小)
- 我們可以先得到完整的決策樹,然后后期對(duì)樹進(jìn)行剪枝來(lái)減少誤差,增加準(zhǔn)確性。
- 以下圖為例,我們可以在紅線位置剪枝,來(lái)得到更準(zhǔn)確的結(jié)果。
集成學(xué)習(xí)(Ensemble Learning)
轉(zhuǎn)載自此文,改編少數(shù)部分
- 講集成學(xué)習(xí),主要是為了下面講隨機(jī)森林做準(zhǔn)備的。
- 在機(jī)器學(xué)習(xí)的有監(jiān)督學(xué)習(xí)算法中,我們的目標(biāo)是學(xué)習(xí)出一個(gè)穩(wěn)定的且在各個(gè)方面表現(xiàn)都較好的模型,但實(shí)際情況往往不這么理想,有時(shí)我們只能得到多個(gè)有偏好的模型(弱監(jiān)督模型,在某些方面表現(xiàn)的比較好)。集成學(xué)習(xí)就是組合這里的多個(gè)弱監(jiān)督模型以期得到一個(gè)更好更全面的強(qiáng)監(jiān)督模型,集成學(xué)習(xí)潛在的思想是即便某一個(gè)弱分類器得到了錯(cuò)誤的預(yù)測(cè),其他的弱分類器也可以將錯(cuò)誤糾正回來(lái)。
- 集成方法是將幾種機(jī)器學(xué)習(xí)技術(shù)組合成一個(gè)預(yù)測(cè)模型的元算法,以達(dá)到減小方差(bagging)、偏差(boosting)或改進(jìn)預(yù)測(cè)(stacking)的效果。
- 集成學(xué)習(xí)在各個(gè)規(guī)模的數(shù)據(jù)集上都有很好的策略。
- 數(shù)據(jù)集大:劃分成多個(gè)小數(shù)據(jù)集,學(xué)習(xí)多個(gè)模型進(jìn)行組合
- 數(shù)據(jù)集小:利用Bootstrap方法進(jìn)行抽樣,得到多個(gè)數(shù)據(jù)集,分別訓(xùn)練多個(gè)模型再進(jìn)行組合。(引用自https://www.cnblogs.com/zongfa/p/9304353.html)
- 集合方法主要可以分為兩類:
- 序列集成方法,其中參與訓(xùn)練的基礎(chǔ)學(xué)習(xí)器按照順序生成(例如 AdaBoost)。序列方法的原理是利用基礎(chǔ)學(xué)習(xí)器之間的依賴關(guān)系。通過對(duì)之前訓(xùn)練中錯(cuò)誤標(biāo)記的樣本賦值較高的權(quán)重,可以提高整體的預(yù)測(cè)效果。
- 并行集成方法,其中參與訓(xùn)練的基礎(chǔ)學(xué)習(xí)器并行生成(例如 Random Forest)。并行方法的原理是利用基礎(chǔ)學(xué)習(xí)器之間的獨(dú)立性,通過平均可以顯著降低錯(cuò)誤。
- 總結(jié)一下,集成學(xué)習(xí)法的特點(diǎn):
自然地,就產(chǎn)生兩個(gè)問題:
一般集成方法有:Bagging(bootstrap aggregating 裝袋), Boosting和stacking
Bagging
- 我們現(xiàn)在知道了集成學(xué)習(xí)需要對(duì)于數(shù)據(jù)樣本進(jìn)行處理,處理的方式就涉及到抽樣,對(duì)于套袋法,抽樣方法即bootstrap,它的算法過程是
- 中間這里有個(gè)案例,有些地方有點(diǎn)疑問,先不放上來(lái)
由此,總結(jié)一下bagging方法:
常用的集成算法類是隨機(jī)森林。
-
在隨機(jī)森林中,集成中的每棵樹都是由從訓(xùn)練集中抽取的樣本(即 bootstrap 樣本)構(gòu)建的。另外,與使用所有特征不同,這里隨機(jī)選擇特征子集,從而進(jìn)一步達(dá)到對(duì)樹的隨機(jī)化目的。
-
因此,隨機(jī)森林產(chǎn)生的偏差略有增加,但是由于對(duì)相關(guān)性較小的樹計(jì)算平均值,估計(jì)方差減小了,導(dǎo)致模型的整體效果更好。
總結(jié)
- 上一篇: 武汉大学计算机学院李俊,GML空间数据存
- 下一篇: 功利主义穆勒思维导图_约翰·穆勒功利主义