第六章——决策树(Decision Trees)
决策树是强大的,多功能的机器学习算法。
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)的更多相关文章
- 海量数据挖掘MMDS week6: 决策树Decision Trees
http://blog.csdn.net/pipisorry/article/details/49445465 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 决策树(Decision Trees)
简介 决策树是一个预测模型,通过坐标数据进行多次分割,找出分界线,绘制决策树. 在机器学习中,决策树学习算法就是根据数据,使用计算机算法自动找出决策边界. 每一次分割代表一次决策,多次决策而形成决策树 ...
- 【机器学习实战】第3章 决策树(Decision Tree)
第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...
- Decision Trees 决策树
Decision Trees (DT)是用于分类和回归的非参数监督学习方法. 目标是创建一个模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值. 例如,在下面的例子中,决策树从数据中学习用 ...
- 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 ...
- CatBoost使用GPU实现决策树的快速梯度提升CatBoost Enables Fast Gradient Boosting on Decision Trees Using GPUs
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...
- 机器学习算法 --- Pruning (decision trees) & Random Forest Algorithm
一.Table for Content 在之前的文章中我们介绍了Decision Trees Agorithms,然而这个学习算法有一个很大的弊端,就是很容易出现Overfitting,为了解决此问题 ...
- 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 ...
- 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 ...
随机推荐
- 框架页面高度自动刷新Javascript脚本
实现原理:加载index.htm时候,每隔1秒钟自动调用脚本刷新框架页面代码 代码优点:只需要设置index.html框架页面中的脚本,调用加载的子页面中不需要设置任何代码. index.htm代码如 ...
- 【1】mac下面iTerm配置oh-my-zsh教程
1.安装iterm 地址如下: http://iterm2.com/ 2.安装oh-my-zsh 打开iterm输入如下命令: sh -c "$(curl -fsSL https://raw ...
- 【LaTeX排版】LaTeX论文排版<四>
1.表格的插入 一般的表格插入的代码如下: \begin{table}[H] \centering \begin{tabular}{|c|c|c|} \hline 感知方法&优点&am ...
- OpenCV问题集锦,图片显示不出来,WaitKey(0),imread()不能读图片,未经处理的异常,等问题集合
昨天根据uc伯克利的人工图像分割文件.seg,显示图像的时候调用了OpenCV的库函数,图片都能用imwrite写好,但是imshow死活显示不出来. 今天早上发现原来是imshow()后面应该加上: ...
- vs2010修改状态栏的CStatusBar指针的的SetPaneText()方法时死活不对问题
vs2010的mfc在有些地方不太一样不容易注意到,今天在修改状态栏的时候,就碰见了问题,死活修改不了. 参照下面的帖子: 点击打开链接 : 使用VS2010更改MFC程序的状态栏 2011-04-1 ...
- Android的Binder的起源-android学习之旅(100)
George Hoffman任职1991年Be公司的工程师,他启动了一个"openBinder"的项目,该项目的宗旨是研究一个高效的信号传递工具,允许多个软件相互合作,构成一个软件 ...
- MacRuby 0.3发布,支持Interface Builder,和创建GUI用的HotCocoa
作者 Werner Schuster ,译者 贾晓楠 发布于 2008年9月24日 | 分享到: 微博 微信 QQ空间 LinkedIn Facebook 邮件分享 稍后阅读 我的阅读清单 现在,Ma ...
- 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
前言 一直以来写的博文都是比较温婉型的博文,今天这篇博文算是一篇批判性博文,有问题欢迎探讨,如标题,你到底会不会用EntityFramework啊. 你到底会不会用EntityFramework啊 面 ...
- 第15章-输入/输出 --- File类
(一) Java的IO通过java.io包下的类和接口来支持,在java.io包下主要包括输入.输出两种IO流. 每种输入.输出流又分为字节流和字符流两大类: (1)字节流以字节为单位来处理输入.输出 ...
- Day18 Django的深入使用
在向某一个数据库中插入表的时候,应该在项目下面的models里边写入: class book(models,Model): #book代指的是表名 id=models.AutoField(primar ...