决策树算法实现
ID3,c4.5只用于做分類,得到的結果是連續值;
cart既可以做分類,也可以做回歸,得到的結果是連續值。
CART 分類樹
在 Python 的 sklearn 中默認采用的是 CART 分類樹。
下面,我們來用 CART 分類樹,給 iris 數據集構造一棵分類決策樹。在 Python 的 sklearn 中,如果我們想要創建 CART 分類樹,可以直接使用 DecisionTreeClassifier 這個類。創建這個類的時候,默認情況下 criterion 這個參數等于 gini,也就是按照基尼系數來選擇屬性劃分,即默認采用的是 CART 分類樹。
首先 train_test_split 可以幫助我們把數據集抽取一部分作為測試集,這樣我們就可以得到訓練集和測試集。
clf = DecisionTreeClassifier(criterion=‘gini’) 初始化一棵 CART 分類樹。這樣你就可以對 CART 分類樹進行訓練。
clf.fit(train_features, train_labels) 函數,將訓練集的特征值和分類標識作為參數進行擬合,得到 CART 分類樹。
clf.predict(test_features) 函數進行預測,傳入測試集的特征值,可以得到測試結果 test_predict。
最后使用 accuracy_score(test_labels, test_predict) 函數, 傳入測試集的預測結果與實際的結果作為參數,得到準確率 score。
CART 回歸樹
CART 回歸樹劃分數據集的過程和分類樹的過程是一樣的,,只是回歸樹得到的預測結果是連續值,而且評判“不純度”的指標不同。
在 CART 分類樹中采用的是基尼系數作為標準來評價“不純度”,在CART回歸樹中則采用樣本的離散程度來評價不純度。
具體計算方式:
假設 x 為樣本的個體,均值為 u,為了統計樣本的離散程度,我們可以取差值的絕對值,或者方差。
所以這兩種節點劃分的標準,分別對應著兩種目標函數最優化的標準,即用最小絕對偏差(LAD),或者使用最小二乘偏差(LSD)。
通常,LSD劃分方法多一點。
我們使用到 sklearn 自帶的波士頓房價數據集,該數據集給出了影響房價的一些指標,比如犯罪率,房產稅等,最后給出了房價。
根據這些指標,我們使用 CART 回歸樹對波士頓房價進行預測,代碼如下:
首先加載了波士頓房價數據集,得到特征集和房價,然后通過 train_test_split 幫助我們把數據集抽取一部分作為測試集,其余作為訓練集。
dtr=DecisionTreeRegressor() 初始化一棵 CART 回歸樹。
dtr.fit(train_features, train_price) 函數, 將訓練集的特征值和結果作為參數進行擬合,得到 CART 回歸樹。
dtr.predict(test_features) 函數進行預測,傳入測試集的特征值,可以得到預測結果 predict_price。
最后我們可以求得這棵回歸樹的二乘偏差均值,以及絕對值偏差均值。
分類樹與回歸樹類似,只是回歸樹最終得到連續值。
CART 決策樹的剪枝
剪枝是改善過擬合非常常用的方法。CART 決策樹的剪枝主要采用的是 CCP 方法,它是一種后剪枝的方法。這種剪枝方式用到一個指標叫做節點的表面誤差率增益值,以此作為剪枝前后誤差的定義。
Tt 代表以 t 為根節點的子樹,C(Tt) 表示節點 t 的子樹沒被裁剪時子樹 Tt 的誤差,C(t) 表示節點 t 的子樹被剪枝后節點 t 的誤差,|Tt|代子樹 Tt 的葉子數,剪枝后,T 的葉子數減少了|Tt|-1。
所以節點的表面誤差率增益值等于節點 t 的子樹被剪枝后的誤差變化除以剪掉的葉子數量。
得到了剪枝后的子樹集合后,我們需要用驗證集對所有子樹的誤差計算一遍。可以通過計算每個子樹的基尼指數或者平方誤差,取誤差最小的那個樹,得到我們想要的結果。
總結
- 上一篇: python扫盲系列--(4)
- 下一篇: 决策树数学原理(ID3,c4.5,car