
機器學習中,決策樹是一個預測模型;他代表的是對象屬性與對象值之間的一種映射關系。樹中每個節點表示某個對象,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有復數輸出,可以建立獨立的決策樹以處理不同輸出。 數據挖掘中決策樹是一種經常要用到的技術,可以用于分析數據,同樣也可以用來作預測。
決策樹,其結構和樹非常相似,因此得其名決策樹。決策樹具有樹形的結構,其中每個內部節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別。
例如:
按照豆腐腦的冷熱、甜咸和是否含有大蒜構建決策樹,對其屬性的測試,在最終的葉節點決定該豆腐腦吃還是不吃。
分類樹(決策樹)是一種十分常用的將決策樹應用于分類的機器學習方法。他是一種監管學習,所謂監管學習就是給定一堆樣本,每個樣本都有一組屬性(特征)和一個類別(分類信息/目標),這些類別是事先確定的,那么通過學習得到一個分類器,這個分類器能夠對新出現的對象給出正確的分類。
其原理在于,每個決策樹都表述了一種樹型結構,它由它的分支來對該類型的對象依靠屬性進行分類。每個決策樹可以依靠對源數據庫的分割進行數據測試。這個過程可以遞歸式的對樹進行修剪。 當不能再進行分割或一個單獨的類可以被應用于某一分支時,遞歸過程就完成了。
機器學習中,決策樹是一個預測模型;他代表的是對象屬性與對象值之間的一種映射關系。樹中每個節點表示某個對象,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有復數輸出,可以建立獨立的決策樹以處理不同輸出。數據挖掘中決策樹是一種經常要用到的技術,可以用于分析數據,同樣也可以用來作預測。從數據產生決策樹的機器學習技術叫做決策樹學習, 通俗說就是決策樹。
目前常用的決策樹算法有ID3算法、改進的C4.5算法和CART算法。
決策樹的特點
1.多層次的決策樹形式易于理解;
2.只適用于標稱型數據,對連續性數據處理得不好;
2、ID3算法
ID3算法最早是由羅斯昆(J. Ross Quinlan)于1975年在悉尼大學提出的一種分類預測算法,算法以信息論為基礎,其核心是“信息熵”。ID3算法通過計算每個屬性的信息增益,認為信息增益高的是好屬性,每次劃分選取信息增益最高的屬性為劃分標準,重復這個過程,直至生成一個能完美分類訓練樣例的決策樹。
信息熵(Entropy):
,其中p(xi)是選擇i的概率。
熵越高,表示混合的數據越多。信息增益(Information Gain):
T是劃分之后的分支集合,p(t)是該分支集合在原本的父集合中出現的概率,H(t)是該子集合的信息熵。
3.ID3算法與決策樹的流程
(1)數據準備:需要對數值型數據進行離散化
(2)ID3算法構建決策樹:
如果數據集類別完全相同,則停止劃分
否則,繼續劃分決策樹:
計算信息熵和信息增益來選擇最好的數據集劃分方法;
劃分數據集
創建分支節點:
對每個分支進行判定是否類別相同,如果相同停止劃分,不同按照上述方法進行劃分。
二、Python算法實現
創建 trees.py文件,在其中創建構建決策樹的函數。
首先構建一組測試數據:
0. 構造函數createDataSet:
def createDataSet():
dataSet=[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
labels=['no surfacing','flippers']
return dataSet,labels
在Python控制臺測試構造函數
#測試下構造的數據Out[5]: ['no surfacing', 'flippers']
2.1 計算信息熵
from math import log
def calcShannonEnt(dataSet):
numEntries = len(dataSet) #nrows
#為所有的分類類目創建字典
labelCounts ={}
for featVec in dataSet:
currentLable=featVec[-1] #取得最后一列數據
if currentLable not in labelCounts.keys():
labelCounts[currentLable]=0
labelCounts[currentLable]+=1
#計算香農熵
shannonEnt=0.0
for key in labelCounts:
prob = float(labelCounts[key]) / numEntries
shannonEnt -= prob * log(prob, 2)
return shannonEnt
利用構造的數據測試calcShannonEnt:
#Python console
In [6]: trees.calcShannonEnt(myDat)
...:
Out[6]: 0.9709505944546686
2.2 按照最大信息增益劃分數據集
#定義按照某個特征進行劃分的函數splitDataSet在控制臺中測試這兩個函數:
#測試按照特征劃分數據集的函數Out[14]: 0
2.3 創建決策樹構造函數createTree
import operater以之前構造的測試數據為例,對決策樹構造函數進行測試,在python控制臺進行輸入:
#決策樹構造函數測試可以看到,最后生成的決策樹myTree是一個多層嵌套的字典。
2.4 決策樹運用于分類
#輸入三個變量(決策樹,屬性特征標簽,測試的數據)對決策樹分類函數進行測試:
In [29]: reload(trees)Out[35]: 'yes'
2.5 決策樹的存儲
如果每次都需要訓練樣本集來構建決策樹,費時費力,特別是數據很大的時候,每次重新構建決策樹浪費時間。因此可以將已經創建的決策樹(如字典形式)保存在硬盤上,需要使用的時候直接讀取就好。
(1)存儲函數
在工作目錄下存在一個名為’classifierStorage.txt’的txt文檔,該文檔 保存了myTree的決策樹信息,需要使用的時候直接調出使用。
三、使用Matplotlib繪制決策樹
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] #否則中文無法正常顯示
decisionNode=dict(boxstyle='sawtooth',fc='0.8') #決策點樣式
leafNode=dict(boxstyle='round4',fc='0.8') #葉節點樣式
arrow_args=dict(arrowstyle='<-') #箭頭樣式
def plotNode(nodeTxt,centerPt,parentPt,nodeType):
createPlot.ax1.annotate(nodeTxt,xy=parentPt,xycoords='axes fraction',
xytext=centerPt,textcoords='axes fraction',
va='center',ha='center',bbox=nodeType,arrowprops=arrow_args)
def createPlot():
fig=plt.figure(1,facecolor='white')
fig.clf()
createPlot.ax1=plt.subplot(111,frameon=False)
plotNode('決策節點',(0.5,0.1),(0.1,0.5),decisionNode)
plotNode('葉節點',(0.8,0.1),(0.3,0.8),leafNode)
plt.show()
#測試
#獲取葉節點數量(廣度)
def getNumLeafs(myTree):
numLeafs=0
firstStr=list(myTree.keys())[0]#'dict_keys' object does not support indexing
secondDict=myTree[firstStr]
for key in secondDict.keys():
if type(secondDict[key]).__name__=='dict':
numLeafs+=getNumLeafs(secondDict[key])
else:numLeafs+=1
return numLeafs
#獲取樹的深度的函數(深度)
def getTreeDepth(myTree):
maxDepth=0
firstStr=list(myTree.keys())[0]
secondDict=myTree[firstStr]
for key in secondDict.keys():
if type(secondDict[key]).__name__=='dict':
thisDepth=1+getTreeDepth(secondDict[key])
else: thisDepth=1
if thisDepth > maxDepth:
maxDepth=thisDepth
return maxDepth
#定義一個預先創建樹的函數
def retrieveTree(i):
listOfTrees=[{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}},
{'no surfacing': {0: 'no', 1: {'flippers': {0: {'head':{0:'no', 1: 'yes'}},1:'no'}}}}
]
return listOfTrees[i]
#定義在父子節點之間填充文本信息的函數
def plotMidText(cntrPt,parentPt,txtString):
xMid=(parentPt[0]-cntrPt[0])/2+cntrPt[0]
yMid=(parentPt[1]-cntrPt[1])/2+cntrPt[1]
createPlot.ax1.text(xMid,yMid,txtString)
#定義樹繪制的函數
def plotTree(myTree,parentPt,nodeTxt):
numLeafs=getNumLeafs(myTree)
depth=getTreeDepth(myTree)
firstStr=list(myTree.keys())[0]
cntrPt=(plotTree.xOff+(1.0+float(numLeafs))/2/plotTree.totalW,plotTree.yOff)
plotMidText(cntrPt,parentPt,nodeTxt)
plotNode(firstStr,cntrPt,parentPt,decisionNode)
secondDict=myTree[firstStr]
plotTree.yOff=plotTree.yOff -1/plotTree.totalD
for key in secondDict.keys():
if type(secondDict[key]).__name__=='dict':
plotTree(secondDict[key],cntrPt,str(key))
else:
plotTree.xOff=plotTree.xOff+1.0/plotTree.totalW
plotNode(secondDict[key],(plotTree.xOff,plotTree.yOff),cntrPt,leafNode)
plotMidText((plotTree.xOff,plotTree.yOff),cntrPt,str(key))
plotTree.yOff=plotTree.yOff+1/plotTree.totalD
#定義主函數,來調用其它函數
def createPlot(inTree):
fig=plt.figure(1,facecolor='white')
fig.clf()
axprops=dict(xticks=[],yticks=[])
createPlot.ax1=plt.subplot(111,frameon=False,**axprops)
plotTree.totalW=float(getNumLeafs(inTree))
plotTree.totalD=float(getTreeDepth(inTree))
plotTree.xOff=-0.5/plotTree.totalW;plotTree.yOff=1.0;
plotTree(inTree,(0.5,1.0),'')
plt.show()
對繪制決策樹圖的函數進行測試(控制臺):
In [26]: reload(treeplotter)
...:
Out[26]: <module 'treeplotter' from 'G:\\Workspaces\\MachineLearning\\treeplotter.py'>
In [27]: myTree=treeplotter.retrieveTree(0)
...:
In [28]: treeplotter.createPlot(myTree)
...:
得到決策樹圖:
隱形眼鏡的數據集包含了患者的四個屬性age,prescript,stigmatic,tearRate,利用這些數據構建決策樹,并通過Matplotlib繪制出決策樹的樹狀圖。
附lenses.txt數據:
得到圖
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25