# -*- 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. (转)Maven学习总结(六)——Maven与Eclipse整合

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(六)——Maven与Eclipse整合 一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenP ...

  2. 20145215《网络对抗》Exp2 后门原理与实践

    20145215<网络对抗>Exp2 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 在网上下载软件的时候,后门很有可能被捆绑在下载的软件当中: 浏览网页的 ...

  3. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  4. service注入到action中

    service注入到action中 之前本人每次要获得service都是在action自己通过WebApplicationContext的getBean获得的,一直在spring中只配置到了servi ...

  5. C语言复习---杨辉三角打印

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math ...

  6. C#获取文件超大图标256*256(转)

    从Bing搜索得到,保存于此 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  7. Carmichael Numbers (Uva No.10006) -- 快速幂运算_埃氏筛法_打表

    #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> ...

  8. 一个ssm综合小案例-商品订单管理-第二天

    准确来说是第二三天,一时兴起,把这个小项目一鼓作气写完了(较大的bug 均已被我手动捉出并 fix )才来写一篇博客. 接上文 第一天配置继续讲解:

  9. Comparing Differently Trained Models

    Comparing Differently Trained Models At the end of the previous post, we mentioned that the solution ...

  10. js截取图片上传(仅原理)----闲的无聊了代码就不共享了!写的难看,不好意思给你们看了(囧)

    就算世界再坑爹,总有一些属性能带你走出绝望(伟大的absolute) 今天吐槽一下!......在我的世界里没有正统UI,所以效果图永远都是那么坑爹! 这里我要感谢有个position:absolut ...