决策树(Decision Tree)

来源:互联网 发布:淘宝试用协议怎么同意 编辑:程序博客网 时间:2024/06/05 12:47

1.决策树模型:

决策树定义:分类决策树模型是一种描述对实例进行分类的树形结构;

组成部分:a.结点;    结点分为两种类型:内结点、叶结点;

   内部结点表示一个特征或者属性;

            叶结点表示一个类。

  b.有向边

用决策树进行分类,首先从根节点开始(根节点为实例的某一特征),并对其进行测试,根据测试结果,将实例分配到其子结点(子节点对应着该特征的一个取值);

使用递归的方法对实例进行测试并分配,一直到叶节点结束。

2.决策树与If-then规则:

规则过程:将决策树的根节点到叶节点的每一条路径构建一条规则;

if()——>为条件:路径上内部结点的特征

then——>:叶结点的类

if-then规则集合的性质:互斥且完备;

3.决策树与条件概率分布 :

将条件概率分布定义在特征空间的划分上;特征空间划分为互不交的单元或者区域,并在每一个单元(区域)定义一个类的概率分布;

若X表示特征的随机变量,Y表示类的随机变量,则条件概率表示为P(Y|X);

4.决策树学习:(常用算法:ID3、C4.5、CART)

损失函数为:正则化的极大似然函数;

策略:以损失函数为目标函数的最小化;

为防止过拟合现象(在对未知的数据测试过程中),则对决策树进行剪支;

决策树的生成是考虑局部最优,决策树的剪枝则为全局最优;

5.特征选择:(准则:信息增益、信息增益比)

特征选择在于选取对训练数据具有分类能力的特征;

a.信息增益定义:特征A对训练数据集D的信息增益为 g(D,A), 集合D的经验熵为H(D),在给定特征A的条件下D的经验熵为H(D|A);

信息增益公式为:g(D,A)=H(D)-H(D|A)

下面讲解什么是熵:熵是表示随机变量不确定性的度量;

假设X是一个取有限个值的离散随机变量,其概率分布为:P(X=xi)=pi       i=1,2,...n;

则随机变量X的熵定义为:

            其中自然对数以2为底或者以e为底;

熵的性质:1.熵依赖于X的分布,但与X的取值无关

      2.熵的值越大,表明随机变量的不确定性越大;

假设有随机变量(X,Y),其联合概率分布为:P(X=xi,Y=yj)=pij     i=1,2,...n;   j=1,2,.....m;

则条件熵H(Y|X)表示:在已知随机变量X的条件下,随机变量Y的不确定性;

在给定X的条件下,Y的条件概率分布的熵对X的数学期望:

     

信息增益准则的特征选择方法:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征;

决策树学习应用信息增益准则选择特征过程如下:给定训练数据集D,和特征A;经验熵H(D)表示对数据集进行分类的不确定性,而经验条件熵H(D|A)表示 在特征A给定的条件下,对数据集D进行分类的不确定性,则它们的差为信息增益;

信息增益算法:输入(训练数据集D,特征为A , |Ck|为属于类Ck的样本个数,|Di|为iDi的样本个数;

输出(特征A 对训练数据集D的信息增益g(D,A)

(1).计算数据集D的经验熵H(D):

def calc_ent(x):    x_value_list = set([x[i]] for i in range(x.shape[0]))    ent=0.0    for x_value in x_value_list:        p=float(x[x==x_value].shape[0])/x.shape[0]        logp = np.log2(p)        ent-=p*logp    return ent

经验熵其实就是信息量的大小问题,它和变量具体的取值没有任何关系,但是和值的类别多少以及发生概率有关;我们将数据集D看作为一个变量,Ck就是为它的类别,分别为C1,C2.....Ck;然而每一种类别取到的概率为|Ck|/|D|

(2).计算特征A对数据集D的经验条件熵H(D|A):

def calc_condition_ent(x,y):    x_value_list = set([x[i]] for i in range(x.shape[0]))    ent = 0.0    for x_value in x_value_list:        sub_y = y[x==x_value]        temp_ent = calc_ent(sub_y)        ent += (float(sub_y.shape[0])/y.shape[0])*temp_ent    return ent

(3).计算信息增益:

g(D,A)=H(D)-H(D|A)

def calc_ent_grap(x,y):    base_ent = calc_ent(y)    condition_ent = calc_condition_ent(x,y)    ent_grap = base_ent-condition_ent    return ent_grap

(4).信息增益比:

由于在分类问题困难时,即为在训练数据集的经验熵大的时候,信息增益值会偏大,反之,信息增益值偏小,

然而可以通过信息增益比来校正这一问题;

def calc_ent_rat(x,y):    base_ent = calc_ent(y)    ent_grap = calc_ent_grap(x,y)    ent_rat = ent_grap/base_ent    return ent_rat
6.决策树的生成:

(1)  ID3算法:(极大似然法进行概率模型)

算法的核心是:在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树;

实现过程:从根结点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或者没有特征可以选择为止,最后得到一个决策树;

(2)算法描述:

输入:训练数据集D,特征集A,阈值e;

输出:决策树T;

若D中所有实例属于同一类Ck,则T为单结点树,并将类Ck作为该结点的类标记,返回T;

若A为空集,则T为单节点树,并将D中实例数最大的类Ck作为该节点的类标记,返回T;

否则,计算A中各特征对D的信息增益,选择信息增益最大的特征Ag;

如果Ag的信息增益小于阈值e,则置T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T;

否则,对Ag的每一可能值ai,依Ag=ai将D分割为若干非空子集Di,将Di,中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;

对第 i 个子结点,以Di 为训练集,以A-{Ag}为特征集,递归调用步骤(1)~(5),得到子树Ti, 返回Ti;

7.C4.5算法(与ID3算法相似,在生成过程中,用信息增益比来选择特征)

输入:训练数据集D,特征集A,阈值e;

输出:决策树T;

若D中所有实例属于同一类Ck,则T为单结点树,并将类Ck作为该结点的类标记,返回T;

若A为空集,则T为单节点树,并将D中实例数最大的类Ck作为该节点的类标记,返回T;

否则,计算A中各特征对D的信息增益比,选择信息增益最大的特征Ag;

如果Ag的信息增益比小于阈值e,则置T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T;

否则,对Ag的每一可能值ai,依Ag=ai将D分割为若干非空子集Di,将Di,中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;

对第 i 个子结点,以Di 为训练集,以A-{Ag}为特征集,递归调用步骤(1)~(5),得到子树Ti, 返回Ti;