python实现决策树
1.决策树的简介
http://www.cnblogs.com/lufangtao/archive/2013/05/30/3103588.html
2.决策是实现的伪代码
“读入训练数据”
“找出每个属性的可能取值” “递归调用建立决策树的函数”
“para:节点,剩余样例,剩余属性” if “剩余属性个数为0"
return most_of_result
else if “剩余样例都属于同一个分类(yes/no)"
return yes/no
else:
”对于每一个剩余属性,计算该属性的熵增“,并找到熵增最大的对应的属性,即为最佳分类属性”
“按照最佳分类属性分类,对于每个分支,递归调用建立函数,最终得到整个决策树”
3.python数据结构设计
1.数据集:用于存储二维的训练数据training_data
二维的list数组,对于二维的list要取得某一列的数据,可以用zip(*dataset)[num]
2.属性集合:用于存储属性的名称attri_name_set
一维的list
3.属性的可能取值:存储各个属性的可能取值状态
dict+set:dict的key是属性的名称,value是set类型,这样可以保证不会有重复
新建set类型:attri[i] = set()
4.树的节点定义
class Dtree_node(object):
def __init__(self):
self.attriname = None
self.sub_node = {} #子节点为dict类型
子节点的类型为dict,key是属性的不同取值,value是对应的子节点
4.code
# -*- coding: utf-8 -*-
from __future__ import division
import math __author__ = 'Jiayin'
#date:2016-3-28
#决策树的实现,从test.txt中读入训练数据, #全局变量
training_data = [] #数据集(二维list表)
attri = {} #属性集(dict+set)
attri_name_set = [] class Dtree_node(object):
def __init__(self):
self.attriname = None
self.sub_node = {} #子节点为dict类型 root = Dtree_node() #输入数据
def get_input():
#属性集合 属性是dict结构,key为属性名(str),value是该属性可以取到的值类型为set
#第一个属性通常为编号,最后一个属性通常为决策结果,取值只有yes/no
global attri
global attri_name_set
file_read = open("test.txt")
line = file_read.readline().split()
attri_name_set = line[:]
#print line
for i in line:
attri[i] = set() line = file_read.readline().split()
#读入数据,并计算每个属性的可能取值
while line:
training_data.append(line)
for i in range(1,len(line)-1):
attri[attri_name_set[i]].add(line[i])
line = file_read.readline().split() #取most_of _result
def getmost(dataset_result):
p = 0
n = 0
for i in dataset_result:
if i == 'yes':
p+=1
else:
n+=1
return 'yes' if p>n else 'no' #计算熵
def cal_entropy(dataset_result):
num_yes = 0
num_no = 0
for i in dataset_result:
if i == 'yes':
num_yes +=1
else:
num_no += 1
if num_no == 0 or num_yes == 0:
return 0
total_num = num_no +num_yes
per_yes = num_yes/total_num
per_no = num_no/total_num
return -per_yes*math.log(per_yes,2)-per_no*math.log(per_no,2) #计算某个属性的熵增
#参数 :数据集和属性名,初始熵
def cal_incr_entr_attri(data_set,attriname,init_entropy):
global attri
global attri_name_set
incr_entr = init_entropy
attri_index = attri_name_set.index(attriname) #将该属性的不同取值提取出来,并分别计算熵,求出熵增
for i in attri[attriname]:
#new_data = data_set[:]
new_data = filter(lambda x: True if x[attri_index] == i else False ,data_set)
if len(new_data)==0:
continue
num = cal_entropy(zip(*new_data)[-1])
incr_entr -= len(new_data)/len(data_set)*num return incr_entr #判断是否剩余数据集都是一个结果
def if_all_label(dataset_result, result):
#result = dataset_result[0]
for i in range(0,len(dataset_result)):
if dataset_result[i] <> result:
break
return False if dataset_result[i]<>result else True #建立决策树
#参数:root:节点 dataset:剩下的数据集 attriset:剩下的属性集
def create_Dtree(root_node , data_set , attri_set):
global attri
global attri_name_set
'''
#如果当前数据集为空,应该返回上一层的most_of_result,此处要修改
if len(data_set)==0:
return None'''
#考虑如果剩余属性集为空,则返回most_of_result
if len(attri_set) == 0:
print zip(*data_set)
root_node.attriname = getmost(zip(*data_set)[-1]) #zip(*dataset)[-1]表示取出最后一列,也就是yes/no那一列
return None
#考虑如果剩余的数据集都是一个结果的话,返回这个结果
elif if_all_label(zip(*data_set)[-1],'yes'):
root_node.attriname = 'yes'
return None
elif if_all_label(zip(*data_set)[-1],'no'):
root_node.attriname = 'no'
return None #print zip(*data_set)
init_entropy = cal_entropy(zip(*data_set)[-1])#计算初始熵
max_entropy = 0
for i in attri_set:
entropy = cal_incr_entr_attri(data_set,i,init_entropy)
if entropy > max_entropy:
max_entropy = entropy
best_attri = i new_attri = attri_set[:]
root_node.attriname = best_attri
attri_index = attri_name_set.index(best_attri)
for attri_value in attri[best_attri]:
#new_data = data_set[:]
new_data = filter(lambda x: True if x[attri_index] == attri_value else False ,data_set)
root_node.sub_node[attri_value] = Dtree_node()
#如果该分支下面的数据集个数为0,则采用父节点的most_of_result
if len(new_data)==0:
root_node.sub_node[attri_value].attriname = getmost(zip(*data_set)[-1])
else:
create_Dtree(root_node.sub_node[attri_value],new_data,new_attri) def print_Dtree(Root_node,layer):
print Root_node.attriname
count = 1
if len(Root_node.sub_node) > 0:
for sub in Root_node.sub_node.keys():
for i in range(layer):
print "| ",
print "|----%10s---"%sub,
assert isinstance(layer, object)
print_Dtree(Root_node.sub_node[sub] , layer+1)
#count += 1 def main():
global root
global attri_name_set
get_input()#输入
attri_set = attri_name_set[1:-1]#提取出要分类的属性
create_Dtree(root,training_data,attri_set)#创建决策树
print_Dtree(root,0)#打印决策树 main()
python实现决策树的更多相关文章
- python利用决策树进行特征选择
python利用决策树进行特征选择(注释部分为绘图功能),最后输出特征排序: import numpy as np import tflearn from tflearn.layers.core im ...
- python画决策树
1.安装graphviz.下载地址在:http://www.graphviz.org/.如果你是linux,可以用apt-get或者yum的方法安装.如果是windows,就在官网下载msi文件安装. ...
- python 之 决策树分类算法
发现帮助新手入门机器学习的一篇好文,首先感谢博主!:用Python开始机器学习(2:决策树分类算法) J. Ross Quinlan在1975提出将信息熵的概念引入决策树的构建,这就是鼎鼎大名的ID3 ...
- Python实现——决策树实例(离散数据/香农熵)
决策树的实现太...繁琐了. 如果只是接受他的原理的话还好说,但是要想用代码去实现比较糟心,目前运用了<机器学习实战>的代码手打了一遍,决定在这里一点点摸索一下该工程. 实例的代码在使用上 ...
- python ID3决策树实现
环境:ubuntu 16.04 python 3.6 数据来源:UCI wine_data(比较经典的酒数据) 决策树要点: 1. 如何确定分裂点(CART ID3 C4.5算法有着对应的分裂计算方式 ...
- 基于Python的决策树分类器与剪枝
作者|Angel Das 编译|VK 来源|Towards Data Science 介绍 决策树分类器是一种有监督的学习模型,在我们关心可解释性时非常有用. 决策树通过基于每个层次的多个问题做出决策 ...
- python 机器学习 决策树
决策树(Decision Trees ,DTs)是一种无监督的学习方法,用于分类和回归. 优点:计算复杂度不高,输出结果易于理解,对中间值缺失不敏感,可以处理不相关的特征数据缺点:可能会产生过度匹配的 ...
- Python实现决策树ID3算法
主要思想: 0.训练集格式:特征1,特征2,...特征n,类别 1.采用Python自带的数据结构字典递归的表示数据 2.ID3计算的信息增益是指类别的信息增益,因此每次都是计算类别的熵 3.ID3每 ...
- python spark 决策树 入门demo
Refer to the DecisionTree Python docs and DecisionTreeModel Python docs for more details on the API. ...
随机推荐
- Reactor模式与观察者模式
多线程编程常见模式 观察者模式: 单一的观察点,事件单一 反应器模式: 多个观察点,事件不单一(NIO里面的Selector选择器,基于Channel的事件进行多路的IO复用机制) 图-网上都是这张, ...
- Ceph源码解析:PG peering
集群中的设备异常(异常OSD的添加删除操作),会导致PG的各个副本间出现数据的不一致现象,这时就需要进行数据的恢复,让所有的副本都达到一致的状态. 一.OSD的故障和处理办法: 1. OSD的故障种类 ...
- JS实现联想输入(二)
JS实现联想输入(一)是主要针对单列结构的JSON格式的数据的,如果想满足多列结构的JSON格式的数据,也是非常容易的,其解决方案有至少有三种选择: 1:在后台Action方法中将多列的值拼成单列结构 ...
- python中时间格式
问题:通过MySQLdb查询datetime字段,然后通过浏览器显示出来,得到的格式是: 'Thu, 19 Feb 2009 16:00:07 GMT' (http呈现出来的格式) ...
- spring batch学习笔记
Spring Batch是什么? Spring Batch是一个基于Spring的企业级批处理框架,按照我师父的说法,所有基于Spring的框架都是使用了spring的IoC特性,然后加上 ...
- ios7 导航栏 手势 右划 自动返回 相关
http://www.tuicool.com/articles/vMfAVv 纪录一下,
- PAT1099
/*innner order traverse for BST will be ordered *1.sort the value in buffer *2.inner traverse the BS ...
- ASP.NET的SEO:目录
ASP.NET的SEO:基础知识 ASP.NET的SEO:Global.asax和HttpModule中的RewritePath()方法--友好的URL ASP.NET的SEO:正则表达式 ASP.N ...
- Oracle笔记 十、PL/SQL存储过程
--create or replace 创建或替换,如果存在就替换,不存在就创建 create or replace procedure p is cursor c is select * from ...
- 样式重置 取消input默认样式
body, h1, h2, h3, h4, h5, h6, hr, p,blockquote, dl, dt, dd, ul, ol, li,pre, form, fieldset, legend, ...