0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

随机贴片与随机子空间

lviY_AI_shequ 来源:未知 作者:李倩 2018-07-20 16:14 次阅读

随机贴片与随机子空间

BaggingClassifier也支持采样特征。它被两个超参数max_features和bootstrap_features控制。他们的工作方式和max_samples和bootstrap一样,但这是对于特征采样而不是实例采样。因此,每一个分类器都会被在随机的输入特征内进行训练。

当你在处理高维度输入下(例如图片)此方法尤其有效。对训练实例和特征的采样被叫做随机贴片。保留了所有的训练实例(例如bootstrap=False和max_samples=1.0),但是对特征采样(bootstrap_features=True并且/或者max_features小于 1.0)叫做随机子空间。

采样特征导致更多的预测多样性,用高偏差换低方差。

随机森林

正如我们所讨论的,随机森林是决策树的一种集成,通常是通过 bagging 方法(有时是 pasting 方法)进行训练,通常用max_samples设置为训练集的大小。与建立一个BaggingClassifier然后把它放入DecisionTreeClassifier相反,你可以使用更方便的也是对决策树优化够的RandomForestClassifier(对于回归是RandomForestRegressor)。接下来的代码训练了带有 500 个树(每个被限制为 16 叶子结点)的决策森林,使用所有空闲的 CPU 核:

>>>from sklearn.ensemble import RandomForestClassifier>>>rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1) >>>rnd_clf.fit(X_train, y_train)>>>y_pred_rf = rnd_clf.predict(X_test)

除了一些例外,RandomForestClassifier使用DecisionTreeClassifier的所有超参数(决定数怎么生长),把BaggingClassifier的超参数加起来来控制集成本身。

随机森林算法在树生长时引入了额外的随机;与在节点分裂时需要找到最好分裂特征相反(详见第六章),它在一个随机的特征集中找最好的特征。它导致了树的差异性,并且再一次用高偏差换低方差,总的来说是一个更好的模型。以下是BaggingClassifier大致相当于之前的randomforestclassifier:

>>>bag_clf = BaggingClassifier(DecisionTreeClassifier(splitter="random", max_leaf_nodes=16),n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1)

极端随机树

当你在随机森林上生长树时,在每个结点分裂时只考虑随机特征集上的特征(正如之前讨论过的一样)。相比于找到更好的特征我们可以通过使用对特征使用随机阈值使树更加随机(像规则决策树一样)。

这种极端随机的树被简称为Extremely Randomized Trees(极端随机树),或者更简单的称为Extra-Tree。再一次用高偏差换低方差。它还使得Extra-Tree比规则的随机森林更快地训练,因为在每个节点上找到每个特征的最佳阈值是生长树最耗时的任务之一。

你可以使用 sklearn 的ExtraTreesClassifier来创建一个Extra-Tree分类器。他的 API 跟RandomForestClassifier是相同的,相似的,ExtraTreesRegressor跟RandomForestRegressor也是相同的 API。

我们很难去分辨ExtraTreesClassifier和RandomForestClassifier到底哪个更好。通常情况下是通过交叉验证来比较它们(使用网格搜索调整超参数)。

特征重要度

最后,如果你观察一个单一决策树,重要的特征会出现在更靠近根部的位置,而不重要的特征会经常出现在靠近叶子的位置。因此我们可以通过计算一个特征在森林的全部树中出现的平均深度来预测特征的重要性。sklearn 在训练后会自动计算每个特征的重要度。你可以通过feature_importances_变量来查看结果。例如如下代码在 iris 数据集(第四章介绍)上训练了一个RandomForestClassifier模型,然后输出了每个特征的重要性。看来,最重要的特征是花瓣长度(44%)和宽度(42%),而萼片长度和宽度相对比较是不重要的(分别为 11% 和 2%):

>>> from sklearn.datasets import load_iris >>> iris = load_iris() >>> rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1) >>> rnd_clf.fit(iris["data"], iris["target"]) >>> for name, score in zip(iris["feature_names"], rnd_clf.feature_importances_): >>> print(name, score) sepal length (cm) 0.112492250999sepal width (cm) 0.0231192882825 petal length (cm) 0.441030464364 petal width (cm) 0.423357996355

相似的,如果你在 MNIST 数据及上训练随机森林分类器(在第三章上介绍),然后画出每个像素的重要性,你可以得到图 7-6 的图片。

随机森林可以非常方便快速得了解哪些特征实际上是重要的,特别是你需要进行特征选择的时候。

提升

提升(Boosting,最初称为假设增强)指的是可以将几个弱学习者组合成强学习者的集成方法。对于大多数的提升方法的思想就是按顺序去训练分类器,每一个都要尝试修正前面的分类。现如今已经有很多的提升方法了,但最著名的就是Adaboost(适应性提升,是Adaptive Boosting的简称) 和Gradient Boosting(梯度提升)。让我们先从Adaboost说起。

Adaboost

使一个新的分类器去修正之前分类结果的方法就是对之前分类结果不对的训练实例多加关注。这导致新的预测因子越来越多地聚焦于这种情况。这是Adaboost使用的技术。

举个例子,去构建一个 Adaboost 分类器,第一个基分类器(例如一个决策树)被训练然后在训练集上做预测,在误分类训练实例上的权重就增加了。第二个分类机使用更新过的权重然后再一次训练,权重更新,以此类推(详见图 7-7)

图 7-8 显示连续五次预测的 moons 数据集的决策边界(在本例中,每一个分类器都是高度正则化带有 RBF 核的 SVM)。第一个分类器误分类了很多实例,所以它们的权重被提升了。第二个分类器因此对这些误分类的实例分类效果更好,以此类推。右边的图代表了除了学习率减半外(误分类实例权重每次迭代上升一半)相同的预测序列。你可以看出,序列学习技术与梯度下降很相似,除了调整单个预测因子的参数以最小化代价函数之外,AdaBoost 增加了集合的预测器,逐渐使其更好。

一旦所有的分类器都被训练后,除了分类器根据整个训练集上的准确率被赋予的权重外,集成预测就非常像Bagging和Pasting了。

序列学习技术的一个重要的缺点就是:它不能被并行化(只能按步骤),因为每个分类器只能在之前的分类器已经被训练和评价后再进行训练。因此,它不像Bagging和Pasting一样。

让我们详细看一下 Adaboost 算法。每一个实例的权重wi初始都被设为1/m第一个分类器被训练,然后他的权重误差率r1在训练集上算出,详见公式 7-1。

公式7-1:第j个分类器的权重误差率

其中是第j个分类器对于第i实例的预测。

分类器的权重j 随后用公式 7-2 计算出来。其中η是超参数学习率(默认为 1)。

分类器准确率越高,它的权重就越高。如果它只是瞎猜,那么它的权重会趋近于 0。然而,如果它总是出错(比瞎猜的几率都低),它的权重会使负数。

公式 7-2:分类器权重

接下来实例的权重会按照公式 7-3 更新:误分类的实例权重会被提升。

公式7-3 权重更新规则

对于i=1, 2, ..., m

随后所有实例的权重都被归一化(例如被整除)

最后,一个新的分类器通过更新过的权重训练,整个过程被重复(新的分类器权重被计算,实例的权重被更新,随后另一个分类器被训练,以此类推)。当规定的分类器数量达到或者最好的分类器被找到后算法就会停止。

为了进行预测,Adaboost 通过分类器权重j 简单的计算了所有的分类器和权重。预测类别会是权重投票中主要的类别。(详见公式 7-4)

公式7-4: Adaboost 分类器

其中N是分类器的数量。

sklearn 通常使用 Adaboost 的多分类版本SAMME(这就代表了分段加建模使用多类指数损失函数)。如果只有两类别,那么SAMME是与 Adaboost 相同的。如果分类器可以预测类别概率(例如如果它们有predict_proba()),如果 sklearn 可以使用SAMME叫做SAMME.R的变量(R 代表“REAL”),这种依赖于类别概率的通常比依赖于分类器的更好。

接下来的代码训练了使用 sklearn 的AdaBoostClassifier基于 200 个决策树桩 Adaboost 分类器(正如你说期待的,对于回归也有AdaBoostRegressor)。一个决策树桩是max_depth=1的决策树-换句话说,是一个单一的决策节点加上两个叶子结点。这就是AdaBoostClassifier的默认基分类器:

>>>from sklearn.ensemble import AdaBoostClassifier>>>ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200,algorithm="SAMME.R", learning_rate=0.5) >>>ada_clf.fit(X_train, y_train)

如果你的 Adaboost 集成过拟合了训练集,你可以尝试减少基分类器的数量或者对基分类器使用更强的正则化。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 分类器
    +关注

    关注

    0

    文章

    152

    浏览量

    13110
  • 数据集
    +关注

    关注

    4

    文章

    1177

    浏览量

    24347
  • 决策树
    +关注

    关注

    2

    文章

    95

    浏览量

    13345

原文标题:【翻译】Sklearn 与 TensorFlow 机器学习实用指南 —— 第7章 集成学习和随机森林 (中)

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    随机信号分析

    随机信号分析2.1  随机过程的基本概念2.2  平稳随机过程2.4  高斯过程2.5  窄带随机过程2.6 
    发表于 10-23 11:25

    基于单片机随机分配车位的随机函数

    有十六个空车位,定义一个随机函数,随机分配车位,若车位有车的话,随机函数不分配,定义四个单片机I/O口,分别为p1.0 p1.1 p1.2 p1.3代表十六个空车位(0000~1111),这个
    发表于 05-07 13:36

    基于while的随机数的随机曲线

    我想创建一个基于while的随机数的随机曲线——
    发表于 05-05 19:37

    什么是随机

    做开发的工程师们应该或多或少都接触过随机数,可能认为它就是一个随机生成的数字嘛,使用时也很简单,只要调用开发语言提供的函数即可。但实际上随机数后面还是有着比较复杂但也有趣的知识点的。根据一般定义
    发表于 07-22 09:42

    随机系列及编码.ppt

    随机系列及编码11.1 伪随机序列的概念 11.2 正交码与伪随机码 11.3 伪随机序列的产生 11.4 m序列 11.5 M序列 11.6 Gold序列 11.7 正交沃尔什函数
    发表于 10-22 13:24 0次下载

    应用随机过程

    应用随机过程是现代应用随机过程教材,内容从入门知识到学术前沿,包括预备知识、随机过程的基本类型、Poisson过程、更新过程、Markov链、鞅、Brown运动、随机积分、
    发表于 03-19 08:47 0次下载

    什么是路间串扰/幅频特性/随机信噪比

    什么是路间串扰/幅频特性/随机信噪比 路间串扰    路间串扰:多路信号在同一设备中,由于空间的辐射与电源的波动
    发表于 03-26 11:49 1174次阅读

    随机信号系统应用

    用白噪声信号作为输入信号对钻柱系统脉冲响应进行辨识。研究了伪随机信号的特征及伪随机信号产生的方法,得出了用伪随机信号代替白噪声信号辨识钻柱系统脉冲响应的结论。结合输
    发表于 09-01 17:46 48次下载
    伪<b class='flag-5'>随机</b>信号系统应用

    最近邻的随机非线性降维

    针对线性降维技术应用于具有非线性结构的数据时无法得到令人满意的结果的问题,提出一种新的着重于保持高维空间局部最近邻信息的非线性随机降维算法( NNSE)。该算法首先在高维空间中通过计算样本点之间
    发表于 12-23 11:45 0次下载

    随机数生成算法

    在计算机上用数学的方法产生随机数列是目前通用的方法,它的特点是占用的内存少,速度快.用数学方法产生的随机数列是根据确定的算法推算出来的,严格说来并不是随机的,因此一般称用数学方法产生的随机
    发表于 04-03 10:25 6次下载

    Python随机数模块的随机函数使用

    随机数在日常的应用开发中,使用的比较多,比如抽奖游戏,如果你不依靠随机数,就会变的由规律,容易被人发现规律。比如我们的斗地主游戏,它的发牌程序也会随机给每个人发牌,还有一些加密使用的也很广泛,下面给大家分享下python中的
    的头像 发表于 01-18 17:55 2144次阅读
    Python<b class='flag-5'>随机</b>数模块的<b class='flag-5'>随机</b>函数使用

    随机颜色之与Alexa的随机玩家游戏

    电子发烧友网站提供《开随机颜色之与Alexa的随机玩家游戏.zip》资料免费下载
    发表于 12-20 09:23 0次下载
    开<b class='flag-5'>随机</b>颜色之与Alexa的<b class='flag-5'>随机</b>玩家游戏

    简述SystemVerilog的随机约束方法

    上一篇文章介绍了SystemVerilog的各种随机化方法,本文将在其基础上引入SystemVerilog的随机约束方法(constraints)。通过使用随机约束,我们可以将随机限制
    的头像 发表于 01-21 17:03 1586次阅读

    随机数和真随机数的区别是什么呢?

    随机验证中的随机其实都是基于伪随机发生器的,即每次都使用一个唯一的种子生成相应的激励。
    的头像 发表于 04-17 10:12 3062次阅读

    SystemVerilog的随机约束方法

    上一篇文章《暗藏玄机的SV随机化》介绍了SystemVerilog的各种随机化方法,本文将在其基础上引入SystemVerilog的随机约束方法(constraints)。通过使用随机
    的头像 发表于 09-24 12:15 466次阅读