[Python]实现简单决策树
基本思路:
通过香农熵来决定每一层使用哪一种标签做分类,分类后,通过多数表决法来决定该层两个节点的类别。每次消耗一个标签,所以一共需要递归“标签个数”层。
# -*- coding:utf-8 -*-
import math
import operator
from collections import Counter def shannon_ent(dat):
siz = len(dat)
return 0.0 - reduce(lambda x, y: x + y,
map(lambda each: float(each)/siz * math.log(float(each)/siz, 2),
Counter(map(lambda each: each[-1], dat)).values())) def split_dataset(dat, axis, val):
ret = filter(lambda each: each[axis] == val, dat)
return map(lambda each: each[:axis]+each[axis+1:], ret) def choose_best_feature(dat):
feature_num = len(dat[0]) - 1
base_ent = shannon_ent(dat)
best_info_gain = 0.0
best_feature = -1
for i in range(feature_num):
feature_list = set([each[i] for each in dat])
cur_ent = reduce(lambda x, y: x + y,
map(lambda val: len(split_dataset(dat, i, val))/float(len(dat))*shannon_ent(split_dataset(dat, i, val)),
feature_list))
info_gain = base_ent - cur_ent
if info_gain > best_info_gain:
best_info_gain, best_feature = info_gain, i
return best_feature def majority_count(class_list):
class_dict = sorted(dict(Counter(class_list)).iteritems(), key=operator.itemgetter(1))
return class_dict[-1][0] def create_tree(dat, label):
class_list = map(lambda each: each[-1], dat)
if class_list.count(class_list[0]) == len(class_list):
return class_list[0]
if len(dat[0]) == 1:
return majority_count(class_list)
best_feature = choose_best_feature(dat)
best_label = label[best_feature]
d_tree = {best_label:{}}
del(label[best_feature])
feature_val = map(lambda each: each[best_feature], dat)
val_set = set(feature_val)
def _update_tree(val):
sub_label = label[:]
d_tree[best_label][val] = create_tree(split_dataset(dat, best_feature, val), sub_label)
map(_update_tree, val_set)
return d_tree d = [[1,1,'y'], [1,1,'y'], [1,0,'n'], [0,1,'n'], [0,1,'n']]
l = ['no surfacing', 'flippers'] print create_tree(d, l)
[Python]实现简单决策树的更多相关文章
- python实现简单决策树(信息增益)——基于周志华的西瓜书数据
数据集如下: 色泽 根蒂 敲声 纹理 脐部 触感 好瓜 青绿 蜷缩 浊响 清晰 凹陷 硬滑 是 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是 乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是 青绿 蜷缩 沉闷 清晰 ...
- 教你用Python实现简单监督学习算法
教你用Python实现简单监督学习算法 监督学习作为运用最广泛的机器学习方法,一直以来都是从数据挖掘信息的重要手段.即便是在无监督学习兴起的近日,监督学习也依旧是入门机器学习的钥匙. 这篇监督学习教程 ...
- Python数据挖掘之决策树DTC数据分析及鸢尾数据集分析
Python数据挖掘之决策树DTC数据分析及鸢尾数据集分析 今天主要讲述的内容是关于决策树的知识,主要包括以下内容:1.分类及决策树算法介绍2.鸢尾花卉数据集介绍3.决策树实现鸢尾数据集分析.希望这篇 ...
- Python 实现简单的 Web
简单的学了下Python, 然后用Python实现简单的Web. 因为正在学习计算机网络,所以通过编程来加强自己对于Http协议和Web服务器的理解,也理解下如何实现Web服务请求.响应.错误处理以及 ...
- 用 python实现简单EXCEL数据统计
任务: 用python时间简单的统计任务-统计男性和女性分别有多少人. 用到的物料:xlrd 它的作用-读取excel表数据 代码: import xlrd workbook = xlrd.open_ ...
- python开启简单webserver
python开启简单webserver linux下面使用 python -m SimpleHTTPServer 8000 windows下面使用上面的命令会报错,Python.Exe: No Mod ...
- Python开发简单爬虫 - 慕课网
课程链接:Python开发简单爬虫 环境搭建: Eclipse+PyDev配置搭建Python开发环境 Python入门基础教程 用Eclipse编写Python程序 课程目录 第1章 课程介绍 ...
- python使用简单http协议来传送文件
python使用简单http协议来传送文件!在ubuntu环境下,局域网内可以使用nc来传送文件,也可以使用基于Http协议的方式来下载文件我们可以使用python -m SimpleHTTPServ ...
- Python超简单的HTTP服务器
Python超简单的HTTP服务器 安装了python就可以 python -m SimpleHTTPServer 执行这一个命令即可实现一个HTTP服务器,将当前目录设为HTTP服务目录,可以通过h ...
随机推荐
- Python之路----------内置函数
1.abs(x)绝对值 #coding=utf-8 a = 1 b = -2 print(abs(a)) print(abs(b)) 2.all(iterable)可迭代对象里面所有内容为真返回真,空 ...
- RabbitMQ模拟器使用方法
同事推荐了一个很好玩的RabbitMQ模拟器,记录一下简要使用方法. 模拟器地址 http://tryrabbitmq.com/ 使用方法: 直接将画框左面的图标拖进画图区,构建想要的拓扑图: 按住A ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍
RDIFramework.NET ━ .NET快速信息化系统开发框架 工作流程组件介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部 ...
- 给php添加ssl证书
composer下载时报错: The "https://packagist.org/packages.json" file could not be downloaded: SSL ...
- mono支持gb2312
需要安装mono-locale-extras 输入命令 yum install -y mono-locale-extras 安装即可
- RGB颜色表
RGB(255,23,140)是光的三原色,也即红绿蓝Red.Green.Blue,它们的最大值是255,相当于100%. 白色:rgb(255,255,255) 黑色:rgb(0,0,0) 红色:r ...
- Python练习,网络小爬虫(初级)
最近还在看Python版的rcnn代码,附带练习Python编程写一个小的网络爬虫程序. 抓取网页的过程其实和读者平时使用IE浏览器浏览网页的道理是一样的.比如说你在浏览器的地址栏中输入 www ...
- 制作centos的U盘启动盘
制作centos的U盘启动盘比ubuntu麻烦一些,因为可能涉及到fat32文件格式不支持大于4G的文件存储的问题,而最新版本的centos就是大于4G的,所以就需要对U盘进行分区. 一个做主引导,一 ...
- Hdu 5489 合肥网络赛 1009 Removed Interval
跳跃式LIS(nlogn),在普通的转移基础上增加一种可以跨越一段距离的转移,用一颗新的树状数组维护,同时,我们还要维护跨越完一次后面的转移,所以我用了3颗树状数组.. 比赛的时候一句话位置写错了,然 ...
- OC-03类的声明和实现
例子 //类名:Car//属性:轮胎个数.时速//行为:跑 #import<Foundation/Foundation.h >//完整的写一个函数:函数的声明和定义(实现)//完整的写一个 ...