本文于本人在2017.12.19于csdn首发
现在修改重新复盘回顾
比赛介绍
给定用户人口统计特征,歌曲信息,预测用户听了某歌后未来一个月内是否会重新聆听
数据集
约三四万的用户
约两百多万首歌
用户-歌曲对 测试集和训练集共有约一千万个
时间分配
时间上的分配:印象中开始打了两周左右就丢那里了吧,结尾一周多又去打了…
中间没去搞犯懒癌
不过最后还是拿到了一个比较满意的成绩,13名。
不过差一点就金牌了呀!!! emmmm…
自己的trick
挑一些比较重要的
- 计数特征 : 比如歌曲被播放次数,用户听歌次数,歌手被听次数等等,就是一些热度特征 活跃度等等重要指标
- 条件概率特征 : 批量生成 P(歌曲|用户) P(用户|歌曲) P(作词人|用户) 等等等等
- 相似度 : 将用户,歌曲,歌手的网络结构拓扑图丢给node2vec对用户,歌曲,歌手进行编码,再计算他们的皮尔森相关系数作为他们的相似度
- 按时间轴加权,离当前时间越近的权重越高
- 依赖时间的计数/条件概率特征依照时间窗口滑窗生成
- 试过神经网络embedding,歌手歌曲用户进行词嵌入来学习,搭了一个1D的类DesnseNet结构,分数最高也就68点多。于是乎放弃(其实现在看来初始化不行,那时候应该先node2vec预训练的,无论对树和神经网络效果都应该很bug
- 尝试过数据集分历史数据和当前两部分,lgbm对历史数据进行训练再对当前数据预测输出样本的叶子节点信息,一般般
top1,top3的做法
- 生成用户歌曲对特征,SVD分解获得用户歌曲对向量,将向量整个作为特征显著提升
这个当时没做,那时候好像因为最后一两周才回来搞没啥时间了,也不敢svd直接分内存太大了
讲道理node2vec也可以替代的不是 - top1使用了样本的上下文信息(过去与未来的log)
现在看来无论top1还是top3上下文信息的利用的不够干脆
样本非独立,除了用户上下文信息可以用,歌曲上个时间点被谁听了,下个时间点等…
神经网络讲道理也可以用的 - top1尝试了伪标签但效果不好
话说这里那次比赛就有人用伪标签…居然被我忽略了,我那时候眼神不好吧…
这里效果不好很显然,上次毒性分类比赛效果好是因为模型生成的伪标签质量高噪声小
这里平均只有七十多的正确率的标签噪声太多… - top3数据全转为数字保存为hdf这种图片格式,貌似比csv读写快?
- top3也将数据分成了历史信息和当前信息,将数据索引作为时间轴
(1)上下文信息
(2)统计了一堆历史信息中和label相关的特征放到当前信息中,最终将当前的数据样本放进去训练
现在感觉这种操作比较冗余
其他体会
高性能编程超级超级超级重要,从那次和之后的比赛看出多核,GPU的优势必须用出来
有些复杂的特征必须要快速造出来
没干的事
集成最后也比较草草的直接加权,毕竟没啥时间了。
调参也没调,不过正好说明了老生常谈的论特征的重要性
恩,最后….以后一定得大胆想大胆试,人有多大胆地有多大产hh