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. ...
随机推荐
- Linux场景下的辅助命令操作汇总
============================================ 1.客户端: SecureCRT 7.1 或者putty 2.FTP 主要是上传文件往Linux,否则我们就的 ...
- Spring 配置文件详解 http://www.blogjava.net/hellxoul/archive/2011/11/19/364324.html
1.基本配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...
- DP走方格型
Hrbust 1812 http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1812 有 ...
- vc读写注册表
注册表是Windows重要组成部分,注册表记录了大量有关电脑软硬件的信息.注册表中的值通过其名称标识.值名称由与键名相同的字符组成.值本身可以是字符串.二进制数据或者是32位无符号值.在这里我们主要运 ...
- android L 新控件侧滑菜单DrawerLayout 使用教程
介绍 drawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说drawerLayout是因为第三方控件如MenuDrawer等的出现之后,google借鉴而出现的产 ...
- android shape的使用 边框
android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先写drawable里面的xml文件,里面设置shape来设置文本框的 ...
- 让执行程序引用特定目录下的Dll
当写一个软件,特别是大型的软件,经常会引用一些第三方的类库,再加上一些自己的项目,如果这些Dll全都放在主目录下的话,会显得比较杂乱.我们希望将项目的类库分类成文件夹存放,这样才显得比较整洁. 解决方 ...
- 浅析人脸检测之Haar分类器方法
一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发 ...
- php 数组转json格式
1.php若为关系数组:转化为由花括号包围的对象: 输入:$test = array("1"=>1,"2"=>2,"3"=> ...
- 学习资料 数据查询语言DQL
数据查询语言DQL介绍及其应用: 查询是SQL语言的核心,SQL语言只提供唯一一个用于数据库查询的语句,即SELECT语句.用于表达SQL查询的SELECT语句是功能最强也是最复杂的SQL语句,它提供 ...