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切换hosts文件代码示例
Dec 31 Python
Python检测网站链接是否已存在
Apr 07 Python
Python生成随机密码的方法
Jun 16 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
Python线程创建和终止实例代码
Jan 20 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
python 用递归实现通用爬虫解析器
Apr 16 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 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中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
js分页工具实例
2015/01/28 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
python爬虫的工作原理
2017/03/05 Python
利用Python计算KS的实例详解
2020/03/03 Python
python构造IP报文实例
2020/05/05 Python
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
秘书英文求职信范文
2014/01/31 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
运动会运动员赞词
2015/07/22 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js