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实现
决策树的分类过程和人的决策过程比较相似,就是先挑“权重”最大的那个考虑,然后再往下细分.比如你去看医生,症状是流鼻涕,咳嗽等,那么医生就会根据你的流鼻涕这个权重最大的症状先认为你是感冒,接着再根据你咳 ...
随机推荐
- python的类的继承-接口继承-归一化设计
1.先在子类本身找,如果子类没有,会去父类找 class Dad: '这个是爸爸类' money=10#Dad类的数据属性 def __init__(self,name): print("爸 ...
- P2513 [HAOI2009]逆序对数列
P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那 ...
- angular.module()参数问题
var app = angular.module('myApp', []); 第二个参数是依赖的模块,因为这里不需要依赖其它模块,因此为空,但是[]不能省略.
- C#的Lamda表达式_匿名函数
- 《翻译》PEP 380 – 委托子生成器语法
PEP 380 – 委托子生成器语法 翻译自: https://www.python.org/dev/peps/pep-0380/ 摘要 一项新的语法被提出了:生成器委托其部分操作给另一个生成器.委 ...
- js 正则学习小记之匹配字符串字面量
今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) va ...
- CSS规范 - 最佳实践--(来自网易)
最佳选择器写法(模块) /* 这是某个模块 */ .m-nav{}/* 模块容器 */ .m-nav li,.m-nav a{}/* 先共性 优化组合 */ .m-nav li{}/* 后个性 语义化 ...
- Django Book学习笔记(下)
Django的Session框架 对于Django加密,大致使用这样的格式: hashtype$salt$hash 原因? 一次哈希是一次单向的加密过程,你能容易地计算出一个给定值的哈希码,但是几乎不 ...
- Dream_Spark版本定制第一课
从今天起,我们踏上了新的Spark学习旅途.我们的目标是要像Spark官方机构那样有能力去定制Spark. 一. 我们最开始将从Spark Streaming入手. 为何从Spark Streami ...
- python3之SQLAlchemy
1.SQLAlchemy介绍 SQLAlchemy是Python SQL工具包和对象关系映射器,为应用程序开发人员提供了SQL的全部功能和灵活性. 它提供了一整套众所周知的企业级持久性模式,专为高效和 ...