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的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
Pyinstaller将py打包成exe的实例
Mar 31 Python
面向对象学习之pygame坦克大战
Sep 11 Python
python实现大量图片重命名
Mar 23 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
python开发入门——set的使用
Sep 03 Python
Python序列化与反序列化相关知识总结
Jun 08 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
php 魔术方法使用说明
2009/10/20 PHP
PHP获取url的函数代码
2011/08/02 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
Vue异步加载about组件
2017/10/31 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
Python输出带颜色的字符串实例
2017/10/10 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
浅谈Python 递归算法指归
2019/08/22 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
测试时代收集的软件测试面试题
2013/09/25 面试题
护士长竞聘书
2014/03/31 职场文书
安全保证书范文
2014/04/29 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2014年班主任工作总结
2014/11/08 职场文书
2015年三万活动总结
2015/03/25 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers