决策树算法实现(train+test,matlab) 转
原文:http://www.zgxue.com/198/1985544.html
华电北风吹
天津大学认知计算与应用重点实验室
修改日期:2015/8/15
决策树是一种特别简单的机器学习分类算法。决策树想法来源于人类的决策过程。举个最简单的例子,人类发现下雨的时候,往往会有刮东风,然后天色变暗。对应于决策树模型,预测天气模型中的刮东风和天色变暗就是我们收集的特征,是否下雨就是类别标签。构建的决策树如下图所示 
决策树模型构建过程为,在特征集合中无放回的依次递归抽选特征作为决策树的节点——当前节点信息增益或者增益率最大,当前节点的值作为当前节点分支出来的有向边(实际上主要选择的是这些边,这个由信息增益的计算公式就可以得到)。对于这个进行直观解释
来说一个极端情况,如果有一个特征下,特征取不同值的时候,对应的类别标签都是纯的,决策者肯定会选择这个特征,作为鉴别未知数据的判别准则。由下面的计算信息增益的公式可以发现这时候对应的信息增益是最大的。
g(D,A)=H(D)-H(D|A)
g(D,A):表示特征A对训练数据集D的信息增益
H(D):表示数据集合D的经验熵
H(D|A):表示特征A给定条件下数据集合D的条件熵。
反之,当某个特征它的各个取值下对应的类别标签均匀分布的时候H(D|A)最大,又对于所有的特征H(D)是都一样的。因此,这时候的g(D,A)最小。
总之一句话,我们要挑选的特征是:当前特征下各个取值包含的分类信息最明确。
下面我们来看一个MATLAB编写的决策树算法,帮助理解
树终止条件为
1、特征数为空
2、树为纯的
3、信息增益或增益率小于阀值
一、模型训练部分
训练模型主函数:
function decisionTreeModel=decisionTree(data,label,propertyName,delta)
global Node;
Node=struct('level',-1,'fatherNodeName',[],'EdgeProperty',[],'NodeName',[]);
BuildTree(-1,'root','Stem',data,label,propertyName,delta);
Node(1)=[];
model.Node=Node;
decisionTreeModel=model;
递归构建决策树部分
function BuildTree(fatherlevel,fatherNodeName,edge,data,label,propertyName,delta)
global Node;
sonNode=struct('level',0,'fatherNodeName',[],'EdgeProperty',[],'NodeName',[]);
sonNode.level=fatherlevel+1;
sonNode.fatherNodeName=fatherNodeName;
sonNode.EdgeProperty=edge;
if length(unique(label))==1
sonNode.NodeName=label(1);
Node=[Node sonNode];
return;
end
if length(propertyName)<1
labelSet=unique(label);
k=length(labelSet);
labelNum=zeros(k,1);
for i=1:k
labelNum(i)=length(find(label==labelSet(i)));
end
[~,labelIndex]=max(labelNum);
sonNode.NodeName=labelSet(labelIndex);
Node=[Node sonNode];
return;
end
[sonIndex,BuildNode]=CalcuteNode(data,label,delta);
if BuildNode
dataRowIndex=setdiff(1:length(propertyName),sonIndex);
sonNode.NodeName=propertyName{sonIndex};
Node=[Node sonNode];
propertyName(sonIndex)=[];
sonData=data(:,sonIndex);
sonEdge=unique(sonData);
for i=1:length(sonEdge)
edgeDataIndex=find(sonData==sonEdge(i));
BuildTree(sonNode.level,sonNode.NodeName,sonEdge(i),data(edgeDataIndex,dataRowIndex),label(edgeDataIndex,:),propertyName,delta);
end
else
labelSet=unique(label);
k=length(labelSet);
labelNum=zeros(k,1);
for i=1:k
labelNum(i)=length(find(label==labelSet(i)));
end
[~,labelIndex]=max(labelNum);
sonNode.NodeName=labelSet(labelIndex);
Node=[Node sonNode];
return;
end
计算决策树下一个节点特征
function [NodeIndex,BuildNode]=CalcuteNode(data,label,delta)
LargeEntropy=CEntropy(label);
[m,n]=size(data);
EntropyGain=LargeEntropy*ones(1,n);
BuildNode=true;
for i=1:n
pData=data(:,i);
itemList=unique(pData);
for j=1:length(itemList)
itemIndex=find(pData==itemList(j));
EntropyGain(i)=EntropyGain(i)-length(itemIndex)/m*CEntropy(label(itemIndex));
end
% 此处运行则为增益率,注释掉则为增益
% EntropyGain(i)=EntropyGain(i)/CEntropy(pData);
end
[maxGainEntropy,NodeIndex]=max(EntropyGain);
if maxGainEntropy<delta
BuildNode=false;
end
计算熵
function result=CEntropy(propertyList)
result=0;
totalLength=length(propertyList);
itemList=unique(propertyList);
pNum=length(itemList);
for i=1:pNum
itemLength=length(find(propertyList==itemList(i)));
pItem=itemLength/totalLength;
result=result-pItem*log2(pItem);
end
二、模型预测
下面这个函数是根据训练好的决策树模型,输入测试样本集合和特征名,对每个测试样本预测输出结果。
function label=decisionTreeTest(decisionTreeModel,sampleSet,propertyName)
lengthSample=size(sampleSet,1);
label=zeros(lengthSample,1);
for sampleIndex=1:lengthSample
sample=sampleSet(sampleIndex,:);
Nodes=decisionTreeModel.Node;
rootNode=Nodes(1);
head=rootNode.NodeName;
index=GetFeatureNum(propertyName,head);
edge=sample(index);
k=1;
level=1;
while k<length(Nodes)
k=k+1;
if Nodes(k).level==level
if strcmp(Nodes(k).fatherNodeName,head)
if Nodes(k).EdgeProperty==edge
if Nodes(k).NodeName<10
label(sampleIndex)=Nodes(k).NodeName;
break;
else
head=Nodes(k).NodeName;
index=GetFeatureNum(propertyName,head);
edge=sample(index);
level=level+1;
end
end
end
end
end
end
由于训练好的决策树模型里面保存的是节点名,所以在预测的时候需要将节点名对应的特征得到。下面这个函数是为了方便得到特征维数序号。
function result=GetFeatureNum(propertyName,str)
result=0;
for i=1:length(propertyName)
if strcmp(propertyName{i},str)==1
result=i;
break;
end
end
三、决策树实验
这是很多书本上都有的一个例子,可以看出预测结果准确率100%。
clear;clc;
% OutlookType=struct('Sunny',1,'Rainy',2,'Overcast',3);
% TemperatureType=struct('hot',1,'warm',2,'cool',3);
% HumidityType=struct('high',1,'norm',2);
% WindyType={'True',1,'False',0};
% PlayGolf={'Yes',1,'No',0};
% data=struct('Outlook',[],'Temperature',[],'Humidity',[],'Windy',[],'PlayGolf',[]);
Outlook=[1,1,3,2,2,2,3,1,1,2,1,3,3,2]';
Temperature=[1,1,1,2,3,3,3,2,3,3,2,2,1,2]';
Humidity=[1,1,1,1,2,2,2,1,2,2,2,1,2,1]';
Windy=[0,1,0,0,0,1,1,0,0,0,1,1,0,1]';
data=[Outlook Temperature Humidity Windy];
PlayGolf=[0,0,1,1,1,0,1,0,1,1,1,1,1,0]';
propertyName={'Outlook','Temperature','Humidity','Windy'};
delta=0.1;
decisionTreeModel=decisionTree(data,PlayGolf,propertyName,delta);
label=decisionTreeTest(decisionTreeModel,data,propertyName);
$(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('
- ').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
- ').text(i)); }; $numbering.fadeIn(1700); }); });
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文转载自zhangzhengyi03539博客,版权归zhangzhengyi03539所有
决策树算法实现(train+test,matlab) 转的更多相关文章
- 机器学习-ID3决策树算法(附matlab/octave代码)
ID3决策树算法是基于信息增益来构建的,信息增益可以由训练集的信息熵算得,这里举一个简单的例子 data=[心情好 天气好 出门 心情好 天气不好 出门 心情不好 天气好 出门 心情不好 天气不好 ...
- R_Studio(决策树算法)鸢尾花卉数据集Iris是一类多重变量分析的数据集【精】
鸢尾花卉数据集Iris是一类多重变量分析的数据集 通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类 针对 ...
- 【sklearn决策树算法】DecisionTreeClassifier(API)的使用以及决策树代码实例 - 鸢尾花分类
决策树算法 决策树算法主要有ID3, C4.5, CART这三种. ID3算法从树的根节点开始,总是选择信息增益最大的特征,对此特征施加判断条件建立子节点,递归进行,直到信息增益很小或者没有特征时结束 ...
- scikit-learn决策树算法类库使用小结
之前对决策树的算法原理做了总结,包括决策树算法原理(上)和决策树算法原理(下).今天就从实践的角度来介绍决策树算法,主要是讲解使用scikit-learn来跑决策树算法,结果的可视化以及一些参数调参的 ...
- 4-Spark高级数据分析-第四章 用决策树算法预测森林植被
预测是非常困难的,更别提预测未来. 4.1 回归简介 随着现代机器学习和数据科学的出现,我们依旧把从“某些值”预测“另外某个值”的思想称为回归.回归是预测一个数值型数量,比如大小.收入和温度,而分类则 ...
- 《BI那点儿事》Microsoft 决策树算法
Microsoft 决策树算法是由 Microsoft SQL Server Analysis Services 提供的分类和回归算法,用于对离散和连续属性进行预测性建模.对于离散属性,该算法根据数据 ...
- 就是要你明白机器学习系列--决策树算法之悲观剪枝算法(PEP)
前言 在机器学习经典算法中,决策树算法的重要性想必大家都是知道的.不管是ID3算法还是比如C4.5算法等等,都面临一个问题,就是通过直接生成的完全决策树对于训练样本来说是“过度拟合”的,说白了是太精确 ...
- 转载:scikit-learn学习之决策树算法
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
- [转]机器学习——C4.5 决策树算法学习
1. 算法背景介绍 分类树(决策树)是一种十分常用的分类方法.它是一种监管学习,所谓监管学习说白了很简单,就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分 ...
随机推荐
- MongoDB@入门一
安装MongoDB自行搜索, 我这里提供GUI版本类似navicat. 1. 数据库层面 show dbs #查看服务器上的数据库 [local 0.000GB] use test #切换到指定 ...
- Java中的return
比如你写了一个叫getInt的类public int getInt(){ //这个类的意思就是一个具有返回值类型为int的类了 //通常如果不需要返回值的话 这里就写void....//你的具体代码r ...
- MFC特定函数的应用20160720(SystemParametersInfo,GetWindowRect,WriteProfileString,GetSystemMetrics)
1.SystemParametersInfo函数可以获取和设置数量众多的windows系统参数 MFC中可以用 SystemParametersInfo(……) 函数来获取和设置系统信息,如下面例子所 ...
- FindBugs Bug Descriptions
FindBugs Bug Descriptions ◇例1: Integer a = ; String str ="; System.out.println(str == a.toStrin ...
- Lucene Query Term Weighting
方法 public static Query TermWeighting(Query tquery,Map<String,Float>term2weight){ BooleanQuery ...
- 从一个开发的角度看负载均衡和LVS(转)
原文:http://blog.hesey.net/2013/02/introduce-to-load-balance-and-lvs-briefly.html 在大规模互联网应用中,负载均衡设备是必不 ...
- 03 javadoc
javadoc从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档 1.标签.命令格式: 2.使用方式: 2.1 dos命令行格式:javadoc XXX.java 2.2 ec ...
- 咏南CS多层插件式开发框架支持最新的DELPHI XE7
DATASNAP中间件: 中间件已经在好几个实际项目中应用,长时间运行异常稳定,可无人值守: 可编译环境:DELPHI XE5~DELPHI XE7,无需变动代码: 支持传统TCP/IP方式也支持RE ...
- [iOS UI进阶 - 3.0] 触摸事件的基本处理
A.需要掌握和练习的 1.介绍事件类型2.通过按钮的事件处理引出view的事件处理3.响应者对象 --> UIResponder --> UIView4.view的拖拽* 实现触摸方法,打 ...
- UVaLive 6859 Points (几何,凸包)
题意:给定 n 个点,让你用最长的周长把它们严格包围起来,边长只能用小格子边长或者是小格子对角线. 析:先把每个点的上下左右都放到一个集合中,然后求出一个凸包,然后先边长转成题目的方式,也好转两个点的 ...