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实现的百度贴吧网络爬虫实例
Apr 17 Python
在Python程序员面试中被问的最多的10道题
Dec 05 Python
python3大文件解压和基本操作
Dec 15 Python
Numpy中的mask的使用
Jul 21 Python
Python3编码问题 Unicode utf-8 bytes互转方法
Oct 26 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
python 图片二值化处理(处理后为纯黑白的图片)
Nov 01 Python
Python实现word2Vec model过程解析
Dec 16 Python
python实现人机猜拳小游戏
Feb 03 Python
python dumps和loads区别详解
Feb 04 Python
python利用pandas分析学生期末成绩实例代码
Jul 09 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 xml-rpc远程调用
2008/12/19 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
PHP中的Memcache详解
2014/04/05 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
python实现的登录和操作开心网脚本分享
2014/07/09 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
深入了解NumPy 高级索引
2020/07/24 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
创建精神文明单位实施方案
2014/03/08 职场文书
房屋继承公证书
2014/04/10 职场文书
寄语是什么意思
2014/04/10 职场文书
销售团队口号大全
2014/06/06 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
婚内分居协议书范文
2014/11/26 职场文书