Home Credit

说起来这个比赛打起来体验极差…
线上线下琢磨不透…
时间上花了两周,最终结果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的样子
早知道最后一天随便跑跑了几个模型搞点儿差异性出来了…
小可惜,不过投入也不算多,不是特别心疼吧

这个比赛看下来搞特征的思路大多不是特别稀奇
强特的话批量找慢慢找都可以找出来的吧
主要是筛选工作和批量搜索的时候缩小搜索范围

我做的主要有

  1. 时间差分特征 xt - xt-1
  2. 趋势特征 过去一段时间内某变量的随时间变化趋势(即斜率)
  3. 趋势预测特征 用2所得的斜率预测当前值的预测值
  4. 一条record缺失值个数
  5. 特征分bin,计算各bin中的样本,数作为特征
  6. 一些条件概率,共现概率特征
  7. target encode
  8. 批量搜索单位具有实际意义的特征,例如 钱/钱 , 钱/次数 , 次数/次数 , 次数 - 次数, 时间-时间
    这么做的主要目的是减小搜索空间,毕竟几百个特征两两组合筛不过来呀

我的收益几乎都来8 …
后来工作没干完就跑了,恩…

还有一些其他的思路下面再讲

筛选主要是这样的:

我首先划定了top550收益的特征,因为划到550我的cv上升了
然后每次批量生成几百个特征的时候留下gain落在top300的特征
注意事项: 必须要尽量缩小特征的生成量,因为特征生成的太多,收益均摊到各个特征上,导致大部分特征收益都很接近
这时候不利于筛选

集成上虽然没做,但简单简述dissussion的magic集成思路
即用rank score进行集成
如果了解auc的话这个集成方式其实很容易想到

  1. 因为AUC是排序指标
    这种集成方式还有一个优势
  2. 因为不同的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 就这样吧