1、第03章 决策树p决策树pID3算法pC4.5算法pCART算法3.1 引言3.1 引言n 决策树决策树(Decision Tree)是一种用于监督学习的层次模型。n 1979年,J.R.Quinlan创立了ID3算法原型。分别于1983年和1986年对ID3进行了总结和改进,确定了决策树模型。n 决策树可以是二叉树也可以是多叉树,每个非叶结点表示一个特征属性上的测试,每个分支代表该特征属性在某个值域上的输出,而每个叶结点存放一个(分类)类别。n 使用决策树进行决策的过程就是从根结点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子结点,将叶子结点存放的类别作为决策结果。
2、n 决策树的决策过程非常直观,容易被人理解。目前,决策树已经成功运用于医学、制造产业、天文学、分支生物学以及商业等诸多领域。3.2 决策树n 一个简单的互动游戏:20问题n 约定:长方形结点代表判断模块,椭圆形结点代表终止模块。那么一个简化的垃圾邮件分类系统。3.2.1 决策树的基本思想程序设计中,最基本的语句条件分支结构就是if-then结构。而最早的决策树就是利用这类结构分隔数据的一种分类学习方法。3.2 决策树3.2.2 决策树的构造表表3-1 3-1 活跃用户调查表活跃用户调查表统计人数统计人数年龄收入是否学生性别是否购买付费游戏装备6464青高不是男不买6464青高不是女不买1281
3、28中高不是男买6060老中等不是男买6464老低是男买6464老低是女不买6464中低是女买128128青中等不是男不买6464青低是男买132132老中等是男买6464青中等是女买3232中中等不是女买3232中高是男买6464老中等不是女不买CLS(Concept Learning System)算法的思想:首先,将决策树设计为三类结点,根结点、叶子结点和内部结点。3.2 决策树3.2.2 决策树的构造n 选年龄特征作为根结点,将所有的样本分为老、中、青三个集合,构成决策树的第一层。表表3-2 3-2 按按“年龄年龄特征特征”划分划分的表格的表格统计人数统计人数年龄收入是否学生性别是否购
4、买付费游戏装备6464青高不是男不买6464青高否女不买128128青中等否男不买6464青低是男买6464青中等是女买128128中中高高不是不是男男买买6464中中低低是是女女买买3232中中中中等等不是不是女女买买3232中中高高是是男男买买6060老中等不是男买6464老低是男买6464老低是女不买132132老中等是男买6464老中等不是女不买n 年龄特征为“中”,都会购买游戏装备。(纯结点,不需要再划分了)3.2 决策树3.2.2 决策树的构造n 接着,将年龄特征等于“青”的选项剪切出一张表格,再选择第二个特征:收入。表表3-3 3-3 按按“青年青年-收入收入”划分划分的表格的表
5、格统计人数统计人数年龄收入是否学生性别是否购买付费游戏装备6464青高不是男不买6464青高不是女不买128128青中等不是男不买6464青低是男买6464青中等是女买n 对于“青”年,如果收入“高”,则不会购买游戏装备。(纯结点)n 对于“青”年,如果收入“低”,则会购买游戏装备。(纯结点)3.2 决策树3.2.2 决策树的构造n 最后,继续划分“中等”收入的下一个特征:是否学生表表3-4 3-4 按按“青年青年-中中等等-是否是否学生学生”划分划分的表格的表格统计人数统计人数年龄收入是否学生性别是否购买付费游戏装备128 128 青中等不是男不买6464青中等是女买n 对于“青”年-“中等
6、”收入,如果不是学生,则不会购买游戏装备。(纯结点)n 对于“青”年-“中等”收入,如果是学生,则会购买游戏装备。(纯结点)3.2 决策树3.2.2 决策树的构造按年龄特征-收入-是否学生划分的决策树分支3.2 决策树3.2.2 决策树的构造表表3-5 3-5 按按老年老年-性别划分的表格性别划分的表格统计人数统计人数年龄收入是否学生性别是否购买付费游戏装备60 60 老 中等不是男 买132 132 老 中等是 男买64 64 老 低 是 男 买64 64 老 中等不是女 不买64 64 老 低 是 女不买n 接着,将年龄特征等于“老”年的选项剪切出一张表格,再选择第二个特征:性别。n 对于
7、“老”年-“男”性,则会购买游戏装备。(纯结点)n 对于“老”年-“女”性,则不会购买游戏装备。(纯结点)3.2 决策树3.2.2 决策树的构造活跃用户的分类决策树3.2 决策树3.2.2 决策树的构造非活跃用户调查决策树的概率计算(人数统计)3.2 决策树3.2.2 决策树的构造n 构造决策树的关键步骤是分裂分裂属性属性n 在某个结点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。所谓尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况。属性是离散值,且不要求生成二叉决策树。属性是离散值,且要求生成二叉决策树。属性是连续值。此
8、时确定一个值作为分裂点。n 构造决策树的关键性内容是进行属性选择度量,它决定了拓扑结构及分裂点的选择。n 属性选择度量算法有很多,一般使用自顶向下递归分治法,并采用不回溯的贪心策略。3.2 决策树3.2.3 决策树的算法框架n 决策树决策树主函数主函数输入需要分类的数据集和类别标签;计算最优特征子函数:根据某种分类规则得到最优划分特征,并创建特征的划分结点;划分数据集子函数:按照该特征的每个取值划分数据集为若干部分;根据划分子函数的计算结果构建出新的结点,作为决策树生长出的新分支;检验是否终止;将划分的新结点包含的数据集和类别标签作为输入,递归执行上述各步骤。3.2 决策树3.2.2 决策树的
9、构造n计算计算最优特征子函数最优特征子函数ID3算法以信息增益,C4.5算法以信息增益率,CART则是以结点方差的大小等特征,作为属性选择度量方法。选择分裂后信息增益最大的属性进行分裂。n划分划分数据集函数数据集函数分隔数据,有时需要删除某个特征轴所在的数据类,返回剩余的数据集;有时干脆将数据集一分为二。n分类器分类器通过遍历整棵决策树,使测试集数据找到决策树中叶子结点对应的类别标签。3.2 决策树3.2.4 信息增益n 首先,将属性特征数字化,年龄=0(青),1(中),2(老);收入=0(高),1(中等),2(低);是否学生=0(是),1(不是);性别=0(男),1(女)n 然后,“最好”地
10、分裂结点,将数据集从无序变为有序n 为了衡量一个事物特征取值的有(无)序程度,一个重要的概念:信息熵用来衡量一个随机变量出现的期望值,一个变量的信息熵越大,那么它蕴含的情况(景)就越多,也就是说需要更多的信息才能完全确定它。n 信息熵的公式表示。3.2 决策树3.2.4 信息增益两类问题的熵函数3.2 决策树3.2.4 信息增益3.2 决策树3.2.4 信息增益3.2 决策树3.2.4 信息增益3.2 决策树3.2.4 信息增益from numpy import*def calcShannonEnt(dataSet):输入:数据集 输出:数据集的香农熵 描述:计算给定数据集的香农熵 num=l
11、en(dataSet)#样本集总数 classList=c-1 for c in dataSet#抽取分类信息 labelCounts=#词典形式存储类别计数 for cs in set(classList):#对每个类别计数信息熵的程序代码如下:3.2 决策树3.2.4 信息增益labelCountscs=classList.count(cs)shannonEnt=0.0#信息熵 for key in labelCounts:prob=labelCountskey/float(num)shannonEnt-=prob*log2(prob)return shannonEnt def Creat
12、eDataSet():dataSet=1,1,Yes,1,1,Yes,1,0,No,0,1,No,0,1,No labels=no surfacing,flippers3.2 决策树3.2.4 信息增益 return dataSet,labelsdef CreateDataSet():dataSet=1,1,Yes,1,1,Yes,1,0,No,0,1,No,0,1,No labels=no surfacing,flippers return dataSet,labelsmyDat,labels=CreateDataSet()print(calcShannonEnt(myDat)运行结果:0.
13、9709505944553.3 ID3决策树3.3.1 ID3算法表表3-6天气与打球关联关系表天气与打球关联关系表DayOutlookTempHumidityWindy PlayD1SunnyHotHighWeakNoD2SunnyHotHighStrongNoD3OvercastHotHighWeakYesD4RainMildHighWeakYesD5RainCoolNormalWeakYesD6RainCoolNormalStrongNoD7OvercastCoolNormalStrongYesD8SunnyMildHighWeakNoD9SunnyCoolNormalWeakYesD1
14、0RainMildNormalWeakYesD11SunnyMildNormalStrongYesD12OvercastMildHighStrongYesD13OvercastHotNormalWeakYesD14RainMildHighStrongNo3.3 ID3决策树3.3.1 ID3算法3.3 ID3决策树3.3.1 ID3算法3.3 ID3决策树3.3.1 ID3算法3.3 ID3决策树3.3.1 ID3算法n ID3算法中根据信息论的信息增益评估和选择特征。每次选择信息增益最大的候选特征,作为判断模块。n 通过裁剪、合并相邻的无法产生大量信息增益的叶子结点,去除过度匹配(过拟合)的
15、问题。n 信息增益与属性的值域大小成正比。属性取值种类越多,越有可能成为分裂属性。n ID3也不能处理连续分布的数据特征。3.3 ID3决策树3.3.2 ID3的实现from math import log2import treePlotter class ID3Tree(object):def _init_(self):self.tree=#ID3 Tree self.dataSet=#数据集 self.labels=#标签集 def getDataSet(self,dataset,labels):self.dataSet=dataset self.labels=labels def tra
16、in(self):#labels=copy.deepcopy(self.labels)labels=self.labels:self.tree=self.buildTree(self.dataSet,labels)3.3 ID3决策树3.3.2 ID3的实现 def buildTree(self,dataSet,labels):classList=ds-1 for ds in dataSet#提取样本的类别 if classList.count(classList0)=len(classList):#单一类别 return classList0 if len(dataSet0)=1:#没有属性
17、需要划分了!return self.classify(classList)bestFeat=self.findBestSplit(dataSet)#选取最大增益的属性序号 bestFeatLabel=labelsbestFeat tree=bestFeatLabel:#构造一个新的树结点 del(labelsbestFeat)#从总属性列表中去除最大增益属性 featValues=dsbestFeat for ds in dataSet#抽取最大增益属性的取值列表 uniqueFeatValues=set(featValues)#选取最大增益属性的数值类别3.3 ID3决策树3.3.2 ID3
18、的实现for value in uniqueFeatValues:#对于每一个属性类别 subLabels=labels:subDataSet=self.splitDataSet(dataSet,bestFeat,value)#分裂结点 subTree=self.buildTree(subDataSet,subLabels)#递归构造子树 treebestFeatLabelvalue=subTree return tree#计算出现次数最多的类别标签 def classify(self,classList):items=dict(classList.count(i),i)for i in cl
19、assList)return itemsmax(items.keys()3.3 ID3决策树3.3.2 ID3的实现#计算最优特征 def findBestSplit(self,dataset):numFeatures=len(dataset0)-1 baseEntropy=self.calcShannonEnt(dataset)#基础熵 num=len(dataset)#样本总数 bestInfoGain=0.0 bestFeat=-1#初始化最优特征向量轴#遍历数据集各列,寻找最优特征轴 for i in range(numFeatures):featValues=dsi for ds i
20、n dataset uniqueFeatValues=set(featValues)newEntropy=0.0#按列和唯一值,计算信息熵 for val in uniqueFeatValues:subDataSet=self.splitDataSet(dataset,i,val)prob=len(subDataSet)/float(num)#子集中的概率 newEntropy+=prob*3.3 ID3决策树3.3.2 ID3的实现 self.calcShannonEnt(subDataSet)infoGain=baseEntropy-newEntropy#信息增益 if infoGain
21、bestInfoGain:#挑选最大值 bestInfoGain=baseEntropy-newEntropy bestFeat=i return bestFeat#从dataset数据集的feat特征中,选取值为value的数据 def splitDataSet(self,dataset,feat,values):retDataSet=for featVec in dataset:if featVecfeat=values:reducedFeatVec=featVec:feat reducedFeatVec.extend(featVecfeat+1:)retDataSet.append(re
22、ducedFeatVec)return retDataSet3.3 ID3决策树3.3.2 ID3的实现#计算dataSet的信息熵 def calcShannonEnt(self,dataSet):num=len(dataSet)#样本集总数 classList=c-1 for c in dataSet#抽取分类信息 labelCounts=for cs in set(classList):#对每个分类进行计数 labelCountscs=classList.count(cs)shannonEnt=0.0 for key in labelCounts:prob=labelCountskey/
23、float(num)shannonEnt-=prob*log2(prob)return shannonEnt#预测。对输入对象进行ID3分类 def predict(self,tree,newObject):3.3 ID3决策树3.3.2 ID3的实现#判断输入值是否为“dict”while type(tree)._name_=dict:key=list(tree.keys()0 tree=treekeynewObjectkey return treeif _name_=_main_:def createDataSet():dataSet=2,1,0,1,No,2,1,0,0,No,0,1,0
24、,1,Yes,1,2,0,1,Yes,1,0,1,1,Yes,1,0,1,0,No,0,0,1,0,Yes,2,2,0,1,No,2,0,1,1,Yes,3.3 ID3决策树3.3.2 ID3的实现 1,2,1,1,Yes,2,2,1,0,Yes,0,2,0,0,Yes,0,1,1,1,Yes,1,2,0,0,No features=Outlook,Temp,Humidity,Wind#features=no surfacing,flippers return dataSet,featuresid3=ID3Tree()#创建一个ID3决策树 ds,labels=createDataSet()i
25、d3.getDataSet(ds,labels)id3.train()#训练ID3决策树 print(id3.tree)#输出ID3决策树 print(id3.predict(id3.tree,Outlook:2,Temp:1,Humidity:0,Wind:1)treePlotter.createPlot(id3.tree)3.3 ID3决策树3.3.2 ID3的实现运行结果Outlook:0:Yes,1:Wind:0:No,1:Yes,2:Humidity:0:No,1:YesNoID3算法对天气-打球关系的决策树3.4 C4.5决策树3.4.1 C4.5算法3.4 C4.5决策树3.4.
26、1 C4.5算法n C4.5算法使用信息增益率代替信息增益,进行特征选择,克服了信息增益选择特征时偏向于特征值个数较多的不足;n 其具体算法步骤与ID3类似;n C4.5能够完成对连续属性的离散化处理;能够对不完整数据进行处理;n 分类规则易于理解、准确率较高;n 效率低,只适合于能够驻留于内存的数据集。3.4 C4.5决策树3.4.2 C4.5的实现from math import log2import treePlotterfrom numpy import*#计算信息熵def calcShannonEnt(dataSet):num=len(dataSet)#样本集总数 classList
27、=c-1 for c in dataSet#抽取分类信息 labelCounts=for cs in set(classList):#对每个分类进行计数 labelCountscs=classList.count(cs)shannonEnt=0.0#信息熵 for key in labelCounts:prob=labelCountskey/float(num)shannonEnt-=prob*log2(prob)return shannonEnt3.4 C4.5决策树3.4.2 C4.5的实现#从dataset数据集的feat特征中,选取值为value的数据def splitDataSet(
28、dataset,feat,value):retDataSet=for featVec in dataset:if featVecfeat=value:reducedFeatVec=featVec:feat reducedFeatVec.extend(featVecfeat+1:)retDataSet.append(reducedFeatVec)return retDataSet#计算最优特征def getBestFeat(dataSet):numFeats=len(dataSet0:-1)num=len(dataSet)newEntropy=calcShannonEnt(dataSet)Con
29、ditionEntropy=#初始化条件熵 splitInfo=#for C4.5 计算增益率 allFeatVList=3.4 C4.5决策树3.4.2 C4.5的实现#计算所有属性的信息增益值 for fe in range(numFeats):#对于每个属性 featList=datafe for data in dataSet splitI,featureValueList=calcSplitInfo(featList)allFeatVList.append(featureValueList)splitInfo.append(splitI)resultGain=0.0#计算第fe个属性
30、的信息增益 for value in featureValueList:subSet=splitDataSet(dataSet,fe,value)appearNum=float(len(subSet)subEntropy=calcShannonEnt(subSet)resultGain+=(appearNum/num)*subEntropy ConditionEntropy.append(resultGain)#总条件熵 infoGainArray=newEntropy*ones(numFeats)-array(ConditionEntropy)infoGainRatio=infoGainAr
31、ray/array(splitInfo)#C4.5信息增益 bestFeatureIndex=argsort(-infoGainRatio)0 return bestFeatureIndex,allFeatVListbestFeatureIndex3.4 C4.5决策树3.4.2 C4.5的实现#计算划分信息def calcSplitInfo(featureVList):numEntries=len(featureVList)featureValueSetList=list(set(featureVList)valueCounts=featureVList.count(featVect)for
32、 featVect in featureValueSetList#calc shannonEnt pList=float(item)/numEntries for item in valueCounts iList=item*math.log2(item)for item in pList splitInfo=-sum(iList)return splitInfo,featureValueSetList#计算出现次数最多的类别标签def majorityCnt(classList):items=dict(classList.count(i),i)for i in classList)retur
33、n itemsmax(items.keys()3.4 C4.5决策树3.4.2 C4.5的实现#构造C4.5分类决策树def C45Tree(dataSet,labels):classList=ds-1 for ds in dataSet#提取样本的类别 if classList.count(classList0)=len(classList):#单一类别 return classList0 if len(dataSet0)=1:#没有属性需要划分了!return majorityCnt(classList)bestFeat,featValueList=getBestFeat(dataSet)
34、#选取最大增益的属性序号 bestFeatLabel=labelsbestFeat myTree=bestFeatLabel:#构造一个新的树结点 del(labelsbestFeat)#从总属性列表中去除最大增益属性 for value in featValueList:#对于每一个属性类别 subLabels=labels:subDataSet=splitDataSet(dataSet,bestFeat,value)#分裂结点 myTreebestFeatLabelvalue=C45Tree(subDataSet,labels)#递归构造子树 return myTree3.4 C4.5决策
35、树3.4.2 C4.5的实现def classify(inputTree,featLabels,testVec):输入:决策树,分类标签,测试数据 输出:决策结果 描述:应用C4.5决策树进行分类 firstStr=list(inputTree.keys()0 secondDict=inputTreefirstStr featIndex=featLabels.index(firstStr)for key in secondDict.keys():if testVecfeatIndex=key:if type(secondDictkey)._name_=dict:classLabel=class
36、ify(secondDictkey,featLabels,testVec)else:classLabel=secondDictkey return classLabel3.4 C4.5决策树3.4.2 C4.5的实现def predict(inputTree,featLabels,testDataSet):输入:决策树,分类标签,测试数据集 输出:决策结果 描述:运行C4.5决策树,对输入数据进行分类 classLabelAll=for testVec in testDataSet:classLabelAll.append(classify(inputTree,featLabels,testV
37、ec)return classLabelAll3.4 C4.5决策树3.4.2 C4.5的实现def createDataSet():dataSet=2,1,0,1,No,2,1,0,0,No,0,1,0,1,Yes,1,2,0,1,Yes,1,0,1,1,Yes,1,0,1,0,No,0,0,1,0,Yes,2,2,0,1,No,2,0,1,1,Yes,1,2,1,1,Yes,2,2,1,0,Yes,0,2,0,0,Yes,0,1,1,1,Yes,1,2,0,0,No labels=Outlook,Temp,Humidity,Windy return dataSet,labels3.4 C4
38、.5决策树3.4.2 C4.5的实现def createTestSet():testSet=0,1,0,0,0,2,1,0,2,1,1,0,0,1,1,1,1,1,0,1,1,0,1,0,2,1,0,1 return testSetdef main():dataSet,labels=createDataSet()labels_tmp=labels:#复制createTree会改变labels desicionTree=C45Tree(dataSet,labels_tmp)print(desicionTree:n,desicionTree)treePlotter.createPlot(desic
39、ionTree)testSet=createTestSet()print(predict result:n,predict(decisionTree,labels,testSet)if _name_=_main_:main()3.4 C4.5决策树3.4.2 C4.5的实现decisionTree:Outlook:0:Yes,1:Windy:0:No,1:Yes,2:Humidity:0:No,1:Yespredict result:Yes,Yes,Yes,Yes,Yes,No,No运行结果3.5 sklearn与回归树3.5.1 回归算法原理n CART(Classification And
40、 Regression Tree)算法是目前决策树算法中最为成熟的一类算法,应用范围也比较广泛。它既可用于分类,也可用于预测。n 预测时,CART使用最小剩余方差来判定回归树的最优划分,确保划分之后的子树与样本点的误差方差最小。n CART算法的主要流程:输入需要分类的数据集和类别标签。使用最小剩余方差判定回归树的最优划分,并创建特征的划分结点。最小剩余方差子函数,计算数据集各列的最优划分方差、划分列、划分值。在划分结点,使用二分数据集子函数将数据集划分为两部分。根据二分数据的结果,构建出新的左、右结点,作为树生长出的两个分支。检验是否符合递归的终止条件。将划分的新结点包含的数据集和类别标签作
41、为输入,递归执行上述步骤。3.5 sklearn与回归树3.5.1 回归算法原理n CART(Classification And Regression Tree)算法是目前决策树算法中最为成熟的一类算法,应用范围也比较广泛。它既可用于分类,也可用于预测。n 预测时,CART使用最小剩余方差来判定回归树的最优划分,确保划分之后的子树与样本点的误差方差最小。n CART算法的主要流程:输入需要分类的数据集和类别标签。使用最小剩余方差判定回归树的最优划分,并创建特征的划分结点。最小剩余方差子函数,计算数据集各列的最优划分方差、划分列、划分值。在划分结点,使用二分数据集子函数将数据集划分为两部分。根
42、据二分数据的结果,构建出新的左、右结点,作为树生长出的两个分支。检验是否符合递归的终止条件。将划分的新结点包含的数据集和类别标签作为输入,递归执行上述步骤。3.5 sklearn与回归树3.5.2 最小剩余方差法n CART采用最小剩余方差法来划分结点,算法描述如下:首先令最佳方差为无限大 bestVar=inf;依次遍历所有特征列以及每个特征列的所有样本点,在每个样本点上二分数据集;计算二分数据集的总方差currentVar,如果currentVar bestVar,则bestVar=currentVar;返回计算的最优分支特征列、分支特征值,以及左右分支子数据集。3.5 sklearn与回
43、归树3.5.3 剪枝策略n 由于使用了连续型数据,CART可以生长出大量的分支树,为了避免过拟合的问题,预测树采用了剪枝的方法。n 方法有两类:先剪枝,当结点的划分子集某个标准低于预定义的阈值时,子集划分将终止。选取适当的阈值比较困难,不必生成整棵决策树,算法简单,效率高,适合大规模问题的粗略估计。后剪枝,递归估算每个内部结点所覆盖样本结点的误判率,如果内部结点低于这个误判率就将其变成叶子结点,该叶子结点的类别标签由原内部结点的最优叶子结点所决定。3.5 sklearn与回归树3.5.3 剪枝策略3.5 sklearn与回归树3.5.4 sklearn实现n sklearn.tree提供了CA
44、RT算法的实现方法,构造函数如下:n 主要参数说明:class sklearn.tree.DecisionTreeRegressor(criterion=mse,splitter=best,max_depth=None,min_samples_split=2,min_samples_leaf=1,min_weight_fraction_leaf=0.0,max_features=None,random_state=None,max_leaf_nodes=None,min_impurity_decrease=0.0,min_impurity_split=None,presort=False)cr
45、iterion:字符串,默认参数为“mse”。用于度量拆分的质量。splitter:字符串,默认参数为“best”。每个结点上的拆分策略。max_depth:决策树的最大深度。如果参数为None,结点一直扩展直到为“纯”结点3.5 sklearn与回归树3.5.4 sklearn实现min_samples_split:整型,浮点型,默认参数为2。拆分内部结点所需的最小样本数。min_samples_leaf:整型,浮点型,默认参数为1。叶结点上所需的最小样本数。max_features:寻找最佳分裂结点时要考虑的特征数量。min_impurty_decrease:如果从此结点分割,导致的杂质(
46、impurity)大于或等于该值,则拆分此结点。min_impurty_split:如果一个结点的杂质超过了阈值,它就会分裂,否则它就是一片叶子。3.5 sklearn与回归树3.5.4 sklearn实现import numpy as npimport matplotlib.pyplot as pltfrom sklearn.tree import DecisionTreeRegressorfrom sklearn.ensemble import AdaBoostRegressor#构造测试数据rng=np.random.RandomState(1)X=np.linspace(-5,5,20
47、0):,np.newaxisy=np.sin(X).ravel()+np.sin(6*X).ravel()+rng.normal(0,0.1,X.shape0)#回归决策树regr_1=DecisionTreeRegressor(max_depth=4)#集成模型下的回归决策树regr_2=AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),n_estimators=200,random_state=rng)3.5 sklearn与回归树3.5.4 sklearn实现regr_1.fit(X,y)regr_2.fit(X,y)#预测y_1=
48、regr_1.predict(X)y_2=regr_2.predict(X)#画图plt.figure()plt.scatter(X,y,c=k,label=training samples)plt.plot(X,y_1,c=g,label=n_estimators=1,linewidth=2)plt.plot(X,y_2,c=r,label=n_estimators=300,linewidth=2)plt.xlabel(data)plt.ylabel(target)plt.title(Boosted Decision Tree Regression)plt.legend()plt.show()3.5 sklearn与回归树3.5.4 sklearn实现DecisionTreeRegressor生成的回归决策树运行效果: