决策树、贝叶斯统计、集成学习Bagging、Boosting、Stacking介绍

决策树

决策树是一种分类与回归的方法。
在这里插入图片描述

特征选择

关键:如何选择最优划分属性

信息增益

度量样本集合纯度最常用的一种指标
在这里插入图片描述
在这里插入图片描述
信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,使用"增益率" (gain ratio) 来选择最优划分属性

信息增益率:(C4.5算法)

在这里插入图片描述
增益率准则对可取值数目较少的属性有所偏好,因此 , C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的

基尼系数(CART):

在这里插入图片描述
数据集 D 中随机抽取两个样本,其类别标记不一致的概率.因此, Gini(D) 越小,则数据集 D 的纯度越高.

classification and regression tree由Breiman等人在1984年提出,可以用于分类也可以用于回归。

思想:在这里插入图片描述
算法步骤:

在这里插入图片描述
CART生成
在这里插入图片描述
在这里插入图片描述

算法
在这里插入图片描述

过拟合

减枝处理

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

预剪枝
在决策树生成过程中,低每个节点划分前进行估计,若当前节点划分不能带来决策树泛化性能提升,则停止划分,当前节点标记为叶节点

后剪枝
从训练集生成一颗完整决策树后,自底向上对非叶节点记性考察,若将对应的子树替换为叶节点能带来泛化性能提升,则替换

贝叶斯统计

条件风险:
在这里插入图片描述

寻找准则最小化条件风险:
在这里插入图片描述
h*被称为贝叶斯最优分类器

得到后验概率,两种策略,建模得到判别式模型,生成型模型

参数估计:
最大似然估计:

朴素贝叶斯分类器:
假设条件独立
在这里插入图片描述

集成学习

结合多个学习器,每个学习器要有差异和多样性
两类集成学习:

  • Boosting:个体学习器问存在强依赖关系、必须串行生成的序列化方法
  • Bagging和随机森林:个体学习器间不存在强依赖关系、可同时生成的并行化方法,假设及分类器错误率互相独立

Boosting(降低偏差)

先用初始训练集训练出一个基学习器,再根据表现对训练样本进行调整,让分类错误的训练样本受到更多关注,基于调整后的样本分布训练下一个基学习器,重复知道基学习器数据达到实现指定值,最后将这些学习器进行加权集合

提升方法

提升方法基本思路

在这里插入图片描述
提升方法就是从弱学习算法触发,反复学习的到一系列基本分类器,组合这些弱分类器,构成强分类器。大多数的提升方法都是改变训练数据的概率分布,针对不同的训练分布调用弱学习算法学习一系列弱分类器。

对于提升方法来说,需要解决两个问题:

  1. 每一轮如何改变训练数据的权值或概率分布
  2. 如何将弱分类组合成一个强分类器

梯度提升算法AdaBoost

1995年由Freund和Schapire提出,解决上面两个问题,AdaBoost做法是
1.提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值
2.采用加权多数表决法。加大分类误差率小的弱分类器权值,减小分类误差率大的弱分类器权值

对于分类,算法步骤如下:

在这里插入图片描述
在这里插入图片描述

例子

在这里插入图片描述
在这里插入图片描述

算法训练误差分析

AdaBoost最基本的性质是能在学习过程中不断减少训练误差(分类误差率),使用定理如下:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

解释

也可认为AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分布算法时的二类分类学习算法

提升树 boosting tree

2000年由Friedman等人提出,提升树是以分类树或回归树为基本分类器的提升方法,被认为是统计学习中性能最好的方法之一

提升树模型

在这里插入图片描述

提升树算法

在这里插入图片描述
二分类问题
在这里插入图片描述
回归问题
在这里插入图片描述

回归问题提升树算法

在这里插入图片描述

梯度提升Gradient boosting算法

参考:机器学习大杀器——梯度提升树GBDT
Gradient Boosting Decision Tree,梯度提升决策树

GBDT是一种集成模型(一种基于boosting增强策略的加法模型,训练的时候采用前向贪心算法进行学习),采用的基础模型是CART回归树.,针对残差进行拟合,进而降低模型的偏差和方差。

在这里插入图片描述

CART回归树简介

在这里插入图片描述

GBDT简介

在这里插入图片描述

Bagging (降低方差)

基于自助采样法,给定m个训练样本的采样集,随机取出样本放入采样集中,再放回初始数据集,经过m次操作得到采样集,基于每个采样集训练出一个模型,让所有模型表决测试样例的输出。

随机森林

参考:https://cloud.tencent.com/developer/article/1080189
Bagging扩展,传统决策树选择划分属性是选择最优属性,而随机森林是从该节点的属性中随机选择一个包含k个属性的子集,在从这个子集中选择一个最优属性进行划分.随机性导致随机森林的偏差会有稍微的增加(相比于单棵不随机树),但是由于随机森林的‘平均’特性,会使得它的方差减小,而且方差的减小补偿了偏差的增大,因此总体而言是更好的模型。

概括RF包括四个部分:1、随机选择样本(放回抽样);2、随机选择特征;3、构建决策树;4、随机森林投票(平均)。

在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF通常对分类问题使用简单投票法,回归任务使用简单平均法。

RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计,它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。

优缺点

优点简单总结:
1、在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);
2、能够处理很高维的数据,并且不用特征选择,而且在训练完后,给出特征的重要性;
3、容易做成并行化方法。

缺点:在噪声较大的分类或者回归问题上回过拟合。

随机森林与Bagging对比

RF的起始性能较差,特别当只有一个基学习器时,随着学习器数目增多,随机森林通常会收敛到更低的泛化误差。随机森林的训练效率也会高于Bagging,因为在单个决策树的构建中,Bagging使用的是‘确定性’决策树,在选择特征划分结点时,要对所有的特征进行考虑,而随机森林使用的是‘随机性’特征数,只需考虑特征的子集。

随机森林与GBDT异同

在这里插入图片描述

ExtraTree

参考:随机森林(randomForest)和极限树或者叫做极端随机树(extraTree)
Extremely randomized trees,极端随机树.

与随机森林区别

在这里插入图片描述

与随机森林算法十分相似,都是由许多决策树构成。极限树与随机森林的主要区别:

  • randomForest应用的是Bagging模型,extraTree使用的所有的样本,只是特征是随机选取的,因为分裂是随机的,所以在某种程度上比随机森林得到的结果更加好
  • 随机森林是在一个随机子集内得到最佳分叉属性,而ET是完全随机的得到分叉值,从而实现对决策树进行分叉的。
    当特征属性是类别的形式时,随机选择具有某些类别的样本为左分支,而把具有其他类别的样本作为右分支;当特征属性是数值的形式时,随机选择一个处于该特征属性的最大值和最小值之间的任意数,当样本的该特征属性值大于该值时,作为左分支,当小于该值时,作为右分支。这样就实现了在该特征属性下把样本随机分配到两个分支上的目的。然后计算此时的分叉值(如果特征属性是类别的形式,可以应用基尼指数;如果特征属性是数值的形式,可以应用均方误差)。遍历节点内的所有特征属性,按上述方法得到所有特征属性的分叉值,我们选择分叉值最大的那种形式实现对该节点的分叉。从上面的介绍可以看出,这种方法比随机森林的随机性更强。

对于某棵决策树,由于它的最佳分叉属性是随机选择的,因此用它的预测结果往往是不准确的,但多棵决策树组合在一起,就可以达到很好的预测效果。

当ET构建好了以后,我们也可以应用全部的训练样本来得到该ET的预测误差。这是因为尽管构建决策树和预测应用的是同一个训练样本集,但由于最佳分叉属性是随机选择的,所以我们仍然会得到完全不同的预测结果,用该预测结果就可以与样本的真实响应值比较,从而得到预测误差。如果与随机森林相类比的话,在ET中,全部训练样本都是OOB样本,所以计算ET的预测误差,也就是计算这个OOB误差。

sklearn实现

参考:官网
此类实现一种元估计器,该估计器可将多个随机决策树(又名极端随机树)拟合到数据集的各个子样本上,并使用平均来提高预测准确性和控制过度拟合。

参数
class sklearn.ensemble.ExtraTreesRegressor(
n_estimators=100,#森林中树木的数量
*, 
criterion='mse',#{“mse”, “mae”}, default=”mse”该函数用来测量分割的质量。支持的准则为均方误差的“mse”,等于方差减少作为特征选择准则,支持的准则为平均绝对误差的“mae”。
max_depth=None, #树的最大深度。如果为None,则将节点展开,直到所有叶子都是纯净的,或者直到所有叶子都包含少于min_samples_split个样本。
min_samples_split=2,#拆分内部节点所需的最少样本数:如果为int,则认为min_samples_split是最小值。如果为float,min_samples_split则为分数, 是每个拆分的最小样本数。
ceil(min_samples_split * n_samples)
min_samples_leaf=1,#在叶节点处需要的最小样本数。仅在任何深度的分裂点在min_samples_leaf左分支和右分支中的每个分支上至少留下训练样本时才会被考虑。同时,这种情况可能具有平滑模型的效果,尤其是在回归中。如果为int,则认为min_samples_leaf是最小值。如果为float,min_samples_leaf则为分数, 是每个节点的最小样本数。
ceil(min_samples_leaf * n_samples)
min_weight_fraction_leaf=0.0, #一个叶节点上所需的(所有输入样本的)总权重的最小加权分数。如果未提供sample_weight,则样本的权重相等。
max_features='auto', 
max_leaf_nodes=None, #max_leaf_nodes以最好的方式进行“种树”。杂质的相对减少的节点被当作最佳节点。如果为None,则叶节点数不受限制。
min_impurity_decrease=0.0, #如果节点分裂会导致杂质的减少大于或等于该值,则该节点将被分裂。
min_impurity_split=None, #树提升提前停止的阈值。如果节点的杂质高于阈值,则该节点将分裂,否则为叶。
bootstrap=False, #创建树时是否使用引导程序样本。如果为False,则将整个数据集用于构建每棵树。
oob_score=False, #是否使用袋外样本估计泛化精度。
n_jobs=None, #要并行运行的作业的数量。fit, predict, decision_path 和 apply都在树中并行化。除非在一个joblib.parallel_backend的内容中,否则None在joblib中的表示是1。-1表示使用所有处理器。
random_state=None, 
verbose=0, #在拟合和预测时控制冗余程度。
warm_start=False, #当设置为True时,重用前面调用的解决方案来适应并向集成添加更多的评估器,否则,只会拟合完整的新森林。
ccp_alpha=0.0, #复杂度参数用于最小代价复杂度剪枝。将选择代价复杂度最大且小于ccp_alpha的子树。默认情况下,不执行修剪。
max_samples=None
)

参数介绍:
max_features {“auto”, “sqrt”, “log2”}, int or float, default=”auto”
寻找最佳分割时要考虑的功能数量:

  • 如果为int,则max_features在每个分割处考虑特征。
  • 如果为float,max_features则为小数,并 在每次拆分时考虑要素。
  • 如果为auto,则为max_features=sqrt(n_features)。
  • 如果是sqrt,则max_features=sqrt(n_features)。
  • 如果为log2,则为max_features=log2(n_features)。
  • 如果为None,则max_features=n_features。
    注意:直到找到至少一个有效的节点样本分区,分割的搜索才会停止,即使它需要有效检查多于max_features个数的要素也是如此。

random_state int, RandomState, default=None
控制3个随机性来源:

  • 构建树木时使用的示例的引导程序(如果bootstrap=True)
  • 在每个节点上寻找最佳分割时要考虑的特征采样(如果max_features < n_features)
  • 绘制每个max_features的分割

max_samples int or float, default=None
如果bootstrap为真,则需要从X中抽取样本来训练每个基估计量。

  • 如果为None(默认),则绘制X.shape[0]样本。
  • 如果为int,则绘制 max_samples 样本。
  • 如果为float, 则绘制 max_samples * X.shape[0]样本。因此,max_samples应该在区间(0,1)内。
实践
>>> from sklearn.datasets import load_diabetes
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.ensemble import ExtraTreesRegressor
>>> X, y = load_diabetes(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, random_state=0)
>>> reg = ExtraTreesRegressor(n_estimators=100, random_state=0).fit(
...    X_train, y_train)
>>> reg.score(X_test, y_test)

Stacking模型

Stacking模型比bagging模型更进2步:
(a)允许使用不同类型的模型作为base model;
(b)使用一个机器学习模型把所有base model的输出汇总起来,形成最终的输出。

所述的模型被称为“元模型”。在训练的时候,base model们直接基于训练数据独立训练,而元模型会以它们的输出为输入数据、以训练数据的输出为输出数据进行训练。Stacking模型认为,各个基础模型的能力不一,投票的时候不能给以相同的权重,而需要用一个“元模型”对各个基础模型的预测值进行加权。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值