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实现决策树的更多相关文章

  1. python利用决策树进行特征选择

    python利用决策树进行特征选择(注释部分为绘图功能),最后输出特征排序: import numpy as np import tflearn from tflearn.layers.core im ...

  2. python画决策树

    1.安装graphviz.下载地址在:http://www.graphviz.org/.如果你是linux,可以用apt-get或者yum的方法安装.如果是windows,就在官网下载msi文件安装. ...

  3. python 之 决策树分类算法

    发现帮助新手入门机器学习的一篇好文,首先感谢博主!:用Python开始机器学习(2:决策树分类算法) J. Ross Quinlan在1975提出将信息熵的概念引入决策树的构建,这就是鼎鼎大名的ID3 ...

  4. Python实现——决策树实例(离散数据/香农熵)

    决策树的实现太...繁琐了. 如果只是接受他的原理的话还好说,但是要想用代码去实现比较糟心,目前运用了<机器学习实战>的代码手打了一遍,决定在这里一点点摸索一下该工程. 实例的代码在使用上 ...

  5. python ID3决策树实现

    环境:ubuntu 16.04 python 3.6 数据来源:UCI wine_data(比较经典的酒数据) 决策树要点: 1. 如何确定分裂点(CART ID3 C4.5算法有着对应的分裂计算方式 ...

  6. 基于Python的决策树分类器与剪枝

    作者|Angel Das 编译|VK 来源|Towards Data Science 介绍 决策树分类器是一种有监督的学习模型,在我们关心可解释性时非常有用. 决策树通过基于每个层次的多个问题做出决策 ...

  7. python 机器学习 决策树

    决策树(Decision Trees ,DTs)是一种无监督的学习方法,用于分类和回归. 优点:计算复杂度不高,输出结果易于理解,对中间值缺失不敏感,可以处理不相关的特征数据缺点:可能会产生过度匹配的 ...

  8. Python实现决策树ID3算法

    主要思想: 0.训练集格式:特征1,特征2,...特征n,类别 1.采用Python自带的数据结构字典递归的表示数据 2.ID3计算的信息增益是指类别的信息增益,因此每次都是计算类别的熵 3.ID3每 ...

  9. python spark 决策树 入门demo

    Refer to the DecisionTree Python docs and DecisionTreeModel Python docs for more details on the API. ...

随机推荐

  1. Sqool与kettle开源的ETL工具

    现在的ETL都是基于管道的模式(数据流)运行,比较有名的有 TaskCTL ========================================== 数据抽取的开源工具 一个是RDBMS ...

  2. 1307: City Tour

    1307: City Tour Time Limit: 1 Sec  Memory Limit: 128 MB [Submit][Status][Web Board] Description Alic ...

  3. mysq 因断电而导致的错误

    问题来源: 昨天断电,而我没有保存,导致出现以下问题: 2015-10-12 10:48:10 7300 [Note] Plugin 'FEDERATED' is disabled. 2015-10- ...

  4. hibernate常见错误

    1.Hibernate: Could not synchronize database state with session 1.主键不是自动生成的,然后自己没手动设置.  2.插入的实体字段跟数据库 ...

  5. jQuery 的随机密码生成 .

    $.extend({ password: function (length, special) { var iteration = 0; var password = ""; va ...

  6. Facebook 的系统架构(转)

    来源:http://www.quora.com/What-is-Facebooks-architecture(由Micha?l Figuière回答) 根据我现有的阅读和谈话,我所理解的今天Faceb ...

  7. eclipse中logcat偶尔不显示log的问题解决办法

    Android开发过程中  eclipse 经常会出现 logcat突然就是不现实log的情况.经常遇到,一直没有解决.后来解决了,记录一下. 默认的设置是error 改成verbos 问题解决.

  8. 进程内外的session

    进程内session:缺点:当访问量大的时候,会导致进程内session的重启优点:存储速度快 进程外session: 01.将session存储在状态服务器中 asp.net state servi ...

  9. oracle中行转列、列转行函数

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str ...

  10. javacript 优化2

    上面一篇文章大致介绍了一些javascript当中使用的一些小技巧,当下这篇文章继续介绍一下内存管理.松散耦合.性能方面的一些小知识.为避免错误应该注意的点 内存管理 1.循环引用 如果循环引用中包含 ...