決策樹算法

 Infi-chu:python

http://www.cnblogs.com/Infi-chu/算法

1、簡介編程

決策樹思想的來源很是樸素,程序設計中的條件分支結構就是if-else結構,最先的決策樹就是利用這類結構分割數據的一種分類學習方法dom

1.定義:機器學習

決策樹是一種樹形結構,其中每一個內部節點表示一個屬性上的判斷,每一個分支表明一個判斷結果的輸出,最後每一個葉節點表明一種分類結果,本質是一顆由多個判斷節點組成的樹編程語言

2、決策樹原理學習

1.熵測試

在物理學中,熵Entropy是「混亂」程度的度量優化

系統越有序,熵越低;系統混亂或者越分散,熵越高spa

信息理論

一、從信息的完整性上進行的描述:

系統的有序狀態一致時,**數據越集中的地方熵值越小,數據越分散的地方熵值越大。

二、從信息的有序性上進行的描述:

數據量一致時系統越有序,熵值越低;系統越混亂或者分散,熵值越高

1948年香農提出了信息熵(Entropy)的概念。

假如事件A的分類劃分是(A1,A2,...,An),每部分發生的機率是(p1,p2,...,pn),那信息熵定義爲公式以下:(log是以2爲底,lg是以10爲底)

eg.

案例1:
若是一顆骰子的六個面都是1 ,投擲它不會給你帶來任何新信息,由於你知道它的結果確定是1,它的信息熵爲?
答案:
 - log(1) = 0 。

案例2:
假設咱們沒有看世界盃的比賽,可是想知道哪支球隊會是冠軍,
咱們只能猜想某支球隊是或不是冠軍,而後觀衆用對或不對來回答,
咱們想要猜想次數儘量少,你會用什麼方法?
答案:
二分法:
假若有 16 支球隊,分別編號,先問是否在 1-8 之間,若是是就繼續問是否在 1-4 之間,
以此類推,直到最後判斷出冠軍球隊是哪隻。
若是球隊數量是 16,咱們須要問 4 次來獲得最後的答案。那麼世界冠軍這條消息的信息熵就是 4。
若是有32個球隊,準確的信息量應該是: 
H = -(p1 * logp1 + p2 * logp2 + ... + p32 * logp32),
其中 p1, ..., p32 分別是這 32 支球隊奪冠的機率。
當每支球隊奪冠機率相等都是 1/32 的時:H = -(32 * 1/32 * log1/32) = 5
每一個事件機率相同時,熵最大,這件事越不肯定。

案例3:
籃球比賽裏,有4個球隊 {A,B,C,D} ,獲勝機率分別爲{1/2, 1/4, 1/8, 1/8},求H(X)
答案:
H(X) = 1\2log(2)+1\4log(4)+1\8log(8)+1\8log(8)=(1\2+1\2+3\8+3\8)log(2)=7\4bits
tips:
    以2爲底,記作lb,單位bit
    以e爲底,記作ln,單位nat

2.決策樹劃分依據——信息增益

定義:

信息增益:以某特徵劃分數據集先後的熵的差值。熵能夠表示樣本集合的不肯定性,熵越大,樣本的不肯定性就越大。所以能夠使用劃分先後集合熵的差值來衡量使用當前特徵對於樣本集合D劃分效果的好壞

信息增益 = entroy(前) - entroy(後)

公式:

特徵A對訓練數據集D的信息增益g(D,A),定義爲集合D的信息熵H(D)與特徵A給定條件下D的信息條件熵H(D|A)之差,即公式爲:

 

 

 公式詳解:

 

 

 【注】

信息增益表示得知特徵X的信息,使得類Y的信息熵減小的程度。

eg.

如圖,第一列爲論壇號碼,第二列爲性別,第三列爲活躍度,最後一列用戶是否流失。

咱們要解決一個問題:性別和活躍度兩個特徵,哪一個對用戶流失影響更大

經過計算信息增益能夠解決這個問題,統計上右表信息

其中Positive爲正樣本(已流失),Negative爲負樣本(未流失),下面的數值爲不一樣劃分下對應的人數。

可獲得三個熵:

總體熵:

性別熵

性別信息熵

 

 

 活躍度熵

活躍度信息熵

 

 

 【注】

活躍度的信息增益比性別的信息增益大,也就是說,活躍度對用戶流失的影響比性別大。

在作特徵選擇或者數據分析的時候,咱們應該重點考察活躍度這個指標。

3.決策樹劃分依據——信息增益率

增益率:增益比率度量是用前面的增益度量Gain(S,A)和所分離信息度量SplitInformation(如上例的性別,活躍度等)的比值來共同定義的。

 

 

 4.決策樹劃分依據——基尼值和基尼指數

基尼值Gini(D):從數據集D中隨機抽取兩個樣本,其類別標記不一致的機率。故,Gini(D)值越小,數據集D的純度越高。

基尼指數Gini_index(D):通常,選擇使劃分後基尼係數最小的屬性做爲最優化分屬性。

 

 

eg.

根據下圖列表,按照基尼指數的劃分依據,作出決策樹。

1,對數據集非類標號屬性{是否有房,婚姻情況,年收入}分別計算它們的Gini係數增益,取Gini係數增益值最大的屬性做爲決策樹的根節點屬性。

2,根節點的Gini係數爲:

 

 

 3,當根據是否有房來進行劃分時,Gini係數增益計算過程爲:

 

 

 4,若按婚姻情況屬性來劃分,屬性婚姻情況有三個可能的取值{married,single,divorced},分別計算劃分後的Gini係數增益。

{married} | {single,divorced}

{single} | {married,divorced}

{divorced} | {single,married}

當分組爲{married} | {single,divorced}時:

 

 

當分組爲{single} | {married,divorced}時:

當分組爲{divorced} | {single,married}時:

對比計算結果,根據婚姻情況屬性來劃分根節點時取Gini係數增益最大的分組做爲劃分結果,即:{married} | {single,divorced}

5,同理可得年收入Gini:

對於年收入屬性爲數值型屬性,首先須要對數據按升序排序,而後從小到大依次用相鄰值的中間值做爲分隔將樣本劃分爲兩組。例如當面對年收入爲60和70這兩個值時,咱們算得其中間值爲65。以中間值65做爲分割點求出Gini係數增益。

最大化增益等價於最小化子女結點的不純性度量(Gini係數)的加權平均值,如今咱們但願最大化Gini係數的增益。根據計算知道,三個屬性劃分根節點的增益最大的有兩個:年收入屬性和婚姻情況,他們的增益都爲0.12。此時,選取首先出現的屬性做爲第一次劃分。

6,接下來,採用一樣的方法,分別計算剩下屬性,其中根節點的Gini係數爲(此時是否拖欠貸款的各有3個records)

 

 

 7,對因而否有房屬性,可得:

 

 

 8,對於年收入屬性則有:

 

 

 

5.總結

決策樹構建的基本步驟以下

  1. 開始將全部記錄看做一個節點

  2. 遍歷每一個變量的每一種分割方式,找到最好的分割點

  3. 分割成兩個節點N1和N2

  4. 對N1和N2分別繼續執行2-3步,直到每一個節點足夠「純」爲止。

決策樹的變量能夠有兩種

  1. 數字型(Numeric):變量類型是整數或浮點數,如前面例子中的「年收入」。用「>=」,「>」,「<」或「<=」做爲分割條件(排序後,利用已有的分割狀況,能夠優化分割算法的時間複雜度)。

  2. 名稱型(Nominal):相似編程語言中的枚舉類型,變量只能從有限的選項中選取,好比前面例子中的「婚姻狀況」,只能是「單身」,「已婚」或「離婚」,使用「=」來分割。

如何評估分割點的好壞?

​ 若是一個分割點能夠將當前的全部節點分爲兩類,使得每一類都很「純」,也就是同一類的記錄較多,那麼就是一個好分割點。

​ 好比上面的例子,「擁有房產」,能夠將記錄分紅了兩類,「是」的節點所有均可以償還債務,很是「純」;「否」的節點,能夠償還貸款和沒法償還貸款的人都有,不是很「純」,可是兩個節點加起來的純度之和與原始節點的純度之差最大,因此按照這種方法分割。構建決策樹採用貪心算法,只考慮當前純度差最大的狀況做爲分割點。

常見決策樹類型比較

 

 

 ID3算法

存在的缺點

​ (1) ID3算法在選擇根節點和各內部節點中的分支屬性時,採用信息增益做爲評價標準。信息增益的缺點是傾向於選擇取值較多的屬性,在有些狀況下這類屬性可能不會提供太多有價值的信息.

​ (2) ID3算法只能對描述屬性爲離散型屬性的數據集構造決策樹

 

C4.5算法

作出的改進(爲何使用C4.5要好)

​ (1) 用信息增益率來選擇屬性

​ (2) 能夠處理連續數值型屬性

​ (3)採用了一種後剪枝方法

​ (4)對於缺失值的處理

C4.5算法的優缺點

​ 優勢:

​ 產生的分類規則易於理解,準確率較高。

​ 缺點:

​ 在構造樹的過程當中,須要對數據集進行屢次的順序掃描和排序,於是致使算法的低效。

​ 此外,C4.5只適合於可以駐留於內存的數據集,當訓練集大得沒法在內存容納時程序沒法運行。

 

CART算法

CART算法相比C4.5算法的分類方法,採用了簡化的二叉樹模型,同時特徵選擇採用了近似的基尼係數來簡化計算。

C4.5不必定是二叉樹,但CART必定是二叉樹。

同時,不管是ID3, C4.5仍是CART,在作特徵選擇的時候都是選擇最優的一個特徵來作分類決策,可是大多數,分類決策不該該是由某一個特徵決定的,而是應該由一組特徵決定的。這樣決策獲得的決策樹更加準確。這個決策樹叫作多變量決策樹(multi-variate decision tree)。在選擇最優特徵的時候,多變量決策樹不是選擇某一個最優特徵,而是選擇最優的一個特徵線性組合來作決策。這個算法的表明是OC1,這裏很少介紹。

若是樣本發生一點點的改動,就會致使樹結構的劇烈改變。這個能夠經過集成學習裏面的隨機森林之類的方法解決。

 

3、cart剪枝

1.爲何剪枝

•橫軸表示在決策樹建立過程當中樹的結點總數,縱軸表示決策樹的預測精度。

•實線顯示的是決策樹在訓練集上的精度,虛線顯示的則是在一個獨立的測試集上測量出來的精度。

•隨着樹的增加,在訓練樣集上的精度是單調上升的, 然而在獨立的測試樣例上測出的精度先上升後降低。

出現這種狀況的緣由:

•緣由1:噪聲、樣本衝突,即錯誤的樣本數據。

•緣由2:特徵即屬性不能徹底做爲分類標準。

•緣由3:巧合的規律性,數據量不夠大。

2.經常使用剪枝方法

預剪枝

(1)每個結點所包含的最小樣本數目,例如10,則該結點總樣本數小於10時,則再也不分;

(2)指定樹的高度或者深度,例如樹的最大深度爲4;

(3)指定結點的熵小於某個值,再也不劃分。隨着樹的增加, 在訓練樣集上的精度是單調上升的, 然而在獨立的測試樣例上測出的精度先上升後降低

後剪枝

後剪枝,在已生成過擬合決策樹上進行剪枝,能夠獲得簡化版的剪枝決策樹。

 

4、特徵工程

1.特徵提取

定義:

將任意數據(如文本或圖像)轉換爲可用於機器學習的數字特徵

【注】特徵值化是爲了計算機更好的去理解數據

特徵提取分類:

  • 字典特徵提取(特徵離散化)
  • 文本特徵提取
  • 圖像特徵提取(深度學習將介紹)

API:

sklearn.feature_extraction

2.字典特徵提取

做用:對字典數據進行特徵值化

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(X)
      • X:字典或者包含字典的迭代器返回值
      • 返回sparse矩陣
    • DictVectorizer.get_feature_names() 返回類別名稱

 

5、決策樹算法API

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)

    criterion
        特徵選擇標準
        "gini"或者"entropy",前者表明基尼係數,後者表明信息增益。一默認"gini",即CART算法。
    min_samples_split
        內部節點再劃分所需最小樣本數
        這個值限制了子樹繼續劃分的條件,若是某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 默認是2.若是樣本量不大,不須要管這個值。若是樣本量數量級很是大,則推薦增大這個值。我以前的一個項目例子,有大概10萬樣本,創建決策樹時,我選擇了min_samples_split=10。能夠做爲參考。
    min_samples_leaf
        葉子節點最少樣本數
        這個值限制了葉子節點最少的樣本數,若是某葉子節點數目小於樣本數,則會和兄弟節點一塊兒被剪枝。 默認是1,能夠輸入最少的樣本數的整數,或者最少樣本數佔樣本總數的百分比。若是樣本量不大,不須要管這個值。若是樣本量數量級很是大,則推薦增大這個值。以前的10萬樣本項目使用min_samples_leaf的值爲5,僅供參考。
    max_depth
        決策樹最大深度
        決策樹的最大深度,默承認以不輸入,若是不輸入的話,決策樹在創建子樹的時候不會限制子樹的深度。通常來講,數據少或者特徵少的時候能夠無論這個值。若是模型樣本量多,特徵也多的狀況下,推薦限制這個最大深度,具體的取值取決於數據的分佈。經常使用的能夠取值10-100之間
    random_state
        隨機數種子
相關文章
相關標籤/搜索