热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

推荐系统项目总结

一、音乐推荐系统1、项目介绍从网易云音乐抓取歌单信息,将每个歌单看作一个user,每个歌曲看作一个item,user对Item的评分这

一、音乐推荐系统


1、项目介绍

从网易云音乐 抓取 歌单 信息,将每个歌单 看作一个user,每个歌曲看作一个item,
user对Item的评分这里简化为只有1,0两种,如果一个歌曲在歌单里,则说明该user(歌单)对该歌曲的评分为1,否则为0。

  • 数据来源:网易云音乐 : 歌单

2、算法介绍

1)“协同过滤”和“矩阵分解(NMF;FM;SVD;PMF;SVD++)”用到的数据形式 均为 (user,item,rating)。可利用user-based 或 item-based 的方法,向user推荐歌曲。
user-based方法:找出与user最相近的用户,然后,将这些用户评分较高的歌曲推荐给user;
Item-based方法:找出与user听过的歌曲相近的歌曲,推荐给user。
一般讲,item-based方法更为妥当,因为,user喜欢的风格会随时间改变。
2)隐语义模型(latent factor model:LFM):将user对item的打分看作是有内部依据的,与K个factor有关,每个user可表示为一个k维向量,表示各个维度的value表示user对该factor的喜好程度。每个Item也可表示为一个k维向量,每个维度的value表示item与该factor的相关性。user对item的打分就可视为:inner_product。一般,我们还会加一些偏置项,降低计算复杂度,因此,预测公式可写为:prediction = bias_gobal + bias_item + bias_user + 。损失函数:(prediction - label)**2 + lambda( |user|**2 + |item|**2)。利用损失函数求解 user和item的vector。

3、推荐系统Python库

  • surprise
  • lightfm

4、推荐系统构建方法

  • 利用“协同过滤”,“矩阵分解”制作简易的音乐推荐系统。
    note that:由于这里的评分只有1,0两种,所以相似度的计算不宜用cosine,或,pearson。使用Jaccard similarity较好(交集/并集)。
    可以通过 在surprise源码中添加Jaccard similarity function 或 继承类 的方式 实现自己的Jaccard similarity function,从而计算 user-user,或,Item-item之间的相似度。
  • 音乐推荐系统优化
    可以将“user的听歌序列”考虑进 推荐系统 的设计中:将每个歌单的歌曲看作一个序列,将所有歌曲序列 用 word2vec 进行训练,得出 song2vec,利用song2vec来判断歌曲之间的相近度。
  • others
    可以将 歌曲的 “流行度,播放次数,发行时间” 等因素考虑进去,辅助 推荐系统 做出决策。
    总结:利用 协同过滤,LFM可以得到user-based Recommendation,event-based Recommendation,song2vec,在将 歌曲的流行度 + 歌曲播放次数 + 音乐的发行时间(可以作为bin category) 综合考虑,利用ML model得到音乐的推荐度。
    trainset的形式???

5、模型评估方法

surprise中model评估方法:均方根误差、平均绝对误差、FCP

6、推荐系统构建过程中可能面临问题

  • 数据量过大,无法一次性载入内存
    1)无法利用全部的数据集进行推荐系统的构建,针对此问题,可以将歌单数据按照 “tags” 做一个预分组,在每个小的分组里面去搭建一个推荐系统。在这里,可以使用Spark分布式系统进行推荐系统的构建。
    2)可以使用Tensorflow批量导入数据,来训练model(示例code用的是SVD进行prediction)
  • 数据是每天在增加的,可不可以进行“增量训练(类似online learning)”?
  • 冷启动问题
    user听完一个 刚发行的 歌曲,如何根据这个歌曲 给 user 推荐其他的歌曲?
    解决思路:
    1、根据音频信息(音乐基因)推荐相似歌曲;
    2、推荐热门的歌曲;
    3、退而求其次,对 “歌手序列”进行建模,构建artist2vec,通过求解与歌手最相近的歌手,来推荐歌曲;
    延伸:电商在为user提供关联推荐时,也可以用word2vec的思想:将user依次点击的商品上升到品类类目,构成一个品类list,然后,将这些品类list送入word2vec去学习,学习出各个品类之间的相似度,用于为user做关联推荐。
  • 用户兴趣预测问题
    user在不同的时间段喜欢的音乐是不同的,我们可以按照时间线将user喜欢的音乐排序,同时由近到远给出一定的衰减因子(如:0.98,0.982,0.983,…)。
    根据song2vec得出歌曲推荐列表以后,我们可以将每个歌曲 加权 衰减因子 and 歌曲热度,根据加权结果,给出最终的推荐。

code

二、活动推荐系统构建(Event recommendation)


1、项目介绍

利用 用户的活动数据,社交数据,活动的元数据 等信息,构建 活动推荐系统,为用户推荐 感兴趣的活动。

2、算法总结

协同过滤
FM,LFM,NFM

3、系统构建思路

1)利用用户的历史数据(user - event)做 协同过滤,提取两个特征:user-based event recommendation 评分,event-based event recommendation评分。
具体特征列表:
2)利用用户的个人信息,去评估不同用户之间的相似度,从而得到另外一个:user-based event recommendation评分。
具体特征列表:
3)利用事件信息,去评估不同事件之间的相似度,从而得到另外一个:event-based event recommendation评分。
具体特征列表:
4)利用事件的参与人数 和 不参与人数,构建“事件热度”特征:
具体计算方式:
5)利用用户的社交数据构建两个特征:用户的朋友数量,朋友参加活动的活跃度(朋友参加活动总数/朋友总数)。
具体计算方式:
将上述几个特征汇总:
(user-based event recommendation rating ,
event-based event recommendation rating,
事件热度,
用户的朋友数量,
朋友参加活动的活跃度),通过一个ML 模型来评估 各个事件的推荐概率。
ML model可以采用LR,xgboost试试。

4、模型评估方法

mean average precision;

5、具体步骤

step1:数据清洗
将性别,locale,地区信息进行 index;
将其他一些value值 进行 类型转化;
step2:处理user 和 event关联数据
user-index
event-index
user-event table:以字典形式存储,节约空间:UsersForEvent[event]=user ,EventsForUser[user]=event;
userEventScores[i,j] = score;i:user-index,j:event-index;
对于同一event感兴趣的user pair set:uniqueUserPairs = set((user1,user2),(user2,user3),…)
同一user感兴趣的event pair set:uniqueEventPairs = set((event1,event2),(event2,event3),…)
step3:用户与用户的相似度
用户特征 = (locale,出生日期,性别,JoinedYearMonth,CountryId,TimezoneInt) normalize
利用用户特征 求用户之间的相似度;
step4:用户社交关系挖掘
user的朋友个数
user朋友参与活动的活跃度:朋友参与活动总数/朋友总数
step5:构造event与event相似度
event特征=(开始时间,city,state,zip,country,lat,lng,count1,count2,count3,count4,…,other_count)
city,state,zip,country表示活动的地址信息;
lat,lng表示活动的经纬度信息;
count…othercount表示活动文本信息中各个word的出现频次;
案例中,没有使用count信息;
利用user-event table求出event之间的相似度:eventContSim[i,j];user-event table normalize
利用event特征求出event之间的相似度:eventPropSim[i,j];eventProp table normalize
step6:event活跃度
从 event-attendees 中提取 会参加event的人数yes 和 不会参加event的人数no,event活跃度 = yes - no; normalize

将上述几个step中生成的特征组合起来构成新的trainingset。投入LR中进行训练。
训练何时停止较好?
可以看bias(train) 和 variance(validation)曲线,具体画法,可以去github看code。


推荐阅读
author-avatar
Jay_5
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有