大数据比赛(3)- 模型选择I

来源:互联网 发布:小米盒电视直播软件 编辑:程序博客网 时间:2024/05/14 05:59

聊完特征,就要说说模型的选择与实现。虽然已经接触了不少机器学习方法和模型,但最近才对监督学习有了一些提纲挈领的认识,在介绍模型的同时对这些零散的知识进行简单的汇总。(谁让我健忘。。)

监督学习的基本模式

陈天奇大大有一篇将boost tree的文章里提到了监督学习的key concepts,抄来加深一下印象:
监督学习要素:样本(标记) 模型 参数 目标函数 优化方法
i. 模型和参数
模型指给定输入xi如何去预测输出 yi。我们比较常见的模型如线性模型(包括线性回归和logistic regression)采用了线性叠加的方式进行预测y^i=∑jwjxijy^i=∑jwjxij 。其实这里的预测yy可以有不同的解释,比如我们可以用它来作为回归目标的输出,或者进行sigmoid 变换得到概率,或者作为排序的指标等。而一个线性模型根据yy的解释不同(以及设计对应的目标函数)用到回归,分类或排序等场景。参数指我们需要学习的东西,在线性模型中,参数指我们的线性系数ww。
• Notations: i-th training example
• Model: how to make prediction given
• Parameters: the things we need to learn from data

ii. 目标函数:损失 + 正则
模型和参数本身指定了给定输入我们如何做预测,但是没有告诉我们如何去寻找一个比较好的参数,这个时候就需要目标函数登场了。一般的目标函数包含下面两项:
• Objective Function(目标函数)
这里写图片描述
常见的误差函数有L=∑nil(yi,y^i)L=∑inl(yi,y^i) 比如平方误差 l(yi,y^i)=(yi−y^i)2l(yi,y^i)=(yi−y^i)2 ,logistic误差函数(l(yi,y^i)=yiln(1+e−y^i)+(1−yi)ln(1+ey^i)l(yi,y^i)=yiln⁡(1+e−y^i)+(1−yi)ln⁡(1+ey^i) )等。而对于线性模型常见的正则化项有L2L2正则和L1L1正则。这样目标函数的设计来自于统计学习里面的一个重要概念叫做Bias-variance tradeoff,Bias可以理解为假设我们有无限多数据的时候,可以训练出最好的模型所拿到的误差。而Variance是因为我们只有有限数据,其中随机性带来的误差。目标中误差函数鼓励我们的模型尽量去拟合训练数据,这样相对来说最后的模型会有比较少的 bias。而正则化项则鼓励更加简单的模型。因为当模型简单之后,有限数据拟合出来结果的随机性比较小,不容易过拟合,使得最后模型的预测更加稳定

iii.优化方法:
给定目标函数之后如何学习模型参数进而优化目标函数,也就是怎么学的问题。不同的模型通常具有独特的优化方法,在讲述模型部分详述

常用模型概述

Tree Ensemble

现在在数据比赛中,效率最高、效果较好的常用模型就是基于分类或回归树的树形模型。下面就已有的一些资料进行简单整理:

基础:

分类和回归树

决策树应当都很熟悉了,实际上是将空间用超平面进行划分的一种方法,每次分割的时候(选择分裂结点)都将当前的空间一分为二, 每一个叶子节点都是在空间中的一个不相交的区域。根据样本特征的取值可以把这个样本划分到某一个叶子节点来得到分类结果。而回归树可以看做分类树的扩展,不同点是在每个叶子节点上对应一个实值得分数,进而完成数值型的预测任务
这里写图片描述

boosting 与 bagging

集成学习方法是机器学习的重要内容,而boosting与bagging就是常用的两种。所谓集成,其实就是将若干个“弱”分类器“绑”在一起构成一个“强”分类器(我来组成头部!!!。。。。)
boosting:通常使用的是AdaBoost(Adaptive Boosting):初始化时对每一个训练样例赋相等的权重1/n,然后用该学算法对训练集训练t轮,每次训练后,对误分类样本赋以较大的权重,(也就是让学习算法在后续的学习中集中对比较难的训练例进行学习),每轮学习后得到的函数(分类器)也依据误分类率获得一个权重,从而得到一个预测函数序列h_1,⋯, h_m,预测效果好的预测函数权重较大,反之较小。最终的预测函数H对分类问题采用‘加权多数表决’的方式,对回归问题采用‘加权平均’的方法对新示例进行判别。
(串行进行的,第k个分类器训练时关注对前k-1分类器中错分的样本。流水作业,每个人都告诉下一个人哪里比较难,有’经验’传承,学的好的人‘发言权’比较大)

bagging:bootstrap aggregating的缩写。训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,(也就是说,某个初始训练样本可以出现多次或根本不出现),训练之后可得到一个预测函数序列h_1,⋯ ⋯h_n ,最终的预测函数H对分类问题采用‘多数表决’方式,对回归问题采用‘简单平均’方法对新示例进行判别。
(可以并行进行,第k个分类器取决于所选取的训练样本。并行作业,每个人随机学习一部分内容,拥有同样的表决权利)

Bagging与Boosting的区别:二者的主要区别是取样方式不同。Bagging采用均匀取样,而Boosting根据错误率来取样,因此通常Boosting的分类精度要优于Bagging,但有些数据集中,boosting会引起退化(Overfit)。Bagging的训练集的选择是随机的,各轮训练集之间相互独立,而Boostlng的各轮训练集的选择与前面各轮的学习结果有关;Bagging的各个预测函数没有权重,而Boosting是有权重的;Bagging的各个预测函数可以并行生成,而Boosting的各个预测函数只能顺序生成。对于神经网络这样极为耗时的学习方法,Bagging可通过并行训练节省大量时间开销。

随机森林 Random Forest

官方版:
随机森林是一个用随机方式建立的,包含多个决策树(CART树)的分类器。其输出的类别是由各个树多数表决而定。
随机性主要体现在两个方面:(1)训练每棵树时,从全部训练样本中选取一个子集进行训练(即bootstrap取样)。用剩余的数据进行评测,评估其误差;(2)在每个节点,随机选取所有特征的一个子集,用来计算最佳分割方式。
随机森林的主要优点:(1)在大的、高维数据训练时,不容易出现过拟合而且速度较快;(2)测试时速度很快;(3)对训练数据中的噪声和错误鲁棒

随机森林的训练过程可以总结如下:(请注意黑体字的行、列采样和sklearn参数)
(1)给定训练集S,测试集T,特征维数F。
以sklearn为例,确定参数:使用到的CART树的数量n_estimators,每棵树的深度max_depth,每个节点使用到的特征数量max_features,终止条件:节点上最少样本数min_samples_split ,节点上最少的信息增益(或者熵)min_weight_fraction_leaf
(2)从S中有放回的抽取大小和S一样的训练集S(i)(‘行采样’),作为根节点的样本,从根节点开始训练
(3)如果当前节点上达到终止条件,则设置当前节点为叶子节点,如果是分类问题,该叶子节点的预测输出为当前节点样本集合中数量最多的那一类c(j),概率p为c(j)占当前样本集的比例;如果是回归问题,预测输出为当前节点样本集各个样本值的平均值,然后继续训练其他节点。如果当前节点没有达到终止条件,则从F维特征中无放回的随机选取f维特征(‘列采样’)。利用这f维特征,寻找分类效果最好的一维特征k及其阈值th,当前节点上样本第k维特征小于th的样本被划分到左节点,其余的被划分到右节点。
(4)重复直到所有CART都被训练过

利用随机森林的预测过程如下:
(1)从当前树的根节点开始,根据当前节点的阈值th,判断是进入左节点还是进入右节点(>=th),直到到达某个叶子节点,并输出预测值。
(2)重复执行(1)直到所有t棵树都输出了预测值。如果是分类问题,则输出为所有树中预测概率总和最大的那一个类,即对每个c(j)的p进行累计;如果是回归问题,则输出为所有树的输出的平均值。

通俗版:
为什么随机森林的效果好?不就是一群战5渣的组合吗?简单来说,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。随机森林就是学习方法中最“百搭”的一种,你几乎可以把任何东西扔进去,它基本上都是可供使用的。(在数据比赛中非常好用,运行速度快,调参比较简单,假设你初步提了几个特征又不知道效果好不好,请选择rf帮你测测;假设你刚改进了一个模型,不知道泛化能力怎么样,请选择rf帮你比比;假如你完全没思路,哈哈哈,请选择rf,因为他比你猜的准)

你以为这就完了?还记的上一篇中的特征选择么?没错,rf可以帮你搞定,它能够处理很高维度(feature很多)的数据,并且不用做特征选择,在训练完后,它还能够给出哪些feature比较重要,训练速度快,还支持并行哦,只要998,万能分类器带回家!!!。。

GBDT -Gradient Boost Decision Tree

Boosted Tree有各种‘马甲’,比如GBDT, GBRT (gradient boosted regression tree),MART(Multiple Additive Regression Tree),LambdaMART也是一种boosted tree的变种,最早的提出者应该是Friedman。
GBDT主要由三个概念组成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage(学习方法,大部分都使用)。DT不用多说就是回归树,GB则是个比较大的命题,老样子,雅俗共赏:
官方版
一般的,损失函数(loss function)描述的是模型的训练误差,损失函数越大,则说明模型越容易出错(不考虑方差、偏差均衡问题)。学习的过程让损失函数持续的下降,则说明我们的模型在不停的改进,而梯度方向是函数下降最快的方向(高数学过吧),神经网络中梯度下降法(SGD)就是这种思想。
在GBDT中,算法流程如下:
(0) 给定一个初始值
(1) 建立M棵决策树(迭代M次)
(2) 对函数估计值F(x)进行Logistic变换
(3) 对于K个分类进行下面的操作(通常为向量操作):

  • 求得残差减少的梯度方向
  • 根据每一个样本点x,与其残差减少的梯度方向,得到一棵由J个叶子节点组成的决策树
  • 为当决策树建立完成后,得到每一个叶子节点的增益(在预测时用)
  • 将当前得到的决策树与之前的那些决策树合并起来,作为新的一个模型

通俗版:
之前介绍的Boost算法是在算法开始的时候,每一个样本赋上一个权重值,在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些误分类点被“严重关注”。然后进行N次迭代得到N个简单的分类器(basic learner)将它们组合起来得到一个最终的模型。
而Gradient Boost中,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。即:

在Gradient Boost中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少。

那什么是残差呢?很简单,残差就是一个加预测值后能得真实值的累加量
抄个例子:

比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学习

Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足

y(i+1) = 残差(y1~yi), 其中: 残差(y1~yi) = y真实值 - y(1 ~ i)
y(1 ~ i) = SUM(y1, …, yi)
Shrinkage不改变第一个方程,只把第二个方程改为:
y(1 ~ i) = y(1 ~ i-1) + step * yi

GBDT适用于各种回归问题,在二分类等分类问题中也有不错的效果。

xgboost -Extreme Gradient Boosting

xgboost在kaggle比赛中大放异彩,是Gradient Boosting Machine的一个c++实现,先放陈天奇大牛文章和讲义:
Boosted Tree http://www.52cs.org/?p=429
讲义 http://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
还有一些相关资料:
xgboost导读和实战 http://vdisk.weibo.com/s/vlQWp3erG2yo/1431658679
XGBoost Parameters
http://xgboost.readthedocs.io/en/latest/parameter.html
XGboost参数设置(译文)
http://blog.csdn.net/zzlzzh/article/details/50770054

简单来说,不同于传统的gbdt方式,只利用了一阶的导数信息;xgboost对loss function做了二阶的泰勒展开,并在目标函数之外加入了正则项整体求最优解,用以权衡目标函数的下降和模型的复杂程度,避免过拟合;
优点是运行速度快、可以并行执行,缺点是参数比较复杂,调参不是很容易。

0 0
原创粉丝点击