胡萝卜(5)

目录

1、stacking模型以及做模型融合的知识

参考:http://blog.csdn.net/sinat_29819401/article/details/71191219
https://zhuanlan.zhihu.com/p/26890738?utm_medium=social&utm_source=qq

型融合是kaggle等比赛中经常使用到的一个利器,它通常可以在各种不同的机器学习任务中使结果获得提升。顾名思义,模型融合就是综合考虑不同模型的情况,并将它们的结果融合到一起。

  • 模型融合主要通过几部分来实现:从提交结果文件中融合、stacking和blending。

1、从提交结果文件中融合

最简单便捷的方式就是从竞赛的提交结果文件中进行融合,因为这样做并不需要重新训练模型,只需要把不同模型的测试结果弄出来,然后采取某种措施得出一个最终结果就ok。

(1)多数表决融合

结果的差异性越高,最终模型融合出来的结果也会越好

周志华教授在他的著作《机器学习》提到,结果的差异性越高,最终模型融合出来的结果也会越好。同样用一个简单的例子来证明:接着上面的话题,假设现在三个模型预测出来的结果是
model1:1111111100 = 80% 准确率
model2:1111111100 = 80% 准确率
model3:1011111100 = 70% 准确率
如果把这三个模型结果用多数表决组合起来,那么最终结果是:1111111100 = 80%,这个结果跟第一、二个模型是一致的,也就是,这样的模型融合对最终结果没有任何的提升。
假如我们现在把三个模型结果改为:
model1:1111111100 = 80% 准确率
model2:0111011101 = 70% 准确率
model3:1000101111 = 60% 准确率
显然这三个模型之间的差异更大,而且表面来看性能也不如前面提到的三个模型,但它们融合出来的结果是:1111111101 = 90% 准确率!

(2)加权表决融合
(3)对结果取平均

2、Stacking

Stacking的基本思想是用一些基分类器进行分类,然后使用另一个分类器对结果进行整合。

用2-fold stacking作为例子:

  • 1.将训练数据分成A和B两份
  • 2.使用第一阶段模型用A训练,然后对B生成预测值
  • 3.通过同样的模型用B训练,生成A的预测值
  • 4.然后使用整个训练集来拟合这个模型,并生成测试集的预测值
  • 5.像第(2)步一样训练第二阶段模型

Stacking的模型可以在特征空间上获取更加多的信息,因为第二阶段模型是以第一阶段模型的预测值会作为特征。
这里写图片描述

3、Blending

Blending与Stacking大致相同,只是Blending的主要区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,

而是建立一个Holdout集,例如说10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。说白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。

Blending的优点在于:

  • 1.比stacking简单(因为不用进行k次的交叉验证来获得stacker feature)
  • 2.避开了一个信息泄露问题:generlizers和stacker使用了不一样的数据集
  • 3.在团队建模过程中,不需要给队友分享自己的随机种子

而缺点在于:

  • 1.使用了很少的数据(第二阶段的blender只使用training set10%的量)
  • 2.blender可能会过拟合(其实大概率是第一点导致的)
  • 3.stacking使用多次的CV会比较稳健

对于实践中的结果而言,stacking和blending的效果是差不多的,所以使用哪种方法都没什么所谓,完全取决于个人爱好。

Stacking 模型融合 再述
两层

这里写图片描述
因为这张图极具‘误导性’。(注意!我没说这图是错的,尽管它就是错的!!!但是在网上为数不多教学里有张无码图就不错啦,感恩吧,我这个小弱鸡)。

我把图改了一下:
这里写图片描述
对于每一轮的 5-fold,Model 1都要做满5次的训练和预测。

Titanic 栗子:
第一步

Train Data有890行。(请对应图中的上层部分)

每1次的fold,都会生成 713行 小train, 178行 小test。我们用Model 1来训练 713行的小train,然后预测 178行 小test。预测的结果是长度为 178 的预测值。

这样的动作走5次! 长度为178 的预测值 X 5 = 890 预测值,刚好和Train data长度吻合。这个890预测值是Model 1产生的,我们先存着,因为,一会让它将是第二层模型的训练来源。

重点:这一步产生的预测值我们可以转成 890 X 1 (890 行,1列),记作 P1 (大写P)

第二步

接着说 Test Data 有 418 行。(请对应图中的下层部分,对对对,绿绿的那些框框)

每1次的fold,713行 小train训练出来的Model 1要去预测我们全部的Test Data(全部!因为Test Data没有加入5-fold,所以每次都是全部!)。此时,Model 1的预测结果是长度为418的预测值。

这样的动作走5次!我们可以得到一个 5 X 418 的预测值矩阵。然后我们根据行来就平均值,最后得到一个 1 X 418 的平均预测值。

重点:这一步产生的预测值我们可以转成 418 X 1 (418行,1列),记作 p1 (小写p)

走到这里,你的第一层的Model 1完成了它的使命。

第三步

第一层还会有其他Model的,比如Model 2,同样的走一遍, 我们有可以得到 890 X 1 (P2) 和 418 X 1 (p2) 列预测值。

这样吧,假设你第一层有3个模型,这样你就会得到:

来自5-fold的预测值矩阵 890 X 3,(P1,P2, P3) 和 来自Test Data预测值矩阵 418 X 3, (p1, p2, p3)。


第四步
到第二层了………………

来自5-fold的预测值矩阵 890 X 3 作为你的Train Data,训练第二层的模型
来自Test Data预测值矩阵 418 X 3 就是你的Test Data,用训练好的模型来预测他们吧。


最后 ,放出一张Python的Code,在网上为数不多的stacking内容里, 这个几行的code你也早就看过了吧,我之前一直卡在这里,现在加上一点点注解,希望对你有帮助:
这里写图片描述

2、怎样去优化SVM算法模型的?

SMO算法是支持向量机的快速算法,不断的将原二次规划问题分解为只有两个变量的二次规划子问题求解,直到所有变量满足KTT条件,这样通过启发式的方法得到原二次规划问题的最优解。

libsvm和liblinear

3、现有底层是tensorflow的keras框架,如果现在有一个tensorflow训练好的模型,keras怎么读取?

keras应该可以直接load tensorflow的h5 weight

4、卷积层为什么能抽取特征? Pool层的作用

参考:http://blog.csdn.net/jiejinquanil/article/details/50042791

激活函数的种类和特点?

  • sigmoid 、反正切tanh 都有梯度消失问题
    relu 快,问题:负值0梯度

激活函数的作用?

  • 非线性。

卷积层为什么能抽取特征?

  • 卷积层负责提取特征,采样层负责特征选择,全连接层负责分类
  • 卷积神经网络的特点就是权重共享,利用不同的卷积核对输入的图像进行卷积,可以得到一张张特征图

多种滤波器和对应的滤镜效果,比如边缘检测、锐化、均值模糊、高斯模糊
这里写图片描述

Pool层的作用

  • 下采样层就是使用pooling技术将小邻域内的特征点整合得到新的特征。
    pooling确实起到了整合特征的作用
  • pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此
  • pooling目的是为了保持某种不变性(旋转、平移、伸缩等),常用的有mean-pooling,max-pooling和Stochastic-pooling三种

5、LR模型

在线性回归的基础上加了sigmoid函数,所以变成了分类模型,输出可以表示概率。

采用似然估计构造目标函数,目标是优化最大似然估计,公式H(x)=-(ylogf(x)+(1-y)log(1-f(x)),一般优化方法采用的是梯度下降法

6、LR模型为什么采用似然估计损失函数

1.最小二乘法反映的是线性空间上的线性投影的最短距离,在非线性空间上表现不如MLE。(MLE可以看作一种特殊情况下的Bayesian 估计)

2.如果采用均方差最损失函数的时候,梯度下降求偏导时会有一项导数项,这样会导致梯度在一定阶段会收敛的特别慢,而对数损失函数log正好能和sigmoid的exp抵消掉,会加快收敛速度。

最小二乘法是高斯分布下最大似然估计的一般结果,LR是伯努利分布下最大似然估计的一般结果(交叉熵损失),所以两者本质上都是最大似然估计

7、了解深度学习吗?能否讲下CNN的特点?

CNN,特点是局部感受和权值共享

通过卷积核扫描原始数据能够学习到不同的局部的特征,接着通过池化进一步提取特征,这些做的能够让参数数目有量级的减少,同时权值共享是同一层隐含层共享权值,这样也是减少了隐含层的参数,很多卷积核学习的到特征最后传递到下一层网络,到最后一层采用分类器分类

深度学习解决了以往神经网络深度网络很多问题,
梯度消失爆炸问题,几个方面:

  • 一是激活函数不光是只用sigmoid函数,还有 ReLU函数
  • 二是在参数并不是初始化的时候并不是随机选择的,而是在前面有自编码器做了特征特征器,这样避免了梯度下降法求解陷入局部最优解;
  • 三,深度学习一些手段,权值共享,卷积核,pooling等都能抑制梯度消失问题
  • 四,二次代价函数换成交叉熵损失函数或者选用softmax+对数似然代价函数的组合。

8、说说RBM编码器

RBM包括隐层,可见层和偏置层。可见层和隐含层可以双向传播。标准的RBM,隐含层和可见层都是二进制表示,既激活函数的激活值服从二项分布。每一层的节点没有链接,如果假设所有的节点都只能取0或者1,同时全概率分布p(v,h)满足伯努利分布。

几个参数:

  • 1.可视层和隐含层的权重矩阵
  • 二是可是节点的偏移量
  • 三是隐层的偏移量。
    这几个参数决定将N维的样本编码M维的样本。

用途:

  • 1.降维,类似稀疏自动编码器
  • 2.用RBM训练得到的权重举证和偏移量作为BP神经网路的初始值,避免陷入局部极小值
  • 3.可以估计联合分布P(v,h),进而求出p(h|v)。生成式模型
  • 4.直接计算p(h|v)进行分类。判别式模型

9、进程和线程的区别

有一个是进程的开销比线程大,通信麻烦一些,但更安全,所以很多时候我们用多线程加速,但有时候线程用不了,只能用进程

  • python,为了加速尝试过很多方法,比如GPU加速、C++动态库调用、还有就是多进程。

为什么要用多进程加速。

  • 因为python这个语言是解释型语言,本来用来进行cpu密集型计算就不适合,还有就是python没有类型,因为全是用哈希表实现的动态内存分配方式,\
  • 比如你定义a = 2 ,其实底层的实现是先分配一个内存块,在用一个指针指向这个内存块,最后返回的是这个指针。
  • 最重要的一点是当初在设计python的时候,为了图简单,加了一个全局锁,也就是一个时刻只能使用一个线程,多核完全浪费了
    。。。此处省略。。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值