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 18 Python
详细解读Python的web.py框架下的application.py模块
May 02 Python
Python类定义和类继承详解
May 08 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
pandas 选择某几列的方法
Jul 03 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
如何基于python操作json文件获取内容
Dec 24 Python
Python Json数据文件操作原理解析
May 09 Python
python通配符之glob模块的使用详解
Apr 24 Python
总结Python连接CS2000的详细步骤
Jun 23 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
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
php实现将Session写入数据库
2015/07/26 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
学习jQuey中的return false
2015/12/18 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
Django中间件实现拦截器的方法
2018/06/01 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
python+pygame实现坦克大战
2019/09/10 Python
python 魔法函数实例及解析
2019/09/25 Python
Python原始套接字编程实例解析
2020/01/29 Python
python实现udp聊天窗口
2020/03/31 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
TCP/IP的分层模型
2013/10/27 面试题
什么是索引指示器
2012/08/20 面试题
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
Python学习之异常中的finally使用详解
2022/03/16 Python
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers
SQLServer常见数学函数梳理总结
2022/08/05 MySQL