# -*- 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算法实现的更多相关文章

  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实现

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

随机推荐

  1. Luogu 1613 跑路(最短路径,倍增)

    Luogu 1613 跑路(最短路径,倍增) Description 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是 ...

  2. Nginx反向代理下IIS获取真实IP

    1. iis 如果放在反向代理后面,日志里的c-ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事. 一.在反向代理设置X-Forwarded-For段,以下为nginx下的 ...

  3. (转)Maven学习总结(三)——使用Maven构建项目

    孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(三)——使用Maven构建项目 maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的 ...

  4. 伤不起:File.toPath() & Paths.get()

    java.nio.file.Path这个类应该是从java7才开始有的. 通过File类有两个方法可以转换成Path. 1. Path p = Paths.get(file.toURI());  // ...

  5. 位运算符和unity Layers

    按位运算符:与(&).非(~).或(|).异或(^).<<(左移).>>(右移).位运算符主要用来对二进制位进行操作. 逻辑运算符:&&.||.!.逻辑 ...

  6. Java基础-SSM之Spring的AOP编程

    Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...

  7. SpringJMS解析--使用示例

    Spring配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...

  8. dede调用多级导航的方法

    <div id="navWrapper"> <div class="content"> <ul class="nav m ...

  9. shell test条件判断

    test 条件判断 # 符号 [ ] 等同  test命令 test -lt # 判断大小 echo $? # 查看上句test命令返回状态 # 结果0为真,1为假 test -n "hel ...

  10. NOIP2016-D2-T2 蚯蚓(单调队列)

    构建三个单调队列(用STL),分别储存未切的蚯蚓,切后的第一段,切后的第二段,即可简单证明其单调性. 证明:设$q$为单调队列$\because a_1 \geqslant a_2 \geqslant ...