题意具体可参看,很明显是一个回归问题,经历下来发现数据的可挖掘性不是很大,总体来说大家的特征都差不多,关键是找到几个强特,有些特征合在一起使用效果并不是很理想,可以构造多套特征,特征之间有差异性,然后再融合,效果会好些。但总体来说此次赛题都是在拼数据、拼模型了。本博客主要学习了第二名的思路和代码,在此表示感谢,详情请参考最后链接。
1. 赛题理解
本赛题数据被主办方处理过,缺失值都被 0 填充,导致很难区分是缺失还是 0 值,还有一些数据被取整和做了分箱操作,因此适当处理源数据有一定提升。
2. 特征工程
强特有:
- 充值方式
- 用户消费稳定性
- 用户留存率
其他的特征:
- 前五个月消费总费用 = 6 * 近六个月消费总费用 - 当月费用
- 当月费用 - 前六个月平均费用
- 当月费用 - 前五个月消费总费用/5
- 入网月份 = 网龄 mod 12
- 布尔型特征相加
- 年龄、网龄分箱
- 是否998折
- count_最近一次缴费金额
- count_当月总费用
- count_前六个月平均费用
- count_费用差
- count_(当月总费用,前六个月平均费用
target 做了np.power(1.005, x)变换。
3. 模型
3.1 主要模型
主要尝试了树模型,包括 lightGBM,XGBoost,CatBoost,GBDT,RandomForest。
3.2 损失函数
至于损失函数则有 mse,mae,huber 和自定义介于 mse 与 mae 之间的损失函数。
3.3 模型融合
模型融合采用了 huber_regressor 作为学习器,可以很大的克服异常值带来的影响,鲁棒性很强,其他团队基本都采用线性加权和分段融合,其实这些融合都要根据不同数据来进行权重参数调整鲁棒性没有那么强。
之前也尝试过很多种融合方法,加权和分段融合也都采用过,stacking第二层的模型也进行过很多种尝试大部分都是收效甚微。
4. 收获
可以练习所有树类算法模型的训练,以及 Stacking 的具体操作。先对各个树模型训练时记录两个结果,一个是 oof 的验证部分的结果(当成 val),第二个是对 test 进行预测的结果,然后集合所有存下来的结果(这里一共有 17 个模型的结果),利用 HuberRegressor 进行学习一个模型,做一个 Stacking 得到最终结果。这里 HuberRegressor 的训练数据的大小是 $m \times 17$($m$ 是训练样本个数,17 是模型个数),那么每一行的数据表示对某一个预测样本,17 个模型在之前一步的预测结果作为这一部分的特征来训练 HuberRegressor,然后在测试集(大小为 $n \times 17$,$n$ 为测试集样本个数)进行测试,结果取平均。
References
- 消费者人群画像—信用智能评分 首页
- 建模评估用户信用值?——《消费者人群画像——信用智能评分》赛题深度解析
- 消费者人群画像—信用智能评分竞赛总结
- 竞赛解决方案:消费者人群画像—信用智能评分
- Baseline
- Top 1 Solution
- TOP2 in Github
- Top 3 Solution
- Top 5 Solution