目录

  • 前置信息
    • 1、决策树
    • 2、样本数据
  • 决策树分类算法
    • 1、构建数据集
    • 2、数据集信息熵
    • 3、信息增益
    • 4、构造决策树
    • 5、实例化构造决策树
    • 6、测试样本分类
  • 后置信息:绘制决策树代码

前置信息

1、决策树

决策树是一种十分常用的分类算法,属于监督学习;也就是给出一批样本,每个样本都有一组属性和一个分类结果。算法通过学习这些样本,得到一个决策树,这个决策树能够对新的数据给出合适的分类

2、样本数据

假设现有用户14名,其个人属性及是否购买某一产品的数据如下:

编号 年龄 收入范围 工作性质 信用评级 购买决策
01 <30 不稳定 较差
02 <30 不稳定
03 30-40 不稳定 较差
04 >40 中等 不稳定 较差
05 >40 稳定 较差
06 >40 稳定
07 30-40 稳定
08 <30 中等 不稳定 较差
09 <30 稳定 较差
10 >40 中等 稳定 较差
11 <30 中等 稳定
12 30-40 中等 不稳定
13 30-40 稳定 较差
14 >40 中等 不稳定

决策树分类算法

1、构建数据集

为了方便处理,对模拟数据按以下规则转换为数值型列表数据:
年龄:<30赋值为0;30-40赋值为1;>40赋值为2
收入:低为0;中为1;高为2
工作性质:不稳定为0;稳定为1
信用评级:差为0;好为1

#创建数据集
def createdataset():dataSet=[[0,2,0,0,'N'],[0,2,0,1,'N'],[1,2,0,0,'Y'],[2,1,0,0,'Y'],[2,0,1,0,'Y'],[2,0,1,1,'N'],[1,0,1,1,'Y'],[0,1,0,0,'N'],[0,0,1,0,'Y'],[2,1,1,0,'Y'],[0,1,1,1,'Y'],[1,1,0,1,'Y'],[1,2,1,0,'Y'],[2,1,0,1,'N'],]labels=['age','income','job','credit']return dataSet,labels

调用函数,可获得数据:

ds1,lab = createdataset()
print(ds1)
print(lab)

[[0, 2, 0, 0, ‘N’], [0, 2, 0, 1, ‘N’], [1, 2, 0, 0, ‘Y’], [2, 1, 0, 0, ‘Y’], [2, 0, 1, 0, ‘Y’], [2, 0, 1, 1, ‘N’], [1, 0, 1, 1, ‘Y’], [0, 1, 0, 0, ‘N’], [0, 0, 1, 0, ‘Y’], [2, 1, 1, 0, ‘Y’], [0, 1, 1, 1, ‘Y’], [1, 1, 0, 1, ‘Y’], [1, 2, 1, 0, ‘Y’], [2, 1, 0, 1, ‘N’]]
[‘age’, ‘income’, ‘job’, ‘credit’]

2、数据集信息熵

信息熵也称为香农熵,是随机变量的期望。度量信息的不确定程度。信息的熵越大,信息就越不容易搞清楚。处理信息就是为了把信息搞清楚,就是熵减少的过程。

def calcShannonEnt(dataSet):numEntries = len(dataSet)labelCounts = {}for featVec in dataSet:currentLabel = featVec[-1]if currentLabel not in labelCounts.keys():labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1            shannonEnt = 0.0for key in labelCounts:prob = float(labelCounts[key])/numEntriesshannonEnt -= prob*log(prob,2)return shannonEnt

样本数据信息熵:

shan = calcShannonEnt(ds1)
print(shan)

0.9402859586706309

3、信息增益

信息增益:用于度量属性A降低样本集合X熵的贡献大小。信息增益越大,越适于对X分类。

def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0])-1baseEntropy = calcShannonEnt(dataSet)bestInfoGain = 0.0;bestFeature = -1for i in range(numFeatures):featList = [example[i] for example in dataSet]uniqueVals = set(featList)newEntroy = 0.0for value in uniqueVals:subDataSet = splitDataSet(dataSet, i, value)prop = len(subDataSet)/float(len(dataSet))newEntroy += prop * calcShannonEnt(subDataSet)infoGain = baseEntropy - newEntroyif(infoGain > bestInfoGain):bestInfoGain = infoGainbestFeature = i    return bestFeature

以上代码实现了基于信息熵增益的ID3决策树学习算法。其核心逻辑原理是:依次选取属性集中的每一个属性,将样本集按照此属性的取值分割为若干个子集;对这些子集计算信息熵,其与样本的信息熵的差,即为按照此属性分割的信息熵增益;找出所有增益中最大的那一个对应的属性,就是用于分割样本集的属性。

计算样本最佳的分割样本属性,结果显示为第0列,即age属性:

col = chooseBestFeatureToSplit(ds1)
col

0

4、构造决策树

def majorityCnt(classList):classCount = {}for vote in classList:if vote not in classCount.keys():classCount[vote] = 0classCount[vote] += 1sortedClassCount = sorted(classList.iteritems(),key=operator.itemgetter(1),reverse=True)#利用operator操作键值排序字典return sortedClassCount[0][0]#创建树的函数
def createTree(dataSet,labels):classList = [example[-1] for example in dataSet]if classList.count(classList[0]) == len(classList):return classList[0]if len(dataSet[0]) == 1:return majorityCnt(classList)bestFeat = chooseBestFeatureToSplit(dataSet)bestFeatLabel = labels[bestFeat]myTree = {bestFeatLabel:{}}del(labels[bestFeat])featValues = [example[bestFeat] for example in dataSet]uniqueVals = set(featValues)for value in uniqueVals:subLabels = labels[:]myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)return myTree

majorityCnt函数用于处理一下情况:最终的理想决策树应该沿着决策分支到达最底端时,所有的样本应该都是相同的分类结果。但是真实样本中难免会出现所有属性一致但分类结果不一样的情况,此时majorityCnt将这类样本的分类标签都调整为出现次数最多的那一个分类结果。

createTree是核心任务函数,它对所有的属性依次调用ID3信息熵增益算法进行计算处理,最终生成决策树。

5、实例化构造决策树

利用样本数据构造决策树:

Tree = createTree(ds1, lab)
print("样本数据决策树:")
print(Tree)

样本数据决策树:
{‘age’: {0: {‘job’: {0: ‘N’, 1: ‘Y’}},
1: ‘Y’,
2: {‘credit’: {0: ‘Y’, 1: ‘N’}}}}

6、测试样本分类

给出一个新的用户信息,判断ta是否购买某一产品:

年龄 收入范围 工作性质 信用评级
<30 稳定
<30 不稳定
def classify(inputtree,featlabels,testvec):firststr = list(inputtree.keys())[0]seconddict = inputtree[firststr]featindex = featlabels.index(firststr)for key in seconddict.keys():if testvec[featindex]==key:if type(seconddict[key]).__name__=='dict':classlabel=classify(seconddict[key],featlabels,testvec)else:classlabel=seconddict[key]return classlabel
labels=['age','income','job','credit']
tsvec=[0,0,1,1]
print('result:',classify(Tree,labels,tsvec))
tsvec1=[0,2,0,1]
print('result1:',classify(Tree,labels,tsvec1))

result: Y
result1: N

后置信息:绘制决策树代码

以下代码用于绘制决策树图形,非决策树算法重点,有兴趣可参考学习

import matplotlib.pyplot as pltdecisionNode = dict(boxstyle="sawtooth", fc="0.8")
leafNode = dict(boxstyle="round4", fc="0.8")
arrow_args = dict(arrowstyle="<-")#获取叶节点的数目
def getNumLeafs(myTree):numLeafs = 0firstStr = list(myTree.keys())[0]secondDict = myTree[firstStr]for key in secondDict.keys():if type(secondDict[key]).__name__=='dict':#测试节点的数据是否为字典,以此判断是否为叶节点numLeafs += getNumLeafs(secondDict[key])else:   numLeafs +=1return numLeafs#获取树的层数
def getTreeDepth(myTree):maxDepth = 0firstStr = 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 = 1if thisDepth > maxDepth: maxDepth = thisDepthreturn maxDepth#绘制节点
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 plotMidText(cntrPt, parentPt, txtString):xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0]yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1]createPlot.ax1.text(xMid, yMid, txtString, va="center", ha="center", rotation=30)#绘制树结构
def plotTree(myTree, parentPt, nodeTxt):#if the first key tells you what feat was split onnumLeafs = getNumLeafs(myTree)  #this determines the x width of this treedepth = getTreeDepth(myTree)firstStr = list(myTree.keys())[0]     #the text label for this node should be thiscntrPt = (plotTree.xOff + (1.0 + float(numLeafs))/2.0/plotTree.totalW, plotTree.yOff)plotMidText(cntrPt, parentPt, nodeTxt)plotNode(firstStr, cntrPt, parentPt, decisionNode)secondDict = myTree[firstStr]plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalDfor key in secondDict.keys():if type(secondDict[key]).__name__=='dict':#test to see if the nodes are dictonaires, if not they are leaf nodes   plotTree(secondDict[key],cntrPt,str(key))        #recursionelse:   #it's a leaf node print the leaf nodeplotTree.xOff = plotTree.xOff + 1.0/plotTree.totalWplotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode)plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key))plotTree.yOff = plotTree.yOff + 1.0/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)    #no ticks#createPlot.ax1 = plt.subplot(111, frameon=False) #ticks for demo puropses 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.savefig('决策树.png',dpi=300,bbox_inches='tight')plt.show()

【python代码实现】决策树分类算法相关推荐

  1. python代码实现决策树分类

    0. 前言 上一篇博客对决策树算法的思想作了描述,也详细写了如何构造一棵决策树.现在希望用python代码来实现它.此处先调用机器学习中的算法库来实现. 2. python代码实现决策树(决策树分类器 ...

  2. knn算法python代码_K-最近邻分类算法(KNN)及python实现

    一.引入 问题:确定绿色圆是属于红色三角形.还是蓝色正方形? KNN的思想: 从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆 ...

  3. 数据挖掘学习——决策树分类算法理论(包含Iris实战)

    目录 1.决策树分类算法概述及相关公式 (1)基本思路 (2)熵公式 (3)基尼(Gini)系数公式 2.ID3算法 3.C4.5算法 4.CART算法 5.各类决策树分类算法比较 6.过拟合与决策树 ...

  4. 【机器学习原理】决策树分类算法

    上一篇:朴素贝叶斯分类算法 文章目录 一.决策树分类 1. if - else 2. 如何种植一棵有灵魂的"树" 3. 决策条件的选择艺术 节点纯度的度量规则 纯度的度量方法 4. ...

  5. python决策树分类案例_python实现决策树分类算法

    本文实例为大家分享了python实现决策树分类算法的具体代码,供大家参考,具体内容如下 1.概述 决策树(decision tree)--是一种被广泛使用的分类算法. 相比贝叶斯算法,决策树的优势在于 ...

  6. python决策树分类案例_银行产品销售案例与决策树分类算法

    案例数据集来源于UCI网站.案例是基于一家葡萄牙金融机构的电话销售数据.营销目标是确认客户是否愿意认购银行发行的一款定期储蓄产品.该数据集内包含41188条记录和20个特征变量,和1个分类变量.变量包 ...

  7. 机器学习-决策树分类算法与应用

    1. 决策树分类算法原理 1.1 概述 决策树(decision tree)--是一种被广泛使用的分类算法. 相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置 在实际应用中,对于探 ...

  8. 决策树分类算法(if-else原理)

    决策树分类算法(if-else原理) 在本节我们将介绍"机器学习"中的"明星"算法"决策树算法".决策树算法在"决策"领 ...

  9. 大数据【企业级360°全方位用户画像】之USG模型和决策树分类算法

    在之前的一篇博客<大数据[企业级360°全方位用户画像]之RFM模型和KMeans聚类算法>中,博主为大家带来了KMeans聚类算法的介绍.并在之后,基于不同的模型开发标签,例如RFM,R ...

最新文章

  1. MVC框架内容-视图
  2. jws webservice 跳过https认证_基于OAuth2的OIDC (OpenId Connect)身份认证
  3. android复用字符串文件夹,如何从Android Studio中的值xml字符串文件夹更改字体
  4. colormap保存 matlab_matlab中自定义colormap的保存与调用
  5. 盘点FOF基金投资运作中踩过的那些大坑……
  6. kali foremost 分离文件_只需 1 分钟,这个网站用 AI 分离歌曲的人声、伴奏和乐器声...
  7. GIT可视化工具 代码上传工具
  8. 【Python数据分析】数据挖掘建模——分类与预测算法评价(含ROC曲线、F1等指标的解释)
  9. 君威u0073故障码解决_U0073故障码_U0073故障码是什么故障、排除方法、怎么消除_车主指南...
  10. codeBook背景建模
  11. CSS Sprite、CSS雪碧图应用实例
  12. 一不小心画了 24 张图剖析计网应用层协议!
  13. 出行即服务MaaS精华主题汇总(更新至20220827)
  14. BZOJ 3772 精神污染 主席树+欧拉序
  15. PyTorch中通过torch.save保存模型和torch.load加载模型介绍
  16. 【跨境电商】5款Shopify应用,辅助你的在线商店运营
  17. [HPM] Error occurred while trying to proxy request /login/account from localhost:8000 to localhost:8
  18. 使用main方法启动spring程序
  19. 2020年厦门市技能大赛-网络搭建与应用竞赛-正式赛卷(一)技能要求(附脚本配置)
  20. J2EE里面的'2'是什么意思

热门文章

  1. 大学 数据分析 课程设计
  2. python爬虫知乎代码_python爬虫知乎的简单代码实现
  3. 美容院系统如何创新运营方案?
  4. 为何数据中心市场现在如此火?
  5. 财税行业拓客的10个经典方法
  6. 2014年系统架构师考试题详解
  7. 全民飞机大战Java(搬)
  8. 阿里前端技术岗发布+内部面试题手册(含P5-P7)
  9. [Python] ConnectionResetError: [Errno 104] Connection reset by peer
  10. Ad Hoc Networks TOPIC FOUR <MANET Routing>【Personal Notes】