机器学习笔记-决策树
決策樹(Decision Tree)簡介
決策樹是一種分類和回歸算法。比較適合分析離散數據。如果是連續數據要先轉成離散數據在做分析。
決策樹簡單例子
根據以上表格可以根據年齡為根節點畫出的決策樹如下所示:
也可以把收入和是否為學生等來作為根節點來畫出決策樹,因此決策樹不唯一。
熵(Entropy)概念
1948年,香農提出了“信息熵”的概念。一條信息的信息量大小和它的不確定性有直接的關系,要搞清楚一件非常不確定的事情,或者是我們一無所知的事情,需要了解大量信息。信息量的度量就是等于不確定性的多少。
信息熵公式如下所示
p:代表概率;x:代表每種情況的可能性
例子:
其結果如下所示:
ID3算法
決策樹會選擇最大化信息增益來對結點進行劃分,信息增益計算:
Info(D)最后結果的每個概率
利用ID3算法來計算例題:
選擇信息增益最大的作為根節點,確定根節點后在計算其余參數的信息增益。
ID3算法的缺點:計算信息增益的時更傾向于分支多的參數作為節點。
C4.5算法
C4.5是ID3算法的改進,在ID3算法的基礎上添加了一個增益率。添加了增益率之后,優化了ID3的缺點。
ID3算法實例:
數據集為例子中是否買電腦的例子,例子數據如下圖所示:
導入包:
from sklearn.feature_extraction import DictVectorizer from sklearn import tree from sklearn import preprocessing from sklearn.preprocessing import LabelBinarizer import csv讀入數據:
Dtree=open(r'AllElectronics.csv','r')#可以讀取字符類型 reader=csv.reader(Dtree) #獲取第一行數據 headers=reader.__next__()#第一行 print(headers) #定義兩個列表 featureList=[]#特征 labelList=[]#標簽 for row in reader:#把label 存入listlabelList.append(row[-1])#保存no or yesrowDict={}for i in range(1,len(row)-1):#建立一個數據字典rowDict[headers[i]]=row[i]#把數據字典存入listfeatureList.append(rowDict) print(featureList)把數據轉化為0、1格式:
#把數據轉換成01表示 vec=DictVectorizer()#特征提取 x_data=vec.fit_transform(featureList).toarray()#轉化為01形式 print('x_data:'+str(x_data)) #打印屬性名稱 print(vec.get_feature_names()) print("labelList:"+str(labelList)) #把標簽轉化為01表示 lb=LabelBinarizer() y_data=lb.fit_transform(labelList) print("y_data:"+str(y_data))創建決策樹模型:
#創建決策樹模型 model=tree.DecisionTreeClassifier(criterion='entropy')#默認基尼指數 #輸入數據建立模型 model.fit(x_data,y_data)測試和預測:
x_test=x_data[0] print('x_test:'+str(x_test)) predict=model.predict(x_test.reshape(1,-1)) print("predict:"+str(predict))導出決策樹:
import graphviz dot_data=tree.export_graphviz(model,out_file=None,feature_names=vec.get_feature_names(),class_names=lb.classes_,filled=True,rounded=True,special_characters=True) graph=graphviz.Source(dot_data) graph.render('computer')結果如下所示:
CART算法
CART決策樹的生成就是遞歸地構建二叉樹的過程
CART用基尼(Gini)系數最小化準則來進行特征的選擇,生成二叉樹
GIni系數計算:
CART舉例
分別計算它們的Gini系數增益,取Gini系數增益值最大的屬性作為決策樹的根節點屬性,根節點的Gini系數:
根據是否有房來進行劃分時,Gini系數增益計算:(左子節點代表yes,右zi節點代表no)
計算婚姻的狀況,由于CART算法是一個二叉樹,因此需要把婚姻狀態分為兩種,如下所示:
根據年收入進行劃分時,由于年收入是一個連續性的數據。首要是要將年收入進行排序,再計算相鄰值的中點(平均值),再分別計算Gini指數,其結果如下所示:
由于婚姻狀態和年收入屬性的最大Gini指數都為0.12,則假設選擇婚姻狀況作為根節點。接下來,使用同樣的方法,分別計算剩下的屬性,其根節點的Gini系數為:
最后構建的CART決策樹如下所示:
剪枝
剪枝是將一顆子樹的子節點全部刪除,根節點作為葉子節點,具體如下圖所示:
為什么要剪枝?
決策樹是充分考慮了所有的數據點而生成的復雜樹,有可能出現過擬合的情況,決策樹越復雜,過擬合的程度會越高。
考慮極端的情況,如果我們令所有的葉子節點都只含有一個數據點,那么我們能夠保證所有的訓練數據都能準確分類,但是很有可能得到高的預測誤差,原因是將訓練數據中所有的噪聲數據都”準確劃分”了,強化了噪聲數據的作用。
剪枝修剪分裂前后分類誤差相差不大的子樹,能夠降低決策樹的復雜度,降低過擬合出現的概率。
怎樣剪枝?
兩種實現方案:先剪枝和后剪枝
先剪枝:說白了通過提前停止樹的構建而對樹剪枝,一旦停止,該節點就作為葉子節點了。
停止決策樹最簡單的方法有:
- 定義一個高度,當決策樹達到該高度時就停止決策樹的生長
- 達到某個節點的實例具有相同的特征向量,及時這些實例不屬于同一類,也可以停止決策樹的生長。這個方法對于處理數據的數據沖突問題比較有效。
- 定義一個閾值,當達到某個節點的實例個數小于閾值時就可以停止決策樹的生長
- 定義一個閾值,通過計算每次擴張對系統性能的增益,并比較增益值與該閾值大小來決定是否停止決策樹的生長
后剪枝:是在決策樹生長完成之后再進行剪枝的過程,后剪枝主要有錯誤率降低剪枝(REP)、悲觀剪枝(PEP)和代價復雜度剪枝(CCP)三種方法。
1、REP-錯誤率降低剪枝
顧名思義,該剪枝方法是根據錯誤率進行剪枝,如果一棵子樹修剪前后錯誤率沒有下降,就可以認為該子樹是可以修剪的。
REP剪枝需要用新的數據集,原因是如果用舊的數據集,不可能出現分裂后的錯誤率比分裂前錯誤率要高的情況。由于使用新的數據集沒有參與決策樹的構建,能夠降低訓練數據的影響,降低過擬合的程度,提高預測的準確率。
2、PEP-悲觀剪枝
悲觀剪枝認為如果決策樹的精度在剪枝前后沒有影響的話,則進行剪枝。怎樣才算是沒有影響?如果剪枝后的誤差小于剪枝前經度的上限,則說明剪枝后的效果與剪枝前的效果一致,此時要進行剪枝。
進行剪枝必須滿足以下條件:
其中:
表示剪枝前子樹的誤差
表示剪枝后節點的誤差
兩者的計算公式如下所示:
,其中
,其中N為子樹的數據量。
上述公式中,0.5表示修正因子。由于子節點是父節點進行分裂的結果,從理論上講,子節點的分類效果總比父節點好,分類的誤差更小,如果單純通過比較子節點和父節點的誤差進行剪枝就完全沒有意義了,因此對節點的誤差計算方法進行修正。修正的方法是給每一個節點都加上誤差修正因子0.5,在計算誤差的時候,子節點由于加上了誤差修正因子,就無法保證總誤差低于父節點。
例如:
所以應該進行剪枝。
3、CCP-代價復雜度剪枝
代價復雜度選擇節點表面誤差率增益值最小的非葉子節點,刪除該非葉子節點的左右子節點,若有多個非葉子節點的表面誤差率增益值相同小,則選擇非葉子節點中子節點數最多的非葉子節點進行剪枝。
CART算法實現
數據集為例子中的數據。
需要進行數據預處理,將文字設置為數字形式。其結果如下圖所示:
導包:
from sklearn import tree import numpy as np載入數據:
data=np.genfromtxt("cart.csv",delimiter=",") x_data=data[1:,1:-1] y_data=data[1:,-1]構建決策樹:
model=tree.DecisionTreeClassifier() #不傳遞參數的話,默認就是CART算法 #輸入數據建立模型 model.fit(x_data,y_data)導出決策樹:
import graphviz dot_data=tree.export_graphviz(model,out_file=None,feature_names=['house_yes','house_no','single','married','divorced','income'],class_names=['no','yes'],filled=True,rounded=True,special_characters=True) graph=graphviz.Source(dot_data) graph.render('cart')其結果如下圖所示:
參考:https://www.cnblogs.com/mdumpling/p/8087396.html
參考:https://zhuanlan.zhihu.com/p/267368825
參考視頻:https://www.bilibili.com/video/BV1Rt411q7WJ?p=47&vd_source=166e4ef02c5e9ffa3f01c2406aec1508
總結
以上是生活随笔為你收集整理的机器学习笔记-决策树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker部署zabbix6.2.7+
- 下一篇: 揭秘!一篇文章为你全盘剖析健身房管理软件