决策树ID3算法实现
决策树的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算法实现的更多相关文章
- 数据挖掘之决策树ID3算法(C#实现)
决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般 ...
- 决策树ID3算法[分类算法]
ID3分类算法的编码实现 <?php /* *决策树ID3算法(分类算法的实现) */ /* *求信息增益Grain(S1,S2) */ //-------------------------- ...
- 决策树---ID3算法(介绍及Python实现)
决策树---ID3算法 决策树: 以天气数据库的训练数据为例. Outlook Temperature Humidity Windy PlayGolf? sunny 85 85 FALSE no ...
- 02-21 决策树ID3算法
目录 决策树ID3算法 一.决策树ID3算法学习目标 二.决策树引入 三.决策树ID3算法详解 3.1 if-else和决策树 3.2 信息增益 四.决策树ID3算法流程 4.1 输入 4.2 输出 ...
- 机器学习之决策树(ID3)算法与Python实现
机器学习之决策树(ID3)算法与Python实现 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每 ...
- 决策树ID3算法的java实现(基本试用所有的ID3)
已知:流感训练数据集,预定义两个类别: 求:用ID3算法建立流感的属性描述决策树 流感训练数据集 No. 头痛 肌肉痛 体温 患流感 1 是(1) 是(1) 正常(0) 否(0) 2 是(1) 是(1 ...
- 决策树 -- ID3算法小结
ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归 ...
- 【Machine Learning in Action --3】决策树ID3算法
1.简单概念描述 决策树的类型有很多,有CART.ID3和C4.5等,其中CART是基于基尼不纯度(Gini)的,这里不做详解,而ID3和C4.5都是基于信息熵的,它们两个得到的结果都是一样的,本次定 ...
- 决策树ID3算法的java实现
决策树的分类过程和人的决策过程比较相似,就是先挑“权重”最大的那个考虑,然后再往下细分.比如你去看医生,症状是流鼻涕,咳嗽等,那么医生就会根据你的流鼻涕这个权重最大的症状先认为你是感冒,接着再根据你咳 ...
- 决策树ID3算法
决策树 (Decision Tree)是在已知各种情况发生概率的基础上,通过构成 决策树 来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法 ...
随机推荐
- python之路----hashlib模块
在平时生活中,有很多情况下,你在不知不觉中,就用到了hashlib模块,比如:注册和登录认证注册和登录认真过程,就是把注册用的账户密码进行:加密 --> 解密 的过程,在加密.解密过程中,用的了 ...
- Django框架介绍之cookie与session
cookie http请求时无状态的,一个客户端第一次,第二次,第n次访问同一个服务器都是一样的,服务器都会按照一个新的连接处理.但是,有时候客户端需要服务器记住客户端的登录状态,譬如离开一会,回来之 ...
- Python 自学基础(四)——time模块,random模块,sys模块,os模块,loggin模块,json模块,hashlib模块,configparser模块,pickle模块,正则
时间模块 import time print(time.time()) # 当前时间戳 # time.sleep(1) # 时间延迟1秒 print(time.clock()) # CPU执行时间 p ...
- 01: awk常用
1.1 awk基本使用 1.找出当前登录用户数量 [root@localhost ~]# w 14:09:07 up 48 min, 2 users, load average: 0.00, 0.01 ...
- Python3基础 help 查看内置函数说明
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- linux如何删除行首的空格
答: sed 's/^ *//' jello.txt > hello.txt
- bzoj1055 ||P4290 [HAOI2008]玩具取名
目录 链接 思路 代码 链接 luogu bzoj 思路 区间dp 然后\(f[i][j][k]\) 区间\([i,j]\)能否变成\(k\)字符 (字符当然得转化一下) 字符的个数不多,直接暴力\( ...
- Mysql中unique与primary约束的区别分析(转)
本文章来给大家介绍在mysql中unique与primary约束的区别分析,unique与primary是我们在创建mysql时常用的类型了,下面我来给大家介绍介绍. 定义了UNIQUE约束的字段 ...
- Uncaught TypeError: $(...).daterangepicker is not a function
本文为博主原创,未经允许不得转载: 在用bootstrap做一个日期插件的时候,代码和js,css等都是拷贝网上下载下来的实例,但是在 调试的时候,浏览器控制台一直报错 Uncaught TypeEr ...
- Ubuntu 14.04 删除软件附加依赖
参考:FlowVisor的学习笔记 eg.mininet $ sudo apt-get remove mininet $ sudo apt-get remove --auto-remove minin ...