决策树 prepruning_数据挖掘入门系列教程(三点五)之决策树
本來還是想像以前一樣,繼續學習《 Python數據挖掘入門與實踐 》的第三章“決策樹”,但是這本書上來就直接給我懟了一大串代碼,對于決策樹基本上沒有什么介紹,可直接把我給弄懵逼了,主要我只聽過決策樹還沒有認真的了解過它。
這一章節主要是對決策樹做一個介紹,在下一個章節,將使用決策樹來進行預測分類。
決策樹(Decision Tree)介紹
Decision Tree是一類較為常見的機器學習的方法。它既可以作為分類算法,也可以作為回歸算法。
如何來介紹決策樹,這里舉一個例子:在大學,你找女朋友的時候,心目中順序應該是這樣的(僅僅是舉一個例子):
- Q:性別要求?
- A:不是女的不要。
- Q:年齡要求?
- A:大于我3歲的不要
- Q:專業要求?
- A:非CS不要
- ……
為了更好的表示上面的這一些問題,我們可以將其畫成一張樹狀圖如下所示:
上面的這棵樹就是我們找女朋友的決策過程,圓角矩形代表了判斷條件,橢圓形代表了決策結果。通過性別,年齡,專業這幾個屬性,最終我們得出了最終的決策。而這棵樹也就被稱之為決策樹。
大家通過上圖會發現有3個東西:
- 根節點:包含樣本的全集
- 內部節點:對應特征屬性測試
- 葉節點:代表決策的結果
在一棵決策樹中,包含了一個根節點,多個內部節點(判斷條件) 和若干個葉子節點。先說葉子節點,在決策樹中,葉子節點對應了決策結果,決策結果可以有多種類型(圖中是yes和no,也可以為1,2,3)。內部節點和根節點對應的都是屬性測試,只不過先后順序不同。
總的來說,決策樹體現的是一種“分而治之”的思想,
那么這里就有一個問題,誰來當根節點?誰又來當中間的節點?先后順序又是怎樣的?(這里先不說算法流程,從簡單開始說起,然后再說算法流程)
結點的選擇
首先我們需要明白根節點和中間節點是不同的,一個是統領全局的開始包含所有的樣本。一個是負責局部的決策,并且隨著決策樹的不斷的進行決策,所包含的樣本逐漸屬于同一個類別,即節點的“純度”越來越高。
那么,我們如何來尋找合適根節點(也就是屬性)呢?靠感覺?靠感覺當然不行,我們需要一個具體的數值來決定,很幸運,香農幫助我們做到了。
“信息熵”(information entropy):可以度量樣本集合中的“純度”。 在信息世界,熵越高,表示蘊含越多的信息,熵越低,則信息越少。 而根節點需要包含所以的樣本,則根結點的熵最大。
信息熵(Information Entropy)
設樣本集合為
,第 類樣本所占比例為 ,則集合 的信息熵為:現在,我們已經知道一個集合
中的信息熵是多少,那么我們如何來進行劃分呢?首先,我們需要明確一個劃分的標準(也就是目標),我們當然希望劃分之后,劃分之后的集合的熵越來越小,也就是劃分后的集合越來越純,這里我們引入信息增益這個概念。信息增益(information gain)
下面是西瓜書中對信息增益的定義:
假設離散屬性 有 個可能的取值 ,若以屬性 對樣本進行劃分,則有V個分支,其中第 個分支包含了 中在屬性 上取值為 的樣本,記為 。我們可以計算出 的信息熵,然后考慮到不同分支結點的樣本數不同,給分支結點賦予權重 ,樣本數愈多,則影響力越大,則可以計算出屬性 對樣本集 進行劃分的“信息增益”:一般來說,信息增益越大,則代表劃分后的集合越“純”,也就是說使用
屬性來劃分的效果最好,那么我們就可以使用 屬性來進行劃分。ID3算法就是使用信息增益來作為標準劃分屬性的。決策樹生成算法流程
下面是來自《西瓜書》的決策樹生成算法流程:
決策樹生成是一個遞歸的過程,在下面3中情況中,遞歸會返回:
- 當前結點包含的樣本全屬于同一類別,無需劃分
- 當前屬性集為空,或是所有樣本在所有屬性上取值相同,無法劃分
- 當前結點包含的樣本集合為空,不能劃分
算法可能不是那么的形象好理解,下面將以實際的例子來展示。
在最上面上面的找女朋友的例子并不是特別的好,屬性太少。這里以西瓜書中的 來進行舉例。這個屬性還是挺多的。
在上圖中,屬性的集合是{色澤,根蒂,敲聲,紋理,臍部,觸感}(目前不考慮編號這個屬性),分類的集合是{是,否},一共有17個樣本。
首先讓我們來及計算集合
的熵值。在集合 中,好瓜(是)占 ,壞瓜(否)占 ,所以集合 的熵為:以色澤作為劃分標準,可以得到3個子集:
我們可以獲得
的信息熵:因此色澤的信息增益為:
同理可以得到:
通過計算可以得到,紋理的信息增益最大,因此他被選為劃分的屬性如下圖:
然后以紋理是“清晰為例”,該集合
,可用的屬性集合為{ 色澤,根蒂,敲聲,臍部, 觸感}。因此,基于$D^1$又可以計算出各個屬性的信息增益:因此我們可以在“根蒂”,“觸感”,“臍部”中任意選擇其中一個作為劃分屬性。最終得到以下的決策樹:
通過上面的這些步驟,我們就得到了一顆關于西瓜的好壞的決策樹。ID3算法就是用信息增益作為劃分標準。
上面的例子來自西瓜書,以及計算的結果也來自西瓜書。增益率(Gain Ratio)
在這里有一個問題,
越大,就一定能夠作為劃分標準嗎?假如它是一個無用的屬性呢?比如上圖中編號這個屬性,如果在上面我們選擇編號作為根節點,那么第一次劃分就能夠得到17個集合,每一個集合只有1個樣本, 必定能夠達到最大值。但是我們知道,編號這個屬性在這里是毫無作用的。如果將這個問題進行泛化,如果一個屬性在分類中起到的作用給很小(也就是它對分類的影響很小),那么我們應該怎么考慮呢?這里我們可以使用增益率來作為劃分的標準,定義如下
稱之為屬性 的固有值(intrinsic value),屬性 的可能取值越多(劃分的 的集合越多), 就會越大。若像編號一樣進行劃分(每一個劃分的集合中只有一個樣本),隨著編號的增多, 的取值如下圖:其中著名的C4.5算法就是使用增益率來劃分屬性。
除了這種解決方案,還有一種解決方法,基尼指數作為劃分標準,CART決策樹使用這種方法。
基尼指數(Gini Index)
前面我們使用信息熵來表示集合的純度,這里我們使用基尼值來表示:
設樣本集合為
,第 類樣本所占比例為 反映了從數據集中隨機抽取兩個樣本,其類別標記不一致的概率。因此, 越大,則數據集越復雜,純度越低。同樣,屬性
的基尼指數定義為:因此,在我們選擇合適的屬性進行劃分的時候,選擇劃分后基尼指數較小的屬性作為劃分標準即可。
這個時候我們再來看一看這幅圖,應該就看的懂了吧。
剪枝(pruning)處理
首先,我們先說一下剪枝的目的——防止“過擬合”。在決策樹的學習過程中,為了保證正確性,會不斷的進行劃分,這樣可能會導致對于訓練樣本能夠達到一個很好的準確性,但是對于測試集可能就不是很好了,這樣的模型不具備泛化性。下面來舉一個例子:
我們有如下的數據集:
坐標軸的上的每一個點代表一個樣本,有
兩種屬性,其中,藍色的點代表類0,橙色的點代表類1。當我們使用決策樹進行訓練后,模型對于數據的識別區域如下,在粉紅色區域,其認為里面的點為類0,藍色的區域為類1:
大家可能發現一個問題,那就是這個區域劃分的太“細致”了。因為數據是有噪音(noise)的,這樣劃分明顯是不合理的。這里大家可以看一看決策樹的圖片:
那么如何來緩解這種問題呢?其中有一種方法就是去掉一些分支(剪枝)來降低過擬合的風險。
剪枝有兩種方案:
- 預剪枝(prepruning)
- 后剪枝(post-pruning)
預剪枝
預剪枝是指在決策樹生成過程中,對每個結點在劃分前先進行估計,若當前結點的劃分不能帶來決策樹泛化性能提升,則停止劃分并將當前結點標記為葉結點。用通俗的話來說,就是如果進行劃分能夠帶來更好的結果就進行劃分,否則不進行劃分。首先,我們定義一個訓練集和一個驗證集如下:(西瓜書中間的例子)
上面一部分是訓練集,下面一部分是測試集。然后讓我們來對**訓練集(記住是訓練集)**進行劃分,劃分的規則與上面的一樣。
下面的這幅圖是未剪枝的情況。
那么,剪枝是如何進行的呢?
首先,我們先判斷“臍部”,如果我們不對“臍部”進行劃分,也就是說這棵決策樹是這樣的:
只有一個好瓜的判斷結果(根據上面的算法流程圖,node節點直接就是葉子節點,其類別由樣本中最多的決定【這里既可以是好瓜也可以是壞瓜,因為數量一樣】)
這樣下來,也就是說無論你什么瓜過來我都判斷它是好瓜。使用驗證集進行驗證,驗證的精準度為:
。如果進行劃分呢?下圖便是進行劃分的情況,其中被紅色圓圈框出來的部分表示驗證正確。
如果只劃分“臍部”這個屬性,我們可以通過其來劃分好瓜和壞瓜,通過驗證機去測試,我們可以得到劃分后的準確性為:
,所以選擇劃分。下面便是進行前剪枝后的劃分結果,使用驗證集進行驗證,精度為
盡管該方案可以降低過擬合的風險,并在一定程度上能夠降低算法的復雜度,但也會帶來欠擬合的風險。因為會出現另外一種情況:有可能當前劃分不能提升泛化能力,但是在此基礎上的后續的劃分也許可以導致性能顯著提高。
后剪枝
后剪枝則是先從訓練集生成一棵完整的決策樹,然后自底向上地對非葉結點進行考察,若將該結點對應的子樹替換為葉結點能帶來決策樹泛化性能提升,則將該子樹替換為葉結點.后剪枝和前剪枝的不同在于后剪枝是在生成決策樹后再進行剪枝。順序是由下到上。
我們繼續來看這幅圖:
通過驗證集,我們易得到該決策樹的識別率為
。讓我們重新看一下數據吧,數據集和驗證集如下:
現在讓我們來進行剪枝吧!!首先先看節點⑥,節點6中包含編號為
的訓練樣本,因此我們將節點⑥變成葉節點并標記為“好瓜(壞瓜也ok)”。如下所示:在這種情況下,驗證集中序號為
驗證正確,精度調高到 ,因此可以進行剪枝。考慮結點⑤,包含編號為
,將其變成葉節點(標記為“好瓜”),使用驗證集去驗證,其精度仍為 ,沒有提高,進行考慮。同理可得到下面的這副圖片:最終,該決策樹的精度為
比較預剪枝和后剪枝,后剪枝保留的分支更多,同時后剪枝的欠擬合的風險很小,泛化性能往往優于預剪枝決策樹,但是顯而易見,訓練的時間要比預剪枝大得多。
隨機森林(Random Forest | RF)
什么是隨機森林呢?隨機森林是一個包含多個決策樹的分類器,由很多決策樹構成,不同的決策樹之間沒有關聯。當我們進行分類任務時,森林中的每一棵決策樹都會分別對樣本進行判斷和分類,每個決策樹會得到一個自己的分類結果,決策樹的分類結果中哪一個分類最多,那么隨機森林就會把這個結果當做最終的結果。 (emm,少樹服從多樹)。好像很簡單的樣子,但是這里有一個問題,那就是隨機森林中有多個決策樹,那么,我們如何用已有的數據集去構建這么多的決策樹呢?
首先我們要明白,決策樹是不同的,那么訓練決策樹所需要的數據也不同。那么具體該如何選擇呢?既然是隨機森林,那么它肯定是隨機的!!它的隨機有兩層含義:
- 樣本隨機:Bagging算法
- 屬性隨機
樣本隨機
樣本隨機使用的是Bagging算法(Bootstrap aggregating,引導聚集算法)又稱之為裝袋算法。算法的流程如下:
給定一個訓練集大小為
的訓練集 ,Bagging算法從中間隨機的、有放回的選出 個大小為 的子集 作為新的訓練集。ps:通過以上這種取樣得到的集合
中間可能會有重復的元素(因為是有放回的抽取元素)屬性隨機
若樣本有
個屬性時,隨機從這 個屬性中選取出 個屬性(無放回),滿足條件 。ps:在這種情況下,
個屬性中是沒有重復的屬性的。隨機森林的優缺點
通過上面的樣本隨機和屬性隨機,我們就可以構建出很多棵不同的決策樹了,然后組成一個森林,里面住著熊大和熊二,在一起快樂的生活。
優缺點的整理來自這里,基本上所有的文章都是這個說法,不同的在于文字的多少罷了!
優點
缺點
總結
決策樹的概念就暫時介紹到這里了,盡管內容有點多,但是還是挺好理解的,很類似于人類的思考方式。在下一篇的博客中,將使用scikit-learn工具包,基于決策樹來對數據進行分類。決策樹還有很多知識和算法,但是至少我們得掌握基本的概念。
參考
總結
以上是生活随笔為你收集整理的决策树 prepruning_数据挖掘入门系列教程(三点五)之决策树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数调用位置_python函
- 下一篇: 编写五子棋的完整python代码_pyt