array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 机器学习21:Ensemble - 爱码网

这部分主要介绍Ensemble的方法

为什么我们需要Ensemble的方法

在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。

常见的Ensemble方法

Ensemble一般有下面的bagging、boosting,stacking的方法

Bagging

机器学习21:Ensemble
这张图横坐标代表模型的阶次,也可以看做模型的复杂度。红线是模型预测与真实值之间的bias,绿线是模型预测与真实值之间的variance,蓝线是观测误差。我们可以看到随着模型逐渐复杂,训练的结果从underfitting到overfitting。我们使用bagging主要是解决数据充足下的overfiting的问题。

Bagging的原理

使用多组数据,通过训练来得到若干个预测的训练模型,我们可以通过对复杂模型取平均来降低variance。
机器学习21:Ensemble
Bagging即套袋法,使用一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:

A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

机器学习21:EnsembleC)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同

下面介绍一种Bagging的方法

随机森林——random forest,在随机森林中,集成中的每棵树都是由从训练集中抽取的样本(即 bootstrap 样本)构建的。另外,与使用所有特征不同,这里随机选择特征子集,从而进一步达到对树的随机化目的。

因此,随机森林产生的偏差略有增加,但是由于对相关性较小的树计算平均值,估计方差减小了,导致模型的整体效果更好。

下图是一个例子:
机器学习21:Ensemble
我们给出一张图,这张图的人物处的像素值设置为类别1,其余为类别0
机器学习21:Ensemble我们使用一棵决策树做决策的结果如上图所示,当深度越深效果越好,能够完好的表现出结果,需要大概深度为20.

机器学习21:Ensemble

上面是我们使用Random forest: Bagging of decision tree的方法对数据进行训练。但是仅仅只是随机采样训练数据是不够的。因为相似的数据可能会导致训练出的决策树很相似,从而影响结果。我们需要在每次决策树产生分支时,随机规定了在分支中可使用的分类特征,例如在这一层只能使用横坐标进行分类,或者下一层仅对纵坐标的范围进行分类。

最后使用Out-of-bag的方法进行测试,这个也叫oob方法。例如我们使用x1和x2训练f1,x1和x3训练f3,f2和f4没用使用x1,因此我们使用随机森林f2+f4来评估x1中数据的预测结果。

Boosting的方法

上面说完了Bagging的方法,下面介绍一种Boosting的方法。其主要思想是将弱分类器组装成一个强分类器。
对于这个模型,如果你的错误率可以达到0.5以下,那么就可以使用这种Boosting的方法使得错误率降低到0(理想状态下)。

运行框架是:

1、获得第一个分类器
2、重新选择训练数据集,使得分类器失效,错误率为0.5
3、使用新的训练集训练第二个分类器,循环2和3
4、最后将所有的分类器集合在一起

如何获得不同的训练数据集

1、直接对训练集采样,得到一个新的数据集
2、给训练数据不同的权重值,相当于改变数据分布的占比,来得到新的数据集
3、也可以只改变训练模型的损失函数

Idea of Adaboost

boost的方法有很多,这里介绍一种最经典Adaboost的算法。
其训练集的重现选择是上面的第二种方法:
首先给出错误率的计算公式:
机器学习21:Ensemble
可以简单验证得到上式小于0.5,
改变权重,使得误差到0.5,也就是对于f1,其结果是随机的。之后用这组权重来训练新的模型。

改变权重的方法

机器学习21:Ensemble
如果x会分类错误,倍乘一个系数d,如果不出错,则会除以系数d
利用错误率0.5,我们可以得到下面的等式
机器学习21:Ensemble

数学推导

机器学习21:Ensemble
对于训练误差有上面的不等式成立
机器学习21:Ensemble
我们先计算Zt是训练数据的权重之和,我们不妨先推导Zt+1的结果。
假设Z的初始值是1,之后每次都是原本的值数乘上一个参数。我们有每个样本的权重递推公式ut,因此我们可以得到Zt+1的表达式,进一步化简合并成后面的形式。
机器学习21:Ensemble
再利用右侧的条件,我们可以写出上面的公式的化简结果,用红框表示的结果
机器学习21:Ensemble
最后我们可以使用Zt的递推公式得到最后的结论,训练误差是无数小于1的值的乘积,随着T增加,逐渐减少

例子

机器学习21:Ensemble
使用Adaboost+Desicion Tree的方法,最后得到的判别结果。

总结通常的Boosting方法

每次寻找一个function f 和一个参数 a 去提高已有的预测模型function g,其输出是function g的结果的符号。

我们的总模型function g的学习目标是是损失函数最小化,也就是下面这个式子
机器学习21:Ensemble
这个式子要求标签 y 和预测值 g 尽可能同号,且乘机结果尽可能大

梯度提升Gradient Boosting

我们从梯度下降的角度看和从boosting的方法来看优化问题
机器学习21:Ensemble
在上面我们得到方向要尽可能一致
这样可以视作最大化下面的式子
机器学习21:Ensemble
极大化的式子前面部分,就是每一个example的adaboost weight

之后是a的值的确定,Gradient Boosting做法是已经确定了f,之后尝试a的值,来找出最好的a。这是因为在前面迭代 f 的过程比较费时间,在这里使用最优的参数a,可以加快整体的收敛时间。使用下面的损失函数,最后找到的结果。
机器学习21:Ensemble
我们可以得到其参数 a 的选择正好的 adaboost 的结果

Stacking

这是用来将不同的model的训练结果结合在一起的方法。
Stacking方法是指训练一个模型用于组合其他各个模型。
首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。
理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可。但在实际中,我们通常使用logistic回归作为组合策略。
机器学习21:Ensemble

相关文章: