说起来这个比赛打起来体验极差…
线上线下琢磨不透…
时间上花了两周,最终结果single model cv 0.8004
开始三天在那抄抄dissussion和kernel里的代码拿到了cv 0.7963
后来觉得这样不行
后来花两天重构了下了代码,优化并行了特征生成部分
开始逐文件批量生成特征,再进行筛选 (毕竟一个变量名都看不懂)
接着效率大大提高,分数逐渐上升到8004
但是在这途中lb一直很差只有和cv差不多的分数
然后就丢了干别的比赛去了,打的烦啊,工作无聊机械,lb还上不去
最后一天把自己的oof和submit丢给队友就跑了
队友提交的最终cv是0.801吧
第八名的single model cv是0.799 集成804的样子
早知道最后一天随便跑跑了几个模型搞点儿差异性出来了…
小可惜,不过投入也不算多,不是特别心疼吧
这个比赛看下来搞特征的思路大多不是特别稀奇
强特的话批量找慢慢找都可以找出来的吧
主要是筛选工作和批量搜索的时候缩小搜索范围
我做的主要有
- 时间差分特征 xt - xt-1
- 趋势特征 过去一段时间内某变量的随时间变化趋势(即斜率)
- 趋势预测特征 用2所得的斜率预测当前值的预测值
- 一条record缺失值个数
- 特征分bin,计算各bin中的样本,数作为特征
- 一些条件概率,共现概率特征
- target encode
- 批量搜索单位具有实际意义的特征,例如 钱/钱 , 钱/次数 , 次数/次数 , 次数 - 次数, 时间-时间
这么做的主要目的是减小搜索空间,毕竟几百个特征两两组合筛不过来呀
我的收益几乎都来8 …
后来工作没干完就跑了,恩…
还有一些其他的思路下面再讲
筛选主要是这样的:
我首先划定了top550收益的特征,因为划到550我的cv上升了
然后每次批量生成几百个特征的时候留下gain落在top300的特征
注意事项: 必须要尽量缩小特征的生成量,因为特征生成的太多,收益均摊到各个特征上,导致大部分特征收益都很接近
这时候不利于筛选
集成上虽然没做,但简单简述dissussion的magic集成思路
即用rank score进行集成
如果了解auc的话这个集成方式其实很容易想到
- 因为AUC是排序指标
这种集成方式还有一个优势 - 因为不同的loss输出的预测值在[0,1]的方差不同,密度不同,期望也不同
直接加权可能问题就很大了
一种方式是把他们直接minmax缩放到[0,1],但这个没解决密度问题
另一个很简单的思路就是把预测值投射到rank上
其他人的特征思路
对样本聚类500,然后用这个类别进行target encode
(话说聚类这东西我一直玩儿不溜,这东西到底能不能用自己每次都是试了才知道,所以要做都会堆到后期,没一点经验性的参考)
因为ext_1缺失值特别多,但他是重要特征,所以建立模型预测该特征作为新特征
这个带来收益也比较大
整个比赛里貌似只有第二名的方式是个亮点
他发现了样本以时间序排序,他用一些时间差分的特征如出生日期-上班日期等等特征得到了user_id
然后根据user_id和历史上下文信息对target进行编码得到了很大的提高
见https://www.kaggle.com/titericz/visualizing-user-ids
emmmmm 就这样吧