原文: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) 转的更多相关文章

  1. 机器学习-ID3决策树算法(附matlab/octave代码)

    ID3决策树算法是基于信息增益来构建的,信息增益可以由训练集的信息熵算得,这里举一个简单的例子 data=[心情好 天气好  出门 心情好 天气不好 出门 心情不好 天气好 出门 心情不好 天气不好 ...

  2. R_Studio(决策树算法)鸢尾花卉数据集Iris是一类多重变量分析的数据集【精】

    鸢尾花卉数据集Iris是一类多重变量分析的数据集 通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类 针对 ...

  3. 【sklearn决策树算法】DecisionTreeClassifier(API)的使用以及决策树代码实例 - 鸢尾花分类

    决策树算法 决策树算法主要有ID3, C4.5, CART这三种. ID3算法从树的根节点开始,总是选择信息增益最大的特征,对此特征施加判断条件建立子节点,递归进行,直到信息增益很小或者没有特征时结束 ...

  4. scikit-learn决策树算法类库使用小结

    之前对决策树的算法原理做了总结,包括决策树算法原理(上)和决策树算法原理(下).今天就从实践的角度来介绍决策树算法,主要是讲解使用scikit-learn来跑决策树算法,结果的可视化以及一些参数调参的 ...

  5. 4-Spark高级数据分析-第四章 用决策树算法预测森林植被

    预测是非常困难的,更别提预测未来. 4.1 回归简介 随着现代机器学习和数据科学的出现,我们依旧把从“某些值”预测“另外某个值”的思想称为回归.回归是预测一个数值型数量,比如大小.收入和温度,而分类则 ...

  6. 《BI那点儿事》Microsoft 决策树算法

    Microsoft 决策树算法是由 Microsoft SQL Server Analysis Services 提供的分类和回归算法,用于对离散和连续属性进行预测性建模.对于离散属性,该算法根据数据 ...

  7. 就是要你明白机器学习系列--决策树算法之悲观剪枝算法(PEP)

    前言 在机器学习经典算法中,决策树算法的重要性想必大家都是知道的.不管是ID3算法还是比如C4.5算法等等,都面临一个问题,就是通过直接生成的完全决策树对于训练样本来说是“过度拟合”的,说白了是太精确 ...

  8. 转载:scikit-learn学习之决策树算法

    版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...

  9. [转]机器学习——C4.5 决策树算法学习

    1. 算法背景介绍 分类树(决策树)是一种十分常用的分类方法.它是一种监管学习,所谓监管学习说白了很简单,就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分 ...

随机推荐

  1. UTF编码问题小结

    在编程当中经常出现乱码的问题,而由此一般会引发很多惨剧,如读文件不成功.用户名显示乱码等,所以端午节抽了一小点时间好好看了一下编码问题,以备遗忘. 首先是中文编码,除了台湾和香港常用的BIG5,国内大 ...

  2. 开通GitHub以及使用笔记

    把小游戏的代码和博客迁移到GitHub上,路径是:https://github.com/GAMTEQ,欢迎访问 以下是使用GITHUB的一些命令 504  cd code 506  mkdir Fai ...

  3. [GRYZ2015]工业时代

    试题描述 小FF的第一片矿区已经开始运作了, 他着手开展第二片矿区……小FF的第二片矿区, 也是”NewBe_One“计划的核心部分, 因为在这片矿区里面有全宇宙最稀有的两种矿物,科学家称其为NEW矿 ...

  4. POI 读取Excel文档中的数据——兼容Excel2003和Excel2007

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. HSSF - 提供读写Microsoft Exce ...

  5. 最短路+线段交 POJ 1556 好题

    // 最短路+线段交 POJ 1556 好题 // 题意:从(0,5)到(10,5)的最短距离,中间有n堵墙,每堵上有两扇门可以通过 // 思路:先存图.直接n^2来暴力,不好写.分成三部分,起点 终 ...

  6. Azure支持docker简介以及使用指南

    Docker 是一个开源的项目,主要的特点是能将应用程序包装在一个 LXC (Linux Container) 容器中,当这些应用被包装进容器后,部署.迁移都变得更为简单.与传统的虚拟化技术相比,虚拟 ...

  7. Linux下的scp拷贝命令详解

    相同Linux系统中对文件复制拷贝可以用CP命令: cp [options] source dest cp [options] source... directory 说明:将一个档案拷贝至另一档案, ...

  8. 如何在不装ORACLE的情况下使用PLSQL

    原来我电脑装了oracle跟plsql,然后使用plsql的.后来因为某些原因,我重装了系统,把装的软件都格调了,需要重新装.当时在装plsql的时候我就想,我一直都是直接用plsql远程连接的服务器 ...

  9. Codeforces 599C Day at the Beach(想法题,排序)

    C. Day at the Beach One day Squidward, Spongebob and Patrick decided to go to the beach. Unfortunate ...

  10. Linux性能监测

    1.Linux性能监测:监测目的与工具介绍 看了某某教程.读了某某手册,按照要求改改某些设置.系统设定.内核参数就认为做到系统优化的想法很傻很天真:)系统优化是一项复杂.繁琐.长期的工作,优化前需要监 ...