【机器学习之统计学习】 决策树及python 案例

前言 : 决策树是什么?可以干什么用?

决策树是一种基本的分类与回归方法。本章主要讨论分类的决策树。决策树模型呈树形结构,分类问题中,表示基于特征对实例进行分类的过程。基于训练数据学习决策树时,根据损失函数最小原则建立决策树。决策树学习包含3个步骤:特征选择、决策树生成和决策树修剪。

1、 决策树模型

      分类决策树由结点和有向边组成。结点类型由:内部结点和叶节点组成。内部结点表示一个特征或者属性,叶节点表示一个类。从根节点开始,对实例进行测试,根据测试结果,将实例分配到子结点,每一个子结点对应一个特征的取值,直到分配到叶节点,最后实例分到叶结点的类中。

提到一点,由决策树从根结点到叶结点的每一条路径构建一条规则:路径上的内部结点对应着规则条件,而叶节点的类对应着规则的结论决策树的路径是互斥且完备的。

2、 决策树学习

       决策树学习的本质是从训练集中归纳出一组分类的规则。我们需要找到一个与训练数据矛盾较少的决策树,同时具有很好的泛化能力。决策树的学习策略是以损失函数最小化。所以当损失函数确定以后,学习问题就转换成了在损失函数意义下选择最优决策树的问题。但从所有可能的决策树中找到最优决策树是一个NP完全问题(世界7大数学难题之一),所以通常我们得到的是次最优的

  1) 决策树的生成:

【机器学习之统计学习】 决策树及python 案例

 

2)特征选择:

      生成决策树,就需要选择者最优特征。那如何定义最优特征?或者说如何判断数据被最好的分类?我们用信息增益这个指标来判断特征的好坏。 直观理解,信息增益就是在确定某个条件后,信息复杂度(不确定性)减少的程度。如果减少的越多,说明这个条件所表示的信息量越大。在网上看到一个简单粗暴的例子:信息增益:熵-条件熵 。X(明天下雨)是一个随机变量,X的熵可以算出来, Y(明天阴天)也是随机变量,在阴天情况下下雨的信息熵我们如果也知道的话,那就是条件熵。两者相减就是信息增益!原来明天下雨例如信息熵是2,条件熵是0.01(因为如果是阴天就下雨的概率很大,信息就少了),这样相减后为1.99,在获得阴天这个信息后,下雨信息不确定性减少了1.99!是很多的!所以信息增益大!也就是说,阴天这个信息对下雨来说是很重要的!

       用信息增益进行特征选择的时候,存在偏向与选择取值较多的特征,这是可以使用信息增益比来解决这个问题。信息增益比增加了取值数目的惩罚项,解决的信息增益因取值多而增大的不足。

      对于信息增益和信息增益比的指标选择,对应有ID3和C4.5的生成算法。

 

3) 决策树的剪枝:

      决策树生成算法递归地产生决策树,可能产生过拟合现象,会导致决策树对训练集有较好的分类能力,但对预测集分类能力差。从而需要对决策树自下而上的剪枝,使其具有更好的泛化能力。具体操作是将过细的分支去掉,使其退回父结点,甚至更高的结点,将其改为叶节点。

      决策树的剪枝往往通过极小化决策树整体的损失函数或者代价函数来实现。

 

3、CART算法  

CART算法(classificationand regression tree),分类与回归树,本质是学习一个条件概率分布。CART假设决策树是二叉树,即内部结点为“是”和“否”CART算法由决策树生成和决策树修剪两步:

1)        决策树的生成:

     1.   回归树的生成

       因变量为连续变量,则考虑如何生成回归树。先利用启发式寻找最优切分变量和切分点,当输入空间的划分确定后,用平方误差最小准则求解每个单元上的最优输出值.

      2.   分类树的生成

      因变量为分类变量,则考虑如何生成分类树。用基尼指数最小原则选择最优特征,同时决定该特征的最优二值切分点。基尼指数:总体内包含的类别越杂乱,指数越大,概念和熵类似。

   2)    决策树的修剪

        以整体损失函数最小原则进行剪枝,得到子树序列,并通过交叉验证选取最优子树。

 

4、优缺点及适用场景

优点:1、速度快、准确性高:计算量小且容易生成规则;

          2、生成的分类规则准确性高且 便于理解;

          3、不需要任何假设条件

          4、适合高维度数据,且可同时处理连续和分类变量。

缺点: 1、容易出现过拟,可行方法可设置阈值,当前结点的记录数小于阈值以后,则停止分割;

         2、忽略了特征变量之间的相关性

 

5、案例实现

importnumpy as np

fromsklearn.datasets import load_iris

dataset=load_iris()

print(dataset)

trainX= dataset.data

trainY= dataset.target

#变量特征

fromsklearn import metrics

fromsklearn.ensemble import ExtraTreesClassifier

model= ExtraTreesClassifier()

model.fit(trainX,trainY)

print(model.feature_importances_)

#CART决策树

fromsklearn import metrics

fromsklearn.tree import DecisionTreeClassifier

# fita CART model to the data

model= DecisionTreeClassifier()

model.fit(trainX,trainY)

print(model)

# makepredictions

expected= trainY

predicted= model.predict(trainX)

#summarize the fit of the model

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

#用混肴矩阵判断分类准确性