根据比赛的评价指标自定义模型的损失函数
log变换
这里我们对训练目标进行了不断优化,首先是最基本的训练目标,即广告日曝光量。然后考虑到0会导致梯度不平滑,所以对训练目标做了log变换,保证梯度平滑。
清洗数据
1.去除异常值
2.对于不那么重要的缺失值,补0或-1;对于与label相关性较强的缺失值,补中位数
对时序数据的理解
我们知道复赛A榜训练集和测试集是连续的,即10号-22号训练集,23号为测试集。复赛B榜则是不连续的,没有给出23号的标签,直接预测24号。
面对这种“跨天”预测,难度是非常大的,因为日期越近的信息是越与当天相近的,因此前一天的信息是非常重要的。
1.我们利用“远程监督”的方式,就是利用现有的标注数据,即10-22号数据,训练一个模型,给未标注数据(23号数据)进行标注,然后再将10-22与23号合并成训练集进行训练,预测最终的结果。
2.对于与label关系较密切的特征,取其距离test日期最近的值为一新特征
构造统计特征
除常见统计量count mean sum,还有result[col+’_negs’] = result[col+’_count] - result[col+’_sums’]
将数据分成前一天、最近五天、五折交叉统计和除当天外所有天来分别统计特征
处理连续值特征
例如时间
先离散化,再取one-hot向量
处理ID对
例如uid和对应的itemid组合
取uid最常访问的前k个itemid作为特征(多值特征)
新物品冷启动
对于没有历史数据的物品,取具有相似特征的旧物品,将旧物品的历史数据特征赋予新物品
Embedding 特征
产生Embedding向量的方法有两种:word2vec和deepwalk
分别可以groupby主键,取副键的序列求Embedding向量,通常为groupby uid,取aid,itemid,authorid的Embedding向量
word2vec
首先是对日志数据按天进行排序,然后是按天构建uid的行为序列并转化
这里不仅可以构造uid到广告id,还可以是uid到商品id,uid到账户id。
deepwalk
- 只有在日志中曝光过的广告才会有相应的嵌入向量,通过广告有无嵌入向量,会泄露了无曝光广告的标签
- 测试数据中存在曝光非0但无嵌入向量的广告,这在训练集中是不存在的,导致训练测试不一致
以上问题在embeding后要通过eda才能发现,所以构造新特征并merge之后要观察新特征在训练集和测试集中的分布,不能无脑merge
这里我们给出了解决方法,即随机掩盖掉5%广告的嵌入向量,保证训练集中也能出现无曝光的广告。
融合
不同模型预测值的加权平均
编程小技巧
1.用Counter()初始化空dict,再对其赋值,且Counter变量可用于对dict统计出现频率例如Counter.most_common(k)
2.用try…except:pass来执行del代码