数据挖掘大作业——---------ID3决策树学号:02105111姓名:张旭一.决策树算法Ⅰ.决策树的基本概念机器学习中,决策树是一个预测模型;它代表的是对象属性值与对象值之间的一种映射关系。树中每个节点表示某个对象,每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应具有上述属性值的子对象。决策树仅有单一输出;若需要多个输出,可以建立独立的决策树以处理不同输出。从数据产生决策树的机器学习技术叫做决策树学习,通俗说就是决策树。决策树学习也是数据挖掘中一个普通的方法。在这里,每个决策树都表述了一种树型结构,它由它的分支来对该类型的对象依靠属性进行分类。每个决策树可以依靠对源数据库的分割进行数据测试。这个过程可以递归式的对树进行修剪。当不能再进行分割或一个单独的类可以被应用于某一分支时,递归过程就完成了。另外,随机森林分类器将许多决策树结合起来以提升分类的正确率。决策树同时也可以依靠计算条件概率来构造。决策树如果依靠数学的计算方法可以取得更加理想的效果。决策树一般可归纳为2类:分类与预测。本文着重关于其分类的作用,并以此来构建一个完整的决策树。Ⅱ.决策树分类器的优点以此次用的ID3算法为例,以此算法产生的决策树分类器具有很多优点:决策树的构造不需要任何领域知识或参数设置,因此适合于探测式知识发现;决策树可以处理高维数据,推理过程完全依赖于属性变量的取值特点,可自动忽略目标变量没有贡献的属性变量,也为判断属性变量的重要性,减少变量的数目提供参考,同时对噪声数据具有很好的健壮性;决策树归纳的学习和分类步骤是简单和快速的,推理过程可以表示成IfThen形式,并且具有很好的准确率;获取的知识用树的形式表示是直观的,并且容易被人理解。因而,决策树归纳分类是目前应用最广泛的归纳推理算法之一,在数据挖掘中受到研究者的广泛关注。但是其缺点也是很多的,如:信息增益的计算依赖于特征数目较多的特征,而属性取值最多的属性并不一定最优。ID3是非递增算法。ID3是单变量决策树(在分枝节点上只考虑单个属性),许多复杂概念的表达困难,属性相互关系强调不够,容易导致决策树中子树的重复或有些属性在决策树的某一路径上被检验多次。抗噪性差,训练例子中正例和反例的比例较难控制。二.ID3算法ID3算法主要针对属性选择问题,是决策树学习方法中最具影响和最为典型的算法。ID3采用贪心方法,其中决策树以自顶向下递归的分治方式构造。大多数决策树归纳算法都沿用这种自顶向下的方法,从训练元组集和它们的相关联的类标号开始构造决策树。随着树的构建,训练集递归地划分成较小的子集。ID3算法中关键的一步是属性选择度量,即选择分裂准则。其中的三种度量方法分别是信息增益、增益率和Gini指标。(示例算法选择了第一种方法)。当获取信息时,将不确定的内容转为确定的内容,因此信息伴着不确定性。算法的基本策略如下:1.选择一个属性放置在根节点,为每个可能的属性值产生一个分支2.将样本划分成多个子集,一个子集对应于一个分支3.在每个分支上递归地重复这个过程,仅使用真正到达这个分支的样本4.如果在一个节点上的所有样本拥有相同的类别,即停止该部分树的扩展此次问题在选择属性值时采用启发式标准,其内容为:只跟本身与其子树有关,采取信息理论用熵来量度。属性选择度量是一种选择分裂准则,将给定的类标记的训练元组的数据划分D“最好”地分成个体类的启发式方法。如果我们要根据分裂准则的输出将D划分成较小的划分,理想地,每个划分是“纯”的,即,落在给定划分的所有元组都属于相同的类。从概念上讲,最好的划分准则是导致最接近这种情况的划分。此次问题采用一种流行的属性选择度量——信息增益。信息增益度量基于ClaudeShannon在研究消息的值或“信息内容”的信息论方面的先驱工作。设节点N代表或存放划分D的元组。选择具有最高信息增益的属性作为节点N的分裂属性。该属性使结果划分中的元组分类所需的信息量最小,并反映这些划分中的最小随机性或“不纯性”。这种方法使对给定元组分类所需的期望测试数目最小,并确保找到一棵简单的树。熵是选择事件时选择自由度的量度,其计算方法为:P=freq(Cj,S)/|S|;Exp(S)=-SUM(P*LOG(P));SUM()函数是求j从1到n的和。Entropy(X)=SUM((|Ti|/|T|)*Exp(X);Gain(X)=Exp(X)-Entropy(X);为保证生成的决策树最小,ID3算法在生成子树时,选取使生成的子树的熵(即Gain(S))最小的特征来生成子树。三.实验内容实验目的:研究糖尿病数据(diabetes数据集),构造一颗决策树。实验数据:Title:PimaIndiansDiabetesDatabaseForEachAttribute:(allnumeric-valued)1.Numberoftimespregnant2.Plasmaglucoseconcentrationa2hoursinanoralglucosetolerancetest3.Diastolicbloodpressure(mmHg)4.Tricepsskinfoldthickness(mm)5.2-Hourseruminsulin(muU/ml)6.Bodymassindex(weightinkg/(heightinm)^2)7.Diabetespedigreefunction8.Age(years)ClassValueNumberofinstances05001268实验代码:%*****************************************%%目录%*****************************************closealls=menu('ID3Decisiontree','Decisiontree','Decisiontreepaint','10-foldcrossgraph','Expressgratitude','Exit');switchscase1,clc;clearall;closeallhidden;decisiontree();IDmenucase2,clc;clearall;closeallhidden;show_tree();IDmenu;case3,clc;clearall;closeallhidden;errorrate();IDmenu;case4,clc;clearall;closeallhidden;disp('Thanksforeveryonewhohelpedmeinthisprogrammingperiod');IDmenu;case5,clc;clearall;closeallhidden;clc;otherwiseclc;clearall;closeallhidden;disp('Error!')end%*****************************************%%构建一个决策树%*****************************************functiondecisiontree()[S1,S2,S3,S4,S5,S6,S7,S8,classity]=textread('train.txt','%f%f%f%f%f%f%f%f%s');D=[S1S2S3S4S5S6S7S8];AttributName={'preg','plas','pres','skin','insu','mass','pedi','age'};t=classregtree(D,classity,'names',AttributName);t=prune(t,'level',5);disp(t);end%*****************************************%%绘制一个决策树%*****************************************functionshow_tree()[S1,S2,S3,S4,S5,S6,S7,S8,classity]=textread('train.txt','%f%f%f%f%f%f%f%f%s');D=[S1S2S3S4S5S6S7S8];AttributName={'preg','plas','pres','skin','insu','mass','pedi','age'};t=classregtree(D,classity,'names',AttributName);t=prune(t,'level',8);view(t);end%*****************************************%%计算错误率并绘制成曲线%*****************************************functionerrorrate()[S1,S2,S3,S4,S5,S6,S7,S8,classity]=textread('train.txt','%f%f%f%f%f%f%f%f%s');D=[S1S2S3S4S5S6S7S8];AttributName={'preg','plas','pres','skin','insu','mass','pedi','age'};t=classregtree(D,classity,'names',AttributName);t=prune(t,'level',5);costsum=zeros(10,1);fork=1:10cost=test(t,'cross',D,classity);costsum=costsum+cost;endcostsum=costsum/10;i=1:10;plot(i,costsum,'-o');xlabel('交叉次数');ylabel('错误率');title('决策树k倍交叉错误率曲线');end实验结果:Decsiontree:Decisiontreeforclassification1ifplas127.5thennode2elsenode32ifage28.5thennode4elsenode53ifmass29.95thennode6elsenode74ifmass45.4thennode8elsenode95ifmass26.35thennode10elsenode116ifplas145.5thennode12elsenode137ifplas157.5thennode14elsenode158class=neg9class=pos10ifmass9.65thennode16elsenode1711ifplas99.5thennode18elsenode1912class=neg13ifage61thennode20elsenode2114ifage30.5thennode22elsenode2315class=pos16class=pos17class=neg18ifplas28.5thennode24elsenode2519ifpedi0.561thennode26elsenode2720ifage25.5thennode28elsenode2921class=neg22ifpres61thennode30elsenode3123ifpedi0.4295thennode32elsenode3324class=pos25class=neg26ifpedi0.2thennode34elsenode3527ifpreg6.5thennode36elsenode3728class=neg29ifmass27.1thennode38elsenode3930class=pos31ifmass41.8thennode40elsenode4132ifmass45.55thennode42elsenode4333class=pos34class=neg35ifpreg1.5thenn