决策树的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. MySQL Crash Course #10# Chapter 19. Inserting Data

    INDEX BAD EXAMPLE Improving Overall Performance Inserting Multiple Rows INSTEAD OF Inserting a Singl ...

  2. Django popup示例

    urls.py urlpatterns = [ url('popup_test1',views.popup_test1), url('popup_test2',views.popup_test2), ...

  3. 07: python基础 零碎知识点

    目录: 1.1 python异常处理 1.2 三元运算,filter和map与lambda表达式结合使用举例 1.3 内置方法 1.4 动态导入模块 1.1 python异常处理返回顶部 1.Pyth ...

  4. [Linux 003]——用户和用户组以及 Linux 权限管理(一)

    嗬!没想到吧!学习 Linux 的第三天,我们已经开始接触用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时 ...

  5. Disruptor学习笔记(一):基本原理和概念

    一.Disruptor基本原理 在多线程开发中,我们常常遇到这样一种场景:一些线程接受用户请求,另外一些线程处理这些请求.比如日志处理中的日志输入和告警.这种典型的生产者消费者场景十分常见,而生产者消 ...

  6. uva 1658 Admiral - 费用流

    vjudge传送门[here] 题目大意:给一个有(3≤v≤1000)个点e(3≤e≤10000)条边的有向加权图,求1~v的两条不相交(除了起点和终点外没有公共点)的路径,使权值和最小. 正解是吧2 ...

  7. vijos 运输计划 - 二分答案 - 差分 - Tarjan

    Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家 ...

  8. SpringCloud请求响应数据转换(一)

    异常现象 近期做Spring Cloud项目,工程中对Controller添加ResponseBodyAdvice切面,在切片中将返回的结果封装到ResultMessage(自定义结构),但在Cont ...

  9. Python3基础 A类作为B类的实例变量

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. FieldOffset

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.G ...