决策树的ID3算法基于信息增益来选择最优特征,于是自己实现了一把,直接上代码。

 """
CreateTime : 2019/3/3 22:19
Author : X
Filename : decision_tree.py
""" import pandas as pd
from math import log2 def create_data_set():
"""Create 8 * 3 data set. two feature."""
data_set = [['long', 'thick', 'man'],
['short', 'thick', 'man'],
['short', 'thick', 'man'],
['long', 'thin', 'woman'],
['short', 'thin', 'woman'],
['short', 'thick', 'woman'],
['long', 'thick', 'woman'],
['long', 'thick', 'woman']]
labels = ['hair', 'sound']
return data_set, labels def calculate_entropy(data_set):
"""Calculate entropy by data set label.
formula: H(X) = -3/8*log(3/8, 2) - -5/8*log(5/8, 2)"""
data_len = data_set.shape[0]
entropy = 0
for size in data_set.groupby(data_set.iloc[:, -1]).size():
p_label = size/data_len
entropy -= p_label * log2(p_label)
return entropy def get_best_feature(data_set):
"""Get the best feature by infoGain.
formula: InfoGain(X, Y) = H(X) - H(X|Y)
H(X|Y) = sum(P(X) * H(Yx))"""
best_feature = -1
base_entropy = calculate_entropy(data_set)
best_info_gain = 0
len_data = data_set.shape[0]
for i in range(data_set.shape[1] - 1):
new_entropy = 0
for _, group in data_set.groupby(data_set.iloc[:, i]):
p_label = group.shape[0]/len_data
new_entropy += p_label * calculate_entropy(group)
info_gain = base_entropy - new_entropy
if info_gain > best_info_gain:
best_feature = i
best_info_gain = info_gain
return best_feature def majority_cnt(class_list):
"""When only class label, return the max label."""
majority_class = class_list.groupby(
class_list.iloc[:, -1]).size().sort_values().index[-1]
return majority_class def create_tree(data_set, labels):
"""data_set: DataFrame"""
class_list = data_set.values[:, -1]
class_list_set = set(class_list)
if len(class_list_set) == 1:
return list(class_list)[0]
if len(data_set.values[0]) == 1:
return majority_cnt(data_set)
best_feature = get_best_feature(data_set)
best_feature_label = labels[best_feature]
del labels[best_feature]
my_tree = {best_feature_label: {}}
for name, group in data_set.groupby(data_set.iloc[:, best_feature]):
group.drop(columns=[best_feature], axis=1, inplace=True)
my_tree[best_feature_label][name] = create_tree(group, labels)
return my_tree def classify(test_data, my_tree):
if not test_data:
return 'Not found class.'
for key, tree in my_tree.items():
if key != test_data[0]:
return classify(test_data, tree)
else:
if isinstance(tree, dict):
del test_data[0]
return classify(test_data, tree)
else:
return tree if __name__ == '__main__':
DATA_SET, LABELS = create_data_set()
TREE = create_tree(pd.DataFrame(DATA_SET), LABELS)
import json
print(json.dumps(TREE, indent=4))
print(classify(["thick", "long"], TREE))

C4.5算法是基于信息增益率来选择最优特征的,即在ID3算法基础上再求出信息增益率即可,将信息增益除以基于label的特征X的熵。

此处就不再给出实现代码,自己实现一遍意在加深理解。

决策树ID3算法实现的更多相关文章

  1. 数据挖掘之决策树ID3算法(C#实现)

    决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般 ...

  2. 决策树ID3算法[分类算法]

    ID3分类算法的编码实现 <?php /* *决策树ID3算法(分类算法的实现) */ /* *求信息增益Grain(S1,S2) */ //-------------------------- ...

  3. 决策树---ID3算法(介绍及Python实现)

    决策树---ID3算法   决策树: 以天气数据库的训练数据为例. Outlook Temperature Humidity Windy PlayGolf? sunny 85 85 FALSE no ...

  4. 02-21 决策树ID3算法

    目录 决策树ID3算法 一.决策树ID3算法学习目标 二.决策树引入 三.决策树ID3算法详解 3.1 if-else和决策树 3.2 信息增益 四.决策树ID3算法流程 4.1 输入 4.2 输出 ...

  5. 机器学习之决策树(ID3)算法与Python实现

    机器学习之决策树(ID3)算法与Python实现 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每 ...

  6. 决策树ID3算法的java实现(基本试用所有的ID3)

    已知:流感训练数据集,预定义两个类别: 求:用ID3算法建立流感的属性描述决策树 流感训练数据集 No. 头痛 肌肉痛 体温 患流感 1 是(1) 是(1) 正常(0) 否(0) 2 是(1) 是(1 ...

  7. 决策树 -- ID3算法小结

          ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归 ...

  8. 【Machine Learning in Action --3】决策树ID3算法

    1.简单概念描述 决策树的类型有很多,有CART.ID3和C4.5等,其中CART是基于基尼不纯度(Gini)的,这里不做详解,而ID3和C4.5都是基于信息熵的,它们两个得到的结果都是一样的,本次定 ...

  9. 决策树ID3算法的java实现

    决策树的分类过程和人的决策过程比较相似,就是先挑“权重”最大的那个考虑,然后再往下细分.比如你去看医生,症状是流鼻涕,咳嗽等,那么医生就会根据你的流鼻涕这个权重最大的症状先认为你是感冒,接着再根据你咳 ...

  10. 决策树ID3算法

    决策树 (Decision Tree)是在已知各种情况发生概率的基础上,通过构成 决策树 来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法 ...

随机推荐

  1. LabVIEW如何方便地调用DLL文件

    转自:http://bbs.elecfans.com/jishu_469502_1_1.html   LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用.比 ...

  2. 架构和性能优化的核心原则(康神sf讲座学习笔记)

    其实架构性能优化的核心就是分,分为分离.分层.分布. 分离动静分离静态资源.动态页面的分离 比如,一个页面有很多静态图片,静态的图片.动态数据.静态CSS.js,图片一般用cdn,但静态资源在使用域名 ...

  3. troubleshooting-windows 在 CDH集群环境读取 Hive 表 KrbException: Cannot locate default realm

    KrbException: Cannot locate default realm 解决办法 1)拷贝需要组件的配置文件到项目中的 /resources/目录.如hadoop,目录/etc/hadoo ...

  4. iotop监控磁盘动态安装

    开始装iotp tar xvf iotop-0.3.1.tar.gz 用python安装(如果没有蟒蛇, yum一个吧) cd iotop-0.3.1 python setup.py build py ...

  5. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  6. TensorFlow 之 手写数字识别MNIST

    官方文档: MNIST For ML Beginners - https://www.tensorflow.org/get_started/mnist/beginners Deep MNIST for ...

  7. POJ 2029 (二维树状数组)题解

    思路: 大力出奇迹,先用二维树状数组存,然后暴力枚举 算某个矩形区域的值的示意图如下,代码在下面慢慢找... 代码: #include<cstdio> #include<map> ...

  8. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  9. Unity3D学习笔记(十六):Animator新动画

    新动画系统: 给模型选择动画类型 普通动画:Generic 人形动画:Humanoid 建立动画控制器 - 在Project右击 - 选择Create-AnimatorContorller 将对应动画 ...

  10. UVa 1602 网格动物(回溯)

    https://vjudge.net/problem/UVA-1602 题意:计算n连通块不同形态的个数. 思路: 实在是不知道该怎么做好,感觉判重实在是太麻烦了. 判重就是判断所有格子位置是否都相同 ...