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代码打包为jar软件的简单方法
Aug 04 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
基于hashlib模块--加密(详解)
Jun 21 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
Python简易计算器制作方法代码详解
Oct 31 Python
python使用itchat模块给心爱的人每天发天气预报
Nov 25 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 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初学者(入门学习经验谈)
2010/10/12 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
BootStrap selectpicker
2016/06/20 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
python遍历文件目录、批量处理同类文件
2019/08/31 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
工程造价专业大专生求职信
2013/10/06 职场文书
总经理职责
2013/12/22 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android