一个混合推荐与Yelp挑战 Data -- Part I

这 is 的 first part of 的 Yelper_Helper 顶石 project blog post. 请找到 第二部分在这里.

 

1. 介绍

如今,每个公司和个人都可以使用推荐系统——不仅仅是顾客在亚马逊上买东西, 在Netflix上看电影, 或者在附近的Yelp上寻找食物. 事实上, 数据科学迅速流行的一个基本驱动因素是,对于任何试图做出正确决定的人来说,都可以获得大量的信息.

T他的项目是我们为期12周的旅程的终点 数据科学 赌博10大排行网站营. For this project, we would like to work on something that:

  • 有清晰和强烈 业务需求
  • 需要 大数据 处理(至少十亿字节)
  • 请允许我们展示一些 机器学习 技术

基于这些标准, 我们决定使用“Yelp助手”——一个使用Yelp开源数据的实时餐厅推荐系统. 我们相信我们从这个项目中获得的经验将被广泛应用.

 

 

2. 数据源

我们的数据来源是 Yelp数据集的挑战. 挑战的目的是利用所提供的数据产生创新和创造性的见解. Yelp recognizes 的 top submission with a $5000 prize winning.

数据集中包含了5个json文件, 哪些是包含型用户, 签到, 提示, 评论, 和企业. Yelp也包括了200个,000张带有相关标签的照片, though we did not incorporate any image analysis in our end product. 文本数据的总大小大约为5Gb. 虽然这 虽然算不上“大数据”,但我们使用大数据工具和技术的愿望是有道理的. 数据的丰富性和多样性让我们可以自由地应用各种各样的机器学习技术,创建我们所谓的“Yelper Helper”.“Yelper Helper的目标是基于关键字输入为用户开发一款推荐应用, 位置, 社交网络, 和评论. 这 will be explained in more detail in 的 following sections.

 

3. 项目总结

我们的应用程序做什么?

Knowing 的 user’s 位置 和 o的r optional information (user ID, 关键字), 我们的引擎可以推荐附近的餐馆,并将其可视化在地图上. 引擎是一个 混合动力 推荐. 对于新用户或匿名用户, 我们将能够仅使用位置信息提供基本案例建议. 加上“辣”或“玉米饼”这样的关键词," an NLP (Natural Language Processing) module is turned on that can offer 类似的ity based 建议s; finally with user ID as input, 协同过滤和社交网络模块将基于历史评分活动和好友意见提供更个性化的结果.

一个快速的演示

 

Here are 的 main components of 的 system we built:

  • 前端: 一个由弗拉斯克驱动的网页
  • 流处理器: a scalable, fault-tolerant structured stream server built with Kafka
  • 推荐引擎: 完全驻留在Databricks云环境中的实时推荐生成器(Databricks + Apache 火花 + AWS), 有四种不同的推荐方法:
    • 基于内容的: Natural Language Processing (NLP) cosine 类似的ity
    • 协同过滤:交替最小二乘算法
    • 社交网络:  朋友的意见
    • 定位: 无冷启动问题
  • 远程数据库:
    • 结构化数据(已处理表)的AWS RDS
    • AWS S3 for unstructured data (json files, trained models, 等.)

 

4. 数据准备和EDA

在构建应用程序和赌博10大排行网站模型之前, we wanted to investigate a subset of 的 data to explore. Among 的 cities that were available in 的 Yelp data was Las Vegas, 由于这里有很多餐厅,我们团队认为这是一个很好的赌博10大排行网站场地, 游客, 评论, 数据的多样性. 建立关系数据库之后, we dove in 和 performed some exploratory data analysis on 的 评论.

为了更好地理解评论中的词语是如何与用户给出的评级相关联的, 我们进行了一个高层次的情感分析,以确定哪些词与积极和消极的评论有关. 我们从拉斯维加斯的餐馆中抽取了1000条负面评论和1000条正面评论作为样本, 并分析了这些评论中最常用的单词或短语.

Words most often associated with bad 评论 are on 的 top left. 它们包括: 最糟糕的, 可怕的, 可怜的, 废话, 无味的. 最常与好评联系在一起的词在右下角. 其中包括: 伟大的经历, 强烈推荐, 卡拉ok, 牛排餐厅, 独特的.

Additional exploratory data analysis could be performed, 例如餐厅趋势, 每个位置的唯一属性, 等. 因为Yelp提供的数据已经很干净了,遗漏也很小, 我们没有输入任何数据. 最后, because we were able to convert 的 data from json to csv easily, we loaded 的 data into MySQL database for easy storage 和 extraction.

 

5. 数据存储与存取策略

我们的团队认为,将转换后的csv文件加载到由Amazon的关系数据库服务托管的MySQL数据库中是明智的. 将数据存储在关系数据库中将允许我们高效地提取和访问数据.

MySQL provides many advantages for our 建议 app. 第一个, some of 的 data files contained millions of rows, 所以我们旋转MySQL实例并将每个数据集加载到单独的表中. 这使得数据提取变得简单和快速,这取决于我们想要分析的内容. 最初,创建了5个表,一个用于评论、业务、提示、签到和用户. 图示如下:

从那里,我们创建了子表,其中只包含相关的拉斯维加斯餐厅数据. MySQL提供的另一个优势是,它允许我们很容易地通过sqlalchemy和MySQLdb与火花和Python建立连接, 因此,不需要创建多个中间/临时CSV文件.

 

6. 混合推荐引擎

6.自然语言处理(NLP)

6.1.1情绪分析

第一个, 我们决定使用自然语言处理(NLP)分析拉斯维加斯子集, 这是一种机器学习技术,旨在理解人类语言的所有复杂和细微差别. 这80万条评论被分为1、2星的低评级和5星的高评级. 我们的目标是创建一个监督学习神经网络,可以根据使用的语言预测评论的情绪是积极的还是消极的. 3星或4星的餐厅评论被抛弃,因为评论者之间缺乏一致性(i.e., one reviewer’s 3 star review could be ano的r’s 5 star review).

低评级的评论被评为0级,高评级的评论被评为1级. 然后,使用keras包将每个审查的文本进行标记并转换为一个序列. 在keras中建立了一个神经网络,并使用了卷积滤波器, 池过滤, ReLU和sigmoid激活函数预测每篇评论的情绪为0或1. 最终的模型准确率为94%,并且会抽查新写的评论以及其余的3星和4星评论. The model did quite well for our purposes 和 so we fit all 800,使用情绪分析神经网络的000条评论,然后平均餐厅的评论,并使用结果作为一个新的特征 基于位置的推荐(参见第6节.4). The overall process for 的 情绪分析 is outlined below.

 

6.1.2基于内容的推荐

我们还想使用NLP为我们的应用程序提供基于内容的推荐. 通过计算商品与商品之间的相似度来做出这些类型的推荐. 当你在线阅读一篇文章时,通常会有一个边菜单或页面底部的一个部分,根据你对当前文章的兴趣推荐新文章. Often, 的se new articles are written on 的 same or a 类似的 topic. 这是一个基于内容的推荐.

 

基于内容的推荐者可以根据用户的个人资料和过去的评级向用户提出新的推荐. 这, 然而, 提出冷启动问题, an issue that arises for a br和-new user who 有 no rating history. 为了解决这一, 我们的NLP推荐是基于关键字软匹配(相似度计算),而不是用户配置文件. So, 在我们的应用程序中输入“tacos”应该会显示墨西哥餐馆的排名, 也有可能推荐一些提供类似墨西哥卷的食物的非墨西哥餐馆.

为了实现这个目标, 我们再次决定实现一个神经网络来理解评论中使用的语言. We used 的 Word2Vec function from 火花 MLlib to create 的 model. 我们的流程如下图所示.

预处理数据, 我们将每个企业的评论连接在一起,总共有6个,199家餐厅. Then, we tokenized 的 评论 和 removed all stop words. 停止词是英语语言中常见的词,在句子中起作用,但没有上下文, 如“of," "”和“有."

Word2Vec 的n translates each word into a vector of 100 features. These vectors are located in a feature space of 100-dimensions, with 类似的 words closer toge的r 和 unrelated words far的r apart. 例如, “冰淇淋”和“冻酸奶”的向量应该指向几乎相同的方向, but 的 vectors for “delicious” 和 “disgusting” would be far apart.

一旦单词被转换成向量, in order to check if 的 result makes sense (和 have some fun), 我们可以做一些文字代数. We can add or subtract 的 vectors from one ano的r to find a new word.

The word vectors above have been flattened into a 2D feature space. 牛肉和菲力牛排都是牛的食物, while seafood 和 lobster tail both come from 的 sea. 龙虾尾和菲力牛排是精致而昂贵的牛肉和海鲜. 如果我们有菲力牛排, take away 的 fact that it is beef 和 add in a new category of seafood, 最后是龙虾尾.

除了使用单词代数, 我们可以根据余弦相似度来确定两个单词或文档的相似程度. 在数学上, 余弦相似度是两个向量的点积除以这两个向量大小的积. 它计算两个向量之间的夹角. 角度越小,单词越相似,值就越接近1. 角度越大,差异越大,计算结果越接近负1. 相互垂直的向量余弦相似度为0.

在上图中,"汉堡” 和“三明治” point in somewhat 类似的 directions 和 have a 类似的ity of about 0.6. Below, we can see 的 results of a 类似的ity search for 的 word "中国人."

因为业务评论不只是一个单词,用户也可能希望使用多个单词进行搜索, Word2Vec对所有单词的向量进行平均,然后计算用户的关键字与每个可用餐厅的评论之间的相似度. 然后,结果会按照最相似和最不相似的顺序排列,并返回给地图上的用户.

 

6.2协同过滤

Collaborative filtering (CF) is commonly used for 推荐 systems. 这些技术旨在通过收集许多用户的偏好或口味信息来预测用户的兴趣. 换句话说,CF填补了用户-商品关联矩阵中缺失的条目. 潜在的假设是,如果A和B在一个问题上达成一致, 在另一个问题上,A比随机选择的人更有可能持有B的观点.

下面是来自维基百科的一个很好的视觉例子. In order to predict 的 unknown rating marked with ‘?’, we rely more on 的 opinions from o的r users with 类似的 评级历史记录(绿色行),从而得出负面评级预测(拇指向下).

在数学上, 这是通过低秩矩阵分解完成的, combined with a minimization problem (see picture below). 通常稀疏的用户项目评级矩阵 R 近似为用户矩阵的乘积 U 和项目矩阵 PT,这些都是由潜在因素构成的. 然后我们得到代价函数 J,并试着将其最小化. 目前在 火花.ml 图书馆, 采用交替最小二乘(ALS)算法来学习这些潜在因素. 另外, 因为我们直接依赖于用户对自身的评价, 我们的方法通常被称为“明确的”."

对于我们的项目,我们预先赌博10大排行网站模型并将其保存在Amazon S3服务器上. 当推荐引擎启动时,它将从S3加载模型并使用它进行预测. 这个架构的设计是为了让我们能够在新数据进来时保持赌博10大排行网站多个模型离线. 一旦一个新的模型准备好了,推荐引擎将通过编辑一行代码来进行切换.

 

6.3社会网络

这是经典口碑推荐系统的数字版本——人们已经使用了数千年.

The Yelp dataset is 独特的 in that 的re is an embedded social network. 在user json文件中,每行以字典格式描述一个用户. For 的 “friends” key, 的 value stored is a list of encrypted user IDs. 为了快速将非结构化的社交网络数据转换为结构化的“节点”和“边”集(图论相关包通常需要), we employ 的 火花 distributed computing ecosystem. 这 allows us to finish 的 task within a minute, compared to hours in a single machine Python environment.

With 的 social network database now structured 和 easily searchable, 几个SQL join-groupby-aggregate命令可以快速回答这样的问题:“附近餐馆的平均评分是多少? 只是根据我朋友的意见?“这一有趣的功能既可以提供触发对话的推荐,也可以提高应用的用户粘性. 作为算法的扩展, one can easily come up with o的r intuitive rating estimation schemes, 比如将网络扩展到二度和三度,以及应用加权平均.

 

6.4个位置

来到我们网页的用户可能想要一个基于他们的位置的所有可能的餐厅的快速建议. 不像前面提到的方法, 这不需要额外的信息,并以最快的速度返回建议,以改善用户体验.

While yelp provides aggregated ratings for each business, 的se are not always indicative of a restaurant’s quality. 例如, 一个五星级的餐厅会排在10个平均4的餐厅前面.9星. 另一个问题是,星级评级因人而异,并且是以整数为基础的. 最后,我们是否想要考虑那些可能因为日期而不相关的评论.g. 十多年前的?

Our strategy for dealing with 的se problems is as follows:

  • 在审查级别上, apply a time weight 和 a sentiment weight to get an up to date, 对每个评论的准确表述
  • 在业务层面,修改具有人气特征的调整后的星级评级

多大年龄的评论才不重要? 由于该数据集跨越2004年至今,我们需要定义一个合理的截止值. 而不是硬过滤器, 我们根据每一篇评论的年龄,用一个以2012年为中心的s形函数对其进行加权, 所以一篇新评论的权重为1.0,而2012年的评价权重为0.5. Because 的 rate of review writing is steadily increasing, approximately 60% of all 评论 are unaffected by 的 time weighting. Our filter effectiveness is demonstrated in 的 figure shown below.

基于上面描述的NLP情感分析,每个评论被分配一个情感值. 从0到1的范围可以看出评价的积极程度. 在下面的最终评级散点图中, 很明显,用户给出的情感和星级评级是因变量.

在业务层面,我们需要解决受欢迎程度的衡量标准:审查和签到计数. 高的评论数量表明这是一个受欢迎的业务或一个特殊的业务. 签到是一个更直接的衡量受欢迎程度的方法,但它是一个最近才出现的功能,所以即使是最受欢迎的企业也有160个左右. 考虑到这一点,签入的分配权重大约是审查的两倍.

这些分布是极其倾斜的, as most businesses having a limited number of 评论 和 check-ins. 通过做一个对数变换, 我们可以得到一个合理的乘法因子,包括但不夸大受欢迎程度.

在我们的最终分数指标完全定义后,我们可以将星星重新映射到百分位数(在拉斯维加斯). 在下面的图表中, 很明显,我们的新恒星需要一个不同于通常假设的解释. 在这个系统, four stars is considered one of 的 best restaurants in 的 area, three stars is a good if not great restaurant. 尽管倾斜, 也许这种最终的分数分布比均匀或正态分布的分数更现实. 事实上,只有少数几家特殊的餐馆,而普通餐馆的数量却非常之多.

无论使用哪种模型, 如果用户请求有关特定区域的信息,我们不希望检查数据库中的每个餐厅. 最精确的度量是haversine距离:球面上两点之间的最小距离. 为参考,定义方程为:

 

6.5推荐引擎总结

Putting all of 的se individual parts described in section 6 toge的r, our 建议 engine can react to whatever user input is passed in. 在它的基本位置模式中,我们可以在半秒内返回建议. 关键词模型和基于用户的模型需要计算,分别需要8秒和20秒.

 

7. 数据管道

看博客 第2部分

 

8. 结论及未来发展方向

Yelper Helper是一个用户友好的界面,由一个强大而多样的推荐支持,并由一个高效的数据管道支持,使它成为一个快速和简单的方法,找到附近的餐厅,客户会喜欢.

在与应用程序的所有交互层面上都有推荐,这为普通的数字路人提供了快速的建议,同时还能通过更个性化的结果促进更一致的用户参与. 基于位置的推荐旨在为路过的用户提供一种快速而肮脏的服务. 基于内容的推荐的NLP神经网络允许用户根据菜肴或菜肴筛选餐厅. 协同过滤和社交网络推荐提供基于个性化品味和朋友意见的个性化推荐.

使用Apache 火花构建机器学习模型,并建立一个瓶-Kafka-RDS-Databricks管道,创建一个强大的、可扩展的系统,能够处理大数据和持续的用户请求流.  

如果有更多的时间,我们会用以下的想法来改进Yelper Helper.

  1.      规模推荐包括所有城市,餐馆,和企业.
  2.      将其转换为一个移动应用程序,自动输入用户的位置,以更快的推荐
  3.      Use A/B testing to design an optimal user-interface, 可能包括弹出有用的提示或朋友对推荐餐厅的评论.
  4.      提高发动机的转速
  5.      收集有关用户最终决定和随后评级的数据,为当地餐馆提供如何改善业务和吸引顾客的见解.
  6.      建立LDA (Latent Dirichlet Al位置)模型或Doc2Vec模型来改进和改变NLP推荐方法.
  7.      允许用户通过最喜欢的列表或为度假计划膳食的选项来个性化他们的体验.

在短短两周内, 通过使用敏捷方法来分工,并定期开会讨论进度和问题,我们学到了很多关于团队有效工作的知识. 我们获得了SQL查询的经验, 亚马逊网络服务, Py火花编程语言, 和卡夫卡流. 我们实现了一些机器学习技术,并建立了一个完整的数据管道,为现代消费者创造了一个有用和专业的产品. 

 

9. 确认

指导老师:颜舒,刘怡,张泽宇

灵感来自孙川和刘爱子

关于作者

曹国伟史

曹国伟史 is a quantitative thinker with business vision. After graduating from Peking University in Geophysics, 他利用有限元法和分布式计算技术对地球内部进行建模,获得康奈尔大学计算地球动力学博士学位....
View all posts by 曹国伟史 >

阿萨姆'Mullane

Sam O’mullane是一名多学科科学家,他热衷于将数据科学普及给广大观众. Sam在伦敦帝国理工学院(Th)获得量子场和基本力理学硕士学位. 2013年获得博士学位...
View all posts by 阿萨姆'Mullane >

肖恩Kickham

肖恩在圣母大学获得数学学士学位后,从中西部移民到纽约市. He taught middle school math for five years in city schools. 配备了硕士学位...
View all posts by 肖恩Kickham >

Reza Rad

Recognizing 的 increasingly powerful role that data plays in society, 为了更好地解决未来的重大问题,雷扎选择了赌博10大排行网站(纽约市数据科学研究院). 与一个B.S. in Biomedical Engineering from George Washington University, he's...
View all posts by Reza Rad >

罗宾侬安德鲁

安德鲁毕业于加州大学圣巴巴拉分校,获得英语和统计学学位. 他之前在一家广告技术公司工作,在那里他学会了清洁的细节, 转换, 用各种方法报道大数据...
View all posts by 罗宾侬安德鲁 >

相关文章

留下你的评论

推荐系统,帮助推荐最好的寿司的地方,用户在YELP -埃琳娜kirzhner 2018年6月22日
[…]Shi, C. (2017年6月27日). 一个混合推荐与Yelp挑战. 从http://nycdatascience获取.com/blog/student-works/yelp-推荐-part-1/ […]

按类别查看帖子


我们最近的热门文章


按标签查看帖子

# python # trainwithnycdsa 2019 airbnb 亚历克斯Baransky 校友 校友面试 校友的评论 校友关注 校友的故事 校友 API 应用程序 艺术家 aws 美丽的汤 最好的赌博10大排行网站营 2019年最佳数据科学 最佳数据科学赌博10大排行网站营 2020年最佳数据科学赌博10大排行网站营 最好的排名 大数据 书推出 赌博10大排行网站营 赌博10大排行网站营的校友 赌博10大排行网站营准备 加州 癌症研究 顶石 职业生涯 职业生涯的一天 citibike 聚类 编码 课程演示 课程报告 D3.js data 数据分析师 数据科学 赌博10大排行网站 数据科学赌博10大排行网站营 数据科学工作 数据科学评论 数据科学家 数据科学家的工作 数据可视化 深度学习 演示日 折扣 dplyr 雇主网络 工程特性 金融 财务数据的科学 “绿带运动” 获得工作 ggplot2 googleVis Hadoop 希格斯玻色子 招聘 招聘合作伙伴活动 招聘合作伙伴 行业专家 老师的博客 教师面试 工作 就业安置 工作 Jon Krohn 摩根大通(JP Morgan C有e) Kaggle Kickstarter 套索回归 导致数据Scienctist 导致数据科学家 传单 线性回归 逻辑回归 机器学习 地图 matplotlib 医学研究 满足团队 meetup 网络 神经网络 神经网络 新课程 nlp 纽约 纽约数据科学 赌博10大排行网站 纽约市公开的数据 纽约DSA 纽约DSA校友 在线 在线赌博10大排行网站营 在线培训 开放数据 画家 熊猫 兼职 投资发展 预测 Prework 编程 普华永道 python Python数据分析 python机器学习 python scrapy python web抓取 python webscraping Python车间 R R数据分析 R语言 R编程 R闪亮的 r工作室 R可视化 R车间 R-bloggers 随机森林 排名 建议 推荐系统 回归 远程 远程数据科学赌博10大排行网站营 Scrapy scrapy可视化 seaborn 情绪分析 闪亮的 闪亮的仪表板 火花 特殊的 特别的夏天 体育 统计数据 流媒体 学生面试 学生展示 支持向量机 Switchup 团队 TensorFlow 证明 tf-idf 顶级数据科学赌博10大排行网站营 推特 可视化 网页抓取 周末的课程 会发生什么 词云 word2vec XGBoost yelp