python实现决策树ID3算法的示例代码


Posted in Python onMay 30, 2018

在周志华的西瓜书和李航的统计机器学习中对决策树ID3算法都有很详细的解释,如何实现呢?核心点有如下几个步骤

step1:计算香农熵

from math import log
import operator


# 计算香农熵
def calculate_entropy(data):
  label_counts = {}
  for feature_data in data:
    laber = feature_data[-1] # 最后一行是laber
    if laber not in label_counts.keys():
      label_counts[laber] = 0
    label_counts[laber] += 1

  count = len(data)
  entropy = 0.0

  for key in label_counts:
    prob = float(label_counts[key]) / count
    entropy -= prob * log(prob, 2)
  return entropy

step2.计算某个feature的信息增益的方法

# 计算某个feature的信息增益
# index:要计算信息增益的feature 对应的在data 的第几列
# data 的香农熵
def calculate_relative_entropy(data, index, entropy):
  feat_list = [number[index] for number in data] # 得到某个特征下所有值(某列)
  uniqual_vals = set(feat_list)
  new_entropy = 0
  for value in uniqual_vals:
    sub_data = split_data(data, index, value)
    prob = len(sub_data) / float(len(data)) 
    new_entropy += prob * calculate_entropy(sub_data) # 对各子集香农熵求和
  relative_entropy = entropy - new_entropy # 计算信息增益
  return relative_entropy

step3.选择最大信息增益的feature

# 选择最大信息增益的feature
def choose_max_relative_entropy(data):
  num_feature = len(data[0]) - 1
  base_entropy = calculate_entropy(data)#香农熵
  best_infor_gain = 0
  best_feature = -1
  for i in range(num_feature):
    info_gain=calculate_relative_entropy(data, i, base_entropy)
    #最大信息增益
    if (info_gain > best_infor_gain):
      best_infor_gain = info_gain
      best_feature = i

  return best_feature

step4.构建决策树

def create_decision_tree(data, labels):
  class_list=[example[-1] for example in data]
  # 类别相同,停止划分
  if class_list.count(class_list[-1]) == len(class_list):
    return class_list[-1]
  # 判断是否遍历完所有的特征时返回个数最多的类别
  if len(data[0]) == 1:
    return most_class(class_list)
  # 按照信息增益最高选取分类特征属性
  best_feat = choose_max_relative_entropy(data)
  best_feat_lable = labels[best_feat] # 该特征的label
  decision_tree = {best_feat_lable: {}} # 构建树的字典
  del(labels[best_feat]) # 从labels的list中删除该label
  feat_values = [example[best_feat] for example in data]
  unique_values = set(feat_values)
  for value in unique_values:
    sub_lables=labels[:]
    # 构建数据的子集合,并进行递归
    decision_tree[best_feat_lable][value] = create_decision_tree(split_data(data, best_feat, value), sub_lables)
  return decision_tree

在构建决策树的过程中会用到两个工具方法:

# 当遍历完所有的特征时返回个数最多的类别
def most_class(classList):
  class_count={}
  for vote in classList:
    if vote not in class_count.keys():class_count[vote]=0
    class_count[vote]+=1
  sorted_class_count=sorted(class_count.items,key=operator.itemgetter(1),reversed=True)
  return sorted_class_count[0][0]
  
# 工具函数输入三个变量(待划分的数据集,特征,分类值)返回不含划分特征的子集
def split_data(data, axis, value):
  ret_data=[]
  for feat_vec in data:
    if feat_vec[axis]==value :
      reduce_feat_vec=feat_vec[:axis]
      reduce_feat_vec.extend(feat_vec[axis+1:])
      ret_data.append(reduce_feat_vec)
  return ret_data

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决谷歌搜索技术文章时打不开网页问题的python脚本
Feb 10 Python
Python读写Excel文件方法介绍
Nov 22 Python
Python中的random()方法的使用介绍
May 15 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python实现的字典值比较功能示例
Jan 08 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
如何在python中执行另一个py文件
Apr 30 Python
python 获取字典键值对的实现
Nov 12 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 Python
Python基础之字符串格式化详解
Apr 21 Python
python 进阶学习之python装饰器小结
Sep 04 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 #Python
Python实现的读取电脑硬件信息功能示例
May 30 #Python
Python应用库大全总结
May 30 #Python
Django中反向生成models.py的实例讲解
May 30 #Python
Python RabbitMQ消息队列实现rpc
May 30 #Python
python日期时间转为字符串或者格式化输出的实例
May 29 #Python
python 集合 并集、交集 Series list set 转换的实例
May 29 #Python
You might like
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
开发大型PHP项目的方法
2006/10/09 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
jupyter notebook清除输出方式
2020/04/10 Python
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
模范家庭事迹材料
2014/02/10 职场文书
环保建议书作文
2014/03/12 职场文书
三年级评语大全
2014/04/23 职场文书
中英文求职信范文
2015/03/19 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
实习感想范文
2015/08/10 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书