DataWhale 新闻推荐学习
第一课,赛题理解与baseline
下面是阿里的天池比赛入口。
零基础入门推荐系统 - 新闻推荐
让代码跑起来的法门:
step 1, 如下图所示下载数据集到本地。在DataA1121.md 里面有数据下载的网络地址。直接复制到浏览器里面即可下载。
step2, 在本地Pycharm 里面新建Project. 然后再项目文件夹里面新建文件夹data_raw, temp_results 。 将第一步下载的数据集放到data_raw 文件夹下面。
step3, 根据学习手册进行编写和测试了。
遇到的问题,
1、关于计算物品相似度的问题–协同过滤。 下面的代码中在计算相似度矩阵之后,对相似度矩阵进行了归一化。
Karypis在研究中发现如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确度。其研究表明,如果已经得到了物品相似度矩阵w,那么可用如下公式得到归一化之后的相似度矩阵w’:
def itemcf_sim(df):
"""
文章与文章之间的相似性矩阵计算
:param df: 数据表
:item_created_time_dict: 文章创建时间的字典
return : 文章与文章的相似性矩阵
思路: 基于物品的协同过滤(详细请参考上一期推荐系统基础的组队学习), 在多路召回部分会加上关联规则的召回策略
"""
user_item_time_dict = get_user_item_time(df)
# 计算物品相似度
i2i_sim = {}
item_cnt = defaultdict(int)
for user, item_time_list in tqdm(user_item_time_dict.items()):
# 在基于商品的协同过滤优化的时候可以考虑时间因素
for i, i_click_time, device in item_time_list:
item_cnt[i] += 1
i2i_sim.setdefault(i, {})
for j, j_click_time, device in item_time_list:
if (i == j):
continue
i2i_sim[i].setdefault(j, 0)
i2i_sim[i][j] += 1 / math.log(len(item_time_list) + 1)
i2i_sim_ = i2i_sim.copy()
for i, related_items in i2i_sim.items():
for j, wij in related_items.items():
i2i_sim_[i][j] = wij / math.sqrt(item_cnt[i] * item_cnt[j])
# 将得到的相似性矩阵保存到本地
pickle.dump(i2i_sim_, open(save_path + 'itemcf_i2i_sim.pkl', 'wb'))
return i2i_sim_
协同过滤分2步:
step1: 根据挑选出用户都喜欢的物品,然后根据物品进行反排序,统计物品的共同喜欢次数。这里基于一个常识就是,物品越受人喜欢,那么这个物品就越有共通性,即物品就应该有更好的相似性。 根据喜欢多少构建相似度矩阵。
step2, 根据相似矩阵,根据用户针对某项物品计算出与物品有相似特性的物品。即生成用户推荐列表。