㈠ 决策树算法原理是什么
决策树构造的输入是一组带有类别标记的例子,构造的结果是一棵二叉树或多叉树。二叉树的 内部节点(非 叶子节点)一般表示为一个逻辑判断,如形式为a=aj的逻辑判断,其中a是属性,aj是该属性的所有取值:树的边是逻辑判断的分支结果。
多叉树(ID3)的内部结点是属性,边是该属性的所有取值,有几个 属性值就有几条边。树的叶子节点都是类别标记。
由于数据表示不当、有噪声或者由于决策树生成时产生重复的子树等原因,都会造成产生的决策树过大。
因此,简化决策树是一个不可缺少的环节。寻找一棵最优决策树,主要应解决以下3个最优化问题:①生成最少数目的叶子节点;②生成的每个叶子节点的深度最小;③生成的决策树叶子节点最少且每个叶子节点的深度最小。
决策树算法的优点如下:
(1)分类精度高;
(2)生成的模式简单;
(3)对噪声数据有很好的健壮性。
因而是目前应用最为广泛的归纳推理算法之一,在 数据挖掘中受到研究者的广泛关注。
㈡ 5.10 决策树与ID3算法
https://blog.csdn.net/dorisi_h_n_q/article/details/82787295
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。决策过程是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
决策树的关键步骤是分裂属性。就是在某节点处按某一特征属性的不同划分构造不同的分支,目标是让各个分裂子集尽可能地“纯”。即让一个分裂子集中待分类项属于同一类别。
简而言之,决策树的划分原则就是:将无序的数据变得更加有序
分裂属性分为三种不同的情况 :
构造决策树的关键性内容是进行属性选择度量,属性选择度量(找一种计算方式来衡量怎么划分更划算)是一种选择分裂准则,它决定了拓扑结构及分裂点split_point的选择。
属性选择度量算法有很多,一般使用自顶向下递归分治法,并采用不回溯的贪心策略。这里介绍常用的ID3算法。
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。
此概念最早起源于物理学,是用来度量一个热力学系统的无序程度。
而在信息学里面,熵是对不确定性的度量。
在1948年,香农引入了信息熵,将其定义为离散随机事件出现的概率,一个系统越是有序,信息熵就越低,反之一个系统越是混乱,它的信息熵就越高。所以信息熵可以被认为是系统有序化程度的一个度量。
熵定义为信息的期望值,在明晰这个概念之前,我们必须知道信息的定义。如果待分类的事务可能划分在多个分类之中,则符号x的信息定义为:
在划分数据集之前之后信息发生的变化称为信息增益。
知道如何计算信息增益,就可计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。
条件熵 表示在已知随机变量的条件下随机变量的不确定性,随机变量X给定的条件下随机变量Y的条
件熵(conditional entropy) ,定义X给定条件下Y的条件概率分布的熵对X的数学期望:
根据上面公式,我们假设将训练集D按属性A进行划分,则A对D划分的期望信息为
则信息增益为如下两者的差值
ID3算法就是在每次需要分裂时,计算每个属性的增益率,然后选择增益率最大的属性进行分裂
步骤:1. 对当前样本集合,计算所有属性的信息增益;
是最原始的决策树分类算法,基本流程是,从一棵空数出发,不断的从决策表选取属性加入数的生长过程中,直到决策树可以满足分类要求为止。CLS算法存在的主要问题是在新增属性选取时有很大的随机性。ID3算法是对CLS算法的改进,主要是摒弃了属性选择的随机性。
基于ID3算法的改进,主要包括:使用信息增益比替换了信息增益下降度作为属性选择的标准;在决策树构造的同时进行剪枝操作;避免了树的过度拟合情况;可以对不完整属性和连续型数据进行处理;使用k交叉验证降低了计算复杂度;针对数据构成形式,提升了算法的普适性。
信息增益值的大小相对于训练数据集而言的,并没有绝对意义,在分类问题困难时,也就是说在训练数据集经验熵大的时候,信息增益值会偏大,反之信息增益值会偏小,使用信息增益比可以对这个问题进行校正,这是特征选择
的另一个标准。
特征对训练数据集的信息增益比定义为其信息增益gR( D,A) 与训练数据集的经验熵g(D,A)之比 :
gR(D,A) = g(D,A) / H(D)
sklearn的决策树模型就是一个CART树。是一种二分递归分割技术,把当前样本划分为两个子样本,使得生成的每个非叶子节点都有两个分支,因此,CART算法生成的决策树是结构简洁的二叉树。
分类回归树算法(Classification and Regression Trees,简称CART算法)是一种基于二分递归分割技术的算法。该算法是将当前的样本集,分为两个样本子集,这样做就使得每一个非叶子节点最多只有两个分支。因此,使用CART
算法所建立的决策树是一棵二叉树,树的结构简单,与其它决策树算法相比,由该算法生成的决策树模型分类规则较少。
CART分类算法的基本思想是:对训练样本集进行递归划分自变量空间,并依次建立决策树模型,然后采用验证数据的方法进行树枝修剪,从而得到一颗符合要求的决策树分类模型。
CART分类算法和C4.5算法一样既可以处理离散型数据,也可以处理连续型数据。CART分类算法是根据基尼(gini)系
数来选择测试属性,gini系数的值越小,划分效果越好。设样本集合为T,则T的gini系数值可由下式计算:
CART算法优点:除了具有一般决策树的高准确性、高效性、模式简单等特点外,还具有一些自身的特点。
如,CART算法对目标变量和预测变量在概率分布上没有要求,这样就避免了因目标变量与预测变量概率分布的不同造成的结果;CART算法能够处理空缺值,这样就避免了因空缺值造成的偏差;CART算法能够处理孤立的叶子结点,这样可以避免因为数据集中与其它数据集具有不同的属性的数据对进一步分支产生影响;CART算法使用的是二元分支,能够充分地运用数据集中的全部数据,进而发现全部树的结构;比其它模型更容易理解,从模型中得到的规则能获得非常直观的解释。
CART算法缺点:CART算法是一种大容量样本集挖掘算法,当样本集比较小时不够稳定;要求被选择的属性只能产生两个子结点,当类别过多时,错误可能增加得比较快。
sklearn.tree.DecisionTreeClassifier
1.安装graphviz.msi , 一路next即可
ID3算法就是在每次需要分裂时,计算每个属性的增益率,然后选择增益率最大的属性进行分裂
按照好友密度划分的信息增益:
按照是否使用真实头像H划分的信息增益
**所以,按先按好友密度划分的信息增益比按真实头像划分的大。应先按好友密度划分。
㈢ 一道高级c++算法题! csdn,高手请进! c++做做决策,可以写出思路,但希望有详细的指点! c++高手我将付费
你留个qq吧
㈣ 结构化决策:对某一决策过程的环境及规则,能用确定的语言和过程描述,以适当的算法产生
您好,中公教育为您服务。
【答案】 B 解析:这道题干中给出了两个概念,结构化决策和非结构化决策,并分别对着两个概念进行了解释。根据问法,只问了非结构化决策,而且题干中两个概念是互不相关的,那么我们只要关注非结构化决策即可,即“决策过程复杂,不可能用确定的模型和语言来描述其决策过程,更无所谓最优解得决策。”
本题选项A、C、D都是比较简单的方案,不符合复杂的,没有确定模型和语言描述这样的定义要点,只有B选项符合,故答案选择B。
如有疑问,欢迎向中公教育企业知道提问。
㈤ 数据挖掘-决策树算法
决策树算法是一种比较简易的监督学习分类算法,既然叫做决策树,那么首先他是一个树形结构,简单写一下树形结构(数据结构的时候学过不少了)。
树状结构是一个或多个节点的有限集合,在决策树里,构成比较简单,有如下几种元素:
在决策树中,每个叶子节点都有一个类标签,非叶子节点包含对属性的测试条件,用此进行分类。
所以个人理解,决策树就是 对一些样本,用树形结构对样本的特征进行分支,分到叶子节点就能得到样本最终的分类,而其中的非叶子节点和分支就是分类的条件,测试和预测分类就可以照着这些条件来走相应的路径进行分类。
根据这个逻辑,很明显决策树的关键就是如何找出决策条件和什么时候算作叶子节点即决策树终止。
决策树的核心是为不同类型的特征提供表示决策条件和对应输出的方法,特征类型和划分方法包括以下几个:
注意,这些图中的第二层都是分支,不是叶子节点。
如何合理的对特征进行划分,从而找到最优的决策模型呢?在这里需要引入信息熵的概念。
先来看熵的概念:
在数据集中,参考熵的定义,把信息熵描述为样本中的不纯度,熵越高,不纯度越高,数据越混乱(越难区分分类)。
例如:要给(0,1)分类,熵是0,因为能明显分类,而均衡分布的(0.5,0.5)熵比较高,因为难以划分。
信息熵的计算公式为:
其中 代表信息熵。 是类的个数, 代表在 类时 发生的概率。
另外有一种Gini系数,也可以用来衡量样本的不纯度:
其中 代表Gini系数,一般用于决策树的 CART算法 。
举个例子:
如果有上述样本,那么样本中可以知道,能被分为0类的有3个,分为1类的也有3个,那么信息熵为:
Gini系数为:
总共有6个数据,那么其中0类3个,占比就是3/6,同理1类。
我们再来计算一个分布比较一下:
信息熵为:
Gini系数为:
很明显,因为第二个分布中,很明显这些数偏向了其中一类,所以 纯度更高 ,相对的信息熵和Gini系数较低。
有了上述的概念,很明显如果我们有一组数据要进行分类,最快的建立决策树的途径就是让其在每一层都让这个样本纯度最大化,那么就要引入信息增益的概念。
所谓增益,就是做了一次决策之后,样本的纯度提升了多少(不纯度降低了多少),也就是比较决策之前的样本不纯度和决策之后的样本不纯度,差越大,效果越好。
让信息熵降低,每一层降低的越快越好。
度量这个信息熵差的方法如下:
其中 代表的就是信息熵(或者其他可以度量不纯度的系数)的差, 是样本(parent是决策之前, 是决策之后)的信息熵(或者其他可以度量不纯度的系数), 为特征值的个数, 是原样本的记录总数, 是与决策后的样本相关联的记录个数。
当选择信息熵作为样本的不纯度度量时,Δ就叫做信息增益 。
我们可以遍历每一个特征,看就哪个特征决策时,产生的信息增益最大,就把他作为当前决策节点,之后在下一层继续这个过程。
举个例子:
如果我们的目标是判断什么情况下,销量会比较高(受天气,周末,促销三个因素影响),根据上述的信息增益求法,我们首先应该找到根据哪个特征来决策,以信息熵为例:
首先肯定是要求 ,也就是销量这个特征的信息熵:
接下来,就分别看三个特征关于销量的信息熵,先看天气,天气分为好和坏两种,其中天气为好的条件下,销量为高的有11条,低的有6条;天气坏时,销量为高的有7条,销量为低的有10条,并且天气好的总共17条,天气坏的总共17条。
分别计算天气好和天气坏时的信息熵,天气好时:
根据公式 ,可以知道,N是34,而天气特征有2个值,则k=2,第一个值有17条可以关联到决策后的节点,第二个值也是17条,则能得出计算:
再计算周末这个特征,也只有两个特征值,一个是,一个否,其中是有14条,否有20条;周末为是的中有11条销量是高,3条销量低,以此类推有:
信息增益为:
另外可以得到是否有促销的信息增益为0.127268。
可以看出,以周末为决策,可以得到最大的信息增益,因此根节点就可以用周末这个特征进行分支:
注意再接下来一层的原样本集,不是34个而是周末为“是”和“否”分别计算,为是的是14个,否的是20个。
这样一层一层往下递归,直到判断节点中的样本是否都属于一类,或者都有同一个特征值,此时就不继续往下分了,也就生成了叶子节点。
上述模型的决策树分配如下:
需要注意的是,特征是否出现需要在分支当中看,并不是整体互斥的,周末生成的两个分支,一个需要用促销来决策,一个需要用天气,并不代表再接下来就没有特征可以分了,而是在促销决策层下面可以再分天气,另外一遍天气决策下面可以再分促销。
决策树的模型比较容易解释,看这个树形图就能很容易的说出分类的条件。
我们知道属性有二元属性、标称属性、序数属性和连续属性,其中二元、标称和序数都是类似的,因为是离散的属性,按照上述方式进行信息增益计算即可,而连续属性与这三个不同。
对于连续的属性,为了降低其时间复杂度,我们可以先将属性内部排序,之后取相邻节点的均值作为决策值,依次取每两个相邻的属性值的均值,之后比较他们的不纯度度量。
需要注意的是,连续属性可能在决策树中出现多次,而不是像离散的属性一样在一个分支中出现一次就不会再出现了。
用信息熵或者Gini系数等不纯度度量有一个缺点,就是会倾向于将多分支的属性优先分类——而往往这种属性并不是特征。
例如上面例子中的第一行序号,有34个不同的值,那么信息熵一定很高,但是实际上它并没有任何意义,因此我们需要规避这种情况,如何规避呢,有两种方式:
公式如下:
其中k为划分的总数,如果每个属性值具有相同的记录数,则 ,划分信息等于 ,那么如果某个属性产生了大量划分,则划分信息很大,信息增益率低,就能规避这种情况了。
为了防止过拟合现象,往往会对决策树做优化,一般是通过剪枝的方式,剪枝又分为预剪枝和后剪枝。
在构建决策树时,设定各种各样的条件如叶子节点的样本数不大于多少就停止分支,树的最大深度等,让决策树的层级变少以防止过拟合。
也就是在生成决策树之前,设定了决策树的条件。
后剪枝就是在最大决策树生成之后,进行剪枝,按照自底向上的方式进行修剪,修剪的规则是,评估叶子节点和其父节点的代价函数,如果父节点的代价函数比较小,则去掉这个叶子节点。
这里引入的代价函数公式是:
其中 代表的是叶子节点中样本个数, 代表的是该叶子节点上的不纯度度量,把每个叶子节点的 加起来,和父节点的 比较,之后进行剪枝即可。
㈥ 几种常见的决策算法
动态归划算法,贪心算法法。最大流算法,最短路算法。
㈦ 决策树法的计算题
依据y坐标将六个点划分为两个子类,水平线上面的两个点是同一个分类,但是水平线之下的四个点是不纯净的。
对这四个点进行再次分类,以x左边分类,通过两层分类,现了对样本点的完全分类。
决策树是一种具有树状结构的分类和预测工具,其中每个内部节点表示对一个属性的测试,每个分支表示测试的结果,每个叶节点(终端节点)持有一个类标签。
(7)决策算法题扩展阅读
决策树算法的关键
1、分裂属性的选择
即选择哪个自变量作为树叉,也就是在n个自变量中,优先选择哪个自变量进行分叉。
2、树剪枝
即在构建树叉时,由于数据中的噪声和离群点,许多分支反映的是训练数据中的异常,而树剪枝则是处理这种过分拟合的数据问题,常用的剪枝方法为先剪枝和后剪枝。
㈧ 毕业设计题目是(选用决策树算法的数据挖掘实例分析与设计)
应用遗传算法和决策树算法在数据挖掘中的比较
贾修一 MG0533024
(南京大学 计算机科学与技术系, 江苏省南京市 210093)
A Comparision between the Genetic Algorithms and Decision Tree For Data
Mining
Abstract: This chapter introces the application with the genetic algorithms and ID3 for the data mining, choose
the better algorithm to classifier the given data sets through.the comparision between the two algorithms. And
analyzing the results of the experiment as well as reasons.
Key words: genetic algrithms; data ming; decision Tree
摘 要: 对训练数据分别采用遗传算法和决策树算法进行数据挖掘,通过比较两者实验得出的结果,来选
择更适合本数据集的算法进行分类,并分析实验结果及原因.
关键词: 遗传算法;数据挖掘;决策树算法
1. 数据的描述
数据属性有139351维,每个属性的取值为0或1,分类标识只有两类:A和I.数据的维数太高,在数
据预处理阶段最好做属性的约简,进行降维的处理.
(1)数据维数太高,易造成一定的维数灾难,使得分类挖掘时间过长.
(2)数据庞大,肯定有些噪音数据.
2.算法的设计
为了提高最后分类的精确度,特设计了两种方法进行比较,从中选出一种精确度高的方法.第一种是根
据数据的特点,每个属性只取值0和1,所以进行属性约简的时候采用遗传算法.遗传算法的优点是可以对
大规模的数据进行一定的属性约简.
2.1 遗传算法描述:
(1) 遗传算法的步骤是编码,选择,交叉,变异.通过模仿自然界中的遗传进化原理,来对数据进行
处理.而遗传算法的好坏取决于适应度函数的选择,进化的次数,和交叉变异的合理性和概率性等,所以要
想设计一个合适的遗传算法必须经过大量的实验.
(2) 就训练数据而言,对每一维属性的取值,在类标识一定的条件下,取1和取0的概率之间有个绝
对值差α1,α2,该差越大,说明该属性的重要程度越高.同时还要考虑对同一维属性,不论最终类标识是
什么,取值都相同的话,则该属性可以被认为是无效的属性,对最后的分类没有影响,所以适应度函数取对
每一维属性的α1,α2的熵,熵越大,则属性的重要程度就越低.
(3) 编码阶段,就把每一位属性做为一个长度为139351的染色体的一个基因,1表示选择该属性,0
表示不选择该属性.随机初始化8个种群,按照适应度函数的定义,从中选取4个适应度函数最小的染色体
做为父代.
(4) 将选出的父代进行交叉操作,因为是降维操作,所以交叉就是取两个染色体之间隔位进行AND(与)
操作,变异就是按照一定的概率,在139351维上随机的100位进行非操作,即:0变为1,1变为0.依次又
产生4个后代,结合原来的4个父代组成新的8个初始种群.进化50次.
然后利用贝叶斯方法进行分类.得到的是一个弱的学习器h,然后利用AdaBoost方法进行强化学习分类器.
2.2 AdaBoost算法描述:
(1) 给定训练集(x1,y1),(x2,y2),…,(xm,ym)m个.
(2) yi∈{-1,+1},实例xi∈X的正确标识.
(3) for t=1,…,T
2
{
构造{1,…,m}上的分布Dt,找出弱分类器 ht:X->{-1,+1},
同时在Dt产生很小的错误εt:
εt=PrDt[ht(xi)≠yi]
}
(4)构造 Dt,D1(i)=1/m
Dt+1(i)= Dt/Zt*exp(-αt*yi*ht(xi))//(注:yi和ht(xi)只能取值于{-1,+1})
其中Zt是归一化因子(使Dt+1为分布)
αt=1/2*㏑((1-εt)/ εt)>0
(5)输出最终分类器:Hfinal(x)=sign(∑αt*ht(x)).
第二种方法就是直接使用决策树方法(ID3算法)进行分类.求出每一维属性的的信息增益,建立一棵
决策树,利用决策树来进行分类.
2.3 决策树算法(ID3)
(1)创建节点N;
(2)if samples都在同一个类C then
{
返回N作为叶结点,以类C标识;
}
(3)if attribut_list为空 then
{
返回N作为叶结点,标记为samples中最普通的类;
}
(4) 选择attribute_list中具有最高信息增益的属性test_attribute;标记节点N为test_attribute;
(5) for each test_attribute中的已知值a
由节点N长出一个条件为test_attribute=a的分枝;
(6) 设s是samples中test_attribute=a的样本的集合;
(7) if s为空 then
加上一个树叶,标记weisamples中最普通的类;
else
加上一个由ID3(s,attribute_list-test_attribute)返回的节点;
3. 实验分析
就第一种方法:通过实验,在进化次数上选取50次,使得维数约简到1500维左右时得到的分类效果最
好,但由于种群是随机产生的,所以在未进行boosting强化时正确率在60~85%之间,不是很稳定,但是符
合弱分类器的要求,即只要正确率超过50%就行,在进行boosting后,正确率能超过80%,但可能是数据进
行约简的不好或进行迭代的次数选取不太合适,正确率却没有ID3的高.就本数据集而言,由于最终标识只
有2个,所以比较适合使用遗传算法和Adaboost进行训练.正确率不高主要问题应该在:
(1)遗传算法的适应度函数没有选好,不同的编码方式对应不同的适应度函数取法,就本例而言,二进
制编码方式应该是可以的,就是在对适应度函数取的时候没有一个合适的数据表示,只好利用了熵的概念,
但在实际意义上感觉效果并不是很好.属性约简后正确率不高,这应该是最主要的原因.
(2)交叉变异的方式或许有问题,但是不是主要问题,只要适应度函数选好,也就是选择操作正确的话,
这两步操作对最终结果应该影响不大.
(3)进化次数的改进,通过实验,考虑最后的正确率和运行时间,发现在进化50次和约简到1500维时
贾修一:应用遗传算法和决策树算法在数据挖掘中的比较3
效果最好.但随着适应度函数的不同,进化次数也不同.从理论上说,进化次数越多,效果也应该越好,最
终达到一个最优解,但同时要避免得到局部最优解,就需要对传统的遗传算法进行改进,避免早熟问题.在
此就不讨论.
(4)利用贝叶斯分类得到的弱学习器,在格式上并不和Adaboost完全适应,所以在应用的时候效果不
是很好,这也取决于迭代的次数和训练样集的选取.
就决策树方法,对这么多维的属性在某种意义上说并不合适,但就对本实验给定的训练样例集而言,通
过建树,只要6个结点就可以,而且正确率超过90%,所以,根据不同的数据集采用不同的方法得到的正确
率是不一样的.所以在某种程度上说,奥卡姆剃刀原理是正确的.
由于时间有限,没有对第一种方法进行一定的改进和进行其他方法的实验,故最终采用ID3算法进行分
类,采用前100个数据进行训练,后10个进行测试,错误的只有1个.采用前80个数据进行训练,后30
个进行测试的时候只有2个分类错误.正确率自测还是可以的.
4. 总结和感谢
通过本次实验,最大的收获就是采用了两种不同的方法进行了实验比较,虽然自己原先设计的算法没有
得到期望中的效果,并最终采用了其他的算法,但是通过实验,我对遗传算法和AdaBoost强化弱学习器方法
等有了更深的了解,也明白对不同的数据,是没有一种万能通用的解法的.以后会继续改进自己的算法,争
取取得好的效果.最后感谢老师能提供这次实验的数据.
㈨ 决策树算法原理
决策树是通过一系列规则对数据进行分类的过程。它提供一种在什么条件下会得到什么值的类似规则的方法。决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。
如果不考虑效率等,那么样本所有特征的判断级联起来终会将某一个样本分到一个类终止块上。实际上,样本所有特征中有一些特征在分类时起到决定性作用,决策树的构造过程就是找到这些具有决定性作用的特征,根据其决定性程度来构造一个倒立的树--决定性作用最大的那个特征作为根节点,然后递归找到各分支下子数据集中次大的决定性特征,直至子数据集中所有数据都属于同一类。所以,构造决策树的过程本质上就是根据数据特征将数据集分类的递归过程,我们需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类时起决定性作用。
一棵决策树的生成过程主要分为以下3个部分:
特征选择:特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。
决策树生成: 根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。 树结构来说,递归结构是最容易理解的方式。
剪枝:决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。
划分数据集的最大原则是:使无序的数据变的有序。如果一个训练数据中有20个特征,那么选取哪个做划分依据?这就必须采用量化的方法来判断,量化划分方法有多重,其中一项就是“信息论度量信息分类”。基于信息论的决策树算法有ID3、CART和C4.5等算法,其中C4.5和CART两种算法从ID3算法中衍生而来。
CART和C4.5支持数据特征为连续分布时的处理,主要通过使用二元切分来处理连续型变量,即求一个特定的值-分裂值:特征值大于分裂值就走左子树,或者就走右子树。这个分裂值的选取的原则是使得划分后的子树中的“混乱程度”降低,具体到C4.5和CART算法则有不同的定义方式。
ID3算法由Ross Quinlan发明,建立在“奥卡姆剃刀”的基础上:越是小型的决策树越优于大的决策树(be simple简单理论)。ID3算法中根据信息论的信息增益评估和选择特征,每次选择信息增益最大的特征做判断模块。ID3算法可用于划分标称型数据集,没有剪枝的过程,为了去除过度数据匹配的问题,可通过裁剪合并相邻的无法产生大量信息增益的叶子节点(例如设置信息增益阀值)。使用信息增益的话其实是有一个缺点,那就是它偏向于具有大量值的属性--就是说在训练集中,某个属性所取的不同值的个数越多,那么越有可能拿它来作为分裂属性,而这样做有时候是没有意义的,另外ID3不能处理连续分布的数据特征,于是就有了C4.5算法。CART算法也支持连续分布的数据特征。
C4.5是ID3的一个改进算法,继承了ID3算法的优点。C4.5算法用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足在树构造过程中进行剪枝;能够完成对连续属性的离散化处理;能够对不完整数据进行处理。C4.5算法产生的分类规则易于理解、准确率较高;但效率低,因树构造过程中,需要对数据集进行多次的顺序扫描和排序。也是因为必须多次数据集扫描,C4.5只适合于能够驻留于内存的数据集。
CART算法的全称是Classification And Regression Tree,采用的是Gini指数(选Gini指数最小的特征s)作为分裂标准,同时它也是包含后剪枝操作。ID3算法和C4.5算法虽然在对训练样本集的学习中可以尽可能多地挖掘信息,但其生成的决策树分支较大,规模较大。为了简化决策树的规模,提高生成决策树的效率,就出现了根据GINI系数来选择测试属性的决策树算法CART。
决策树算法的优点:
(1)便于理解和解释,树的结构可以可视化出来
(2)基本不需要预处理,不需要提前归一化,处理缺失值
(3)使用决策树预测的代价是O(log2m),m为样本数
(4)能够处理数值型数据和分类数据
(5)可以处理多维度输出的分类问题
(6)可以通过数值统计测试来验证该模型,这使解释验证该模型的可靠性成为可能
(7)即使该模型假设的结果与真实模型所提供的数据有些违反,其表现依旧良好
决策树算法的缺点:
(1)决策树模型容易产生一个过于复杂的模型,这样的模型对数据的泛化性能会很差。这就是所谓的过拟合.一些策略像剪枝、设置叶节点所需的最小样本数或设置数的最大深度是避免出现该问题最为有效地方法。
(2)决策树可能是不稳定的,因为数据中的微小变化可能会导致完全不同的树生成。这个问题可以通过决策树的集成来得到缓解。
(3)在多方面性能最优和简单化概念的要求下,学习一棵最优决策树通常是一个NP难问题。因此,实际的决策树学习算法是基于启发式算法,例如在每个节点进行局部最优决策的贪心算法。这样的算法不能保证返回全局最优决策树。这个问题可以通过集成学习来训练多棵决策树来缓解,这多棵决策树一般通过对特征和样本有放回的随机采样来生成。
(4)有些概念很难被决策树学习到,因为决策树很难清楚的表述这些概念。例如XOR,奇偶或者复用器的问题。
(5)如果某些类在问题中占主导地位会使得创建的决策树有偏差。因此,我们建议在拟合前先对数据集进行平衡。
(1)当数据的特征维度很高而数据量又很少的时候,这样的数据在构建决策树的时候往往会过拟合。所以我们要控制样本数量和特征的之间正确的比率;
(2)在构建决策树之前,可以考虑预先执行降维技术(如PCA,ICA或特征选择),以使我们生成的树更有可能找到具有辨别力的特征;
(3)在训练一棵树的时候,可以先设置max_depth=3来将树可视化出来,以便我们找到树是怎样拟合我们数据的感觉,然后在增加我们树的深度;
(4)树每增加一层,填充所需的样本数量是原来的2倍,比如我们设置了最小叶节点的样本数量,当我们的树层数增加一层的时候,所需的样本数量就会翻倍,所以我们要控制好树的最大深度,防止过拟合;
(5)使用min_samples_split(节点可以切分时拥有的最小样本数) 和 min_samples_leaf(最小叶节点数)来控制叶节点的样本数量。这两个值设置的很小通常意味着我们的树过拟合了,而设置的很大意味着我们树预测的精度又会降低。通常设置min_samples_leaf=5;
(6)当树的类比不平衡的时候,在训练之前一定要先平很数据集,防止一些类别大的类主宰了决策树。可以通过采样的方法将各个类别的样本数量到大致相等,或者最好是将每个类的样本权重之和(sample_weight)规范化为相同的值。另请注意,基于权重的预剪枝标准(如min_weight_fraction_leaf)将比不知道样本权重的标准(如min_samples_leaf)更少偏向主导类别。
(7)如果样本是带权重的,使用基于权重的预剪枝标准将更简单的去优化树结构,如mn_weight_fraction_leaf,这确保了叶节点至少包含了样本权值总体总和的一小部分;
(8)在sklearn中所有决策树使用的数据都是np.float32类型的内部数组。如果训练数据不是这种格式,则将复制数据集,这样会浪费计算机资源。
(9)如果输入矩阵X非常稀疏,建议在调用fit函数和稀疏csr_matrix之前转换为稀疏csc_matrix,然后再调用predict。 当特征在大多数样本中具有零值时,与密集矩阵相比,稀疏矩阵输入的训练时间可以快几个数量级。
㈩ 决策树算法之随机森林
在 CART 分类回归树 的基础之上,我们可以很容易的掌握随机森林算法,它们之间的区别在于,CART 决策树较容易过拟合,而随机森林可以在一定程度上解决该问题。
随机森林的主要思想是:使用随机性产生出一系列简单的决策树,并组合它们的预测结果为最终的结果,可谓三个臭皮匠赛过一个诸葛亮,下面我们就来具体了解一下。
产生随机森林的步骤大致为三步
在第 1 步,它是一个可放回抽样,即所产生的样本是允许重复的,这种抽样又被称为 Bootstrap,例如我们有以下 mmy 数据
在做完 Bootstrap 之后,可能的样本数据如下
可见,样本数据中,第 3 条和第 4 条样本是一样的,都对应的是原始数据中的第 4 条。
接下来,就是要使用上面的样本数据来产生决策树了,产生决策树的方法和 CART 基本一致,唯一的不同地方在于,节点的构建不是来自于全部的候选特征,而是先从中随机的选择 n 个特征,在这 n 个特征中找出一个作为最佳节点。
举个例子,假设 n = 2,且我们随机选择了“血液循环正常”和“血管堵塞”这两个特征来产生根节点,如下:
我们将在上述两个特征中选择一个合适的特征作为根节点,假设在计算完 Gini 不纯度之后,“血液循环正常”这个特征胜出,那么我们的根节点便是“血液循环正常”,如下图所示
接下来我们还需要构建根节点下面的节点,下一个节点将会在剩下的“胸口疼痛”、“血管堵塞”和“体重”三个特征中产生,但我们依然不会计算所有这 3 个特征的 Gini 不纯度,而是从中随机选择 2 个特征,取这 2 个特征中的 Gini 不纯度较低者作为节点。
例如我们随机选到了“胸口疼痛”和“体重”这两列,如下:
假设此时“体重”的 Gini 不纯度更低,那么第 2 个节点便是“体重”,如下图:
继续下去,我们便产生了一棵决策树。
随机森林是多棵决策树,在产生完一棵决策树后,接着会循环执行上述过程:Bootstrap 出训练样本,训练决策树,直到树的数量达到设置值——通常为几百棵树。
现在我们产生了几百棵树的随机森林,当我们要预测一条数据时,该怎么做呢?我们会聚合这些树的结果,选择预测结果最多的那个分类作为最终的预测结果。
例如我们现在有一条数据:
该条数据被所有树预测的结果如下:
上述结果聚合后为:
取最多的那项为最终的预测结果,即 Yes——该病人被诊断为患有心脏病。
以上,随机森林的两个过程: B ootstrap 和 Agg regate 又被称为 Bagging 。
本文我们一起学习了随机森林的算法,和 CART 决策树比起来,它主要被用来解决过拟合问题,其主要的思想为 Bagging,即随机性有助于增强模型的泛化(Variance) 能力。
参考:
相关文章: