基于用户画像的商品推荐挑战赛Baseline,初赛0.65线上
发布时间:2025-07-29 编辑:游乐网
该内容围绕基于用户画像的商品推荐挑战赛展开,介绍赛事背景、任务及评审规则。重点呈现了利用深度学习处理结构化数据二分类的baseline思路,将用户tagid序列转化为文本分类问题,用LSTM模型,展示了数据处理、模型构建、训练及预测过程,最终生成提交结果。
基于用户画像的商品推荐挑战赛
赛题链接:https://challenge.xfyun.cn/?ch=dc-zmt-05
一、赛事背景
讯飞AI营销云基于深耕多年的人工智能和大数据技术,赋予营销智慧创新的大脑,以健全的产品矩阵和全方位的服务,帮助广告主用AI+大数据实现营销效能的全面提升,打造数字营销新生态。
二、赛事任务
基于用户画像的产品推荐,是目前AI营销云服务广告主的一项重要能力,本次赛题选择了两款产品分别在初赛和复赛中进行用户付费行为预测,参赛选手需基于提供的样本构建模型,预测用户是否会购买相应商品。
三、评审规则
- 数据说明 本次赛题是一个二分类任务,特征维度主要包括:基本数据,性别年龄、用户标签、常驻地信息、机型信息5类特征,出于数据安全的考虑,所有数据均为脱敏处理后的数据。初赛数据和复赛数据特征维度相同。
2.评估指标 本模型依据提交的结果文件,采用F1-score进行评价。
赛题思路
本赛题提供了用户的基本信息,常住地,机型等;
通过前期分析发现:训练数据和测试数据中机型信息存在明显偏差,也就是测试数据中存在大量机型是训练数据未出现的,因此对于机型信息需要谨慎处理
本次baseline,抛砖引玉,主要从深度学习方法,考虑如何做结构化数据的二分类
本次数据的特点
仔细分析tagid列,发现该列提供了用户行为的序列信息,想到序列信息,自然联想到lstm,因此这里使用了lstm为基础模型进行分类。
本质是将tagid中每个元素考虑为单词,这样,tagid的序列就是句子,将问题转化为文本分类 + 额外特征的模式。
In [1]
from multiprocessing import cpu_countimport shutilimport osimport paddleimport paddle.fluid as fluidimport pandas as pdpaddle.enable_static()train = pd.read_csv('./训练集/train.txt', header=None)test = pd.read_csv('./测试集/apply_new.txt', header=None)train.columns = ['pid', 'label', 'gender', 'age', 'tagid', 'time', 'province', 'city', 'model', 'make']test.columns = ['pid', 'gender', 'age', 'tagid', 'time', 'province', 'city', 'model', 'make']data = pd.concat([train, test])data['tagid'] = data['tagid'].apply(lambda x: ' '.join(map(str, eval(x))))print(train.shape,test.shape)
(300000, 10) (100000, 9)
本次采用了文本分类思路,将数据中的tagid当作单词,这里是构建了单词的数据字典和对应的序号
{字:1,字:2,... 字:n}
In [2]
# 生成数据字典dict_set = {}ik = 1for tagid in data['tagid'].values: for s in tagid.split(' '): if s in dict_set: pass else: dict_set[s] = ik ik = ik + 1dict_dim = len(dict_set) + 1# 根据数据字典编码tagiddata['input_data'] = data['tagid'].apply(lambda x: ','.join([str(dict_set[i]) for i in x.split(' ')]))print(data.shape,dict_dim)
(400000, 11) 230638
定义了基本的网络结构
input - embedding(这里可以引入预训练,基于word2vec)- bilstm - output
In [3]
# 定义网络def bilstm_net(data, dict_dim, class_dim, emb_dim=128, hid_dim=128, hid_dim2=96, emb_lr=30.0): # embedding layer emb = fluid.layers.embedding(input=data, size=[dict_dim, emb_dim], param_attr=fluid.ParamAttr(learning_rate=emb_lr)) # bi-lstm layer fc0 = fluid.layers.fc(input=emb, size=hid_dim * 4) rfc0 = fluid.layers.fc(input=emb, size=hid_dim * 4) lstm_h, c = fluid.layers.dynamic_lstm(input=fc0, size=hid_dim * 4, is_reverse=False) rlstm_h, c = fluid.layers.dynamic_lstm(input=rfc0, size=hid_dim * 4, is_reverse=True) # extract last layer lstm_last = fluid.layers.sequence_last_step(input=lstm_h) rlstm_last = fluid.layers.sequence_last_step(input=rlstm_h) # concat layer lstm_concat = fluid.layers.concat(input=[lstm_last, rlstm_last], axis=1) # full connect layer fc1 = fluid.layers.fc(input=lstm_concat, size=hid_dim2, act='tanh') # softmax layer prediction = fluid.layers.fc(input=fc1, size=class_dim, act='softmax') return prediction
In [4]
train = data[:train.shape[0]]test = data[train.shape[0]:]
In [5]
train.head(5)
pid label gender age