决策树是强大的,多功能的机器学习算法。

6.1 训练和可视化一个决策树

在iris数据集训练DecisionTreeClassifier:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
X = iris.data[:, 2:] # petal length and width
y = iris.target
tree_clf = DecisionTreeClassifier(max_depth=2)
tree_clf.fit(X, y)

可以将训练好的决策树打印出来:

6.2 预测

从根节点开始,如果满足条件,则转向左子树,否则转向又子树。最终到达的叶子节点即为预测值。

决策树的一个优点是几乎不需要数据预处理,特别是不需要feature scaling或者centering。

基尼系数表示节点的纯洁度。如果gini=0,说明该节点是纯粹的,只包含一种类别。

第$i$个节点的Gini impurity:

$G_i = 1 - \sum_{k=1}^{n} p_{i,k}^2$

其中,$p_{i,k}$是类别$k$的样本数在节点$i$中样本总数所占的比例。

Scikit-Learn使用的是CART算法,产生的是二叉树:非叶子节点只有两个子节点。其它算法比如ID3可以生产具有更多子节点的决策树。

模型解释:白盒 Vs 黑盒:

决策树的可解释性很强,这被称作白盒模型。相应的,随机森林或者神经网络是黑盒模型。

6.3 评估类别概率(Estimating Class Probabilities)

类别的预测概率,就是叶子节点中该类别所占的比例。  

6.4 CART训练算法

Scikit-Learn使用分类回归树(Classification And Regression Tree,CART)算法训练决策树。其思想很简单:使用属性$k$和相应的阈值$t_k$将训练集分为两个子集。搜索合适的$(k, t_k)$使得子集的纯净度最高。损失函数如下:

$J(k,t_k) = \frac{m_{left}}{m}G_{left} + \frac{m_{right}}{m}G_{right}$

其中,$G_{left}$、$G_{right}$是左、右子树的纯净度,$m_{left}$、$m_{right}$是左、右子树的样本数。

将训练集切分之后,会对子集继续切分,这是一个递归过程。如果达到最大深度就会停止(通过max_depth超参数控制),或者已经找不到可以增大纯净度的切分(比如已经完全纯净)。还有一些控制切分停止的超参数:min_samples_split, min_samples_leaf,min_weight_fraction_leaf, and max_leaf_nodes。

这是一个贪心算法,虽不能达到最优,但可以得到一足够优的结果。找到最优树属于NP完全(NP-Complete)问题,需要O(exp(m))时间,这使得即使是很小的训练集也难以求解。

6.5 计算复杂度

决策树预测过程,需要从根节点到达一个叶子节点,决策树一般是近似平衡的,这一过程复杂度为$O(log_2(m))$,与样本数无关。

训练过程需要比较所有的特征,训练复杂度是$(n times m log(m))$。

6.6 基尼系数还是熵(Gini Impurity or Entropy)?

熵:

$H_i = \sum_{k=1}^{n} p_{i,k}\ log(p_{i,k})$

二者差别不大,通常会得到相似的决策树。Gini impurity计算起来更快,所有它是默认的。如果非要说它们的区别,Gini impurity倾向于将最频繁的类别分在同一个分支,entropy倾向于生成更平衡的树。

6.7 正则化超参数(Regularization Hyperparameters)

决策树对训练数据几乎不做假设(与之相反,详细模型明显假设数据是线性的)。如果不进行约束,很容易造成过拟合。这种模型被称作无参数模型(nonparametric model),这并不是真的没有参数(通常有很多参数),而是参数个数不需要在训练之前确定下来,这就有很高的自由度去拟合训练数据。与之相反,比如线性模型这种参数模型,需要提前确定参数个数,所以其自由度是受限的,减少了过拟合的风险(但是增加了欠拟合的风险)。

为避免过拟合,需要在训练时现在决策树的自由度,这被称作正则化。正则化超参数跟算法有关,但一般情况下至少可以限制决策树的最大深度。在Scikit-Learn中这由max_depth超参数控制。

另外还有一些算法,不设限地训练决策树,训练完成后会修剪不必要的节点。如果一个节点的子节点都是叶子节点,对该节点的拆分带来的纯净度提升并不是统计学上有效的(statistically significant),那么其子节点就被认为是不必要的,会被删除掉。

6.7 回归

CART回归损失函数:

$J(k, t_k) = \frac{m_{left}}{m} MSE_{left} + \frac{m_{right}}{m} MSE_{right}$

其中,

$MSE_{node} = \sum_{i \in node}(\hat{y}_{node} - y_{(i)})^2$

$\hat{y}_{node} = \frac{1}{m_{node}}\sum_{i \in node}y^{(i)}$

6.8 不稳定性(Instability)

决策树虽然功能强大,但也有一些局限性。首先,决策树的决策边界都是正交直线(所有的切分都和某一个坐标轴垂直),这使得它们对数据集的旋转很敏感。例如,下图显示了简单的线性可分数据集,在左侧,决策树很容易将其切分。但是在右侧,数据集旋转45°,决策树出现了不必要的绕弯弯。尽管二者都很好地拟合了训练集,很明显右侧的模型难以很好地一般化。一个解决方案是使用PCA,它可以使训练集旋转到最好的方向。

此外,决策树对训练数据集微小的变动也会很敏感。

随机森林通过许多决策树的预测平均值,可以避免这一不稳定性。

第六章——决策树(Decision Trees)的更多相关文章

  1. 海量数据挖掘MMDS week6: 决策树Decision Trees

    http://blog.csdn.net/pipisorry/article/details/49445465 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  2. 决策树(Decision Trees)

    简介 决策树是一个预测模型,通过坐标数据进行多次分割,找出分界线,绘制决策树. 在机器学习中,决策树学习算法就是根据数据,使用计算机算法自动找出决策边界. 每一次分割代表一次决策,多次决策而形成决策树 ...

  3. 【机器学习实战】第3章 决策树(Decision Tree)

    第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...

  4. Decision Trees 决策树

    Decision Trees (DT)是用于分类和回归的非参数监督学习方法. 目标是创建一个模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值. 例如,在下面的例子中,决策树从数据中学习用 ...

  5. Facebook Gradient boosting 梯度提升 separate the positive and negative labeled points using a single line 梯度提升决策树 Gradient Boosted Decision Trees (GBDT)

    https://www.quora.com/Why-do-people-use-gradient-boosted-decision-trees-to-do-feature-transform Why ...

  6. CatBoost使用GPU实现决策树的快速梯度提升CatBoost Enables Fast Gradient Boosting on Decision Trees Using GPUs

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...

  7. 机器学习算法 --- Pruning (decision trees) & Random Forest Algorithm

    一.Table for Content 在之前的文章中我们介绍了Decision Trees Agorithms,然而这个学习算法有一个很大的弊端,就是很容易出现Overfitting,为了解决此问题 ...

  8. Logistic Regression vs Decision Trees vs SVM: Part II

    This is the 2nd part of the series. Read the first part here: Logistic Regression Vs Decision Trees ...

  9. Logistic Regression Vs Decision Trees Vs SVM: Part I

    Classification is one of the major problems that we solve while working on standard business problem ...

随机推荐

  1. 框架页面高度自动刷新Javascript脚本

    实现原理:加载index.htm时候,每隔1秒钟自动调用脚本刷新框架页面代码 代码优点:只需要设置index.html框架页面中的脚本,调用加载的子页面中不需要设置任何代码. index.htm代码如 ...

  2. 【1】mac下面iTerm配置oh-my-zsh教程

    1.安装iterm 地址如下: http://iterm2.com/ 2.安装oh-my-zsh 打开iterm输入如下命令: sh -c "$(curl -fsSL https://raw ...

  3. 【LaTeX排版】LaTeX论文排版<四>

    1.表格的插入     一般的表格插入的代码如下: \begin{table}[H] \centering \begin{tabular}{|c|c|c|} \hline 感知方法&优点&am ...

  4. OpenCV问题集锦,图片显示不出来,WaitKey(0),imread()不能读图片,未经处理的异常,等问题集合

    昨天根据uc伯克利的人工图像分割文件.seg,显示图像的时候调用了OpenCV的库函数,图片都能用imwrite写好,但是imshow死活显示不出来. 今天早上发现原来是imshow()后面应该加上: ...

  5. vs2010修改状态栏的CStatusBar指针的的SetPaneText()方法时死活不对问题

    vs2010的mfc在有些地方不太一样不容易注意到,今天在修改状态栏的时候,就碰见了问题,死活修改不了. 参照下面的帖子: 点击打开链接 : 使用VS2010更改MFC程序的状态栏 2011-04-1 ...

  6. Android的Binder的起源-android学习之旅(100)

    George Hoffman任职1991年Be公司的工程师,他启动了一个"openBinder"的项目,该项目的宗旨是研究一个高效的信号传递工具,允许多个软件相互合作,构成一个软件 ...

  7. MacRuby 0.3发布,支持Interface Builder,和创建GUI用的HotCocoa

    作者 Werner Schuster ,译者 贾晓楠 发布于 2008年9月24日 | 分享到: 微博 微信 QQ空间 LinkedIn Facebook 邮件分享 稍后阅读 我的阅读清单 现在,Ma ...

  8. 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework

    前言 一直以来写的博文都是比较温婉型的博文,今天这篇博文算是一篇批判性博文,有问题欢迎探讨,如标题,你到底会不会用EntityFramework啊. 你到底会不会用EntityFramework啊 面 ...

  9. 第15章-输入/输出 --- File类

    (一) Java的IO通过java.io包下的类和接口来支持,在java.io包下主要包括输入.输出两种IO流. 每种输入.输出流又分为字节流和字符流两大类: (1)字节流以字节为单位来处理输入.输出 ...

  10. Day18 Django的深入使用

    在向某一个数据库中插入表的时候,应该在项目下面的models里边写入: class book(models,Model): #book代指的是表名 id=models.AutoField(primar ...