别以为if slse很简单——决策树

怎么分——熵与Gini指数

H(X)=-\sum_{x \in X} p(x)log(p(x)),表示信息量的期望,含义是混乱程度,也是对随机变量编码所需的最小比特数。请参考之前的文章。

信息增益建立在熵之上,是选择某特征之后熵减少的多少(熵减少即信息增加),等于信息熵-条件熵,Gain(D,A) = H(D) - H( D | A)

基尼不纯度 Gini(X)= \sum_{x \in X}p(x)(1-p(x))=1- \sum^K_{k=1}p^2_k,它表示是分错的概率的期望。Gini不纯度其实可以看作是熵的近似值,形式一样没有取对数更容易计算,二分类时,都是概率取0.5时达到最大值。Gini不纯度是一种不等性度量,取值[0,1],当数据完全相等时取0.

K表示类别数目,那么对于数据集(样本集合)D,它的基尼不纯度:Gini(D)=1-\sum^K_{k=1}(\frac{C_k}{D})^2

D经过特征A后分裂为两个子集,新的不纯度就是两个子集不纯度的加权和(因为Gini不纯度本来也是加权和):Gini(D,A)= \frac{D_1}{D}Gini(D_1) + \frac{D_2}{D}Gini(D_2).我们的目标就是使得分裂后的不纯度最小。

ID3

ID3是最早的决策树,使用信息增益作为分裂准则。特点是特征必须是离散的,离散意味着特征是类别特征,那就也意味着特征不会被复用(该特征下的结果只能是属于或者不属于,而像连续特征可以换个阈值重新使用)。而既然是类别特征,当然类别越多分得越细(ID3可能是多叉树),所以ID3会倾向于选择类别较多的特征(直接念身份证号得了)。但其实不是说特征类别更多带来的增益就一定更大,从熵的公式看,他们极有可能是一样的,,只是可能性更大,即便带来的增益相等,类别过多将原有数据集划分为更多更小的子集,极容易过拟合。

此外ID3没有考虑缺失特征带来的影响。

ID3的作者Quinlan继续提出了C4.5。特征类别过多时这个特征自身的熵会升高(称为属性熵split info),所以可以将信息增益调整为信息增益率=信息增益/属性熵,这样就限制了属性熵的值不能过高。其实信息增益率可以看作是信息增益与代价的比(属性熵越大代价越大),核心目的仍然是为了让信息增益最大(在特征为连续值时,只使用信息增益)。信息增益率又有可能偏向于类别较少的特征,所以C4.5真正的做法是先选取信息增益高于均值的几种,在这几种里面再按照信息增益率选取。

对于特征值缺失的问题,意思是对于某一类别特征,有一些样本我们不知道它到底属于哪一类。所以在计算增益时就只以不缺失的数据来计算;当正好选取了缺失的特征后,对于不知道它属于哪一类的样本,就按照概率进行分类。

CART

CART树最大特定是既可以用于分类也可以用于回归。首先它是二叉树,递归划分,对于分类可以化为one vs others,对于连续特征,则选定某一特征的一个值,按大小分为两类。CART使用Gini不纯度代替熵,避免了对数运算。

怎么剪——剪枝

决策树在训练过程中采取贪婪策略的方法进行分裂,很容易过拟合。控制深度,叶子节点数的方法又有点武断(这种方法其实叫做预剪枝)。

关于后剪枝方法,C4.5使用悲观剪枝PEP(Pessimostic Error Pruning),CART树中可以使用代价复杂度的方法进行剪枝CCP。

PEP的好处是决策树的生成和剪枝使用相同的训练集。它比较的是待剪去的子树和新的叶子结点处的误判率。前者使用公式:

(\sum E_i +0.5*L)/N_iE_i表示该子树每个叶子结点的误判个数,L表示有多少个叶子结点,N表示该子树根节点处的总数。

而新叶子节点处的误判率就很好算了,误判数目/总数。新叶子节点误判率P_{newleaf}总是高于子树误判率P_{subtree},当差距小于一个阈值时就认为可以剪枝。这个阈值通过子树的标准差来确定:正确判断与误判看作二项分布,那么sigma^2=np(1-p)

CCP涉及到代价,那自然是在追求准确度的基础上增加一项正则项,正则项通过叶子节点的数目表示树结构的复杂度。所以代价复杂度函数就是:

R_\alpha(T) =R(T) + \alpha \cdot \left | f(T) \right |= 错误率 + \alpha \cdot叶子结点个数

假设在节点t处剪枝,以t为根节点的子树为T_t,剪枝前后的代价复杂度函数分别为R_\alpha(T)R_\alpha(T-T_t)

R_\alpha(T-T_t) - R_\alpha(T) \\ = R(T-T_t) -R(T) +\alpha (\left | f (T -T_t) \right | - \left | f(T) \right |) ........(1) \\ = R(t) -R(T_t) + \alpha(1-\left | f(T_t) \right |).......(2)

解释一下从(1)到(2)的推导。有两点问题首先要清楚,树的误差体现在其叶子节点的加权误差(\sum p(x) e(x));剪枝的过程本质是用一个节点代替其底部更深的所有节点。所以剪枝前后的结构对应的误差R(T-T_t) -R(T)等价于节点t处的误差和以t为根的树的叶子节点的误差:R(t) -R(T_t)。而剪枝前后的树的复杂度变化就是叶子节点个数的变化,剪枝之后叶子结点数首先减少了f(T_t)个,但剪枝处的节点t成为新的一个叶子节点,所以叶子节点的变化情况是(1-\left | f(T_t) \right |)

所以在确定了\alpha之后,所需要做的就是尝试删除一个个节点之下的树,寻找使得剪枝前后代价函数变化最小的那个节点。当然,剪枝之后还是要在测试集中测试,选择最优的作为最终的决策树。这也就是所谓的生成子树序列+测试集上的交叉验证。

但是,在更多的资料中,会令(2)等于0,可以得到\alpha = \frac{R(t) - R(T_t)}{ \left | f(T_t) \right | -1 }。这是认为剪枝的充分条件是剪枝前后的代价函数相等,剪枝前后的代价函数可以相等,但是误差肯定是增大的,所以分子大于0,所以\alpha>0。\alpha有无限多,我们不能一个个试,但是子树的结构是有限的。仔细看,\alpha其实可以代表剪枝带来的增益,分子越小,损失变化越小;分母越大,表示叶子节点减小得越多。所以真正的做法是遍历节点剪枝,得到\alpha最小的剪枝处,迭代多次直至剪枝之后只剩下根节点,就可以得到子树构成的序列和对应的\alpha构成的序列,将这些序列对应的模型再代入测试集验证。

怎么用——sklearn实战

傻瓜式操作,只需要创建一个实例类,然后对训练数据执行fit()操作。

在tree的实例类中可以指定我们分裂所使用的度量方法,可以是entropy,可以是gini(默认)

训练的数据应该是在csv文件中指定特征后的数据

这里的score不是指决策树预测的概率值,因为输入样本落入某节点必须是属于某一类的(硬分类)。注意到这个函数同时需要输入标签值,它返回的其实只是一个值,意为预测的准确率accuracy。

from sklearn import treeclf = tree.DecisionTreeClassifier(criterion="entropy")# criterion选择entropy,这里表示选择ID3算法
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) #返回预测的准确度accuracy

可视化

out_file指定生成的dot文件位置。dot文件是微软开发的用于页面布局的文件,可以使用Word打开。打开之后可以发现它保存的就是各个节点的信息:该节点的信息增益,颜色,所属类别等。

import graphviz
dot_data = tree.export_graphviz(clf, out_file=".\Tree.dot",feature_names = feature_name,class_names=["琴酒","雪莉","贝尔摩德"],filled=True,rounded=True)

汉字支持

dot文件内有一个关键字fontname,它指定了字符的编码格式,所以我们为了支持汉字,核心就是将原有的编码格式Helvetica(在拉丁文中意为“瑞士的”)改为微软雅黑。可以使用代码自动修改。

import re
# 打开 dot_data.dot,修改 fontname="支持的中文字体"
f = open("./Tree.dot", "r+", encoding="utf-8")
open('./Tree_utf8.dot', 'w', encoding="utf-8").write(re.sub(r'fontname=helvetica', 'fontname="Microsoft YaHei"', f.read()))
f.close()

在修改之后可以open,得到一个TextIOWarpper类型的变量,对其取read()得到文件中的字符串,类型为str。然后可以使用 pydotplus.graph_from_dot_data保存:

with open((r'./Tree_utf8.dot',"r",encoding='utf-8') as f:text = f.read() graph = pydotplus.graph_from_dot_data(text)graph.write_png("试试.png")   graph.write_pdf("iris.pdf") 

或者使用命令行保存:

dot -Tjpg Tree.dot -o tree.jpg

怎么解读画出的图像呢。

基尼不纯度gini应该是越来越小的。每个圆角矩形代表一个节点,在每个节点中alue的维度和标签的种类数一致,三种类别中符合以上条件的数目。他们的数目之和即这个节点的samples值,而每层的samples之和就是测试集的总数。有的节点的value中,只有一个非零值,代表只有该类符合之上的条件,所以gini不纯度也是0,这时候该节点就成为叶子节点,不会继续向下生长。决策树会倾向于一直生长(除非指定深度),直至使得每个叶子节点的gini等于0,所以容易过拟合,极端情况就是为每个样本量身定制了一份判断条件。所以为了防止过拟合,除了限制生长的深度,还可以指定叶子所需的最小样本数,样本数再小就没必要再生长了。

Reference:

1.sklearn手册https://sklearn.apachecn.org/docs/0.21.3/11.html

2.少年阿斌https://www.cnblogs.com/wqbin/p/11689709.html

3.https://zhuanlan.zhihu.com/p/85731206

4.CCPhttp://mlwiki.org/index.php/Cost-Complexity_Pruning

5.https://zhuanlan.zhihu.com/p/76667156

6.https://www.jianshu.com/p/b90a9ce05b28

7.https://zhuanlan.zhihu.com/p/93936294

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tensorflow实现回归

直线拟合:yw*xb """ 回归:直线拟合 """ import tensorflow as tf import numpy as np import matplotlib.pyplot as plt x_datanp.random.rand(100) y_datax_data*51Wtf.Variable(0.) btf.Variable(0.) y_predW*x_databxtf.placehol…

微软亚研院20周年独家撰文:数据智能的现在与未来

文:微软亚洲研究院软件分析组来源:雷锋网摘要:今年是微软亚洲研究院(MSRA)20周年,站在这个大节点上,MSRA副院长张冬梅以及她的团队写了这篇有关数据智能的文章,对该领域的发展和未来…

二维与三维之间的桥梁——点云

在做图像配准时就听闻过一些点云的方法,却没对其有太多的认识,只是知道点云point cloud顾名思义就是一些离散点的集合。现在在无人驾驶中一些激光雷达的作用其实就是生成点云数据,接下来介绍一下点云数据的含义和基础的使用方法。 虽然特斯拉…

python刷题+leetcode(第一部分)

1. 设计前中后队列 思路:python代码直接利用list的insert特性 class FrontMiddleBackQueue:def __init__(self):self.queque []def pushFront(self, val: int) -> None:self.queque.insert(0, val)def pushMiddle(self, val: int) -> None:self.queque.insert(len(self…

LINQ基础概述

介绍LINQ基础之前,首说一下LINQ 的历史和LINQ是什么,然后说一下学习 LINQ要了解的东西和 LINQ基础语法LINQ 的历史从语言方面的进化 –委托 –匿名方法 –Lambda表达式 –Linq查询表达式 上边这四个我会在下边一一解说 从时间方面的演进 –2004年 –2005…

机器人“快递小哥”上岗了!京东配送机器人编队长沙亮相

11 月 22 日上午,京东物流配送机器人智能配送站启用仪式在长沙举行,随着载有用户订单的配送机器人编队从站内依次发出,全球首个由机器人完成配送任务的智能配送站正式投入使用。首个京东配送机器人智能配送站位于长沙市科技新城,占…

3D打印技术如何影响未来

来源:学习时报我们应该对3D打印技术保持谨慎态度,但过度反应和监管也可能会扼杀创新。历史经验表明,在技术的不利一面被应用之前进行规范构建对话是最有效的。因此,各国际主体,包括国家、商业领袖、政府官员和其他政策…

HDR简单介绍

问题定义 HDR字面意思是高动态范围High Dynamic Range,而动态范围是高图像质量的五个要素之一(其余是1. 分辨率,2.位深度,3.帧速率,4.色域),而画质直接关系到人眼的主观感受。 如果将动态范围理解为量化的…

争议中挺进全新里程——中国“超级对撞机”《概念设计报告》发布侧记

来源:科技导报2018 年11 月12 日下午6 点半,北京市玉泉路,中国科学院高能物理研究所,所有建筑和行人沐浴在初冬夜晚的清冷与安静之中。不同的是,主楼西侧一座新楼的大厅里,却充满了热望和兴奋。这里正进行着…

haar级联分类器--人脸检测和匹配

分类器链接,https://download.csdn.net/download/fanzonghao/10582586 代码: import numpy as np import cv2# 实例化人脸分类器 face_cascade cv2.CascadeClassifier(./haarcascades/haarcascade_frontalface_default.xml) # 实例化眼睛分类器 eye_c…

社会科技奖不是新鲜事?如何真正做大

来源:中国科学报我国的社会力量设立科学技术奖励起步于上世纪80年代。科技部网站上2018年9月5日更新的《社会科技奖励目录》显示,目前我国共有269个社会科技奖项登记在册,其中最后一个正是未来科学大奖。11月18日,2018未来科学大奖…

泊松融合——用了拉普拉斯但没有金字塔

图像融合的方式有alpha融合,拉普拉斯金字塔融合。 同样是基于拉普拉斯算子,我们可以直接用求解的方式得到融合后的图像。因为人眼对二阶导是更敏感的,所以只要我们指定了融合区域内部的梯度值,并且知道融合边界处的值&#xff0c…

三层神经网络实现手写字母的识别(基于tensorflow)

数据集的制作参考这篇文章: https://blog.csdn.net/fanzonghao/article/details/81229409 一,读取数据集 import tensorflow as tf import numpy as np import pickle import matplotlib.pyplot as plt #对于x变成(samles,pixs),y变成one_hot (sample…

(转)Kinect背景移除支持多人

原文:http://blogs.msdn.com/b/k4wdev/archive/2013/10/22/using-kinect-background-removal-with-multiple-users.aspx?utm_sourcetuicool Introduction: Background Removal in Kinect for Windows The 1.8 release of the Kinect for Windows Developer Toolkit…

德国汉堡科学院院士张建伟:信息物理系统驱动智能未来

来源:OFweek工控网随着第四次工业革命的到来,信息技术(IT)和运营技术(OT)的融合成为新趋势,工厂开始进入数字化转型阶段,而德国“工业4.0”战略给全球制造业发展带来启示&#xff0c…

两层卷积网络实现手写字母的识别(基于tensorflow)

可和这篇文章对比,https://blog.csdn.net/fanzonghao/article/details/81489049,数据集来源代码和链接一样。 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import read_pickle_datasettrain_dataset,train_label,vali…

焦李成教授谈深度神经网络发展历程

来源:西电人工智能学院摘要:焦李成教授谈深度神经网络发展历程2018年11月18日下午,计算机科学与技术学部主任、人工智能学院焦李成教授在成都参加了由中国人工智能学会主办的人工智能大讲堂并做特邀报告,焦李成教授在报告中回顾了…

KNN实现CIFAR-10数据集识别

cs231n链接:http://cs231n.github.io/linear-classify/, 训练集链接:https://download.csdn.net/download/fanzonghao/10592049 KNN缺点:每个测试样本都要循环一遍训练样本。 该数据集由5个data_batch和一个test_batch构成&…

近期苹果、Facebook等科技巨头股价缘何不断下跌?

来源:资本实验室近期,FAANG(Facebook、亚马逊、苹果、Netflix、谷歌)等科技巨头股价都出现了不同程度的下跌,而美国科技股整体的持续大跌,更是引发了全球股市振荡。其中,亚马逊在今年9月初达曾达到1万亿美元市值&#…

概率论基础知识各种分布

离散分布:伯努力分布,二项分布,possion分布 一,伯努力分布 #执硬币 x_arrnp.array([0,1]) #x为1的概率 p0.7 #0 1分布 #由PMF生成对应的概率 离散事件 pr_arrstats.bernoulli.pmf(x_arr,p) plt.plot(x_arr,pr_arr,markero,lines…