Python3 决策树ID3算法实现
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 24 19:01:40 2018 @author: markli 采用信息增益作为特征选择原则构建决策树
"""
import numpy as np;
import pandas as pd; class DecisionTree(object):
def __init__(self,features):
"""
features 样本具有的特征的取值范围,例如具有A1,A2两个特征,features=[A1,A2]
"""
self.features = features; def fit(self,TrainData):
"""
TrainData 训练样本,数据格式为二维数组m*n
m 个样本,n-1 个特征,最后一列是类别标签
"""
tree = self.GetDicTree(TrainData,self.features);
return tree; def SetEntropy(self,Data):
"""
获取数据集的经验熵
Data 数据集的最后一列,类别
"""
N = len(Data[:,-1]); #获取数据集的大小
Numoflabel = pd.value_counts(Data[:,-1]); #得数据集中到每一类别的数量
classlabel = list(set(Data[:,-1]));
entropy = 0;# 数据集的信息熵
for c in classlabel:
try:
Ck = Numoflabel[c]; #得到类别为c的样例的数量
entropy = entropy - Ck/N * np.log2(Ck/N);
except KeyError:
Ck = 0;
entropy = entropy - Ck; return entropy; def ConditionEntropy(self,Data,index):
"""
获取某一特征的条件经验熵
Data 数据集与TrainData格式一致
feature 特征的取值范围 例如 A1=[1,2,3]
feature_index 该特征在数据集中属于第几个特征,从0开始
"""
ConEntropy = 1;
feature_value = list(set(Data[:,index]));
N = len(Data[:,0]);
for a in feature_value:
d = Data[np.where(Data[:,index]==a)];
d_n = len(d);
if(d_n == 0):
return 0;
#计算特征取a值时的数据集的经验熵
d_entropy = self.SetEntropy(d);
ConEntropy = ConEntropy * (d_n / N) * d_entropy; return -ConEntropy; def SelectBestFeature(self,Data):
"""
选出数据集中最大信息增益的特征及最优特征
Data 数据集与TrainData格式一致
"""
AddEntropy = [];
entropy = self.SetEntropy(Data); #求得数据集的经验熵
feature_num = len(Data[0])-1; #获得数据集中特征数量
for i in range(feature_num):
ConEntropy = self.ConditionEntropy(Data,i); #求得每个特征的条件熵
adden = entropy - ConEntropy;
AddEntropy.append(adden); index = np.argmax(AddEntropy);
return index; def VoteClass(self,classlist):
"""
当特征被选完,但还是无法准确判断哪一类时,采用投票的方式确定其类
"""
classlabel = list(set(classlist));
dic = {};
for c in classlabel:
if(c not in dic.keys()):
dic[c] = 0;
else:
dic[c] += 1;
return max(dic); def GetDicTree(self,TrainData,features):
"""
构造字典树
TrainData 训练数据集
"""
classlabel = list(set(TrainData[:,-1])); #获得数据集的类别标签
#classlabel = [row[-1] for row in TrainData]; if(len(classlabel) == 1):
return classlabel[0]; if(len(TrainData[0]) == 1):
return self.VoteClass(TrainData[:,-1]); bestfeature_index = self.SelectBestFeature(TrainData);
bestfeature = features[bestfeature_index]; #选出最优的特征
dictree = {bestfeature:{}}; #以最优特征为节点构建子树
del(features[bestfeature_index]) #删除已选过的特征 #根据最优特征的取值拆分数据集,递归上述选最优特征过程
feature_attr = list(set(TrainData[:,bestfeature_index]));
for value in feature_attr:
sub_features = features[:];
subdata = self.SplitData(TrainData,bestfeature_index,value);
dictree[bestfeature][value] = self.GetDicTree(subdata,sub_features); return dictree; def SplitData(self,Data,feature_index,feature_value):
subdata = Data[np.where(Data[:,feature_index] == feature_value)];
n = len(Data[0]);
subdata = [[row[i] for i in range(n) if i != feature_index] for row in subdata];
return np.array(subdata);
该算法基本实现了运用信息增益实现了决策树,将选取最优的特征算法函数改为信息增益率就实现了C4.5算法,该算法还有剪枝操作没有实现,要是有能实现了可以交流一下。下面给出测试代码。
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 25 16:55:25 2018 @author: markli
"""
import numpy as np;
from DecisionTree_InformationAdd import DecisionTree; tree = DecisionTree(['no surfaceing','flippers']);
TrainData = np.array([[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]);
print(tree.fit(TrainData));
{'no surfaceing': {'': {'flippers': {'': 'yes', '': 'no'}}, '': 'no'}}
Python3 决策树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实现
决策树的分类过程和人的决策过程比较相似,就是先挑“权重”最大的那个考虑,然后再往下细分.比如你去看医生,症状是流鼻涕,咳嗽等,那么医生就会根据你的流鼻涕这个权重最大的症状先认为你是感冒,接着再根据你咳 ...
随机推荐
- ASP.NET MVC —— Model之一模型模板
http://www.cnblogs.com/lzhp/archive/2013/03/25/2981650.html Mvc model系列文章主要分为三部分:Model Templates,Mod ...
- 基础知识--:before伪元素和:after伪元素
http://book.51cto.com/art/201108/285688.htm 3.7 替换指定位置 大家都知道before和after是前.后的意思.但是奇怪的是,CSS中的:before ...
- RBAC: 基于角色的访问控制(Role-Based Access Control)
本文只讨论两种基于角色的访问控制的不同点,不涉及权限设计的数据库设计. 基于角色的访问控制(Role-Based Access Control)可分为隐式角色访问控制和显式角色访问控制. 隐式角色访问 ...
- Python3.x文件处理详解
Python3.x文件处理详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 任何一门语言都有其特有的操作文件的方式,Python2.x版本有两种操作文件的方式,没错就是open函 ...
- JQuery中2个等号与3个等号的区别
首先,== equality 等同,=== identity 恒等.==, 两边值类型不同的时候,要先进行类型转换,再比较.===,不做类型转换,类型不同的一定不等. 下面分别说明:先说 ===,这个 ...
- CXF wsdl2java 生成java代码供客户端使用
CXF wsdl2java 生成java代码供客户端使用 环境配置:1.下载apache-cxf-2.6.2在环境变量中配置CXF_HOME 值为E:\gavin\cxf\apache-cxf-3.0 ...
- Linux遇到的问题(一)Ubuntu报“xxx is not in the sudoers file.This incident will be reported” 错误解决方法
提示错误信息 www@iZ236j3sofdZ:~$ ifconfig Command 'ifconfig' is available in '/sbin/ifconfig' The command ...
- 20155320 2016-2017-2《Java程序设计》第八周学习总结
20155320 2016-2017-2<Java程序设计>第八周学习总结 教材学习内容总结 NIO与NIO2 Channel继承框架 想要取得Channel的操作对象,可以使用Chann ...
- Anaconda+django写出第一个web app(七)
今天来实现如何在页面弹出一些信息,比如注册成功后弹出注册成功的信息.这一点可以通过materialize里的Toasts来实现. django自带的messages可以告诉我们是否注册成功,以及注册失 ...
- oracel 复制A列的内容到列
update jieguo1 t set t.chinesetablename =t.tablezhushi where length(t.chinesetablename) >= 15 and ...