機器學習算法系列python
此次,咱們來看下決策樹算法算法
決策樹是一種常見的機器學習方法,它是從根節點開始,一步一步決策,直到走到葉子節點。
最終,全部的樣本數據都會落到葉子節點,顯然,決策過程的最終結論對應了咱們所但願的斷定結果 。
它便可以作分類問題,也能夠作迴歸問題。機器學習
通常,一棵決策樹包含一個根節點,若干個內部節點(非葉子節點)和若干個葉子節點。post
如何從給點定的訓練集中去構造一棵決策樹呢? 其實,決策樹的構建就是一個遞歸過程,從根節點開始,根據選擇的特徵,將原始數據集切分爲幾個分支,而後依次遍歷每一個分支,在剩下的特徵集中繼續選擇一個特徵,進行對應劃分,就是這個流程,一直遞歸下去,直到不可再分。
那麼,什麼狀況下會不可再分呢?有三種狀況:性能
具體的算法流程,這塊貼下週志華大佬的《機器學習》中的一個圖,你們能夠看下學習
咱們能夠發現,上述算法中,最重要的一點,就是在每一個節點上,選擇最優的劃分特徵,也就說,每次在節點處劃分時,咱們都須要考慮,選擇剩餘特徵集中的哪一個屬性進行劃分,能夠更好的劃分數據呢?這個,也就是決策樹算法的核心3d
經過上述,咱們直到,決策樹算法的核心是,如何選擇最優的劃分特徵,咱們但願隨着劃分的進行,咱們通過每次劃分後的分支節點所包含的樣本儘量的屬於同一類別,也就是節點中所包含的樣本純度愈來愈高。從而,咱們引入信息熵這個衡量標準cdn
信息熵表示的是隨機變量不肯定性的度量,熵越大,不肯定性越強,也就是說純度越低;
熵越小,不肯定性越弱,純度越高blog
設置樣本集合D中總共有類樣本,其中第
類樣本所佔的比例爲
,則
的信息熵定義爲:排序
對於一個二分類問題,咱們能夠畫出信息熵的圖像看看
那麼,經過信息熵,咱們如何進行決策樹劃分選擇的衡量呢,咱們引入信息增益這個概念
咱們假設特徵集中有一個離散特徵,它有
個可能的取值
,
若是使用特徵a來對樣本進行劃分,那麼會產
個分支節點,其中第
個分支節點中包含的樣本集。咱們記爲
。
因而,可計算出特徵a對樣本集D進行劃分所得到的信息增益爲:
解釋下上面公式,其實特徵a對樣本集D進行劃分所得到的信息增益 即爲 樣本集D的信息熵 減去 通過劃分後,各個分支的信息熵之和。因爲每一個分支節點,所包含的樣本數不一樣,全部在計算每一個分支的信息熵時,須要乘上對應權重,即樣本數越多的分支節點對應的影響越大
下面,咱們具體看個栗子
上那個那個是某人在某月的1到14號的打球記錄,咱們看下,對應特徵有四個,分別爲天氣(outlook,咱們就認爲是天氣吧- -),溫度,溼度,是否有風。輸出值爲是否打球
顯然,咱們的樣本總類, ,其中,正例佔比
,負例佔比
首先,咱們看下,根節點所包含的樣本集D對應的信息熵爲:
而後,咱們須要計算當前特徵集合(天氣,溫度,溼度,風級)中每一個特徵的信息增益。
以天氣這個特徵爲例,若是以天氣劃分,則可將數據集D劃分爲三個子集,分別標記爲:,
而後,咱們能夠算出,特徵outlook(天氣)對應的信息增益是:
一樣的,咱們能夠依次算出其餘特徵所對應的信息增益,而後判斷哪一個信息增益最大,則就以此特徵來做爲當前節點的劃分。
假設最後算得,採用outlook來進行當前根節點的劃分,則對於生成的三個節點分支,依次再對應每一個分支節點進行上述流程(算在此分支節點的數據集上,剩餘的特徵集合中哪一個信息增益最大,做爲當前分支節點的分割特徵,一直遞歸下去)
這其實就是ID3算法,以信息增益做爲準則來進行劃分特徵
咱們思考下,上面說的以信息增益做爲準則來進行劃分屬性,有什麼缺點沒?
假設對於上面的數據集,咱們增長一列特徵,爲 data(日期),針對上面的14個樣本數據,對應的值爲,根據上式可計算出,data(日期)所對應的的信息增益爲:
,
咱們發現,它所對應的信息增益遠大於其餘特徵,因此咱們要以data特徵,做爲第一個節點的劃分依據嗎?這樣劃分的話,將產生14個分支,每一個分支對應只包含一個樣本,能夠看到,每一個分支節點的純度已達到最大,也就是說每一個分支節點的結果都很是肯定。可是,這樣的決策樹,確定不是咱們想要的,由於它根本不具有任何泛化能力。
這就是ID3算法,也就是信息增益準則的一個缺點,它在選擇最優劃分特徵時,對可取數目比較多的特徵有所偏好,如何避免這個問題呢,咱們引入增益率這個概念,改成使用增益率來做爲最優劃分特徵的標準,一樣,選擇增益率最大的那個特徵來做爲最優劃分特徵,這也就是C4.5決策樹算法
一樣假設有數據集D,以及特徵a,它有個可能的取值
,
若是數據集在以特徵
做爲劃分特徵時,增益率定義爲:
其中
咱們來看下上述增益率公式,其實 就是特徵a自己的信息熵,也就說對應根據特徵a的可能取值,所對應求得的信息熵,
舉個栗子,對於outlook這個特徵,總共有三個類別(sunny,overcast,rainy),所對應類別的數據的個數爲爲(5,4,5) 則outlook自己的信息熵爲:
特徵a的對應種類越多,也就是說越大,則
的值一般會越大,從而增益率越小。這樣,就能夠避免信息增益中對可取數目比較多的特徵有所偏好的缺點
那直接以信息增益率做爲劃分的衡量標準,有沒有什麼缺點呢,其實也有,增益率準則通常對可取數目較少的屬性有所偏好。
因此,C4.5中的作法是:先從當前全部特徵中找出信息增益高於平均值的的部分特徵,再從中選擇增益率最高的做爲最優劃分特徵
還有一種決策樹算法,稱爲CART決策樹,它是使用基尼值來做爲衡量標準的。具體流程其實和信息增益的衡量標準相似,只是將信息熵,改成了基尼值
反映了從數據集D中隨機抽取兩個樣本,其類別標記不同的機率,因此,
越小。則數據集的純度越高
前面咱們所講的都是基於離散型特徵進行劃分生成決策樹,那對於連續性特徵,咱們須要怎麼來處理呢?這個時候就須要用到連續型特徵離散化的方法。最簡單的即爲二分法。下面咱們來具體看下
給定樣本集和連續特徵
, 假設特徵
在樣本集中總共有
個不一樣的取值。
咱們想一想,若是咱們不加限制,最後訓練出來的決策樹,每一個葉子節點的數據都會分紅純淨的,這樣真的好嗎?要知道,咱們是但願訓練出的決策樹模型,對於新給的數據,可以準確預測出對應結果。
因此,決策樹,很是容易出現過擬合問題。爲了不這個問題,提供決策樹的泛化能力,咱們須要進行剪枝操做。通常有兩種剪枝操做,「預剪枝」和「後剪枝」
預剪枝便是指在決策樹的構造過程當中,對每一個節點在劃分前須要根據不一樣的指標進行估計,若是已經知足對應指標了,則再也不進行劃分,不然繼續劃分。
那麼,具體指標都有哪些呢?
因爲預剪枝是在構建決策樹的同時進行剪枝處理,因此其訓練時間開銷較少,同時能夠有效的下降過擬合的風險
可是,預剪枝有一個問題,會給決策樹帶來欠擬合的風險,1,2,3,4指標,不用過多解釋,對於5指標來講,
雖然,當前劃分不能致使性能提升,可是,或許在此基礎上的後續劃分,卻能使性能顯著提升呢?
後剪枝則是先根據訓練集生成一顆完整的決策樹,而後根據相關方法進行剪枝。
經常使用的一種方法是,自底向上,對非葉子節點進行考察,一樣拿驗證集中的數據,來根據精度進行考察。看該節點劃分前和劃分後,精度是否有提升,若是劃分後精度沒有提升,則剪掉此子樹,將其替換爲葉子節點。
相對於預剪枝來講,後剪枝的欠擬合風險很小,同時,泛化能力每每要優於預剪枝,可是,由於後剪枝先要生成整個決策樹後,而後才自底向上依次考察每一個非葉子節點,因此訓練時間長。
以上,就是決策樹算法的基本原理,下一篇文章,咱們將經過python來具體實現一個決策樹算法
歡迎關注個人我的公衆號 AI計算機視覺工坊,本公衆號不按期推送機器學習,深度學習,計算機視覺等相關文章,歡迎你們和我一塊兒學習,交流。