决策树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)是在已知各种情况发生概率的基础上,通过构成 决策树 来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法 ...
随机推荐
- 安装webpack出现警告: fsevents@^1.0.0 (node_modules\chokidar\node_modules\fsevents):
警告如下: npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules\chokidar\node_mo ...
- 08: 查看Linux系统基本信息和硬盘CPU等
目录: 1.1 查看Linux系统基本信息 1.2 查看三秒内的平均CPU 1.3 查看内存使用情况 1.4 查看当前系统负载 1.1 查看Linux系统基本信息返回顶部 1.查看Linux系统uui ...
- linux内核分析 第3章读书笔记
第三章 进程管理 一.进程 1.进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程 执行线程, ...
- poj Meteor Shower - 搜索
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16313 Accepted: 4291 Description Bess ...
- Python 代码片段收藏
list 列表相关 list 中最小值.最大值 import operator values = [1, 2, 3, 4, 5] min_index, min_value = min(enumerat ...
- B-树 B+树 B*树
区分B树,B-树 有的文章说二叉查找树(Binary Search Tree,BST)就是B树,这个我总结来说是不对的 B树和B-树是同一种树,只不过英语中B-tree被中国人翻译成了B-树,让人以为 ...
- CSS3 动画的一些属性
定义式 @keyframes 动画名称{ from{ } to{ } } 调用式 动画类似函数,只定义不调用是没效果的,所以要配合调用式使用. animation: 动画名称 动画时间 延时 时间曲线 ...
- hadoop项目实战--ETL--(三)实现mysql表到HIVE表的全量导入与增量导入
一 在HIVE中创建ETL数据库 ->create database etl; 二 在工程目录下新建MysqlToHive.py 和conf文件夹 在conf文件夹下新建如下文件,最后的工程目录 ...
- http协议与url简介(转)
一 知识简介 HTTP:(Hypertext transfer protocol)超文本传输协议,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议. URL ...
- os.environ() 说明
我们想要用Python获得一些有关系统的各种信息的时候就不得不想到os的environ,那这里面都具体包含了那些内容呢? 一.简介 对于官方的解释,environ是一个字符串所对应环境的映像对象.这是 ...