ML:決策樹的優略點

用於分類迴歸

一、優點

  • 簡單易懂,條理清晰,可以用圖畫出來;
  • 需要較少的數據預處理,計算量不大。其他算法常常需要數據標準化、刪除空值、創建虛擬變量。需要注意的是,此處模型不支持缺失值;
  • Tree的使用成本(例如預測)等於訓練數據集大小的對數。
  • 可處理連續數據和分類數據;
  • 可處理multi-output問題;
  • 可解釋性強(與之相反的是神經網絡,其結果過程幾乎無法解釋,是“黑盒”)
  • 可以用統計測試來驗證模型。這樣的話就有可能求得模型的可信度。
  • 即使生成數據的真實模型一定程度上和它的假設有衝突,它也能運行的很好(暫時不理解這什麼意思);

二、缺點

  • 容易出現過擬合現象,造成模型魯棒性低下。
  • 相比於數據,當類別太多的時候錯誤可能增加的比較快。通過集成學習可以緩解一些。
  • (待續)

四、使用要點

  • 決策樹容易過擬合,當特徵較多的時候。當feature較多,樣本較少的時候尤其需要注意。
  • 可以考慮在使用決策樹之前進行數據降維(例如PCAICA或者feature selection,以便更好地從總體裏得到代表性大的feature。
  • 理解決策樹的算法結構,從計算邏輯上理解它做出決策的過程,對於理解數據的重要feature非常有用。
  • export函數訓練決策樹的時候,把模型可視化。先從max_depth=3開始訓練,根據你和效果逐漸增加深度。
  • 深度每增加一層,就要需要2倍的樣本來生成決策樹。使用max_depth來控制決策樹的大小可以避免過擬合。
    附:sklearn.tree.DecisionTreeRegressor()官網鏈接

五、案例解釋決策樹算法公式:

算法1):ID3(Iterative Dichotomiser 3 \ 迭代二分類3)
  • 關鍵詞:Entropy(熵)和IG ( 信息增益) 。
  1. Entropy H(S): 熵, 全稱Shannon Entropy。數學公式:
    H(S)=xXp(x)log2p(x)H(S) = \sum_{x∈X} -p(x)log_2p(x)

參數:

  • S: The current dataset for which entropy is being calculated.
  • X:The set of classes in S。
  • p(x)p(x):The proportion of the number of elements in class X to the number of elements in set S.
  • H(s)=0H(s)=0,數據集S被算法完美分類(e.g. 數據集S的所有元素都是同類,例如硬幣的兩面都是花)。

“熵”爲什麼又叫“信息熵”?In general, if we are given a probability distribution P=(p1,p2,...,pn)P=(p_1, p_2,...,p_n) and a data set S then the Information carried by this distribution, also called the entropy of S. “熵”的含義就是數據集S的分佈信息,所以叫信息熵。

  1. IG(S, A):Information Gain, is the measure of the difference in entropy from before to after the set S is split on an attribute A. In other words, how much uncertainty in S was reduced after splitting set S on attribute A.
    IG(S,A)=H(S)H(S,A)IG(S,A) = H(S) - H(S, A) alternatively,
    IG(S,A)=H(S)tTp(t)H(t)IG(S, A)= H(S) - \sum_{t∈T}p(t)H(t)
    備註:上邊例子計算的是在計算了“play”的entropy的基礎上(即S按“play”計算的entropy),計算如果按“outlook”字段劃分,entropy期望是多少,期望即Σp(t)H(t)Σp(t)H(t)

計算H(S,A)H(S,A)的例子:
在這裏插入圖片描述
感想:從上邊例子可知,H(S)即數據集S按字段“play”劃分時的熵,H(S,A)即用字段“outlook”或者其他字段再劃分“play”時的熵,此時IG(S,A) = H(S) - H(S,A)。那麼評選劃分“play”最好字段,H(S, A)一個指標就夠了,因爲H(S)固定不變。

ID3算法步驟:
1、利用數據集S計算每個屬性的熵
2、用有最小熵的屬性把數據集劃分,或用最大的IG(Information Gain)
3、生成包含屬性的決策樹節點
4、遞歸使用剩餘屬性的子集

評價:很明顯,ID3採用的是“絕對變動大小”的概念,因此傾向於選擇取值較多的屬性,在有些情況下這類屬性可能不會提供太多有價值的信息,故而發展了C4.5乃至之後的C5.0算法。

算法3):C4.5
  • 關鍵詞:IG ratio \ Information Gain Ratio \ 信息增益率
    IGRatio(S,A)=IG(S,A)/H(S,A)IG_{Ratio} (S,A)= IG(S,A)/H(S,A)

評價:C4.5採用“相對變動大小”的概念,是ID3的優化。缺點也很明顯,1)是算法低效,因爲在構造樹的時候需要對數據集進行多次的順序掃描和排序,2)受限於內存,比較適合能夠駐留於內存的數據集,當訓練數據集大得無法在內存容納的時候程序無法運行。

算法2):CART (Classification And Regression Tree)
  • 關鍵詞:GINI係數

計算方法:

  1. 分類的Gini:GNINI=1iIpi2GNINI=1- \sum_{i∈I}p^2_i
  2. 迴歸的Gini:=iI(xiμ)2=iIxi2nμ2=\sum_{i∈I}(x_i -μ)^2 = \sum_{i∈I}x^2_i - nμ^2

突然中發現這個博主寫的很好,直接點鏈接吧(分類與迴歸樹(classification and regression tree,CART)之迴歸 by 天澤28
順便謄寫核心:

“遍歷每個特徵:

  • 對於特徵fif_i”,遍歷每個取值ss
    – 用切分點ss將數據集分成兩份,
    – 計算切分後的誤差

求出誤差最小的特徵及其對應的切分點,此特徵值幾倍選中作爲分裂節點,切分點則形成左右分支。
遞歸地重複以上步驟,寫一次遞歸時已經分裂的特徵值就不用了考慮了。”

其實就是用GINI替換了ID3的entropy,從下圖可以明顯看到兩者幾乎一致,除了最大值不同。在決策樹裏邊選哪個都一樣,只是gini的計算簡單,公式更明瞭:

pp取值(0, 1),對應的entropy和gini圖標如下:
在這裏插入圖片描述

當然Ryan Bressler在這個回答裏說道:“我的經驗是這樣,在低維、噪點少乾淨的數據集上,當你試圖模擬一個複雜信號的時候entropy比較好;在噪點多不乾淨、高維數據集上,當你試圖從有一堆干擾信號中甄選出一個簡單信號的時候gini比較好。”

# 上圖代碼如下:
import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 2)
ax1 = axes[0]
ax2 = axes[1]

x = np.linspace(0, 1, 1000, endpoint=False)
x = np.delete(x, 0)
y1 = 1 - x**2 - (1-x)**2
y2 = -x*np.log2(x) -(1-x)*np.log2(1-x)


ax1.plot(x, y1)
ax1.set_title('GINI')
ax1.set_xlabel('x')
ax1.set_ylabel('gini')


ax2.plot(x, y2)
ax2.set_title('ENTROPY')
ax2.set_xlabel('x')
ax2.set_ylabel('entropy')

plt.show()

參考資料:

  • A comparative study of decision tree ID3 and C4.5(鏈接)
  • Decision Trees for Classification: A Machine Learning Algorithm(鏈接)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章