模型_模型预测控制 - CSDN
精华内容
参与话题
  • 几种常见的预测模型

    万次阅读 多人点赞 2018-06-07 09:56:26
    几种常见的预测模型1.趋势外推预测方法趋势外推预测方法是根据事物的历史和现实数据,寻求事物随时间推移而发展变化的规律,从而推测其未来状况的一种常用的预测方法。 趋势外推法的假设条件是: (1)假设事物发展...

    几种常见的预测模型

    1.趋势外推预测方法

    趋势外推预测方法是根据事物的历史和现实数据,寻求事物随时间推移而发展变化的规律,从而推测其未来状况的一种常用的预测方法。
     趋势外推法的假设条件是:
     (1)假设事物发展过程没有跳跃式变化,即事物的发展变化是渐进型的。

     (2)假设所研究系统的结构、功能等基本保持不变,即假定根据过去资料建立的趋势外推模型能适合未来,能代表未来趋势变化的情况。

    由以上两个假设条件可知,趋势外推预测法是事物发展渐进过程的一种统计预测方法。简言之,就是运用一个数学模型,拟合一条趋势线,然后用这个模型外推预测未来时期事物的发展
    趋势外推预测法主要利用描绘散点图的方法(图形识别)和差分法计算进行模型选择。
    主要优点是:可以揭示事物发展的未来,并定量地估价其功能特性。
    趋势外推预测法比较适合中、长期新产品预测,要求有至少5年的数据资料。

    2.回归预测方法

    回归预测方法是根据自变量和因变量之间的相关关系进行预测的。自变量的个数可以一个或多个,根据自变量的个数可分为一元回归预测和多元回归预测。同时根据自变量和因变量的相关关系,分为线性回归预测方法和非线性回归方法。回归问题的学习等价于函数拟合:选择一条函数曲线使其很好的拟合已知数据且能很好的预测未知数据。

    3.卡尔曼滤波预测模型

    卡尔曼滤波是以最小均方误差为估计的最佳准则,来寻求一套递推估计的模型,其基本思想是: 采用信号与噪声的状态空间模型,利用前一时刻地估计值和现时刻的观测值来更新对状态变量的估计,求出现时刻的估计值。 

    它适合于实时处理和计算机运算。卡尔曼滤波器问题由预计步骤,估计步骤,前进步骤组成。 在预计步骤中, t时状态的估计取决于所有到t-1 时的信息。在估算步骤中, 状态更新后, 估计要于时间t的实际观察比较。更新的状态是较早的推算和新观察的综合。 置于每一个成分的权重由“ Kalmangain”(卡尔曼增益) 决定,它取决于噪声 w 和 v。(噪声越小,新的观察的可信度越高,权重越大,反之亦然)。前进步骤意味着先前的“新”观察在准备下一轮预计和估算时变成了“旧” 观察。 在任何时间可以进行任何长度的预测(通过提前状态转换)。

    自适应卡尔曼滤波器的主要优点是只需要少量的数据得到预测的起始点(尽管多一点数据会使结果好一点),它可以自我调节,从连续的观察中自动设置参数。缺点是对考虑复杂性的能力有限,有时收敛慢或不收敛(有正式的标致来判断是否收敛)。

    4.组合预测模型

    组合预测法是对同一个问题,采用多种预测方法。组合的主要目的是综合利用各种方法所提供的信息,尽可能地提高预测精度。组合预测有 2 种基本形式,一是等权组合, 即各预测方法的预测值按相同的权数组合成新的预测值;二是不等权组合,即赋予不同预测方法的预测值不同的权数。 这 2 种形式的原理和运用方法完全相同,只是权数的取定有所区别。 根据经验,采用不等权组合的组合预测法结果较为准确。

    5.BP神经网络预测模型

     BP网络(Back-ProPagation Network)又称反向传播神经网络, 通过样本数据的训练,不断修正网络权值和阈值使误差函数沿负梯度方向下降,逼近期望输出。它是一种应用较为广泛的神经网络模型,多用于函数逼近、模型识别分类、数据压缩和时间序列预测等。点击打开链接(BP神经网络预测实例)



    展开全文
  • CNN经典模型汇总

    万次阅读 多人点赞 2018-04-03 16:55:28
    本文主要对CNN领域的经典模型进行汇总,算是对近期的学习做一个小总结。基础知识作为深度学习的基础,神经网络这个算法是必须要有深入的了解的,这里不介绍太多,简单介绍一下原理和单个神经元的结构:一、BP神经...

    本文主要对CNN领域的经典模型进行汇总,算是对近期的学习做一个小总结。

    基础知识

    作为深度学习的基础,神经网络这个算法是必须要有深入的了解的,这里不介绍太多,简单介绍一下原理和单个神经元的结构:

    一、BP神经网络的概念

    BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:

    无

    BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。

    二、单个神经元的结构

    主要是通过对输入信号的加权求和加偏置(加权求和对应的w,偏置对应的b),然后通过通过激活函数引入非线性元素并将结果映射至0——1之间的数值(比如sigmoid函数)。具体见下图:

    无

    无

    无

    图片来源于台大 李宏毅 300页 PPT
    https://www.slideshare.net/tw_dsconf/ss-62245351 (记得FQ)
    个人觉得这个PPT非常不错,从浅到深,讲的也十分具体,有时间可以仔细看看。

    CNN模型汇总

    一、LeNet5 模型

    LeNet5 诞生于 1994 年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从 1988 年开始,在许多次成功的迭代后,这项由 Yann LeCun 完成的开拓性成果被命名为 LeNet5(参见:Gradient-Based Learning Applied to Document Recognition)。

    无

    LeNet5 的架构基于这样的观点:(尤其是)图像的特征分布在整张图像上,以及带有可学习参数的卷积是一种用少量参数在多个位置上提取相似特征的有效方式。在那时候,没有 GPU 帮助训练,甚至 CPU 的速度也很慢。因此,能够保存参数以及计算过程是一个关键进展。这和将每个像素用作一个大型多层神经网络的单独输入相反。LeNet5 阐述了那些像素不应该被使用在第一层,因为图像具有很强的空间相关性,而使用图像中独立的像素作为不同的输入特征则利用不到这些相关性。

    LeNet5特征能够总结为如下几点:
    1)卷积神经网络使用三个层作为一个系列: 卷积,池化,非线性
    2) 使用卷积提取空间特征
    3)使用映射到空间均值下采样(subsample)
    4)双曲线(tanh)或S型(sigmoid)形式的非线性
    5)多层神经网络(MLP)作为最后的分类器
    6)层与层之间的稀疏连接矩阵避免大的计算成本

    总体看来,这个网络是最近大量神经网络架构的起点,并且也给这个领域带来了许多灵感。
    从 1998 年到 2010 年神经网络处于孵化阶段。大多数人没有意识到它们不断增长的力量,与此同时其他研究者则进展缓慢。由于手机相机以及便宜的数字相机的出现,越来越多的数据可被利用。并且计算能力也在成长,CPU 变得更快,GPU 变成了多种用途的计算工具。这些趋势使得神经网络有所进展,虽然速度很慢。数据和计算能力使得神经网络能完成的任务越来越有趣。之后一切变得清晰起来……

    二、AlexNet 模型

    2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,它可以算是LeNet的一种更深更宽的版本。AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速,作者开源了他们在GPU上训练卷积神经网络的CUDA代码。AlexNet包含了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。

    AlexNet以显著的优势赢得了竞争激烈的ILSVRC 2012比赛,top-5的错误率降低至了16.4%,相比第二名的成绩26.2%错误率有了巨大的提升。AlexNet可以说是神经网络在低谷期后的第一次发声,确立了深度学习(深度卷积网络)在计算机视觉的统治地位,同时也推动了深度学习在语音识别、自然语言处理、强化学习等领域的拓展。

    AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:

    (1)成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
    (2)训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
    (3)在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
    (4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
    (5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。 
    (6)数据增强,随机地从256´256的原始图像中截取224´224大小的区域(以及水平翻转的镜像),相当于增加了(256-224)2´2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。

    整个AlexNet有8个需要训练参数的层(不包括池化层和LRN层),前5层为卷积层,后3层为全连接层,如图4所示。AlexNet最后一层是有1000类输出的Softmax层用作分类。 LRN层出现在第1个及第2个卷积层后,而最大池化层出现在两个LRN层及最后一个卷积层后。ReLU激活函数则应用在这8层每一层的后面。因为AlexNet训练时使用了两块GPU,因此这个结构图中不少组件都被拆为了两部分。现在我们GPU的显存可以放下全部模型参数,因此只考虑一块GPU的情况即可。

    无

    整个网络呈一个金字塔结构,具体来说:

    1. 输入图片是224*224像素的三通道图片;
    2. 第一层使用11*11的卷积核,滑动步长为4个像素,输出为96个特征图并进行最大值池化;
    3. 第二层使用5*5卷积核,卷积产生256个特征图,并进行最大池化;
    4. 第三层,第四层均使用3*3卷积核,输出384个特征图;
    5. 第五层使用3*3卷积层,输出256个特征图,并进行池化;
    6. 第六层,第七层为全连接层,分别包含4096个隐层,也就是说,到全连接层时只剩4096个特征值;
    7. 最终,第八层为softmax层,得到最终的分类结果。

    三、VGG 模型

    来自牛津大学的 VGG 网络(参见:Very Deep Convolutional Networks for Large-Scale Image Recognition)是第一个在各个卷积层使用更小的 3×3 过滤器(filter),并把它们组合作为一个卷积序列进行处理的网络。

    这看来和 LeNet 的原理相反,其中是大的卷积被用来获取一张图像中相似特征。和 AlexNet 的 9×9 或 11×11 过滤器不同,过滤器开始变得更小,离 LeNet 竭力所要避免的臭名昭著的 1×1 卷积异常接近——至少在该网络的第一层是这样。但是 VGG 巨大的进展是通过依次采用多个 3×3 卷积,能够模仿出更大的感受野(receptive field)的效果,例如 5×5 与 7×7。这些思想也被用在了最近更多的网络架构中,如 Inception 与 ResNet。

    VGGNet论文中全部使用了3´3的卷积核和2´2的池化核,通过不断加深网络结构来提升性能。图6所示为VGGNet各级别的网络结构图,图7所示为每一级别的参数量,从11层的网络一直到19层的网络都有详尽的性能测试。虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是我们常说的VGGNet-16和VGGNet-19。C很有意思,相比B多了几个1´1的卷积层,1´1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维。

    VGGNet拥有5段卷积,每一段内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64 – 128 – 256 – 512 – 512。其中经常出现多个完全一样的3´3的卷积层堆叠在一起的情况,这其实是非常有用的设计。如图8所示,两个3´3的卷积层串联相当于1个5´5的卷积层,即一个像素会跟周围5´5的像素产生关联,可以说感受野大小为5´5。而3个3´3的卷积层串联的效果则相当于1个7´7的卷积层。除此之外,3个串联的3´3的卷积层,拥有比1个7´7的卷积层更少的参数量,只有后者的。最重要的是,3个3´3的卷积层拥有比1个7´7的卷积层更多的非线性变换(前者可以使用三次ReLU激活函数,而后者只有一次),使得CNN对特征的学习能力更强。

    同时,作者在对比各级网络时总结出了以下几个观点。
    (1)LRN层作用不大。
    (2)越深的网络效果越好。
    (3)1´1的卷积也是很有效的,但是没有3´3的卷积好,大一些的卷积核可以学习更大的空间特征。

    总的来说,在网络设计思路上,VGGNet是继承了AlexNet的思路,以AlexNet为基础,尝试建立一个层次更多,深度更深的网络。其网络结构一样可以由8个层次所构成,也是5组卷积层,3层全连接层。最主要的区别在于,VGGNet的每个卷积层并不是只做一次卷积操作,而是连续卷积2~4次。具体结构上的差别见下表(包括其它网络结构和VGG16与VGG19):

    无

    四、GoogleNet模型

    在VGGNets中我们了解到,如果网络的层数更多,深度更深,就会得到更好的结果。但是随着模型越来越复杂,参数越来越多,也会面临很多问题。一方面,是更深的网络需要更多的数据才能有更好的效果,否则就比较容易过拟合。另一方面,复杂的网络意味着更大的计算量,这对于应用来说非常不利。在一些对实时性要求非常高的应用中,比如自动驾驶,要求参数足够少,计算速度足够快。所以,减少参数也是一个重要的课题。因此,为了能更有效地扩展网络地复杂度,Google的大神们启动了Inception项目,GoogleNet就是它的第一个版本(目前共有4个版本)。

    正如前面在对比AlexNet和VGGNets的结构时提到的,对于卷积核大小的选择是需要经验和大量实验才可以确定的,到底是选3*3呢,还是5*5或者7*7?这个问题并没有一种明确的思路。这里的做法是跳出直线加深网络层数的思路,通过增加“宽度”的方式增加网络复杂度,避免陷入卷积核选择的陷阱,让程序自己学习如何选择卷积核。具体来说中,是在每一个卷积层,并行使用1*1卷积核,3*3卷积核,5*5卷积核和池化,同时提取不同尺度的特征,然后通过1*1的卷积核对每一个分支进行降维后,最后将结果合并拼接在一起。直观地看起来,好像结构复杂了很多,本来只要一两个卷积就可以完成地计算,现在却要使用四五种不同地操作。但是仔细分析可以发现,这样地设计不仅减少了参数地数量,而且由于增加了网络地“宽度”,网络对多种尺度地适应性就更好了(GoogleNet中地block结构如图:)

    无

    在这个结构中,1*1卷积扮演了非常重要地角色,1*1卷积并没有对图像本身产生什么影响,在数学上仅仅是最简单地矩阵乘法操作,其最重要的作用在于降低特征图的数量以达到降维的目的。由于有了1*1卷积的存在,才使得网络可以在不增加参数数量级的情况下可以增加复杂度。

    这里给出完整的GoogleNet模型结构:

    无

    这里补充两个注意点:
    1. 对于不同的卷积核,要取不同的滑动步长,以使得他们输出的特征图大小相同,便于后一步的操作;
    2. 在CNN中,1*1的卷积核最主要的作用在于改变通道数,比如,原图像 3*64*64的rgb,通过5个1X1卷积核就变成了5*64*64.用5个卷积核代替了原来RGB三通道的表示方法。因此,该卷积核既可以升维又可以降维;

    Inception项目的其它几个版本这里做一下简要的概述,不过多讨论:
    1.Inception-v2是在第一代的GoogleNet基础上加入了批标准化(Batch Normalization)技术。其具体做法是,对mini-batch中所有的信号量进行统一的归一化,使得一个批次中所有的信号量符合均值为0,方差为1的高斯分布。需要注意的是,在tensorflow中,使用批标准化技术要在激活函数之前,否则作用会打一定的折扣;

    2.Inception-v3在之前的版本上又有提高。其最核心的思想是将卷积核操作继续分解成更小的卷积核。首先,比如,借鉴VGGNets的思路,5*5的卷积可以由连续2层3*3卷积所替代,这样既减少了参数数量,也进一步加快了计算速度。这样的好处是,在经过这样的转换后,不但参数数量进一步减少,计算速度更快,而且网络的深度也加深了,增加了非线性表达能力。

    五、ResNets模型

    对于深度神经网络来说,VGGNets证明了加深网络层次是提高精度的有效手段,但是由于梯度弥散的问题导致网络深度无法持续加深。梯度弥散问题是由于在反向传播过程中误差不断累积,导致在最初的几层梯度值几乎为0,从而无法收敛。经过测试,20层以上的深层网络,会随着层数的增加,收敛效果越来越差,50层的网络是20层的网络所得错误率的一倍。这一现象称为深度网络的退化问题。

    退化问题其实说明,不是所有的系统都能很容易的被优化。难道网络的深度的增加到此为止了吗?ResNets告诉我们残差网络是一种避免梯度消失的更容易优化的结构。

    熟悉机器学习算法的都可以理解,神经网络实际上是将一个空间维度的向量x,经过非线性变换H(x)映射到另外一个空间维度中。但通过前面的观察会意识到H(x)非常难以优化,所以尝试转而求H(x)的残差形式F(x)=H(x)-x。假设求解F(x)=H(x)-x。假设求解F(x)会比求H(x)要简单一些的话,就可以通过F(x)+x来达到最终1的目标。

    无

    从实际实验的结果来看,残差网络的效果是非常明显的。如论文里所说,类似VGGNet的结构在超过20个参数层以后,收敛效果会大打折扣,准确率比较差,但是简单地加入一些“捷径”(shortcut)连接边后,使其转变为残差结构,收敛效果都急剧提高,精度也随着训练次数地增加持续提高,并且不断加深网络深度还可以持续提高准确率,残差网络与VGG结构地对比如图所示:

    无

    无

    ResNets的成功,使整个卷积神经网络的研究上了一个新的台阶,inception也将残差结构融入其中,实现了更优秀的模型inception-v4。

    :这个ResNets模型我不是太能看明白,不太理解为什么残差形式F(x)=H(x)-x要比H(x)容易求解,留作疑问,若有人看到这篇博文,欢迎前来讨论!

    展开全文
  • 经中国地理信息产业协会审查批准,《空间三维模型数据格式》团体标准发布,将于8月31日正式实施。这是中国地理信息产业协会发布的第一个团体标准。该标准以中国工程院院士刘先林为组长的标准审查组评审。专家组一致...

    经中国地理信息产业协会审查批准,《空间三维模型数据格式》团体标准发布,将于8月31日正式实施。这是中国地理信息产业协会发布的第一个团体标准。该标准以中国工程院院士刘先林为组长的标准审查组评审。专家组一致认为:该标准具有先进性和适用性,对于推动我国三维地理空间数据的共享及深入应用具有重要作用。

    《空间三维模型数据格式》团体标准定义了一种开放式可扩展的三维地理空间数据格式——Spatial 3D Model(S3M),对倾斜摄影模型、人工建模数据、BIM、点云、三维管线、二维/三维点线面等各类数据进行整合,适用于海量、多源异构三维地理空间数据和Web环境下的传输与解析,为多源三维地理空间数据在不同终端(移动设备、浏览器、桌面电脑)地理信息平台中的存储、高效绘制、共享与互操作等问题提供了解决方案。

    《空间三维模型数据格式》团体标准由中国地理信息产业协会提出,北京超图股份有限公司牵头起草,起草单位还有自然资源部信息中心、国家基础地理信息中心、中国城市规划设计研究院、中国建筑科学研究院有限公司等12家单位。据悉,标准编制单位已基于本标准形成了完整的B/S及C/S架构的三维GIS应用解决方案,从数据生成、服务器端发布到多种客户端加载应用等多个环节解决用户实际问题。

    该标准由中国地理信息产业协会归口。标准文本将由标准出版社出版发行,在全国团体标准信息平台和中国地理信息产业协会网站上刊出。北京超图软件股份有限公司负责技术解释。

    《空间三维模型数据格式》团体标准的发布,将为不同应用系统之间的三维数据共享和互操作提供开放、标准、通用的数据格式基础,推动倾斜摄影建模、激光点云、BIM等多源异构的三维数据融合,并兼容多种软硬件环境,为实景三维中国和新型智慧城市建设贡献力量。

    白皮书csdn下载地址:https://download.csdn.net/download/supermapsupport/11596741

    展开全文
  • 如果你的预测模型表现得有些不尽如人意,那就用XGBoost吧。XGBoost算法现在已经成为很多数据工程师的重要武器。它是一种十分精致的算法,可以处理各种不规则的数据。 构造一个使用XGBoost的模型十分简单。但是,提高...

     

    1. 简介

    如果你的预测模型表现得有些不尽如人意,那就用XGBoost吧。XGBoost算法现在已经成为很多数据工程师的重要武器。它是一种十分精致的算法,可以处理各种不规则的数据。
    构造一个使用XGBoost的模型十分简单。但是,提高这个模型的表现就有些困难(至少我觉得十分纠结)。这个算法使用了好几个参数。所以为了提高模型的表现,参数的调整十分必要。在解决实际问题的时候,有些问题是很难回答的——你需要调整哪些参数?这些参数要调到什么值,才能达到理想的输出?
    这篇文章最适合刚刚接触XGBoost的人阅读。在这篇文章中,我们会学到参数调优的技巧,以及XGboost相关的一些有用的知识。以及,我们会用Python在一个数据集上实践一下这个算法。

    2. 你需要知道的

    XGBoost(eXtreme Gradient Boosting)是Gradient Boosting算法的一个优化的版本。因为我在前一篇文章,基于Python的Gradient Boosting算法参数调整完全指南,里面已经涵盖了Gradient Boosting算法的很多细节了。我强烈建议大家在读本篇文章之前,把那篇文章好好读一遍。它会帮助你对Boosting算法有一个宏观的理解,同时也会对GBM的参数调整有更好的体会。

    特别鸣谢:我个人十分感谢Mr Sudalai Rajkumar (aka SRK)大神的支持,目前他在AV Rank中位列第二。如果没有他的帮助,就没有这篇文章。在他的帮助下,我们才能给无数的数据科学家指点迷津。给他一个大大的赞!

    3. 内容列表

    1、XGBoost的优势
    2、理解XGBoost的参数
    3、调参示例

    4. XGBoost的优势

    XGBoost算法可以给预测模型带来能力的提升。当我对它的表现有更多了解的时候,当我对它的高准确率背后的原理有更多了解的时候,我发现它具有很多优势:

    4.1 正则化

    • 标准GBM的实现没有像XGBoost这样的正则化步骤。正则化对减少过拟合也是有帮助的。
    • 实际上,XGBoost以“正则化提升(regularized boosting)”技术而闻名。

    4.2 并行处理

    • XGBoost可以实现并行处理,相比GBM有了速度的飞跃。
    • 不过,众所周知,Boosting算法是顺序处理的,它怎么可能并行呢?每一课树的构造都依赖于前一棵树,那具体是什么让我们能用多核处理器去构造一个树呢?我希望你理解了这句话的意思。如果你希望了解更多,点击这个链接
    • XGBoost 也支持Hadoop实现。

    4.3 高度的灵活性

    • XGBoost 允许用户定义自定义优化目标和评价标准
    • 它对模型增加了一个全新的维度,所以我们的处理不会受到任何限制。

    4.4 缺失值处理

    • XGBoost内置处理缺失值的规则。
    • 用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。

    4.5 剪枝

    • 当分裂时遇到一个负损失时,GBM会停止分裂。因此GBM实际上是一个贪心算法
    • XGBoost会一直分裂到指定的最大深度(max_depth),然后回过头来剪枝。如果某个节点之后不再有正值,它会去除这个分裂。
    • 这种做法的优点,当一个负损失(如-2)后面有个正损失(如+10)的时候,就显现出来了。GBM会在-2处停下来,因为它遇到了一个负值。但是XGBoost会继续分裂,然后发现这两个分裂综合起来会得到+8,因此会保留这两个分裂。

    4.6 内置交叉验证

    • XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。
    • 而GBM使用网格搜索,只能检测有限个值。

    4.7、在已有的模型基础上继续

    • XGBoost可以在上一轮的结果上继续训练。这个特性在某些特定的应用上是一个巨大的优势。
    • sklearn中的GBM的实现也有这个功能,两种算法在这一点上是一致的。

    相信你已经对XGBoost强大的功能有了点概念。注意这是我自己总结出来的几点,你如果有更多的想法,尽管在下面评论指出,我会更新这个列表的!

    你的胃口被我吊起来了吗?棒棒哒!如果你想更深入了解相关信息,可以参考下面这些文章:
    XGBoost Guide - Introduce to Boosted Trees
    Words from the Auther of XGBoost [Viedo]

    5. XGBoost的参数

    XGBoost的作者把所有的参数分成了三类:

    1. 通用参数:宏观函数控制。
    2. Booster参数:控制每一步的booster(tree/regression)。
    3. 学习目标参数:控制训练目标的表现。

    在这里我会类比GBM来讲解,所以作为一种基础知识,强烈推荐先阅读这篇文章

    5.1 通用参数

    这些参数用来控制XGBoost的宏观功能。

    1、booster[默认gbtree]

    • 选择每次迭代的模型,有两种选择:
      gbtree:基于树的模型
      gbliner:线性模型

    2、silent[默认0]

    • 当这个参数值为1时,静默模式开启,不会输出任何信息。
    • 一般这个参数就保持默认的0,因为这样能帮我们更好地理解模型。

    3、nthread[默认值为最大可能的线程数]

    • 这个参数用来进行多线程控制,应当输入系统的核数。
    • 如果你希望使用CPU全部的核,那就不要输入这个参数,算法会自动检测它。

    还有两个参数,XGBoost会自动设置,目前你不用管它。接下来咱们一起看booster参数。

    5.2 booster参数

    尽管有两种booster可供选择,我这里只介绍tree booster,因为它的表现远远胜过linear booster,所以linear booster很少用到。

    1、eta[默认0.3]

    • 和GBM中的 learning rate 参数类似。
    • 通过减少每一步的权重,可以提高模型的鲁棒性。
    • 典型值为0.01-0.2。

    2、min_child_weight[默认1]

    • 决定最小叶子节点样本权重和。
    • 和GBM的 min_child_leaf 参数类似,但不完全一样。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数
    • 这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。
    • 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。

    3、max_depth[默认6]

    • 和GBM中的参数相同,这个值为树的最大深度。
    • 这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。
    • 需要使用CV函数来进行调优。
    • 典型值:3-10

    4、max_leaf_nodes

    • 树上最大的节点或叶子的数量。
    • 可以替代max_depth的作用。因为如果生成的是二叉树,一个深度为n的树最多生成n2个叶子。
    • 如果定义了这个参数,GBM会忽略max_depth参数。

    5、gamma[默认0]

    • 在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。
    • 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。

    6、max_delta_step[默认0]

    • 这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。
    • 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的。
    • 这个参数一般用不到,但是你可以挖掘出来它更多的用处。

    7、subsample[默认1]

    • 和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例。
    • 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
    • 典型值:0.5-1

    8、colsample_bytree[默认1]

    • 和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。
    • 典型值:0.5-1

    9、colsample_bylevel[默认1]

    • 用来控制树的每一级的每一次分裂,对列数的采样的占比。
    • 我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。

    10、lambda[默认1]

    • 权重的L2正则化项。(和Ridge regression类似)。
    • 这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。

    11、alpha[默认1]

    • 权重的L1正则化项。(和Lasso regression类似)。
    • 可以应用在很高维度的情况下,使得算法的速度更快。

    12、scale_pos_weight[默认1]

    • 在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。

    5.3学习目标参数

    这个参数用来控制理想的优化目标和每一步结果的度量方法。

    1、objective[默认reg:linear]

    • 这个参数定义需要被最小化的损失函数。最常用的值有:
      • binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。
      • multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。
        • 在这种情况下,你还需要多设一个参数:num_class(类别数目)。
      • multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。

    2、eval_metric[默认值取决于objective参数的取值]

    • 对于有效数据的度量方法。
    • 对于回归问题,默认值是rmse,对于分类问题,默认值是error。
    • 典型值有:
      • rmse 均方根误差(∑Ni=1ϵ2N‾‾‾‾‾‾‾√)
      • mae 平均绝对误差(∑Ni=1|ϵ|N)
      • logloss 负对数似然函数值
      • error 二分类错误率(阈值为0.5)
      • merror 多分类错误率
      • mlogloss 多分类logloss损失函数
      • auc 曲线下面积

    3、seed(默认0)

    • 随机数的种子
    • 设置它可以复现随机数据的结果,也可以用于调整参数

    如果你之前用的是Scikit-learn,你可能不太熟悉这些参数。但是有个好消息,python的XGBoost模块有一个sklearn包,XGBClassifier。这个包中的参数是按sklearn风格命名的。会改变的函数名是:

    1、eta -> learning_rate
    2、lambda -> reg_lambda
    3、alpha -> reg_alpha

    你肯定在疑惑为啥咱们没有介绍和GBM中的n_estimators类似的参数。XGBClassifier中确实有一个类似的参数,但是,是在标准XGBoost实现中调用拟合函数时,把它作为num_boosting_rounds参数传入。
    XGBoost Guide 的一些部分是我强烈推荐大家阅读的,通过它可以对代码和参数有一个更好的了解:

    XGBoost Parameters (official guide)
    XGBoost Demo Codes (xgboost GitHub repository)
    Python API Reference (official guide)

    6. 调参示例

    我们从Data Hackathon 3.x AV版的hackathon中获得数据集,和GBM 介绍文章中是一样的。更多的细节可以参考competition page
    数据集可以从这里下载。我已经对这些数据进行了一些处理:

    • City变量,因为类别太多,所以删掉了一些类别。
    • DOB变量换算成年龄,并删除了一些数据。
    • 增加了 EMI_Loan_Submitted_Missing 变量。如果EMI_Loan_Submitted变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的EMI_Loan_Submitted变量。
    • EmployerName变量,因为类别太多,所以删掉了一些类别。
    • 因为Existing_EMI变量只有111个值缺失,所以缺失值补充为中位数0。
    • 增加了 Interest_Rate_Missing 变量。如果Interest_Rate变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的Interest_Rate变量。
    • 删除了Lead_Creation_Date,从直觉上这个特征就对最终结果没什么帮助。
    • Loan_Amount_Applied, Loan_Tenure_Applied 两个变量的缺项用中位数补足。
    • 增加了 Loan_Amount_Submitted_Missing 变量。如果Loan_Amount_Submitted变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的Loan_Amount_Submitted变量。
    • 增加了 Loan_Tenure_Submitted_Missing 变量。如果 Loan_Tenure_Submitted 变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的 Loan_Tenure_Submitted 变量。
    • 删除了LoggedIn, Salary_Account 两个变量
    • 增加了 Processing_Fee_Missing 变量。如果 Processing_Fee 变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的 Processing_Fee 变量。
    • Source前两位不变,其它分成不同的类别。
    • 进行了离散化和独热编码(一位有效编码)。

    如果你有原始数据,可以从资源库里面下载data_preparationIpython notebook 文件,然后自己过一遍这些步骤。

    首先,import必要的库,然后加载数据。

    #Import libraries:
    import pandas as pd
    import numpy as np
    import xgboost as xgb
    from xgboost.sklearn import XGBClassifier
    from sklearn import cross_validation, metrics   #Additional     scklearn functions
    from sklearn.grid_search import GridSearchCV   #Perforing grid search
    import matplotlib.pylab as plt
    %matplotlib inline
    from matplotlib.pylab import rcParams
    rcParams['figure.figsize'] = 12, 4
    train = pd.read_csv('train_modified.csv')
    target = 'Disbursed'
    IDcol = 'ID'

    注意我import了两种XGBoost:

    • xgb - 直接引用xgboost。接下来会用到其中的“cv”函数。
    • XGBClassifier - 是xgboost的sklearn包。这个包允许我们像GBM一样使用Grid Search 和并行处理。

    在向下进行之前,我们先定义一个函数,它可以帮助我们建立XGBoost models 并进行交叉验证。好消息是你可以直接用下面的函数,以后再自己的models中也可以使用它。

    def modelfit(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
    if useTrainCV:
        xgb_param = alg.get_xgb_params()
        xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)
        cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
            metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)
        alg.set_params(n_estimators=cvresult.shape[])
    #Fit the algorithm on the data
    alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')
    #Predict training set:
    dtrain_predictions = alg.predict(dtrain[predictors])
    dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]
    #Print model report:
    print "\nModel Report"
    print "Accuracy : %.4g" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions)
    print "AUC Score (Train): %f" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob)
    feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)
    feat_imp.plot(kind='bar', title='Feature Importances')
    plt.ylabel('Feature Importance Score')

    这个函数和GBM中使用的有些许不同。不过本文章的重点是讲解重要的概念,而不是写代码。如果哪里有不理解的地方,请在下面评论,不要有压力。注意xgboost的sklearn包没有“feature_importance”这个量度,但是get_fscore()函数有相同的功能。

    6.1 参数调优的一般方法

    我们会使用和GBM中相似的方法。需要进行如下步骤:

    1. 选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使用交叉验证,并返回理想的决策树数量。

    2. 对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数,待会儿我会举例说明。

    3. xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。

    4. 降低学习速率,确定理想参数。

    咱们一起详细地一步步进行这些操作。

    第一步:确定学习速率和tree_based 参数调优的估计器数目

    为了确定boosting参数,我们要先给其它参数一个初始值。咱们先按如下方法取值:

    1、max_depth = 5 :这个参数的取值最好在3-10之间。我选的起始值为5,但是你也可以选择其它的值。起始值在4-6之间都是不错的选择。

    2、min_child_weight = 1:在这里选了一个比较小的值,因为这是一个极不平衡的分类问题。因此,某些叶子节点下的值会比较小。

    3、gamma = 0: 起始值也可以选其它比较小的值,在0.1到0.2之间就可以。这个参数后继也是要调整的。

    4、subsample, colsample_bytree = 0.8: 这个是最常见的初始值了。典型值的范围在0.5-0.9之间。

    5、scale_pos_weight = 1: 这个值是因为类别十分不平衡。
    注意哦,上面这些参数的值只是一个初始的估计值,后继需要调优。这里把学习速率就设成默认的0.1。然后用xgboost中的cv函数来确定最佳的决策树数量。前文中的函数可以完成这个工作。

    #Choose all predictors except target & IDcols
    predictors = [x for x in train.columns if x not in [target,IDcol]]
    xgb1 = XGBClassifier(
     learning_rate =0.1,
     n_estimators=,
     max_depth=,
     min_child_weight=,
     gamma=,
     subsample=0.8,
     colsample_bytree=0.8,
     objective= 'binary:logistic',
     nthread=,
     scale_pos_weight=,
     seed=)
    modelfit(xgb1, train, predictors)

    从输出结果可以看出,在学习速率为0.1时,理想的决策树数目是140。这个数字对你而言可能比较高,当然这也取决于你的系统的性能。

    注意:在AUC(test)这里你可以看到测试集的AUC值。但是如果你在自己的系统上运行这些命令,并不会出现这个值。因为数据并不公开。这里提供的值仅供参考。生成这个值的代码部分已经被删掉了。

    第二步: max_depth 和 min_weight 参数调优

    我们先对这两个参数调优,是因为它们对最终结果有很大的影响。首先,我们先大范围地粗调参数,然后再小范围地微调。
    注意:在这一节我会进行高负荷的栅格搜索(grid search),这个过程大约需要15-30分钟甚至更久,具体取决于你系统的性能。你也可以根据自己系统的性能选择不同的值。

    param_test1 = {
     'max_depth':range(3,10,2),
     'min_child_weight':range(1,6,2)
    }
    gsearch1 = GridSearchCV(estimator = XGBClassifier(         learning_rate =0.1, n_estimators=140, max_depth=5,
    min_child_weight=, gamma=0, subsample=0.8,             colsample_bytree=0.8,
     objective= 'binary:logistic', nthread=4,     scale_pos_weight=1, seed=27), 
     param_grid = param_test1,     scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    gsearch1.fit(train[predictors],train[target])
    gsearch1.grid_scores_, gsearch1.best_params_,     gsearch1.best_score_

    输出结果

    至此,我们对于数值进行了较大跨度的12中不同的排列组合,可以看出理想的max_depth值为5,理想的min_child_weight值为5。在这个值附近我们可以再进一步调整,来找出理想值。我们把上下范围各拓展1,因为之前我们进行组合的时候,参数调整的步长是2。

    param_test2 = {
     'max_depth':[4,5,6],
     'min_child_weight':[4,5,6]
    }
    gsearch2 = GridSearchCV(estimator = XGBClassifier(     learning_rate=0.1, n_estimators=140, max_depth=5,
     min_child_weight=, gamma=0, subsample=0.8, colsample_bytree=0.8,
     objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27), 
     param_grid = param_test2, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    gsearch2.fit(train[predictors],train[target])
    gsearch2.grid_scores_, gsearch2.best_params_,     gsearch2.best_score_

    输出结果

    至此,我们得到max_depth的理想取值为4,min_child_weight的理想取值为6。同时,我们还能看到cv的得分有了小小一点提高。需要注意的一点是,随着模型表现的提升,进一步提升的难度是指数级上升的,尤其是你的表现已经接近完美的时候。当然啦,你会发现,虽然min_child_weight的理想取值是6,但是我们还没尝试过大于6的取值。像下面这样,就可以尝试其它值。

    param_test2b = {
     'min_child_weight':[6,8,10,12]
     }
    gsearch2b = GridSearchCV(estimator = XGBClassifier(     learning_rate=0.1, n_estimators=140, max_depth=4,
     min_child_weight=, gamma=0, subsample=0.8, colsample_bytree=0.8, objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27), param_grid = param_test2b, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    gsearch2b.fit(train[predictors],train[target])
    modelfit(gsearch3.best_estimator_, train, predictors)
    gsearch2b.grid_scores_, gsearch2b.best_params_, gsearch2b.best_score_

    输出结果

    我们可以看出,6确确实实是理想的取值了。

    第三步:gamma参数调优

    在已经调整好其它参数的基础上,我们可以进行gamma参数的调优了。Gamma参数取值范围可以很大,我这里把取值范围设置为5了。你其实也可以取更精确的gamma值。

    param_test3 = {
     'gamma':[i/10.0 for i in range(0,5)]
    }
    gsearch3 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=140, max_depth=4, min_child_weight=6, gamma=0, subsample=0.8, colsample_bytree=0.8, objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27), param_grid = param_test3, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    gsearch3.fit(train[predictors],train[target])
    gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_

    从这里可以看出来,我们在第一步调参时设置的初始gamma值就是比较合适的。也就是说,理想的gamma值为0。在这个过程开始之前,最好重新调整boosting回合,因为参数都有变化。
    gamma
    从这里,可以看出,得分提高了。所以,最终得到的参数是:

    xgb2 = XGBClassifier(
     learning_rate =0.1,
     n_estimators=,
     max_depth=,
     min_child_weight=,
     gamma=,
     subsample=0.8,
     colsample_bytree=0.8,
     objective= 'binary:logistic',
     nthread=,
    scale_pos_weight=,
    seed=)
    modelfit(xgb2, train, predictors)

    最终参数

    第四步:调整subsample 和 colsample_bytree 参数

    下一步是尝试不同的subsample 和 colsample_bytree 参数。我们分两个阶段来进行这个步骤。这两个步骤都取0.6,0.7,0.8,0.9作为起始值。

    param_test4 = {
     'subsample':[i/10.0 for i in range(6,10)],
     'colsample_bytree':[i/10.0 for i in range(6,10)]
    }
    gsearch4 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=177, max_depth=3, min_child_weight=4, gamma=0.1, subsample=0.8, colsample_bytree=0.8, objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27), param_grid = param_test4, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    gsearch4.fit(train[predictors],train[target])
    gsearch4.grid_scores_, gsearch4.best_params_, gsearch4.best_score_

    gsearch4

    从这里可以看出来,subsample 和 colsample_bytree 参数的理想取值都是0.8。现在,我们以0.05为步长,在这个值附近尝试取值。

    param_test5 = {
     'subsample':[i/100.0 for i in range(75,90,5)],
     'colsample_bytree':[i/100.0 for i in range(75,90,5)]
    }
    gsearch5 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=177, max_depth=4, min_child_weight=6, gamma=0, subsample=0.8, colsample_bytree=0.8, objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27), param_grid = param_test5, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    gsearch5.fit(train[predictors],train[target])

    output

    我们得到的理想取值还是原来的值。因此,最终的理想取值是:

    • subsample: 0.8
    • colsample_bytree: 0.8

    第五步:正则化参数调优

    下一步是应用正则化来降低过拟合。由于gamma函数提供了一种更加有效地降低过拟合的方法,大部分人很少会用到这个参数。但是我们在这里也可以尝试用一下这个参数。我会在这里调整’reg_alpha’参数,然后’reg_lambda’参数留给你来完成。

    param_test6 = {
     'reg_alpha':[1e-5, 1e-2, 0.1, 1, 100]
    }
    gsearch6 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=177, max_depth=4, min_child_weight=6, gamma=0.1, subsample=0.8, colsample_bytree=0.8, objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27), param_grid = param_test6, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    gsearch6.fit(train[predictors],train[target])
    gsearch6.grid_scores_, gsearch6.best_params_, gsearch6.best_score_

    output

    我们可以看到,相比之前的结果,CV的得分甚至还降低了。但是我们之前使用的取值是十分粗糙的,我们在这里选取一个比较靠近理想值(0.01)的取值,来看看是否有更好的表现。

    param_test7 = {
     'reg_alpha':[0, 0.001, 0.005, 0.01, 0.05]
    }
    gsearch7 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=177, max_depth=4, min_child_weight=6, gamma=0.1, subsample=0.8, colsample_bytree=0.8, objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27), param_grid = param_test7, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    gsearch7.fit(train[predictors],train[target])
    gsearch7.grid_scores_, gsearch7.best_params_, gsearch7.best_score_

    output7

    可以看到,CV的得分提高了。现在,我们在模型中来使用正则化参数,来看看这个参数的影响。

    xgb3 = XGBClassifier(
     learning_rate =0.1,
     n_estimators=,
     max_depth=,
     min_child_weight=,
     gamma=,
     subsample=0.8,
     colsample_bytree=0.8,
     reg_alpha=0.005,
     objective= 'binary:logistic',
     nthread=,
     scale_pos_weight=,
     seed=)
    modelfit(xgb3, train, predictors)

    out_put3

    然后我们发现性能有了小幅度提高。

    第6步:降低学习速率

    最后,我们使用较低的学习速率,以及使用更多的决策树。我们可以用XGBoost中的CV函数来进行这一步工作。

    xgb4 = XGBClassifier(
     learning_rate =0.01,
     n_estimators=,
     max_depth=,
     min_child_weight=,
     gamma=,
     subsample=0.8,
     colsample_bytree=0.8,
     reg_alpha=0.005,
     objective= 'binary:logistic',
     nthread=,
     scale_pos_weight=,
     seed=)
    modelfit(xgb4, train, predictors)

    此处输入图片的描述
    此处输入图片的描述

    至此,你可以看到模型的表现有了大幅提升,调整每个参数带来的影响也更加清楚了。
    在文章的末尾,我想分享两个重要的思想:
    1、仅仅靠参数的调整和模型的小幅优化,想要让模型的表现有个大幅度提升是不可能的。GBM的最高得分是0.8487,XGBoost的最高得分是0.8494。确实是有一定的提升,但是没有达到质的飞跃。
    2、要想让模型的表现有一个质的飞跃,需要依靠其他的手段,诸如,特征工程(feature egineering) ,模型组合(ensemble of model),以及堆叠(stacking)等。

    你可以从 这里 下载iPython notebook文件,里面包含了文章中提到的所有代码。如果你使用R语言,请阅读这篇文章

    结束语

    这篇文章主要讲了如何提升XGBoost模型的表现。首先,我们介绍了相比于GBM,为何XGBoost可以取得这么好的表现。紧接着,我们介绍了每个参数的细节。我们定义了一个可以重复使用的构造模型的函数。
    最后,我们讨论了使用XGBoost解决问题的一般方法,在AV Data Hackathon 3.x problem数据上实践了这些方法。
    希望看过这篇文章之后,你能有所收获,下次使用XGBoost解决问题的时候可以更有信心哦~

     

     

    原文地址:Complete Guide to Parameter Tuning in XGBoost by Aarshay Jain
    原文翻译与校对:@MOLLY && 寒小阳 (hanxiaoyang.ml@gmail.com)
    时间:2016年9月。
    出处:http://blog.csdn.net/han_xiaoyang/article/details/52665396
    声明:版权所有,转载请联系作者并注明出

    展开全文
  • ArcGIS之模型构建器(ModelBuilder)视频培训课程,该教程是ArcGIS入门实战课程之后推出的进阶版实战课程。 本课程介绍ArcGIS的模型构建器的应用,分为ArcGIS模型构建器的初识、进阶、应用三个部分。让你的数据处理...
  • 主题模型

    千次阅读 2019-09-05 11:37:51
    文章目录主题模型定义主题模型历史简单案例引入知识储备:SVD——奇异值分解1、特征值2、SVD分解3、SVD与PCAPLSA——概率隐性语义分析1、SVD2、LSA3、PLSAPlSA原理应用1、 **PLSA:文档生成模型**2、**利用文档推断...
  • 自回归(Autoregressive Models,AR)模型

    万次阅读 2018-07-24 20:01:06
    其中{at}是白噪声序列,这个模型与简单线性回归模型有相同的形式,这个模型也叫做一阶自回归(AR)模型,简称AR(1)模型 从AR(1)很容易推广到AR(p)模型:   AR(p)模型的特征根及平稳性检验 我们先假定序列是弱...
  • 层次数据模型     定义:层次数据模型是用树状<层次>结构来组织数据的数据模型。     满足下面两个条件的基本层次联系的集合为层次模型     1. 有且只有一个结点没有双亲结点,这个结点称为根结点...
  • 数学建模四大模型总结

    万次阅读 多人点赞 2019-09-18 21:27:43
    文章目录数学建模四大模型总结1 、优化模型1.1 数学规划模型1.2 微分方程组模型1.3 图论与网络优化问题1.4 概率模型1.5 组合优化经典问题现代优化算法:禁忌搜索;模拟退火;遗传算法;人工神经网络2、分类模型2.1 ...
  • 11.Ogre的模型.mesh里面包含了什么信息(也就是说结构是怎样的呢)? A: OgreMeshSerializer.cpp MeshSerializer::importMesh // Find the implementation to use MeshSerializerImplMap::iterator impl = ...
  • 应用层常用协议

    万次阅读 2016-09-21 12:50:36
    一、应用层常用协议 1 DNS:域名系统DNS是因特网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址。 现在顶级域名TLD分为三大类:国家顶级域名nTLD;通用顶级域名gTLD;基础结构域名 ...FTP
  • 标准盒子模型和IE盒子模型

    万次阅读 2014-01-24 14:48:27
    盒子模型是css中一个重要的概念,理解了盒子模型才能更好的排版。其实盒子模型有两种,分别是 ie 盒子模型和标准 w3c 盒子模型。他们对盒子模型的解释各不相同,先来看看我们熟知的标准盒子模型: 从上图可以看到...
  • (1)概念模型,也称信息模型,是按用户的观点来对数据和信息建模,主要用于数据库设计。 (2)概念模型实际上是现实世界到机器世界的一个中间层次。概念模型用于信息世界的建模,是现实世界到信息世界的一层抽象...
  • 概念模型、逻辑模型和物理模型的区别

    万次阅读 热门讨论 2015-10-19 18:56:12
    一直对于概念、逻辑、物理这三个词一知半解。在自考和软考中都遇到了,总是搞混。下面。我们就一起来区分一下吧! 概念模型。  先来看一下概念的解释...通俗来讲,概念模型就是在了解用户的需求后,经过自己的总结,提
  • MapReduce编程模型

    万次阅读 2018-06-29 07:09:53
  • 最近在进行UML学习过程中,突然忘记了大学时关于数据库理论中概念模型、逻辑模型、物理模型之间的区别。随机复习上网并复习,并在此记录一下,数据库建模是对现实世界进行分析、抽象、并从中找出内在联系,进而确定...
  • 星型模型和雪花型模型比较

    万次阅读 多人点赞 2012-08-21 10:26:52
    在多维分析的商业智能解决方案中,根据事实表和维度表的关系,又可将常见的模型分为星型模型和雪花型模型。在设计逻辑型数据的模型的时候,就应考虑数据是按照星型模型还是雪花型模型进行组织。 当所有维表都直接...
  •  ②结构数据模型:面向计算机系统的,用于DBMS的实现,典型代表有:层次模型,网状模型、关系模型,面向 对象模型 (2)数据模型的三要素:  数据结构、数据操作、数据约束。 (3)E-R图(实体-联系图方法):
  • 建立面板数据模型要检验被解释变量的参数和是否对所有个体样本点和时间都是常数,即检验样本数据究竟属于哪一种面板数据模型形式,从而避免模型设定的偏差,改进参数估计的有效性。主要检验如下两个假设: 如果接受...
  • 参数模型和非参数模型的区别

    万次阅读 2015-03-01 15:17:57
    参数与非参数模型 用代数方程、微分方程、微分方程组以及传递函数等描述的模型都是参数模型。建立参数模型就在于确定已知模型结构中的各个参数。通过理论分析总是得出参数模型。非参数模型是直接或间接地从实际系统...
1 2 3 4 5 ... 20
收藏数 2,409,476
精华内容 963,790
关键字:

模型