熊猫之旅
Photo by Diana Silaraja on Pexels
Pandas 是一个用于处理数据的 python 库。在这篇文章中,我们将回顾我作为数据科学家最常用的一些 pandas 方法。
首先让我们导入熊猫库:
import pandas as pd
- 读取数据
我通常对熊猫做的第一件事就是把数据读入所谓的熊猫数据帧。我们将使用来自 Kaggle 的奥斯丁动物中心收容所结果数据。如果我们想在。csv 文件我们可以做到以下几点:
df = pd.read_csv("aac_shelter_outcomes.csv")
我们也可以使用。头()和。tail()方法分别查看第一行和最后五行数据:
print(df.head())
print(df.tail())
我们还可以查看列名:
print(df.columns)
这对于包含大量列的数据集尤其有用。
2.清理资料用。dropna()和。菲尔娜()
在真实数据中,我们经常需要处理数据列中缺失的值。使用 pandas,我们可以通过执行以下操作快速了解数据有多稀疏:
print(df.isnull().sum())
如果数据中有缺失值,我们可以使用。dropna()方法删除这些值。这可以就地完成,我们可以返回一个值,我们可以将它存储在一个新的变量中。要将缺少的值放到适当的位置:
df.dropna(inplace=True)
这里 df 变量已经被修改了。或者,我们可以:
df = df.dropna()
我们可以在删除丢失的值之前和之后检查数据帧的长度:
print("Length Before:", len(df))
df.dropna(inplace=True)
print("Length After:", len(df))
类似地,如果您想要填充数据帧中缺失的值,我们假设在适当的位置用零填充:
df.fillna(0, inplace=True)
或者:
df = df.fillna(0)
因为我们在这里输入缺失值,所以数据帧的长度不应改变:
print("Length Before:", len(df))
df.fillna(0, inplace=True)
print("Length After:", len(df))
3.过滤数据
我们可以很容易地根据列值过滤数据帧。例如,如果我们想要阉割的雌性獒混种狗,我们可以写:
df = df[df['breed'== 'Mastiff Mix']]
df = df[df['sex_upon_outcome'] == 'Spayed Female']
print(df.head())
我们也可以很容易地处理时间戳。pandas 将大多数时间值处理为字符串,因此我们需要将感兴趣的日期转换为 datetime 对象:
df['date_of_birth'] = pd.to_datetime(df['date_of_birth'])
我们还可以从日期时间值中提取周、月和年的值:
df['week_of_birth'] = df['date_of_birth'].dt.week
df['month_of_birth'] = df['date_of_birth'].dt.month
df['year_of_birth'] = df['date_of_birth'].dt.year
print(df.head())
然后,我们可以根据周、月或年过滤数据框架。例如,我们可以提取第一个月的数据:
df = df[df['month_of_birth'] == 1]
print(df.head())
我们可以看到,由于我们删除了一些数据,指数也被修改。我们可以使用 reset_index 来解决这个问题:
df = df[df['month_of_birth'] == 1].reset_index()
print(df.head())
我们也可以重新定义指数:
df = df.set_index('month_of_birth')
print(df.head())
4.选择行和列
我们可以利用。iloc()来选择索引。要选择数据集中的第一个、第二个和最后一个索引:
print(df.head())
print("---------------------First---------------------")
print(df.iloc[0])
print("---------------------Second---------------------")
print(df.iloc[1])
print("---------------------Last---------------------")
print(df.iloc[-1])
你可以用。特定列的 loc():
print("---------------------First---------------------")
print(df.loc[0, 'breed'])
print("---------------------Second---------------------")
print(df.loc[1, 'breed'])
我们也可以在一列中选择多行:
print("---------------------First---------------------")
print(df.loc[0:3, 'breed'])
print("---------------------Second---------------------")
print(df.loc[3:6, 'breed'])
5.汇总数据&生成统计数据
另一个有用的方法是。可用于聚合数据的 groupby()方法。假设我们想知道数据集中某一年每种类型的品种的数量:
df = df.groupby(['year_of_birth', 'breed'])['breed'].count()
print(df.head())
假设我们需要每个品种的平均出生周数:
df = df.groupby('breed')['week_of_birth'].mean()
print(df.head())
我们可以使用 sum()、std()、max()和 min()等方法进行类似的聚合。
6.写入文件
最后,如果我们对数据帧做了足够的修改,我们会想把它保存到一个单独的文件中。to_csv():
df.to_csv("new_name_of_file.csv")
我希望这有所帮助。这篇文章的代码可以在 GitHub 上找到。
祝你好运,享受你的熊猫之旅!
用于教授机器学习的纸牌游戏
解释监督学习、非监督学习和强化学习
Image www.pexels.com
由于人工智能和机器学习在我们的社会中越来越重要,关于它们的知识是一般知识的重要组成部分。这也给科学家和教育工作者提出了一个问题,如何教授这个主题和重要的基本概念。如下文所述,已经有向小学生教授这些内容的方法:
最近,有人请我给五六年级的小学生(即年龄…
towardsdatascience.com](/explaining-ai-to-primary-school-kids-9d875d23ec1e)
它背后的技术,尤其是数学基础,并不是每个人都喜欢的。因此,需要新的知识转移方法。
我为我的学生开发了一个纸牌游戏,帮助他们理解机器学习的重要原理。我想在本文中简单介绍一下。该游戏旨在展示“监督学习”、“非监督学习”和“强化学习”的原理。学生们以一种有趣的方式发现最重要的想法,并对机器学习程序的功能发展出一种感觉。
这套扑克牌由 32 张印有独立图案的牌组成。每张扑克牌代表一个数据集。
无监督学习
学生被分成 4 人一组,每个游戏组收到以下 16 张扑克牌:
Cards without labels / Image by the author
任务是将卡片分成 4 组,学生们认为它们属于同一个组。然后他们必须描述哪些特征被用来区分。
可以根据以下特征来区分纸牌:
-线条的粗细
-线条颜色的不透明度
数据的所有其他特征,如颜色、行数、精确定位等。对区分没有贡献。
这些卡片组具有以下特征:
-A 组:4 毫米线宽,50%不透明度
-B 组:4 毫米线宽,100%不透明度
-C 组:6 毫米线宽,100%不透明度
-D 组:6 毫米线宽,50%不透明度
任务是教导机器学习算法学习特征的正确特征和特性是重要的。将数据表示为特征值是至关重要的。它还展示了无监督学习(聚类)是如何工作的。
监督学习
第二个任务是解释卡片上能看到什么。然而,这需要额外的信息。这是以 16 张附加卡片的形式给出的,除了图案之外,还注明了卡片上可以看到的内容。有 4 个不同的“对象”可以查看:
“A”、“B”、“C”和“D”:
Cards with labels / Image by the author
因此,学生的任务是分配任务 1 的 4 组中的哪一组属于哪一类物体。额外的卡片代表一个带标签的数据集,这项任务阐明了监督学习的原理。
强化学习
第三个任务是以不同的方式找出哪些对象属于比其他对象“更强”的特定类。没有“标签数据集”形式的数据显示与此类的关联。对象的这种特殊属性必须由学生纯粹从游戏行为中获得。
游戏的规则如下:
-一组 4 个玩家中的 2 个在不告知其他两个的情况下,将 4 个类别中的一个固定为特殊类别(“川普”)。
-任务的目标是其他两名玩家在游戏的下一阶段找出哪些牌属于“王牌类别”。
-打出带有标记的 16 张牌。这些牌被分成 4 张牌,每张牌有 4 张。
-4 名玩家每人在一轮中将一张牌放在桌上。拥有竖线数量最多的牌的玩家赢得这一轮,并获得所有 4 张牌。除非其中一张牌属于“王牌”类别,否则它赢。(这个可以由 2 位选手来判断。)
-如果回合中王牌类别的牌较多,则线条最多的王牌获胜。
-如果几个有相同线数的玩家赢了,则牌被分开。
从几轮比赛的结果来看,肯定是试图认清“川普”的属性。
基本思路来源于卡牌游戏"Watten"(https://en . Wikipedia . org/wiki/Watten _(card _ game)))
在这个游戏中练习的以卡片(物体)为王牌的学习形式,是一种强化学习的形式。在每一轮之后,给出一个玩家的理论,哪个类别是该轮结果的王牌或者被丢弃。
通过这 3 项任务,可以借助卡片展示机器学习的不同变体。通过有趣的方法和学生自己的实验,理解得到了促进,障碍被消除了。
卡的 PDF 文件可在此下载打印:
http://www . stoeckl . ai/WP-content/uploads/2019/12/ml cards _ part 1 . pdf
http://www . stoeckl . ai/WP-content/uploads/2019/12/ml cards _ part 2 . pdf
核能案例:用低碳能源架起通往可再生能源的桥梁
循证政策比你或你的感觉更重要——第三部分
他们说破解偏见比破解原子更难。如果所说的偏见是关于分裂原子,这句格言就更正确了。在全球范围内,只有 38% 的人赞成核能,甚至低于出于某种原因支持煤炭发电的 48%。相比之下,可再生能源的支持率高达 97%(太阳能)和 93%(风能)。绿色很酷(至少作为一个概念)。尽管几乎所有国家的能源组合都与这些公开宣称的偏好相去甚远,但可再生能源得到了大量补贴,因此正在崛起,与煤炭、石油或天然气等污染能源展开竞争,并逐渐取代它们。他们应该这样做。然而,由于某种原因,核能经常被包括在所述肮脏能源中。这不仅导致了低支持率,也为从能源组合中彻底去除核能铺平了道路。如果你关心环境,那是你现在最不应该做的事情。
核能是一种高效&低碳能源
分裂一个原子,如核反应堆中最常用的同位素铀-235,会释放出巨大的能量,这些能量可以以电能的形式加以利用。在美国,近 100 个剩余的核反应堆仍然提供了该国约 20%的电力输出。比这个数字更重要的是,与将核能与煤 T15 气混为一谈的企图相反,提供的能源是清洁低碳能源。事实上,核能仍然占美国所有低碳能源的一半以上,因为所采用的核链式反应本身不会导致二氧化碳排放。
A) 2017 US energy mix (consumption) in percent. B) Relative proportion of low-carbon energy sources for the 2017 US energy mix (consumption). Source
还有更多支持核能的理由。铀具有极高的能量密度,其需求量远低于煤或天然气。因此,铀的开采足迹与破坏和污染景观的巨大煤矿或者将石油泄漏到珍贵生态区的沉没油轮相比是微不足道的。核能发电厂需要的钢材和混凝土仅仅是太阳能或风能产生的相同能量的一小部分。作为一个推论,核能占用的空间/土地也比可再生能源少得多(事实上比可再生能源少几百倍)。但这不是一场核能与可再生能源的战争。如果有什么不同的话,可再生能源和核能应该是团队成员,在一个仍然被碳基能源生产牢牢控制的世界里,这两个纯洁的典范。因为,至少在美国,核能和可再生能源加在一起还不到总发电量的三分之一,其余都来自煤炭、石油和天然气。
由于大众观点&错误的意图,核能目前正在撤退
因此,鉴于之前关于煤炭和天然气在我们的能源组合中占主导地位的说法,你可能会认为公民、活动家和政府的首要任务是以牺牲煤炭、石油和天然气为代价来扩大可再生能源。然而令人惊讶的是,环保主义者的愤怒至少在很大程度上也是针对核能的。尽管活动家们宣称气候变化是一种生存风险(我当然会认同),但他们愿意牺牲核能形式的低碳能源生产。因为这是经常发生的事情。由于人们不会神奇地开始使用更少的能源,一旦核反应堆“退役”,它产生的能源现在必须以另一种方式产生。不幸的是,这种方式几乎总是发生在天然气利用的增加,而不是可再生能源的增加,从而增加了二氧化碳的排放。
2012 年加州圣奥诺弗雷核电站关闭事件很好地证明了这一点。通常情况下,这种关闭增加了来自天然气的能源比例,据 T2 估计,这些额外的排放相当于 T4 增加了 200 万辆汽车。这种普遍影响是如此强烈,以至于在全球范围内,尽管可再生能源的发展势不可挡,但从 90 年代到 2014 年,低碳电力的份额下降了几个百分点。至少在很大程度上,这是由于在环保团体的要求下,许多国家关闭了核电站。别误会我的意思。我不赞成建造更多的核电站(至少不赞成目前的核电站形式)。我只是说,如果我们真的关心排放和环境,我们就不应该关闭现有的工厂。可再生能源替代的顺序应该是煤→天然气→核能。目前,我们基本上走的是相反的方向。
假设你不关心环境,只关心你的电费。有一些反对核能的经济论据,其中包括对核电厂所代表的巨大长期投资(每台几十亿美元)的抨击。一座发电厂的建设需要数年时间,并且经常受到延误的困扰。然后,一旦它最终运行,一个核反应堆基本上是永久发电。这对于提供高度可变能量的可再生能源来说不是很好(例如太阳能,它只在白天提供能量,或者水力发电,它受到干旱的影响),并且需要一个灵活的对等物,可以在停机期间进行补偿。这是天然气取代核能的一个原因,因为它天生灵活,适应可再生能源的节奏。此外,由于新的压裂技术,不幸的是真的很便宜。
我们可以很容易地绕过关于长期投资的第一个论点,重申这场辩论不是关于建设新的核电站,而是尽可能长时间地保留剩余的核电站。关于核能发电缺乏灵活性的第二个论点可以通过两点来解决。首先,像安装在瑞士 Goesgen 工厂的这样的技术允许对核反应堆输出进行高达 50%的调节(每分钟 30 兆瓦),从而大大增加了核电的灵活性。第二,开发高效电池来储存能量不仅有助于核能保持竞争力,还能缓解可再生能源的不确定性。最后,关于成本因素,我们必须记住可再生能源获得的令人难以置信的补贴,这是它们相对较低的电力成本的原因。因此,如果有真正的去碳化的政治意愿,人们可以设想对核能进行某种程度的补贴,以抑制煤和天然气的使用。
核能比你想象的要安全得多
当然,在讨论核能时,我们必须面对这个问题:安全。环保主义者经常引用安全问题作为论据,这也是为什么那些将气候变化视为生存危机的活动人士矛盾地将核电站视为生存威胁的原因之一。这里最根本的错误当然是将核能等同于核弹。虽然后者肯定能够夷平整个城市,并通过致命的辐射使周围的大片地区无法居住,但核电站不能也不会这样做。首先,让我们观察一下,在 30 多个国家的核反应堆累积的大约 17 000 个反应堆年中,总共发生了三起重大反应堆事故。
在其中的两起事故中,三里岛和福岛第一核电站,没有一个人死于直接辐射,而有一个人死于癌症。相反,想想最初导致福岛第一核电站反应堆熔毁的海啸在造成的近 16 000 人死亡。历史上最严重的反应堆事故,1986 年切尔诺贝利反应堆熔毁,直接导致 31 人死亡,15 人(直到 2011 年)死于随后的癌症。最常见的辐射引发的癌症,甲状腺癌,幸运的是,如果早期诊断,是可以治疗的(当然,对已知辐射暴露的地区进行严格筛查)。相比之下,每年有多达 1 00 万人死于与煤炭相关的空气污染(加上每年死于煤矿的许多人)。事实上,每一种能源生产方式的每太瓦时死亡率都比核能高,除了水力发电(如果你好奇,人们在安装太阳能电池板时会从屋顶掉下来死去,从而推高了死亡率)。
Safety of energy sources in deaths per terawatt hour (globally, 2011). One terawatt hour is equivalent to one trillion watts. Source
核反应堆熔化时不可能像炸弹一样爆炸。熔毁期间向外界释放的辐射也因剩余的反应堆结构而大幅降低。想想福岛第一核电站的三重熔毁,它未能对继续在现场工作以减轻损害的 200 多名助手造成致命影响。政府研究发现,目前的核反应堆设计可以承受一架加满燃料的波音 767–400迎面相撞,这不仅证明了核反应堆的坚固性,也摒弃了核反应堆是恐怖分子生存威胁或目标的陈腐观点。事实上,几乎没有任何民用建筑比核反应堆防护得更好。
最后,我愿意承认储存核废料是一个问题,尤其是考虑到它保持放射性的时间。然而,有办法解决这个问题。一个步骤是利用核弹头作为反应堆的燃料。除了令人满意的核武库的减少,这通过使用已经放射性的“军事废物”作为输入减少了放射性足迹。另一种在此过程中获得更多能源而不产生更多核废料的方法是核回收,其中你使用一种反应堆的核废料为另一种反应堆提供动力,从相同数量的材料中提取更多的能量。最后但同样重要的是,未来使用钍而不是铀运行的反应堆也将改善这种情况。钍的含量比铀-235 多 500 倍,钍反应堆在运行中会更安全,其核废料的放射性只有传统核废料的千分之一。
核能是一种低碳能源,但却像“肮脏”能源一样受到监管。核能是我们目前拥有的最安全的能源之一,然而它却受到监管,就好像它是最危险的能源之一。这里有一个共同的主题。围绕核能的争论主要是由意识形态而非证据推动的。然而,我们正在输掉这场战斗。越来越多的核电站关闭,不再建造新的反应堆。三里岛在 1979 年经受住了灾难,现在面临着被廉价天然气挤出市场。廉价的天然气将继续加剧气候变化对我们所有人和我们的孩子的可怕影响。如果你不喜欢核能,没关系。也许有一天,我们可以关闭最后一个反应堆,用可再生能源取而代之。但这次不是今天。如果你关心我们的气候环境,你应该关心核能以及替代它的东西。
做对的机会:拥抱自动化决策
franki chamak for unsplash
用 ADM 减少偏差
几十年来,我们带着一种无可奈何的无奈目睹了不平衡的权力、财富、种族和性别动态扭曲了我们最基本的权利:自由、追求幸福、工作,甚至是我们头顶上的屋顶。经济差距、种族偏见和性别歧视如此根深蒂固,我们常常忘记看清它们的本质:源于几个世纪的不平等、种族主义和厌女症的系统性偏见决策的结果。
因此……在训练我们人类思维的“数据集”中积累了多年的错误数据。
上周在柏林举行的人工智能峰会上,伦理是一个热门话题。现在,自动化决策(ADM ),或者至少是对它的半知半解,无处不在,对有偏见的数据和歧视性决策的担忧十分猖獗。
是时候了!
政客们正在质疑预测性警务的公平性。伦理机构要求对雇佣算法进行问责。为计算信用分数而输入训练集的数据正在被剖析,以寻找偏见的痕迹。
本质上,既然机器正在做出错误的决定,我们就要奋起反抗。
这里的最终目标——为所有人的利益作出公正的决定——是最崇高的事业。但似乎我们对 ADM 的期望取代了我们对自己的期望,以及我们人类做出公正决定的能力,或者说缺乏这种能力。
这显然没有错!没有人希望机器延续我们人类的弱点。尤其是当两倍、三倍、四倍——质疑数据和决策的准确性和公平性可能意味着正确和不正确的医疗诊断、错误和合理的监禁以及适合我们特定体型的最好和最差牛仔裤之间的差异。好吧…划掉最后一个。
而且,如果我们对完美算法的厚望是由于新发现的不愿对非法监禁、雇佣歧视、偏袒和裙带关系视而不见的结果,那就更好了!健康的怀疑是一种受欢迎的批评和监管形式,如果它确实能防止我们偏离非歧视性(自动化)决策的正确道路。
但最近,对 ADM 的非理性焦虑表明了对人工超级智能和奇点的好莱坞先驱的天真信仰。反对 ADM 的声音越来越大,越来越无知,越来越具有煽动性,这似乎是因为害怕将我们最独特和最具决定性的人类能力,即思考和判断的能力交给机器。考虑到我们在运用这些技能时相对糟糕的记录,这有点荒谬…
如果你从这篇文章中只带走一件事,请让它成为这样:算法做出的任何有偏见和歧视性的自动化决策都是我们自己糟糕的决策能力的直接反映。
不要射杀信使!
有无数的机构、基金会和工作论文致力于道德 AI 和 ADM 的主题。他们阐述了问责制、可追溯性、补救和整体公平的重要性。它们阐明了多样化的团队和庞大的(无错误的)数据集将如何帮助我们做出公正的决策。这很有道理!我们的观点越多,数据越有代表性,判断或评估不公平的可能性就越小。当然,自动化决策和我们一样有缺陷。
因此,与其坚持认为它们是问题所在,不如承认我们确实是问题所在。承认我们历史上不可靠的决策性能可能是自动化决策正确的唯一方式。历史会重演。至少在模拟世界里是这样。在数字世界并非如此。机器与我们相比有一个明显的优势,那就是它们不会注定不断重复错误。他们比我们更好地学习和记忆。
如果训练得当,自动化决策可能会把我们从固有的偏见中拯救出来!
要跟踪关于伦理 ADM 和机器学习的讨论,请查看 WEF 的工作论文 如何防止机器学习中的歧视性结果 。
一个中国人对中国房间的看法
触发预警:无聊指数 9/10。这不是一篇关于激动人心的技术突破的文章,相反,这是一篇人工智能哲学论文,提炼了 40 年之久的中国房间思想实验——如果按照最初的设计工作,智能交流的人将无法理解他们所读或写的东西……
背景
1980 年,在加州大学伯克利分校(我在那里获得数据科学硕士学位)任教的 John Searle 先生发表了著名的中文房间思想实验。
塞尔先生是一位哲学家,他并没有自称是人工智能研究者。然而,中文教室是一个非常有影响力的哲学思想实验,它影响了人工智能研究,尤其是在 NLP 中,也是争论最激烈的实验之一。
此外,塞尔先生“一句中文都不会说”,这是思维实验的关键组成部分之一——它需要是实验者不理解的语言。
有点耐人寻味的是,到目前为止,没有多少说中文的人工智能研究人员加入这场辩论…
中国人的房间
中文房间思维实验的一个过于简洁的描述说如果你有一本完整的规则书,关于什么问题符号序列应该用什么答案符号序列来回答,你可能最终会遇到这样一个人,他不理解那些符号的含义,但却能对用那种语言提出的问题做出“看似”连贯的反应。(不懂中文的人将遵循中文回答规则书,从封闭房间的窗户提供对书面问题的回答;对于房间外的一个说中文的人来说,这和一个真正的说中文的人没什么区别。)
直到这一部分,这是一个僵化的见解。合理的结论是能够产生看似明智的反应可能不足以表明实际上普遍聪明。(Searly 先生演讲中的 StrongAI,或者更广泛的 AI 圈子中的 AGI)
作为一名哲学家,塞尔先生进一步争辩说,这个思想实验意味着一个执行计算机的程序不可能有思想或意识。
虽然最初的思维实验需要一个不懂中文的人被锁在房间里进行实验,以提出一个观点,但作为一个在人工智能相关领域获得学位并会说中文的人,我将重新开始这个讨论,因为自从这个思维实验在近 40 年前首次发表以来,人工智能领域已经经历了巨大的进步…
一位中国演讲者
我在中国北京长大,那里的官方语言是普通话。但是我的祖母只会说广东话,这是一种在中国以外更为人所知的中国方言。粤语是我的“第二语言”。虽然写了下来,但它们 99%是一样的,说一种语言的人很难理解另一种语言。
在去中学学习英语之前,我的想法和塞尔先生一样——学习另一种语言只是学习每个单词的(符号)映射,然后我们可以把新单词(或单词的新发音)放在一起,形成句子、段落和讲话。因为我就是这样学粤语的,所以对我来说,这个假设显然是“被证实了”的。
塞尔先生的思想实验将按照他的设想在字面上完成*,略有不同——我可以在一个房间里,使用发音规则口述一个用粤语对我说的句子,写下它们,并写下答案,然后我使用发音规则读出它,本质上,我不会认识或理解粤语,但我将能够通过发音规则书与讲粤语的人交流。*
此时,目光敏锐的可能会提出异议:“等等,在你的例子中,你已经理解了书面语言,一旦你写下来,你就理解了,在塞尔先生的中文教室里,他也不理解书面语言。”**
答对了。你猜对了。
B 能够处理“我不理解的符号”以产生有意义的反应,需要超出规则书的相当高的智力水平,我很快就会发现…
学习真正的外语
对于天真无邪的 11 岁的我来说,学习英语的前几个单词“效果很好”。一旦我超越了“桌子”、“椅子”和一个“人”,我就开始质疑老师的胜任能力——“你为什么把它弄得这么复杂,神奇的绘图本在哪里?”
不久,我意识到“嗯……”学习另一种语言不仅仅是用新的符号替换我的词汇,或者用新的规则替换我的句法。我需要学习一整套惯例,句子的构成远非“遵循严格的规则”——它们更像是模式而非逻辑。
事实上,有一个词是由以汉语为母语的英语学习者创造的——“中式英语”。它指的是中国人使用英语单词,但中国人的逻辑和惯例来表达自己。或多或少有点像“遵循规则书来处理新符号”。(还有法国式英语、德国式英语等……)
现在人们普遍认为,学习另一种语言的最好方法是让自己“沉浸”在这种新的语言中,除了词汇和正式语法之外,通过使用它的所有模式和“软规则”来学习。
那么学粤语和学英语有什么区别呢?对于一个说普通话的人来说,粤语的“思维方式”和普通话非常相似——毕竟,它们是同一种语言,只是方言不同(发音、一些短语和一些表达)。这意味着代理人(在这种情况下是我)实际上(几乎)拥有处理新符号所需的所有智能(通过我的第一语言普通话学习),而且粤语和普通话之间确实存在严格的映射规则——然而,这推翻了塞尔先生关于被锁在房间里的人“对中文一无所知”的说法事实上,被关在房间里的人几乎知道所有关于汉语的事情,除了有严格翻译规则的发音。
学习英语是不同的,实际上有一些使用我以前从未练习过的英语语言的智慧,并且采用这样的语言智慧不仅仅是“学习规则”——新的模式,新的抽象方法被获得。
A common joke Chinese speakers tell is “中国队大胜美国队” and “中国队大败美国队” actually both mean the Chinese team beat the Americans — yet, “胜” means winning, and “败” means losing. The logic is in the case of “losing”, it meant “causing… to lose”, if you want it to mean the Chinese team is lost, it needs to be said as “中国队大败于美国队” (败于 means “lost to”).
实际上,我不能把上面的话直接翻译成英语,没有一种英语表达方式能捕捉到这两种表达方式的语义,并保持这种微妙的近乎幽默的差异是可以理解的。同样,我也不能用中国人的思维方式处理所有的英文符号…
难以捉摸的规则手册
所以,我通过说中文和英文学到的一件事是,要能够处理另一种语言,实际上需要相当高的智力水平!按照简单的“逻辑”规则,我连连贯的英语都说不出来——更不用说聪明地回答英语问题了。
不仅我从未得到过我梦寐以求的学习另一种语言(英语)的规则手册,而且用任何一种语言回答所有问题的规则手册都巧妙地回避了发明(也许永远不会)。
人工智能在过去 40 年中取得的进步之一是研究人员开始承认纯粹基于逻辑的表达不是人类语言的超集——已经证明一阶逻辑是自然语言的子集。意义,我们将无法用一种正式的表达方式来表达一种语言所能传达的所有意义。
换一种说法(一种更哲学的说法),人类的所有智能能否外化为信息存储,独立于信息处理代理?有没有可能有人“转储”了所有人类的智能(不仅仅是知识,而是智能处理所有人类问题所需的全部内容),并保留了所有的智能,以供机械机器(图灵完整机器)进行后期处理?
我们其实离这个问题说“不”越来越近了。
所有智能都可以被记录在静态存储器中,然后只需要进行逻辑处理,就可以像完全智能一样“表现”出来,这种假设被广泛认为是不可行的。人类的智能不能仅仅用公理(可以存储并视为真理的东西)和逻辑推理来完全描述。这主要得益于中国房间实验后几十年人工智能研究的进步。
将所有人类智能外化到信息存储设备的可行性是中文房间思维实验的第一个次要过时点——假设的“完整的中文规则书”不存在。
所以如果中文房间能通过图灵测试,那么肯定有比规则书和房间里藏着的非中文说话者和更多的东西。**
如果我童年时梦想有这样一本简单的规则手册,学习和使用第二语言可能就不会那么痛苦了,但令 10 岁的我沮丧的是,我们从未能够创造出这样一本规则手册。我们在这一领域做的研究越多,我们就越不相信一个纯粹的“规则手册”(或表达的正式语法模型)足以完全表达人类的智慧,实际上,由于能够说中文和英文,我不太确定“你怎么说”和“你说什么”可以完全分开…
语法与语义
塞尔先生选择汉语(与英语相比)作为他的思维实验目标是好的,因为这两种语言的差异足以研究“不同形式的智力表达”。事实上,我很幸运地学会了这两种语言,这帮助我明白了用两种不同的语言表达自己实际上是如何扩展我的智力范围的。重叠不是 100%。(相比之下,如果一个说马德林语的人被锁在一个粤语房间里,思维实验不会揭示太多关于句法和语义理解之间关系的洞察力)。
自 1980 年以来,句法结构和语义问题已被广泛研究(再次,部分归功于塞尔先生的贡献)。
句法“规则”指导如何构造句子(正式)。
语义决定句子所承载和传达的是什么意思(内容)。
塞尔先生认为程序只能从语法上处理,而不能从语义上处理,因此不会产生思维。到目前为止,他看起来基本上是正确的。**
正如塞尔先生所料,时至今日,计算机翻译主要通过句法处理来实现它们的“魔力”。虽然他们这些天做得很好(即谷歌翻译和微软翻译),但我们双语者(尤其是 NLP 研究人员)经常玩递归翻译的游戏——将一个句子从英语翻译成中文,然后将译文翻译回来,结果往往令人捧腹。
像 XLNet、BERT 和较老的 Word2Vec 这样的现代技术(几乎)只在语法上受过训练——至少在设计上是这样。它被输入了数十亿个句子来学习如何分析句子结构。嵌入允许 NLP“理解”语言组件的构造——通过像 SQUAD 这样的训练集,我们可以让 NLP 系统回答 90%以上的自然语言问题——因为它学会了如何提取“问题是什么”和“答案在哪里”。
在这一点上,非常接近于塞尔先生所描述的,我们将自然语言(即英语)输入到 NLP 系统,它将句子编码成向量,我们实际上不太理解为什么或这些向量意味着什么(稍后将详细介绍)。
如果系统可以访问“一个完整的图书馆”(塞尔先生的中文房间里的“故事”),它实际上可以通过首先寻找“相关”段落(主要是搜索工作),然后解析段落以提取答案(主要是语法处理工作),来试图找到“问题”的“最佳答案”。神经元的权重集合充当“规则书”。
至此,NLP 系统实际上对问题和答案都没有直接的理解。它只“理解”上下文(主要是符号搜索)和语法结构(至少我们大多数人是这么认为的)。那和塞尔先生的中文房间设置非常相似,(把中文换成英文,把锁在房间里的假想的人换成伯特,把规则书换成预先训练好的模型)…
嵌入
尽管有两个不便之处:1) XLNet 仍然不能通过图灵测试;2)嵌入虽然对人类来说难以理解,但并不像塞尔先生要求的那样完全“不可理解”。
我们知道前面提到的成就并不完全基于“规则书”,而是使用的关键技术是“嵌入”,这是从简单的一键编码的一次飞跃,这是塞尔先生在创建中文房间思想实验时直观使用的。
嵌入出现在 2003 年左右,直到 2010 年后才开始流行,距离塞尔首次发表思想实验已经过去了近 30 年。它试图从“一字一维”的一热编码中降维,因此可以认为是“压缩”信息空间的方法之一。
第一,XLNet 和 BERT 虽然令人印象深刻,但仍然无法通过图灵测试。(图灵测试不是单轮测试,它是一个统计,系统需要通过 70%的测试才能和人类没有区别,所以那些一次性的炫耀并不被认为是真正通过了臭名昭著的测试。)
从一个说中文的人的角度来看,这并不奇怪。学习像英语这样完全不同的语言,句法规则和语义规则在两种语言之间没有严格的映射。这意味着在一种语言中被认为是语法上的规则可以有语义上的含义。(稍后将详细介绍)
随着 NLP 的飞速发展,越来越多的人怀疑一个纯粹的语法处理系统是否能通过图灵测试。从嵌入进度的方向(仍然无法通过图灵测试),开始模糊语法和语义的边界。
这导致了第二点,虽然我们不太理解嵌入结果向量,但是一些东西被广泛接受:嵌入“保留”了一些语言含义(语义),例如,具有相似含义的单词在欧几里得空间中更接近。此外,相似关系的词对之间的欧几里德距离非常相似。例如,与单词对(男人、女人)相比,单词对(国王、王后)之间的欧几里德距离非常相似。虽然这可能是从句法处理的统计模型中“学习”出来的,但将“国王对王后类似于男人对女人”的知识归类为纯粹的句法知识是没有说服力的。似乎至少在某种程度上,嵌入捕捉到了语言的一些语义特征。
这意味着无论是谁被锁在房间里处理这些嵌入,一个人或一个程序,都不能声称他们不知道这种语言,因为当他们看到两个接近的嵌入时,他们知道它们的意思会很接近。
这意味着嵌入并不是塞尔先生在他最初的中国房间里想象的“曲线”,它不应该带有房间里的人理解的语义。这有可能使中文房间设置无效——这要求被锁在房间里的穷人对中文完全一无所知。包埋似乎不符合实验设置的这一部分。
这进一步增加了人们的怀疑,即一个通过图灵测试的计算机系统可能不仅仅是通过语法处理(形式表达)来完成测试的…
模式识别
关于学习一门新语言,我学到的一件主要事情是,有许多“模式”要“总结”,而不是“抽象规则”要遵循。
在计算机科学中,模式识别在过去几十年中主要作为工程来研究,然而,它也有一些哲学上的重要性。
与此讨论相关的一个特定主题是,模式识别不仅仅是纯句法的。虽然规则可以表示为模式,但一些模式(尤其是人类语言中的模式)是非正式的(不是 100%刚性的规则)这一事实具有重要的意义——模式识别系统识别的内容不能纯粹用“形式表达式”来解释。
随着现代机器学习的进步,模式识别更多的是统计而不是形式。基于统计的模式识别仍然属于塞尔先生要求的“形式语法”描述吗?
一方面,人们可能会认为这是可能的,因为所有的“处理”都是由图灵完整机器完成的——在一天结束时,这些是“海量”的加法和乘法。
另一方面,人们可以争辩说,破坏汉语空间思维实验的统计性质不足以涵盖语义,塞尔先生曾用汉语空间思维实验来证明正式的句法处理语言。
虽然机器学习的早期阶段看起来足够无辜,只是形式处理(句法),但深度学习,尽管理论上仍然使用“相同”的机器学习机制,却能够识别比这复杂几个数量级的模式——有时我们怀疑它是否正在拾取模式的模式。
模式识别还只是海量逻辑运算的集合吗?或者它引入了一种不同类型的“智能能力”?
在人类中,我们通常认为模式识别是与逻辑处理不同智能活动。我们经常发现两者都是执行典型的日常任务所需要的。
从外语学习的角度来看,我们一直认为学习另一种语言,我们需要更多的模式识别而不是逻辑计算。
此外,大量面向统计的处理让人们想起了量子物理学。这是一个有趣的类比,就像量子物理学和经典物理学之间没有已知的明确界限,粒子越小,它表现出量子行为(统计模型)的趋势就越高,物体越大,就越少,但我们没有一个硬限制来分隔两个世界,是 1000 个原子吗?10 万,或者 100 万…
多复杂才算复杂?
我们谈到了“数不清的乘法和加法”,这引出了一个有趣的哲学问题,多复杂才算复杂到把一个东西等同于“许多许多公理的集合”?
音乐只是音符的集合,还是有更多的含义?
经典物理对象仅仅是原子的集合吗,为什么它们的行为不同于它们的任何一个夸克?
现代语言嵌入可能是相当复杂的计算,模拟类似于人类大脑神经元的工作方式——当达到某个阈值时,各层“神经元”会激发,但触发器(或触发器的权重)经过训练,以便各层“神经元”的组合会“最佳”激发,以匹配给定的训练数据。这个过程涉及到非常高维的矩阵计算,大多数人只能“理解其分解的标量计算”,我们很难想象这种矩阵运算的直觉解释。
仅仅因为我们可以分解这个过程的每一个步骤,我们就可以忽略更高层次的“意义”吗?我们怎么知道人类的意识不仅仅是“无意义的量子活动”的集合?
如果技术发展到我们可以实时监控每个大脑神经元对某个特定想法的放电的水平,我们的想法还会是想法吗,或者这一切都变成了“只是电子放电”?(在这个话题上要非常小心,研究人员已经可以利用深度学习将一些脑电波转化为文字,或者假肢的动作)
还有一个更令人不寒而栗的假设——就像量子物理学中,量子粒子在被观测时会“坍缩”。如果在每一个神经元层面(甚至每一个粒子层面)观察,人类的思维是否也会“塌缩”到只有电子?
那么,我们的意识是量子物理之上更高层次的现象吗?为什么量子效应会随着物体质量的增加而减小?量子物理的统计特征对这些差异有重要意义吗?
现代语言模型是统计模型。统计方面一直很吸引人,人类对统计的直觉并不完美。海森堡测不准原理,或者类似的东西,会适用于这种深度学习方法吗?复杂的、不精确的大量计算仍然是“仅仅是计算”吗,或者通过这些计算,更高层次的意义产生了吗?
在阅读理解测试中,我们通常期望有“正确的答案”。这意味着我们可能拥有“存在于人类大脑之外的外部化答案。”
但是在像写作这样的生成性任务中,我们发现非常有趣的是,这些任务广泛地涉及到随机数。GAN 正在使用一种“进化”模型,它从随机生成的内容开始,并通过“对手网络”传递它,然后告诉生成网络它在哪里看起来“错误”。然后,生成器网络将获取该信息,保持它做对的,并改变它做错的,并重复该过程,直到对手网络无法从真实参考中辨别出该代。
这太类似于一个迷你模拟进化,生成网络充当“迭代器”,每次迭代产生有限变化的东西;对手网络的功能有点像自然选择,反馈告诉生成网络什么应该保留,什么应该改变,就像基因在自然选择中所做的一样。所以每一次迭代可以被认为是一个“世代”——双关语。
许多“计算机创造的艺术品”包括识字都是这样产生的,这进一步突出了这类任务的非语法和不确定部分…
意识、好奇心和欲望
塞尔先生试图用中文房间思想实验提出的一个关键论点是,机械规则(程序)结合静态信息存储(没有处理能力的规则书)不能产生意识。
这个定理看起来还是不错的。许多研究者怀疑意识只是逻辑和公理。
我们知道 AI 可以拥有基本水平的“自我意识”,至少在物理层面(即机器人)和“将自我与环境区分开来”层面(即计算机病毒)。虽然我们不认为这些是意识,但它们经常构成意识证据的一部分。
可以实现更高层次的意识,如生存本能——寻找“主机”(它可以运行的地方)的程序已经存在,添加“优先级”,如确保计算能力,或者电力实际上并不需要比我们已经拥有的更多的智能——尽管病毒和特洛伊木马的能力还不够智能,但基本的“生存”技能和“决心”正在出现。
更常见的意识水平“知道我在思考”会很有趣——这是一种意识到思想本身存在的“状态”——我们需要这种意识才能将人工智能视为普遍智能吗?
这种意识水平是非常独特的,并没有被完全理解,这可能与人类的好奇心有关。
如果超级智能只有一个最大的障碍,我会认为是好奇心。令人着迷的是,人类会想“为什么我会想到这个”。对这一“基本”问题的回答令人困惑。
人类似乎有这种发现新知识的冲动和快乐,甚至不惜付出超出生存需要的代价。也许通过进化,那些费心获取更多信息的个体更清楚地知道“这蘑菇有毒”并避免食用它?也许获得更多的信息增加了生存的可能性,所以那些乐于发现更多信息的人获得了早期优势?
好吧,好奇害死猫……然而在人类的情况下,也许一两个人的牺牲提供了所需的信息,增加了群体中其他人的生存机会,也就是说,一个吃了毒蘑菇的人可能会让群体中的其他人免于死亡?
如果是这样的话,为什么人工智能需要那种冲动,它甚至有益于(人工智能和人类)吗?毕竟 AI 是创造,不是出于(纯粹的)进化。
塞尔先生提到的另一个方面是“意向性”,他认为欲望是生物心理的一种状态。对此,我是分裂的。我认为没有足够的证据得出这样或那样的结论。需求某物的“主动性”可以是独立的欲望,但也可以是来源于单一“来源”的“需要”——生存的需要。任何有助于大多数物种生存的统计数据都可以在它们的基因中被“编码”为“欲望”。而这些欲望的“目的”只会增加宿主的生存机会。人们可以认为好奇心是生存的欲望之一。
尽管存在人类欲望的机制,但人工智能的“类欲望”意向性仍可能有可行的来源,例如,寻求电力的人工智能机器人可能会表现出类似于“更喜欢靠近墙壁插座”或“争夺充电器”的行为,它甚至可能会发展出“懒惰”来节省能源(当前的省电模式是人类编程的,而不是人工智能自己的“主动”)。
我们对人工智能研究得越多,我们就越怀疑单一来源(即生存)衍生多个“欲望”是产生类似人类行为的一种可能方式,即使它与人类意识的机制不同…
语言、写作和智力
当我第一次开始学习说普通话时,没有人费心告诉我“这是语法,这是词汇……”(好吧,反正我会太“天真”而无法理解它们)。
我在学校的时候,汉语语法是作为“规则”来教的,没有人质疑,“这些规则是为了构建恰当的语言,还是为了正确地表达思想”。在某种程度上,这可能是因为与英语(和大多数印欧语言)相比,汉语的本质更“流畅”或更富于表现力,其结构没有那么僵硬。
例如,汉语是没有性别的,甚至“她”这个词也是“输入”到汉语中的(有趣的事实:在汉语中,他,她,它,都发音相同,他们只在写下来时有所不同)。汉语也不紧张。如果你想说昨天发生的事情,…好吧,就说“昨天”,否则,如果你现在“做”某事,你明天仍然“做”某事,你昨天“做”它——那个动作的单词不会因为你执行它的时间而改变。事实上,每个动词只是一个动词,没有“形式”,汉语也不区分单复数。
当我开始学习英语时,大多数文本框都是关于句法、语法和词汇的。对于一个说中文的人来说,有些规则似乎太死板了,比如时态、冠词。
然而,很快我就会明白“语法规则不像物理定律,它们通常是粗糙的,可能在 70%的情况下都适用。”
那不是很方便嘛!
但是这两种语言的比较也带来了一个问题,句法和语义的完全分离可能吗?在中文中,实际上比在英文中更难将它们分开,语法可以根据表达的需要进行转换。在“中国队击败美国队”的例子中,确切的句法结构实际上并不清楚,直到读者考虑到表达的意思。在“赢”的形式下,它是主动语态,在“输”的形式下,它实际上是被动语态。句法受到要表达的意思的影响。
这种“不那么重要”的语言差异早就被语言学者所知,但它有一个重要的新含义——英语语言的嵌入更类似于压缩英语的结构吗?或者它可能像汉语一样模糊(或移动)了句法和语义之间的界限?证据开始指向后者。
塞尔先生在中文教室使用的另一个有趣的功能是,他将处理书面中文。到目前为止,fMRI(主动脑成像)证明阅读和听力并不完全激活相同的大脑区域。
我们多少同意书写(或者更准确地说是符号化)允许信息和知识存在于我们的大脑之外,存储在“非智能”媒介中。这引发了一个疑问——书面语言是否涵盖了所有的智力?还是写作本身在智力上带有某种额外的意义?
在讨论的范围内,处理书面语言对智力水平有影响吗?
延伸一下,语言是思想的媒介,还是思想的表达?
我曾经想知道“人们是如何思考的?他们是不是用一种共同的语言来思考,只是自动翻译成口语?”如果人类的思想可以独立于语言而存在,那么,语言只是智慧的一种表现。但是,如果人类的思想“植根于”语言,那么,语言可能在智力中发挥更重要的作用。
这个问题的部分答案没多久我就想起来了。从我学英语的第二年开始,我开始训练自己用英语思考,至少对于相关的话题。我知道人们可以用不同的语言思考,有趣的是,语言之间并没有 100%的重叠。
学习像汉语和英语这样不同的两种语言,对我来说,这些问题的答案是复杂的。似乎有些人类的思想可以独立于语言而存在。有些可能不需要语言,比如视觉艺术,有些可能超越了语言——我们都有想说些什么却找不到合适的词来表达的时候。
似乎我们的一些想法是基于语言的。当我用英语思考时,我发现有些东西很容易理解,但很难翻译成中文——有研究证实,双语者会根据他们使用的思维语言在不同的“思维模式”之间切换。
大多数研究人员都同意,语言可以用来表达思想和观点,这些思想和观点在不同的人类个体中是“普遍可理解的”。“普遍可理解”的部分是指语言是“客观化的思想”,所以它可以在聪明的个体之间传递吗?或者是“最大公约数”?
也许人类的思想可以“投射”到语言中,这可能会捕捉到人类智能可以处理的很大一部分(但不是全部)意义。这可能就像语言嵌入了人类的思想。不同的语言可能就像不同的嵌入设置,它“保留”了大量的含义,但在一个低维空间中表示它…
人工通用智能可能吗?
如果有人把我锁在一个房间里,用我不知道的语言使用规则书通过图灵测试,我需要的不仅仅是规则书——要么我需要自己学习语言并智能地处理符号,要么依靠规则书以外的一些隐藏的东西的帮助。
40 年前,房间里被允许通过图灵测试的“东西”是非常模糊的,但我们似乎在这一部分取得了一点点进展——人工智能系统正在获得语义意义,这正是中国 Roome 思维实验旨在展示“不可能”的东西。
最近的深度学习进展引起了人们的怀疑,即一个以统计方式处理信息的系统可能会在超出正式语法描述的水平上处理这种信息。虽然它们仍然在图灵完整系统上运行,但处理的复杂性、使用的训练数据量以及随机性成分扩展了塞尔先生最初的中文房间思想实验中的“正式”概念。
人工智能的这些进步意味着句法处理与语义完全分离的“纯”中文教室的设置越来越不可能成为未来。
就像中文和英文之间的区别一样,NLP 中使用的表示不是一阶逻辑中的公理。现代自然语言处理正在获取这些单词的一些语义。虽然尚未“完全理解”人类语言,但人工智能似乎正在朝着这个方向前进。
除了 NLP,我们知道自动驾驶汽车可以“识别”红灯,并会停下来。使用计算机视觉操纵物体的机械臂也是可行的。
实际上,将“红色”这个词与红光的视觉联系起来,现在已经是非常成熟的技术了。嗯,不止如此。我们可以结合视觉自动编码器来训练一个模型,将红光与电影中这种项目的视觉联系起来。
结合各种感觉输入流及其编码器的多感觉模式识别和协调是人工智能中非常有趣的研究领域。似乎人工智能正在超越语法处理阶段。
虽然塞尔先生断言人类意识是人脑的生物特征是正确的,但人工智能必须具有同样的意识吗?是否存在与人类机制不同的其他形式的意识?
我相信这是可能的。
知识分子中有一种倾向,认为人类的智力有几分神圣。如果某样东西可以被完全解释,那它就不是智能。我曾经写过我们想要一笔勾销我们所谓的“只是计算”或者“只是逻辑运算”的愿望。
经典睡前故事:神经网络的灰姑娘
“人工智能冬天”的最后阶段
一个竞赛,ImageNet,连同一个嘈杂的算法,随机梯度下降,是如何改变 AI 的命运的?
Picture from The Elders Scroll | Skyrim
20 世纪 80 年代初,人工智能(AI)的冬天即将到来,这是一段人工智能研究资金和兴趣减少的时期,后来被称为“AI 冬天”!
在这个持续到 2000 年代中期的寒冷时期,由于对该领域失去了兴趣,几乎没有关于神经网络的研究论文发表。原因很简单:没有针对传统算法的有效算法。
当 Geoffrey Hinton,你可以称他为深度学习的教父,和他的团队在 2012 年一个名为 ImageNet 的著名物体识别比赛中提交他们的研究时,AI 的悲惨遭遇发生了巨大的变化。*“ImageNet 2012 事件绝对是引发当今人工智能大爆炸的原因”*clari fai 首席执行官马修·泽勒(Matthew Schmidt)说道。
Picture Source: ImageNet
在 Geoffrey 的工作之前,算法下的物体识别研究的准确性非常差,分类错误率超过 25%,而人眼表现的错误率大约为 5%。但是,随着 Geoffrey 的团队完美地实现了神经网络,他们成功地将错误率大幅降低了 40%以上!!按照他的步骤,深度学习已经被如此强烈地使用,以至于仅两年后算法产生的错误率比人眼低得多!!目前,在对象和语音识别领域,几乎所有的研究都是由深度学习的子领域 AI 进行的。
我还应该提到,在从“人工智能冬天”时期进入辉煌的“伟大的人工智能觉醒”时期时,人工智能从 GPU(小心,而不是 CPU)计算的改进中获得了实质性的支持,这要感谢英伟达,以及海量数据集的可用性,这要感谢我们所有人每天创建超过 2.5 万亿(10 ⁸)字节的数据。
让我们把注意力转回深度学习的主干算法。众所周知,算法试图通过最小化误差函数(通常称为成本函数)来优化问题。高效的算法在纳秒内完成,而其他算法可能需要运行数小时。
机器学习算法需要有效的优化技术来解决凸问题或非凸问题。最小化误差在凸函数中表现得最好,因为无论你的起点在哪里,你总会找到全局极小点!这就是为什么我们喜欢 SVM(支持向量机)或其他线性函数,因为他们有凸损失函数,你保证找到全局最小值!!
但是,在现实生活中,优化函数通常是丑陋的。他们生活在非凸空间中,非凸空间由许多局部最小值(“谷”)和最大值(“山”)组成。神经网络也不例外,甚至更糟!
“Visualizing the Loss Landscape of Neural Nets”, Hao Li et al., 2018
神经网络有 1000 多个局部最小值,所以你肯定会陷入其中,永远找不到全局最小值!(告诉我你是否不同意左边的图表,它只显示了一个非凸函数的一小部分。)取决于您的“初始化”点在哪里,您将总是以不同的局部最小值结束(这个问题通常通过随机初始化来处理,或者可能添加一些高斯噪声)。没有人真正喜欢神经网络的原因是,在缺乏负担得起的算法的情况下,它的高度复杂性。
在寻求合理的局部最小值时,研究人员首先使用了积极的方法,如梯度下降或更快的近似牛顿或近似海森方法(随着数据大小和维度的增加,凸优化方法受到不利影响。例如,基于 Hessian 的方法可以最佳地处理凸优化问题,但不能扩大规模,因此需要近似法[Martens et al .,2012]。这些方法是如此完美的寻找最小值,以至于它们可以立即找到“最近的”洞。虽然这听起来很完美,但实际上并不是!-最近的洞不太可能有理想的最小值,您需要寻找更远的地方。
此外,即使你设法看得更远,你也需要寻找宽阔的山谷,而不是狭窄的深度。使用训练数据时发现的深孔在使用测试数据时可能没有那么深。然而,在训练和测试数据集下都可能存在宽谷。
哪种算法能够避开最近的洞并在宽广的山谷空间中停留?这正是 SGD 的实际能力!(尽管人们花了很长时间才发现这一点)。谁会想到,曾经被贴上低效和冗余标签的算法,最终会成为几乎所有深度学习模型的关键优化工具?太棒了。
picture source : https://wikidocs.net/3413
这是怎么发生的?“随机”梯度下降(SGD)方法是如何作为一种非常有效的技术来训练深度神经网络的,在数据集大小上具有线性计算复杂性,给定其非常嘈杂和随机的性质?
与梯度下降法(GD)相比,SGD 的噪声很大,因为 GD 使用整个数据集来计算其路径(梯度),而 SGD 仅使用一个示例,即每次迭代随机选择的批量大小为 1 的示例;因此,它遵循一条随机的路径,但最终是朝着正确的方向。随机性意味着它不会收敛到最近的洞,而只会停留在大的山谷中!这是很多其他算法不具备的素质!
嗯,在我们的童话故事中,在车轮弯曲之前,和故事结束之前,我应该告诉你,我们的主要人物,SGD,由于学习率(步长)有两个主要的限制:如果你选择它太大,那么学习轨迹导致可怕的情况;如果选得太小,它的收敛需要很长时间。所以,明智的选择合适的步长。您可以使用 SGD 的几种变体之一,如 Momentum、Averaging、隐式更新(ISGD)、AdaGrad、Adam 等。或者听听我的建议,开始时迈大步,当它开始来回跳跃时,开始降低你的学习速度,即迈小步。就是这样!
现在桥修好了,我的故事也结束了。
Python 的分类问题——网站报价转换
通过 Scikit-Learn 了解 Python 中的分类方法
领先的房屋保险提供商 Homesite 目前还没有一个动态转换率模型来让他们相信报价会导致购买。他们使用客户和销售活动信息的匿名数据库,包括财产和保险信息,要求我们预测哪些客户将购买给定的报价。准确预测转换率将有助于 Homesite 更好地了解提议的价格变化的影响,并保持理想的客户群组合。
数据描述
该数据集代表了对从 Homesite 购买保单感兴趣的大量客户的活动。每个 报价号 对应一个潜在客户, 报价转换 _ 标志 表示该客户是否购买了保单。所提供的特征是匿名的,并且提供了潜在客户和策略的丰富表示。它们包括特定的覆盖范围信息、销售信息、个人信息、财产信息和地理信息。我们的任务是预测测试集中每个 QuoteNumber 的 QuoteConversion_Flag。
我们先看数据,看看这个数据。
训练数据集 : 训练一个模型的子集。
测试数据集 : 测试已训练模型的子集。
trainfile = r'RevisedHomesiteTrain.csv'
train_data = pd.read_csv(trainfile)testfile = r'RevisedHomesiteTest.csv'
test_data = pd.read_csv(testfile)print(train_data.shape)
print(train_data.head())print(test_data.shape)
print(test_data.head())
Figure 1
我们复制不包括目标的训练数据,并将训练数据和测试数据分开。然后,我们只选择目标列。
trainData_Copy = train_data.drop('QuoteNumber', axis=1).iloc[:, :-1].copy()
testData_Copy = test_data.drop('QuoteNumber', axis=1).iloc[:, :-1].copy()X_train = trainData_Copy
X_test = testData_Copy
y_train = train_data["QuoteConversion_Flag"]y_train = train_data.iloc[:, -1]
y_test = test_data.iloc[:, -1]
从 训练数据集 创建验证数据集
from sklearn.model_selection import train_test_split
X_train1, X_val, y_train1, y_val = train_test_split(X_train, y_train, test_size = 0.2)
模型
决策图表
决策树是一种决策支持工具,它使用树状图形或决策模型及其可能的结果,包括偶然事件结果、资源成本和效用。这是显示只包含条件控制语句的算法的一种方式。决策树分类器通过基于不同的标准将数据集分解成越来越小的子集来工作。将使用不同的分类标准来划分数据集,每次划分的示例数量都会减少。
from sklearn.tree import DecisionTreeClassifierclf = DecisionTreeClassifier()
clf.fit(X_train1, y_train1)
clf_predict = clf.predict(X_val)
决策树分类器的 Kaggle 得分:0.94499
随机森林
随机森林是一种集成学习方法,它在数据子集上拟合多个决策树,并对结果进行平均。
Random Forest
from sklearn.ensemble import RandomForestClassifierrfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
rfc_predict = rfc.predict(X_test)
随机森林分类器的 Kaggle 得分:0.91963
k-最近邻
k-最近邻通过检查从某个测试示例到某个训练示例的已知值的距离来操作。给出训练点和测试点之间最小距离的数据点组/类是被选择的类。
K-Nearest Neighbors
from sklearn.neighbors import KNeighborsClassifierknc = KNeighborsClassifier()
knc.fit(X_train, y_train)
knc_predict = knc.predict(X_test)
K-最近邻分类器的 Kaggle 得分:0.60289
神经网络
神经网络是一种机器学习算法,涉及拟合许多用于表示与突触激活功能相连的神经元的隐藏层。这些基本上使用一个非常简化的大脑模型来建模和预测数据。
Neural Networks
from sklearn.neural_network import MLPClassifiermlp = MLPClassifier()
mlp.fit(X_train, y_train)
mlp_predict = mlp.predict(X_test)
神经网络分类器的 Kaggle 得分:0.86759
梯度推进
梯度提升分类器是一组机器学习算法,将许多弱学习模型结合在一起,创建一个强预测模型。决策树通常在做梯度提升时使用。
from sklearn.ensemble import GradientBoostingClassifierabc = GradientBoostingClassifier()
abc.fit(X_train, y_train)
abc_predict = abc.predict(X_test)
神经网络分类器的 Kaggle 得分:0.95882
比较
基于我创建的模型,首先我们可以认识到梯度提升分类器得到最高的 Kaggle 得分。此外,梯度推进模型因其在分类复杂数据集方面的有效性而变得越来越受欢迎,最近已被用于赢得许多 Kaggle 数据科学竞赛。
结论
总之,我们使用 Scikit Learn 的不同分类方法(决策树、随机森林、K-最近邻、神经网络和梯度推进)来预测客户购买报价保险计划的概率,并专注于预测准确性。目的是学习一个可以最大化预测精度的模型,比较不同的算法,选择性能最好的一个。
创建这篇文章的源代码可以在这里找到。
关于我
非常感谢您阅读我的文章!大家好,我是雪莉,目前在亚利桑那州立大学攻读商业分析硕士学位。如果您有任何问题,请随时联系我!
Email me at ***kchen122@asu.edu***and feel free to connect me on [**LinkedIn**](https://www.linkedin.com/in/kuanyinchen-shirley/)!
对人工智能更清洁的监管方法?
Screenshot of Michael Kratsios at the HAI fall conference October 2019
美国首席技术官 Michael Kratsios 与人工智能监管
斯坦福大学以人为中心的人工智能研究所(Institute for Human-Centered Artificial Intelligence at Stanford University)提出了一项我认为非常棒而且必须受到称赞的倡议,那就是分享他们关于人工智能伦理、政策和治理的秋季会议的全部视频。这两个长视频,每个都持续几个小时,对于任何对这一领域感兴趣的人或地球上领先的人工智能研究机构之一正在进行的讨论来说,都是一个重要的贡献。与 Michael Kratsios 的讨论从会议的第二天开始。它来自第二天的早期录像,所以应该不难找到。然而,如果你想知道这两天还发生了什么,你可以浏览一下这个公开议程。
值得注意的是,川普政府在填补其技术政策机构的职位方面动作缓慢。在 职位空缺两年多 后,Kratsios 于 8 月份被确认为 CTO。然而,他已经作为美国总统的副助理工作了一段时间。
迈克尔·克拉特西奥斯是谁?
迈克尔在大会上的介绍如下,所以我再重复一遍:
“美国首席技术官迈克尔·克拉特西奥斯。迈克尔于 2019 年 8 月被美国参议院一致确认担任 CTO。他只是美国第四个担任这个角色的人。作为美国首席技术官,迈克尔在非常广泛的技术挑战组合中担任总统的首席顾问,这些挑战包括量子计算、5G 和农村宽带、自动驾驶汽车、商用无人机、STEM 教育、先进制造以及人工智能。在成为首席技术官之前,Michael 在管理的早期阶段担任副首席技术官。在进入政府之前,他是泰尔资本公司的负责人,并担任企业家投资者彼得·泰尔的办公室主任。他毕业于普林斯顿大学,获得了政治学学位。”
他正在斯坦福网络政策中心参加由全球数字政策孵化器执行董事艾琳·多纳霍 主持的讨论。她专注于制定全球数字政策,以应对人权、安全和治理方面的挑战。在斯坦福之前,她是奥巴马政府时期美国驻联合国人权理事会的第一任大使。她还担任过人权观察组织的全球事务主任。她在许多组织的董事会任职,包括国家民主基金会和世界经济论坛人权理事会。
人工智能创新的自由市场方法
我们可以把迈克尔的观点总结如下。监管需要有针对性和部门针对性。他提到了美国保持领先地位的自由市场创新方法:
“我对这个世界的看法是,有些技术是天生免费的,有些技术是天生被囚禁的。”—Michael Kratsios2019 年 10 月 29 日 HAI 秋季大会。
降低与投资相关的监管风险。他在问如何创造一个特别适合军事技术的环境。迈克尔管理着一个庞大的投资组合,他通过召集人的角色制定高层次的战略和指令来确定投资的优先顺序。
迈克尔看到了“本质上是企业家”的机会,因此招聘需要时间来寻找个人投资组合经理。他们招募技术专家来推动政策。根据迈克尔的说法,他三分之一的时间花在政策上;第三是会见利益相关者;第三是对外宣传(他认为这是他与海合作的一部分)。
对他来说,从奥巴马政府到特朗普政府,政策制定一直在延续。潜在政策影响。R&D 基础研究人工智能战略计划。他们通过行政命令建立并启动了一项国家战略。
清洁法规
在某个时候,迈克尔提到了创建更清洁的法规的想法。我清楚地意识到,要制定对企业更有利的法规。他没有使用“放松管制”这个词,然而,这似乎是他在技术监管方法中暗指的。
“放松管制 是减少或取消政府在特定行业的权力,通常是为了在行业内创造更多的竞争而颁布的。”
因为没有所谓的干净监管。通过提及这一点,我认为他可能指的是公平和权宜的概念,能够在人工智能领域实施解决方案。
结合自由市场方法,他似乎代表着“让大型科技公司更容易”为美国经济或保卫国家等共同项目做出贡献。他提到亚马逊和苹果的无人机测试必须在国外完成,他一直想把它带回美国。
海、国家技术与美国价值观
迈克尔在谈到他与海的关系时说:“对我们来说,这是让像你们这样的聪明人与我们所有机构的监管者沟通,这样我们就可以制定一套聪明的规则。”
主持人:艾琳·多纳霍提出了数字威权主义的问题。迈克尔回答道:
“如果美国能够继续成为人工智能领域的领导者,我们就能确保我们所珍视的价值观将成为全球发展的基础。”
因此,展示美中之间的对立关系对迈克尔来说很重要,也反映了当前的特朗普政府。他们希望通过一个充满活力的由私人和公共资金资助 R&D 的私营部门来推动科学发现。他提到,这与他们的*‘对手’*正在做的事情不同,而不是一个集中的计划。
美国首席技术官支持经合组织的人工智能原则
Michael Kratsios 谈了很多关于去 T2 经合组织的事情,并支持他们的原则。这在我看来不可思议,因为它为更多关注以地球为中心的人工智能方法打开了大门。《经合组织人工智能原则》中的第一条原则是:
人工智能应该通过推动包容性增长、可持续发展和福祉来造福人类和地球。
在当前的美国执行战略中,没有与此原则非常相似,这意味着这可能被用作推动新解决方案或改变美国重点的论据*(尽管我认为这将是一场艰苦的斗争)*。
向迈克尔提问
当然,我不能涵盖迈克尔演讲的每一点,这也是我做一个简短总结的部分原因。不过,他回答了几个问题,我记下了这些问题,并将尝试进行沟通。
公共数据云
HAI 的领导人之一 John Etchemendy 谈到了一种公共云,这种云向公共利益研究人员提供免费访问。约翰提到的这种可能性为许多可能的应用和可能的误解打开了大门,因为“公共利益”在美国是一种非常务实的方法。公私伙伴关系很好,但在美国,似乎很多时候公共利益几乎可以直接转化为私人利益。迈克尔主要来自彼得·泰尔的私人背景,帕兰蒂尔(彼得拥有的)已经获得了几份新的国防合同。
人工智能与移民政策
问:你与移民政策的关系?
答:美国创新的一大支柱是移民。我们相信 T2 的择优创新体系。政治上具有挑战性,需要国会的支持,需要努力达成共识。改进或走向基于成绩的制度。它需要两个独立的彩票,切换彩票的顺序。获得高等学位的人有更好的机会来这里学习。
在回答这个问题时,迈克尔回避了关于移民和海关执法局(ICE)以及大型科技公司抗议活动的讨论。然而,他说这是与“山上的伙伴”的挑战,所以他的优先事项可能不同,尽管他必须完成一项任务。
创新和价值观
问:美国在人工智能领域的领导地位会给社会带来一定的损失,为了保持美国在人工智能领域的领导地位,个人应该承担什么样的损失?
答:我们在美国是幸运的……其他选择太可怕了,我们需要对我们所有人都珍视的价值观进行互动,以便在未来实施。
投资高级人工智能和 R&D
[费-李非]:上游问题和管道问题,与 STEM 教育有关,无论我们在先进的 R&D 投资多少,我们都需要人才管道。本届政府在推动 STEM 教育方面做了哪些努力?最大的问题之一是在人才管道中缺乏代表性。我们对缺乏代表性做了精彩的介绍。本届政府如何与国会合作,考虑投资于多样性和包容性?
答:美国通过了一项关于 STEM 教育的五年计划。我们政府中的许多机构,将这些组织在一起推动干细胞研究。其中一个支柱正是我们正在谈论的事情,如何推动代表性不足的少数群体进入 STEM 领域。在此基础上,我们希望进行更多的合作,我们可以将您与人们联系起来。联邦政府可以在推动议程方面发挥作用,但大部分工作是在州和地方层面完成的。我们如何建立这些并提供帮助。
基础设施和数据管理基础
问:我们没有现代化的数字基础设施。有一个研究云提到(提到电子爱沙尼亚),你如何提供数据集?
答:党派色彩最少的问题之一是政府技术基础设施的现代化。第一个统计数据是,每位员工每年的 it 服务总成本约为 40,000 英镑,而私人 IT 为 4,000 英镑。我们可以更好地使用这些钱。像美国数字服务这样的项目,从硅谷引进有才华的工程师;另一个项目是总统创新研究员项目。PIF 项目,人们能够进入政府,在那里他们能够努力工作。我们有 25 个以上的代理机构,没有理由一次又一次地重复做同样的事情。我们正处于在政府卓越中心推出人工智能的早期阶段。
保护民主选举
问:作为首席技术官,你个人在哪些具体举措上花费了时间和预算支持来保护民主选举?
答:那是 DHS,一个与州政府密切合作的人,州-地方的努力。在某种程度上,我可以帮你联系国家安全委员会。
迈克尔是首席技术官,但他并不负责保护选举或选举舞弊。可以说,在他们的科技战略中,美国更关心的是国防而不是内部民主。正如喜剧演员约翰·奥利弗在《上周今夜秀》的一集节目中所说,数字投票并非没有问题,而且往往已经过时。
更多跨部门和跨学科的工作
问:越来越多的人认识到,要在规范和创新方面取得成功,学术界和工业界必须合作。HAI 项目很好地反映了这一趋势。对技术挑战和规范的社会挑战有头脑。跨部门和跨专业的工作。
答:最大的反映之一是 R&D 人工智能战略计划,这是涵盖这些伦理问题的八大支柱之一,我们不应将其视为简单的技术问题,而是一个更大的社会科学问题。当我们每季度就人工智能、跨机构合作进行高层讨论时。最大的表现是监管指引备忘录。
分手建议
问:对于想参与人工智能技术政策的人,你有什么临别建议?
答:做公共服务很重要,我得到了一个机会,我们生活在迄今为止世界上最伟大的国家。自由和权力,很多人没有,我们有一个非常特别的国家。我们有令人惊叹的国家实验室,如果我们继续培养这种环境,我们就能推动这里的变化。我很乐意和你谈谈,让这成为现实。
美国科技政策的最新动向
除了会议,我们可以考虑迈克尔·克拉特西奥斯的招聘。根据 NextGov 在 2019 年 11 月 21 日写的文章,有两个变化需要考虑:
- Lynne Parker 博士和 Winter Casey 将在科学和技术政策办公室内晋升。在他们之前的角色中,帕克领导了政府的国家人工智能战略的发展,凯西与盟友一起在技术问题上建立共识。他们现在都是美国副首席技术官**。**
- 埃里克·伯格将加入 OSTP,担任电信和网络安全助理总监。他负责电信和网络安全产品组合。执行与美国使用无线电频谱、通信网络和网络安全相关的联盟建设、协调和政策工作。
结论
似乎很明显,美国高层战略将继续支持技术领域的自由市场做法,这将严重依赖大型技术公司的意见。由于管理人员和政府官员来自私营部门,特别是来自投资、风险投资和“创业”型企业,因此不难看出他们在技术方面的现有关系将对美国的这些新合作努力产生何种影响。迈克尔正在采取措施加强美国技术相关政策的发展,我们将不得不看看这将把我们带到哪里,因为根据许多消息来源,美国目前是人工智能领域的领先国家。
这里是#500daysofAI,您正在阅读的是第 188 条。500 天来,我每天都写一篇关于人工智能或与之相关的新文章。
西班牙铁路客运定价研究
介绍
作为一个在离家 400 公里的西班牙城市生活和工作的人,我发现往返旅行最方便的方式是坐火车。作为一个经常使用的用户,我已经对购买门票时的定价模式感到困惑,有时会沿着相同的级别移动,而另一些则超出了最常见的级别。
所以这个疑问促使我提出了以下问题:
“火车票价格真的会随时间变化吗”?
如果是这样,
“有没有购买它们的最佳时机?”
数据
在这个项目中,只考虑了 Renfe 的长距离路线。
该数据集最初来源于由 thegurus.tech 提供的 Renfe scraping 程序,其中每天循环检查几次离开列车的采样路线的价格。
特别是价格被查的车次,时间跨度在 3 个月左右,从 2019 年 4 月 12 日到 2019 年 7 月 7 日。
数据来源:【https://thegurus.tech/posts/2019/05/renfe-idea/
数据争论
在花了一些时间了解数据之后,自然的下一步是清理原始数据,并以一种为分析做好准备的方式对其进行转换,从而为揭示主要问题做好准备。它的代码可以在我的这个项目的 Github repo 中找到。
进一步说,清理和转换任务包括创建新的列,比如路线、出发日期、出发时间、在给定日期和给定时间出发的特定列车的标识符,或者出发前的天数;将格式更改为列,以便能够对其进行计算和进一步转换,方法是减少一些分类变量的类别,如火车类型或机票等级,删除不需要的列或决定如何处理无效行(具有空值)。
结果
本节介绍的所有图和结果的代码也可以在这里找到。
所有路线一起
在这个图表上有一些有趣的东西可以评论。一方面,它回答了主要问题。
1)我们可以看到,价格确实会随着时间的推移而变化,不仅如此,我们还可以看到,随着离店日期的临近,价格明显呈上升趋势。
2)一旦我们承认确实存在相关的变化,是否存在购买门票的最佳时机?嗯,从汇总图中,我们可以看到,最佳购买时机是在机票开始销售时,无论如何,在 50 到 60 天之间。
另一方面,它允许我们确定 3 个主要阶段。首先,在出发前的 42 到 60 天之间,我们可以找到价格的较低范围,然后在出发前的 42 到 13 天期间,价格的变化非常低,总共在 6%-7%左右。最后,还有票价逐日上涨的阶段。
让我们按数据集路径来分解它。
高需求路线中的价格机票演变
马德里-巴塞罗那往返路线被选为高要求路线的范例。它有一个类似的模式,我们观察到的考虑所有可用的路线在一起。我们看到,在机票发售后,接近出发前 50 天,价格会有所下降。同样,我们可以确定 3 个阶段,首先是出发前的 40 到 60 天,价格范围较低,然后是出发前的 40 到 12 天,价格变化非常低,约为 6%-7%。最后是票价逐日上涨的阶段。
非高需求路线中的票价演变
这一次,Renfe 设定了一个初始价格,但由于该价格没有满足需求,价格开始下跌,直到在离开前 40-50 天触及最低点。然后价格演变波动性大得多,随着出发日的临近,价格不断上涨和下跌,但始终遵循上涨趋势。
我们在之前的图中看到的中间阶段,价格几乎在近一个月内保持不变,这里没有重复。
我要强调的最后一点是,价格变化范围远低于高需求路线。
所有数据集路线价格演变的画布
我们还可以根据出行/火车特征来分解价格演变。
星期效应
我们可以看到,无论火车在一周中的哪一天出发,价格演变模式都非常相似,但是,我们看到,星期五和星期天的车票平均比其余时间出发的火车更贵。周一火车票是火车接近发车阶段价格上涨最多的。周六则相反,价格上涨最不明显。
出发时间效应
我们之前在箱线图中看到,在按发车时间窗口分解的价格中确实有轻微的差异,我们可以看到晚上发车的列车比其他发车时间窗口中的列车观察到的价格更便宜,我们还大胆地说,这可能是因为晚上发车的列车通常比其他列车有更多的需求,因此,从 Renfe 设定的更高的价格不会像其他列车一样,因较低的初始需求而下降。
上图支持了这一理论。事实上,晚班火车的最低价格恰好在出发前一个月左右,从而导致不同的最佳购买时刻。
票类效应
一般来说,这两种类型的机票都适用,所以我要强调的是,因为我们知道经济舱机票最先售完,这就解释了为什么当出发日期临近(“最后阶段”)时价格上涨如此平稳。相反,因此,头等舱在起飞前的最后几天更受欢迎,这就是为什么与经济舱机票相比,头等舱的价格上涨更为强劲。
检查是否有任何定价日内差异
一旦评估了日内价格模式,让我们把焦点放在日内价格演变模式上,看看它们是否也存在。
线不断交织和重叠,似乎在告诉我们,每窗口的日内价格乘以离出发的天数没有区别。特别是,唯一突出的一点是晚间价格向图表下限的下降(离出发还有几天甚至几天)。放大看,有可能看到滴滴属于同一天出发。
因此,为了检查我们是否需要考虑这种下降的相关性,我们首先需要知道一般进行的价格检查的次数,以及每个出发窗口时间进行的次数,以便排除潜在的依赖性影响。
我们可以看到价格检查几乎以相同的比例昼夜不停地进行。让我们看看当放大到最后一天,也就是下降发生的时候,这是否成立。
比例不再成立。这意味着,对于出发当天进行的价格检查,这些价格检查是以不平衡的方式进行的;特别是,我们可以看到,晚间价格检查的数量远远低于其他窗口时段。
因此,基本上,由于差价如此之大,在晚上和出发的同一天检查价格的少数火车,可能完全是平均来说更便宜的特定类型。简而言之,没有相关的日内价格差异。
结论
随着出发日期的临近,我们发现了相同组合的火车-日期-时间-路线的相关价格变动。
特别是,对于高需求航线,最佳购买时间是出发前 50-60 天。对于非高需求航线,最佳时刻可以在出发前 40 到 50 天之间找到。当火车在晚上出发时,最佳时刻是出发前 30 天。
在任何情况下,如果由于任何原因不能提前足够的时间购买机票,也不必担心,因为在出发前 12 天之前,价格几乎没有变化(平均只有 6-7%)。
但是,过了这个门槛,车票会一天比一天贵,因为离站日一直接近火车离站的那一天。
最后,我们没有在人民币汇率定价系统中发现任何日内模式。因此,按出发日期分组,人们不会在意在一天中的任何特定时刻购买。
一枚硬币、一些吸烟者和数据分析中的隐私
Photo by Carlos Muza on Unsplash
我们将继续探索学习隐私保护数据分析技术,这次将更深入地挖掘差异隐私的基础。
在上一篇文章中,我向您介绍了差分隐私的概念,以及它为什么会让您在数据匿名化方面占上风。
我强烈建议你在进一步阅读之前检查一下那篇文章,以便更好地理解我们的学习范围。
世界各地的隐私监管机构都在关注数据隐私,这给像我们这样的分析师留下了什么空间…
towardsdatascience.com](/mr-x-netflix-and-privacy-in-data-analysis-f59227d50f45)
所以我们现在知道,差分隐私有助于我们在数据库中保存个人的隐私信息,并防止数据泄露。在正式介绍它是如何做到这一点之前,让我们做一个真实世界的项目,以更好地理解潜在的想法。
Photo by Helloquence on Unsplash
假设你是一名数据分析师,你的任务是找出与吸烟习惯最相关的关键因素,因为你没有继续使用的数据集,所以你决定在你家附近的公园进行一次公开调查。你决定去问人们是否吸烟以及其他一些问题。然而,由于吸烟不是一个很好的习惯,在公共场合透露吸烟会给一个人带来问题,一些人不太愿意谈论它,或者我们可以说,这是一种人们希望对自己保密的信息,这样它就不会泄露到其他地方。但这肯定对你没有帮助,所以为了鼓励人们参与你的研究,你决定给他们一个正确回答的选项。
人们可以选择正确答案的想法起初听起来很琐碎,因为你是在故意告诉人们说谎。如果你想一想,你就会明白,你现在拥有的不是一个包含一大堆敏感信息的数据库,而是一个注入了一些噪声的数据库,这就是差分隐私的工作方式。
形式化差异隐私:
差分隐私通过进程提供隐私;特别是它会引入随机性。
此时你应该想到的三个最重要的问题是-
- 噪声注入数据如何保持有用?
- 我们如何引入随机性?
- 还有,什么时候加随机性?
在这篇文章中,我们将学习一个重要的算法来添加噪声到我们的数据,我们将回答上述问题。
Photo by Paul Wong on Unsplash
随机回答:
随机化回答可能是在数据中引入所需噪声的最简单方法。它为你的研究参与者提供了故意撒谎的便利。
研究参与者被告知报告他们是否拥有财产 P,如下所示:
- 抛硬币。
- 如果是反面,那就如实回答。
- 如果是正面,抛第二枚硬币,正面回答“是”,反面回答“否”。
“隐私”来自于对任何结果的似是而非的否认。这让参与者有机会自己给数据添加噪声。
Photo by Icons8 team on Unsplash
“是”答案的预期数量是不具有属性 P 的参与者数量的 1/4 倍,加上具有属性 P 的参与者数量的 3/4。因此,如果 P 是具有属性 P 的参与者的真实分数,则“是”答案的预期数量是(1/4)(1p)+(3/4)P =(1/4)+P/2。因此,我们可以将 p 估计为回答“是”的分数的两倍减去 1/2,即 2((1/4)+p/2)-1/2。
因此,如果在调查结束时,你发现 60%的人吸烟,你实际上有 2(60%) - 50% = 70%的人吸烟。
随机化在这里是必不可少的,最重要的是因为它非常符合差分隐私的定义,无论关于一个人的其他数据集是什么,没有对手能够知道一个人是否吸烟,即使在获得访问数据之后。
但即使在这一切之后,如果我们有一个对我们数据库的查询,可能会泄漏其中的私人信息,我们会说我们的隐私受到了损害。因此,如果我们从数据库中删除一个人,并且查询的输出发生变化,我们可以说这个人的私人信息被泄露了。事实上,查询输出中的这种变化在数据隐私方面非常重要,因此它有一个特定的身份,即 ℓ1-敏感性或简单敏感性。
Formal definition of sensitivity
因此,基本上,敏感度是一个数据库和一个并行数据库的查询输出的变化,每个数据库都有一个人被删除。因此,如果我们的调查中有 10 个人,我们可以根据这些数据创建 10 个并行数据库,每个数据库中少一个人。我们也知道查询只是一个函数,因此数据库 x 和它的并行数据库 y 之间的ℓ1-敏感度本质上如下所示。
ℓ1-灵敏度= max∨f(x)f(y)∨
较大的敏感度值表示查询对数据库中的变化高度敏感,因此更有可能危及隐私。
现在我们准备介绍差分隐私的数学定义:
Formal definition of differential privacy
不要担心这乍一看很吓人,我们将在下面揭开它的神秘面纱。
展开差分隐私的正式定义;
差分隐私的定义表明,类似“硬币投掷算法”的随机化算法将在数据库及其并行数据库上生成相似的结果,这些数据库本质上是相似的数据库。因此,我们可以确立这样一个事实,即引入随机性可以保护我们数据中的隐私。
但是如果我在数据中引入了过多的随机性,比如说我完全翻转了数据库中的条目,这难道不会影响我的分析结果吗?因此,需要了解的一件重要事情是:**应该添加多少噪声。**如果你还记得上一篇文章,你应该知道,如果我们试图维护我们的隐私,我们会失去我们的准确性。
ε(ε)只不过是应该引入多少噪声的度量,因此它是控制隐私和准确性之间权衡的参数。它是控制隐私保证强度的核心参数,因此也是可以私下回答的查询数量和可达到的准确性。(贾斯汀·许等。艾尔。)
δ (delta) 是这里的另一个参数,它给出了ε不保持其值的概率的度量。
因此,该公式表明,对于任何随机化算法 M ,在数据库 x 上输出 s (s ∈ S)的概率至多是在任何并行数据库 y 上输出 s 的概率的 exp^ε 倍。如果该算法符合这个标准,我们可以称之为ε-δ差分私有算法。
这就是我们如何理解差别隐私背后的公式。
我们刚刚了解到的叫做局部差分隐私关于何时添加噪声,我们将在下一篇文章中了解更多。
总结:
因此,我们了解了如何对我们的数据执行差分隐私,并学习了基本的数学知识。然而,很多问题仍然没有答案,比如我们应该选择ε和δ的什么值,我们将在接下来的文章中尝试理解这些问题。这篇文章是我将要写的关于数据分析中的隐私的系列文章中的第二篇。
在下一篇文章中,我们将了解更多关于差分隐私的算法。
敬请关注。暂时快乐学习。
PS。这是我关于媒体的第二篇文章,所以欢迎任何反馈和建议。
资源:
- https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf
- http://www.cis.upenn.edu/~ahae/papers/epsilon-csf2014.pdf
A/B 测试学习资源集:新手到高手
Source: https://vwo.com/ab-testing/
就像 20 世纪制药公司如何通过临床试验测试药物有效性一样,现代软件公司严重依赖测试和学习文化来构建成功的产品[1]。根据您作为分析师、数据科学家、产品经理、营销人员甚至设计师的角色,获取日常工作所需的相关 A/B 测试知识至关重要。
然而,尽管它在工业中有广泛的应用,如何启动 A/B 测试在学校里很少被教授,对于这个领域的大多数新人来说,他们不得不花大量的时间研究实验的细节。因此,为了使这一过程不那么耗时,本文编制了一个简短的在线学习资源、博客和最新研究论文列表,它们可以最好地帮助你达到所需的实验掌握水平。
本文分为 5 节,每节内的每个主题/子主题最多包含 1 至 2 个资源,这样你不会因为阅读过多而感到不知所措。此处将分别涵盖的所有不同部分和主题的快速总结:
- 第一部分:测试的价值和“为什么”
- 第二节:统计和基本的“如何”
- 第三部分:行业应用和高级“如何”
- 第四部分:高级统计:顺序测试
- 第五部分:端到端实验平台
❤特别感谢 Iris、Joe 和 Jonas 的灵感、知识分享和对以下资源的贡献!❤
还请注意,本文主要关注 A/B 测试材料,而不是 A/N 或 A/B/n 测试等。如果你想看到其他类型测试的类似资源共享,请留下评论!
第一部分:测试的价值和“原因”
在我们谈论其他事情之前,为什么我们需要运行 A/B 测试?下面的两个资源解释了运行 A/B 测试需要什么,它的目标是什么,以及它如何帮助现代数字软件和产品开发。
作为一句话的总结,A/B 测试建立因果关系。
简而言之,当需要建立网站和应用程序时,太多的公司做决定-从新…
hbr.org](https://hbr.org/2017/09/the-surprising-power-of-online-experiments) [## A/B 测试
A/B 测试(也称为桶测试或分割测试)是一个随机实验,有两个变量,A 和 B。它…
en.wikipedia.org](https://en.wikipedia.org/wiki/A/B_testing)
第二部分:统计和基本“方法”
既然我们已经清楚了价值和“为什么”,接下来的主题是关于支持每个测试背后的决策的统计数据,以及从头开始启用测试的过程。
这包括回答以下问题:
- 我们要测试什么,使用什么指标?
- 如何在测试前估计样本量并选择置信度和功效水平(参考消息 这里是 Adobe Target 的样本量计算器的链接 )?
- 如何拆分测试受众?
- 使用什么统计检验来计算显著性水平(假设这里考虑的是传统的 t 检验)?
- 测试要进行多久?
- 如何解读结果并据此做出决策?
对于那些对典型的测试是如何完成的感到好奇的初学者,我在这里强烈推荐两个资源。
Udacity 的 A/B 测试课程是刚开始学习 A/B 测试的人必看的课程。它涵盖了假设、设计和分析测试的端到端过程,以及从业者应该注意的一些陷阱。推荐给任何直接使用 A/B 测试的人。
本课程将涵盖 A/B 测试的设计和分析,也称为分裂测试,这是在线实验…
www.udacity.com](https://www.udacity.com/course/ab-testing–ud257)
如果你没有时间看讲座,我发现这个课程总结很有参考价值&快速查找。
最近我在 Udacity 上完成了 Google 的 A/B 测试课程。该课程已被极力推荐给…
towardsdatascience.com](/a-summary-of-udacity-a-b-testing-course-9ecc32dedbb1)
此外,著名的**网络受控实验:调查和实践指南 论文[2]揭示了从微软运行的网络实验中获得的经验教训,微软是最早的在线实验平台之一。一个伟大的阅读来了解价值,潜在的统计数据,和实践的网络实验(特别是。与 A/B 测试相关的材料的第 3 部分—参见下面的截图)。**
(Screenshot) Controlled experiments on the web: survey and practical guide. Section 3.2.
第三部分:行业应用和高级“如何”
现在是时候学习如何在行业中严格应用测试概念,以及在实验设计讨论中经常出现的术语。
新奇效果
当引入测试体验时,有经验的用户在短期和长期会有什么不同的反应?这种差异如何给结果带来偏差?【2】中的“首因效应和新奇效应”(3.6 限制,#3)一节总结了这个问题,并提供了一个通用的解决方案。
网络效果
对于在社交媒体网站上运行的测试,由于用户交互的性质,用户分配变得棘手。下面这篇由 OkCupid 发表的文章详细描述了这个问题和可行的解决方案。
我经常被要求在 OkCupid 上帮助运行 A/B 测试,以衡量一个新功能或设计变更会产生什么样的影响…
tech.okcupid.com](https://tech.okcupid.com/the-pitfalls-of-a-b-testing-in-social-networks/)
多重比较问题
[## 你如何对许多变体,比如说 20 个或者更多的变体进行 A/B 测试?
回答(3 之 1):不应该。从 WiderFunnel 的这篇博客文章中摘录的答案变化越多,见解就越深刻…
www.quora.com](https://www.quora.com/How-would-you-run-an-A-B-test-for-many-variants-say-20-or-more)
测试审计(如 A/A 测试)
在第一次设置新的启动界面或新的测试软件后,验证测试管道(数据收集、用户分配、行为跟踪)很重要;否则,如果没有彻底调查,无效的结果不仅浪费时间,而且容易导致错误的业务决策。 " 在 Web 上运行受控实验时要避免的七个陷阱 " 论文[3]中的第 8 节给出了验证测试管道的方法的综合列表,包括在线/离线 A/A 测试、仪器等。).
与工程展示阶段相结合的 A/B 测试
在实践中,产品展示通常会经历一个简化的工程过程,称为“分阶段展示”,其最后一步是正式的功能发布。*安全速度:使用受控展示大规模软件部署实用指南论文[4]介绍了一种将分阶段展示与 A/B 测试(受控展示(狗粮、内部、内部人员和生产)相集成的混合方法。*
第四部分:高级统计:顺序测试
到目前为止,我们假设使用传统的 t 检验(也称为固定范围检验)进行假设检验。2015 年,Optimizely 发表了一篇博文,解释了他们为什么将底层统计引擎改为顺序测试(本质上是基于贝叶斯统计)。根据他们的测试数据,顺序测试“可以在不牺牲速度的情况下,将错误声明输赢变化的几率从 30%降低到 5%”。虽然没有像 t-test 那样在行业中广泛采用,但顺序测试提供了一种启动在线实验的新方法,它需要更少的输入(例如,没有最小可检测效应),并且可能用更少的样本更快地得出结论。
** [## 互联网时代的统计学:Optimizely 新统计引擎背后的故事
经典的统计技术,如 t 检验,是优化行业的基石,帮助公司作出…
blog.optimizely.com](https://blog.optimizely.com/2015/01/20/statistics-for-the-internet-age-the-story-behind-optimizelys-new-stats-engine/)
鉴于顺序测试是一个新概念,我们还没有找到很多关于这个主题的学习资源。下面的 Udemy 讲座“Python 中的贝叶斯机器学习:A/B 测试”虽然技术含量很高,但却是为数不多的使用贝叶斯统计进行 A/B 测试的资源之一。推荐给铁杆数据科学家。
这个课程是关于 A/B 测试的。A/B 测试无处不在。营销、零售、新闻源、在线广告…
www.udemy.com](https://www.udemy.com/bayesian-machine-learning-in-python-ab-testing/)
第五部分:端到端实验平台
对于同时运行大量实验(100 个,有时 1000 个测试)的公司来说,构建一个能够大规模规划、启动和分析 A/B 测试的实验平台至关重要。然而,这项工作通常超出了一个数据科学家的工作范围,需要工程投资和产品购买来证明其长期价值。如果你有类似的使用案例,下面是一些关于科技公司如何在内部建立自己的实验平台的快速阅读:
在 Airbnb,我们在用户体验和产品功能上不断迭代。这可能包括对…的更改
medium.com](https://medium.com/airbnb-engineering/https-medium-com-jonathan-parks-scaling-erf-23fd17c91166) [## 用优步工程构建智能实验平台
由分阶段部署和智能分析工具组成,优步工程的实验平台能够…
eng.uber.com](https://eng.uber.com/experimentation-platform/) [## facebook/Ax
Ax 是一个可访问的通用平台,用于理解、管理、部署和自动化自适应…
github.com](https://github.com/facebook/Ax) [## 这都是关于测试的
网飞实验平台
medium.com](https://medium.com/netflix-techblog/its-all-a-bout-testing-the-netflix-experimentation-platform-4e1ca458c15)
感谢您的阅读!评论、反馈、问题、你想贡献的额外资源、异议等。这里欢迎大家:)
关注我 关于 Medium.com 科技&商业相关话题的定期博客,以及👏🏻 👏 👏🏽非常感谢
论文参考文献
[1]关于 A/B 测试的复习https://hbr.org/2017/06/a-refresher-on-ab-testing
[2] Ron Kohavi 等,“网络上的受控实验:调查和实践指南”。
[3] Thomas Crook 等人,“在网上进行受控实验时要避免的七个陷阱”。
[4]夏彤等人,“安全速度:使用受控展示的大规模软件部署实用指南”。****
每个自然语言处理(NLP)从业者必须知道的资源集合
一个你绝不会错过的终极指南!!
嘿,你是一个想进入自然语言处理世界的新手,还是一个对网络上的大量信息感到困惑并且不知道从哪里开始的普通自然语言处理实践者?放松,我也一样,直到我决定花大量的时间在一个地方收集所有需要的资源。
经过去年以来从多种来源的彻底阅读,这里是我编译的最好的学习资源版本,可以帮助任何人开始他们进入 NLP 迷人世界的旅程。有各种各样的任务属于更广泛的自然语言处理领域,如机器翻译、问答、文本摘要、对话系统、语音识别等。然而,要在这些领域中的任何一个领域工作,基本的必备知识是相同的,我将在这篇博客中简要讨论。(注意:如果任何链接已经过期,请在评论区告诉我。 )
简单说一下免责声明关于内容:
1。我将要讨论的内容大部分属于现代的自然语言处理,而不是经典的自然语言处理技术。
2。任何人都不可能去翻遍所有可用的资源。我已经尽了最大的努力。
3。我假设读者对至少相当数量的关于机器学习(ML)和深度学习(DL)算法的知识感到满意。
4。对于我将要涉及的所有主题,我主要引用了博客或视频方面的最佳资源。读者可以很容易地找到每个单独主题的研究论文。我觉得上面提到的博客足以让任何人充分理解各自的主题。
下面是我通往 NLP 世界的路线图: 1。单词嵌入— Word2Vec,GloVe,FastText
2。语言模型& RNN
3。上下文单词嵌入— ELMo
4。NLP 中的迁移学习— ULMFiT
5。句子嵌入
6。Seq2Seq &注意机构
7。变形金刚
8。OpenAI GPT &伯特
9。GPT-2,XLNet
10。总结
我们来简单总结一下以上 10 个话题:
1。单词嵌入— Word2Vec、GloVe、FastText
当我们开始学习 NLP 时,首先想到的是我们如何将单词表示成数字,以便任何 ML 或 DL 算法都可以应用于它。这就是矢量/嵌入这个词发挥作用的地方。顾名思义,这里的目的是将任何给定的单词作为输入,并输出一个表征该单词的有意义的向量表示。基于诸如 Word2Vec、GloVe、FastText 之类的底层技术,存在不同的方法来获得这种表示
Word2Vec:
从这个话题开始,我建议读者在 YouTube 上免费观看斯坦福 CS224N: NLP 与深度学习| Winter 2019 的讲座 1 和 2。
这两个讲座形成了一个关于语义词表示的坚实背景。除此之外,您还将了解 Word2Vec 和 GloVe model 工作中涉及的详细数学知识。一旦你对此感到满意,我将向你推荐一些我认为对这个话题最有用的博客。在这些博客中,你可以找到一些帮助你更好理解的例子和图像。
http://mccormickml . com/2016/04/19/word 2 vec-tutorial-the-skip-gram-model/
http://mccormickml . com/2017/01/11/word 2 vec-tutorial-part-2-negative-sampling/
http://jalammar.github.io/illustrated-word2vec/
我希望这些阅读足以让你对 Word2Vec 有一个坚实的理解。让我们继续前进。
手套:
在斯坦福深度学习自然语言处理(2017 年冬季)的第 3 讲中,GloVe 得到了更好的解释
除此之外,下面的博客可以帮助你清楚地了解这个话题及其背后的数学原理。
【slide share id = 229369559&doc = emnlpwhatisloveparti-towardsdatascience-200228052054&type = d】
【slide share id = 229369555&doc = emnlpwhatislovepartii-towardsdatascience-200228052050&type = d】
【slide share id = 229369551&doc = emnlpwhatislovepartiii-towardsdatascience-200228052047&type = d】
我希望你到目前为止已经理解了 GloVe 是如何利用全局统计信息而不是 Word2Vec 来优化一个完全不同的目标的。
快速文本:
FastText 是由脸书研究团队创建的一个库,用于高效学习单词表示和句子分类。它支持类似于 Word2Vec 的训练 CBOW 或 Skip Gram 模型,但它对单词的 n-gram 表示进行操作。通过这样做,它有助于通过利用字符级信息找到罕见单词的向量表示。
请参考以下链接,以便更好地理解:
https://towardsdatascience . com/fast text-under-the-hood-11 EFC 57 B2 B3https://arxiv.org/pdf/1607.04606v1.pdfhttps://arxiv.org/pdf/1607.01759.pdf
如果您已经完成了上面提到的要点,那么您现在至少对单词嵌入方法有了更深的理解。是时候进入 NLP 的主干了——语言模型。
2.语言模型(LM)和 RNN
语言模型是我们日常使用的东西。一个这样的场景发生在用手机、Gmail 或 LinkedIn 发短信的时候。LM 为您提供了您希望进一步键入的最有可能的建议。简单地说,LM 就是预测下一个单词是什么的任务。我关于语言模型是自然语言处理的支柱的论点是因为所有当前的迁移学习模型都依赖于语言模型作为基础任务。在你即将到来的旅程中,你会进一步了解这些。但在此之前,我们先来看看了解 LM 的资源。
像往常一样,我的第一个建议是浏览斯坦福大学关于这个特定主题的精彩讲座。CS224N 的第 6 讲很好地涵盖了这个话题。它让你一瞥 LM 在神经网络之前是如何发展的,以及神经网络基本上 RNN 给它带来了什么优势。另外,如果你想重温一下关于 RNNs 的知识,请参考第 7 课。
https://www.youtube.com/watch?v=iWea12EAu6U&list = ploromvodv 4 rohcuxmzknm 7j 3 fvwbby 42 z&index = 6
https://www.youtube.com/watch?v=QEw0qEa0E50&list = ploromvodv 4 rohcuxmzknm 7j 3 fvwbby 42 z&index = 7
另外,如果你觉得对 RNNs 的内部运作不太了解,你可以去参加我在 Udemy 上学的一门很棒的课程
深度学习:高级 NLP 和 RNNs
https://www.udemy.com/course/deep-learning-advanced-nlp/
这是我在网上大量的在线课程中发现的最有用的课程之一。在本课程中,您可以通过展开 rnn、将其转换为双向等方式来理解 rnn 的工作原理。此外,你可以学习在 Keras 中对这些模型进行编码——这是最简单的深度学习框架之一。
3。上下文单词嵌入— ELMo
猜猜什么单词嵌入又回来了!!等等,有一个术语叫“语境”,它不同于我们之前研究过的方法。好吧,那我们为什么不把这个话题和第一个话题放在一起研究。嗯,只是因为我们需要 LM 的知识来理解这个题目。是的,正如我之前提到的,在我们的旅程中,我们遇到了 LM 的第一个应用。相信我到最后,你会同意我把 LM 授予 NLP 的中坚力量。说够了,让我们进入我们当前的主题——上下文单词嵌入
来自语言模型的嵌入(ELMo)使用 LM 来获得单个单词的嵌入。到目前为止,我们对任何输入单词都只有一个嵌入,比如说银行。现在假设我有两个不同的句子——我去银行取钱,站在河边。在这两个句子中,单词 bank 的意思完全不同,因此它们肯定有不同的向量表示。这就是语境嵌入的目的。ELMo 是一种基于多层双向 LSTM 模型的方法,用于获得上下文单词嵌入。请浏览以下博客来了解它们。
https://mlexplained . com/2018/06/15/paper-parsed-deep-contextized word-representations-explained/https://www . slide share . net/shuntaroy/a-review-of-deep-contexternalized-word-representations-Peters-2018
希望以上两个资源足以帮助你更好的了解 ELMo。是时候向前迈进了…
4.自然语言处理中的迁移学习— ULMFiT
在过去的一年里,迁移学习彻底改变了自然语言处理领域。大多数当前正在开发的算法都利用了这种技术。在对计算机视觉领域做出重大贡献之后,迁移学习终于让 NLP 从业者欢欣鼓舞。
用于文本分类的通用语言模型微调(ULMFiT)就是这样一种方法,应该归功于这种奇妙的变化。
ULMFiT 引入了多种方法来有效利用模型在预训练期间学习到的大量内容——不仅仅是嵌入,也不仅仅是
情境化嵌入。ULMFiT 引入了一个语言模型和一个过程,以便针对各种任务有效地微调该语言模型。
最后,预训练和微调概念开始在 NLP 领域显示其魔力。ULMFiT 论文还介绍了不同的技术,如区别微调和倾斜三角形学习率,这些技术有助于改进迁移学习方法的使用方式。
准备探索这些令人兴奋的术语,然后保持冷静,参考以下博客:
http://NLP . fast . ai/class ification/2018/05/15/introducing-ulm fit . htmlhttps://ahmedhanibrahim . WordPress . com/2019/07/01/a-study-on-cove-context 2 vec-elmo-ulm fit-and-Bert/
现在,你一定很熟悉乌尔菲特了。我们旅程的下一步是句子嵌入。
5.句子嵌入
学习了足够多的单词嵌入。句子呢?我们能获得类似于一个词的句子的某种表示吗?一种非常幼稚但强大的基线方法是平均句子的单词向量(所谓的单词袋方法)。除此之外,可以有基于无监督、有监督和多任务学习设置的不同方法。
无监督的方案学习句子嵌入作为学习的副产品,以预测连贯的连续句子。这里的主要优势是,你可以获得大量无人监管的数据,因为互联网上充满了文本类型的东西。跳过思维向量和快速思维向量是在无监督环境中开发的两种成功的方法。
另一方面,监督学习需要为给定任务标注的标签数据集。完成这项任务让你学会一个好的句子嵌入。脸书研究小组的 InferSent 就是这样一个有趣的方法。现在,为了解决无监督嵌入和有监督嵌入之间的冲突,多任务学习机制应运而生。多任务学习的几个建议已经发表,如 MILA/MSR 的通用句子表示,谷歌的通用句子编码器等。
兴奋的来到这个世界。探索&探索提到的链接:
https://medium . com/hugging face/universal-word-sentence-embeddings-ce 48 DDC 8 fc 3ahttps://ai . Google blog . com/2018/05/advances-in-semantic-textual-similarity . html
6.Seq2Seq &注意机制
已经学习了 RNN 模型的变体,并且对单词和句子嵌入有了很好的理解,现在是时候前进到一个令人兴奋的 NLP 架构,称为序列 2 序列模型(Seq2Seq)。这种体系结构用于各种 NLP 任务,如神经机器翻译、文本摘要、会话系统、图像字幕等。序列到序列模型是一种模型,它采用一个项目序列(单词、字母、图像特征等)并输出另一个项目序列。理解这些模型的最好方法是借助可视化,这是我想向你推荐的我最喜欢的 NLP 作者的博客之一。他不是别人,正是杰伊·阿拉姆马。相信我,你会喜欢浏览他的每一个博客。他用来解释这些术语的努力是杰出的。点击下面的链接进入这个美丽的世界。
我想我确实需要向你进一步解释 Seq2Seq,因为到现在为止,你一定很熟悉它。然而,现在我想再次向您推荐斯坦福讲座,以了解有关统计和神经机器翻译的更多信息。了解 Seq2Seq 将有助于你流畅地进行这些讲座。此外,注意力是最重要的话题之一,在那里详细讨论。此外,您还将了解用于评估 NMT 模型的波束搜索解码& BLEU 度量。
敬请参考 CS224N 讲座—8
https://www.youtube.com/watch?v=XXtpJxZBa2c&list = ploromvodv 4 rohcuxmzknm 7j 3 fvwbby 42 z&index = 8
7.变形金刚(电影名)
该是野兽——变形金刚的时候了。虽然 LSTM 模型是革命性的 NLP 行业,它是变压器,开发出了开箱即用,作为 RNN 模型的改进替代品。
Transformer 是一个使用注意力来提高这些模型训练速度的模型。
转换器有助于并行化。论文中提出的变形金刚就是你所需要的全部注意力。由于并行化的性质,它将我们从 RNN 模型中涉及的重复连接中解放出来。它不仅有助于减少训练时间,而且在各种 NLP 任务上有很大的提高。它类似于 Seq2Seq 架构,但它只依赖于注意力机制及其变体。再说一次,理解这个话题的最佳博客是 Jay Alammar 的博客。事实上,如前所述,您可以关注他的所有博客来了解这些先进的 NLP 技术。
除此之外,如果你想从实现的角度理解这篇论文,那么请参考哈佛大学 NLP 小组的这篇精彩的博客。
如果你已经成功理解了以上两篇博客,那么给自己一个大拇指吧!!相信我,这不是一件容易的事。
现在让我们探索一下研究人员是如何利用这种更新的架构来构建像伯特、GPT-2 等这样的艺术模型的。
8.开放 GPT &伯特公司
迁移学习又回来了,但现在当然是用变形金刚。很简单,如下:利用变压器解码器的堆栈来建立一个新的模型称为 GPT 或利用编码器部分的变压器来建立一个惊人的模型称为伯特。相信我,即使你是 NLP 领域的新手,并且在过去的一年里一直在听 NLP 流行语,伯特和 GPT 也是这个列表中的佼佼者。
生成性预训练(GPT)的目标与 ULMFit 相似,即在 NLP 中应用迁移学习。但是有一个主要的区别。是的,你说对了——用变形金刚代替 LSTM。除此之外,在培训目标上也有一些不同,你可以通过下面提到的博客来了解。总而言之,GPT 的总体思想是训练用于语言建模任务的变换器解码器,也称为预训练。一旦它被预先训练,我们就可以开始使用它来完成下游任务。可以有许多输入转换来处理各种这样的任务。
NLP 最火的词来了——BERT。
主要目标是建立一个基于 transformer 的模型,它的语言模型既取决于左上下文,也取决于右上下文。这是 GPT 的局限性,因为 GPT 只训练了一个正向语言模型。现在,为了实现双向调节的目标,BERT 使用了变压器的编码器部分。为了在计算注意力分数时看不到未来的单词,它使用了一种叫做掩蔽的特殊技术。根据这篇论文的作者,这种掩蔽技术是这篇论文的最大贡献。除了处理多个句子之间关系的掩蔽目标之外,预训练过程还包括一个额外的任务:给定两个句子(A 和 B),B 是否可能是 A 后面的句子?
好吧,如果你对上面的一些术语感到有负担,并且想要对它们有更深入的了解,放松就好。所有这些术语在下面的博客中都有很好的解释:
http://jalammar . github . io/a-visual-guide-to-using-BERT-for-the-first-time/https://mlexplained . com/2019/01/07/paper
9.GPT-2,XLNet
GPT-2 只不过是 GPT 的继任者,参数是它的 10 倍以上,训练数据量也是它的 10 倍以上。由于担心该技术的恶意应用,作者最初没有发布更大的训练模型,这成为一个有争议的话题。
XLNet 是广义自回归模型。它在 20 个任务上超过了 BERT,通常是大幅度超过。这是自然语言处理中迁移学习的新方法。为了更广泛地了解 GPT-2 和 XLNet,请参考以下博客。
https://openai.com/blog/better-language-models/https://towardsdatascience . com/openai-GPT-2-理解-语言-生成-通过-可视化-8252 f683 B2 F8**
10 摘要
最后,您已经按照我们提议的计划完成了学习 NLP 先决条件的整个过程。向你致敬!!!由于大量的研究人员积极从事这一领域的工作,模型不断被涉及。因此,几乎每个月,你都会看到一篇新的论文,它超越了之前的技术水平。因此,在这个快速变化的世界中前进的唯一方法是通过定期浏览研究论文和这些信息丰富的博客来了解最新知识。
如果你想回忆整个旅程,可以浏览一下下面提到的博客。
https://lilian Weng . github . io/lil-log/2019/01/31/generalized-language-models . html
在这里,我还列出了一些我认为在学习 NLP 领域的新主题时最有用的最佳博客:
【https://medium.com/huggingface】http://jalammar.github.io/***https://ruder.io/***https://mlexplained.com/
我希望我的资源对读者有所帮助。如前所述,任何人都不可能涵盖所有主题。建议总是受欢迎的,引用一些更好的博客或我错过的重要话题。我希望任何对这些先决条件了如指掌的人都能胜任任何 NLP 任务。到那时,干杯, 尽情享受!!!
一个常见的数据科学错误:通过操纵模型输入进行预测/推荐
“我们训练了一个高性能的机器学习模型。然而,这并不奏效,在实践中也没有用。”这句话我听过好几次,每次都急于找出原因。一个模型在实践中失败可能有不同的原因。由于这些问题通常不会在数据科学课程中解决,因此在本文中,我将解决设计和部署机器学习模型时的一个常见错误。
在本文的其余部分,首先,我将讨论导致机器学习模型误用的相关性和因果性之间的混淆。我将用一个例子来说明这个讨论。之后,显示了模型的输入和输出之间的不同可能性。最后,我提供一些建议来避免这个错误。
相关性而非因果关系
将相关性误认为因果关系会导致错误的结果。混淆相关性和因果关系的一个例子是对魔鬼经济学的分析,伊利诺伊州给学生发了书,因为分析显示,家里有书与高分直接相关。然而,现实是,父母通常买书的房子有一个令人愉快的学习环境。进一步的分析显示,那些家里有几本书的学生在学业上表现更好,即使他们从未读过这些书。事实上,获得更高的分数并不是书本的结果,而是环境的结果。
回到我们的主题,在您开发一个模型之后,您不能操作输入参数(特征)来查看对输出的影响。原因是输入要素可能是输出的结果,而不一定是输出的原因。高性能机器学习模型告诉你的是,输入和输出之间存在相关性。您无法调整输入以获得所需的输出,然后根据调整后的输入提供建议。
例子
这里有一个例子,我们开发了一个回归模型,但该模型提供了一个错误的预测/建议。假设我们有室外温度和室内温度。我们可以开发一个线性回归模型,根据室内温度来估算室外温度。
T(外)= C1T(内)+C2*
其中 C1 和 C2 是从数据中导出的常系数。假设该模型具有非常高的性能(例如,超过 99%)。
通过使用该模型,我们发现如果室内温度增加 5C,室外温度将增加 10C。我们能为房间买一个加热器并提高室内温度来享受温暖的一天吗??!!当然不是。原因是内部温度是结果,而不是原因。当数据科学家操纵模型的输入(例如内部温度)以获得期望的输出(例如外部温度)时,也会发生同样的事情。基于操纵输入的建议在实践中通常是无用的。
投入产出关系
现在,让我们看看当特征之一 A 和输出 B 之间存在相关性时的不同情况。下图显示了不同的情况。
Case 1: A causes B. Manipulating A affects B in the real world.
Case 2: B causes A. Manipulating A does not affect B in the real world.
Case 3: A causes B and B causes A. Manipulating A affects B but it is not a direct effect.
Case 4: A and B are consequences of a common cause C. Manipulating A does not affect B.
很明显,在情况 2、3 和 4 中,模型的输出对于 A 的操纵值与我们在现实世界中看到的不同。应该注意的是,即使在情况 1 中,输出也可能不同,因为 A 可能与模型的其他输入具有某种相关性。这意味着当 A 的值改变时,其他输入也会改变。因此,仅更改其中一个输入要素并研究其效果是不正确的。
如何避免?
首先,要意识到这个问题。你应该知道,通过操纵输入,你无法预测输出。记住这一点会影响你如何设计模型,如何选择未来。
第二,如果你想设计一个预测模型,你需要有历史数据来告诉你的模型改变输入的影响。通过快照,您无法预测如果输入发生变化会发生什么。在这种情况下,您可以根据历史数据来定型模型。在我们的示例中,当我们想要查看室内温度对室外温度的影响时,我们需要一些样本,包括室内温度的变化及其对室外温度的影响(例如,1 小时后)。在这种情况下,模型了解到室内温度对室外温度没有影响。
第三,利用你的领域知识或与专家交谈,看看你的预测/推荐结果是否有意义。这不仅可以避免这个错误,还可以避免其他逻辑错误。例如,您的编码中可能有一些您没有意识到的错误。感觉检查可以帮助您从总体上验证模型。
结论
设计机器学习模型是一项棘手的任务。尽管模型在训练数据上有很高的性能,但在实践中可能不起作用。在本文中,我讨论了机器学习模型的误用,它导致预测在现实世界中不起作用。其他原因可能是过度拟合、重复样本和无偏数据。利用你的领域知识或与一些专家交谈,看看你的预测/推荐结果是否有意义,这总是好的。
如果您有任何问题或意见,请在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。
NER 大学和 NER 大学使用美国所有城市名的比较
Sugarloaf Mountain, Rio De Janeiro, Brazil, using Kodak Ektar film.
最近,我不得不使用命名实体进行概念验证,直接选项显然是 NLTK、斯坦福 NER & Spacy。我记得读过几篇比较和的文章,前者给了空间优势,后者给了斯坦福优势。看到没有一个明确的案例,我决定做自己的测试。在 Zencity.io ,我们的域名是 govtech,我们的 POC 用例是识别尽可能多的美国城市名称。这个想法很简单,加载所有美国城市名称,看看哪个算法可以识别更多的“位置”。显然,我们可以在其他类别中识别姓名,如个人或组织,但这不是重点。请记住,这些分类器是用于完整的句子,而不是单独的实体,但是,这是一个很好的方式来测试,在一个干净和可控的方式,有多少被识别。一个包含所有相关文件的官方项目可以在下面的 Github 库中找到。
美国城市名称
我找到了一个带有美国城市名的 CSV 文件,里面有 63211 个城市,城镇等。
Several US cities, taken out of the CSV file.
空间
下一步是加载 spacy 并检查 Spacy 是否将每个城市别名识别为地理政治实体(GPE)。GPE 是西班牙人说它是一个已知的国家、城市或州的方式。下面的代码显示了如何做到这一点。其他命名实体可在文档中找到。
斯坦福的 NER
下一步是使用 NLTK 对斯坦福的 NER (SNER)的实现。我们从加载相关的库开始,指向斯坦福 NER 代码和模型文件,我们系统地检查 NER 标记者是否能识别所有的城市名称作为“位置”。对于第一个测试,使用旧的 API,我决定使用基本的 3 类模型,包括位置、人员和组织。为此,您可以使用下面的代码。
对于第二个测试,我使用了新的 API,正如克里斯多佛·曼宁所建议的。但是,我不知道算法中使用的默认模型是什么。
结果
A comparison of Spacy & Stanford’s NER
结论
令人惊讶的是,大多数评论都声称这两种观点各有一点优势。在我们的领域中,优势显然很大,我们可以使用旧 API 识别近两倍数量的实体,使用新 API 识别类似数量的实体,但是,我没有检查结果是否是两个相同的城市名称集。使用旧 API 的测试花费了 24 小时,使用新 API 的测试花费了 85 分钟,这是通过将预测发送到本地服务器而不是使用命令行运行预测所实现的运行时间的巨大差异。然而,似乎 Spacy 仍然胜过 NLTK 的斯坦福 NER。执行 63K 分类需要 Spacy~7 分钟,而 NLTK 大约需要 85 分钟。
Spacy 很有趣,使用起来很快,如果你不介意性能上的巨大差距,那么我会推荐将它用于生产目的,而不是 NLTK 对斯坦福大学 NER 的实现。
感谢塞缪尔·杰弗罗金、约夫·塔尔米、纳塔内尔·大卫多维茨的校对和评论。
Ori Cohen 拥有计算机科学博士学位,专注于机器学习。他领导着 Zencity.io 的数据科学团队,试图积极影响市民的生活。
线性回归中收缩法和选择法的比较
详细介绍 7 种流行的收缩和选择方法。
在本文中,我们将研究线性回归中子集选择和收缩的七种流行方法。在介绍了证明需要这种方法的主题之后,我们将逐一查看每种方法,包括数学属性和 Python 应用程序。
本文基于优秀的 Hastie,t .,Tibshirani,r .,& Friedman,J. H. (2009)的一章。统计学习的要素:数据挖掘、推理和预测。第二版。纽约:斯普林格。一些技术细节可能会被直接转述或引用。
为什么收缩或子集,这意味着什么?
在线性回归上下文中,子集化意味着从可用变量中选择一个子集包含在模型中,从而降低其维数。另一方面,收缩意味着减小系数估计值的大小(将它们向零收缩)。注意,如果一个系数收缩到零,相应的变量就会从模型中消失。因此,这种情况也可以被视为一种子集化。
收缩和选择旨在改进简单的线性回归。它需要改进有两个主要原因:
- 预测精度:线性回归估计往往偏差小,方差大。降低模型的复杂性(需要估计的参数的数量)可以减少方差,但代价是引入更多的偏差。如果我们能找到总误差最小的最佳点,那么由偏差加上方差产生的误差最小,我们就能改进模型的预测。
- 模型的可解释性:预测因素太多,人类很难掌握变量之间的所有关系。在某些情况下,我们愿意确定影响最大的变量的一个小子集,从而牺牲一些细节以获得全局。
设置和数据加载
在直接跳到方法本身之前,让我们先看看我们将要分析的数据集。它来自 Stamey 等人(1989)的一项研究,该研究调查了不同临床测量对前列腺特异性抗原(PSA)水平的影响。任务是基于一组临床和人口统计学变量来识别前列腺癌的风险因素。这些数据,连同一些变量的描述,可以在哈斯蒂等人的网站“统计学习的要素”教科书的数据部分找到。
我们将从导入本文中使用的模块开始,加载数据,并将其分成训练集和测试集,分别保存目标和特性。然后,我们将讨论每种收缩和选择方法,使其适合训练数据,并使用测试集来检查它在新数据上预测 PSA 水平的能力。
线性回归
让我们从简单的线性回归开始,这将构成我们的基准。它将目标变量 y 建模为 p 预测值或特征 X 的线性组合:
该模型具有 p + 2 个参数,这些参数必须从训练数据中估计:
- p 以β系数为特征,每个变量一个,表示它们对目标的影响;
- 一个截距参数,在上面表示为β0,这是在所有 x 都为零的情况下的预测。没有必要将它包含在模型中,事实上在某些情况下,它应该被删除(例如,如果一个人想要包含表示分类变量级别的全套虚拟变量),但一般来说,它给了模型更多的灵活性,正如您将在下一段中看到的;
- 高斯误差项的一个方差参数。
这些参数通常使用普通最小二乘法(OLS)来估计。OLS 最小化残差平方和,由下式给出
图形化地思考这个最小化标准是有帮助的。由于只有一个预测器 X ,我们处于由该预测器和目标形成的 2D 空间中。在此设置中,模型符合在 X-Y 空间中最接近所有数据点的直线,其接近度为所有数据点垂直距离的平方之和——见下面的左图。如果有两个预测值,X1 和 X2,空间增长到 3D,现在模型适合最接近 3D 空间中所有点的平面-参见下面的右面板。有了两个以上的特征,平面就变成了有点抽象的超平面,但思想还是一样的。这些可视化还有助于了解截距如何为模型提供更大的灵活性:如果包含截距,它允许直线或平面不穿过空间的原点。
Source: adapted from The Elements of Statistical Learning by Hastie et al. [1].
上述最小化问题有一个解析解,β参数可计算如下
在 X 矩阵中包含一列 1 允许我们在上面的公式中表示β-hat 向量的截距部分。“β”上方的“帽子”表示它是基于训练数据的估计值。
偏差-方差权衡
在统计学中,要考虑估计量的两个关键特征:偏差和方差。偏差是真实总体参数和预期估计量之间的差异。它测量估计的不准确性。另一方面,方差衡量的是它们之间的差异。
Source: kdnuggets.com
显然,如果偏差和方差过大,它们都会损害模型的预测性能。然而,线性回归倾向于遭受方差,同时具有较低的偏差。如果模型中有许多预测特征,或者如果它们彼此高度相关,情况尤其如此。这就是子集化和规范化的作用。它们允许以引入一些偏差为代价减少方差,最终减少模型的总误差。
在详细讨论这些方法之前,让我们对前列腺数据进行线性回归,并检查其样本外平均预测误差(MAE)。
最佳子集回归
为线性回归选择变量子集的一个简单方法是尝试所有可能的组合,并选择一个最小化某个标准的组合。这就是最佳子集回归的目标。对于每个 k ∈ {1,2,…,p},其中 p 是可用特征的总数,它挑选大小为 k 的子集,该子集给出最小的残差平方和。然而,平方和不能用作确定 k 本身的标准,因为它必然随着 k 而减少:模型中包含的变量越多,其残差就越小。但这并不能保证更好的预测性能。这就是为什么应该使用另一个标准来选择最终的模型。对于侧重于预测的模型,测试数据上的错误(可能是交叉验证的)是常见的选择。
由于最佳子集回归没有在任何 Python 包中实现,我们必须手动循环遍历 k 和所有大小为 k 的子集。下面的代码块完成了这项工作。
里脊回归
最佳子集回归的一个缺点是,它不能告诉我们从模型中排除的变量对响应变量的影响。岭回归为变量的硬选择提供了一种替代方法,将变量分为包含在模型中的变量和排除在模型外的变量。相反,它惩罚系数,使它们向零收缩。不完全是零,因为这将意味着从模型中排除,而是在零的方向上,这可以被视为以连续的方式降低模型的复杂性,同时保持模型中的所有变量。
在岭回归中,线性回归损失函数以这样的方式增加,不仅最小化残差平方和,而且惩罚参数估计的大小:
解决这个最小化问题得到βs 的解析公式:
其中 I 表示单位矩阵。罚项λ是要选择的超参数:其值越大,系数越向零收缩。从上面的公式中可以看出,当λ变为零时,加性罚消失,并且β-岭变得与来自线性回归的β-OLS 相同。另一方面,当λ增长到无穷大时,β-ridge 接近于零:通过足够高的惩罚,系数可以任意收缩到接近于零。
但是,这种收缩真的会像承诺的那样以引入一些偏差为代价来减少模型的方差吗?是的,从岭回归估计的偏差和方差的公式中可以清楚地看出:随着λ增加,偏差也增加,而方差下降!
现在,如何选择λ的最佳值?运行交叉验证,尝试一组不同的值,并选择一个最小化测试数据交叉验证错误的值。幸运的是,Python 的 scikit-learn 可以为我们做到这一点。
套索
Lasso,或最小绝对收缩和选择运算符,在精神上与岭回归非常相似。它还为损失函数添加了非零系数的惩罚,但与脊回归惩罚系数的平方和(所谓的 L2 惩罚)不同,LASSO 惩罚系数的绝对值之和(L1 惩罚)。因此,对于λ的高值,许多系数在 LASSO 下精确归零,这在岭回归中是从来没有的。
它们之间的另一个重要区别是它们如何处理要素之间的多重共线性问题。在岭回归中,相关变量的系数往往是相似的,而在 LASSO 中,其中一个变量通常为零,另一个变量被赋予整个影响。因此,如果有许多大约相同值的大参数,即当大多数预测因子真正影响反应时,岭回归预计会更好地工作。另一方面,当有少量重要参数且其他参数接近于零时,即只有少数几个预测值实际影响响应时,LASSO 预计会出现在顶部。
然而,实际上,人们并不知道这些参数的真实值。因此,岭回归和 LASSO 之间的选择可以基于样本外预测误差。另一种选择是将这两种方法结合起来——参见下一节!
LASSO 的损失函数如下所示:
与岭回归不同,这种最小化问题无法解析求解。幸运的是,有数值算法能够处理它。
弹性网
弹性网最早出现是由于对 LASSO 的批评,其变量选择可能过于依赖数据,因此不稳定。它的解决方案是结合岭回归和套索的惩罚,以获得两全其美。弹性网旨在最小化包含 L1 和 L2 惩罚的损失函数:
其中α是岭回归(当它为零时)和套索(当它为一时)之间的混合参数。最好的α可以通过 scikit-learn 基于交叉验证的超参数调整来选择。
最小角度回归
到目前为止,我们已经讨论了一个子集方法,最佳子集回归,和三个收缩方法:岭回归,套索,以及它们的组合,弹性网。本节专门介绍一种介于子集化和收缩之间的方法:最小角度回归(LAR)。该算法从零模型开始,所有系数等于零,然后迭代工作,在每一步将一个变量的系数移向其最小二乘值。
更具体地说,LAR 从识别与响应最相关的变量开始。然后,它将该变量的系数不断向其最小二乘值移动,从而降低其与演变残差的相关性。一旦另一个变量在与残差的相关性方面“赶上”,这个过程就暂停了。然后,第二个变量加入活动集,即具有非零系数的变量集,并且它们的系数以保持它们的相关性捆绑和递减的方式一起移动。这个过程一直持续到所有变量都在模型中,并在完全最小二乘拟合时结束。“最小角度回归”这个名称来自于该算法的几何解释,在该算法中,给定步骤的新拟合方向与已经具有非零系数的每个要素形成最小角度。
下面的代码块将 LAR 应用于前列腺数据。
主成分回归
我们已经讨论了选择变量(子集)和降低它们的系数(收缩)的方法。本文中介绍的最后两种方法采用了稍微不同的方法:它们将原始要素的输入空间压缩到一个更低维的空间中。主要是,他们使用 X 来创建一小组新特征 Z ,它们是 X 的线性组合,然后在回归模型中使用它们。
这两种方法中的第一种是主成分回归。它应用主成分分析,这是一种允许获得一组新特征的方法,这些新特征彼此不相关,并且具有高方差(以便它们可以解释目标的方差),然后在简单的线性回归中使用它们作为特征。这使得它类似于岭回归,因为两者都在原始特征的主成分空间上操作(对于岭回归的基于 PCA 的推导,参见本文底部来源中的[1])。不同之处在于,PCR 丢弃了信息量最少的成分,而岭回归只是将它们收缩得更强。
要保留的组件数量可以视为一个超参数,并通过交叉验证进行调整,如下面的代码块所示。
偏最小二乘法
本文讨论的最后一种方法是偏最小二乘法(PLS)。与主成分回归相似,它也使用原始特征的一小组线性组合。区别在于这些组合是如何构造的。主成分回归仅使用 X 自身来创建衍生特征 Z ,而偏最小二乘法额外使用目标 y 。因此,在构建 Z 时,PLS 寻找具有高方差(因为这些可以解释目标中的方差)和与目标高度相关的方向。这与仅关注高方差的主成分方法形成对比。
在该算法的保护下,第一个新特征 z1 被创建为所有特征 X 的线性组合,其中每个 X 被其与目标 y 的内积加权。然后, y 在 z1 上回归,给出 PLS β系数。最后,所有的 X 相对于 z1 正交化。然后,对于 z2 该过程重新开始,并且继续进行,直到在 Z 中获得期望数量的组件。像往常一样,这个数字可以通过交叉验证来选择。
可以看出,尽管 PLS 根据需要缩小了 Z 中的低方差分量,但它有时会放大高方差分量,这在某些情况下可能会导致更高的预测误差。这似乎是我们前列腺数据的情况:PLS 在所有讨论的方法中表现最差。
总结和结论
由于许多可能相关的要素,线性模型在预测准确性和模型的可解释性方面会因模型参数的巨大差异而失败。这可以通过减小方差来缓解,但这只能以引入一些偏差为代价。然而,找到最佳偏差-方差权衡可以优化模型的性能。
允许实现这一点的两大类方法是子集化和收缩。前者选择变量的子集,而后者将模型的系数向零收缩。这两种方法都降低了模型的复杂性,从而降低了参数方差。
本文讨论了几种子集化和收缩方法:
- 最佳子集回归迭代所有可能的特征组合,以选择最佳组合;
- 岭回归惩罚系数的平方值(L2 惩罚),迫使它们变小;
- 套索惩罚系数的绝对值(L1 惩罚),可以强制其中一些正好为零;
- 弹力网结合了 L1 和 L2 的点球,独享山脊和套索的精华;
- 最小角度回归介于子集化和收缩之间:它迭代工作,在每一步添加一个特征的“某个部分”;
- 主成分回归执行 PCA 以将原始特征压缩成新特征的小子集,然后使用那些作为预测器;
- 偏最小二乘法也将原始特征总结为新特征的一个更小的子集,但与 PCR 不同,它也利用目标来构建它们。
如果您运行上面的代码块,您将从前列腺数据的应用中看到,这些方法中的大多数在预测准确性方面表现相似。前 5 种方法的误差范围在 0.467 和 0.517 之间,优于最小二乘法的误差 0.523。最后两个,PCR 和 PLS,表现更差,可能是因为数据中没有那么多特征,因此降维的收益有限。
感谢阅读!我希望你已经学到了对你的项目有益的东西🚀
如果你喜欢这篇文章,试试我的另一篇文章。不能选择?从这些中选择一个:
揭秘著名的竞赛获奖算法。
towardsdatascience.com](/boost-your-grasp-on-boosting-acf239694b1) [## 线性分类器:综述
本文讨论了四个流行的线性函数的数学性质和 Python 的实际应用
towardsdatascience.com](/linear-classifiers-an-overview-e121135bd3bb) [## 插补的不确定性
你在预测中考虑到它了吗?
towardsdatascience.com](/uncertainty-from-imputation-8dbb34a19612)
来源
- Hastie,Tibshirani,r .,,j . h . Friedman(2009 年)。统计学习的要素:数据挖掘、推理和预测。第二版。纽约:斯普林格。
- https://www . data camp . com/community/tutorials/tutorial-ridge-lasso-elastic-net
一个完整的数据科学团队需要的不仅仅是数据科学家
Photo by Perry Grone on Unsplash
对于一个完整的数据科学团队来说,没有一个角色是最重要的,但有些角色比其他角色更容易让人想到。
这篇文章最初是在 TechHQ 上 发表 。增加了插图。
从初创公司到企业,从金融到医疗保健等行业的各种组织都在实现人工智能(AI)的好处。
事实上,根据 Gartner的数据,14%的全球首席信息官已经部署了人工智能,到 2020 年,48%的首席信息官将部署人工智能。然而,建立成功承担这些人工智能项目的必要团队比简单地雇佣数据科学家更复杂。
然而,许多组织在这种误解下运作。许多人没有看到,建立和执行成功、道德和有洞察力的人工智能解决方案需要一个全面的数据科学团队,而不仅仅是几个理想主义的数据科学家可以完成所有工作。
Photo by jeshoots.com on Unsplash
为了让人工智能提供商业价值,组织需要确定正确的业务用例。来自人工智能的预测性见解需要通过数据故事变得可消费,对人类行为的更深入理解对于正确的决策至关重要。
除了引入感知的“核心角色”,数据科学团队可能没有意识到他们需要数据翻译、 数据故事讲述者 甚至行为心理学家这样的角色来实现这些目标。
基本角色
在创建完整的数据科学团队时,没有一个角色比另一个角色更重要,这是有争议的。然而,有些角色会比其他角色更早浮现在脑海中。公司热衷于招聘的第一批职位之一是数据科学家,他们通常使用统计学和机器学习(ML)来分析和识别预测性见解。
沿着人工智能之旅前进的组织也将确定他们对可视化设计师的需求,该设计师应该具有信息设计和 UX 技能,以将数据洞察的视觉智能层带入生活。
机器学习(ML)工程师也在数据科学团队中发挥着关键作用,因为他们将 ML 模型打包成端到端的应用程序。他们利用深厚的编程技能和对数据处理的精通来实现整个工作流程的自动化。
Photo by Mitchell Luo on Unsplash
…团队没有意识到他们丢失了什么
除了数据科学团队中这些众所周知的角色之外,还有一些不为人知的角色,但也同样重要。公司应该认识到数据科学翻译的重要性。
他们通过识别可以通过数据解决的最有影响力的项目和业务挑战,充当业务用户和数据科学工程师之间的桥梁。事实上,麦肯锡 估计 到 2026 年,仅美国对翻译的需求就可能达到两到四百万。
引入行为心理学家可以帮助数据科学团队将模式解释为可操作的见解,从而推动决策并提供商业价值。行为心理学家了解人们行为的原因,并可以通过洞察购买决策或客户流失来帮助数据科学家。
例如,寻求预测服务器故障的公司只需查看过去的内存使用水平和服务器负载方面的性能。然而,将真实的人投入到混合中,数据驱动的方法需要由人的维度来补充。
Photo by Jesse Orrico on Unsplash
一家希望预测员工流失率的公司需要了解的不仅仅是员工的历史或表现。在这里,社会科学家将提供对人口统计、个人偏好、职业阶段和过去情绪反应等因素的见解,以提高预测的准确性。
最后,任何想要有效沟通数据洞察的背景和叙述的成长中的数据科学团队都需要一个数据故事讲述者。数据故事讲述者所做的不仅仅是创建可视化仪表板:他们从数据洞察中精心制作吸引人的叙述,即使是最不专业的团队成员也能理解。
数据故事讲述者的工作是帮助非数据科学家团队成员和高管通过迷人的数据故事理解见解,并帮助他们将其转化为业务决策。
事实上,谷歌首席经济学家甚至在十年前就准确预测了这些角色在数据科学团队中的重要性,当时 他说 “获取数据的能力——能够理解它、处理它、从中提取价值、可视化它、交流它——这将是未来几十年非常重要的技能。”
“获取数据的能力——能够理解它、处理它、从中提取价值、可视化它、交流它——将是未来几十年非常重要的技能。”—哈尔·瓦里安
建立一个全面的数据科学团队比许多组织意识到的要困难得多。随着他们向数据最终成为文化的环境发展,组织会发现对这些角色的需求越来越大。
然而,随着 技术技能危机 的持续,渴望沿着数据之旅前进并雇佣必要人才的团队的努力仍将受到阻碍。一旦这种技能差距被填补,组织就可以全速前进,采用人工智能,并收获它的许多回报。与此同时,准备好争夺人才和专业知识对于保持竞争优势至关重要。
想了解更多关于如何在数据科学领域取得成功的信息吗?以下是每个数据科学团队必须计划的 5 个核心&关键技能 。想要在公共场合展示你对数据的热情?这篇文章告诉你从哪里开始。****
文本数据的完整探索性数据分析和可视化
Photo credit: Pixabay
如何将可视化和自然语言处理结合起来,以一种直观的方式产生洞察力
可视化表示文本文档的内容是文本挖掘领域最重要的任务之一。作为一名数据科学家或 NLP 专家,我们不仅从不同的方面和不同的细节层次探索文档的内容,而且我们还总结单个文档,显示单词和主题,检测事件,并创建故事情节。
然而,在可视化非结构化(文本)数据和结构化数据之间存在一些差距。例如,许多文本可视化不直接表示文本,它们表示语言模型的输出(字数、字符长度、单词序列等)。).
在本帖中,我们将使用女装电子商务评论数据集,并使用 Plotly 的 Python 绘图库和散景可视化库,尽可能多地探索和可视化。我们不仅要探索文本数据,还要可视化数字和分类特征。我们开始吧!
数据
df = pd.read_csv('Womens Clothing E-Commerce Reviews.csv')
table 1
在对数据进行简单检查后,我们发现需要进行一系列的数据预处理。
- 删除“标题”功能。
- 删除缺少“审查文本”的行。
- 清理“审阅文本”列。
- 使用 TextBlob 计算情绪极性,该极性位于[-1,1]范围内,其中 1 表示积极情绪,-1 表示消极情绪。
- 为评论的长度创建新的特征。
- 为评论的字数创建新功能。
text_preprocessing.py
为了预览情感极性得分是否有效,我们随机选择了 5 条情感极性得分最高的评论(1):
print('5 random reviews with the highest positive sentiment polarity: \n')
cl = df.loc[df.polarity == 1, ['Review Text']].sample(5).values
for c in cl:
print(c[0])
Figure 1
然后随机选择 5 条最中性情感极性得分(零)的评论:
print('5 random reviews with the most neutral sentiment(zero) polarity: \n')
cl = df.loc[df.polarity == 0, ['Review Text']].sample(5).values
for c in cl:
print(c[0])
Figure 2
只有 2 篇评论的负面情绪极性得分最高:
print('2 reviews with the most negative polarity: \n')
cl = df.loc[df.polarity == -0.97500000000000009, ['Review Text']].sample(2).values
for c in cl:
print(c[0])
Figure 3
成功了!
Plotly 单变量可视化
单变量或单变量可视化是最简单的可视化类型,它仅由对单个特征或属性的观察组成。单变量可视化包括直方图、条形图和折线图。
评论情绪极性得分分布
df['polarity'].iplot(
kind='hist',
bins=50,
xTitle='polarity',
linecolor='black',
yTitle='count',
title='Sentiment Polarity Distribution')
Figure 4
绝大多数情感极性得分都大于零,这意味着它们中的大多数都非常积极。
评论等级的分布
df['Rating'].iplot(
kind='hist',
xTitle='rating',
linecolor='black',
yTitle='count',
title='Review Rating Distribution')
Figure 5
评级与极性得分一致,也就是说,大多数评级在 4 或 5 的范围内相当高。
审稿人年龄分布
df['Age'].iplot(
kind='hist',
bins=50,
xTitle='age',
linecolor='black',
yTitle='count',
title='Reviewers Age Distribution')
Figure 6
大多数评论者年龄在 30 到 40 岁之间。
分发检查文本长度
df['review_len'].iplot(
kind='hist',
bins=100,
xTitle='review length',
linecolor='black',
yTitle='count',
title='Review Text Length Distribution')
Figure 7
评论字数的分布
df['word_count'].iplot(
kind='hist',
bins=100,
xTitle='word count',
linecolor='black',
yTitle='count',
title='Review Text Word Count Distribution')
Figure 8
有相当多的人喜欢留下长篇评论。
对于分类特征,我们简单地使用条形图来表示频率。
分裂的分布
df.groupby('Division Name').count()['Clothing ID'].iplot(kind='bar', yTitle='Count', linecolor='black', opacity=0.8,
title='Bar chart of Division Name', xTitle='Division Name')
Figure 9
一般分部的评论数最多,Initmates 分部的评论数最少。
部门分布
df.groupby('Department Name').count()['Clothing ID'].sort_values(ascending=False).iplot(kind='bar', yTitle='Count', linecolor='black', opacity=0.8,
title='Bar chart of Department Name', xTitle='Department Name')
Figure 10
说到部门,Tops 部门的评论最多,Trend 部门的评论最少。
阶级的分布
df.groupby('Class Name').count()['Clothing ID'].sort_values(ascending=False).iplot(kind='bar', yTitle='Count', linecolor='black', opacity=0.8,
title='Bar chart of Class Name', xTitle='Class Name')
Figure 11
现在我们来看“评论文本”特征,在探索这个特征之前,我们需要提取 N-Gram 特征。N-gram用于描述作为观察点的词的数量,例如,unigram 表示单词,bigram 表示双词短语,trigram 表示三词短语。为了做到这一点,我们使用了 scikit-learn 的 [CountVectorizer](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)
函数。
首先,比较去掉停用词前后的 unigrams 会很有趣。
移除停用词前的顶级单字分布
top_unigram.py
Figure 12
去除停用词后的顶级单字分布
top_unigram_no_stopwords.py
Figure 13
第二,我们想比较去除停用词前后的二元模型。
去除停用词前的顶级二元模型分布
top_bigram.py
Figure 14
去除停用词后的顶级二元模型分布
top_bigram_no_stopwords.py
Figure 15
最后,我们比较去除停用词前后的三元模型。
去除停用词前的顶级三元组分布
top_trigram.py
Figure 16
去除停用词后的顶三元模型分布
top_trigram_no_stopwords.py
Figure 17
【词性标注】是给每个词分配词性的过程,如名词、动词、形容词等
我们使用一个简单的Text blobAPI 来深入到我们的数据集中的“查看文本”特征的位置,并可视化这些标签。
评论语料库顶级词性标签分布
POS.py
Figure 18
箱线图用于比较电子商务商店的每个部门或分部的情感极性得分、评级、评论文本长度。
这些部门对情绪极性有什么看法
department_polarity.py
Figure 19
除了趋势部门之外,所有六个部门都获得了最高的情绪极性得分,而 Tops 部门收集了最低的情绪极性得分。而趋势部极性得分中值最低。如果你记得的话,潮流系的评论数量最少。这解释了为什么它不像其他部门那样有各种各样的分数分布。
各部门对评级有什么看法
rating_division.py
Figure 20
除了趋势部,其他部门的中值都是 5 分。总的来说,在这个评论数据集中,评分很高,情绪也很积极。
按部门审查长度
length_department.py
Figure 21
Tops 和 immune 部门的审查长度中位数相对低于其他部门。
用 Plotly 实现二元可视化
二元可视化是一种一次包含两个特征的可视化。它描述了两个特征之间的关联或关系。
推荐的情感极性得分分布
polarity_recommendation.py
Figure 22
显然,具有较高极性分数的评论更有可能被推荐。
按建议的评级分布
rating_recommendation.py
Figure 23
推荐的评论比不推荐的评论有更高的评级。
按建议分配审查长度
review_length_recommend.py
Figure 24
推荐评论往往比非推荐评论更长。
情感极性与评分的 2D 密度联合图
sentiment_polarity_rating.py
Figure 24
2D 密度年龄与情感极性交汇图
age_polarity.py
Figure 25
很少有人非常积极或非常消极。给予中性到正面评价的人更有可能是 30 多岁。这些年龄的人可能更活跃。
寻找特征术语及其关联
有时,我们希望分析不同类别使用的单词,并输出一些显著的术语关联。我们将使用分散文本和空间库来完成这些。
首先,我们需要将数据框架转换成一个分散文本语料库。要查找部门名称的差异,请将category_col
参数设置为'Department Names'
,并使用Review Text
列中的查看,通过设置text
列参数进行分析。最后,向nlp
参数传递一个空间模型,并调用build()
来构建语料库。
以下是区别评论文本和一般英语语料库的术语。
*corpus = st.CorpusFromPandas(df, category_col='Department Name', text_col='Review Text', nlp=nlp).build()
print(list(corpus.get_scaled_f_scores_vs_background().index[:10]))*
Figure 26
以下是审查文本中与 Tops 部门最相关的术语:
*term_freq_df = corpus.get_term_freq_df()
term_freq_df['Tops Score'] = corpus.get_scaled_f_scores('Tops')
pprint(list(term_freq_df.sort_values(by='Tops Score', ascending=False).index[:10]))*
Figure 27
以下是与服装部门联系最紧密的术语:
*term_freq_df['Dresses Score'] = corpus.get_scaled_f_scores('Dresses')
pprint(list(term_freq_df.sort_values(by='Dresses Score', ascending=False).index[:10]))*
Figure 28
主题建模评论文本
最后,我们希望探索这个数据集的主题建模算法,看看它是否会提供任何好处,以及是否适合我们正在为我们的评论文本功能所做的工作。
我们将在主题建模中试验潜在语义分析(LSA)技术。
- 将我们的文档术语矩阵从评论文本生成为一个包含 TF-IDF 特性的矩阵。
- LSA 模型用 TF-IDF 得分替换文档术语矩阵中的原始计数。
- 使用截断奇异值分解对文档术语矩阵进行降维。
- 因为部门的数量是 6,所以我们设置
n_topics=6
。 - 取该主题矩阵中每个评论文本的
argmax
,将给出数据中每个评论文本的预测主题。然后我们可以将这些分类成每个主题的数量。 - 为了更好的理解每个题目,我们会找到每个题目中出现频率最高的三个词。
topic_model_LSA.py
Figure 29
*top_3_words = get_top_n_words(3, lsa_keys, document_term_matrix, tfidf_vectorizer)
labels = ['Topic {}: \n'.format(i) + top_3_words[i] for i in lsa_categories]fig, ax = plt.subplots(figsize=(16,8))
ax.bar(lsa_categories, lsa_counts);
ax.set_xticks(lsa_categories);
ax.set_xticklabels(labels);
ax.set_ylabel('Number of review text');
ax.set_title('LSA topic counts');
plt.show();*
Figure 30
通过查看每个主题中最常用的词,我们有一种感觉,我们可能无法在主题类别之间达到任何程度的分离。换句话说,我们不能使用主题建模技术按部门分离评论文本。
主题建模技术有许多重要的局限性。首先,“主题”这个术语有些模糊,到目前为止,很明显主题模型不会为我们的数据产生高度细微的文本分类。
此外,我们可以观察到绝大多数的复习文本都被归类到第一个主题(主题 0)。LSA 主题建模的 t-SNE 可视化效果不会很好。
所有的代码都可以在 Jupyter 笔记本上找到。代码和交互式可视化可以在的 NBC viewer上查看。
周一快乐!
使用 Python 的交互式地理地图完整指南
有没有想过这些美丽的地理地图是如何制作的?我们的数据世界收集了大量关于健康、人口增长、教育、文化、暴力、政治权力、技术和我们关心的几个方面的交互式数据可视化。这些可视化帮助我们理解过去几十年世界是如何以及为什么发生变化的。我对这些丰富的信息很感兴趣,并激发了我更深入的探索。
一次快速的谷歌搜索让我找到了 choropleth 地图。地图显示与数据变量相关的彩色、阴影或图案化的划分的地理区域。地理区域可能覆盖整个世界,或者一个国家,州,甚至一个县。有许多工具和软件包可以使用 Python 制作独立的或静态的地图。然而,创建一个动态地图有点棘手,这正是我们将在这个博客中学习的内容。在这个循序渐进的指南中,我们将使用 Python 库和包在 肥胖成人的比例(1975-2016 年) 上重新创建一个交互式全球合唱团地图-熊猫、地球熊猫和 Bokeh 。
在第一部分,我们将创建一个静态地图,然后在代码的基础上引入交互性。
把密码给我
整个代码也可以在我的github.com找到。
下载和安装
要渲染世界地图,我们需要一个带有世界坐标的 shapefile。 Natural Earth 是一个公共领域地图数据集,提供各种分辨率的地理空间数据。对于我们的目的来说,1–110m 小规模数据已经足够好了。点击绿色按钮 下载国家 4.1.0 版 下载 shape 文件夹。接下来,进入我们的数据世界,点击图表上的数据选项卡,下载定义为肥胖的成年人份额. csv。或者,也可以从我的 github 库下载文件。安装 Geopandas 和 Bokeh。
探索熊猫和地理熊猫数据框
导入 geopandas。Geopandas 可以使用返回地理数据框架对象的read_file
命令读取几乎任何基于矢量的空间数据格式,包括 ESRI shapefile。shapefile 由许多列组成,其中只有 3 列是我们感兴趣的。为了便于参考,对列进行了重命名。
import geopandas as gpdshapefile = 'data/countries_110m/ne_110m_admin_0_countries.shp'*#Read shapefile using Geopandas* gdf = gpd.read_file(shapefile)[['ADMIN', 'ADM0_A3', 'geometry']]*#Rename columns.*
gdf.columns = ['country', 'country_code', 'geometry']
gdf.head()
Geopandas GeoDataFrame
我们可以删除“南极洲”这一行,因为它在我们的地图上不必要地占据了很大的空间,在我们当前的分析中也不需要。
print(gdf[gdf['country'] == 'Antarctica'])#*Drop row corresponding to 'Antarctica'* gdf = gdf.drop(gdf.index[159])
接下来,我们进口熊猫并阅读。csv 文件。
import pandas as pddatafile = 'data/obesity.csv'*#Read csv file using pandas*
df = pd.read_csv(datafile, names = ['entity', 'code', 'year', 'per_cent_obesity'], skiprows = 1)df.head()
Pandas DataFrame
df.info()
df[df['code'].isnull()
Investigating missing values in df
调查熊猫数据框架显示苏丹缺失值。我们的数据跨度从 1975 年到 2016 年;而苏丹在 2011 年 7 月分裂成两个国家。这导致了新分裂国家的 3 个字母的 ISO 代码的变化。为了简单起见,让我们忽略苏丹缺失的数据。
2016 年静态 choropleth 地图
让我们首先创建一个表示 2016 年成人肥胖比例的静态地图。这需要从 df 中过滤 2016 年的数据。然后,可以将生成的数据框架 df_2016 合并到地理数据框架 gdf 中。
*#Filter data for year 2016.*
df_2016 = df[df['year'] == 2016]*#Merge dataframes gdf and df_2016.*
merged = gdf.merge(df_2016, left_on = 'country_code', right_on = 'code')
合并后的文件是一个 GeoDataframe 对象,可以使用 geopandas 模块进行渲染。然而,由于我们想加入数据可视化的交互性,我们将使用散景库。散景使用 GeoJSON 格式,用 JSON 表示地理要素。GeoJSON 将点、线和多边形(在散景中称为面片)描述为要素的集合。因此,我们将合并后的文件转换为 GeoJSON 格式。
import json#*Read data to json.*
merged_json = json.loads(merged.to_json())#*Convert to String like object.*
json_data = json.dumps(merged_json)
我们现在准备使用散景渲染我们的 choropleth 地图。导入所需的模块。代码是内联描述的。
from bokeh.io import output_notebook, show, output_file
from bokeh.plotting import figure
from bokeh.models import GeoJSONDataSource, LinearColorMapper, ColorBar
from bokeh.palettes import brewer*#Input GeoJSON source that contains features for plotting.*
geosource = GeoJSONDataSource(geojson = json_data)*#Define a sequential multi-hue color palette.*
palette = brewer['YlGnBu'][8]*#Reverse color order so that dark blue is highest obesity.*
palette = palette[::-1]*#Instantiate LinearColorMapper that linearly maps numbers in a range, into a sequence of colors.*
color_mapper = LinearColorMapper(palette = palette, low = 0, high = 40)*#Define custom tick labels for color bar.*
tick_labels = {'0': '0%', '5': '5%', '10':'10%', '15':'15%', '20':'20%', '25':'25%', '30':'30%','35':'35%', '40': '>40%'}*#Create color bar.*
color_bar = ColorBar(color_mapper=color_mapper, label_standoff=8,width = 500, height = 20,
border_line_color=None,location = (0,0), orientation = 'horizontal', major_label_overrides = tick_labels)*#Create figure object.*
p = figure(title = 'Share of adults who are obese, 2016', plot_height = 600 , plot_width = 950, toolbar_location = None)
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None*#Add patch renderer to figure.*
p.patches('xs','ys', source = geosource,fill_color = {'field' :'per_cent_obesity', 'transform' : color_mapper},
line_color = 'black', line_width = 0.25, fill_alpha = 1)*#Specify figure layout.*
p.add_layout(color_bar, 'below')*#Display figure inline in Jupyter Notebook.*
output_notebook()*#Display figure.*
show(p)
酷!我们的 choropleth 地图已经生成。你可能在这张地图上发现了一个问题。非洲大陆看起来支离破碎;那是因为苏丹、南苏丹、索马里兰不见了。还有,格陵兰在世界地图上不见了。没有画出这些国家的原因是我们的中缺少一个或多个对应于这些国家的值。csv 文件,因此,数据帧 df。让我们解决这个问题,因为它会让一些人反感,这是理所当然的!
更正缺失的国家
我们可以确保缺失的国家被绘制在地图上,并用浅灰色填充,表示缺失的数据。这需要在我们之前的代码中进行一些编辑。
为了保留合并数据框中缺失的国家,我们执行了左合并/左外连接。因此,地理数据框架 gdf 中的每个国家都会保留在合并的数据框架中,即使熊猫数据框架 df 中缺少相应的行。
df_2016 = df[df['year'] == 2016]*#Perform left merge to preserve every row in gdf.*
merged = gdf.merge(df_yr, left_on = 'country_code', right_on = 'code', how = 'left')
这导致了下图。
Choropleth map for year 2016 (after left merge)
所以现在我们在地图上看到了之前缺失的国家,但是还有一个问题。新添加的国家按照我们的颜色映射器中的定义进行颜色编码,表示肥胖率在 0–5%的范围内。这具有误导性,因为实际上这些数据是缺失的。理想情况下,我们希望这些国家以中性色显示,如浅灰色,表示缺少数据。我们如何才能做到这一点?
左合并导致在合并的数据帧中为右数据帧中相应的缺失值添加 NaN 值(df_2016)。当我们将这个合并的数据帧转换成 GeoJSON 格式时,问题就出现了,因为 NaN 不是一个有效的 JSON 对象。为了避免这种情况,我们将把合并数据帧中的所有 NaN 值替换为字符串“No data”。
df_2016 = df[df['year'] == 2016]*#Perform left merge to preserve every row in gdf.*
merged = gdf.merge(df_2016, left_on = 'country_code', right_on = 'code', how = 'left')*#Replace NaN values to string 'No data'.*
merged.fillna('No data', inplace = True)
我们还将十六进制代码输入到带有“无数据”的颜色代码国家,作为颜色映射器的参数。
*#Instantiate LinearColorMapper that maps numbers in a range linearly into a sequence of colors. Input nan_color.*color_mapper = LinearColorMapper(palette = palette, low = 0, high = 40, nan_color = '#d9d9d9')
Choropleth map for year 2016 (after left merge and replacing NaNs)
太好了!我对我们 2016 年的 choropleth 地图很满意。是时候增加一些互动性了。
在我们的可视化中增加交互性使用户能够提取他们感兴趣的信息。我们的目标是创建一个动态地图,根据 1975-2016 年间选择的年份更新数据。我们还将添加一个悬停工具,允许用户只需将鼠标悬停在特定国家/地区上方即可查看详细信息。
Bokeh 提供了大量的小部件和工具,使得创建丰富的交互式可视化变得非常简单。我们将定义一些函数,并重用为创建静态地图而编写的大部分代码。代码是内联描述的。
from bokeh.io import curdoc, output_notebook
from bokeh.models import Slider, HoverTool
from bokeh.layouts import widgetbox, row, column*#Define function that returns json_data for year selected by user.*
def json_data(selectedYear):
yr = selectedYear
df_yr = df[df['year'] == yr]
merged = gdf.merge(df_yr, left_on = 'country_code', right_on = 'code', how = 'left')
merged.fillna('No data', inplace = True)
merged_json = json.loads(merged.to_json())
json_data = json.dumps(merged_json)
return json_data*#Input GeoJSON source that contains features for plotting.*
geosource = GeoJSONDataSource(geojson = json_data(2016))*#Define a sequential multi-hue color palette.*
palette = brewer['YlGnBu'][8]*#Reverse color order so that dark blue is highest obesity.*
palette = palette[::-1]*#Instantiate LinearColorMapper that linearly maps numbers in a range, into a sequence of colors. Input nan_color.*
color_mapper = LinearColorMapper(palette = palette, low = 0, high = 40, nan_color = '#d9d9d9')*#Define custom tick labels for color bar.*
tick_labels = {'0': '0%', '5': '5%', '10':'10%', '15':'15%', '20':'20%', '25':'25%', '30':'30%','35':'35%', '40': '>40%'}*#Add hover tool*
hover = HoverTool(tooltips = [ ('Country/region','[@country](http://twitter.com/country)'),('% obesity', '@per_cent_obesity')])*#Create color bar.*
color_bar = ColorBar(color_mapper=color_mapper, label_standoff=8,width = 500, height = 20,
border_line_color=None,location = (0,0), orientation = 'horizontal', major_label_overrides = tick_labels)*#Create figure object.*
p = figure(title = 'Share of adults who are obese, 2016', plot_height = 600 , plot_width = 950, toolbar_location = None, tools = [hover])
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None*#Add patch renderer to figure.*
p.patches('xs','ys', source = geosource,fill_color = {'field' :'per_cent_obesity', 'transform' : color_mapper},
line_color = 'black', line_width = 0.25, fill_alpha = 1)*#Specify layout*
p.add_layout(color_bar, 'below')*# Define the callback function: update_plot*def update_plot(attr, old, new):
yr = slider.value
new_data = json_data(yr)
geosource.geojson = new_data
p.title.text = 'Share of adults who are obese, %d' %yr
*# Make a slider object: slider*
slider = Slider(title = 'Year',start = 1975, end = 2016, step = 1, value = 2016)
slider.on_change('value', update_plot)*# Make a column layout of widgetbox(slider) and plot, and add it to the current document*
layout = column(p,widgetbox(slider))
curdoc().add_root(layout)*#Display plot inline in Jupyter notebook*
output_notebook()*#Display plot*
show(layout)
厉害!我们已经成功地为肥胖的成年人重新创建了交互式 choropleth 地图。请注意,当您更改 Jupyter 笔记本中的滑块值时,图不会更新。要以交互模式查看此应用程序,您需要设置一个本地散景服务器。在当前目录下打开命令行窗口,执行bokeh serve --show filename.ipynb
命令。
Setting up local Bokeh server
单击提示的链接,在浏览器中打开应用程序。我已经插入了一个简短的剪辑,显示了互动模式的应用程序。
World obesity Interactive Choropleth map