机器学习 物理引擎
俄罗斯巨魔,Facebook和美国大选与机器学习有什么关系? 推荐引擎是社交网络及其创建的用户生成内容(UGC)的中央反馈回路的核心。 用户加入网络,并被推荐为可参与的用户和内容。 推荐引擎可以玩,因为它们会放大思想泡泡的影响。 2016年美国总统大选表明,了解推荐引擎的工作原理及其提供的局限性和优势非常重要。
基于AI的系统不是只能创造美好事物的灵丹妙药。 相反,它们提供了一组功能。 在购物网站上获得适当的产品推荐可能会非常有用,但是获得令人反感的推荐内容也会令人沮丧(后来可能是假冒的外国力量在您的国家播种)。
本章从高层次和编码层次上介绍了推荐引擎和自然语言处理(NLP)。 它还提供了如何使用框架的示例,例如基于Python的推荐引擎Surprise,以及如何构建自己的框架的说明。 涉及的主题包括Netflix奖,奇异值分解(SVD),协作过滤,推荐引擎的实际问题,NLP以及使用云API的生产情感分析。
在“数据科学”成为一个通用术语且Kaggle出现之前,Netflix的奖项席卷了整个世界。 Netflix奖是一项旨在提高新电影推荐水平的竞赛。 比赛中的许多原始创意后来都转化为其他公司和产品的灵感。 早在2006年,发起了一项耗资100万美元的数据科学竞赛,就激发了人们的兴奋,这预示了AI的当前时代。 具有讽刺意味的是,在2006年,随着Amazon EC2的发布,云计算时代也开始了。
云和广泛的AI的曙光交织在一起。 Netflix还通过Amazon Web Services成为公共云的最大用户之一。 尽管有这些有趣的历史脚注,但从未将Netflix获奖算法用于生产。 BellKor的Pragmatic Chaos团队是2009年的赢家,测试RMS为0.867,提高了10%以上。 该团队的论文描述了该解决方案是100多个结果的线性混合。 文章中特别相关的一句话是:“这里的一个教训是,拥有很多模型对于赢得比赛所需的递增结果很有用,但是实际上,仅需选择一些模型就可以构建出色的系统。”
在Netflix的生产中并未采用Netflix竞赛的制胜法,因为与所获得的收益相比,工程复杂性被认为太大。 推荐中使用的核心算法SVD(如“ 用于大型矩阵的快速SVD ”所述)“尽管对于小型数据集或脱机处理可行,但许多现代应用程序涉及实时学习和/或大量数据集的维数和大小。” 实际上,这是生产机器学习的巨大挑战之一:产生结果所需的时间和计算资源。
我在公司建立推荐引擎方面也有类似的经验。 当算法以批处理方式运行且很简单时,它可以生成有用的建议。 但是,如果采用更复杂的方法,或者需求从批处理变为实时,则将其投入生产和/或维护的复杂性将激增。 这里的教训是,越简单越好:选择进行基于批处理的机器学习而不是实时。 或者选择一个简单的模型而不是多种技术的集合。 同样,确定调用推荐引擎API与自己创建解决方案是否有意义。
图1显示了社交网络推荐反馈循环。 系统拥有的用户越多,它创建的内容就越多。 创建的内容越多,它为新内容创建的建议就越多。 反过来,此反馈循环可吸引更多用户和更多内容。 如本章开头所述,这些功能可用于平台的正面和负面特征。
皮尔森·艾迪生·韦斯利图1:社交网络推荐反馈循环
探索推荐引擎背后的概念的一种方法是使用Surprise框架 。 关于该框架的一些方便的事情是,它具有内置的数据集( MovieLens和Jester),并且包括SVD和其他通用算法,包括相似性度量。 它还包括以均方根误差(RMSE)和均值绝对误差(MAE)的形式评估建议性能的工具,以及训练模型所花费的时间。
这是通过调整所提供的示例之一,如何在伪生产情况下使用它的示例。
首先是必要的导入,以加载库:
In [2]: import io ...: from surprise import KNNBaseline ...: from surprise import Dataset ...: from surprise import get_dataset_dir ...: import pandas as pd
创建了一个辅助函数,将ID转换为名称:
In [3]: ...: def read_item_names(): ...: """Read the u.item file from MovieLens 100-k dataset and return two ...: mappings to convert raw ids into movie names and movie names into raw ids. ...: """ ...: ...: file_name = get_dataset_dir() + '/ml-100k/ml-100k/u.item' ...: rid_to_name = {} ...: name_to_rid = {} ...: with io.open(file_name, 'r', encoding='ISO-8859-1') as f: ...: for line in f: ...: line = line.split('|') ...: rid_to_name[line[0]] = line[1] ...: name_to_rid[line[1]] = line[0] ...: ...: return rid_to_name, name_to_rid
计算项目之间的相似性:
In [4]: # First, train the algorithm # to compute the similarities between items ...: data = Dataset.load_builtin('ml-100k') ...: trainset = data.build_full_trainset() ...: sim_options = {'name': 'pearson_baseline', 'user_based': False} ...: algo = KNNBaseline(sim_options=sim_options) ...: algo.fit(trainset) ...: ...: Estimating biases using als... Computing the pearson_baseline similarity matrix... Done computing similarity matrix. Out[4]: < surprise.prediction_algorithms.knns.KNNBaseline>
最后,提供了十项建议,与本章的另一个示例类似:
In [5]: ...: rid_to_name, name_to_rid = read_item_names() ...: ...: # Retrieve inner id of the movie Toy Story ...: toy_story_raw_id = name_to_rid['Toy Story (1995)'] ...: toy_story_inner_id = algo.trainset.to_inner_iid( toy_story_raw_id) ...: ...: # Retrieve inner ids of the nearest neighbors of Toy Story. ...: toy_story_neighbors = algo.get_neighbors( toy_story_inner_id, k=10) ...: ...: # Convert inner ids of the neighbors into names. ...: toy_story_neighbors = (algo.trainset.to_raw_iid(inner_id) ...: for inner_id in toy_story_neighbors) ...: toy_story_neighbors = (rid_to_name[rid] ...: for rid in toy_story_neighbors) ...: ...: print('The 10 nearest neighbors of Toy Story are:') ...: for movie in toy_story_neighbors: ...: print(movie) ...: The 10 nearest neighbors of Toy Story are: Beauty and the Beast (1991) Raiders of the Lost Ark (1981) That Thing You Do! (1996) Lion King, The (1994) Craft, The (1996) Liar Liar (1997) Aladdin (1992) Cool Hand Luke (1967) Winnie the Pooh and the Blustery Day (1968) Indiana Jones and the Last Crusade (1989)
在探索此示例时,请考虑在生产环境中实施此示例的现实问题。 这是您公司中的某人可能会产生的伪代码API函数的示例:
def recommendations(movies, rec_count): """Your return recommendations"""
movies = ["Beauty and the Beast (1991)", "Cool Hand Luke (1967)",.. ]
print(recommendations(movies=movies, rec_count=10))
实施此问题时要问的一些问题是:在从一组选项中选择一个影片而不是一部电影时,您在进行选择时会做出哪些取舍? 该算法在非常大的数据集上的性能如何? 没有正确的答案,但是在将推荐引擎部署到生产中时,您应该考虑这些问题。
Google Cloud Platform 举例说明了如何在Compute Engine上使用机器学习来提出值得推荐的产品建议。 在示例中,PySpark和ALS算法与专有云SQL一起使用。 亚马逊还有一个示例 ,说明如何使用其平台Spark和Elastic Map Reduce(EMR)构建推荐引擎。
在这两种情况下,Spark都可以通过将计算划分到一组机器上来提高算法的性能。 最终,AWS大力推动SageMaker ,该SageMaker可以本地完成分布式Spark作业或与EMR集群通信。
有关推荐的大多数书籍和文章仅关注推荐系统的技术方面。 本书是关于实用主义的,因此在推荐系统方面,有一些问题需要讨论。 本节将介绍其中一些主题:性能,ETL,用户体验(UX)和先行/僵尸。
讨论中最流行的算法之一是O(n_samples^2 * n_features)
或二次方。 这意味着实时训练模型并获得最佳解决方案非常困难。 因此,在大多数情况下,培训推荐系统将需要作为批处理工作进行,而没有一些技巧,例如使用贪婪的启发式方法和/或仅为活跃用户,受欢迎的产品等创建一小部分推荐。
当我从头开始为社交网络创建用户关注的推荐系统时,我发现其中许多问题排在首位。 训练模型需要花费数小时,因此唯一可行的解决方案是每晚运行。 另外,我后来创建了训练数据的内存副本,因此该算法仅绑定在CPU上,而不绑定在I / O上。
在创建短期和长期的生产推荐系统时,性能都是不小的问题。 您最初使用的方法可能无法随着公司扩大用户和产品而扩展。 也许最初,当您的平台上有10,000个用户时,Jupyter Notebook,Pandas和SciKit-Learn是可以接受的,但事实证明它不是一个可扩展的解决方案。
相反,基于PySpark的支持向量机训练算法可以显着提高性能并减少维护时间。 然后,再次,您可能需要切换到专用的机器学习芯片,例如TPU或Nvidia Volta。 能够规划此能力同时仍在制定初始工作解决方案的能力是必须实施实际将其投入生产的实用AI解决方案的一项关键技能。
我发现在建立建议的初创公司的生产中出现了许多现实问题。 这些问题在机器学习书中没有得到太多讨论。 这样的问题之一就是冷启动问题。 在使用Surprise框架的示例中,已经有一个庞大的“正确答案”数据库。 在现实世界中,用户或产品很少,因此训练模型是没有意义的。 你能做什么?
一个不错的解决方案是使推荐引擎的路径遵循三个阶段。 对于第一阶段,请选择最受欢迎的用户,内容或产品,并将其作为推荐。 随着平台上创建更多UGC,对于第二阶段,请使用相似性评分(无需训练模型)。 这是我在生产中使用过几次的手工编码的代码。 首先,我用另一个名字来表示Tanimoto分数或Jaccard距离。
"""Data Science Algorithms""" def tanimoto(list1, list2): """tanimoto coefficient
In [2]: list2=['39229', '31995', '32015'] In [3]: list1=['31936', '35989', '27489', '39229', '15468', '31993', '26478'] In [4]: tanimoto(list1,list2) Out[4]: 0.1111111111111111
Uses intersection of two sets to determine numerical score """
intersection = set(list1).intersection(set(list2)) return float(len(intersection))/(len(list1)) +\ len(list2) - len(intersection)
接下来是HBD:这是龙。 跟随者关系在Pandas DataFrame中下载并转换。
翻译自: https://www.infoworld.com/article/3297934/machine-learning-tutorial-how-to-create-a-recommendation-engine.html
机器学习 物理引擎