在Wikipedia的决策树词条中,有如下概念:
统计学,数据挖掘和机器学习中的决策树训练,使用决策树作为预测模型来预测样本的类标。这种决策树也称作分类树或回归树。在这些树的结构里, 叶子节点给出类标而内部节点代表某个属性。在数据挖掘中决策树训练是一个常用的方法。目标是创建一个模型来预测样本的目标值。
我们前面已经介绍过分类和回归这两个机器学习中的基本概念。而分类树和回归树,即分别是解决这两种问题的重要算法之一。
那么,什么是决策树?
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
总结来说,决策树模型核心是下面几部分:
- 结点和有向边组成
- 结点有内部结点和叶结点俩种类型
- 内部结点表示一个特征,叶节点表示一个类
(以上摘自 https://zhuanlan.zhihu.com/p/26703300 )
也就是说,我们通过从一棵决策树的根结点出发,根据情况逐级向下遍历,直到叶子结点,即得到了所需要的分类或回归结果。
这个过程模拟了人的决策过程,即逐个因素串行考虑,符合人类的思维模式,因而其原理相比于其他机器学习算法更容易理解。
对于任何一种数据结构和算法,我们都有必要明确其优点和缺点所在,从而在合适的场合下选用。
可以通过测试集来验证模型的性能 。可以考虑模型的稳定性。
强健控制,对噪声处理有好的强健性。
可以很好的处理大规模数据。
训练一棵最优的决策树是一个NP完全问题。因此, 实际应用时决策树的训练采用启发式搜索算法例如贪心算法来达到局部最优。这样的算法没办法得到最优的决策树。
决策树创建的过度复杂会导致无法很好的预测训练集之外的数据。这称作过拟合。剪枝机制可以避免这种问题。
有些问题决策树没办法很好的解决,例如 异或问题。解决这种问题的时候,决策树会变得过大。 要解决这种问题,只能改变问题的领域或者使用其他更为耗时的学习算法 (例如统计关系学习或者归纳逻辑编程).
对那些有类别型属性的数据, 信息增益会有一定的偏置。
决策树的构造通常有三个步骤:
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
这一过程对应着对特征空间的划分,也对应着决策树的构建。
CART算法:Classification And Regression Tree。顾名思义,CART算法既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree)、模型树(Model Tree),两者在建树的过程稍有差异。既可以解决分类问题,也可以解决回归问题。根据某一个维度d和某一个阈值v进行二分,得到的决策树是二叉树。
算法从根节点开始,用训练集递归建立CART分类树。
INPUT : 训练集D,基尼系数的阈值,样本个数阈值。
OUTPUT: 决策树T。
1. 对于当前节点的数据集为D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归。
2. 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
3. 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数。
4. 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2。
5. 对左右的子节点递归的调用1-4步,生成决策树。
当数据拥有众多特征并且特征之间关系十分复杂时,构建全局模型的想法就显得太难了,也略显笨拙。而且,实际生活中很多问题都是非线性的,不可能使用全局线性模型来拟合任何数据。一种可行的方法是将数据集切分成很多份易建模的数据,然后利用线性回归技术来建模。如果首次切分后仍然难以拟合线性模型就继续切分。在这种切分方式下,树结构和回归法就相当有用。
回归树的目标是连续数据,树被用来预测目标变量的值是多少。
CART回归树和CART分类树的建立类似,区别在于样本的输出,如果样本输出是离散值,这是分类树;样本输出是连续值,这是回归树。分类树的输出是样本的类别,回归树的输出是一个实数。
对于决策树建立后做预测的方式,CART分类树采用该叶子节点里概率最大的类别作为当前节点的预测类别。回归树输出不是类别,采用叶子节点的均值或者中位数来预测输出结果。
调用代码如下:
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)
原文:https://www.cnblogs.com/DrChuan/p/12048774.html