机器学习3决策树算法模型

决策树算法模型

  • 1.什么是决策树?
  • 2.决策树的归纳
    • 2.1 (选择分裂特征)特征的选择
    • 2.2 决策树的生成
      • 2.2.1 ID3 算法
      • 2.2.2 C4.5 算法
      • 2.2.3 Card算法
    • 2.2 树剪枝
      • 2.2.1 先剪枝
      • 2.2.1 后剪枝
  • 3. 决策树在sklearn中实现

1.什么是决策树?

决策树(decision tree)是一种类似与流程图的树结构,其中,每个内部节点(非树叶节点)表示在一个属性上的测试,每个分支代表该测试的输出,而每个树叶节点(或终端节点)存放一个类标号。数的最顶层节点是根节点。一棵典型的决策树如下图:
机器学习3决策树算法模型_第1张图片
它预用户信用等级是否良好。内部的节点用矩形表示,而叶子节点用椭圆表示。有些决策树算法只产生二叉树(其中,每个内部节点正好分叉出两个其他节点),而另一些决策树算法可能产生非二叉的树。
为什么决策树分类器如此流行?决策树分类器的构造不需要任何领域知识或参数设置,是一个非参数统计,因此适合于探测式知识的发现。决策树可以处理高维数据。获取的知识用树的形式表示是直观的,并且很容易被人理解。

2.决策树的归纳

决策树是从有类标号的训练元组中学习决策的方法。
决策树模型的建立包含三个过程:
1.选择分裂特征
2.生成决策树
3.剪枝
接下来我们对这三个过程进一一进行详细的叙述:

2.1 (选择分裂特征)特征的选择

在很多我们学过的算法,例如ANN神经网络,XGboost算法等,它们都是一种“贪心算法",所谓的贪心算法就是,在每一次分裂的过程中只考虑分裂时最优的节点去选择分支,而忽略了整体可能存在的一些问题。即通过局部最优来选择到达全局最优的这么一思想。
如何评估选择的特征作为分裂的最好节点呢?随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即节点的纯度,节点的不纯度越高,即它们包含的属性就有多种,也就是划分的效果不佳。反之亦然。
这里我们引入了信息熵来计算每个节点的不纯度:
1、信息熵(entropy)是度量样本集合纯度最常用的一种指标:
Pk 表示的是当前样本集合 D 中第 k 类样本所占的比例为 Pk,Ent(D)的值越小,则 D 的
纯度就越高。
机器学习3决策树算法模型_第2张图片
在信息熵指数的指导下,决策树生成过程的局部最优条件也非常好理解:即在选取属
性测试条件(attribute test condition)对某结点(数据集)进行切分的时候,尽可能选取
使得该结点对应的子节点信息熵最小的特征进行切分。换而言之,就是要求父节点信息熵
和子节点总信息熵之差要最大。
2、我们将其它定义为信息增益:在这里插入图片描述
也可由下述公式表达:
在这里插入图片描述
即父节点的信息熵–子节点的信息熵 = 信息增益
不难发现以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题,C4.5算法使用信息增益率(information gain ratio)可以对这一问题进行校正
机器学习3决策树算法模型_第3张图片
3、信息增益率的定义为为 信息增益/特征的值的熵。
从公式中我们能发现特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大。不过有一个缺点:信息增益率偏向取值较少的特征。
基于以上缺点,C4.5 算法并不是直接选择信息增益率最大的特征,而是先在候选特征
中找出信息增益高于平均水平的特征,然后在这些特征中再选择信息增益率最高的特征。
4、同样还有一个基尼系数:
简单来说就是数据集 D 的纯度可用基尼值来度量:
在这里插入图片描述
不纯度gini(D) 反映了从数据集 D 中随机抽取两个样本,其类别标记不一致的概率.举例来说,现在一个袋子里有 3 种颜色的球若干个,伸手进去掏出 2 个球,颜色不一样的概率。因此, Gini(D) 越小,则数据集 D 的纯度越高。
于是,我们在候选属性集合中,选择那个使得划分后基尼指数最小的属性作为最优属性。
选择好最优的分支节点后,接下来是树的生成

2.2 决策树的生成

  1. 得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,
    因此可能存在大于两个分支的数据集划分;
  2. 第一次划分之后,数据集被向下传递到树的分支的下一个结点;
  3. 新的结点上,我们可以再次划分数据,因此我们可以采用递归的原则处理数据集;
    决策树的生成有3中方法分别是ID3 算法、C4.5 算法、Card 算法。

2.2.1 ID3 算法

ID3 算法的基本流程: ID3 算法的核心是在决策树各个结点应用信息增益准则选择特征,递归地构建决策树。 具体方法是:
1、 从根结点开始,对结点计算所有可能的特征的信息增益
2、选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点
3、 再对子结点调用以上方法,构建决策树
4、 直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树
缺点:
ID3 算法局限主要源于局部最优化条件,即信息增益的计算方法,其局限性主要有以下
几点:
1、无剪枝策略,容易过拟合;
2、趋向类别多的属性;
3、只能用于处理离散分布的特征并且只能处理分类问题;
4、没有考虑缺失值;

2.2.2 C4.5 算法

C4.5算法是对ID3算法的一种改进:
1、通过信息增益率选择分裂属性,克服ID3算法通过信息增益的倾向于选择拥有多个属性的属性值作为分裂属性的不足;
2、能够处理离散型和连续型的属性变量,即将连续型的属性进行离散化处理;
3、构造决策树之后的剪枝操作,可以防止过拟合;
4、能够处理具有缺失值属性值的训练数据。
缺点:
1、算法的计算效率低,特别是对含有连续属性值的训练样本
2、算法在选择属性分裂时没有考虑到条件属性间的相关性,只计算数据集中的每一个条件属性与决策属性之间的期望信息,有可能影响到属性选择的正确性。

2.2.3 Card算法

CART:分类回归树(Classification and Regression Tree)
1、分裂过程是一个二叉递归划分过程
2、CART 预测变量的类型既可以是连续型变量也可以是分类型变量
3、数据应以其原始形式处理,不需要离散化
4、用于数值型预测时,并没有使用回归,而是基于到达叶结点样本的平均值做出预测
1) 分裂准则
二叉递归划分:条件成立向左,反之向右
1、 对于连续变量:条件是属性小于等于最优分裂点
2、对于分类变量:条件是属性属于若干类
2) 二叉分裂的优点
1、相比多路分裂导致数据碎片化的速度慢,允许在一个属性上重复分裂,即可以在一个属 性上产生足够多的分裂。
对于属性不同的被预测变量 y 分裂准则不同:
1、分类树:Gini 最小化准则
2、回归树: 平方误差最小化准则
机器学习3决策树算法模型_第4张图片

2.2 树剪枝

为什么需要预剪枝呢?首先我们要知道 机器学习建模就是通过模型来学习数据中的规律,应用数据中的规律泛化到日常生活中的数据。
其次我们需要明确两个概念:

  1. 过拟合:
    模型在训练集上表现很好,在测试集上表现很糟糕,学习能力强但学的太多精细。我们也可以这么理解:我们想要得到的模型它不仅在我们在训练集数据集上表现良好,同样也希望它能在未知数据集上表现良好,这就叫模型的泛化。因为数据或多或少是存在噪声的,而我们只想模型将其中的规律学习到,而不希望模型学习到噪声,因此我们需要对模型进行剪枝策略。
  2. 欠拟合:
    模型在训练集上表现不好,在测试集上表现也很糟糕,即模型没有学习完数据集中的规律。

如何进行树剪枝?有两种常用的方法:先剪枝和后剪枝。

2.2.1 先剪枝

在先剪枝(prepruning)方法中,通过提前停止树的构建(例如,通过决定在给定的结点不再分裂或划分训练元组的子集)而对树“剪枝”。一旦停止,结点就成为树叶。该树叶可以持有子集元组中最频繁的类,或这些元组的分布概率。
在构造树时,可以使用信息增益,基尼指数等度量来评估划分的优劣。如果划分一个结点的元组导致低于预定义阈值的划分,则给定子集的进一步划分将停止。然而,选取预估适当的阈值是困难的。高阈值可能导致过分简化的树,而低阈值可能使得树的简化太少。

2.2.1 后剪枝

剪枝策略更常用的是后剪枝(postpruning),它由“完全生长的树”剪去“子树”。通过删除节点的分支并用树叶替换它而剪掉给定节点上的子树。该树叶的类标号用子树中最频繁的类标记。 而card使用的代价复杂度剪枝算法是后剪枝算法的一个实例。

3. 决策树在sklearn中实现

sklearn.tree.DecisionTreeClassifier

参数:

1、criterion:{“gini”, “entropy”}, default=”gini” 信息增益计算指标, 基尼指数信息熵

2、 splitter: {“best”, “random”}, default=”best” best选择最优切分方案, random, 随机选择.
3、 max_depth: int, default=None 限制树能增长到的最大深度. 限制模型过拟合的参数.
4、min_samples_split: int or float, default=2 最小样本分裂个数. 只有当一个节点当中的样本个数,超过这个值的时候, 才能够继续向下分裂.整数: 就是样本个数 小数: 百分比
5、 min_samples_leaf:int or float, default=1 叶节点最小样本个数. 分裂之后的叶节点样本个数.
6、 max_features:int, float or {“auto”, “sqrt”, “log2”}, default=None寻找最佳分割时要考虑的特征数量.If int,考虑几个 If float, 百分比 0.6 随机选择60%的特征, 寻找最优的. If “auto”, ‘sqrt’
根号个特征. If “log2” 对数个 If None, 所有特征都考虑
7、 random_state: 随机数种子

8、max_leaf_nodes:int, default=None 最大叶节点个数.

9、min_impurity_decrease:float, default=0.0 最小不纯度下降. 每次分裂不纯度都会下降,下降越多分裂效果越好, 如果一次分裂下降不到这个参数值, 就不再向下分裂.

10、 class_weight: 类别权重 用于处理不平衡数据集.

属性:

1、classes_: 分类标签

2、feature_importances_: 特征重要性

from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)
print (clf.predict([[2., 2.]]))

DecisionTreeClassifier默认采用基尼指数作为特征选择标准。值得注意的是,DecisionTreeClassifier构建决策树没有剪枝的步骤,若决策树出现了过拟合现象,可以适当的减少训练数据,重新学习决策树。

你可能感兴趣的:(算法,决策树,剪枝,信息熵,python)