科大讯飞AI开发者大赛的比赛已经正式开幕了,这些赛题涉及了各个领域,包括CV、NLP以及传统的表格赛题等等,今天老肥和大家分享的是表格赛题-基于用户画像的商品推荐挑战赛的Baseline方案,线上得分为0.67+,是目前位次较前的一个方案,还没有报名比赛的同学可以通过文章底部阅读原文直接报名。
基于用户画像的产品推荐,是目前AI营销云服务广告主的一项重要能力,本次赛题选择了两款产品分别在初赛和复赛中进行用户付费行为预测,参赛选手需基于提供的样本构建模型,预测用户是否会购买相应商品。
本次赛题是一个二分类任务
,特征维度主要包括:基本数据,性别年龄、用户标签、常驻地信息、机型信息5类特征,出于数据安全的考虑,所有数据均为脱敏处理后的数据。
评估指标采用的是F1-score
, 存在着一个阈值调整的空间,另外,本次初赛的数据应该是经过采样,正负样本比例均衡。
初次拿到赛题发现使用所有原始特征跑的五折 lgb模型能够在线下取得相当高的分数0.7+,线上却能够不到0.5,线上线下存在着超过20个百分点的巨大gap, 显然发生了非常严重的过拟合,训练集与测试集的分布存在较大的不一致的问题,此时我们可以通过绘制概率密度图(kdeplot)来查看特征的分布,也可以通过对抗验证的方法进行特征的筛选。
我们不难发现, 手机型号相关的特征存在着明显的不一致现象,因此本baseline的方案不采用make
以及model
两个维度的特征。对于用户标签信息,存在着时间相关的信息,我们这里采用Word2Vec
来对标签信息做embedding特征的提取,相关代码如下,
data['tagid'] = data['tagid'].apply(lambda x: eval(x))
sentences = data['tagid'].values.tolist()
for i in range(len(sentences)):
sentences[i] = [str(x) for x in sentences[i]]
emb_size = 32
model = Word2Vec(sentences, size=emb_size, window=6, min_count=5, sg=0, hs=0, seed=1, iter=5)
emb_matrix = []
for seq in sentences:
vec = []
for w in seq:
if w in model.wv.vocab:
vec.append(model.wv[w])
if len(vec) > 0:
emb_matrix.append(np.mean(vec, axis=0))
else:
emb_matrix.append([0] * emb_size)
emb_matrix = np.array(emb_matrix)
for i in range(emb_size):
data['tag_emb_{}'.format(i)] = emb_matrix[:, i]
剩下的特征我们直接送入模型进行学习,其中'gender', 'age', 'province', 'city'
当作类别特征,其余特征为数值特征,最终在线下能够得到0.68的F1得分,0.67的线上F1得分,这个线上线下的gap也基本被成功地抹平。
本文所有代码已经上传,在后台回复「画像」即可获得,点击下方阅读原文链接即可直达比赛现场。
——END——