用於分類和迴歸
一、優點
- 簡單易懂,條理清晰,可以用圖畫出來;
- 需要較少的數據預處理,計算量不大。其他算法常常需要數據標準化、刪除空值、創建虛擬變量。需要注意的是,此處模型不支持缺失值;
- Tree的使用成本(例如預測)等於訓練數據集大小的對數。
- 可處理連續數據和分類數據;
- 可處理multi-output問題;
- 可解釋性強(與之相反的是神經網絡,其結果過程幾乎無法解釋,是“黑盒”)
- 可以用統計測試來驗證模型。這樣的話就有可能求得模型的可信度。
- 即使生成數據的真實模型一定程度上和它的假設有衝突,它也能運行的很好(暫時不理解這什麼意思);
二、缺點
- 容易出現過擬合現象,造成模型魯棒性低下。
- 相比於數據,當類別太多的時候錯誤可能增加的比較快。通過集成學習可以緩解一些。
- (待續)
四、使用要點
- 決策樹容易過擬合,當特徵較多的時候。當feature較多,樣本較少的時候尤其需要注意。
- 可以考慮在使用決策樹之前進行
數據降維
(例如PCA,ICA或者feature selection,以便更好地從總體裏得到代表性大的feature。 - 理解決策樹的算法結構,從計算邏輯上理解它做出決策的過程,對於理解數據的重要feature非常有用。
- 用
export
函數訓練決策樹的時候,把模型可視化。先從max_depth=3
開始訓練,根據你和效果逐漸增加深度。 - 深度每增加一層,就要需要2倍的樣本來生成決策樹。使用
max_depth
來控制決策樹的大小可以避免過擬合。
附:sklearn.tree.DecisionTreeRegressor()官網鏈接。
五、案例解釋決策樹算法公式:
算法1):ID3(Iterative Dichotomiser 3 \ 迭代二分類3)
- 關鍵詞:Entropy(熵)和IG ( 信息增益) 。
- Entropy H(S): 熵, 全稱Shannon Entropy。數學公式:
參數:
- S: The current dataset for which entropy is being calculated.
- X:The set of classes in S。
- :The proportion of the number of elements in class X to the number of elements in set S.
- 當,數據集S被算法完美分類(e.g. 數據集S的所有元素都是同類,例如硬幣的兩面都是花)。
“熵”爲什麼又叫“信息熵”?In general, if we are given a probability distribution and a data set S then the Information carried by this distribution, also called the entropy of S. “熵”的含義就是數據集S的分佈信息,所以叫信息熵。
- 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.
alternatively,
備註:上邊例子計算的是在計算了“play”的entropy的基礎上(即S按“play”計算的entropy),計算如果按“outlook”字段劃分,entropy期望是多少,期望即。
計算的例子:
感想:從上邊例子可知,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 \ 信息增益率
評價:C4.5採用“相對變動大小”的概念,是ID3的優化。缺點也很明顯,1)是算法低效,因爲在構造樹的時候需要對數據集進行多次的順序掃描和排序,2)受限於內存,比較適合能夠駐留於內存的數據集,當訓練數據集大得無法在內存容納的時候程序無法運行。
算法2):CART (Classification And Regression Tree)
- 關鍵詞:GINI係數
計算方法:
- 分類的Gini:
- 迴歸的Gini:
突然中發現這個博主寫的很好,直接點鏈接吧(分類與迴歸樹(classification and regression tree,CART)之迴歸 by 天澤28)
順便謄寫核心:
“遍歷每個特徵:
- 對於特徵”,遍歷每個取值:
– 用切分點將數據集分成兩份,
– 計算切分後的誤差求出誤差最小的特徵及其對應的切分點,此特徵值幾倍選中作爲分裂節點,切分點則形成左右分支。
遞歸地重複以上步驟,寫一次遞歸時已經分裂的特徵值就不用了考慮了。”
其實就是用GINI替換了ID3的entropy,從下圖可以明顯看到兩者幾乎一致,除了最大值不同。在決策樹裏邊選哪個都一樣,只是gini的計算簡單,公式更明瞭:
取值(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()
參考資料: