决策树(Decision Tree)----matlab和python(1)

来源:互联网 发布:网络机顶盒儿 编辑:程序博客网 时间:2024/05/16 09:29

分类: 根据数据样本的特征或属性,将其类型确定为某一已有类别值中。常用:模糊分类法、神经网络、决策树、KNN、朴素贝叶斯分类法、SVM等
聚类:K均值聚类(通常而言,为降低使数据满足分类算法要求而所需的预处理代价,可以选择使用聚类算法)

这里先介绍决策树
决策树是一种代表对象属性和对象值之间的预测模型。(逼近离散值目标函数的方法)
表示法: 通过把实例从根节点排列到某个叶子节点来分类实例,叶子节点即为实例所属的分类。
1 基本的决策树算法(IDE3算法)
基本算法采取自顶向下的贪婪搜索遍历肯呢个的决策树空间。构造过程从:”哪一个属性将在数的根节点被测试?“ 开始的。显然,我们希望”分类能力最好的属性被选作为数的根节点的测试“。然后为根节点属性的每一个值产生一个分支,并把训练样例排列到适当的分支。然后重复该过程,用每个分支节点关联的训练样例来选取在该店被测试的最佳属性。

基本决策树算法的伪代码:

DTree(examples, attributes)  // examples 为训练样例  attributes 训练样例中的属性列表 if 所有样例属于同一分类(都为正样本或都为负样本) then    返回标号为该分类的叶节点 //(a)  else if 属性值为空 then    返回标号为最普遍分类的叶节点 //(b)else    选取一个属性值(属性中分类能力最好的属性)(如A),作为根节点for A的每一个属性值Vi    另examplesi为具有A=Vi的样本子集    从根节点增加分支(A=Vi)    if examplesi为空 then        创建标号为最普遍分类的叶节点    else        递归创建子树DTree(examplesi, attributes-{A})


(a) 例如 对于学习布尔函数的ID3算法
如果训练样例都为正样例,则返回label=正 的单节点树,反之都为负样本,返回为负 的单节点树
(b)处理缺少属性值的训练样例
假设 <x,c(x)> 是S中的一个训练样例,并且其属性A的值A(x)未知
一种策略是: 赋给它节点n的训练样例中该属性的常见值
另一种是:赋给它节点n的被分类为 c(x) 的训练样例中该属性的最常见值

哪个属性是最佳分类属性?
ID3算法的核心问题就是选取在树的每一个节点要测试的属性。而如何去衡量一个属性的好坏呢? 这里定义一个统计属性:“信息增益(information gain)“用来衡量给定的属性区分训练样例的能力。

1 用来精确的定义信息增益,度量样例均一性
熵可以刻画任意样本集的纯度(purity) 假设S是包含关于某个目标概念的正负样本的样
本集, 则:

Entropy(s)=p+log2(p+)plog2(p)

其中 p+ 代表正样本所占的比例。p 为负样本所占比例

对于目标属性有m类的:

Entropy(s)=mi=1(pilog2(pi))

注:
若S的所有成员属于同一类,Entropy(s)=0, 若S中正负样本数量相等,则Entropy(s)=1, 若S的正负样本数量不等,则熵的赋值介于0——1之间

2 信息增益的求解
已经有了熵作为衡量训练样例集合纯度的标准,现在可以定义属性分类训练数据的能力的度量标准, 即 “信息增益”,简单说:一个属性的信息增益就是由于是用这个属性分割样例而导致的期望熵的降低。
一个属性A相对于集合S的信息增益Gain(S,A)被定义为:

Gain(s)=Entropy(s)vValues(A)(SvSEntropy(Sv))

其中,第一项就是S的熵,第二项就是用A分类S后熵的期望值,第二项描述的期望熵就是每个子集的熵的加权和,权值为属于Sv占原始样例S的比例。
所以,Gain(S,A) 是由于知道属性A的值而导致的期望熵减少,换句话讲, Gain(S,A) 是由于给定A的值而得到关于目标函数值的信息

例子: 计算Entropy(s)Gain(S,A) 以及画出简单的决策树
数据:
这里写图片描述

计算过程:
这里写图片描述

ID3算法的改进算法 —- C4.5算法
已知决策树的构造方法的实质就是每次选择一个好的特征,并且选择好的分裂点作为当前节点的分类条件。
ID3 选择属性用的是子树的信息增益, 使用的是熵,也就是熵的变化值。
C4.5使用的是信息增益率
信息增益率:融合了“Gain(S, A)” 和分裂信息SplitInformation(S,A)来共同定义:

SplitInformation(S,A)=mi=1(SiSlog2(SiS))

GainRation(S,A)=Gain(S,A)SplitInformation(S,A)

其中,S1Sm是m个值的属性A分割S而形成的m个样本子集。分裂信息就是S关于属性A各值的熵

Matlab 和python 代码下一节分析。

0 0