版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、决策树研发二部武汉中原电子信息有限公司文件状态:文件标识: 草稿当前版本:1.0 正式发布作者:张宏超正在修改完成日期:2019年3月8日目录1. 算法介绍11.1. 分支节点选取 11.2. 构建树31.3. 剪枝102. sk-learn 中的使用 123. sk-learn中源码分析 131. 算法介绍决策树算法是机器学习中的经典算法之一,既可以作为分类算法,也可以作为回归算法。决策树算法又被发展出很多不同的版本,按照时间上分,目前主要 包括,ID3、C4.5和CART版本算法。其中ID3版本的决策树算法是最早出现的, 可以用来做分类算法。C4.5是针对ID3的不足出现的优化版本,也用来
2、做分类。 CART也是针对ID3优化出现的,既可以做分类,可以做回归。决策树算法的本质其实很类似我们的if-elseif-else语句,通过条件作为分支依 据,最终的数学模型就是一颗树。不过在决策树算法中我们需要重点考虑选取分 支条件的理由,以及谁先判断谁后判断,包括最后对过拟合的处理,也就是剪枝。 这是我们之前写if语句时不会考虑的问题。决策树算法主要分为以下3个步骤:1. 分支节点选取2. 构建树3. 剪枝1.1. 分支节点选取分支节点选取,也就是寻找分支节点的最优解。既然要寻找最优,那么必须 要有一个衡量标准,也就是需要量化这个优劣性。常用的衡量指标有熵和基尼系 数。熵:熵用来表示信息的
3、混乱程度,值越大表示越混乱,包含的信息量也就越 多。比如,A班有10个男生1个女生,B班有5个男生5个女生,那么B班的熵 值就比A班大,也就是B班信息越混乱。Entropy = -V p ”基尼系数:同上,也可以作为信息混乱程度的衡量指标。Gini = 1 - p:l-L有了量化指标后,就可以衡量使用某个分支条件前后,信息混乱程 度的收敛效果了。使用分支前的混乱程度,减去分支后的混乱程度, 结果越大,表示效果越好。#计算熵值def entropy(dataSet):tNum = len (dataSet)print (tNum)#用来保存标签对应的个数的,比如,男:6,女:5labels =
4、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 -= p * log(p,2)return res#计算基尼系数def gini(dataSet):tNum = len (dataSet
5、)print (tNum)#用来保存标签对应的个数的,比如,男:6,女:5labels = for node in dataSet:curL = node-1# 获取标签if curL not in labels.keys():labelscurL =0 #如果没有记录过该种标签,就记录并初始化为0labelscurL +=1#将标签记录个数加1# 此时labels中保存了所有标签和对应的个数res =1#计算公式为-p*logp , p为标签出现概率for node in labels:p = float (labels no de)/ tNumres -= p * preturn res1
6、.2. 构建树ID3算法:利用信息熵增益,决定选取哪个特征作为分支节点。分支前的总样本 熵值-分支后的熵值总和=信息熵增益。T1的信息熵增益:1 -13/20*0.961 - 7/20*0.863 = 0.073T2的信息熵增益:1 -12/20*0.812 - 8/20*0.544 = 0.295所以使用T2作为分支特征更优ID3算法建树:依据前面的逻辑,递归寻找最优分支节点,直到下面情况结束1. 叶节点已经属于同一标签2. 虽然叶节点不属于同一标签,但是特征已经用完了3. 熵小于预先设置的阈值4. 树的深度达到了预先设置的阈值ID3算法的不足:1. 取值多的特征比取值少的特征更容易被选取。
7、2. 不包含剪枝操作,过拟合严重3. 特征取值必须是离散的,或者有限的区间的。于是有了改进算法C4.5C4.5算法:基于ID3算法进行了改进,首先,针对ID3的不足1,采用信息增益 率取代ID3中使用信息增益而造成的偏向于选取取值较多的特征作为分裂点的问 题。针对ID3的不足2,采用剪枝操作,缓解过拟合问题。针对ID3的不足3,采 用将连续值先排列,然后逐个尝试分裂,找到连续值中的最佳分裂点。信息增益率的计算:先计算信息增益,然后除以splitelnfo。spliteInfo为分裂后的 子集合的函数,假设分裂后的子集合个数为subl和sub2, total为分裂前的个数。spliteInfo
8、= -sub1 / total * Iog(sub1 / total) -sub2 / total * Iog(sub2 / total)#index:特征序号#value:特征值#该方法表示将index对应特征的值为value的集合返回,返回集合中不包含index对应 的特征def spliteDataSet(dataSet, index, value):n ewDataSet =for node in dataSet:if no dei ndex = value:#0,index)列的数据n ewData = no de:i ndex#index+1,最后列的数据n ewData.exte
9、 nd(no dei ndex +1:)n ewDataSet.appe nd(n ewData)returnn ewDataSet;#选择最优分裂项def chooseBestFeature(dataSet):#特征个数featureNum = len (dataSet 0) -1#计算整体样本的熵值baseE ntropy = en tropy(dataSet)武汉中原电子信息有限公司4print ("baseEntropy = %f" %(baseEntropy)#保存最大的信息增益率maxi nfoGai nRatio =0.0bestFeatureld = -1f
10、or i in range (featureNum):#获取特征所有可能的值featureValues =for node in dataSet:featureValues.appe nd(no dei)print (featureValues)#将特征值去除重复uniqueFeatureValues = set (featureValues)print (uniqueFeatureValues)#按照i特征分裂之后的熵值n ewE ntropy = 0.0#分裂信息splitei nfo =0.0#按照i所表示的特征,开始分裂数据集for value in uniqueFeatureValu
11、es:#当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 * log(p,2)#计算信息增益in foGai n = baseE ntropy - n ewE ntropy#计算信息增益率if splite Info =0:con ti nueinfoGainRa
12、tio = infoGain / spliteinfoif in foGa in Ratio > maxln foGa in Ratio:maxln foGa in Ratio = in foGa in RatiobestFeatureld = ireturn bestFeatureldC4.5算法的不足:1. 如果存在连续值的特征需要做排序等处理,计算比较耗时2. 只能用于分类使用于是有了 CART算法CART算法:也是基于ID3算法优化而来,支持分类和回归,使用基尼系数(分类 树)或者均方差(回归树)替代熵的作用,减少运算难度。使用二叉树代替多叉 树建模,降低复杂度。基尼系数的计算:
13、EC/均方差的计算:计算举例,假设有如下数据源看电视时间婚姻情况职业年龄3未婚学生124未婚学生182已婚老师265已婚上班族472.5已婚上班族363.5未婚老师294已婚学生21如果将婚否作为标签,该问题是一个分类问题,所以使用基尼系数假设使用职业作为特征分支,对于看电视和年龄,都是连续数据,需要按照C4.5的算法排序后处理,这里先分析简单的按照职业开始划分。又因为,CART算法的建模是二叉树,所以,针对职业来说,有以下组合,学生|非学生,老师|非老师,上班族|非上班族,到底怎么划分,就要通过基尼系数来 判断了。尹*| V基1 /125'上雜42P |tun 15-St*岳牲,昭1
14、1.*S*n.2V 1gini = 3 / 7 * (1-2 / 3 * 2 /3-1 / 3 * 1 / 3) + 4 / 7 * (13 / 4 * 3 / 4-1 / 4 * 1 / 4) = 0.4基* iff卒冏2-418*'r 8r s- nI r上贩上鮒匸岳4SIVgini = 2 / 7 * (1-1 / 2 * 1 / 2屈已It1 h星.血迟艇低丨翊+如IX召.1上赃是1-1 / 2 * 1 / 2) + 5 / 7(1-2 / 5 * 2 / 5-3 / 5 * 3 / 5) = 0.49牡.犠|$=1*13-捋强是上瞧4?.25-8弄29*12Vgini = 2
15、 / 7 * (1-1 * 1) + 5 / 7 * (1千許1 乂1上珈匸251-显畏别【1S8!6.a雜.1扭是tfjt#-妙11单冬5 * 2 / 5) = 0.34所以,如果选择职业来划分,那么首先应该按照上班族 |非上班族划分如果将年龄作为标签,该问题是一个回归问题,所以使用均方差同样,先考虑使用职业来划分野己臨|I?払做1aU-r卷:爆I1r技厂2&$山i弄1L骈|421- I鮭己鼻U稗!5*12-*X?加A31mea n =开方(12 * 12 + 18 * 18 + 21 * 21 -3 * 17 * 17) + 开方(26 * 26 + 47 * 47 + 36 *
16、36 + 29 * 29 -5 * 32.5 * 32.5) = 34.71其他情况略。>>II I III II I可以看到选择分裂属性这一步骤会比较麻烦,首先要遍历所有特征, 找到每一个特征的最优分裂方法,然后在选择最优的分裂特征。功能树结构特征选取连续值处理缺失值处理剪枝ID3分类多叉信息增益不支持不支持不支持C4.5 分类多叉信息增益率支持支持支持CART分类/回归 二叉基尼系数(分支持支持支持类),均方差(回归)1.3. 剪枝CCP(Cost Complexity Pruning 代价复杂性剪枝法(CART常用)REP( Reduced Error Pruning 错误降
17、低剪枝法PEP(Pessimistic Error Pruning 悲观错误剪枝法(C4.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. 构建子树
18、序列2. 找到最优子树,作为我们的决策树(交叉验证等)举例:t1是根节点t2, t3 , t4 , 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 颗子树
19、:T0 = t4(0.0125),t5(0.05),t2(0.0292),t3(0.0375)比较发现可以将t4裁剪掉得到第2颗子树t5: 0.05t3: 0.0375t2: (10/60 * 60/80 -4/50 * 50/80 -0 - 0) / (3 -1) = 0.0375此时t2与t3相同,那么裁剪叶子节点较多的,因此t2被裁剪得到第3颗树然后对上面3颗子树进行验证,找到效果最后的作为剪枝之后的决策树2. sk-learn中的使用from sklearn.datasetsimport load_irisfrom sklearn import treeimport pydotplus
20、import graphviz iris = load_iris()clf = tree.Decisi on 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文件,
21、引用了 _tree.pxd, pxd相当于头文件,其实现在_tree.pyd中,pyd是加密文件,无 法查看。从github上下载源码中有_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().fi
22、t(X, y,sample_weight=sample_weight,check_ in put=check_ in put,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_sanipl
23、e3)criterion = CRITERIA 'LF telf , criterion J (self .r_outpts * self *r classes >= mt且mm刁 L?t_2'rif ims匸wr三三(x) else 二巴Km 5 p_.ltsplitter = self,splitterif not isinatancat _splitter, £p丄ititer)jpTrEter = SPLITTERS se If, sp 1 iTtwJ;£criterion, s e 1 f . mamin samplss leaf f mir
24、_weight_leaf; randomstate t self.presort)criterion:表示选择分裂节点的准则,CLF表示分类使用gini系数、熵等,REG表示回归使用均方差等。他们的定义在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的计算为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 朔州市山阴县2025-2026学年第二学期三年级语文第六单元测试卷(部编版含答案)
- 郑州市管城回族区2025-2026学年第二学期四年级语文第六单元测试卷(部编版含答案)
- 银川市兴庆区2025-2026学年第二学期四年级语文第四单元测试卷(部编版含答案)
- 承德市宽城满族自治县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 德宏傣族景颇族自治州陇川县2025-2026学年第二学期四年级语文第四单元测试卷(部编版含答案)
- 长沙市开福区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 乌兰察布盟察哈尔右翼前旗2025-2026学年第二学期五年级语文第四单元测试卷(部编版含答案)
- 呼伦贝尔市阿荣旗2025-2026学年第二学期三年级语文第六单元测试卷(部编版含答案)
- 张家口市张北县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 维稳大队工作制度汇编
- 聘任委员会工作制度
- 2026江苏常州工业职业技术学院招聘人事代理人员11人笔试参考试题及答案解析
- 2026年池州市保险行业协会工作人员招聘备考题库附答案详解(满分必刷)
- 浙江省杭州二中2025学年第二学期高三年级三月月考语文+答案
- 14 赵州桥 课件-2025-2026学年统编版语文三年级下册
- 2026年现代医疗背景下手术室护理技术的挑战与机遇
- 2026年黑龙江齐齐哈尔高三一模高考生物试卷试题(含答案详解)
- 广东省化工(危险化学品)企业安全隐患排查指导手册(危险化学品仓库企业专篇)
- 2025年医疗卫生系统招聘考试《医学基础知识》真题及详解
- 兽药药品陈列管理制度
- 专题 功和功率、动能定理(解析版)
评论
0/150
提交评论