本文为senlie原创,转载请保留此地址:http://www.cnblogs.com/senlie/

决策树
---------------------------------------------------------------------
1.描述:
以树为基础的方法可以用于回归和分类。
树的节点将要预测的空间划分为一系列简单域
划分预测空间的规则可以被建模为一棵树,所以这种方法也叫决策树方法
bagging,随机森林,boosting 是多棵决策树组合起来采用投票方式产生一个预测结果的方法
机制来产生预测结果

2.如何选特征:
回归树:RMSE(Root Mean Square Error)
分类树:信息增益、基尼系数

3.回归树:
RMSE :
假设一个集合被划分为 M 部分,$c_m$ 表示第 m 部分的值,则预测值为
$$f(x) = \sum_{m = 1}{M}{c_m I(x \in R_m)}$$
$\hat{y}_{m}$是 $R_m 子$集的平均值
$$RMSE = \sum_{j = 1}^J\sum_{i \in R_j}{(y_i - \hat{y}_{R_j})^2}$$
其中 $\hat{y}_{R_j} $是落入 $R_j$的样本的平均值
建树的过程是一种自顶向下的贪心的递归二分划分方法。
自顶向下:从树的根开始不断地将预测空间划分为两个子空间
贪心:每次划分都选择当前最优的方法,而不选择那些可能在将来会导致更好划分的方法
建树的过程:
1).选择最优切分变量 j 与切分点 s。遍历变量 j,对固定的切分变量 j 扫描切分点 s ,
选择使 RMSE 达到最小值的对(j, s)
2).用选定的对(j, s) 切分区域 R1 和 R2 并决定相应的输出值 c1 和 c2
$$R_1(j, s) = \{X | X_j \le s\} , R_2(j, s) = \{X | X_j > s\}$$
$$c_1 = ave(y_i | x_i \in R_1(j, s)) , c_2 = ave(y_i | x_i \in R_2(j, s))$$
3).继续对两个子区域调用步骤1)、2),直到满足停止条件

4.分类树:

4.1信息增益:
X的熵 $H(X) = -p_1\log p_1 - p_2\log p_2 -\cdots - p_n\log p_n = -\sum_{i=1}^n{p_i\log p_i}$
熵表示了信息的不确定性(也即混乱性),熵越大,信息越混乱,越难预测。
比如,
如果变量 X 服从统一分布的,由于 X 的各个值出现的概率一样,很难预测 X 的值,所以 X 的熵很大
如果变量 X 的概率分布图是类似山峰形状的,在某几个点的概率很大,那么预测 X 的值为那几个点中的某一个命中的概率就很大,所以 X 的熵很小
某一具体条件熵-->在 X 的值为 v 的条件下,Y 的信息熵
$$H(Y|X = v)$$
条件熵
$$H(Y|X) = \sum_i{p(X=v_i)H(Y|X=v_i)}$$
信息增益-->如果按照某个特征划分数据,那么信息不确定性能减少多少
$$IG(Y|X) = H(Y) - H(Y|X)$$
选择信息增益最大的特征来划分数据

示例:

解释左图的计算方法,右图类似
-(9/14 * log(9/14) + 5/14 * log(5/14)) = 0.940
-(3/7 * log(3/7) + 4/7 * log(4/7)) = 0.985
-(6/7 * log(6/7) + 1/7 * log(1/7)) = 0.592
I(S|Income) --> 表示数据集合 S 按照 Income 特征划分为子集后信息不确定性减少量
= 0.940 - (7/14)*0.985 - (7/14)*0.592
= 0.151
上面的示例中因为选择特征 Income 来划分集合的信息增益最大,所以应该选择 Income

4.2基尼系数:
假充集合 T 包含 N 个类别,第 j 个类别的概率是 $P_j$,则这个集合的基尼系数为
$$Gini(T) = -\sum_{i=1}^n{p_i\log p_i}$$
按某个特征划分为 m 个子集,第 i 个子集的大小为 $N_i$,则划分后子集的基尼系数为
$$Gini_{split}(T) = \frac{N_1}{N}Gini(T_1) + \cdots + \frac{N_m}{N}$$
选择能使划分后基尼系数最小的特征来划分当前集合

建树的过程:
1).选择一个"最好"的特征A来划分节点
2).对于特征A的每一个值,创建出一个分支来划分样本
3).重复步骤1),2)直到信息增益或基尼系数足够小

5.剪枝
todo

Bagging
------------------------------------------------------------------
算法过程:
1).从训练集中采样得到新的训练集
2).重复步骤1 B次得到B个新的训练集,针对B个不同的训练集分别训练一棵树
3).平均每一棵树的预测值或采用少数服从多数得到分类结果
$$\hat{f}_{bag} = \frac{1}{B} \sum_{b=1}^B \hat{f}^b(x)$$

Out-of-Bag Error Estimation:
可以采用步骤1过程中没有采样到的数据作为对应训练集生成的树的测试集评估训练结果

Random Forests
-------------------------------------------------------------------
算法过程:
1).从训练集中采样得到新的训练集
2).重复步骤1 B次得到B个新的训练集,针对B个不同的训练集分别训练一棵树
3).训练树的过程中,先从所有特征中随机选择 m 个特征作为候选,然后再从
这 m 个特征中选择最优的一个来划分预测空间

比较:
Bagging : m = p
Random Forests : m = $\lfloor{\sqrt{p}}\rfloor$ (分类) , m = $\lfloor{p/3}\rfloor$ (回归)
p 为所有特征数

Boosting
------------------------------------------------------------------
回归问题算法过程:
1).设初值,设预测值 $\hat{f}(x) = 0 $, 对于训练集里的每一个样本,设残差 $r_i = y_i$
2). 对于 b = 1,2,...,B,重复以下步骤:
2.1) 对于训练集(X, r),分裂 d 次生成一棵树 $\hat{f}^b$ --> (注意是训练集(X,r),不是(X,y))
2.2) 用一个收缩系统 $\lambda$ 更新 $\hat{f}$ :$\hat{f} = \hat{f} + \lambda\hat{f}^b(x)$
2.3) 更新残差: $r_i = r_i - \lambda\hat{f}^b(x_i)$
3).输出 boosted 了的模型: $\hat{f}(x)$

调节参数:
1).树的数量 B。如果 B 太大容易 overfitting
2).收缩参数 $\lambda $。这个参数控制 boosting 的学习率
3).每棵树分裂的次数 d。 这个参数控制 boosted 集成模型的复杂度。一般 d 选择 1,即生成的决策树是树桩

分类问题算法过程:

1).W(x) 是 N 个训练样本的权重分布。 $\sum{W(x_i)} = 1$
2).初始化。对于所有样本 x ,设置其权重 W(x) 为 1/N
3).在每一次迭代 k :
3.1) 用权重 $W_k(x)$ 生成最优的弱分类器 $C_k(x)$
3.2) 计算错误率
$\epsilon_k$  
3.3) 计算分类器的权重
$\alpha_k$ 
3.4) 更新样本权重
$W_{k+1}(x_i)$ 
4).最终的分类器 : $C_{Final}(x) = sign(\sum{a_i C_i(x)})$
示例:

比较:
Bagging: 树"并行"生成
Boosting:树"串行"生成

GBDT
-----------------------------------------------------------------
boosting 是一种算法思路,它的基函数可以采用各种分类器、预测器。其中采用
决策树为基函数的 boosting 就叫 GBDT,即 Gradient Boosting Decision Tree。

使用 MPI 并行化随机森林算法
-----------------------------------------------------------------

算法过程:
输入:训练数据集 D ,建树数目 N ,进程数目 n
输出:N 棵决策树 *T
1).分配要生成 N/n 棵决策树的任务给每个进程,如果该进程为最后一个进行,则它要生产的
决策树的数目为 N/n * (1 - n) + N;
2).对于每个进程,使用随机森林算法生成 N/n (或N/n * (1 - n) + N)棵树组成的森林
3).当生成完随机森林,若该进程为从进程则发送已经生成好了的随机森林参数给主进程;若该进程
为主进程则接收其他进程传过来的随机森林参数,并合并要一个决策树数组 T
4).主进程将 N 棵决策树组成的随机森林模型参数存储起来。

Q&A:
??随机森林算法和 Adaboost 哪个比较容易过拟合
随机森林算法比较容易过拟合。
1.随机森林的决策树尝试拟合数据集,有潜在的过拟合问题,
而 boosting 的决策树则是拟合数据集的残差,然后更新残差,由新的决策树
再去拟合新的残差。这虽然学得慢,但大大地降低了过拟合的风险
2.boosting 的每棵决策树通常都很小,一般分裂次数只有 1,生成的决策树一般是树桩
3.通过收缩参数,可以放慢拟合的速度,允许更多不同的树来拟合残差。不同的树带来的是多样性,
也降低了过拟合的风险

参考:


------------------------------------------------------------------

机器学习 —— 决策树及其集成算法(Bagging、随机森林、Boosting)的更多相关文章

  1. 机器学习之——集成算法,随机森林,Bootsing,Adaboost,Staking,GBDT,XGboost

    集成学习 集成算法 随机森林(前身是bagging或者随机抽样)(并行算法) 提升算法(Boosting算法) GBDT(迭代决策树) (串行算法) Adaboost (串行算法) Stacking ...

  2. 【机器学习实战】第7章 集成方法(随机森林和 AdaBoost)

    第7章 集成方法 ensemble method 集成方法: ensemble method(元算法: meta algorithm) 概述 概念:是对其他算法进行组合的一种形式. 通俗来说: 当做重 ...

  3. bagging与boosting集成学习、随机森林

    主要内容: 一.bagging.boosting集成学习 二.随机森林 一.bagging.boosting集成学习 1.bagging: 从原始样本集中独立地进行k轮抽取,生成训练集.每轮从原始样本 ...

  4. 机器学习入门-集成算法(bagging, boosting, stacking)

    目的:为了让训练效果更好 bagging:是一种并行的算法,训练多个分类器,取最终结果的平均值 f(x) = 1/M∑fm(x) boosting: 是一种串行的算法,根据前一次的结果,进行加权来提高 ...

  5. 大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2)

              大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out  of  bag  data及代码(2) 上一节中我们讲解了随机森林的基本概念,本节的话我们讲解随机森 ...

  6. R语言分类算法之随机森林

    R语言分类算法之随机森林 1.原理分析: 随机森林是通过自助法(boot-strap)重采样技术,从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练集样本集合,然后根据自助样本集生成k个决策 ...

  7. 决策树与树集成模型(bootstrap, 决策树(信息熵,信息增益, 信息增益率, 基尼系数),回归树, Bagging, 随机森林, Boosting, Adaboost, GBDT, XGboost)

    1.bootstrap   在原始数据的范围内作有放回的再抽样M个, 样本容量仍为n,原始数据中每个观察单位每次被抽到的概率相等, 为1/n , 所得样本称为Bootstrap样本.于是可得到参数θ的 ...

  8. 一小部分机器学习算法小结: 优化算法、逻辑回归、支持向量机、决策树、集成算法、Word2Vec等

    优化算法 先导知识:泰勒公式 \[ f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n \] 一阶泰勒展开: \[ f(x)\approx ...

  9. Spark2.0机器学习系列之6:GBDT(梯度提升决策树)、GBDT与随机森林差异、参数调试及Scikit代码分析

    概念梳理 GBDT的别称 GBDT(Gradient Boost Decision Tree),梯度提升决策树.     GBDT这个算法还有一些其他的名字,比如说MART(Multiple Addi ...

随机推荐

  1. VHD_Update_diskpart

    ###################功能说明########################该脚本用来对离线VHD文件更新,导入系统补丁############################### ...

  2. NEUOJ 1117: Ready to declare(单调队列)

    1117: Ready to declare 时间限制: 1 Sec  内存限制: 128 MB 提交: 358  解决: 41 [提交][状态][pid=1117" style=" ...

  3. 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现

    相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人 ...

  4. PHP实现Web Service(转)

    1.OAuth OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码)  2.SCA 服务组件 ...

  5. Ruby on Rails Tutorial 第三章 静态页面

    1.生成静态页面 $ rails generate controller StaticPages home help    #生成主页和帮助页面的路由.控制器及静态页面 $ rails destroy ...

  6. 网络IPC:套接字之套接字选项

    套接字机制提供两个套接字选项接口来控制套接字的行为.一个接口用来设置选项,另一个接口允许查询一个选项的状态.可以获取或设置的三种选项: (1)通用选项,工作在所有套接字类型上. (2)在套接字层次管理 ...

  7. 高级I/O之STREAMS

    http://en.wikipedia.org/wiki/STREAMS STREAMS(流)是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法,对STREAMS进行讨论的目的是为了理解系统 ...

  8. 服务器控件HyperLink的NavigateUrl绑定传参问题

    <asp:HyperLink ID="HyperLink1" NavigateUrl='<%# Eval("ProjectID","Mar ...

  9. C#综合揭秘——Entity Framework 并发处理详解

    引言 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都 ...

  10. assets

    我们知道assets/和res/文件夹用于存放可在应用程序中的使用文件. assets/用于存储各种应用程序中需要的文件(例如配置文件或音频文件等),这些文件会打包在Android应用程序中. res ...