李航-第5章决策树

决策树的学习算法包特征选择、决策树的生成与决策树的剪枝过程。
决策树学习应用信息增益准则选择特征。信息增益大的特征具有更强的分类能力。

1、特征选择问题。

特征选择是决定用哪个特征来划分特征空间。选择具有分类能力的特征可以调高决策树的学习的效率。
熵:表示随机变量不确定性的度量,单位是比特。熵越大,随机变量的不确定性越大。
经验熵和条件经验熵:当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵和条件经验熵。

决策树与条件概率分布?
决策树分类时将该结点的实例强行分到条件概率大的那一类去。

什么是信息增益?信息增益:表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。根据信息增益准则的特征选择方法是:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。

信息增益.jpg
2、决策树ID3算法(信息增益)

ID3算法与用极大似然法进行概率模型选择类似。

决策树ID3算法-流程
1、决定分类属性;
2 、对目前的数据表, 建立一个节点N
3 、如果数据库中的数据都属于同一个类, N就是树叶, 在树叶上标出所属的类
4 、如果数据表中没有其他属性可以考虑, 则N也是树叶, 按照少数服从多数的原则在树叶上标出所属类别
5 、否则, 根据平均信息期望值E或GAIN值选出一个最佳属性作为节点N的测试属性
6 、节点属性选定后, 对于该属性中的每个值:
从N生成一个分支, 并将数据表中与该分支有关的数据收集形成分支节点的数据表, 在表中删除节点属性那一栏如果分支数据表非空, 则运用以上算法从该节点建立子树

ID3生成决策树.jpg

ID3算法的基本思想是, 以信息熵为度量, 用于决策树节点的属性选择, 每次优先选取信息量最多的属性, 亦即能使熵值变为最小的属性, 以构造一颗熵值下降最快的决策树, 到叶子节点处的熵值为0。 此时, 每个叶子节点对应的实例集中的实例属于同一类。

关于书中如何根据经验熵和经验条件熵来计算信息增益比。理解注释如下:


计算经验熵-经验条件熵和信息增益.jpg

ID3算法由于只有树的生成,所有该算法生成的树容易产生过拟合

3、决策树C4.5算法(信息增益比)

CART:表示分类与回归树,是classification and regression tree的缩写。

C4.5的生成算法.jpg

C4.5相比ID3的改进在于使用信息增益比来选择特征。信息增益比的定义如下:


信息增益比.jpg
4、决策树CART算法(平方误差和基尼指数)

目标变量是类别的 --- 分类树
目标变量是连续的 --- 回归树

决策树的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则(比如最小二乘回归树生成),对分类用基尼指数最小化准则,进行特征选择,生成二叉树。

CART生成算法.jpg

CART算法由一下两步组成:
1、决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大。
2、决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小化作为剪枝的标准。

CART剪枝算法.jpg
In [1]: import numpy as np
   ...: import pandas as pd
   ...: import matplotlib.pyplot as plt
   ...: from sklearn.datasets import load_iris
   ...: from sklearn.model_selection import train_test_split

In [2]: def  create_data():
   ...:     iris = load_iris()
   ...:     df = pd.DataFrame(iris.data, columns=iris.feature_names)
   ...:     df['label'] = iris.target
   ...:     df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
   ...:     data = np.array(df.iloc[:100, [0, 1, -1]])
   ...:     # print(data)
   ...:     return data[:,:2], data[:,-1]

In [3]: X, y = create_data()
   ...: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
   ...: 
In [5]: from sklearn.tree import DecisionTreeClassifier
   ...: from sklearn.tree import export_graphviz
   ...: import graphviz
   ...: 

In [6]: clf = DecisionTreeClassifier()
   ...: clf.fit(X_train, y_train,)
   ...: 
Out[6]: 
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_split=1e-07, min_samples_leaf=1,
            min_samples_split=2, min_weight_fraction_leaf=0.0,
            presort=False, random_state=None, splitter='best')
In [7]: clf.score(X_test,y_test)
Out[7]: 0.9666666666666667
#下面的树图在IPyhon终端下显示不出来,可以用jupyter notebook下来使用显示
In [8]: tree_pic = export_graphviz(clf, out_file="mytree.pdf")
   ...: with open('mytree.pdf') as f:
   ...:     dot_graph = f.read()
   ...:     

In [9]: graphviz.Source(dot_graph)
Out[9]: 
决策树的剪枝

为什么进行决策树的剪枝?
因为决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的决策树往往对训练数据的分类很准确,但是对测试数据的分类却没有那么准确,即是会出现过拟合。过拟合的原因是在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。

其中,ID3和C4.5用于分类,即是离散变量。而CART既可以用于分类也可以用于回归。

参考链接:
决策树算法的Python实现
决策树类算法总结
决策树
李航 统计学习方法 第五章 决策树 课后 习题 答案

你可能感兴趣的:(李航-第5章决策树)