机器学习算法之--决策树总结

一、决策树算法数学原理

决策树是一种基本的分类回归方法,由结点和有向边组成,结点有两种类型,内部结点和叶节点,内部结点表示属性或特征叶节点表示类别,呈树形结构决策树可以看成是定义在特征空间和类空间上的条件概率分布,也可以看成if-then规则集合,每一个实例都被一条路和一个规则所覆盖,而且只被一条覆盖。

(1)算法思路:

三个步骤:特征选择–决策树的生成–决策树的剪枝

(2)两个阶段

学习:利用训练数据,根据损失函数最小化的原则建立决策树模型
预测:对新的数据,利用决策树模型进行分类

(3)模型优缺点

优点:
1)可读性强,分类速度快, 简单易于理解,而且高效实用,构建一次,就可以多次使用,或者只对树模型进行简单的维护就可以保持其分类的准确性。
2)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
3)可以交叉验证的剪枝来选择模型,从而提高泛化能力。
4) 对于异常点的容错能力好,健壮性高。
5)基本不需要预处理,不需要提前归一化,处理缺失值。
局限性:
1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

(4)决策树本质

从if-then规则集合角度来看,决策树本质是从训练数据归纳出一组分类规则,可能有多种分类规则,选择与训练数据矛盾最小的规则,同时具有较好的泛化能力。
从条件概率角度来看,决策数本质是学习由训练数据集估计的条件概率模型,选择条件概率模型的依据是不仅能对训练数据有较好的拟合,而且对位置数据也有很好的预测。

从可能的决策树中直接选取最优决策树是NP完全问题,现实中采用启发式方法学习次优的决策树。

(5)决策树损失函数与学习策略

损失函数通常为正则化的极大似然函数,学习策略是以损失函数为目标函数的最小化

(6)常用算法

  • ID3
  • C4.5
  • CART
    ID3决策树通常选择信息增益最大的特征来生成决策树。
    C4.5决策树通常选择信息增益比最大的特征来生成决策树。
    CART决策树通常选择基尼指数最小的特征来生成决策树。
    在这里插入图片描述

二、决策树算法思路

(1)特征选择

特征选择在于选取对训练数据具有分类能力的特征,可以提高决策树学习效率。从众多的特征中选择一个特征作为当前节点划分的标准,特征选择有不同的量化评估方法,从而衍生出不同的决策树,通常有信息增益,信息增益比,如ID3(通过信息增益选择特征)、C4.5(通过信息增益比选择特征)、CART(通过Gini指数选择特征)等。

随机变量X的熵定义为
在这里插入图片描述
在随机变量X给定下随机变量Y的条件熵定义为
在这里插入图片描述
当熵和条件熵中的概率由数据估计得到时,所对应的熵称为经验熵和经验条件熵。

信息增益定义

在这里插入图片描述
决策树学习过程中的信息增益等价于训练数据集中类与特征的互信息,信息增益越大的特征具有更强的分类能力,对于给定数据集,计算每个特征后,我们选择最大的信息增益的特征。

理解:选择划分后信息增益大的作为划分特征,说明使用该特征后划分得到的子集纯度越高,即不确定性越小。因此我们总是选择当前使得信息增益最大的特征来划分数据集。

扫描二维码关注公众号,回复: 6509059 查看本文章

缺点:信息增益偏向取值较多的特征(原因:当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分后的熵更低,即不确定性更低,因此信息增益更大)

计算步骤:
在这里插入图片描述

信息增益比定义

信息增益值的大小是针对数据集的,信息增益偏向取值较多的特征,使用信息增益比可以对问题进行校正。
在这里插入图片描述

(2)决策树生成

ID3算法(利用信息增益选择特征)

在这里插入图片描述在这里插入图片描述

ID3算法缺陷:

a) ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。

b) ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个变量有2个值,各为1/2,另一个变量为3个值,各为1/3,其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。如果校正这个问题呢?

c) ID3算法对于缺失值的情况没有做考虑

d) 没有考虑过拟合的问题

C4.5算法(利用信息增益比选择特征)

在这里插入图片描述
在这里插入图片描述

C4.5相对于ID3的改进:

对于ID3算法的第一个问题,不能处理连续特征, C4.5和CART的思路是将连续的特征离散化。
对于ID3算法的第二个问题,信息增益作为标准容易偏向于取值较多的特征的问题。C4.5引入信息增益比,可以校正信息增益容易偏向于取值较多的特征的问题。
对于ID3算法的第四个问题,C4.5引入了正则化系数进行初步的剪枝。

C4.5缺陷:

1)由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。剪枝的算法有非常多,C4.5的剪枝方法思路主要是两种,一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。

2)C4.5生成的是多叉树,CART为二叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。

3)C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。

4)C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大
量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。

(3)决策树剪枝

分类回归树的递归建树过程,它实质上存在着一个数据过拟合问题,决策树模型复杂度过高。在决策树构造时,由于训练数据中的噪音或孤立点,许多分枝反映的是训练数据中的异常,使用这样的判定树对类别未知的数据进行分类,分类的准确性不高。因此试图检测和减去这样的分支,检测和减去这些分支的过程被称为树剪枝。决策树剪枝通常通过极小化决策树整体损失函数来实现

决策树的生成只考虑了通过提高信息增益或者信息增益比来更好的拟合数据集,而决策树剪枝通过优化损失函数来减小模型复杂度利用损失函数最小化原则进行剪枝就是利用正则化的极大似然估计进行模型选择。
C(T)表示模型对训练数据的预测误差,|T|为模型复杂度,参数 α \alpha 控制两者的影响。较小的 α \alpha 选择较复杂的模型
在这里插入图片描述

三、CART决策树算法(利用基尼指数选择特征)

CART算法可以做回归,也可以做分类
两者的区别在于样本输出,如果样本输出是离散值,那么这是一颗分类树。如果果样本输出是连续值,那么那么这是一颗回归树。CART回归树和CART分类树的建立和预测的区别主要有下面两点:
1)连续值的处理方法不同
CART分类树采用的是用基尼系数的大小来度量特征的各个划分点的优劣情况。
CART回归树采用常见的和方差的度量方式
2)决策树建立后做预测的方式不同。

(1)算法基本步骤:

(1)决策树生成,基于训练数据的每一个特征的基尼指数进行特征选进而生成决策树,越大越好。
(2)决策树剪枝,用验证数据集对决策树进行剪枝并选择最优子树,用损失函数最小作为评判标准。

(2)基尼指数定义

在这里插入图片描述
基尼指数越大,集合不确定性就越大。在特征A条件下集合D的基尼指数定义为:
在这里插入图片描述
在选择特征时,计算每个特征对该数据集的基尼指数,选择具有最小的基尼指数的特征,

(3)CART决策树剪枝

分两步:
1、剪枝,形成一个子树序列。
2、在剪枝得到的子树序列中通过交叉验证在独立的验证数据集上选取平方误差或基尼指数最小的子树作为最优的子树返回。

在这里插入图片描述在这里插入图片描述

三、决策树代码实现

分为两种实现
sklearn(调用库)
python3(机器学习实战源代码实现)
github代码

sklearn实现

sklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

sklearn.tree.DecisionTreeClassifier模型参数

大部分参数与回归树参数一致,除了类别权重class_weight。

  • 特征选择标准criterion,可以使用"gini或者"entropy",前者代表基尼系数,后者代表信息增益。默认基尼系数"gini",即CART算法。
  • 特征划分点选择标准splitter, 可以使用"best"或者"random"。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random。
  • 划分时考虑的最大特征数max_features,
    如果是int,则max_features=n_features的绝对值。
    如果是float,则max_features等于n_features*float取整后的特征数。
    int(max_features * n_features)要素。
    如果是“auto”,则max_features = sqrt(n_features)。
    如果是“sqrt”,则max_features = sqrt(n_features)。
    如果是“log2”,则max_features = l o g 2 log_2 (n_features)。
    如果为None,则max_features = n_features,考虑所有的特征。
  • 决策树最大深度max_depth,树的最大深度,也就是说当树的深度到达max_depth的时候无论还有多少可以分支的特征,决策树都会停止运算.
  • 内部节点再划分所需最小样本数min_samples_split,这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分默认为2。,样本数量大可以适当提升这个值。
  • 叶子节点最少样本数min_samples_leaf, 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
  • 叶子节点最小的样本权重和min_weight_fraction_leaf,有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重。
  • 最大叶子节点数max_leaf_nodes, 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,
  • 类别权重class_weight,指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。也可以为balanced,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。或者自己设定权重。默认为none。 不适用于回归树
  • 节点划分最小不纯度min_impurity_split,这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。

决策树调参要点:

1、如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。
2、推荐多用决策树的可视化(下节会讲),同时先限制决策树的深度
3、使用min_samples_split 或者 min_samples_leaf 这两个参数来控制每个叶子节点上面的样本数量。小数量通常意味着树会过拟合,而太大的数量则会使得树难以从数据中进行学习。尝试 min_samples_leaf=5 作为初始值。如果样本数量的变化过于剧烈,可以对这两个参数设置百分值。这两个参数的主要区别在于 min_samples_leaf 会在每个叶子节点里保存一个最小数量的样本,而 min_samples_split 能够创建出一个很随意的用来存放样本的小节点
4、如果输入的矩阵X 非常稀疏,那就建议在对它进行拟合使用spares.csc_matrix 函数,而在预测之前使用 spares.csr_matrix **函数进行压缩。(csc_matrix(column, 对列进行压缩) ,csr_matrix(row, 对行进行压缩))。相比于一个密集矩阵,在特征上包含许多零值的稀疏矩阵的训练时间会比前者快上几个数量级。

决策树可视化方法:

先搭建环境
第一步是安装graphviz。下载地址在:http://www.graphviz.org/。
如果你是linux,可以用apt-get或者yum的方法安装。如果是windows,就在官网下载msi文件安装。无论是linux还是windows,装完后都要设置环境变量,将graphviz的bin目录加到PATH
第二步是安装python插件graphviz: pip install graphviz
第三步是安装python插件pydotplus。这个没有什么好说的: pip install pydotplus
这样环境就搭好了,如果仍然找不到graphviz,这时,可以在代码里面加入这一行:os.environ[“PATH”] += os.pathsep + ‘C:/Program Files (x86)/Graphviz2.38/bin/’
注意后面的路径是你自己安装的graphviz的bin目录。

代码:

from sklearn import tree
import numpy as np
import pydotplus 
from sklearn import datasets,model_selection
from sklearn.metrics import accuracy_score
import os 
from IPython.display import Image       
os.environ['PATH'] += os.pathsep + 'D:\\Graphviz2.38\\bin\\'
import matplotlib.pyplot as plt
iris=datasets.load_iris() # scikit-learn 自带的 iris 数据集
X=iris.data
y=iris.target
X_train,X_test,y_train,y_test=model_selection.train_test_split(X,y,test_size=0.3,random_state=0)
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf.fit(X_train, y_train)
with open("iris.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)

 
dot_data = tree.export_graphviz(clf, out_file=None, 
                         feature_names=iris.feature_names,  
                         class_names=iris.target_names,  
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = pydotplus.graph_from_dot_data(dot_data)  
graph.write_pdf("C:\\Users\\Administrator\\Desktop\\iris.pdf")#将写入pdf文件

结果如下图
结果如下图

猜你喜欢

转载自blog.csdn.net/qq_39751437/article/details/86550287