595. Playground Series - Season 4, Episode 1 | playground-series-s4e1
大家好。我的解决方案对于那些没有时间进行大量实验的人来说可能是一线希望 ;)
我的解决方案背后的主要思路(或者说唯一思路)是利用数据集的"合成特性",基本上忽略竞赛主题本身。
第一步是自动从以下特征集合中生成所有1至10个元素的子集:['信用分', '地区', '性别', '年龄', '任期', '产品数量', '是否有信用卡', '是否为活跃会员', '预估薪资', '余额']。
然后,对于每个子集,检查它是否原封不动地出现在原始数据集中。如果是,则该特征值为1,否则为0。
示例(伪代码):
subset = ['信用分', '地区', '余额']
x1 = 1 if subset in original_dataset else 0
为什么这样做?我注意到,通过这种方式构建的特征,其目标分布与整个数据集的基本值0.21完全不同。以上述特征为例:
df_train.groupby('x1').Exited.mean() 的结果:
False 0.171026
True 0.269552
或对于 ['信用分', '性别', '产品数量']:
False 0.203034
True 0.707857
我还向这约1000个特征中添加了子集[客户ID, 姓氏]。
实际上,除此之外什么都不需要做 :)
首先是基础模型:
lgbm:选择50个特征(包括基础特征),未过度调参,私有排行榜得分0.90203
autogluon:包含所有特征,预设参数为'best_quality',时间限制14400秒,私有排行榜得分0.90378
简单集成:(lgbm+autogluon)/2,在私有排行榜上得到我的最终得分 - 0.90462
在最新提交中虽然加入了一些公开特征,但提升并不明显。
当然,我也加入了@paddykb的"好运技巧" :),在我的方案中提升了+0.01,略低于预期的0.02,这可能是因为我的特征部分解释了该数据集的这种"奇怪"行为。
就是这样 :)
感谢每一位参加本次竞赛的人,并请记住:如果在现实生活中你需要预测客户流失,不要向客户索要生成你数据集的原始数据集 :)