【机器学习】机器学习入门07 - 决策树

1. 认识决策树

在Wikipedia的决策树词条中,有如下概念:

统计学,数据挖掘和机器学习中的决策树训练,使用决策树作为预测模型来预测样本的类标。这种决策树也称作分类树回归树。在这些树的结构里, 叶子节点给出类标而内部节点代表某个属性。

在数据挖掘中决策树训练是一个常用的方法。目标是创建一个模型来预测样本的目标值。

我们前面已经介绍过分类和回归这两个机器学习中的基本概念。而分类树和回归树,即分别是解决这两种问题的重要算法之一。

那么,什么是决策树?

决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别
使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
总结来说,决策树模型核心是下面几部分:

  • 结点和有向边组成
  • 结点有内部结点和叶结点俩种类型
  • 内部结点表示一个特征,叶节点表示一个类

(以上摘自 https://zhuanlan.zhihu.com/p/26703300

也就是说,我们通过从一棵决策树的根结点出发,根据情况逐级向下遍历,直到叶子结点,即得到了所需要的分类或回归结果。

这个过程模拟了人的决策过程,即逐个因素串行考虑,符合人类的思维模式,因而其原理相比于其他机器学习算法更容易理解。

2. 决策树的优点和缺点

对于任何一种数据结构和算法,我们都有必要明确其优点和缺点所在,从而在合适的场合下选用。

2.1 决策树的优点

  • 易于理解和解释 人们很容易理解决策树的意义。
    • 在第1节最后已经给出了这一点的解释
  • 只需很少的数据准备,其他技术往往需要数据归一化。
    • 数据的不同指标只需要在决策树的不同结点处与指定的标准作比较,不需要相互之间统一尺度。
  • 既可以处理数值型数据也可以处理类别型数据。其他技术往往只能处理一种数据类型。例如关联规则只能处理类别型的而神经网络只能处理数值型的数据。
    • 在每个结点处既可以判断其指标值与某标准的大小关系,也可以判断其所属的类别。可以在一棵决策树中共存。
  • 使用白箱模型. 输出结果容易通过模型的结构来解释。而神经网络是黑箱模型,很难解释输出的结果。
    • 每一个分类/回归的结果都是在特定决策树中逐级下行得到的,因而每一步决策都是可观测的。
  • 可以通过测试集来验证模型的性能 。可以考虑模型的稳定性。

  • 强健控制,对噪声处理有好的强健性。

  • 可以很好的处理大规模数据。

2.2 决策树的缺点

  • 训练一棵最优的决策树是一个NP完全问题。因此, 实际应用时决策树的训练采用启发式搜索算法例如贪心算法来达到局部最优。这样的算法没办法得到最优的决策树。

  • 决策树创建的过度复杂会导致无法很好的预测训练集之外的数据。这称作过拟合剪枝机制可以避免这种问题。

  • 有些问题决策树没办法很好的解决,例如 异或问题。解决这种问题的时候,决策树会变得过大。 要解决这种问题,只能改变问题的领域或者使用其他更为耗时的学习算法 (例如统计关系学习或者归纳逻辑编程).

  • 对那些有类别型属性的数据, 信息增益会有一定的偏置。

3. 决策树的构造

决策树的构造通常有三个步骤:

  • 特征选择
  • 决策树的生成
  • 决策树的修剪

决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。

这一过程对应着对特征空间的划分,也对应着决策树的构建。

  • 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。
  • 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶子节点去。
  • 如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如此递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。
  • 每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。

4. CART算法

CART算法:Classification And Regression Tree。顾名思义,CART算法既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree)、模型树(Model Tree),两者在建树的过程稍有差异。既可以解决分类问题,也可以解决回归问题。根据某一个维度d和某一个阈值v进行二分,得到的决策树是二叉树。

4.1 用于分类的CART树

算法从根节点开始,用训练集递归建立CART分类树。
INPUT : 训练集D,基尼系数的阈值,样本个数阈值。
OUTPUT: 决策树T。
1. 对于当前节点的数据集为D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归。
2. 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
3. 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数。
4. 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2。
5. 对左右的子节点递归的调用1-4步,生成决策树。

4.2 用于回归的CART树

当数据拥有众多特征并且特征之间关系十分复杂时,构建全局模型的想法就显得太难了,也略显笨拙。而且,实际生活中很多问题都是非线性的,不可能使用全局线性模型来拟合任何数据。一种可行的方法是将数据集切分成很多份易建模的数据,然后利用线性回归技术来建模。如果首次切分后仍然难以拟合线性模型就继续切分。在这种切分方式下,树结构和回归法就相当有用。

回归树的目标是连续数据,树被用来预测目标变量的值是多少。

CART回归树和CART分类树的建立类似,区别在于样本的输出,如果样本输出是离散值,这是分类树;样本输出是连续值,这是回归树。分类树的输出是样本的类别,回归树的输出是一个实数。

对于决策树建立后做预测的方式,CART分类树采用该叶子节点里概率最大的类别作为当前节点的预测类别。回归树输出不是类别,采用叶子节点的均值或者中位数来预测输出结果。

5. sklearn中的决策树

调用代码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split

boston = datasets.load_boston()
X = boston.data
y = boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

from sklearn.tree import DecisionTreeRegressor

dt_reg = DecisionTreeRegressor()
dt_reg.fit(X_train, y_train)

dt_reg.score(X_test, y_test)

猜你喜欢

转载自www.cnblogs.com/DrChuan/p/12048774.html