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根据出生日期返回年龄的方法
Mar 26 Python
安装Python的教程-Windows
Jul 22 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
python根据url地址下载小文件的实例
Dec 18 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
浅析使用Python搭建http服务器
Oct 27 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
Python3+Selenium+Chrome实现自动填写WPS表单
Feb 12 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/08/21 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
php类中private属性继承问题分析
2012/11/01 PHP
PHP编程函数安全篇
2013/01/08 PHP
PHP new static 和 new self详解
2017/02/19 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
详解python分布式进程
2018/10/08 Python
Python给图像添加噪声具体操作
2019/03/03 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
连锁经营管理专业大学生求职信
2013/10/30 职场文书
2014年两会学习心得体会
2014/03/17 职场文书
新年爱情寄语
2014/04/08 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
实习证明模板
2015/06/16 职场文书
Python MNIST手写体识别详解与试练
2021/11/07 Python