python數據分析算法(決策樹2)CART算法


CART(Classification And Regression Tree),分類回歸樹,,決策樹可以分為ID3算法,C4.5算法,和CART算法。ID3算法,C4.5算法可以生成二叉樹或者多叉樹,CART只支持二叉樹,既可支持分類樹,又可以作為回歸樹。

分類樹: 基於數據判斷某物或者某人的某種屬性(個人理解)可以處理離散數據,就是有限的數據,輸出樣本的類別

回歸樹: 給定了數據,預測具體事物的某個值;可以對連續型的數據進行預測,也就是數據在某個區間內都有取值的可能,它輸出的是一個數值

CART 分類樹的工作流程

CART和C4.5算法類似,知識屬性選擇的指標采用的是基尼系數,基尼系數本身反應了樣本的不確定度,當基尼系數越小的時候,說明樣本之間的差異性小,不確定度低。分類的過程是一個不確定度降低的過程,即純度提升的過程,所以構造分類樹的時候會基於基尼系數最小的屬性作為划分。

了解基尼系數:

假設t為節點,那么該節點的GINI系數的計算公式為:

p(Ck|t) 表示t屬性類別Ck的概率,節點t的基尼系數為1減去各個分類Ck概率平方和    

例如集合1: 6個人去游泳,  那么p(Ck|t)=1,因此  GINI(t) = 1-1 =0

集合2      :  3個人去游泳,3個人不去,那么p(C1k|t) = 0.5 ,p(C2k|t) = 0.5    

得出,集合1樣本基尼系數最小,樣本最穩定,2的樣本不穩定性大

該公式表示節點D的基尼系數等於子節點D1,D2的歸一化基尼系數之和

使用CART算法創建分類樹

iris是sklearn 自帶IRIS(鳶尾花)數據集sklearn中的來對特征處理功能進行說明包含4個特征(Sepal.Length(花萼長度)、Sepal.Width(花萼寬度)、Petal.Length(花瓣長度)、Petal.Width(花瓣寬度)),特征值都為正浮點數,單位為厘米

目標值為鳶尾花的分類(Iris Setosa(山鳶尾)、Iris Versicolour(雜色鳶尾),Iris Virginica(維吉尼亞鳶尾))


1
# encoding=utf-8 2 from sklearn.model_selection import train_test_split 3 from sklearn.metrics import accuracy_score 4 from sklearn.tree import DecisionTreeClassifier 5 from sklearn.datasets import load_iris 6 # 准備數據集 7 iris=load_iris() 8 # 獲取特征集和分類標識 9 features = iris.data 10 labels = iris.target 11 # 隨機抽取 33% 的數據作為測試集,其余為訓練集 使用sklearn.model_selection train_test_split 訓練 12 train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0) 13 # 創建 CART 分類樹 14 clf = DecisionTreeClassifier(criterion='gini') 15 # 擬合構造 CART 分類樹 16 clf = clf.fit(train_features, train_labels) 17 # 用 CART 分類樹做預測 得到預測結果 18 test_predict = clf.predict(test_features) 19 # 預測結果與測試集結果作比對 20 score = accuracy_score(test_labels, test_predict) 21 print("CART 分類樹准確率 %.4lf" % score)
 CART 分類樹准確率 0.9600

train_test_split 可以把數據集抽取一部分作為測試集,就可以德奧訓練集和測試集

14 初始化一棵cart樹,16 訓練集的特征值和分類表示作為參數進行擬合得到cart分類樹

cart回歸樹的工作流程

cart回歸樹划分數據集的過程和分類樹的過程是一樣的,回歸樹得到的預測結果是連續值,評判不純度的指標不同,分類樹采用的是基尼系數,回歸樹需要根據樣本的離散程度來評價 不純度

樣本離散程度計算方式,每個樣本值到均值的差值,可以去差值的絕對值,或者方差

         方差為每個樣本值減去樣本均值的平方和除以樣本可數

最小絕對偏差(LAD) 最小二乘偏差

 

 如何使用CART回歸樹做預測

這里使用sklearn字典的博士度房價數據集,該數據集給出了影響房價的一些指標,比如犯罪了房產稅等,最后給出了房價

# encoding=utf-8
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import r2_score,mean_absolute_error,mean_squared_error
from sklearn.tree import DecisionTreeRegressor
# 准備數據集
boston=load_boston()
# 探索數據
print(boston.feature_names)
# 獲取特征集和房價
features = boston.data
prices = boston.target
# 隨機抽取 33% 的數據作為測試集,其余為訓練集
train_features, test_features, train_price, test_price = train_test_split(features, prices, test_size=0.33)
# 創建 CART 回歸樹
dtr=DecisionTreeRegressor()
# 擬合構造 CART 回歸樹
dtr.fit(train_features, train_price)
# 預測測試集中的房價
predict_price = dtr.predict(test_features)
# 測試集的結果評價
print('回歸樹二乘偏差均值:', mean_squared_error(test_price, predict_price))
print('回歸樹絕對值偏差均值:', mean_absolute_error(test_price, predict_price)) 
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
回歸樹二乘偏差均值: 32.065568862275455
回歸樹絕對值偏差均值 3.2892215568862277

cart決策樹的剪枝 

cart決策樹剪枝采用的是CCP方法,一種后剪枝的方法,cost-complexity prune 中文:代價復雜度,這種剪枝用到一個指標 叫做  節點的表面誤差率增益值,以此作為剪枝前后誤差的定義

 Tt 代表以t為根節點的子樹,C(Tt)表示節點t的子樹沒被裁剪時子樹Tt的誤差,C(t)表示節點t的子樹被剪枝后節點t的誤差,|Tt|代子樹Tt的葉子樹,剪枝后,T的葉子樹減一

所以節點的表面誤差率增益值 等於 節點t的子樹被剪枝后的誤差變化除以 減掉的葉子數量

因此希望剪枝前后誤差最小,所以我們要尋找就是最小α值對應的節點,把它減掉。生成第一個子樹,重復上面過程繼續剪枝,知直到最后為根節點,即為最后一個子樹

得到剪枝后的子樹集合后,我們需要采用驗證集對所有子樹的誤差計算一遍,可以計算每個子樹的基尼指數或平房誤差,去最小的那棵樹

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM