Kaggle往期赛 | 多目标推荐系统大赛baseline

来源:深度之眼 作者:比赛教研部
编辑:学姐

Kaggle OTTO – Multi-Objective Recommender System多目标推荐系统大赛

赛题分析+baseline

1、赛题链接

https://www.kaggle.com/competitions/otto-recommender-system/overview

2、赛题描述

本次比赛的目标是预测电子商务点击、购物车添加和订单。

根据用户的行为记录来预测用户各种行为下次发生交互的商品,这是一个经典的多目标推荐问题。本次比赛的目标是预测电子商务的点击量、购物车的添加量和订单。你将根据用户Session序列中的行为记录来进行推荐。

3、评价指标

这里我们需要对用户的点击,加购,购买行为进行Top-K推荐,我们需要对每一个User的Session序列给出预测的Top-20的Item结果,其评估指标使用Recall进行评估:

这里我们需要分别对这三种行为分别进行Recall指标计算,最后将三个行为的Recall值进行加权求和,其权值如下:

4、数据介绍

我们将数据完全读入,可以看到数据的组织形式如下:

可以看到数据的组织形式十分的简练,但是在训练集里面一共有2亿条数据,数据包含有四列:['session','aid','ts','type'],记录了session的用户的这三种行为,我们挑选几个Session,来根据时间来可视化一下用户的行为类型。

我们对数据中的三种行为的占比进行可视化:

可以看到,用户的绝大多数行为是点击行为,对于加购和购买行为几乎很少。

bassline分析

Item-CF的思路

由于数据量极其的大,我们这里只使用最简单的基于统计的方法来完成此次baseline,这里我们使用Item-CF的思路,通过统计得出Item-Item的相似度矩阵,然后根据用户的行为,推荐出相似的Item以完成Top-20推荐。

由于数据量实在太大,我们这里只采样3000000个session完成下面的baseline。

train_session = random.sample(list(train_df['session'].unique()),config['train_session_num'])
train_df = train_df.query('session in @train_session').reset_index(drop=True)

在过滤完数据之后,我们来生成Item-Pair,这里要注意,每一个Item-Pair都是由在同一天同一个Session中相邻的Item对构成。

def generate_pairs(df): df = df.sort_values(by=['session','ts']) df['aid_next'] = df['aid'].shift(-1) df['session_day'] = df['session'].astype('str')+'_'+df['time_stamp'] df['session_day_count'] = df['session_day'].map(df['session_day'].value_counts()) df['ranking'] = df.groupby(['session_day'])['ts'].rank(method='first', ascending=True) df = df.query('session_day_count!=ranking').reset_index(drop=True)

sim_aids = df.groupby('aid').apply(lambda df: Counter(df.aid_next).most_common(50)).to_dict()
sim_aids = {aid: Counter(dict(top)) for aid, top in sim_aids.items()}
return sim_aids

在完成计算Item-Item的相似度之后,我们就可以来根据相似度矩阵来进行推荐了,其推荐函数如下:

def recommend(aids,popular_items):

if len(aids) >= 20:
    return aids[-20:]

aids = set(aids)
new_aids = Counter()
for aid in aids:
    new_aids.update(sim_aids.get(aid, Counter()))

top_aids2 = [aid2 for aid2, cnt in new_aids.most_common(40) if aid2 not in aids] 
final_rec_list = list(aids) + top_aids2[:20 - len(aids)]

if len(final_rec_list)<20:
    return final_rec_list + popular_items[:20-len(final_rec_list)]
else:
    return final_rec_list

这样就可以完成对用户的推荐了,这里要注意,我们对不同行为的推荐结果都是相同的,由于只有点击行为的数据是非常丰富的,对于其他行为,数据是非常少的,所以这里就直接对这三个行为进行了相同的推荐。

test_df = test_df.sort_values(["session", "type", "ts"]) test_session_dict = test_df.groupby('session')['aid'].agg(list).to_dict() session_id_list = [] item_id_list = []

popular_items = list(train_df['aid'].value_counts().index)

for session_id,session_item_list in tqdm(test_session_dict.items()): item_list = recommend(session_item_list,popular_items)

session_id_list.append(session_id)
item_id_list.append(list(item_list))

res_df = pd.DataFrame() res_df['session_type'] = session_id_list res_df['labels'] = [' '.join([str(l) for l in lls]) for lls in item_id_list]

res_list = [] for type_ in [0,1,2]: temp_df = copy.deepcopy(res_df) temp_df['session_type'] = temp_df['session_type'].apply(lambda x:'{}{}'.format(x,id2type[type])) res_list.append(temp_df) res_df = pd.concat(res_list,axis=0)

可以看到,我们这次的Baseline的代码非常简单,而且效率非常的高,使用Kaggle自带的CPU环境只需要10分钟+就可以完成全流程的跑测,线上得分:0.553,虽然这个得分不是很高,但是这个baseline跑测效率较高,代码结构易懂,其潜力还是很大的~

百场比赛top方案资料包🚀🚀🚀

关注“KGMking”回复“比赛”免费获取

码字不易,欢迎大家点赞评论收藏!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值