ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:343.51KB ,
资源ID:17067821      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17067821.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(决策树算法总结Word文件下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

决策树算法总结Word文件下载.docx

1、既然要寻找最优,那么必须 要有一个衡量标准,也就是需要量化这个优劣性。常用的衡量指标有熵和基尼系 数。熵:熵用来表示信息的混乱程度,值越大表示越混乱,包含的信息量也就越 多。比如,A班有10个男生1个女生,B班有5个男生5个女生,那么B班的熵 值就比A班大,也就是B班信息越混乱。Entropy = -V p ”基尼系数:同上,也可以作为信息混乱程度的衡量指标。Gini = 1 - p:l-L有了量化指标后,就可以衡量使用某个分支条件前后,信息混乱程 度的收敛效果了。使用分支前的混乱程度,减去分支后的混乱程度, 结果越大,表示效果越好。#计算熵值def entropy(dataSet):tNum

2、 = len (dataSet)print (tNum)#用来保存标签对应的个数的,比如,男:6,女:5labels = for node in dataSet:curL = node- 1 #获取标签if curL not in labels.keys():labelscurL = 0 #如果没有记录过该种标签,就记录并初始化为0labelscurL += 1 #将标签记录个数加1#此时labels中保存了所有标签和对应的个数res = 0#计算公式为-p*logp,p为标签出现概率for node in labels:p = float (labels no de) / tNumres -

3、= p * log(p, 2)return res#计算基尼系数def gini(dataSet):curL = node- 1 # 获取标签# 此时labels中保存了所有标签和对应的个数res = 1#计算公式为-p*logp , p为标签出现概率p = float (labels no de)/ tNumres -= p * p1.2.构建树ID3算法:利用信息熵增益,决定选取哪个特征作为分支节点。分支前的总样本 熵值-分支后的熵值总和=信息熵增益。T1的信息熵增益:1 -13/20*0.961 - 7/20*0.863 = 0.073T2的信息熵增益:1 -12/20*0.812 -

4、8/20*0.544 = 0.295所以使用T2作为分支特征更优ID3算法建树:依据前面的逻辑,递归寻找最优分支节点,直到下面情况结束1.叶节点已经属于同一标签2.虽然叶节点不属于同一标签,但是特征已经用完了3.熵小于预先设置的阈值4.树的深度达到了预先设置的阈值ID3算法的不足:1.取值多的特征比取值少的特征更容易被选取。2.不包含剪枝操作,过拟合严重3.特征取值必须是离散的,或者有限的区间的。于是有了改进算法C4.5C4.5算法:基于ID3算法进行了改进,首先,针对ID3的不足1,采用信息增益 率取代ID3中使用信息增益而造成的偏向于选取取值较多的特征作为分裂点的问 题。针对ID3的不足2

5、,采用剪枝操作,缓解过拟合问题。针对ID3的不足3,采 用将连续值先排列,然后逐个尝试分裂,找到连续值中的最佳分裂点。信息增益率的计算:先计算信息增益,然后除以splitelnfo。spliteInfo为分裂后的 子集合的函数,假设分裂后的子集合个数为subl和sub2, total为分裂前的个数。spliteInfo = -sub1 / total * Iog(sub1 / total) -sub2 / total * Iog(sub2 / total)#index:特征序号#value:特征值#该方法表示将index对应特征的值为value的集合返回,返回集合中不包含index对应 的特征

6、def spliteDataSet(dataSet, index, value):n ewDataSet =if no dei ndex = value:#0,index)列的数据n ewData = no de:i ndex#index+1,最后列的数据n ewData.exte nd(no dei ndex + 1:)n ewDataSet.appe nd(n ewData)return n ewDataSet;#选择最优分裂项def chooseBestFeature(dataSet):#特征个数featureNum = len (dataSet 0) - 1#计算整体样本的熵值base

7、E ntropy = en tropy(dataSet)4print (baseEntropy = %f %(baseEntropy)#保存最大的信息增益率maxi nfoGai nRatio = 0.0bestFeatureld = - 1for i in range (featureNum):#获取特征所有可能的值featureValues =featureValues.appe nd(no dei)print (featureValues)#将特征值去除重复uniqueFeatureValues = set (featureValues)print (uniqueFeatureValue

8、s)#按照i特征分裂之后的熵值n ewE ntropy = 0.0#分裂信息splitei nfo = 0.0#按照i所表示的特征,开始分裂数据集for value in uniqueFeatureValues:#当i属性等于value时的分裂结果subDataSet = spliteDataSet(dataSet, i, value)print (subDataSet)#计算占比p = float (len (subDataSet) / float (len (dataSet)n ewE ntropy += p * en tropy(subDataSet)splite info += -p

9、* log(p, 2)#计算信息增益in foGai n = baseE ntropy - n ewE ntropy#计算信息增益率if splite Info = 0:con ti nueinfoGainRatio = infoGain / spliteinfoif in foGa in Ratio maxln foGa in Ratio:maxln foGa in Ratio = in foGa in RatiobestFeatureld = ireturn bestFeatureldC4.5算法的不足:1.如果存在连续值的特征需要做排序等处理,计算比较耗时2.只能用于分类使用于是有了 C

10、ART算法CART算法:也是基于ID3算法优化而来,支持分类和回归,使用基尼系数(分类 树)或者均方差(回归树)替代熵的作用,减少运算难度。使用二叉树代替多叉 树建模,降低复杂度。基尼系数的计算:EC/均方差的计算:计算举例,假设有如下数据源看电视时间婚姻情况职业年龄3未婚学生12182已婚老师26上班族472.5363.52921如果将婚否作为标签,该问题是一个分类问题,所以使用基尼系数假设使用职业作为特征分支,对于看电视和年龄,都是连续数据,需要按照 C4.5的算法排序后处理,这里先分析简单的按照职业开始划分。又因为,CART算法的建模是二叉树,所以,针对职业来说,有以下组合,学生 |非学

11、生,老师|非老师,上班族|非上班族,到底怎么划分,就要通过基尼系数来 判断了。3 / 4 * 3 / 4 -1 / 4 * 1 / 4) = 0.4(1 -2 / 5 * 2 / 5 -3 / 5 * 3 / 5) = 0.495 * 2 / 5) = 0.34所以,如果选择职业来划分,那么首先应该按照上班族 |非上班族划分如果将年龄作为标签,该问题是一个回归问题,所以使用均方差同样,先考虑使用职业来划分mea n =开方(12 * 12 + 18 * 18 + 21 * 21 -3 * 17 * 17) + 开方(26 * 26 + 47 * 47 + 36 * 36 + 29 * 29 -

12、5 * 32.5 * 32.5) = 34.71其他情况略。可以看到选择分裂属性这一步骤会比较麻烦,首先要遍历所有特征, 找到每一个特征的最优分裂方法,然后在选择最优的分裂特征。功能树结构特征选取连续值处理缺失值处剪枝ID3 分类多叉信息增益不支持C4.5 分类信息增益率支持CART分类/回归 二叉 基尼系数(分支持 支持 支持类),均方差(回归)1.3.剪枝CCP(Cost Complexity Pruning 代价复杂性剪枝法(CART常用)REP( Reduced Error Pruning 错误降低剪枝法PEP(Pessimistic Error Pruning 悲观错误剪枝法(C4.

13、5使用)MEP (Minimum Error Pruning)最小错误剪枝法这里以CCP为例讲解其原理CCP选择节点表面误差率增益值最小的非叶子节点,删除该节点的子节点。若多 个非叶子节点的表面误差率增益值相同,则选择子节点最多的非叶子节点进行裁 剪。表面误差率增益值计算:R(t)表示非叶子节点的错误率,比如,总样本 20,在A节点上a类5个,b类2个,所以可以认为A节点代表的是a类,那么错误率就是2 / 7 * 7 / 20R(T表示叶子节点的错误率累积和N(T表示叶子节点的个数 剪枝步骤:1.构建子树序列2.找到最优子树,作为我们的决策树(交叉验证等)举例:t1是根节点t2, t3 , t

14、4 , t5是非叶子节点t6, t7 , t8 , t9 , t10, t11 是叶子节点首先我们计算所有非叶子节点误差率增益值t4: (4/50 * 50/80 T/45 * 45/80 -2/5 * 5/80)/ (2 T) = 0.0125t5:(4/10 * 10/80 -0 - 0) / (2 - 1) = 0.05t2:(10/60 * 60/80 -1/45 * 45/80 -2/5 * 5/80 -0 - 0) / (4 - 1) = 0.0292t3:0.0375因此得到第 1 颗子树:T0 = t4(0.0125),t5(0.05),t2(0.0292),t3(0.0375

15、)比较发现可以将t4裁剪掉得到第2颗子树 0.05 0.0375 (10/60 * 60/80 -4/50 * 50/80 -0 - 0) / (3 -1) = 0.0375此时t2与t3相同,那么裁剪叶子节点较多的,因此 t2被裁剪得到第3颗树然后对上面3颗子树进行验证,找到效果最后的作为剪枝之后的决策树2.sk-learn中的使用from sklearn.datasets import load_irisfrom sklearn import treeimport pydotplusimport graphviz iris = load_iris()clf = tree.Decisi on

16、 TreeClassifier()clf.fit(iris.data, iris.target)dot_data = tree.export_graphviz(clf, out_file =None)graph = pydotplus.graph from dot data(dot data) graph.write_pdf( iris.pdf )3.sk-learn中源码分析主要分析tree的相关函数代码,使用pycharm下载sklearn包中tree文件, 引用了 _tree.pxd, pxd相当于头文件,其实现在_tree.pyd中,pyd是加密文件,无 法查看。从github上下载源

17、码中有_tree.pyx相当于c文件,因此可以查看。.pxd:相当于.h.pyx:相当于.c.pyd:相当于dlltree.Decisio nTreeClassifier() 创建分类决策树对象Decisi on TreeClassifie 继承 BaseDecisi on Treeclf.fit(iris.data, iris.target) 建树DecisionTreeClassifier 直接使用了父类 BaseDecisionTree 的方法super().fit(X, y,sample_weight=sample_weight,check_ in put=check_ in put,

18、X_idx_sorted=X_idx_sorted)查看DecisionTreeClassifier 的fit,学习建树过程代码前面是对参数的校验之类的工作# Build tree criterion = self cui匸EEion if not isinstance(criterion, Criterion):if : 皿: - - ciitex J-Qn = CKITER1A_REG self, criterion (slf , n_oututs , n_saniple3)criterion = CRITERIA LF telf , criterion J (self .r_outpts

19、 * self *r classes = mt且mm刁 L?t_2r if ims匸wr三三(x) else 二巴Km 5 p_.ltsplitter = self,splitterif not isinatanca t _splitter, p丄ititer)jpTrEter = SPLITTERS se If, sp 1 iTtwJ;criterion, s e 1 f . mamin samplss leaf f mir_weight_leaf; randomstate t self.presort)criterion :表示选择分裂节点的准则,CLF表示分类使用gini系数、熵等,RE

20、G表示回归使用均方差等。他们的定义在criteria_clf I rfi r;11 : _crireri on .Gini t r t rr.f y : _criterion. Entropy3 CRITE Rl A_RE G mse: _ariterion.MSEF iLdmajQ_mj= c1h : criterion * FriedmanMSE,m: elite 上 ictrl.MAE)对于这些准则的计算,在_criterion.Gini 或者其他文件中实现,使用Cpython实现的。以Gini的计算为例cdef dauble noti*_impErity(self) nogi 1:wE

21、valuate the impurity of the current nede, i.m* the impurity of fdcimples stdt;nd kifiinq ttwj Gini criterian, 1udefSIZE_t*el classes=self n classeszde fdcuble*sum rotal=self . sunn totaldcutleffinl =0+0cdefdoublesq countcount kSIZE_Ck3ISE_tcfor k Jin rrige 5el .n_outpci七s): 0 . for c xr 匸口口(n_clas5e

22、5 f k);crount_k = 3Ljm 七otal csqcount +- countk * countkqini 卜 1T0 3q_count / self.weighted_n_nodc samplesdel. r;yijhLede_tidunples)suirtotaJ += self, sum_s,ctLcleret EirTL cpdrii / 5 I f . n antpu七汙同理,分裂的规则定义在splitter 中,具体实现也是在 Cpython中最后是构造器,这也是面向对象设计模式中的一种设计模式,构造器 模式。思想是,构造器中根据加入的原料,产出不同的东西。builder = DepthFirstTreeBuilder (优先深度)builder = BestFirstTreeBuilder (优先最优) 他们的代码实现在_tree.pyx中

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1