特征预处理:
- 分析特征 和 label 的关系,如果是线性单调的(特征值越大,label 为正的比例越大)或均匀分布的(无论特征值是多少,label 分布都一样),可以直接作为连续值使用,需要进行 max - min 归一化
- 假如一些连续型特征,比如年龄特征是个正态分布,则需要分桶,保证每个桶和 label 是单调的
- 其他的枚举值特征都需要离散化,或者 embedding 化,简单枚举值可以尝试用 01 代替
- 特征 fillna 使用所有样本在当前特征下的 mean 值,不要用 -1(树模型一般使用 -1)
- embedding 特征用最长的序列(30天点击的 item 平均向量,不要再把 last_14, last_3, last_1 等平均向量都加入)
- embedding 特征的空值填充,使用平均向量代替
模型训练:
用户向量没有区分度原因:
- 用户特征只用了泛化特征(需要加入点击 item embedding 序列特征)
- 加入 BN 或者正则试一下
- 使用 lecky_relu 代替 relu 试一下,避免很多神经元值为 0
- 查看 item vector 是否有区分度
模型不收敛(val_auc 只在 0.5 左右):
- 负样本的构造,不可以用曝光未点击,而需要用热度全局负采样(负采样的倍数需要试验)
- 加大 batch_size 和学习率,避免陷入局部最优
- 减去多个重复序列特征
- 删除枚举值特征(特征不重要且过于稀疏)
- 样本的 RandomSample ,需要按照用户先排序,使相同用户不同时出现在训练集和测试集中,否则会导致 auc 达到不准确的 0.9
- 网络最后一层之前不要激活(sigmoid 或者 softmax 之前不要激活),不然会导致 auc 为 0.5 附近(最后一层输出加 relu 激活可能导致输出值是0,如果用 sigmoid 那么求出的概率是 0.5,-log0.5等于0.69。而且,由于relu输出值为0的时候,relu的导数为0,梯度没办法回传,因此损失就一直固定在 0.69,且prediction 趋近 -1。)
- 去除 user 特征全空的样本(如 daily 样本中有 30% 的用户,都是特征全空的用户,也就是 T-30 内无行为的用户,会导致这部分样本过大, 从而导致模型学习过拟合)
- 去除 item 向量为平均向量的样本(这样同样会导致正负样本里,都有很多 item vector 一样的样本,导致模型学习过拟合)
- 温度系数(没有尝试)
- learning rate再乘个 0.1 看看
- 加正则化(导致 user_vector 几乎一样)
参考:https://www.zhihu.com/question/315120636/answer/1687203383