家里有两只猫给挖坑,还有世界美食的诱惑,我就被无监督学习完全收服了!...

 

640?wx_fmt=jpeg

 

做者 | Cassie Kozyrkov、Ben Sturmpython

译者 | Sallygit

编辑 | Janegithub

出品 | 人工智能头条(公众号ID:AI_Thinker)算法

 

【导读】无监督学习是推断描述“未标记”数据的分布与关系的机器学习任务,即给予学习算法的示例是未被标记的,所以没有直接的方法来评估算法产生的准确性。无监督学习根据应用任务的不一样的算法也不尽相同,最经常使用应用的是聚类和降维。本次人工智能头条将为你们揭开无监督学习的面纱,经过和两只猫的故事对无监督学习进行简单易懂的解释,并经过对世界美食的探索之旅,开展对无监督学习的实践教程。机器学习

 

 

揭开无监督学习的面纱

 

 

前言

 

无监督式学习其实是一种从数据中挖掘灵感与启发的模式发现技术。可是听起来好像在表达“让孩子们本身学会不要去碰热烤箱”这样的事情,其实无监督学习与机器在没有人监督的状况运行,造成对事物的见解没有任何关系。工具

 

接下来的内容就是为了帮助你们弄清楚到底什么是无监督机器学习!学习

 

640?wx_fmt=jpeg网站

 

若是下面几个概念都以为有那么一点熟悉,那么后面的内容看的时候就不会以为很难,无监督学习可能还会成为你的新朋友~ui

 

  1. 机器学习就是用实例来标记事物编码

  2. 若是你经过输入你所寻找的问题的答案(输入数据及其对应的标签)来训练你的系统,你正在进行监督式学习。

  3. 要开始监督学习,你须要知道你想要(给你输入的数据贴上)什么标签。(非监督式学习则不须要。)

  4. 标准术语包括实例(样本)、特性、标签、模型和算法。

 

什么是无监督式学习?

 

640?wx_fmt=png

 

上面是六个实例,根据你本身喜欢的方式分红两组。是否是以为缺了点什么? 这些照片没有任何的分类标签。不过不用担忧,其实咱们都很擅长这个任务—— 无监督学习。你能够思考一下,你会如何将这些图片分红两组,答案没有对错之分哦。

 

聚类数据

 

在一个课堂上,Google 的员工给出了一些答案如“坐着或站着”、“能看到木地板或不能看到”、“猫在自拍或猫不是在自拍”等等。让咱们来看一下第一个答案。

 

640?wx_fmt=png

一种将图像分红两组的方法:坐vs站。嗯,“坐着”和站着。

 

 

无监督式学习的秘密标签

 

若是您选择根据猫是否站着来进行聚类,那么系统输出是什么标签? 毕竟,机器学习就是标记事物。

 

若是你认为“坐着仍是站着”是标签的话,这个就是您所用的聚类方法(模型)。其实无监督学习的标签更无趣:相似于“第一组和第二组”或“A或B”或者“0或1”。它们只是简单的表示群体成员,没有其余认为解释的含义。

 

640?wx_fmt=png

无监督式学习的标签只是简单的表示聚类的成员。它们没有更高的人类解读的意义,有的只是使人失望的枯燥感。

 

这一切的完成都是借助算法根据类似性来对事物进行分组。类似度的度量是经过选择算法来指定的,可是为何不尝试尽量多的类似度度量呢? 由于你也不知道你在寻找什么,不过能够把非监督式学习当作是数学中的“物以类聚”。就像罗夏墨迹卡同样,其实你不用把你看到的内容看的过重。

 

再来一次

 

做为这两只猫的主人,我难过的是,在将近 50 次的教学中,只有一我的注意到他们应该被分类为“猫1和猫2”。大多数时候答案都是“坐着和站着”或“有无木地板”,有时甚至是“丑猫对漂亮的猫”。

 

640?wx_fmt=png

这是我两只猫的照片! 也许如今你已经注意到了,但大多数人都没有注意到,除非我给他们贴上标签(监督学习)。若是我一开始就给这些数据贴上了名字标签,而后让你给下一张照片分类,我打赌你会发现这个任务很简单。

 

学习感悟

 

想象一下,假如我是一个刚入门学习数据科学的新手,仍是刚开始学习非监督式学习,我对本身的两只猫感兴趣。当我看到这些图片时,我不会对个人猫视若无睹。

 

十年以前,不能期望计算机与世界上最好的模式查找器—— 人脑去竞争这类任务。这些对人们来讲很容易!可又是为何那么多的 Google 员工看到了这些没有标签的照片并无获得“猫1与猫2”的答案呢?由于虽然一些东西对咱们来讲有趣却并不意味着咱们的模式查找器会发现它。即便这个模式查找器很是棒,我也没有告诉它我要找的究竟是什么。

 

那为何我要指望个人学习算法可以实现呢?这又不是魔术!若是我不告诉它正确答案是什么,那么获得什么答案是我不会失望的。我所作的就是查看系统为我计算的聚类,若是我不喜欢这个结果,我就会一遍又一遍地运行另外一种无监督式算法(这个过程就像“观众席上的其余人在用其余的方式区分它们”)直到找到我以为有趣满意的为止。其实这也不能保证在这个过程当中会有灵感启发的事情发生,但尝试一下也无妨。毕竟探索未知老是有一点冒险。

 

总结

 

无监督式学习经过把具备类似的事物分到一组而帮助你从数据中找到启发。有许多不一样的方法来定义类似度,因此在直到一个很酷的模式吸引你的眼球以前,要持续不断的尝试算法和设置!

 


 

 

无监督学习的实践:探索世界美食之旅

 

640?wx_fmt=jpeg

 

背景

 

和不少人同样,我也是超级热爱漂亮食的人。我很幸运在个人成长过程当中,咱们家里都是本身作饭,而个人妈妈负责为咱们作出各类美食。由于她是从德国移民来了美国,因此我也接触过不少美味的德国菜,其中我最喜欢的有鸡蛋面, 水煮面粉球和酸味炖肉。虽然我不能说我继承了我妈妈的厨艺天赋,但我也很是喜欢喜欢作饭,喜欢和个人家人们分享这个过程。

 

出于本身对美食的热爱,我在想若是进行一个涉及世界各地美食的研究项目将会是一件颇有趣的事情。我想看看我是否能从中了解到世界各 地不一样美食间的关系。为了探索这个主题,我收集了超过12000种不一样食谱的数据,这些食谱表明了25种不一样的美食。而后,我经过使用天然语言处理技术将文本数据转换为一种能够输入机器学习算法中的格式。最后,我利用主成分分析(PCA)和主题建模来得到数据的更深层面的理解。

 

收集数据

 

在个人项目中数据均来自于 Yummly,我得到了他们的 API 受权。所以我能够直接从 ipython 上查询和搜索菜谱。Yummly 支持基于菜肴类型进行搜索,如下是他们所支持的菜肴类型的列表:

 

美式料理,意大利料理,亚洲美食,墨西哥料理,南部和灵魂料理,法式料理,西南部美食,烧烤,印度料理,中国料理,路易斯安娜州和克里奥尔料理,英国料理,地中海部分美食,希腊美食,西班牙料理,德国美食,泰国美食 ,摩洛哥料理,爱尔兰美食,日本料理,古巴美食,夏威夷美食,瑞典美食,匈牙利美食,葡萄牙美食。

 

我下载了25种菜系,每一个菜系都有将近500份的食谱,总共下载了将近12500不一样的食谱。关于数据收集, 我使用了 Requests 库进行读取数据,以及内置JSON 编码器将数据转换为 python字典。而后,再将数据转换成PandasDataFrame, 这个就相对简单了。以下面显示,在个人分析中,我只使用了对应于烹饪和配料的列而忽略了其余列。

 

640?wx_fmt=png

所选的Yummly食谱的数据列

 

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

 

因为数据只包含文本,所以有必要使用天然语言处理技术实现一些预处理步骤。包括的步骤以下:

 

1.链接某些成分(如:橄榄油、玉米淀粉)

2.将成分分解成单词列表

3.删除中止词和其余常常出现的词(如盐、胡椒、水)

4.删除词尾的复数形式和其余后缀

5.词库处理,建立一个稀疏矩阵,包含成分列表中的全部词以及它们出现的频率

 

用来实现这些步骤的工具包括在sklearn 中找到的 TfidfVectorizer 和 CountVectorizer。其中还有一些步骤,好比连字符和中止字删除,是我本身编写的代码来实现的,能够在 GitHub 上看到相关的代码。

 

在项目中我使用了机器学习的无监督算法,尝试作 K-Means 聚类,来肯定是否能够根据烹饪类型将菜谱组合在一块儿,可是我发现聚类对个人分析并非颇有帮助,由于不清楚不一样的聚类表明了什么。以后我将注意力集中在主成分分析(PCA)和主题生成模型(LDA)上,更多的结果分析接下来和你们一块儿讨论和分享。

 

结果分析

 

为了对数据进行可视化,须要先进行降维操做,从1982维的特征空间减小到2维,经过PCA 保留前两个主成分。而后我针对主成分建立了一个散点图,以下所示。

 

640?wx_fmt=png

 包含关于第一个和第二个主成分分析的全部12492份食谱的散点图

 

在绘制全部食谱的主成分散点图的过程当中,由于许多数据点是重叠的,因此很难在数据中看到任何结构。然而,经过根据菜肴对食谱进行分组,并沿着两个主要成分取中间值,我能够在数据中看到一些有趣的结构。以下图所示。

 

640?wx_fmt=png

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

 

上面的图提供了一些关于不一样菜肴关系的有趣的深层分析。咱们能够观察到散点图的中心值每每倾向于相似的美食菜谱类型。例如,图2中的A组包括中国、泰国和亚洲料理,它们均可以归类为亚洲食品。B组由日本和夏威夷料理组成。这两种菜系都很是强调鱼,因此它们被紧密地联系在一块儿是有道理的。C组彻底由欧洲菜组成,如瑞典菜、法国菜和德国菜,不远处的D组主要由北美菜组成。这些包括南美美食,烤肉和传统的美式料理。最后,E组是一个混合了来自世界各地的不一样菜系的集合。这包括古巴,墨西哥,印度,西班牙和西南部美食。当我想到这些菜系时,我想到的是大和大胆的味道,因此这些菜系会被紧密地组合在一块儿,也是彻底合理的。

 

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

640?wx_fmt=png

显示了与第一和第二主要成分联系最紧密的成分

 

这个图提供另两个主成分中每个主要特征的直观表示。鸡肉、大蒜、洋葱和西红柿等原料在成分一的正方向上有很强的联系。这些口味与西班牙或印度的菜肴有着紧密的联系。另外一方面,鸡蛋、黄油、面粉、牛奶和糖在成分一的反方向上有很强的联系。这些都是法国或英国菜肴中常见的配料。一样,大豆、酱油和大米与第二主成分的正方向有着很强的联系。这些食材在亚洲菜系中很常见。最后,芝士、柠檬、橄榄油和番茄与成分二的负极有很强的联系。这些味道在乎大利和希腊菜中很常见。这个图有助于解读前一个图,即为何在沿着第一个和第二个主成分绘制散点图时,某些菜系会汇集在特定的区域。

 

最后,我还运行了一个主题生成模型来进行主题建模。我很好奇是否可以根据不一样的菜肴来区分不一样的食材。我指定主题的数量为 25,由于在个人数据集中共有 25 种不一样的菜系。然而,主题生成模型给出的的结果有点混乱。在某些状况下,LDA 给出的主题是特定的菜系,如意大利菜或泰国菜。然而,有些主题倒是不一样种类的菜品,如甜点、酱汁,甚至是鸡尾酒。虽然这个结果不是我想要的,但回想起来,它仍是颇有意义的。LDA 是一种机器学习技术,能够识别常常出如今一块儿的单词组。因此,在超过12000个食谱的语料库中,菜品的类型(如甜点、汤、沙拉或酱料)可能比菜系的类型会有更强的关联。

 

640?wx_fmt=png

主题生成模型 LDA 给出的结果

 

实践感悟

 

在探索食谱数据集的过程当中我获得了不少乐趣,由于我喜欢将我对食物的热爱与我学习的新技能结合起来。另外咱们还能够根据这种分析提供一个优秀的商业案例,这些信息能够用来为Yummly平台的用户提供美食建议。例如,一个很是喜欢烧烤的人可能也会很喜欢葡萄牙美食,由于这两种不一样的美食的第一和第二主成分的散点图中心重叠。相似这样的关系若是没有对这些数据进行深刻的探索是没法得知的。

 

可是在这里我还要另外声明一件重要的事,在这个项目研究中使用的数据也是存在必定缺点的。例如,Yummly基本上是一个聚集了许多其它菜谱网站或博客的英语网站。所以,这些食谱中不少多是美国人对其余美食类型的见解。我敢确定个人意大利朋友们会说,把鸡肉和香蒜酱混合在一块儿的美食“不是意大利菜!”但Yummly仍是把这道菜谱标记为了意大利菜。解决这个问题的一个很好的办法是利用他们的母语食谱,使用一些高级的翻译算法将它们翻译成英语。然而,因为某些成分可能对特定的地理位置具备特定性,也可能也会致使一些其余的问题。例如,某些配料在英语中可能没有对应的名称(例如,意大利熏火腿、帕尔玛干酪),所以这些配料将永远与意大利美食联系在一块儿,这可能会减小不一样菜系之间的类似点,但我仍然认为这是值得探索的。

 

参考连接:

https://hackernoon.com/unsupervised-learning-demystified-4060eecedeaf

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

GitHub 地址:

https://github.com/bwsturm/metis_bootcamp/tree/master/Week7/fletcher

 

—【完】—