推荐算法在互联网行业的应用非常广泛,今日头条、美团点评等都有个性化推荐,推荐算法抽象来讲,是一种对于内容满意度的拟合函数,涉及到用户特征和内容特征,作为模型训练所需维度的两大来源,而点击率,页面停留时间,评论或下单等都可以作为一个量化的 Y 值,这样就可以进行特征工程,构建出一个数据集,然后选择一个合适的监督学习算法进行训练,得到模型后,为客户推荐偏好的内容,如头条的话,就是咨询和文章,美团的就是生活服务内容。

可选择的模型很多,如协同过滤,逻辑斯蒂回归,基于DNN的模型,FM等。我们使用的方式是,基于内容相似度计算进行召回,之后通过FM模型和逻辑斯蒂回归模型进行精排推荐,下面就分别说一下,我们做这个电影推荐系统过程中,从数据准备,特征工程,到模型训练和应用的整个过程。

我们实现的这个电影推荐系统,爬取的数据实际上维度是相对少的,特别是用户这一侧的维度,正常推荐系统涉及的维度,诸如页面停留时间,点击频次,收藏等这些维度都是没有的,以及用户本身的维度也相对要少,没有地址、年龄、性别等这些基本的维度,这样我们爬取的数据只有打分和评论这些信息,所以之后我们又从这些信息里再拿出一些统计维度来用。我们爬取的电影数据(除电影详情和图片信息外)是如下这样的形式:

这里的数据是有冗余的,又通过如下的代码,对数据进行按维度合并,去除冗余数据条目:

# 处理主函数,负责将多个冗余数据合并为一条电影数据,将地区,导演,主演,类型,特色等维度数据合并
def mainfunc():try:unable_list = []with connection.cursor() as cursor:sql='select id,name from movie'cout=cursor.execute(sql)print("数量: "+str(cout))for row in cursor.fetchall():#print(row[1])movieinfo = df[df['电影名'] == row[1]]if movieinfo.shape[0] == 0:disable_movie(row[0])print('disable movie ' + str(row[1]))else:g = lambda x:movieinfo[x].iloc[0]types = movieinfo['类型'].tolist()types = reduce(lambda x,y:x+'|'+y,list(set(types)))traits = movieinfo['特色'].tolist()traits = reduce(lambda x,y:x+'|'+y,list(set(traits)))update_one_movie_info(type_=types, actors=g('主演'), region=g('地区'), director=g('导演'), trait=traits, rat=g('评分'), id_=row[0])connection.commit()finally:connection.close()

之后开始准备用户数据,我们从用户打分的数据中,统计出每一个用户的打分的最大值,最小值,中位数值和平均值等,从而作为用户的一个附加属性,存储于userproex表中:

'insert into userproex(userid, rmax, rmin, ravg, rcount, rsum, rmedian) values(\'%s\', %s, %s, %s, %s, %s, %s)' % (userid, rmax, rmin, ravg, rcount, rsum, rmedium)'update userproex set rmax=%s, rmin=%s, ravg=%s, rmedian=%s, rcount=%s, rsum=%s where userid=\'%s\'' % (rmax, rmin, ravg, rmedium, rcount, rsum, userid)

以上两个SQL是最终插入表的时候用到的,代表准备用户数据的最终步骤,其余细节可以参考文末的github仓库,不在此赘述,数据处理还用到了一些SQL,以及其他处理细节。

系统上线运行时,第一次是全量的数据处理,之后会是增量处理过程,这个后面还会提到。

我们目前把用户数据和电影的数据的原始数据算是准备好了,下一步开始特征工程。做特征工程的思路是,对type, actors, director, trait四个类型数据分别构建一个频度统计字典,用于之后的one-hot编码,代码如下:

def get_dim_dict(df, dim_name):type_list = list(map(lambda x:x.split('|') ,df[dim_name]))type_list = [x for l in type_list for x in l]def reduce_func(x, y):for i in x:if i[0] == y[0][0]:x.remove(i)x.append(((i[0],i[1] + 1)))return xx.append(y[0])return xl = filter(lambda x:x != None, map(lambda x:[(x, 1)], type_list))type_zip = reduce(reduce_func, list(l))type_dict = {}for i in type_zip:type_dict[i[0]] = i[1]return type_dict

涉及到的冗余数据也要删除

df_ = df.drop(['ADD_TIME', 'enable', 'rat', 'id', 'name'], axis=1)

将电影数据转换为字典列表,由于演员和导演均过万维,实际计算时过于稀疏,当演员或导演只出现一次时,标记为冷门演员或导演

movie_dict_list = []
for i in df_.index:movie_dict = {}#typefor s_type in df_.iloc[i]['type'].split('|'):movie_dict[s_type] = 1#actorsfor s_actor in df_.iloc[i]['actors'].split('|'):if actors_dict[s_actor] < 2:movie_dict['other_actor'] = 1else:movie_dict[s_actor] = 1#regiosmovie_dict[df_.iloc[i]['region']] = 1#directorfor s_director in df_.iloc[i]['director'].split('|'):if director_dict[s_director] < 2:movie_dict['other_director'] = 1else:movie_dict[s_director] = 1#traitfor s_trait in df_.iloc[i]['trait'].split('|'):movie_dict[s_trait] = 1movie_dict_list.append(movie_dict)

使用DictVectorizer进行向量化,做One-hot编码

v = DictVectorizer()
X = v.fit_transform(movie_dict_list)

这样的数据,下面做余弦相似度已经可以了,这是特征工程的基本的一个处理,模型所使用的数据,需要将电影,评分,用户做一个数据拼接,构建训练样本,并保存CSV,注意这个CSV不用每次全量构建,而是除第一次外都是增量构建,通过mqlog中类型为'c'的消息,增量构建以comment(评分)为主的训练样本,拼接之后的形式如下:

USERID  cf2349f9c01f9a5cd4050aebd30ab74f
movieid 10533913
type    剧情|奇幻|冒险|喜剧
actors  艾米·波勒|菲利丝·史密斯|理查德·坎德|比尔·哈德尔|刘易斯·布莱克
region  美国
director    彼特·道格特|罗纳尔多·德尔·卡门
trait   感人|经典|励志
rat 8.7
rmax    5
rmin    2
ravg    3.85714
rcount  7
rmedian 4
TIME_DIS    15

这个数据的actors等字段和上面的处理是一样的,为了之后libfm的使用,在这里需要转换为libsvm的数据格式

dump_svmlight_file(train_X_scaling, train_y_, train_file)

有很多细节不在这里描述,这样大概的特征工程工作就做好了,之后使用相似度计算,FM,LR进行推荐模型的训练。 具体训练的过程不在这里进行阐述了。模型使用上遵循先召回,后精排的策略,先通过余弦相似度计算一个相似度矩阵,然后根据这个矩阵,为用户推荐相似的M个电影,在通过训练好的FM,LR模型,对这个M个电影做偏好预估,FM会预估一个用户打分,LR会预估一个点击概率,综合结果推送给用户作为推荐电影。

https://github.com/GavinHacker/recsys_core

这个地址上面有详细的上线的项目截图和说明,大家有兴趣可以看一下,这里介绍了系统方面的结构,即,如何把推荐系统简单的应用到一个网站中。

做了这个电影推荐系统后,感觉算是对自己这么长时间学习机器学习知识做一个综合的实践,有不少的感悟,现在有很多学习机器学习的同学,建议在大家刷论文的同时,也注重在项目中实践,计算机科学,虽然叫做科学,实际却是一门实践性学科,一些AI顶级大牛,他们并不是数学家,也不是理论家,大多是从理论和实践结合这条路成就的,和金庸小说中的武林绝技是一个道理。说到这,大家都知道,最近朋友圈被《94射雕英雄传》AI换脸杨幂刷屏了,看来AI视频换脸技术发展已经相当快,仔细想想,这已经是AI进入艺术创作领域的一个表象,笔者认为AI之后的发展一定是从互联网行业扩展出去,变成IT产业当中的一个重要的技术支柱。

转载于:https://blog.51cto.com/14318032/2389980

从0开始,使用豆瓣数据集做一个基于FM和逻辑回归的电影推荐系统相关推荐

  1. opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统

    教你从零开始做一个基于深度学习的交通标志识别系统 基于Yolo v3的交通标志识别系统及源码 自动驾驶之--交通标志识别 在本文章你可以学习到如何训练自己采集的数据集,生成模型,并用yolo v3算法 ...

  2. 怎样用cocos2d-x做一个基于地图块的游戏(Part One)

    怎样用cocos2d-X做一个基于地图块的游戏 (Part One) 在这个分为上下两部分的教程中,我们将介绍如何使用Cocos2D-X和地图编辑器做一款基于地图块的游戏.在这个简单的地图块游戏里,一 ...

  3. 如何做一个基于JAVA房产中介预约看房系统毕业设计毕设作品(springboot框架)

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):基于JAVA的网站开发属于B/S架构(即浏览器和服务器架构模式),架构如图 分析系统功能 ...

  4. 如何做一个基于微信电子书阅读小程序系统毕业设计毕设作品

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的小程序,S端是我们要开发的后台管理系 ...

  5. 如何做一个基于微信校园跑腿小程序系统毕业设计毕设作品

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的小程序,S端是我们要开发的后台管理系 ...

  6. 如何做一个基于python校园运动场地预约系统毕业设计毕设作品(Django框架)

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):基于Python(Django框架)的网站开发属于B/S架构(即浏览器和服务器架构模式), ...

  7. 如何做一个基于微信校园运动场地预约小程序系统毕业设计毕设作品

    如何做一个基于微信校园运动场地 分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的小程 ...

  8. 如何做一个基于微信共享会议室预约小程序系统毕业设计毕设作品

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的小程序,S端是我们要开发的后台管理系 ...

  9. 如何做一个基于微信酒店预订小程序系统毕业设计毕设作品

    如何做一个基于微信酒店预订小程序系 分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的 ...

  10. 如何做一个基于微信菜谱美食小程序系统毕业设计毕设作品

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的小程序,S端是我们要开发的后台管理系 ...

最新文章

  1. 深度学习NN、CNN、RNN、和DNN你了解吗?
  2. 调用另一个Activity
  3. xSocket 通讯框架 demo
  4. NEFU 560 半数集
  5. 用Python实现冒泡排序
  6. javaSE知识点汇总
  7. html5录音功能代码,recorder.js 基于 HTML5 实现录音功能
  8. Eclipse-project 重命名问题(如何彻底修改Eclipse工程名),4种解法
  9. Django REST框架
  10. SQL Server 2005 技术内幕之T-SQL查询——逻辑查询处理(上)
  11. spring4.x的一些新特性
  12. java接口 抽象类_关于JAVA接口和抽象类
  13. ubuntu16 安装 teamview 步骤
  14. 能玩游戏的计算机推荐,电脑玩啥端游合适 适合长期玩的游戏有哪些
  15. c语言实验输出姓名和学号,学号姓名第n次实验报告
  16. 安利几个可以搜大学网课答案的平台
  17. java构造方法中this_Java中this关键字在构造方法中的使用
  18. xml文件导入wps_#WPS表格怎么导入XML数据?#excel怎样导入wps表格数据
  19. 修改微信扫码登录,二维码样式
  20. 学习java web感想_学了近一个月的java web 感想

热门文章

  1. 乐有家:房源信息立体把控,打造全渠道真房源
  2. python雨课堂课后答案_有没有免费查网课雨课堂答案的公众号或者软件啥的
  3. 高校校园网络设计与实现
  4. 1到20的阶乘和是多少 php,20的阶乘(1到20的阶乘和结果)
  5. OpenDRIVE编辑器TruevisionDesigner
  6. win7设置计算机共享的打印机共享的打印机共享,win7,xp打印机共享设置软件 一键共享...
  7. 显示器提示超频的解决办法
  8. js alert追加html,利用JQ来美化Js的alert弹出框
  9. js读取本地excel到html,JS读取本地EXCEL文件
  10. 官网下载storage manager方法