开发者学堂课程【天池大赛算法教程及获奖选手答辩:新手入门赛-(o2o)离线赛实战视频】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/389/detail/4995
新手入门赛-(o2o)离线赛实战视频
内容介绍:
一、常见的模型重要参数解释
二、训练集、测试集划分经验
三、常用的模型融合方法
一、常见的模型重要参数解释
几种概念的解释
第一个概念是关于机器学习当中的集成学习,也有称之为提升方法的基本思想。
其基本思想是从多个简单模型当中,通过集成,得到一个比较复杂的模型来解决一个问题。
常见的材料总结,其他学习主要有两个主要思路,分别是 bargain 和 boost in。么,个 RF 和 GBDT,其中分别属于这两种思路的实践成果。
第二个概念是机器学习当中模型的偏差和方差。模型的偏差可以理解成对于模型预测精确度的估量。
偏差越小,模型预测越精确。模型的方差可以理解为模型的泛化能力,即模型预测的稳定性。
不稳定的模型通常表现为在训练集上预测的非常精准,但在测试题上预测的很差,即出现了过拟合现象。
(1)常见的模型重要参数解释:RF
(参sklearn.ensemble.RandomForestClassifier)
n_estimators: 随机森林中决策树(子模型)的个数(根据数据规模设定,一般100-10000均可,越大时间开销越高,但可以降低模型整体方差)
criterion: 判断节点是否继续分裂采用的计算方法(entropy或gini)
max _features: 节点分裂时参与判断的最大特征数(根据特征规模,可设固定值,百分比、sqrt(开方)、log2(对数)等,可以给子模型引入随机性)
max_depth: 最大深度,如果 max_leaf_nodes 参数指定,则忽略此参数(一般6-10,越大子模型偏差越低,方差越高)
min_samples_split: 分裂所需要的最小样本(根据数据规模设定,一般1-100均可,越小越容易过拟合)
min_samples_leaf: 叶结点最小样本数(根据数据规模设定,一般1-100均可,越小于模型越复杂,越容易过拟合)
class_weight: 类别权值(根据实际情况设定,可以用来处理样本类别不均衡)
bootstrap:是否进行有放回采样(一般为 True,可以降低子模型间相关度,降低模型整体方差)
(2)常见的模型重要参数解释:GBDT
(参考sklearn.ensemble.GradientBoostingClassifier)
n_estimators: 同 RF
loss: 模型的损失函数(可选 deviance,和 LR 的损失函数一致,可用于需要概率输出的多分类务;或 exponential,模型等同于二分类 AdaBoost)
learning_rate:学习率,也成为缩减(一般设0.01-0.3都有,越小模型训练时间开销越大,模型偏差越小,方差越大,通常与 n_estimators 联调)
subsample :子采样率(样本采集率,降低子采样率可以降低子模型间相关度,可以降低模型差,但是也会增加模型偏差,所以一般设0.6-1)
max_features
:同 RF
max
_
depth
: 同 RF
min_samples_split
:同 RF
min
_
samples
_
leaf
:同 RF
(3)RF 和 GBDT 的对比
一般情况下,RF 整体模型的训练和调参主要关注降低方差,所以可以设定较少的子模型并适当提高子模型复杂度,并且可以适当降低子模型间的相关度。
而 GBDT 一般情况下主要关注于降低偏差,所以可以设定较多的子模型并适当降低子模型的复杂度,但是降低子模型间的相关度起到的作用则比较小。
神器推荐:XGBOOST
XGBOOST。几乎可以在各种国内外的大小竞赛当中看到它的身影。在工业界当中也有广泛的应用。在基于传统机械学习的基础上,在实践过程当中进行了很多的改进。
主要有以下这几个方面。
第一,在函数当中引入了正则项。可以控制模型的复杂度,从而减少过拟合的风险。
第二,模型的分裂会一直分裂到参数设定的最大的深度,再回过头来剪枝。这样的好处是避免一些更深层次的分裂因为一些初期条件不满足被忽略掉。
第三,可以自动处理缺失值,这点是在用 XGBOOST 的时候是直观感受最明显的一点。因为缺失值是很多数据当中都会出现的,过往的做法都是自己进行评估,然后赋予缺失着一个给定的值。但 XGBOOST 是把缺失值也作为一个有意义的值,然后考虑当遇到趋势的时候是否分裂,再决定如何分裂。
第四点,允许自定义优化目标和评价标准。可以使模型更加的灵活。
第五点,支持列采样。借鉴了RF当中,对于特征进行采样的特点。这样不仅可以降低风险,同时也减少了计算量,提高了效率。还有支持并行等一些其他特点。
没有再对 XGBOOST 进行详细的参数解释,一个原因是因为都是树模型,很多参数在之前都有体现。
另外一个原因则是有不错的官方文档,非常全面,包括对于每个参数的解释。推荐大家仔细的研读,在实践过程当中发现 XGBOOST 的强大之处。
XGBOOST 与传统 GBDT 的不同
在代价函数中引入正则项,控制模型复杂度
分裂至最大深度,再剪枝
自动处理缺失值
允许自定义优化目标和评价标准
支持列抽样,不仅可以降低过拟合,还可以提高效率支持并行等等。
官方参数文档
二、训练集、测试集划分经验
首先需要讲到一条机器学习当中的重要的原则。就是不管做什么及其学习的任务,分类、回归或者是标注,都需要尽可能的来模拟真实的测试环境。
非常重要是因为机器学习的本质就是从数据当中发现规律,我们就必须要保证数据和任务的目标的一致性。
举个例子,通过观测北京人的患肺病的数据能够说明中国人的发病的概率。
因为即使是同为中国人,大多数的外界因素还有环境,比如说雾霾,这种因素也可能会导致北京人的患病几率更高,或者一些其他影响,这都是显而易见的。
将这个例子一般化,就是说如果训练集当中的数据采样有偏差,那么学习得到的模型也一定是有偏差的。这就要求我们必须尽量保证训练集的数据分布和整体的数据分布是基本一致的。这样训练得到的结果才会尽可能的接近真实的情况。
在实际的比赛当中,普及方给我们的训练集和测试几并不都是具有与之分布的。数据如果划分的不好一般情况下都会导致严重的过拟合现象。
因此,正确地理解数据分布,通常是我们拿到赛题之后,第一步要做的事情。同时也是成功的第一步。
机器学习重要原则:模拟真实的测试环境!
如果训练集的数据采样有偏差,学习得到的模型也一定有偏差
若样本整体分布基本一致:常用的随机 K-Fold 的 CV 方法即可
若样本整体分布不一致,如受“时间”影响等
使用随机划分的方法通常会带来极其严重的过拟合
如果数据呈现明显的时间序列特征,可采用滑窗法
三、常用的模型融合法
模型融合旨在通过融合多个单模型的结果,降低模型方差
融合基础:多个有差异性的基本模型
常用方法:
线性加权融合
Rank 融合
tacking
Blending
线性加权融合:赋予每个模型一个权重 Weight,然后加权得到最终结果。权值的决定一般遵循较优模型给予较大权值的原则,且所有权重和为1。
∑weighti *resulti
Rank融合:取结果中排名的倒数,加权得到最终结果适合排序评估指标,如 AUC.
∑weighti/ranki
Stacking
训练:将训练数据进行K-Fold划分,训练出K个不同的基础模型,其中每个基础模型对于每个训练样本的预测值作为新的训练集的特征值,在新得到的训练集上再进行第二层训练。
预测:经过所有基础模型的预测形成第二层模型的测试集,再对测试集进行预测。
Blending(又称为 stacked ensembling)
与 stacking 很类似,区别在于不需要对训练集进行 K-Fold 划分,直接划出一部分训练集数据作为留出集,第一层模型只在留出集上训练。
优点:比 stacking 简单;能防止信息泄露
缺点:只使用了整体数据的一部分;最终的模型可能会对留出集过拟合;相对来说 stacking 更为健壮。
参考:Kaggle ensemble guide
Blending 实战—— O2O 优惠券使用预测
1.将训练集划分为两份,Dataset_1 和 Dataset_2。
2. 基于 Dataset_1训练了12个不同模型。
3. 将第一层模型在 Dataset2 的特征上预测的结果作为第二层模型的新的特征,标签不变,训练第二层模型 XGBOOST。
4. 基于这两层模型做最终的测试集预测。
常用的模型融合方法
机器学习重要原则:No Free Lunch!
模型融合多数时候是有效的。
但并非越复杂的模型融合方法带来的结果一定越好,实践过程中最好的方法还是多尝试,多思考。