Python 决策树的构造
上一节我们学习knn,kNN的最大缺点就是无法给出数据的内在含义,而使用决策树处理分类问题,优势就在于数据形式非常容易理解。
决策树的算法有很多,有CART、ID3和C4.5等,其中ID3和C4.5都是基于信息熵的,也是我们今天的学习内容,主要是根据通过信息熵划分数据集,再进入递归构造决策树的过程。
1. 信息熵
熵最初被用在热力学方面的,由热力学第二定律,熵是用来对一个系统可以达到的状态数的一个度量,能达到的状态数越多熵越大。香农1948年的一篇论文《A Mathematical Theory of Communication》提出了信息熵的概念,此后信息论也被作为一门单独的学科。
信息熵是用来衡量一个随机变量出现的期望值,一个变量的信息熵越大,那么他出现的各种情况也就越多。信息熵越小,说明信息量越小。
对于信息的定义,可以这样理解,如果待分类的事务划分在多个分类之中,则符号xi的信息定义为
I(xi) = -log2p(xi) 其中p(xi) 是选择该分类的概率
为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值,通过下面的公式可得:
,其中n是分类的数目
2. 计算信息熵
这里有个小例子,通过2个特征:不浮出水面是否可以生存,是否有脚蹼,来判断是否属于鱼类。其中‘1’表示是,‘0’表示否
| 不浮出水面是否可以生存 | 是否有脚蹼 | 属于鱼类 |
| 1 | 1 | 1 |
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 1 | 0 |
使用python实现简单计算信息熵,程序如下:
#-*- coding:utf-8 -*-
from math import log #创建简单数据集
def creatDataset():
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 = {}
for vec in dataSet:
currentLabel = vec[-1]
if currentLabel not in labelCounts.keys(): #为所有可能的分类建立字典
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob,2)
return shannonEnt #简单测试
myDat,labels = creatDataset()
print myDat
print calcShannonEnt(myDat)
测试结果如下:
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
0.970950594455
得到熵之后,我们就可以按照获取最大信息熵的方法来划分数据集。
3. 划分数据集
划分的方法是:对每个特征划分数据集的结果计算一次信息熵,然后判断按照哪个特征划分数据集是最好的划分方式。
定义函数splitDataset(dataSet,axis,value)来将数据划分,其中axis表示划分数据集的特征(比如说"是否有脚蹼"),value表示特征的值(“有脚蹼”还是“无脚蹼”)
#按照给定的特征划分数据集
def splitDataset(dataSet,axis,value):
retDataset = [] #符合特征的数据
for vec in dataSet:
if vec[axis] == value: #数据特征符合要求
reducedVec = vec[:axis] #提取该数据的剩余特征
reducedVec.extend(vec[axis+1:]) #将两列表合成一个列表
reDataset.append(reducedVec)
return reDataset
接下里,我们需遍历整个数据集,循环计算香农熵和splitDataset()函数,找到最好的特征划分方式。
思路:计算原始信息熵,然后对每个特征值(去重)划分一次数据集,计算数据集的新熵值,并对所有唯一特征值得到的熵求和,期望是找到最好的信息增益,也即是熵的减少量最大,最后返回最好特征划分的索引值。
#选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1 #特征数
baseEntropy = calcShannonEnt(dataSet) #计算原始熵
bestInfoGain = 0.0
bestFeature = -1
for i in xrange(numFeatures):
featList = [eg[i] for eg in dataSet] #分类标签列表
uniqueVals = set(featList) #构建集合去重
newEntropy = 0.0
#计算每种划分方式的信息熵
for value in uniqueVals:
subDataSet = splitDataset(dataSet,i,value)
prob = len(subDataSet)/float(len(dataSet)) #出现比例
newEntropy += prob * calcShannonEnt(subDataSet)
#计算最好的信息增益
infoGain = baseEntropy - newEntropy
if (infoGain > bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature
4. 递归构造决策树
Python 决策树的构造的更多相关文章
- Python决策树可视化:GraphViz's executables not found的解决方法
参考文献: [1]Python决策树可视化:GraphViz's executables not found的解决方法
- Python——决策树实战:california房价预测
Python——决策树实战:california房价预测 编译环境:Anaconda.Jupyter Notebook 首先,导入模块: import pandas as pd import matp ...
- Ubuntu 下一个 vim 建立python 周围环境 构造
于Windows通过使用各种现成的工具使用,去Linux下一个,没有一个关于线索--总之google有些人的经验,折腾来折腾,开发环境也算是一个好工作. 1. 安装完成vim # apt-get in ...
- 机器学习之路: python 决策树分类DecisionTreeClassifier 预测泰坦尼克号乘客是否幸存
使用python3 学习了决策树分类器的api 涉及到 特征的提取,数据类型保留,分类类型抽取出来新的类型 需要网上下载数据集,我把他们下载到了本地, 可以到我的git下载代码和数据集: https: ...
- python md5 请求 构造
-----------------md5加密的方法:---------------------------------- import hashlib m = hashlib.md5() ...
- python 决策树
RID age income student credit_rating Class:buys_computer 1 youth high no fair no 2 youth high no exc ...
- 我的spark python 决策树实例
from numpy import array from pyspark.mllib.regression import LabeledPoint from pyspark.mllib.tree im ...
- Python—使用列表构造队列数据结构
队列的概念 只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表:进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列):队列具有先进先出(FIFO)的特性. # _*_ ...
- Python—使用列表构造栈数据结构
class Stack(object): """ 使用列表实现栈 """ def __init__(self): self.stack = ...
随机推荐
- Linux 日常命令
命令 介绍说明 pwd 打印出当前所在目录 mkdir 创建一个目录 rmdir 删除一个目录 rm 删除文件或目录 -r:删除目录时必须加上 cp 复制一个文件或目录 -r:复制 ...
- 小白菜初探nodejs
记得大四那年实习的时候出去找工作,就常常听见大家说node.从那以后,悄然埋下了一颗学习nodejs的心.不过由于基础太薄弱,一直没有学习.加之工作上没有相关应用,就一直搁置到现在. 年会的时候,老大 ...
- Android 签名工具 shell脚本
signApk.sh #!/bin/bash #$1 signed and unaligned apk #$2 unsigned apk #$3 aligned apk #./signApk.sh t ...
- 解决float浮动带来的父元素高度没有的问题---清除浮动
float的特性 : 1:使元素block块级化: 2:破坏性造成的紧密排列特性. 基于以上的特性,使得我们通常把浮动用来布局,带来的问题是,容易出问题,重用性不行,ie6-的版本下很多问题,因为它是 ...
- 程序设计入门——C语言 第4周编程练习 1 素数和(5分)
题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推. 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的 ...
- HTML5 十大新特性(一)——语义标签
说语义标签前先来理解下什么叫语义化,当下html是靠div+css来铸造页面的整体框架和结构的,通篇大量的div可读性极低,因此诞生了这些特殊的标签,简单地说就是见名知义,使页面更清晰,方便维护和开发 ...
- 7 -- Spring的基本用法 -- 7...
7.7 创建Bean的3种方式 ① 调用构造器创建Bean. ② 调用静态工厂方法创建Bean. ③ 调用实例工厂方法创建Bean. 7.7.1 使用构造器创建Bean实例. 使用构造器来创建Bean ...
- 用python的BeautifulSoup分析html 【转】
原地址:http://www.cnblogs.com/twinsclover/archive/2012/04/26/2471704.html 序言 之前用python爬取网页的时候,一直用的是rege ...
- win10窗口设置眼睛保护色
经常电脑前坐着,习惯了豆沙色窗口(据说保护眼睛): 目标 记事本,ide,office等窗口颜色豆沙色:如下图 步骤 打开注册表:win+r 运行"regedit": 依次打开[H ...
- “LC.exe”已退出,代码为 -1
造成这个问题的原因一般是引入了第三方插件,自己遇到的问题是引入了devexpress...... 1.找到Properties文件夹licenses.licx文件,然后右键选择删除就可以了,调试运行正 ...