本文实例讲述了Python机器学习之决策树算法。分享给大家供大家参考,具体如下:

决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树。决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,机器学习算法最终将使用这些从数据集中创造的规则。决策树的优点为:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。缺点为:可能产生过度匹配的问题。决策树适于处理离散型和连续型的数据。

在决策树中最重要的就是如何选取用于划分的特征

在算法中一般选用ID3,D3算法的核心问题是选取在树的每个节点要测试的特征或者属性,希望选择的是最有助于分类实例的属性。如何定量地衡量一个属性的价值呢?这里需要引入熵和信息增益的概念。熵是信息论中广泛使用的一个度量标准,刻画了任意样本集的纯度。

假设有10个训练样本,其中6个的分类标签为yes,4个的分类标签为no,那熵是多少呢?在该例子中,分类的数目为2(yes,no),yes的概率为0.6,no的概率为0.4,则熵为 :

其中value(A)是属性A所有可能值的集合,

是S中属性A的值为v的子集,即

。上述公式的第一项为原集合S的熵,第二项是用A分类S后熵的期望值,该项描述的期望熵就是每个子集的熵的加权和,权值为属于的样本占原始样本S的比例

。所以Gain(S, A)是由于知道属性A的值而导致的期望熵减少。

完整的代码:

# -*- coding: cp936 -*-

from numpy import *

import operator

from math import log

import operator

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

def calcShannonEnt(dataSet):

numEntries = len(dataSet)

labelCounts = {} # a dictionary for feature

for featVec in dataSet:

currentLabel = featVec[-1]

if currentLabel not in labelCounts.keys():

labelCounts[currentLabel] = 0

labelCounts[currentLabel] += 1

shannonEnt = 0.0

for key in labelCounts:

#print(key)

#print(labelCounts[key])

prob = float(labelCounts[key])/numEntries

#print(prob)

shannonEnt -= prob * log(prob,2)

return shannonEnt

#按照给定的特征划分数据集

#根据axis等于value的特征将数据提出

def splitDataSet(dataSet, axis, value):

retDataSet = []

for featVec in dataSet:

if featVec[axis] == value:

reducedFeatVec = featVec[:axis]

reducedFeatVec.extend(featVec[axis+1:])

retDataSet.append(reducedFeatVec)

return retDataSet

#选取特征,划分数据集,计算得出最好的划分数据集的特征

def chooseBestFeatureToSplit(dataSet):

numFeatures = len(dataSet[0]) - 1 #剩下的是特征的个数

baseEntropy = calcShannonEnt(dataSet)#计算数据集的熵,放到baseEntropy中

bestInfoGain = 0.0;bestFeature = -1 #初始化熵增益

for i in range(numFeatures):

featList = [example[i] for example in dataSet] #featList存储对应特征所有可能得取值

uniqueVals = set(featList)

newEntropy = 0.0

for value in uniqueVals:#下面是计算每种划分方式的信息熵,特征i个,每个特征value个值

subDataSet = splitDataSet(dataSet, i ,value)

prob = len(subDataSet)/float(len(dataSet)) #特征样本在总样本中的权重

newEntropy = prob * calcShannonEnt(subDataSet)

infoGain = baseEntropy - newEntropy #计算i个特征的信息熵

#print(i)

#print(infoGain)

if(infoGain > bestInfoGain):

bestInfoGain = infoGain

bestFeature = i

return bestFeature

#如上面是决策树所有的功能模块

#得到原始数据集之后基于最好的属性值进行划分,每一次划分之后传递到树分支的下一个节点

#递归结束的条件是程序遍历完成所有的数据集属性,或者是每一个分支下的所有实例都具有相同的分类

#如果所有实例具有相同的分类,则得到一个叶子节点或者终止快

#如果所有属性都已经被处理,但是类标签依然不是确定的,那么采用多数投票的方式

#返回出现次数最多的分类名称

def majorityCnt(classList):

classCount = {}

for vote in classList:

if vote not in classCount.keys():classCount[vote] = 0

classCount[vote] += 1

sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)

return sortedClassCount[0][0]

#创建决策树

def createTree(dataSet,labels):

classList = [example[-1] for example in dataSet]#将最后一行的数据放到classList中,所有的类别的值

if classList.count(classList[0]) == len(classList): #类别完全相同不需要再划分

return classList[0]

if len(dataSet[0]) == 1:#这里为什么是1呢?就是说特征数为1的时候

return majorityCnt(classList)#就返回这个特征就行了,因为就这一个特征

bestFeat = chooseBestFeatureToSplit(dataSet)

print('the bestFeatue in creating is :')

print(bestFeat)

bestFeatLabel = labels[bestFeat]#运行结果'no surfacing'

myTree = {bestFeatLabel:{}}#嵌套字典,目前value是一个空字典

del(labels[bestFeat])

featValues = [example[bestFeat] for example in dataSet]#第0个特征对应的取值

uniqueVals = set(featValues)

for value in uniqueVals: #根据当前特征值的取值进行下一级的划分

subLabels = labels[:]

myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)

return myTree

#对上面简单的数据进行小测试

def testTree1():

myDat,labels=createDataSet()

val = calcShannonEnt(myDat)

print 'The classify accuracy is: %.2f%%' % val

retDataSet1 = splitDataSet(myDat,0,1)

print (myDat)

print(retDataSet1)

retDataSet0 = splitDataSet(myDat,0,0)

print (myDat)

print(retDataSet0)

bestfeature = chooseBestFeatureToSplit(myDat)

print('the bestFeatue is :')

print(bestfeature)

tree = createTree(myDat,labels)

print(tree)

对应的结果是:

>>> import TREE

>>> TREE.testTree1()

The classify accuracy is: 0.97%

[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]

[[1, 'yes'], [1, 'yes'], [0, 'no']]

[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]

[[1, 'no'], [1, 'no']]

the bestFeatue is :

0

the bestFeatue in creating is :

0

the bestFeatue in creating is :

0

{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

最好再增加使用决策树的分类函数

同时因为构建决策树是非常耗时间的,因为最好是将构建好的树通过 python 的 pickle 序列化对象,将对象保存在磁盘上,等到需要用的时候再读出

def classify(inputTree,featLabels,testVec):

firstStr = inputTree.keys()[0]

secondDict = inputTree[firstStr]

featIndex = featLabels.index(firstStr)

key = testVec[featIndex]

valueOfFeat = secondDict[key]

if isinstance(valueOfFeat, dict):

classLabel = classify(valueOfFeat, featLabels, testVec)

else: classLabel = valueOfFeat

return classLabel

def storeTree(inputTree,filename):

import pickle

fw = open(filename,'w')

pickle.dump(inputTree,fw)

fw.close()

def grabTree(filename):

import pickle

fr = open(filename)

return pickle.load(fr)

希望本文所述对大家Python程序设计有所帮助。

python决策树实例_Python机器学习之决策树算法实例详解相关推荐

  1. 机器学习之决策树算法原理详解

    微信公众号:数据挖掘与分析学习 在本文中,我们将讨论决策树背后的理论和工作原理. 我们将看到该算法的一些数学知识,即熵和信息增益. 1.动机 假设我们有以下两个类别的图,由黑色圆圈和蓝色方块表示. 是 ...

  2. python 自动化发送邮件_Python自动化必备发送邮件报告脚本详解

    #!/usr/bin/python3 # -*- coding:UTF-8 -*- import smtplib #smtplib库主要用来连接第三方smtp库,用来发邮件 from email.mi ...

  3. python决策树原理_Python机器学习决策树算法 | kTWO-个人博客

    ps:这篇文章主要来介绍决策树算法的基本原理和概念.具体的Python应用将在下一篇文章中介绍. 1.什么是决策树? 决策树(decision tree)也叫做判定树,类似于流程图的结构,每个内部的结 ...

  4. python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  5. python xlrd课程_python中xlrd模块的使用详解

    一.xlrd的安装 打开cmd输入pip install xlrd安装完成即可 二.xlrd模块的使用 下面以这个工作簿为例 1.导入模块 import xlrd 2.打开工作薄 # filename ...

  6. python计算定积分_python编程通过蒙特卡洛法计算定积分详解

    这篇文章主要介绍了python编程通过蒙特卡洛法计算定积分详解,具有一定借鉴价值,需要的朋友可以参考下. 想当初,考研的时候要是知道有这么个好东西,计算定积分...开玩笑,那时候计算定积分根本没有这么 ...

  7. 如何在python制作计算器_Python简易计算器制作方法代码详解

    主要用到的工具是Python中的Tkinter库 比较简单 直接上图形界面和代码 引用Tkinter库 from tkinter import * 建立主窗口对象 window=Tk() #设置窗口对 ...

  8. python echarts接口_python绘图pyecharts+pandas的使用详解

    pyecharts介绍 pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.用 Echarts 生成的图可视化效果非常棒 为避免绘制缺 ...

  9. python linspace函数_python的range和linspace使用详解

    在python中要产生一个数字序列,最快的方法就是使用range和linspace函数,但是这两者不太一样,但总的来说实现的效果是一致的,都能获取一个数字序列. range range一看其名就知道是 ...

最新文章

  1. c语言周传生教材答案,C语言程序设计与实践(普通高等教育“十二五”规划教材)...
  2. System BIOS设置
  3. 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)
  4. python后端面试题
  5. python入门经典100例-Python3经典100例(Python3入门习题) 含答案 doc版
  6. Postgresql中存储过程(函数)调用存储过程(函数)时应用注意的问题
  7. 使用jupyter notebook打开.ipynb文件
  8. 微星笔记本每次都进bios
  9. 什么是uclinux?
  10. 邯郸三中高考2021成绩查询,邯郸2021年中考统考成绩
  11. 关于c4d默认渲染器的玻璃材质调试
  12. 怎么卸载虚幻4_专访Epic Games:虚幻引擎5离手游近在咫尺,中小团队也能很快上手...
  13. react事件 组件设计传参使用
  14. 南卫理公会大学计算机科学,南卫理公会大学计算机科学与工程硕士
  15. 数据结构——行车路线规划(大路小路)
  16. 北航图像信号处理matlab实验,北航动态建模实验报告(matlab界面、动画).pdf
  17. 基于matlab的相干信号的doa 估计,基于空间平滑MUSIC算法的相干信号DOA估计(1)
  18. XMCTF内部赛 part1
  19. 12月8日(第八天)
  20. java飞秋源码,feiQiu 实现飞秋系统,和qq 类似,能够 客户端和服务器端 Java Develop 259万源代码下载- www.pudn.com...

热门文章

  1. Kawasaki川崎机械手c#二次开发dll
  2. WEB前端程序员找工作跳槽简历该怎么写?
  3. 信息抽取在知识图谱构建中的实践与应用
  4. 从质检员到游戏测试工程师,我如何拿下月薪8k+的工作
  5. 【计算机网络】谢希仁笔记 物理层
  6. 亚成微PD65W 100W快充解决方案RM6601SN规格书集成高压启动X电容放电功能氮化镓GaN驱动控制器外围精简调试方便
  7. 牙齿修复大致可分为哪几类?
  8. matlab实验大纲,matlab实验教学大纲.doc
  9. Matlab使用注意事项及遇到的问题
  10. PerformSelector 和 NSInvocation