手把手带你用无监督学习检验国际美食!

本文作者将自己所学的数据科学知识和一颗吃货的心相结合,对12,500个来自世界各地25种菜系的食谱进行了无监督分析,并发现了一些有趣的结论。

Typical Tyrolean Käsespätzle (Image courtesy: https://austria-forum.org/)

像很多人一样,我也是一名吃货。我很幸运能在一个所有食物都是从头开始亲自做的家庭里长大。所有的烹饪都由我妈妈完成,因为她是从德国移民到美国的,我也跟着接触了很多美味的德国菜。我最喜欢的一些包括Käsespätzle,Semmelknödel和Sauerbraten。虽然我没有妈妈的烹饪天赋,但我非常喜欢从头开始做饭的过程,当然也会和我的家人分享的过程。

以此为背景,我觉得开展一个涉及世界各地食谱的数据科学项目肯定很有意思。我想看看是否能够了解世界各地不同菜系的关系。为了探索这个主题,我从代表了25种不同菜系类型的12,000种不同食谱中收集了数据。然后,我进行了自然语言处理(NLP),将文本数据转换为可以输入机器学习算法的格式。最后,我进行了主成分分析(PCA)和主题建模,以获得对数据的深入见解。

数据收集

这个项目的食谱数据来自Yummly。我获得了API的一个学生许可证(谢谢Yummly!),让我可以直接从ipython notebook进行查询和搜索食谱。Yummly支持根据菜系类型进行搜索。以下是所支持的菜系类型清单:

  • 美式,意大利菜,亚洲,墨西哥,美国南部料理,法国,西南地区食物,烧烤,印度,中餐,克里奥尔风味,英国,地中海,希腊,西班牙,德国,泰国,摩洛哥,爱尔兰,日本,古巴,夏威夷,瑞典,匈牙利,葡萄牙

总的来说,我为25种菜系分别下载了大约500份食谱。这就产生了12,500种不同的食谱。关于数据收集,我通过Requests库读取数据,使用内置JSON编码器将JSON数据转换为python字典。之后将数据转换为Pandas DataFrame就相对简单了。下图展示了DataFrame中的某些行:

对于我的分析,我只使用了与菜系和配料相关的列。其他列都被忽略了。

文本数据处理和机器学习工作流

由于数据仅由文本组成,因此有必要使用NLP技术进行许多预处理步骤。这些步骤如下:

  • 用连字符连接某些配料(例如olive-oil橄榄油,corn-starch玉米淀粉)

  • 分词,将配料分解成单词的列表

  • 删除停顿词和其他经常出现的词(例如盐,胡椒,水)

  • 通过删除单词的复数形式和其他后缀来词干化

  • 词袋处理从而创建一个稀疏矩阵,该矩阵由配料列表中的所有单词以及它们出现的频率组成

实现上面步骤列表的工具包括sklearn中的TfidfVectorizer和CountVectorizer。 其中一些步骤,如删除连字符和停顿词,需要编写自己的代码来实现,因为这些步骤更针对于这个具体的用例。读者可以查看我的Github repo来了解更多信息。

我关注的机器学习算法都是无监督学习算法。我用了k-Means 聚类来查看是否可以根据菜系类型将食谱聚集在一起,但是聚类对我的分析并不是很有帮助,因为我不清楚不同的聚类代表什么。相反,我把注意力放在主成分分析(PCA)以及Latent Dirichlet Allocation(LDA)上,具体内容我将在结果部分进一步讨论。

结果

为了能够可视化数据,我实现了降维,以便将1982个维度(对应数据集中不同配料的数量)的特征空间减少到2维。这一步是使用PCA完成的,我保留了前两个主要组成部分。然后,我针对前两个主成分创建了每个食谱的散点图,如下所示:

12492个食谱在前两个主成分上的散点图

当在2维主成分空间中绘制所有食谱时,我没有学到很多信息,因为许多数据点都是重叠的,因此很难从数据中看到任何结构。然而,通过菜系对食谱进行分组并沿着前两个主要成分获取质心值(Centroid values),我可以在数据中看到一些有趣的结构。如下所示:

沿着第一、第二主成分的每种不同菜系质心值的图。组(A)与亚洲美食相关,(B)由日本和夏威夷美食组成,(C)和(D)分别是欧洲和美国美食。组(E)是来自世界各地的美食混合,包括古巴,墨西哥,印度和西班牙。

上面的图提供了一些关于不同菜系关系的有趣见解。我们可以观察到质心值倾向于根据类似的菜系对食谱进行分组。例如,图2中的组(A)由中国,泰国和亚洲菜组成,这些都可以归类为亚洲食品。组(B)包括日本料理和夏威夷料理。这两种菜系都非常注重鱼类,因此将它们紧密地组合在一起是有道理的。组(C)完全由瑞典,法国和德国等欧洲美食组成,不远处的组(D)主要由北美菜肴组成。这些包括南部,烧烤和传统的美式菜。最后,组(E)是来自世界各地的美食混合,包括古巴,墨西哥,印度,西班牙和西南美食。当我想到这些美食时,我会想到加重的味道,所以将这些美食紧密地组合在一起是完全合理的。

读者可能会问的问题是,哪些特征(即配料)与第一和第二主成分的联系最紧密?这可以在下图中看到。

与第一和第二主成分最强烈相关的配料

该图是对两个主成分相应的主要特征的直观表示。鸡肉,大蒜,洋葱和番茄等配料沿着主成分1的正方向有很强的联系。这些口味与西班牙或印度菜等美食有很强的联系。另一方面,鸡蛋,黄油,面粉,牛奶和糖在主成分1的负方向上具有强烈的联系。这些是典型的法国或英国菜肴的原料。同样,大豆,酱油和大米与主成分2的正方向有很强的联系。这些配料在亚洲美食中很常见。最后,奶酪,柠檬,橄榄油和番茄与主成分2的负方向有很强的联系。这些口味在意大利和希腊美食中非常常见。该图有助于解释前一个图的结构,即当沿第一和第二主成分绘制时某些菜系在特定区域聚集在一起的原因。

最后,我还运行了一个LDA模型来进行主题建模(见下文)。我很想知道是否有可能根据各种配料通常所属的美食菜系来将其分离。我指定的主题数量为25,因为我知道数据集中有25种不同的菜系。然而,LDA的结果有点混乱。在某些情况下,LDA主题是特定的菜系,比如意大利菜或泰国菜。然而,还有一些主题是不同类别的菜肴,比如甜点,酱汁,甚至鸡尾酒。虽然这个结果不是我想要的,事后看来它实际上是完全合理的。LDA是一种机器学习技术,可以识别出经常出现在一起的单词组(group of words)。因此,在超过12,000个食谱的语料库中,基于菜肴的类型(即甜点,汤,沙拉或酱汁)而非菜系类型,可能存在更强的单词组关联。

LDA主题建模的结果

思考

我在探索食谱数据集时有很多乐趣,因为我非常享受将我对食物的热爱与我在数据科学中获得的新技能相结合。人们还可以为此类分析做一个商业案例,因为这些信息可用于向Yummly平台的用户提供菜谱推荐。例如,非常喜欢烧烤的人也可能喜欢葡萄牙美食,因为这两种菜系在沿第一二主成分绘制质心时会重叠。这种内在关系是我在没有探索数据之前无法预料的。

然而需要注意的是,本文使用的数据并非没有缺陷。比如,Yummly基本上是一个汇集了来自许多其他食谱网站或博客的食谱网站,所有这些都是英文的。因此,许多食谱可能是站在美国人的角度对其他美食的看法。我相信我的意大利朋友会说像鸡肉和香蒜酱这样掺和在一起的食谱“并不意大利!”,尽管Yummly将这个食谱标记为意大利式。处理这个问题的一个更好的方法可能是找到他们母语的食谱,并使用一些高级翻译算法将它们翻译成英语。然而,由于食物配料可能对特定地理区域是特定的,这也可能导致意外问题。例如,某些配料可能没有英语中的等价物(例如,Prosciutto di Parma,Parmigiano Reggiano),因此这些配料将始终与意大利美食相关联。这可能会导致不同类型的菜系之间只能找到更少的相似性,但仍然值得探索。

非常感谢您阅读我的博客文章。如果想浏览我的代码,可以在Github repo中找到它。此外,我也非常欢迎反馈,如果你喜欢这篇文章,请给我点个赞。

原文标题:

An Examination of International Cuisines through Unsupervised Learning

原文链接:

https://towardsdatascience.com/an-examination-of-international-cuisines-through-unsupervised-learning-93c8b56d1ea0

入门无监督学习
4
相关数据
机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

监督学习技术

监督式学习(Supervised learning),是机器学习中的一个方法,可以由标记好的训练集中学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。训练集是由一系列的训练范例组成,每个训练范例则由输入对象(通常是向量)和预期输出所组成。函数的输出可以是一个连续的值(称为回归分析),或是预测一个分类标签(称作分类)。

语料库技术

语料库一词在语言学上意指大量的文本,通常经过整理,具有既定格式与标记;事实上,语料库英文 "text corpus" 的涵意即为"body of text"。

降维技术

降维算法是将 p+1 个系数的问题简化为 M+1 个系数的问题,其中 M<p。算法执行包括计算变量的 M 个不同线性组合或投射(projection)。然后这 M 个投射作为预测器通过最小二乘法拟合一个线性回归模型。两个主要的方法是主成分回归(principal component regression)和偏最小二乘法(partial least squares)。

查询技术

一般来说,查询是询问的一种形式。它在不同的学科里涵义有所不同。在信息检索领域,查询指的是数据库和信息系统对信息检索的精确要求

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

主成分分析技术

在多元统计分析中,主成分分析(Principal components analysis,PCA)是一种分析、简化数据集的技术。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。由于主成分分析依赖所给数据,所以数据的准确性对分析结果影响很大。

隐含狄利克雷分布技术

隐含狄利克雷分布简称LDA(Latent Dirichlet allocation),是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出。同时它是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可。此外LDA的另一个优点则是,对于每一个主题均可找出一些词语来描述它。LDA首先由Blei, David M.、吴恩达和Jordan, Michael I于2003年提出,目前在文本挖掘领域包括文本主题识别、文本分类以及文本相似度计算方面都有应用。

暂无评论
暂无评论~