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