TowardsDataScience 博客中文翻译 2016~2018(三百二十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

当人工智能遇到 3000 年前的中国手相术

原文:https://towardsdatascience.com/when-ai-meets-3000-year-old-chinese-palmistry-a767b7f3defb?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Handbot —第一个使用深度学习(CNN)分析一个人的手掌来预测他/她的性格特征、健康、职业、关系等许多方面的看手相聊天机器人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在一次 48 小时的黑客马拉松(HackNTU 2017 @ Taipei,Taiwan)中,我正在实习的初创公司的两位同事、我的一位大学朋友、我的哥哥和我合作开发了第一个手相聊天机器人,又名 Handbot 。我们渴望给有 3000 年历史的中国手相行业带来颠覆性的创新。

幸运的是,我们获得了 Hitcon 颁发的信息安全奖。

如果你是一名科学爱好者,并且难以相信算命,这里有一个更科学的解释,可能会改变你的想法

人类的手包含了丰富的信息,因为婴儿的手在怀孕早期就形成了,研究人员喜欢说它们相当于早期发育的“化石记录”,可以为未来的健康提供洞察力“看手相是真的?”,大西洋。

正如我们所知,很多人痴迷于算命,而看手相是每个人能够开始预测他们命运的最简单的方法之一。然而,许多人仍然有识别手掌线条的问题。于是,我们想出了这个点子:结合“看手相”、“深度学习”、“聊天机器人”。

alm 阅读:我们在黑客马拉松的前几个小时学习了基本的手相,包括关系、职业和健康的分析和预测。然后,我们给 2000 多张真实人类手掌的照片贴上标签,并分别给它们的关系、事业和健康打了 6000 多分。(你可以在这里找到我们的标签文件。)

D eep 学习:我们使用 Keras 中的 VGG-16(16 层网络)与 Tensorflow 后端作为我们的 CNN 模型。使用 GPU 加速,我们已经训练了 10 个 epoch,每个 epoch 1000 步。模型的均方误差为 1.3066。况且估值 MSE 是 1.1721。总的来说,这个结果足以预测一个新的手掌。(你可以在这里找到我们的代码。)

C hatbot 相对于 App 和 Web,更容易被移动用户获取,也更容易在社交媒体上传播。因此,我们使用聊天工具在 Facebook Messenger 上创建了一个人工智能聊天机器人。下面可以看到 Handbot 的用户流量。我们设计的平滑 UX 帮助我们实现了 80% 的用户留存率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一天之内超过 80 个用户只拥有个人脸书分享。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

超过 70 个活跃用户,大多数用户在手动机器人上手后都按过按钮。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以在 HITCON 的流媒体视频 这里 上看到我们的 Demo(从 1:48:00 开始)。
您还可以在这里
阅读关于本次黑客马拉松(包括我们)获胜者的新闻报道

聊天机器人应用程序隐藏的安全问题

我们在黑客马拉松上推出 Handbot 并在社交媒体上推广的第一个晚上,我们不仅收到了来自我们朋友的消息,还收到了一些 HackNTU 与会者和一些陌生人的消息。我们开始得到他们手掌的照片(有时是他们的脸),手掌后面的背景,此外,还有他们在脸书的个人信息。我们震惊于从这个聊天机器人中可以获得如此多的用户信息。我们可以知道他们是谁,他们在哪里,甚至他们的指纹!

人们在使用聊天机器人这样的应用程序时,对信息安全风险的意识越来越弱:我们太习惯于在 Messenger 上与朋友随意聊天,所以我们有一种思维定势,认为“在 Messenger 上进行的对话是安全和隐私的。”我们倾向于把聊天机器人当作朋友,我们没有过滤给它发短信。

在 2016 年至 2023 年的预测期内,全球聊天机器人市场预计将呈指数级增长。作为用户,我们应该更加意识到隐藏的安全问题。像脸书这样的大型社交媒体平台应该主动拦截不合适的应用。

何时以及如何使用加权最小二乘(WLS)模型

原文:https://towardsdatascience.com/when-and-how-to-use-weighted-least-squares-wls-models-a68808b1a89d?source=collection_archive---------0-----------------------

WLS,OLS 被忽视的表弟

Metis ,我教的第一批机器学习模型之一就是大部分人在高中学习的素简普通最小二乘(OLS) 模型。Excel 有办法去除 OLS 建模的魅力;学生们经常假设有一个散点图,一些神奇的数学方法可以画出一条最佳拟合线,然后在角落里有一个 r,我们希望它接近 1。事实是,OLS 远不止看上去那么简单,大约一周后,学生们哭着求饶(免责声明:没有学生实际上受到伤害!)当我们深入一个最初看起来如此简单的领域时。

理解了这个广泛适用的模型后,一个自然的反应是将 OLS 用于任何事情。这并不是一个糟糕的想法:尽管 OLS 需要四个——有人说是五个或六个——假设来满足原始或“经过处理”的数据,但是建模范例是相当健壮的,并且通常可以很好地执行,只要我们规范并使用适当的复杂性、对数变换、截取等。

然而,OLS 只是一个杰出的家谱:

加权最小二乘法(WLS)是安静平方的表亲,但她有一套独特的技巧,与某些数据集完全一致!

输入异方差

我的学生们最喜欢的另一个术语是异性恋,这也是“数据科学刽子手”或其他欢乐时光庆祝活动的常见特征。来自古希腊语 *hetero,*意为“不同”,而 *skedasis,*意为“分散”,也可以在英语化的“异方差”(注意附加的‘c’)形式中找到。简而言之,异方差数据具有随输入而变化的可变性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: sarupub.org

事实是,许多数据显示了这种“异方差”。列举一些特征-反应关系的例子,我们通常可以直观地解释为什么:

  • 随着年龄的增长,净值趋向分化
  • 随着公司规模的扩大,收入趋向分化
  • 或者,随着婴儿身高的增加,体重往往会出现差异

OLS 的一个主要假设是数据——以及残差——是本土的。啊哦!好消息是 OLS 可以处理一定程度的异方差。在网上搜索,你可能会发现不同的经验法则,比如“最高可变性不应超过最低可变性的四倍”。还有一个数量的测试来统计确定你问题的严重程度。

幸运的是,OLS 的假设不是非黑即白、二元对立的。有一个灰色区域,在那里模型仍然工作得相当好。

“但是如果我有可怕的——超过 4 倍的异方差——回归怎么办,大师?”

“那我们就去 WLS 吧,年轻的学徒!”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Yoda taught me everything I know about machine learning!!

WLS 来救援了!

让我们看看 WLS 是如何在我最喜欢的机器学习环境之一 scikit-learn 中实现的。

数据设置

让我们生成一些假数据:

import numpy as np
import pandas as pd
import seaborn as sns
import statsmodels.api as sm
%matplotlib inline# generate random data
np.random.seed(24)
x = np.random.uniform(-5,5,25)
ϵ = 2*np.random.randn(25)
y = 2*x+ϵ
# alternate error as a function of x
ϵ2 = ϵ*(x+5)
y2 = 2*x+ϵ2sns.regplot(x,y);
sns.regplot(x,y2);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Blue: Regular and Orange: Heteroskedastic

请注意,这些集合来自相同的地面真值函数,但是作为x的函数而增加的方差导致橙色模型拟合不同于蓝色的线。在另一次随机抽取中,斜率可能比蓝色低,但总体上更不稳定。

# add a strong outlier for high x
x_high = np.append(x,5)
y_high = np.append(y2,160)# add a strong outlier for low x
x_low = np.append(x,-4)
y_low = np.append(y2,160)

上面的第一个附录模拟了一个常见的场景,在这个场景中,一个高方差的区域(预期的)会出现一个极端的观察结果。这将对 OLS 产生比 WLS 更大的影响,因为 WLS 将减少差额及其“罚金”的权重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

High outlier, on the top right

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Low outlier, on the left

SKLearn 中的 WLS

为了计算样本重量,记住我们添加的误差作为(x+5)的函数而变化;我们可以用这个来反过来衡量这些值。只要相对权重一致,就不需要绝对的基准。

# calculate weights for sets with low and high outlier
sample_weights_low = [1/(x+5) for x in x_low]
sample_weights_high = [1/(x+5) for x in x_high]
# reshape for compatibility
X_low = x_low.reshape(-1, 1)
X_high = x_high.reshape(-1, 1)---------
# import and fit an OLS model, check coefficients
from sklearn.linear_model import LinearRegressionmodel = LinearRegression()
model.fit(X_low, ymod)# fit WLS using sample_weights
WLS = LinearRegression()
WLS.fit(X_low, ymod, sample_weight=sample_weights_low)print(model.intercept_, model.coef_)
print('WLS')
print(WLS.intercept_, WLS.coef_)# run this yourself, don't trust every result you see online =)

请注意 WLS 的斜率是如何受到低异常值的更多影响的,这是应该的。低区域应该具有较低的可变性,因此异常值被放大到高于 OLS 值,从而将斜率推得更负。下面让我们看看 WLS 是如何抑制高异常值的。

model = LinearRegression()
model.fit(X_high, ymod)WLS.fit(X_high, ymod, sample_weight=sample_weights_high)print(model.intercept_, model.coef_)
print('WLS')
print(WLS.intercept_, WLS.coef_)

您将会注意到,在预期方差区域中的异常值是如何减少对参数估计的影响的。请记住,当异常值不完全相等时,请使用 WLS!

结论

你有它!实现 WLS 可能有些棘手;sklearn没有独特的 WLS 模型,因为论证功能(也用于决策树和其他模型)暗中支持我们的需求。

这是对 WLS 的基本介绍,在这个领域还有很多可以探索的,包括有前途的 Huber-White“三明治”估计方法

最后,道格拉斯·c·蒙哥马利、伊丽莎白·a·佩克和 g·杰弗里·维宁在《线性回归分析简介》一书中推荐了一种加权方法。例如:

  1. 建模时总是寻求使用经验或先验信息。
  2. 使用模型的残差—例如如果var(εi)=σ2x_i*var(εi)=σ2x_i —那么我们可能决定使用w_i=1/x_i
  3. 如果回应是n观察的平均值,类似于var(y_i)=var(ε_i)=σ2/n_i*var(y_i)=var(ε_i)=σ2/n_i,那么我们可能会决定使用w_i=n_i
  4. 有时我们知道不同的观测值是由不同的仪器测量的,这些仪器具有一定的(已知的或估计的)准确性。在这种情况下,我们可以决定使用与测量误差方差成反比的权重。

与大多数数据科学工作一样,您的方法必须灵活适应您所拥有的数据类型。

快乐造型!一如既往,感谢您的阅读、联系和分享!

当贝叶斯、奥卡姆和香农一起定义机器学习时

原文:https://towardsdatascience.com/when-bayes-ockham-and-shannon-come-together-to-define-machine-learning-96422729a1ad?source=collection_archive---------1-----------------------

机器学习基础

一个美丽的想法,它将统计学、信息论和哲学的概念结合在一起,为机器学习奠定了基础。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

感谢

感谢我在佐治亚理工学院的 CS7641 课程,在我的 MS 分析项目中,我发现了这个概念,并受到了写这个概念的启发。感谢马修·梅奥编辑并在 KDnuggets 重新发布这篇文章。

介绍

有点令人惊讶的是,在所有机器学习的热门词汇中,我们很少听到一个短语将统计学习、信息论和自然哲学的一些核心概念融合成一个三个词的组合。

此外,它不仅仅是一个为机器学习(ML)博士和理论家准备的晦涩而学究式的短语。对于任何有兴趣探索的人来说,它有一个精确和容易理解的含义,并且对于 ML 和数据科学的实践者来说,它有一个实际的回报。

我说的是 最小描述长度 。你可能会想这到底是什么…

让我们把这些层剥开,看看它有多有用…

贝叶斯和他的定理

谁是托马斯·贝叶斯?

我们从(不是按时间顺序)托马斯·贝叶斯牧师开始,顺便说一下,他从未发表过他关于如何进行统计推断的想法,但后来因同名定理而名垂千古。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那是 18 世纪下半叶,数学科学中还没有叫“概率论”的分支。它被简单地称为听起来相当奇怪的“ 机会主义”——以亚伯拉罕·德·莫伊弗尔的一本书命名。一篇名为《 解决机会主义 中的一个问题的论文》的文章,最初由贝叶斯撰写,但由他的朋友理查德·普莱斯编辑和修改,被宣读给皇家学会,并发表在 1763 年伦敦皇家学会的哲学会刊上。在这篇文章中,Bayes 以一种相当频繁的方式描述了一个关于联合概率的简单定理,它导致了逆概率的计算,即 Bayes 定理。

两个阵营的故事

从那以后,统计科学的两个敌对派别——贝叶斯主义者和频繁主义者——之间进行了多次斗争。但是为了本文的目的,让我们暂时忽略历史,把注意力集中在贝叶斯推理机制的简单解释上。关于这个话题的超级直观的介绍,请看布兰登·罗勒的伟大教程。我会专注于方程式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这实质上是告诉你在看到数据/证据(可能性)后更新你的信念(先验概率,并将更新后的信念度赋予术语后验概率。你可以从一个信念开始,但是每一个数据点都会加强或削弱这个信念,并且你一直在更新你的假设。

让我们来谈谈“假设”

听起来简单直观?太好了。

不过,我在这一段的最后一句中耍了一个花招。你注意到了吗?我把这个词溜进了假设 。那不是正常的英语。那是正式的东西:-)

在统计推断的世界里,假设是一种信念。这是一种对过程的真实性质的信念(我们永远无法观察到),这是随机变量产生的背后(我们可以观察或测量,尽管不是没有噪音)。在统计学中,一般定义为概率分布。但在机器学习的背景下,可以想到任何一组规则(或逻辑或过程),我们相信,这些规则可以产生示例或训练数据,我们被赋予学习这一神秘过程的隐藏性质。

所以,让我们试着用不同的符号——属于数据科学的符号——来重铸贝叶斯定理。让我们用 D 来表示数据,用 h 来表示假设。这意味着在给定数据 的情况下,我们应用贝叶斯公式来尝试确定 数据来自什么假设。我们将定理改写为,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,一般来说,我们有一个大的(通常是无限的)假设空间,也就是说,有许多假设可供选择。贝叶斯推理的本质是我们要检查数据,以最大化最有可能产生观察数据的一个假设的概率。我们主要是想确定 argmax 中的P(h|D)即我们想知道对于哪个,观察到的 D 最有可能。为此,我们可以放心地把这个术语放在分母P(D)中,因为它不依赖于假设。这个方案被称为一个相当拗口的名字 【最大后验概率(MAP)】**

现在,我们运用下面的数学技巧,

  • 事实上,最大化对对数的作用与对原始函数的作用相似,即取对数不会改变最大化问题。
  • 乘积的对数是各个对数的和
  • 一个数量的最大化等价于负数量的最小化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好奇者好奇者……那些负对数为 2 的术语看起来很熟悉……来自信息论

克劳德·香农进入。发明信息时代的天才。****

香农和信息论

将需要多卷来描述克劳德·香农的天才和奇特人生,他几乎是单枪匹马奠定了信息论的基础,引领我们进入了现代高速通信和信息交换的时代。

这是一本关于他的生活和工作的好书,

***** [## 游戏中的思维:克劳德·香农如何发明信息时代

一种思想在发挥作用:克劳德香农如何发明了信息时代。下载…

www.amazon.com](https://www.amazon.com/dp/B01M5IJN1P/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

香农的麻省理工学院硕士论文电气工程被称为 20 世纪最重要的硕士论文:在这篇论文中,22 岁的香农展示了如何使用继电器和开关的电子电路实现 19 世纪数学家乔治·布尔的逻辑代数。数字计算机设计的最基本特征——将“真”和“假”以及“0”和“1”表示为打开或关闭的开关,以及使用电子逻辑门来做出决定和执行算术——可以追溯到香农论文中的见解。

但这还不是他最大的成就。

1941 年,香农去了贝尔实验室,在那里他研究战争问题,包括密码学。他还致力于信息和通信背后的原创理论。1948 年,这项工作出现在贝尔实验室研究期刊上发表的著名论文中。

熵和最小长度

香农通过一个类似于物理学中定义热力学熵的公式 定义了一个来源产生的信息量——例如,一条消息中的信息量。用最基本的术语来说,香农的信息熵是对一条信息进行编码所需的二进制位数。并且对于概率为 p 的消息或事件,该消息的最有效(即紧凑)编码将需要 - log2§ 比特。

这正是出现在从贝叶斯定理导出的最大后验概率表达式中的那些术语的本质!

因此,我们可以说,在贝叶斯推理的世界里,最可能的假设依赖于两个引起长度感的术语——而不是最小长度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是在这些术语中,长度的概念是什么呢?

长度(h):奥卡姆剃刀

奥卡姆的威廉 ( 1287–1347)是英国方济各会修士和神学家,也是一位有影响力的中世纪哲学家。他作为一个伟大的逻辑学家的声望主要来自于他的格言,被称为奥卡姆剃刀。术语剃刀指的是通过“剔除”不必要的假设或将两个相似的结论分开来区分两个假设。

归功于他的准确的话是: entia non sunt 被乘数 da praeter necessitem(实体不得被乘以超过必要性)。用统计学的术语来说,这意味着我们必须努力用最简单的假设来解释所有令人满意的数据。

类似的原则得到了其他杰出人士的响应。

伊萨克·牛顿爵士:“除了那些既真实又足以解释自然现象的原因之外,我们不会承认更多的原因。

伯特兰·罗素:“只要有可能,用已知实体的结构代替对未知实体的推断。

总是偏爱较短的假设

需要举例说明什么是 一个假设的长度 是多少?

以下哪个决策树的长度小于长度? A 还是 B

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即使没有一个假设的“长度”的精确定义,我确信你会认为左边(A)的树看起来更小更短。当然,你是对的。因此,更短的假设是具有更少的自由参数,或者不太复杂的决策边界(对于分类问题),或者这些属性的某种组合,这可以代表其简洁性。

事实上,奥卡姆剃刀的数学形式主义最终形成了一种叫做“ 索洛莫洛夫的归纳推理理论 ”的东西,它被认为是通向人工一般智能(AGI)的基础垫脚石

著名的麻省理工学院物理学家和人工智能研究人员 Max Tegmark 最近使用奥卡姆剃刀原理构建了被吹捧为“ ”的人工智能物理学家 ”,这是一个无监督的学习代理,以学习和理论操纵为中心,能够简约地预测未来的两个方面(从过去的观察结果)以及这些预测准确的领域。

那‘长度(D | h)’呢?

它是给定假设的数据长度。那是什么意思?

直观上,与假设的正确性或表示力有关。在给定一个假设的情况下,它决定了数据可以“推断”得多好。如果假设很好地生成了数据,并且我们可以无误差地测量数据,那么我们根本不需要数据。

想到牛顿运动定律

它们最初出现在 原理 中时,背后并没有任何严谨的数学证明。它们不是定理。它们很像假设,基于对自然物体运动的观察。但是他们很好的描述了数据。因此,它们变成了物理定律。

这就是为什么你不需要保存和记忆,所有可能的加速度,作为物体所受力的函数。你只要相信紧致假设 aka 定律 F=ma 并且相信你需要的所有数字,都可以在必要的时候从中计算出来。这使得 ***长度【D | h】***确实很小。

但是如果数据偏离紧凑假设很多,那么你需要有一个关于这些偏离是什么的很长的描述,对它们可能的解释,等等。

因此, Length(D|h) 简洁地捕捉到了“数据与给定假设的吻合程度”这一概念。

本质上,这是错误分类或错误率的概念。对于一个完美的假设,它很短,在极限情况下可能为零。不完全符合数据的假设往往很长。

而且,这是一种权衡。

如果你用奥卡姆剃刀剃掉你的假设,你可能会剩下一个简单的模型,一个不能适合所有数据的模型。因此,你必须提供更多的数据来增强信心。另一方面,如果您创建一个复杂(长)的假设,您可能能够很好地拟合您的训练数据,但这实际上可能不是正确的假设,因为它违反了具有小熵假设的 MAP 原则。

听起来像是偏差-方差权衡?是的,还有那个:-)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://www.reddit.com/r/mlclass/comments/mmlfu/a_nice_alternative_explanation_of_bias_and/

把所有的放在一起

因此,贝叶斯推断告诉我们,最佳假设是使两项之和最小的假设:假设长度和错误率

在这一句意义深远的话中,它几乎囊括了所有(受监督的)机器学习。

想想它的后果,

  • 一个线性模型的模型复杂度——选择什么次数的多项式,如何减少残差平方和
  • 一个神经网络架构的选择——如何不过度拟合训练数据,达到良好的验证精度,同时减少分类误差。
  • 支持向量机正则化和核选择——软硬余量之间的平衡,即在准确性和决策边界非线性之间进行权衡。

我们真正的结论是什么?

从对最小描述长度(MDL)原则的分析中,我们可以得出什么结论?

这是否一劳永逸地证明了短假设是最好的?

号码

MDL 显示的是,如果假设的表示被选择为使得假设的大小为 log2 P( h ),并且如果异常(错误)的表示被选择为使得编码长度为 D,给定为 h, 等于-log2p(D|

然而,为了表明我们有这样的表示,我们必须知道所有的先验概率 P( h ),以及 P(D|h)。没有理由相信 MDL 假设相对于假设和错误/误分类的任意编码应该是优选的。

对于实际的机器学习来说,对于人类设计者来说,指定一个表示来获取关于假设的相对概率的知识可能比完全指定每个假设的概率更容易。

这就是知识表示和领域专长的问题变得至关重要的地方。它缩短了(通常)无限大的假设空间,并将我们引向一组极有可能的假设,我们可以对这些假设进行最佳编码,并努力从中找到一组映射假设。

…最佳假设是最小化两项之和的假设:假设的长度和错误率

总结和反思

这是一个奇妙的事实,对概率论的一个基本恒等式进行这样一组简单的数学操作,就可以对监督机器学习的基本限制和目标进行如此深刻和简洁的描述。对于这些问题的简明处理,读者可以参考这篇博士论文,名为“为什么机器学习有效”,来自卡耐基梅隆大学。同样值得思考的是,所有这些如何与没有免费的午餐定理联系在一起。

如果你对这方面的深入阅读感兴趣

  1. 没有免费的午餐和最小描述长度
  2. 没有免费的午餐对抗监督学习中的奥卡姆剃刀
  3. 没有免费的午餐和问题描述长度*****

如果您有任何问题或想法要分享,请通过tirthajyoti【AT】Gmail . com联系作者。此外,您可以查看作者的 GitHub 资源库 中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。如果你像我一样,对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我在 Twitter 上关注我。

**** [## Tirthajyoti Sarkar -高级首席工程师-低压设计工程-半导体上|…

查看 Tirthajyoti Sarkar 在世界上最大的职业社区 LinkedIn 上的个人资料。Tirthajyoti 有 8 份工作…

www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)****

当计算机视觉遇到印度教的神!!

原文:https://towardsdatascience.com/when-computer-vision-meets-hindu-gods-927b5fa22063?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如有史以来排名第九的畅销小说作家 J. K .罗琳所说,“我们不需要魔法来改变我们的世界,我们已经拥有了我们内心需要的所有力量。我们有能力让想象得更好。”。这些特别的台词把我带到了一个制作一个我从未想过的项目的旅程,一个我从未想象过的项目。就像所有其他人一样,我也开始寻找每个角落的想法,从我不久前发表的名为“用 TensorFlow 检测模型进行实时物体检测”的项目开始,但我无法拿出一些非凡的东西。

一天,当我在浏览我的脸书账户时,奥地利理论物理学家埃尔温·薛定谔的一句话引起了我的注意,他因在量子力学方面的贡献而闻名,这句话是“任务是……不要去看别人还没看过的东西;而是去思考没有人思考过的东西,思考每个人都看到的东西。,它最终帮助我确定了我的旅程的方向,直到现在我都没有方向。

嗯,我知道宇宙以神秘的方式运作的一个事实,所以所有这些引用和事件使我能够进入我的下一个项目,即“使用计算机视觉对印度教神进行面部识别”,因为我练习计算机视觉有一段时间了,所以我有意挑战自己,以这样一种方式建立一个面部识别系统,即使在计算有限的平台上,它也应该及时地执行识别任务,并具有可观的准确性。

在我寻求为印度教神制作一个面部识别系统的过程中,是时候我应该做出选择了(在 3300 万或 33000 万印度教神中)我应该选择哪一个,来建立一个可以做两件事的系统。

首先是认识印度教的神,其次是在需要的时候容易发现神。因此,从简单的观点来看,我选择湿婆神、甘尼萨神、哈奴曼神,最后但同样重要的是奎师那神。

所以,在向你们解释了灵感、动机、我的项目是什么以及项目的预期结果之后,我知道我的读者朋友们,你们一定都进入了怀疑的模式,你们一定都有数百万个问题在脑海中,比如我是如何做到的,我是如何实现的,我是如何使这个项目或这个尝试成为可能的。

是时候打破不确定性,进入项目的执行部分了。从这一点开始,我将向你解释这个项目的每一个细节,并消除你头脑中所有的疑惑。所以,系好你的安全带,准备好迎接这一独特而永恒的旅程吧,我相信你以前从未经历过。

但是在进入执行部分之前,我需要分享一些我使用的硬件和软件信息,这些信息对项目的前景非常重要。

硬件:

  1. Nvidia GeForce 410M GPU 组成的笔记本电脑。
  2. 一个 7 美元的网络摄像头。
  3. A 树莓 pi 3 Model B5 寸 HDMI 液晶只是为了炫耀:),可以用手机或者自己的笔记本电脑抓拍脸部。

软件(仔细查看版本)

  1. 蟒蛇与 Python 版本 3.6.3
  2. OpenCV( 版本 3.4.0 )

操作系统 Windows 10,就是这样

现在,让我们来谈谈步骤,整个项目分为三个部分:

  1. 收集数据集简而言之,这一步允许我制作自己的定制数据集,在这一步中,我收集了我想要为之构建面部识别系统的印度教神灵的面部。我使用的算法是基于 Haar 特征的级联分类器,我收集不同印度教神的图像的方式如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Collecting images for dataset using a Webcam and a Raspberry pi

在我完成捕捉人脸的这一步后的结果可以在下面的图像中看到,虽然上面的图像是彩色的,但代码是以这样一种方式编写的,它将识别图像中的人脸,只提取人脸并将其存储在灰度模式中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A look on my Hindu Gods Custom Dataset

2.为了让你知道,我收集了 4 个印度教神的 100 张脸。收集数据集后,下一个重要步骤是在我的自定义数据集上训练分类器,当我执行这一步骤时,我最终得到了一个名为 train.yml 的文件,其中包含了所有关于印度教神的面孔及其 id 的信息。

3.最后一步对我来说是关键时刻,它的结果表明我的面部识别和检测系统能够准确地检测到印度教的神,结果可以在下图中看到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

哒哒哒!!任务完成工作做得很好我的项目检测印度教神的脸与有限的计算资源的可用性看到一个预期的结束,上面的图像是不言自明的。但是等等,这不是我需要深入的全部(我喜欢这个词,因为我也是一名深度学习实践者)来让你理解关于我的项目或方法的一些关键点,所以请为这最后一部分努力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们深入一点

首先,这个项目是为了检测印度教神的面孔,因此为了识别众多神中的四个印度教神,我将每个神与一个 id 相关联,例如,我将湿婆神作为 id 1,甘尼萨神作为 id 2,等等,你可以在文件名 face_dataset_v1.py 中找到代码,你可以在我的 GitHub 存储库中找到,不要担心我在参考部分提到了所有的链接。

如果你想制作自己的印度教神数据集,而不是我的 GitHub 库中已经有的数据集,如果你想对多个不同的脸进行面部识别,只需每次运行该程序,给出一个数字 id,如 1,2,3 等,并将其保存在一个名为 datasets 的文件夹中。

其次,当你完成了自己的定制数据集,然后只运行 training_v1.py 文件,这样它就可以从 datasets 文件夹中转换你的所有图像及其各自的 id,并将其保存到另一个文件夹名称 train,文件名为 train.yml。

嗯,我的项目的主角不是别人,正是haarcascade _ frontal face _ default . XML文件,它是预先构建的正面人脸训练模型,用于人脸检测,因此请确保它应该与其他文件存在于同一目录中,否则即使是创建数据集的第一步也不会起作用。

最后,在你成功地运行了上面提到的两个 Python 文件之后,只需运行 face_recognition_v1.py,就能看到神奇之处,或者我会说感受一下神奇之处,有时我听起来确实很有诗意。下面是文章的最后一张相关图片,请欣赏!!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Final Setup of my Face recognition System ,look look it detected Lord Shiva perfectly 😃

参考资料:

  1. 这个项目代码的 GitHub 库链接可以在这里找到。
  2. 为了了解更多关于面部识别系统的信息,您可以查看这里
  3. 为了了解更多关于计算机视觉的知识,你可以查看这里
  4. 最后但同样重要的是,你可以在这里查看 YouTube 视频。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

感谢您的关注

你用你的时间来阅读我的作品对我来说意味着整个世界。我完全是这个意思。

如果你喜欢这个故事,疯狂鼓掌吧👏 ) 按钮!这将有助于其他人找到我的工作。

还有,想的话就跟我上 !我很乐意。

当传统智慧失败时:重新审视自动驾驶汽车的数据增强

原文:https://towardsdatascience.com/when-conventional-wisdom-fails-revisiting-data-augmentation-for-self-driving-cars-4831998c5509?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DeepScale 一直在寻找提高我们的对象检测模型性能的方法。在这篇文章中,我将讨论我们为此启动的一个项目,以及我们在这个过程中的非直觉发现。

增强实验和不直观的结果

在我开始在 DeepScale 实习时,我的任务是实现一个新的数据增强器,以改善我们的对象检测工作。其中一个突出的是一个简单的技术,叫做剪切正则化。简而言之,剪切将输入图像中随机定位的正方形涂黑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Cutout applied to images from the CIFAR 10 dataset.

原始论文表明,剪切可以显著提高视觉应用的精度。正因为如此,当我将它应用于我们的数据时,我很惊讶我们的检测 mmAP 下降了。我在我们的数据管道中搜索这个问题,发现了更令人惊讶的事情:我们已经在使用的所有增强器都极大地损害了性能。

在这个探索的开始,我们使用翻转、裁剪和权重衰减正则化,这是对象检测任务的标准方案。通过一项消融研究,我发现这些都损害了我们内部数据集的检测性能。相对于网络的初始性能,移除默认增强器后,mmAP*提升了 13%。

*mmAP 是 COCO 对象检测挑战 的默认评估指标。它代表“平均平均精度”AP 表示单个类的所有例子的边界框检测的平均精度。对所有类别的 AP 求平均值得到 mAP,对交集/并集阈值范围(从 0.5 到 0.95)的 mAP 求平均值得到 mmAP。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Generally, we would expect adding weight decay, flip and crop to improve performance by a few points each, as shown in the dashed bars. In our case, however, these augmentors hurt mmAP by a relative 8.4%, 0.1% and 4.5%, respectively. Removing all augmentors lead to a total performance boost of 13%.

那么,为什么这些标准增强器会损害我们的表现呢?为了解释我们不直观的结果,我们不得不从基本原理出发,重新审视图像增强的概念。

我们为什么使用数据增强

(本节介绍数据扩充背后的直觉。如果你已经熟悉增强,请随意跳到“为什么自动驾驶汽车数据不同。”)

过拟合是深度神经网络的常见问题。神经网络极其灵活;然而,考虑到公共数据集的大小,它们经常被过度参数化。这导致模型学习数据集中的“噪声”而不是“信号”换句话说,他们可以记住数据集的非预期属性,而不是学习关于世界的有意义的一般信息。因此,当给定新的真实世界数据时,过度拟合的网络无法产生有用的结果。

为了解决过度拟合的问题,我们经常“增加”我们的训练数据。扩充视觉数据的常用方法包括水平随机翻转图像(翻转)、改变图像色调(色调抖动)或裁剪随机部分(裁剪)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A picture of a giraffe (top left) shown with several common image augmentors: flip (top right), hue jitter (bottom left) and crop (bottom right). Despite these transformations, it is clear that each image is of a giraffe.

像翻转、色调抖动和裁剪这样的增强器有助于克服过度拟合,因为它们提高了网络的泛化能力。如果你训练一个网络来识别面向右的长颈鹿和面向左的长颈鹿的翻转图像上的,该网络将学习长颈鹿是长颈鹿,不管方向如何。这也迫使网络学习更有意义和更普遍的关于什么使某物成为长颈鹿的信息——例如,棕色斑点皮毛的存在。

像 COCO 对象检测挑战赛这样的公共数据集表明了泛化的必要性。因为这些数据集包含从许多来源聚合的图像,这些图像是在各种条件下从不同相机拍摄的,所以网络需要概括许多因素才能表现良好。网络需要应对的一些变量包括:光照、比例、相机内在因素(如焦距、主点偏移和轴倾斜)和相机外在因素(如位置、角度和旋转)。通过使用许多数据增强器,我们可以训练网络来概括所有这些变量,就像我们在前面的例子中能够概括长颈鹿的方向一样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

These examples from the COCO dataset were taken with different cameras, from different angles, scales and poses. It is necessary to learn invariance to these properties to perform well on COCO object detection.

为什么自动驾驶汽车数据不同

与 COCO 和其他公共数据集的数据不同,自动驾驶汽车收集的数据令人难以置信地一致。汽车通常相对于其他车辆和道路物体具有一致的姿态。此外,所有图像都来自相同的摄像机,安装在相同的位置和角度。这意味着同一个系统收集的所有数据都具有一致的相机属性,就像上面提到的 extrinsics 和 intrinsics 一样。我们可以使用将用于生产的相同传感器系统来收集训练数据,因此自动驾驶汽车中的神经网络不必担心概括这些属性。正因为如此,过度适应系统的特定相机属性实际上是有益的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

These examples from a single car in the Berkeley Deep Drive dataset were all taken from the same camera, at the same angle and pose. They also have consistent artifacts, such as the windshield reflection and the object in the bottom right of each frame.

自动驾驶汽车数据可能如此一致,以至于 flip 和 crop 等标准数据增强器对性能的影响大于帮助。直觉很简单:翻转训练图像没有意义,因为摄像头将始终处于同一角度,汽车将始终位于道路的右侧(假设美国驾驶法律)。汽车几乎永远不会在道路的左侧,摄像头也永远不会翻转角度,所以对翻转数据的训练迫使网络过度概括它永远不会看到的情况。类似地,裁剪具有移动和缩放原始图像的效果。由于汽车的摄像头总是在相同的位置,具有相同的视野,这种移动和缩放迫使泛化。过度泛化会损害性能,因为网络会浪费其预测能力来学习不相关的场景。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A front-view of the sensor array on DeepScale’s data collection car. All sensors are permanently mounted, so all data will have consistent extrinsics — position, angle and rotation. Because we use the same sensors at test-time, all data also has consistent intrinsics — focal length, principal point offset and axis skew. By harnessing the properties of a specific car’s sensors, we can boost vision performance when deploying the same sensor system.

更多改进

自动驾驶汽车数据唯一一致的认识解释了我们令人惊讶的增强结果。接下来,我想看看我们是否可以利用这种一致性来进一步提高性能。在引入任何新的增强器之前,我检查了我们的数据集,看看我们是否可以在数据级别进行任何改进。我们的训练集最初包括来自两个广角相机和一个带变焦镜头的相机的图像。变焦镜头产生类似于裁剪放大的缩放和移动效果。在测试时,我们只使用广角摄像机,所以对变焦图像的训练迫使网络过度概括。我发现从我们的训练集中移除缩放图像给了我们 mmAP 另一个巨大的提升。这证实了我们的假设,即训练集和测试集之间的一致性对于性能非常重要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

After removing the original image augmentors, I trained and tested on a new, more consistent dataset. This improved mmAP by an additional 10.5% relative to our original scheme.

在此之后,我考虑了可以在不改变相机属性的情况下改变我们的训练数据的增强器。Cutout 是我在这个项目开始时实现的增强器,看起来是个不错的选择。与翻转和裁剪不同,剪切不会以显著影响相机属性的方式改变输入(即翻转、移动或缩放)。相反,剪切模拟障碍物。障碍物在现实世界的驾驶数据中很常见,障碍物的不变性有助于网络检测部分被遮挡的对象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Obstructions are common in real-world driving data. In this image, two pedestrians block our view of the police car, while large bags block our view of the pedestrians.

色调抖动增强也可以在不影响相机属性的情况下帮助泛化。色调抖动只是将输入的色调随机移动一个量。这有助于网络对颜色进行归纳(即红色汽车和蓝色汽车应该被相同地检测到)。正如所料,抠图和色调抖动都提高了我们的新测试集的性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Adding cutout and hue jitter augmentation to the new dataset increased relative mmAP by 1% and 0.2%, respectively. This gives us a total 24.7% boost over our original data scheme (flip, crop and weight decay on the old dataset). Note that the y axis is scaled to better show the difference of small improvements.

警告

值得注意的是,这些增强技巧对包含不同相机类型、不同角度和比例的图像的数据集不起作用。为了演示这一点,我通过向原始测试集引入随机翻转和裁剪,创建了一个具有不同相机属性的测试集。正如预期的那样,我们新的专门的增强方案在更一般的数据集上比我们原来的标准增强器表现更差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

When applied to consistent self-driving car data, our specialized augmentation scheme (cutout and hue jitter) provides an 11.7% boost in mmAP over the standard augmentation scheme (flip, crop and weight decay); however, when applied to more varied data, our specialized scheme results in a drop of 24.3% vs the standard scheme.

确保你的测试数据覆盖了你的模型在现实世界中看到的例子的范围,这一点总是很重要的。使用专门的数据扩充使得这种健全性检查更加重要。你很容易欺骗自己,以为自己提高了模型的性能,而实际上你只是过度适应了一个过于简单的数据集(例如,只使用清晰的白天图像驱动数据)。

如果您的数据集真的健壮且一致,这些技巧可以成为提高性能的强大工具包。如图所示,通过使我们的网络能够学习我们车辆的摄像机属性,我们能够显著提高我们的对象检测性能。这可以应用于在部署中使用的同一传感器系统上收集训练数据的任何领域。

外卖食品

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Networks that perform well on satellite images (left) or cellular data (center) might require fundamentally different approaches than those built for common research datasets like ImageNet (right).

事后看来,这些增强变化似乎是显而易见的。现实是,我们被传统智慧蒙蔽了双眼。像 flip 和 crop 这样的增强器在研究问题上取得了如此广泛的成功,以至于我们从未想过质疑它们对我们具体问题的适用性。当我们从基本原则重新审视增强的概念时,很明显我们可以做得更好。机器学习领域有许多类似的“通用最佳实践”,例如如何设置学习速率,使用哪个优化器,以及如何初始化模型。对于 ML 从业者来说,不断地重新审视我们关于如何训练模型的假设是很重要的,尤其是在为特定的应用构建模型的时候。与 ImageNet 相比,使用卫星制图数据或蜂窝成像时,视觉问题有什么变化?我们认为,像这样的问题在学术界探索不足。通过用新的眼光看待它们,我们有可能极大地改善机器学习的工业应用。

马特·库珀(Matt Cooper)是 DeepScale 的深度学习软件工程师(也是前实习生)。更多来自 DeepScale 的信息,请查看我们的媒体页面

当交叉验证失败时

原文:https://towardsdatascience.com/when-cross-validation-fails-9bd5a57f07b5?source=collection_archive---------2-----------------------

验证可能是数据科学中最重要的五种技术之一。我使用交叉验证作为我的默认验证方案,但是这个星期我遇到了一个关于我的验证性能的问题。我花了一些时间来解决这个问题,所以我想和你分享一下。

机器学习过程

在 RapidMiner 的工作中,我遇到了一个挑战,那就是预测一个包含 9 个相关序列的时间序列。我通常的方法是窗口回归。我们可以将这种方法分为两部分:特征提取和学习。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Schema of windowed feature extraction. Standard features are extracted on four different window sizes. The resulting features are put into one row for the learning process.

在特征提取中,我对所有时间序列加窗并提取它们的特征。在这个具体的例子中,我的摘录相当简单,即最小,最大,标准偏差,平均值,斜率和线性回归轴。我在 4 个不同的窗口大小上做这个特征提取。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Stacking Implementation in RapidMiner.

第二步是建模。当我从一个广义的线性模型开始时,我很快转向了更复杂的东西。结果是一个堆叠模型。基础学习者是在每个不同窗口大小上学习的 4 个广义线性模型。此外,我还学习了所有窗口大小和原始数据点本身的神经网络。这些模型的预测和原始特征作为堆叠学习器被输入到梯度提升树中。

验证问题

在 5 重交叉验证中进行建模。最终测试误差为 2%。这一结果对客户来说非常有希望,他要求提供 6 月份的评分数据集,以便进行自己的性能计算和交叉检查。

我把六月作为交叉检查验证性能的坚持期。令我惊讶的是,我看到坚持的表现是 4%。虽然小的偏差并不少见,但验证和保持性能之间的巨大差异是不可容忍的——所以我开始了寻找根本原因的征服。

潜在问题 I——季节性和停滞

我的第一个想法是,我在选择坚持方面做得不好。这些数据包含了每年的季节性,仅仅把六月作为一个持续时间可能是天真的。可能我的模型在预测冬季月份方面很好,但在预测夏季月份方面很差。结果将是更差的拒绝性能,因为这只是在夏季计算的。

为了验证这一点,我查看了每月的交叉验证性能。有季节性,但约为 0.2%。所以这很难成为误差增加 2 倍的原因。

一个类似的想法是,我可能只是运气不好,六月很难预测。因为我的方法使用了一个窗口,所以采用一个随机保持集是很重要的。我决定再坚持一个月——2016 年 1 月。结果几乎一样。维持误差仍然是 2 倍测试误差。

潜在问题二——过度拟合

交叉验证通常是衡量精确性能的一个非常好的方法。虽然它不能防止您的模型过度拟合,但它仍然度量了真实的性能估计。如果你的模型过度拟合你,它将导致更差的性能指标。

一个已知的问题是,交叉验证只验证她体内的东西。超参数优化通常在验证之外完成。因此,您无法验证这种优化引入的过度拟合。如果您仔细观察,您还会发现,手动特征生成和模型选择也是模型的超参数,并且具有相同的问题-它们没有通过交叉验证进行检查。为了不被这个欺骗,你需要一个额外的坚持集来比较分析结束时的性能

我应用了一个标准技术来克服过度拟合。我降低了模型的复杂性。对我来说,这相当简单:我已经从我的系综中移除了神经网络。这导致了更差的交叉验证性能。但是抵抗性能仍然差了 2 倍。我仍然面临着同样的问题。

解决方案相关行

现在,对我来说,这是回到最基本的。思考假设,找出可能出错的地方。

交叉验证的一个假设是所有的行都是相互独立的。如果你做客户分析,这是相当微不足道的,但如果你做窗口时间序列分析,就不是了。

事实上,我的特征提取方法产生了几乎相同的行。例如,我计算每个窗口的最小值和最大值。很可能下一个窗口以及表中的下一行将具有相同的最小值和最大值。如果您将此输入到交叉验证中,很可能对于大多数训练行来说,在测试部分都有一个几乎相同的行。这让我意识到我是在衡量培训,而不是测试表现。

为了减少这种影响,我每月都计算自己的 batchid。我的 batchId 被定义为(自 1970 年以来的月数)%5,因此我的数据点在相应的月份中只有很小的重叠。

我的坚持性能现在比验证稍微好一点。任务完成。

当一个人连人工智能都不够好的时候

原文:https://towardsdatascience.com/when-even-a-human-is-not-good-enough-as-artificial-intelligence-c39c9fda4644?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Gertrūda Valasevičiūtė on Unsplash

2012 年,我为我的机器学习和应用研究收集并汇编了一个数据集。在研究过程中,我自己伪造了一个人工智能。在后期采访中,我听到了许多与会者最奇怪的陈述:“人工智能犯了很多错误。”。这篇帖子是关于人们对人工智能性能的偏见,以及我们对人工智能系统的期望有多现实。

人类智能 vs 人工智能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我喜欢用数字来衡量和解释事物。我做的最常见和快速的测量是分数和子分数。如果我需要比较两个东西,我会列出变量并给它们权重。有了那个列表,我给变量打分,乘以权重,求和。这给了我一个单一的数字。对于许多事情,我发现它很容易使用。挑选买哪台电视,接下来做哪项工作,或者测试一种方法是否比其他方法更好。

虽然有些东西很容易衡量,但智力不在其中。智力是一个非常抽象和复杂的东西来衡量。甚至智力的定义也很复杂。什么是智力,如何衡量智力,这些都不是我想要回答的问题。我对这篇文章的好奇心是,我们人类如何看待人工智能,以及我们对它的期望是什么。在我看来,当人们评判 AI 的能力时,我们是苛刻的。我们希望人工智能是完美的。我们没有显示出我们为人工智能提供的与人为错误成比例的灵活性。我们希望人工智能“像人一样”。也许是因为最近“像大脑一样工作”的广告(谷歌“像大脑一样工作”)。

不管原因是什么,这是一种常见的模式。我们期待人工智能能与人类智能相媲美。

电子奥兹中的人工智能巫师

我进行了一系列数据收集实验,这让我在 2012 年写下了这篇文章。我正在使用机器学习进行一项关于草图识别(即对手写符号和图纸进行分类)的研究。如果你对草图识别器感兴趣或者想有一个更具体的想法,这里有一个很棒的你可以试试:https://quickdraw.withgoogle.com/。我想实现的事情之一是将一个实时策略视频游戏的交互模型从鼠标/键盘转换成草图。有了草图界面,人们可以通过草图而不是鼠标点击和按键来玩游戏。想象一下,当你想建造一座建筑时,你可以在地图上你想建造的地方画一个简单的房子,而不是从菜单中选择它,然后用鼠标点击把它放到地图上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A Snapshot from Experiment Records Where of a User Plays the Strategy Game via Sketching

计划是用机器学习开发一个草图识别器。为了实现它,第一步是从多人那里收集许多手绘草图,这样我就可以用它们来训练一个模型。我不想让人们画出他们在屏幕上看到的东西,而是想让他们置身于真实的环境中。他们用像人工智能这样的草图玩游戏的环境已经准备好了。我认为有了这个设置,人们会比在一个放松的、没有时间限制的、没有压力的“临摹”环境中画得更“真实”。为了在那个环境中收集数据,我创建了一个“绿野仙踪”环境。

这个想法很简单。你准备一个有两个房间/空间的场景。在一个空间中,您放置与会者将使用的计算机。在第二个房间里,你放了另一台你要用的电脑。这个想法是把这两台电脑连接起来,这样你就可以看到与会者在做什么,并在你自己的电脑上采取相应的行动。对我来说,这是为了素描识别。因此,如果与会者画了一所房子,我可以从我的电脑上看到它,并发出命令来画房子。我们的目标是替换一个没有到位的人工智能系统,这样看起来就像有一个真实的人工智能,实际上是一个在不同房间的人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“Mechanical Turk” was a chess playing machine from late 18th century that seems autonomous, but in reality is operated by a human. In that sense, it was a Wizard of Oz setting. https://en.wikipedia.org/wiki/The_Turk .

当我的“奥兹”准备好时,我邀请人们加入我的实验(这不是一件容易的事,要求人们免费放弃他们的时间)。正如所解释的,有一个房间有电脑和一个绘图屏幕,参加者坐在那里,另一个房间,参加者看不到我在哪里模仿人工智能。我告诉与会者,他们将使用草图作为唯一的输入媒介来玩游戏,有一个人工智能将识别他们的草图并相应地执行操作。

实验结束后,我让他们填写了一份问卷,然后进行了非正式的交谈,因为有些人对这种玩游戏的方式感兴趣。这是我感到困惑的地方。许多人告诉我并在问卷上写下了同样的事情:

“识别我的草图的人工智能犯了错误”

你可以明白我为什么困惑了。我是识别草图的“人工智能”,他们告诉我人工智能表现不佳!这怎么可能?我在识别这些符号时犯了错误吗?可能是这样,但是符号很简单,所以我不认为我犯了很多错误。

这些轶事证据从未进入研究结果,但让我困惑了很长一段时间。如果我,作为一个人类,辜负了人们作为识别者的期望,我们怎么能开发出一个让用户满意的人工智能呢?如果我公开我是人工智能会有不同吗?他们是否预先判断出人工智能总是会出错?我们对人工智能有什么期望?

你对机器的期望是什么?

对于大多数识别器来说,90%的准确率是一个里程碑。感觉是个很棒的数字。“你的模型有 90%的准确率”。我希望自己在大多数情况下,我会宣布问题已经解决,并将其提交给利益相关者。我也希望他们对结果感到满意。想象一下你在一次考试中得了 90 分。

然而有一件事。实际上,它在现实生活中可能没有那么好。想象一下,你正在画一个圆,10 次中有 9 次,人工智能正确地识别出它,并采取相应的行动。但是 10 次中有 1 次,它将 1 识别为另一个东西(例如三角形)并且仍然采取行动。在那里,你试图停止人工智能采取的行动,并重做。如果你正在使用语音助手,你可能已经说过:“不!,停!,不要放那首歌!这跟我问的还差得远呢!中止!中止!”。是不是觉得语音识别性能不够好?微软在 2017 年的博客中公布了 5.1%的错误率(准确率 95.9%)(https://www . Microsoft . com/en-us/research/blog/Microsoft-researchers-achieve-new-conversatile-speech-recognition-milestone/)。他们还测量了人类的错误率,同样的指标为 5.1%。所以即使你认为你的语音助手的表现很差,但它实际上已经非常接近人类的表现了。

当你开始一个人工智能项目时,你需要正确地确定利益相关者的期望。如果你管理期望,双方都会更快乐。例如,如果你的利益相关者头脑中有一个完美的图像识别器,那么你一开始就已经失败了。即使你开发了一个很好的识别器,也不会像她想的那样完美。因此,管理预期,并考虑现实生活中的准确性。如果每隔一段时间就对语音助手喊一声“中止”是不可以接受的,也许你在购买或开始开发一个之前应该三思。

当 Fitbit 说“你的数据属于你!”…

原文:https://towardsdatascience.com/when-fitbit-says-your-data-belongs-to-you-d477270bc8d2?source=collection_archive---------9-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ok, prove it!

…他们真正的意思是

“我们很不情愿地允许您有限地访问一小部分数据”

在我继续说下去之前,我想说我是 Fitbit 的粉丝。在过去的几年里,我有几个追踪器,我每天都使用我的充电 2咏叹调量表。我甚至很快就放弃了 Apple Watch,因为我更喜欢 Fitbit 更长的电池寿命和睡眠跟踪功能,并意识到我正在寻找一个活动监视器,而不是一个功能齐全的智能手表。

但是,我也是一个数据呆子,因此我不喜欢 Fitbit 的围墙花园策略。我理解他们的动机,但我也认为——即使考虑到他们自己的利益——他们被误导了。我坚信,他们在这个领域的制胜策略将是进一步开放他们的数据 API。

让我解释一下:

最初,Fitbit 只允许向他们的高级用户输出数据。这一限制于 2015 年取消:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从那以后,他们允许用户从他们的网站免费下载活动数据。

然而,至少可以说,他们所提供的非常有限。身体、食物、活动和睡眠测量的每日总量。没有当天数据,没有跟踪活动的数据,没有心率数据。没有付费选项来获得更精细的访问。

当我在 Twitter 上抱怨这件事时,他们的回应是:

对此我称之为扯淡!他们自己的应用程序似乎完全有能力为成千上万的日常用户快速可靠地加载这些数据。如果这真的与服务器负载有关,有多种方法可以处理,包括限制 API 的速率,只允许每个用户每天大量下载一次,等等。

现实是,他们不希望数据“在那里”。他们希望将用户限制在只能通过自己的工具查看和分析数据的体验中。

当然,聪明的书呆子已经找到了多种方法来解决这个问题,例如:

[## simonbromberg/googlefitbit

用于 fitbit 数据下载的 Google Sheets 脚本

github.com](https://github.com/simonbromberg/googlefitbit) [## corynes en/fitbitScraper

用于抓取 fitbit 数据的 fitbitScraper - R 包

github.com](https://github.com/corynissen/fitbitScraper)

…这就是 Fitbit 的问题所在。书呆子是早期采用者。他们可能会转向提供更好的数据访问的制造商,随着新的创新工具和更活跃的生态系统围绕这种开放战略出现,其他用户群也会很快效仿。

Fitbit 的战略优势并不在于硬件追踪器的制造——这些现在已经相当商品化了。事实上,他们一直在收购陷入困境的竞争对手,以维持他们在这个低利润、低准入门槛市场的地位。

Fitbit 的战略优势在于他们占主导地位的品牌知名度和市场份额。保持这一地位的方法是成为活动数据的“数据中心”。但是,只有当用户真正感觉到数据确实是他们的,并且通过围绕数据托管提供非凡的体验和增值,这才是可能的。

像软件领域的大多数传统供应商一样,我相信 Fitbit 很想摆脱“永久”业务(在他们的情况下是销售硬件),转向弹性更大、利润更高的订阅业务。成功的关键是数据,而不是硬件。但就像许多 SaaS 消费公司在他们之前发现的那样,他们必须意识到,信任的关键是用户对自己数据的完全、无障碍的访问。数据真正“属于你”的感觉。并不是说大多数人会访问或下载这些数据,但他们想知道他们可以——如果真到了那一步。在一个运行良好的生态系统中,他们会希望与其他服务共享数据,反过来让这些服务与 Fitbit 的数据存储共享数据,并将其存储在 Fitbit 的数据存储中。

Fitbit 需要将自己从一家销售“永久”硬件的硬件公司转变为一家向消费者出售“活动数据中心”(可能会存储来自其他“量化自我”追踪器的数据)订阅服务的数据公司,并将数据(他们已经保留了这种权利)汇总给医疗服务提供商、设备制造商和研究公司。

如果他们能够实现这种转变,Fitbit 的未来是光明的。否则,在一个越来越便宜、竞争越来越激烈的硬件市场保持利润将被证明是非常困难的。

初级 Python 黑客

原文:https://towardsdatascience.com/when-learning-a-new-programming-language-theres-always-a-sense-that-there-will-be-a-few-commands-c81a023e033e?source=collection_archive---------8-----------------------

当学习一门新的编程语言时,总有一种感觉,我们会不断重用一些命令、技巧和变通办法;通常称为 80/20 法则——20%的活动负责 80%的工作。Python 自然适合这种范式,Python 化意味着最小化,但具有更大的吞吐量。让我们看看其中的一些启发。

检查第三方库

您正在使用 Anaconda,或者更大胆一些,您已经通过 Python 在本地设置了一些虚拟环境。一个是专门用于自然语言处理的,另一个是用于机器学习的,甚至还有一个更深奥的——深度学习。在这三种环境中的一种,你不确定你是否已经安装了自然语言处理的 nltkspacy 。要进行检查,您可以运行 Python repl,并键入

import spacy

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好的,所以你知道,spacy 是不可用的,你必须通过 pip 或 conda 安装它。不需要转到 repl,更快的方法是直接在终端中输入这个命令,假设 python 包含在终端的路径中:

python -c “import spacy”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

瞧!你得到同样的输出。如果包裹确实在那里,就不会打印投诉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在代码外部保存用户凭据

总是需要连接到远程数据库或访问 REST API,其中需要用户名和密码。如果你是通过编程来实现的,你可以为它们创建单独的变量,将它们编码成字符串。

db_user_name = ‘me@example.com’db_password = ‘an_awS0mE1Pass.Word#’

这很糟糕,原因有几个。主要是如果你使用一些版本控制软件,比如 GIT,这意味着每个参与项目的人都可以看到这些凭证。解决这个问题的一个快速而肮脏的实现是将这些变量填充为空字符串,然后让用户键入他们的凭证。这可能会变得令人厌倦和笨拙。我提倡使用 python-dotenv ,它本质上是一个帮助通过访问这些凭证的包。env 文件(键值对)。如果你使用 GIT,简单地添加这个。env 文件到*。gitignore* 确保在保存你的工作时不会涉及到它。假设上述用户凭证保存在一个. env 文件中,在代码中调用它们的一个实现是:

import osfrom dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())db_user = os.environ.get(‘db_user_name’)db_pw = os.environ.get(‘db_password’)

文档帮助

现在,你可以告诉我喜欢与 Python REPL 一起工作。更是如此,伊普森。后者是因为我可以使用 tab 键来自动完成命令。总是需要查找文档。上网用谷歌搜索是很常见的。有些人会把他们经常去的网站加入书签。甚至存在与语言或库无关的文档浏览器,提供了在一个地方离线查找文档的额外优势。具体来说,破折号热心。虽然这在某些情况下很理想,但有时在 REPL 提取文档很方便;只是召唤帮助命令上的一个功能:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你会得到这个

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

命令行参数

诚然,这可能相当复杂,即使用例足够简单。我将提倡使用来自标准 Python 库的 argparse 。下面是一个简单的程序,它将通过命令行输入的两个数字相乘:

import argparseparser = argparse.ArgumentParser()
parser.add_argument(“--num_one”, default=1, help=”Enter Number 1", type=int)
parser.add_argument("--num_two”, default=1, help=”Enter Number 2", type=int)args = vars(parser.parse_args())product = args[‘num_one’] * args[‘num_two’]print(“The product is: {}”.format(product))

这就是你将如何运行它:-

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关键字参数(**kwargs)

当调用一个函数时,传递参数是再熟悉不过的了。例如,在前面的例子中, add_argument 函数被传递了变量名的参数,在没有提供变量名的情况下默认值应该是什么,最后是要显示的帮助消息。关键字实参允许你传递这些参数,但是当写出你的实际函数时,没有必要在函数“header”中显式地拼写它们。演示:

def print_name(**kwargs):  print(‘First name: ‘, kwargs.pop(‘first_name’))
 print(‘Last name: ‘, kwargs.pop(‘last_name’))print_name(first_name=”Rush”, last_name=”Kirubi”)

我很想听听你的妙计。当一个人刚刚入门或者开始欣赏一门特定语言(在这里是 Python)的长处时,它们会非常有用。请随意评论或提出你自己的建议。

当机器学习遇到大数据

原文:https://towardsdatascience.com/when-machine-learning-meets-big-data-4923091ba140?source=collection_archive---------6-----------------------

首先让我们看看为什么现在周围的每个人都对机器学习感兴趣,我相信 Gartner 的 炒作新兴技术的周期情节 答案也是一样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它清楚地表明,机器学习现在正处于膨胀的期望的顶峰,我们都可以闻到这一点。无论我们在哪个领域,我们都看到个人、行业和学术界在谈论自动化,使用人工智能、机器学习和数据挖掘让机器变得更加智能和强大。通过查看机器学习的当前应用,我们可以自信地说它比气体更有实质*(我记得人们说气体闻起来很香的日子)*

但问题是——机器学习突然变成炒作了吗?

为了理解这一点,我们需要回顾一下机器学习的基础知识,下面是由 ExpertSystems 提供的机器学习的定义。

机器学习是人工智能(AI)的一种应用,它为系统提供了自动学习和根据经验改进的能力,而无需显式编程。机器学习专注于开发能够访问数据并利用数据为自己学习的计算机程序。

想象程序可以自己学习似乎很令人兴奋,但它们需要数据,大量可以用于学习的数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

艰难的机器学习已经有 50 多年的历史,并且在大约 40 年前就已经开始使用,但是直到最近 20 年,世界才开始钦佩它。谷歌、IBM、微软和百度等大巨头已经开始将主要精力转移到机器学习和深度学习应用上。

那么,在过去的二十年里,是什么导致了这种变化呢?

在过去的二十年里,世界上出现了许多令人敬畏的东西,但推动机器学习和其他相关领域增长(阅读炒作)的只有数据。由于无数的新技术、设备(台式机、笔记本电脑、移动设备等)、社交网站和技术在世界范围内的渗透,人类产生的数据量以千兆字节计,这为数据库、数据挖掘、信息检索、机器学习、深度学习、人工智能等创造了机会。

从一开始到 2003 年,我们产生的数据量是 50 亿千兆字节。如果你把数据以磁盘的形式堆积起来,它可能会占满整个足球场。2011 年,每两天就创造了相同的数量,2013 年,每十分钟就创造了相同的数量。这一比率仍在大幅增长。尽管所有这些产生的信息都是有意义的,并且在处理时可能是有用的,但是它们被忽视了。

世界上 90 %的数据是最近几年才产生的。数据是新的石油,推动着信息革命。

从一开始,这种数据增长就为新的数据存储系统提供了机会。直到 2000 年,我们关心的主要是关系数据,主要是结构化的,我们有许多方法来存储它。看看下面的数据库时间表,2000 年以后,数据是非结构化、半结构化的、巨大的,人们明白保留它们在未来会有所帮助,因此大数据出现了,许多技术也在上面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太酷了,像 Hadoop 这样的大数据技术让工作变得简单,并为人工智能和机器学习模型创造了机会。

简而言之,让我们看看机器学习是如何应用于一般数据的。在下面提到的步骤中,捕获原始数据和清理是最乏味的工作。如果没有像 map-reduce 这样的分布式技术,清理大量数据是不可能的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,我们对机器学习如何需要大数据有了合理的想法,但如何将这两者结合起来的设计和架构仍然变得具有挑战性。

Rubens Zimbres 和著名的数据科学家定义了如何在大数据上应用机器学习的一般架构。下面的情节清晰地展示了如何让这两个人结婚。这里最具挑战性的部分是用适当的设计维护数据仓库,以便机器学习模型可以无缝地消费相同的数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我的下一篇文章中,我们将探索每一个步骤。到目前为止,我们对如何结合大数据&机器学习有了看法。

感谢您的阅读,请在评论中分享您的想法、反馈和想法。你也可以通过 twitter 上的@ simplykk87 和 linkedin 上的联系我。

参考文献

[## 数据科学和机器学习简讯# 55

我分享引起我注意的文章,并在每周五发布“数据科学和机器学习时事通讯”。如果你…

www.necatidemir.com.tr](http://www.necatidemir.com.tr/2016/09/data-science-machine-learning-newsletter-55/)

https://blogs . NVIDIA . com/blog/2016/07/29/whats-difference-人工智能-机器学习-深度学习-ai/

https://www . tutorialspoint . com/Hadoop/Hadoop _ big _ data _ overview . htm

当机器学习遇到复杂性:为什么贝叶斯深度学习是不可避免的

原文:https://towardsdatascience.com/when-machine-learning-meets-complexity-why-bayesian-deep-learning-is-unavoidable-55c97aa2a9cc?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Managing people is complex. Photo by Anna Dziubinska on Unsplash.

到现在为止,你们所有人可能已经关注深度学习研究很长时间了。1998 年,LeCun 等人提出了非常简单的手写数字 MNIST 数据集,并用他们的 LeNet-5 证明了我们可以在其上达到很高的验证精度。随后提出的数据集变得更加复杂(例如 ImageNet 或 Atari games),因此在其上表现良好的模型也变得更加复杂。同时,这些模型可以执行的任务也变得更加复杂,例如,Goodfellow 等人的 GANs (2014)或 Kingma & Welling 的 VAEs (2014)。我个人的一个亮点是 Eslami 等人的神经场景表示和渲染 (2018),它清楚地表明了神经网络迄今为止可以执行相当复杂的任务。我看到神经网络能够执行的任务的复杂性明显上升,我不认为这种趋势会很快停止或放缓。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tasks which want to be solved by deep learning in the future

在这篇文章中,我将给出清晰的论据,说明为什么贝叶斯方法如此广泛适用,并且当我们想要解决更复杂的任务时必须应用。

值得注意的是,我用社会科学采用的术语来谈论复杂性,因为我个人有兴趣观察社会系统中非常高层次的模式,例如,大学学生或来自低收入国家的移民。当你刚刚打开报纸时,这些问题是我们当代最紧迫的问题,所以我也想鼓励你们所有人尝试用机器学习来解决这些问题,理想的是贝叶斯深度学习。

什么是复杂性?

在深度学习的背景下,复杂性最好理解为复杂系统。系统是以某种方式相互作用的代理人的集合体。这些代理一起形成一个整体。复杂系统的一个基本特征是这些代理可能会非线性地相互作用。复杂性研究人员通常认同两种不同层次的复杂性:简单或受限的复杂性,以及复杂或一般的复杂性( Byrne,2005;Morin,2006【分别为 )。根据定义,一般复杂性不能以任何方式进行数学建模,而受限复杂性可以。

Byrne ( 2005 )认为,大多数社会系统都属于一般复杂性的范畴,这已经是我们数学方法的一个合理的限制,但是我们现在看到,任何我们认为仅仅拥有有限复杂性的系统。我们这样做,是因为我们未来的深度学习任务可能是调查社会中的模式,鉴于我们迄今为止在基于深度学习的解决方案方面的进展速度,这些解决方案用于越来越复杂的任务。因为社会的代理人,也就是我们所有人,有时确实会不可预测地相互作用,所以我们可以肯定地说,非线性特性是成立的。

复杂系统建模

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

记住,对任何或多或少复杂事物的数学描述仅仅是模型,而不是基本真理(科恩&斯图尔特,1995 ),我们可以直接推断,在任何复杂的情况下,贝叶斯推理都比频率主义推理更适合使用。在贝叶斯推理中,我们将模型参数 θ 视为随机变量,也就是说,我们想要学习它们,而在频率主义推理中,我们将模型参数 θ 视为固定的,但未知的事实描述。在 frequentist 推断中,我们进行的实验被视为来自无限大的一组完全相同的实验的样本(例如,掷出一个公平的骰子,即决定每次掷骰结果的真实模型参数 θ 是骰子每边的 1/6)。在进行我们的一系列实验之前,我们先定义我们想要多久做一次。在进行了这些数量的实验后,我们有了每个模型参数的置信区间,它告诉我们置信区间包含真实参数的概率。

因此,在频率主义者的推理中,我们认为模型参数 θ 是不可改变的,因此这一学派认为理想模型,即无限频繁地进行我们的实验,代表了任何或多或少复杂事物的真实状态。

本质上,这意味着频率主义推理的支持者声称,我们能够用无限多的实验来描述真理,并且这些描述真理的模型参数θ永远不会改变。

这可能适用于任何非常简单的实验,但它从根本上违背了 Stewart(1995 年)关于自然系统的想法,因此比类似于滚动骰子的简单实验更复杂。他们认为,不管过去发生了什么,系统都会随着时间的推移而改变,并且会发展出至今尚未出现的新现象。从社会科学的角度来看,这一论点也非常符合复杂性的定义(参见 涌现 )。

这对贝叶斯推断意味着什么?

在贝叶斯推理中,我们确实以概率分布的形式学习模型参数 θ 。这样做,我们可以保持它们的灵活性,并且可以在系统的新观测到来时更新它们的形状。当我们的目标是对复杂系统建模时,这听起来不是更合理吗?

但是,这并不是贝叶斯推理比频率主义推理更适合用于复杂任务的唯一原因。

以前,我们已经定义了一个复杂系统,其组件,即其代理之间可能存在非线性交互。迄今为止,还没有为非线性系统开发出确定性的数学形式,也永远不会开发出来,因为根据定义,复杂系统是非确定性的。换句话说,如果我们在一个复杂的系统中重复一个实验,第二个实验的结果不会和第一个一样。

这在贝叶斯和频率主义推理中仍然是完全可行的,但是当我们不能对任何事情都有确定性的解决方案时,有什么明显的途径可以选择呢?

完全正确,我们近似。

这正是我们在贝叶斯方法中所做的:棘手的后验概率分布 p(θ|D) 是近似的,或者通过变分分布 q(θ|D) 我们喜欢在神经网络中这样做,或者通过蒙特卡罗方法我们经常在概率图形模型中这样做。相反,在频率主义推理中,我们采取某种无知的方法,只是更频繁地重复实验,希望最终得到一个可接受的置信区间,其中包括我们的真实参数。这个“接受水平”被称为置信水平,表示为 α ,你可能以前见过。一般约定, α 至少要 95%。

这一切对深度学习研究的未来意味着什么?

嗯,还要考虑到任何深度学习模型本身实际上都是一个复杂的系统。我们有神经元,你可以把它看作代理,以及它们之间的非线性激活函数,你可以把它看作代理的非线性关系。例如,在 CNN 中,过滤器从这种设置中发展出来,你可以将它视为一种突发现象。

随着希望通过深度学习解决的任务越来越复杂,同时保持对复杂性的理解,因为它目前在社会科学中存在,所以可能没有办法绕过贝叶斯深度学习的应用来解决这些任务。神经网络是能够发现随机变量之间非线性关系的少数方法之一,这是复杂系统建模的一个强烈需求。此外,贝叶斯推理是自然归纳的,通常接近真理,而不是旨在准确地找到它,这是频率主义者的推理。

请记住,这只是利用贝叶斯深度学习的另一个论点,除了具有测量不确定性的优势和奥卡姆剃刀的自然体现。

我希望你喜欢阅读这篇不太专业的文章。除了我已经链接的文章,下面是两本我强烈推荐的社会科学书籍。

延伸阅读:
伯恩 d .&卡拉汉 G. (2013)。复杂性理论和社会科学:最新发展水平。劳特利奇。约翰逊(2002 年)。涌现:蚂蚁、大脑、城市和软件的互联生活。西蒙和舒斯特。

快乐阅读&保持好奇!

当机器学习试图预测机器学习的性能时…

原文:https://towardsdatascience.com/when-machine-learning-tries-to-predict-the-performance-of-machine-learning-6cc6a11bb9bf?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我试图通过另一种机器学习算法来‘预测’深度学习网络的质量。结果并不令人鼓舞。

看过我之前关于媒体的文章的人都知道,我不是机器学习或数据科学专家。我来自半导体技术背景,最近才开始摆弄机器学习技术。

作为一个新手,只要我能克制自己,我就不敢冒险进入深度学习。平心而论,当我参加Ng 教授的 Coursera 课程时,我确实使用 MATLAB 编写了简单的 1 或 2 层感知机,甚至使用 NumPy stack 尝试了他更新的 Deeplearning.ai 课程的前几个例子。但是它们只涉及很少的“深层内容”和极少量的超参数。

正是这个深度学习领域的超参数问题一直让我着迷。我认为这很自然,因为我来自一个技术设计背景,我也每天在我的半导体工艺或器件设计工作中使用大量高水平参数,它们经常以令人难以置信的复杂和(有时)不可预测的方式结合,导致我的设计成功或失败。

我试着告诉自己,这只是一大锅简单的配料——量子力学、基尔霍夫定律、麦克斯韦方程——我应该能够非常自信地预测结果。而且,我经常能做到。但是有些情况下,设计的质量并不完全符合预期,根本原因很难在整个开发过程中使用的超级参数的迷宫中找到。

因此,当我最终开始摆弄 TensorFlow 时,我直接开车去进行自学练习,在那里我摆弄各种超参数以及它们对预测器最终质量的影响。现在,这句话“各种参数及其影响”听起来像什么?一个等待机器学习分析的问题,对吗?

没错。我试图通过深度学习(和简单的逻辑回归)来“学习”是什么推动了深度学习模型的性能!

我不会涉及太多的技术和实现细节。有兴趣的读者可以简单的参考/下载我的 GitHub repo 中的代码。相反,我将用简单的术语描述高层次的步骤,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 首先,我选择了一个简单而众所周知的数据集——著名的鸢尾物种数据 ,这也是在tensor flow Estimator API教程页面中使用的。这是一个具有实值特征的多项式分类问题。标准又干净。
  • 然后我决定了一个特定的优化器:ProximalAdagradOptimizer。我相信您可以(并鼓励您尝试)选择任何其他优化方法,而不会失去通用性。
  • 此后,我选择了 4 个超参数,在我看来,它们足够通用,可以出现在人们可以解决的深度学习问题的任何高级甚至阵列级实现中:

a) 学习率,b) 辍学率/概率,c) L1 (LASSO)正则化强度,d) 【网络的训练步数

  • 选择了超参数后,我以对数的方式将它们分布在一个很大的范围内,而不是线性的,只是为了用少量的点覆盖一个很大的范围。
  • 然后,我构建了一个全因子循环(所有级别的超参数都与所有其他级别交叉),并通过跨越该多级循环开始训练一个 3 层(5,10,5)全连接前馈神经网络。我保持网络足够小,以便在我简单的笔记本电脑上实现不错的训练速度:)
  • 在循环的一次执行中,我提取并保存了基于拒绝集的预测的“准确性”。
  • 在整个“循环”执行结束时,我将参数和准确度分数(DNN 分类器预测质量的指标)转换成一个 Panda DataFram e,供以后分析。
  • 并且,我对 4 种类型的激活函数重复这个过程:a) sigmoid( x )、b)整流线性单元(RELU)、c) tanh( x )和 d) 指数线性单元(ELU)
  • 现在,我有 4 个激活函数的 4 个数据帧——每个数据帧都包含关于神经网络的超参数的数据作为特征,精度作为输出。Prime 供另一个机器学习算法分析,或者自己分析!
  • 为了将准确度分数转换成分类数据,我只是将它们任意分为三类:低、中。这简单地表示深度学习网络的’质量’。例如,小于 0.5 的准确度表示分数,而> 0.8 的分数得到分类。
  • 此后,我构建了一个简单的逻辑回归分类器(来自 scikit-learn ),并试图从超参数中预测质量等级。
  • 并且,我使用另一个 DNN 分类器模型尝试了相同类型的预测。我在这一步使用了一个更大的神经网络(20-20-20 个隐藏的神经元),因为我只需要运行一次,并且还需要训练更多的步数(最少 5000)。
  • 并重复了所有 4 个激活功能的全部内容。

结果充其量是喜忧参半。我得到了高达 0.8 的准确性和 F1 分数,但当我尝试各种随机分割和交叉验证时,平均表现为 0.4-0.6,有时低至 0.35。

数据集很简单,DNN 分类器的准确度分数总体上令人满意,但是机器学习模型不能很好地理解神经网络性能对各种超参数的依赖性。唯一明显的特征是激活函数的选择——tanh 和 ELU 给出了明显比 sigmoid 和 RELU 更好的结果。但这种认识可以通过简单地查看准确度得分表来实现,并不保证机器学习模型。除此之外,没有从超参数空间明确的学习来实现 DNN 模型部分的更好的准确度分数。甚至更高的训练步骤数也没有显示出与更高的准确度分数有任何明确的相关性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样值得注意的是,当 DNN 分类器从超参数数据集学习时,它并不比简单的逻辑回归模型(对数据进行 最小最大标量变换 )表现得更好。因此,这可能不是模型的限制,而是数据集本身充满了不确定性和无法解释的变化。下图显示了与 ELU 激活函数相对应的数据集的关联热图(从原始虹膜数据的角度来看,这是性能较好的函数之一)

超参数优化,甚至是选择一组好的超参数,仍然感觉像是深度学习领域的“黑魔法”。

即使对于像鸢尾属物种分类这样相对简单的问题,机器学习方法也不能很好地理解全连接神经网络的超参数对最终精度的影响。

免责声明 :请随意从 GitHub 中获取代码,并自己进行实验,如果您发现了有趣的东西,请告诉我:)我的联系方式是:tirthajyoti[AT]Gmail[DOT]com。

当机器评判人类时

原文:https://towardsdatascience.com/when-machines-judge-humans-1f60908667c0?source=collection_archive---------9-----------------------

对算法决策过程的九个正确反应

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

算法决策过程(ADM)现在在生活的许多领域评估人们。多年来,人们一直使用 ADM 流程来对人进行分类,而没有真正讨论这些流程是否公平,或者如何解释、验证或纠正这些流程。一个潜在的原因是,这些系统与科幻小说中出现的人工智能(AI)没有什么关系。人们通常会将人工智能与 HAL 9000 或 Wintermute 等虚构角色表现出的品质联系起来:意向性和意识。然而,到目前为止,这种强大的人工智能只出现在文学作品和电影中,与本案例研究集中介绍的系统没有任何关系。然而,后者已经在决定法律事务、批准贷款、大学录取学生、决定警察何时何地值勤、计算保险费率以及帮助致电服务中心的客户等方面发挥了重要作用。所有这些项目都是专门为解决特定问题而设计的,它们影响着许多人的生活。这不是根据科幻小说的未来,这是关于今天的日常现实。

为了利用行政管理在参与领域提供的机会,在规划、设计和实施行政管理过程时,必须设定一个总体目标:确保参与实际增加。如果不是这样,这些工具的使用事实上可能导致更大的社会不平等。

总之,这里给出的例子中的机会和风险指出了一些与 ADM 流程相关的一般因素,这些因素会严重影响参与。这些因素涉及整个社会信息过程的不同方面,可以在不同的层面上找到。这里有三个例子:

  • 在微观和宏观层面塑造 ADM 流程:在开发流程开始时选择数据和设定标准本身就能反映出有时会触及基本社会问题的规范原则。
  • 宏观层面的供应商和运营商结构:拥有一系列 ADM 流程和运营商可以提高参与度(例如,通过对过去未参与该系统的人员进行信用评估),可以更容易地避免 ADM 流程,并扩大认证的可能性。相反,垄断结构增加了个人“脱离系统”并被抛在后面的风险。
  • 在微观、中观和宏观层面使用 ADM 预测:技术、社会和个人之间的相互作用对算法的使用方式和时间以及它们的影响力有着重大影响。因此,必须提出的关键问题是:人们(ADM 开发者和用户,以及普通大众)如何应对自动预测?流程是否包括质疑结果的可能性?

这里需要的是在不同层面上对行政管理过程的潜在缺点进行额外的系统分析——从目标的定义和衡量手头问题的努力,到数据收集、算法的选择和将过程嵌入相关的社会背景。需要标准来确定 ADM 流程在所有级别和所有步骤中的好处。这里讨论的对策可以为解决这些问题提供初步动力:

1.确保可证伪性

ADM 流程可以不对称地从错误中学习。“不对称”是指系统,由于整个过程的设计,在回顾时只能识别某些类型的自己的预测,这些预测被证明是不正确的。当算法不对称地学习时,危险总是存在,自我强化的反馈循环将会发生。

例如:法律系统中使用的累犯预测

2.确保正确使用

制度逻辑可能导致 ADM 过程被用于与开发者最初设想的完全不同的目的。必须避免这种不适当的使用。

举例:预测个人犯罪行为

3.为社会影响确定适当的逻辑模型

单个流程步骤中算法驱动的效率提升可能会掩盖这样一个问题,即用来解决一个社会问题的手段是否普遍合适。

举例:预测铅中毒

4.让概念变得可测量

贫困和社会不平等等社会现象或问题往往难以操作化。因此,通过公开讨论制定的可靠基准很有帮助。

示例:预测贫困模式

5.确保全面评估

技术上可行的规范力量很容易盖过从社会角度来看什么有意义的讨论。例如,基于机器的决策的可扩展性会很快导致这样的情况,即使用 ADM 过程的适当性和对社会的影响既没有被讨论也没有被验证。

示例:自动人脸识别系统

6.确保 ADM 流程的多样性

ADM 流程背后的决策逻辑一旦开发出来,就可以在大量情况下应用,而不会大幅增加成本。一个结果是有限数量的 ADM 进程可以在某些应用领域占主导地位。范围越广,个人就越难逃脱这一过程或其后果。

示例:通过在线个性测试预选候选人

7.促进可验证性

通常,没有努力去确定一个 ADM 过程是否足够公平。如果算法的逻辑和本质是保密的,那么这样做甚至是不可能的。如果没有独立第三方的验证,就不可能对特定 ADM 流程的机会和风险进行有根据的辩论。

举例:法国大学招生

8.考虑社会的相互依赖性

即使使用非常有限,ADM 流程及其环境之间的相互依赖也是非常复杂的。只有对整个社会信息化过程的分析才能揭示机会和风险之间的关系。

例如:犯罪行为的特定地点预测

9.防止误用

容易获得的预测(如得分结果)可能被用于不适当的目的。必须不惜一切代价防止这种滥用。

示例:美国的信用评分

本文摘自 Konrad Lischka 和 Anita Klingel 撰写的工作文件"Wenn Maschinen Menschen bewerten-international e falbeispiele für Prozesse algorithm ischer Entscheidungsfindung",由贝塔斯曼基金会以 CC BY-SA 3.0 DE 出版。

本出版物记录了我们对该主题调查的初步结果。我们将它作为一份工作文件发表,以一种其他人可以借鉴的方式为这个快速发展的领域做出贡献。

什么时候不用深度学习?

原文:https://towardsdatascience.com/when-not-to-use-dl-ml-ai-24103f147dd0?source=collection_archive---------5-----------------------

或者一种更自由的软件设计方法

这个趋势问题引发了许多争论。与其站在(DL 和非 DL)一边,我更喜欢软件设计的统一(和自由)观点。

让我们首先区分通过深度学习(或 ML)和传统软件工程编写的程序。

  • DL/ML/AI 都是关于编写程序(就像我们从计算时代开始就一直在编写的那样)来解决问题和执行任务。编写传统软件=用选定的编程语言的语法编写一系列规则(作为命令性动作或指示性约束),大部分是手工编写的。
  • 编写(有监督的)ML/DL 程序是示例编程,即需要以正确的格式对程序的输入输出数据进行指定和编码,并描述程序的模板(如神经网络的形状)。模板中的未知参数根据手动指定的目标自动学习(计算模型输出多少),从而最终确定程序。我之前的帖子对此进行了更详细的讨论。
  • 传统的离散程序通过转换数据结构来工作。输入数据结构→转换序列→输出数据结构实例。你把大部分精力花在编写转换序列的规则上,单元测试通过对输入/输出数据进行采样来确保正确性。
  • ML/DL 程序转换多维空间中的连续值向量或张量。变换的空间限于指令集,例如神经网络中的不同算子/层。最重要的是,为了能够学习,这些运算符应该是可微的。这些转换不是手动指定的——它们是通过使用非常普通的(和蛮力!)随机梯度下降算法。
  • 也许,分界线(在 30k 英尺处)是使用离散数学还是连续数学概念、表示和程序合成工具。
  • 回想起来,传统的基于规则的编程在许多以人为中心的程序(AI!)我们想创造,例如,建模感知(看,听,语言)。我们(甚至是集体)无法找出正确的规则。这在某种意义上,激发了热情(+炒作+恐惧!)围绕 AI 深度学习后的在那些问题上成功了。通过让神经网络找出转换,我们现在能够为许多感知任务(加上其他几个任务)编写好程序
  • 旁白:注意推理抽象(人工智能的本质)也许做得还行(逻辑编程!)在基于规则的世界中,假设你正确地了符号和关系(主要警告!).

鉴于关于基于强大的深度学习的程序合成的引人注目的讨论,我们现在想知道是否所有可能的程序都能被深度学习者学会。例如,我们能用 DL 同样容易地编写典型的基于图形/树的程序吗?让我们在这里深入研究一下。

  • DL 程序接受输入的张量嵌入,对其进行几何变换(线性和非线性),并产生概率分布形式的输出(主要是)。如果有合适的架构和外部存储器,这种设置可能是图灵完全的。也许我们可以大致了解一切。
  • 然而,就编程成本而言,这条路线可行吗?对于我们想写的每一个程序(或者说,我们想解决的问题),有没有一个低成本架构(容易找到,需要训练的参数)?在某种程度上,我们需要多长时间才能为一个问题找到正确的可微算子集以及组合它们的最佳方式?
  • 我们能确保为每个问题建立低成本的输入/输出数据吗?这是注解头痛的一部分。此外,正确的编码。
  • 最后,要让数学目标约束真正反映你的直觉(或离散)目标,你会努力多长时间?

上述问题凸显了为什么基于范例的学习并不总是美好的:也许,这种方法也不是万能的。

我认为,更明智的方法是围绕我们所做的编程拓宽我们的思维,以解决任何问题。我们将编写两种程序——基于规则的和基于例子的。将这些模块看作解决方案代码的不同模块——您将挑选哪些模块为其编写规则,哪些模块提供数据以支持规则学习。

所以,我们正在谈论一个统一的编程风格的范围。你可能以基于规则的方式开始编写一个模块,因为规则集变得庞大而放弃,转而准备数据来指导学习模式。相反,您可能从一个基于深度网络的模块实现开始,对它的性能/数据准备感到厌倦,或者可能对它有足够的了解,然后切换到一个更可解释的基于规则/可学习的框架。完整的解决方案包括将问题智能分解成不同的编程风格*。*

具体示例:我尝试过的这种方法的一个实例是从图像中提取表格结构,例如申请表、收据等。该解决方案通常依次由两个模块组成。低级的东西(线条、字符边缘、文本边界框检测)在学习模式下做得更好。更高级的布局发现可以通过边界框上的一组解析规则来更直接地解决。当然,您可以使用端到端的学习公式,它以适当编码的格式输出表格布局。然而,我认为数据设置和训练比编写第二部分的规则更麻烦。

还有一部分争论(这篇文章没有涉及)是关于只有在大量数据或感知任务中应用 DL,还是在低数据或结构化设置中应用非神经 ML。我想这个问题还没有定论,但是越来越多的证据表明,这种明显的分歧也是虚假的。

我发现我的想法与 Francois Chollet 的这篇主题更加广泛的文章有所重叠。我认为他设想了一个更具凝聚力的神经程序合成模型,结合了基于规则和基于示例的学习模块,以及它们如何被重用。我主要谈的是界限明确的组合。

很想听听其他从业者对这个话题的看法!

我应该什么时候在芝加哥乘公共汽车?

原文:https://towardsdatascience.com/when-should-i-ride-the-bus-in-chicago-21a4bc26e033?source=collection_archive---------7-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

source: unsplash.com

随着芝加哥整个春天的天气变得越来越好,我注意到我每天乘坐公交车上下班的拥挤程度有所波动。越来越多的人是令人沮丧的,随着温度的升高,我越来越倾向于骑自行车上下班。一年中这个时候芝加哥的天气变化无常,当外面天气不太理想时,我不愿意骑自行车,所以我决定收集一些信息来帮助我判断什么更糟糕——天气还是公交车上的人群。

首先,我必须找到用于此的数据。幸运的是,芝加哥市有一个开放的数据门户,这绝对是了不起的。公交路线数据很干净,格式也很好,这大大弥补了它直到 2016 年 11 月才完成的事实。至于天气数据,我是从地下气象站刮来的。

一旦我得到了这些数据集,我就把它们上传到 R 中,用 ggplot2 进行一些探索性的可视化。我特别研究了天气和 8 号路线之间的关系,因为那是我最常乘坐的巴士路线。

下面我们可以看到,随着气温的上升,工作日的乘客数量下降。尤其是气温超过 60 度的时候。然而,在周末,不管气温如何,乘客量仍然相当平稳。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

检查风速与下面的乘客人数似乎没有太大的关系。我们可以肯定地看到,一周中的日子是一个很大的因素,就像前面的图表一样,但没有那么多风。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就像风速一样,降水似乎对车友的量没有太大影响。这让我有些惊讶,因为我确实感觉到雨天公交车上的人更多,但这可能是一种错觉,因为潮湿导致不太舒服。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不出所料,在之前的图表中看到一周中的日子被分开后,周末乘坐公交车的人数比工作日低得多。这意味着当考虑周末的交通方式时,公共汽车很可能不会拥挤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了在未来帮助自己,我想看看我是否能预测某一天的乘客数量。根据上面获得的知识,似乎唯一有价值的预测变量是温度和星期几。我将数据分成 80-20 份用于训练和测试,然后在训练数据上使用一周中的某一天和一天中的最高和最低温度来组合 glm。以下是将该模型应用于测试数据时,该模型的预测值与实际乘坐人数的对比。不幸的是,误差很大,但 84%的预测值与实际值相差在 15%以内。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在深入研究了上述关系并试图预测公交车流量后,我想弄清楚如何实际决定是骑自行车还是跳上公交车。为此,我决定为天气和公交车的拥挤程度创建“痛苦”指数。公共汽车上乘坐量的痛苦指数只是一个从 0 到 100 范围内的标准化。存在的公式是:misery _ I = 100 *(riders _ I-min(riders)/(max(riders)-min(riders))。至于天气指数,我分别用 40、40 和 20(温度是倒数)组合了温度、降水和风速的归一化。这种分裂仅仅是我个人对最让我畏缩的属性的偏好。现在,痛苦指数被放在一起,我有一个评级系统来决定是坐公共汽车还是骑自行车:如果天气指数高于公共汽车,那么它就是,如果公共汽车指数高于它,那么是时候跳上我的自行车了。

激动人心的部分来了。该模型是否能很好地预测乘客量,以决定是骑自行车还是乘公共汽车?将我们预测的公交乘客量与公交痛苦指数相加,并将其与观测到的天气痛苦指数进行比较,然后将由此得出的决策与原始的观测决策进行比较,我们得到了 91.1%的准确率。不算太坏。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于这一切,我决定用 Shiny 创建一个互动工具,你可以在这里查看。该工具接收您计划乘坐的公交路线,并从 Weather Underground 的 API 中获取当前天气,然后根据更新的数据运行上述模型,以预测公交路线的拥挤程度并计算痛苦指数。除此之外,还有一个选项可以显示你对天气有多“强硬”,这个选项为天气痛苦指数增加了参数和乘数。

感谢阅读!

当社会科学家转向计算:拯救人类的会议?

原文:https://towardsdatascience.com/when-social-scientists-turn-computational-a-conference-to-save-humanity-2005201109b2?source=collection_archive---------23-----------------------

解决数据中“偏见和歧视”挑战的研讨会。

第二届欧洲计算社会科学社会挑战系列研讨会(简称 EuroCSS)于 2018 年 12 月 4—7 日在德国科隆举行。我参加了由副教授 Bennett Kleinberg (UCL)组织的首次“论文黑客马拉松”,这是一次关于语言时态轨迹分析(LTTA)的研讨会,或者用一种非常奇特的方式说文本分析:文本语言如何随时间变化。我对“论文黑客马拉松”很感兴趣,因为它的目标是在一天结束时,有一篇可发表的论文(对于那些没有学术背景的人来说:“论文”是一份科学报告,记录了所进行的研究的发现,发表在期刊上,是量化学者成功的一种方式…请稍后留下您的评论!).至少可以说,我参加过许多计算机科学领域的传统黑客马拉松,我对这种应用于社会科学的混搭黑客马拉松很感兴趣!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The EuroCSS held at Cologne Germany and its twitter hashtag.

第 1 天—研讨会前论文黑客马拉松

在科隆的第一天包括在万豪酒店举行的会前研讨会。许多培训课程同时进行,但我参加了 LTTA,因为我想把这些方法应用到我自己的研究中(后来我疯狂的研究!).

研讨会从背景调查开始,让房间里的每一个人都熟悉后面要用到的方法的技术运作。房间里有大约 30 名学生和研究人员,他们来自各种背景,从纯粹的社会科学到铁杆计算机科学家和开发人员。

我们在自己的笔记本电脑上使用 R 和 RStudio 进行实践,将我们刚刚吸收的所有理论付诸实践,同时检查是否下载、安装并正确运行了所有正确的软件包和数据集。我很幸运,在到达研讨会之前已经完成了所有这些工作,因此在每个人都在设置时,我可以很舒服地在方法中摆弄参数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UCL Data Science Team running the LTTA workshop, from left to right: Isabelle van der Vegt, Maximilian Mozes and Bennett Kleinberg.

Bennett 和他的学生 Isabelle van der Vegt 和 Maximilian Mozes 在 Github 知识库上准备了所有必要的文件、脚本和数据,他们做得非常好——请查看并将其应用到您自己的研究中这里!有两个解析和预处理的选择(一个程序员的梦想!)vlogs 的数据集(如果你不熟悉这个全新的术语,这些是视频版本的博客——翻译成文本脚本以供分析),一个来自不同的媒体渠道,根据政治影响分为左翼或右翼,另一个来自 YouTube“改变的创造者”用户,其目的是平衡在线发现的有毒材料和积极内容。用外行人的话来说,LTTA 方法基本上是在你从剧本的开头到结尾的过程中,衡量文本情感的积极或消极程度。这些所谓的“轨迹”可以归结为几种类型,根据记忆总共有 7 种,用有趣的名字来描述它们的形状,例如“从赤贫到暴富”的向上轨迹,或者我最喜欢的“情绪波动”,类似于积极和消极情绪之间交替的曲线——你知道女孩们,每月一次的那种类型的事情。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Getting ready for our hackathon on LTTA!

在弄脏我们的手之前,我们在午餐时间边吃边喝脑汁,然后去科隆大教堂和中心逛了逛。一旦我们填饱了碳水化合物,我们回到万豪酒店,提出我们的可怕的研究问题,分成两组,开始黑客攻击!

我在第一组,研究问题是比较不同(左或右)媒体渠道之间话题的情感轨迹。这需要主题建模、情感分析和聚类(如果您对更多技术细节感兴趣,请成为我最喜欢的人,并在下面联系我!).另一个(不太喜欢,因为总体上是一个竞赛)组 2 关注流行度(喜欢 vlog 的数量)对左和右媒体频道 vlog 之间的情感的影响。

我们在万豪酒店找到了一个舒适的空间(显然包括沙发和许多插头)来计划我们 3 小时的项目。经过 20 分钟的头脑风暴,我们分成了“写作”组成员和“分析”组成员。有趣的是,我们最终在分析团队中有三个小组:激烈的 python 程序员与传奇的(这里没有偏见……)R 程序员竞争,他们进行相同的主题建模方法, LDA ,但是使用不同的编程语言,然后是不太幸运的手动(仍然让我畏缩),是的,你没听错,手动非常容易产生偏见, 的编码人员已经预先选择了两个主题(移民和贸易战),并且(出于一些非常奇怪的原因)手动编码 regex 关键字,并使用字典来搜索与手动相关的术语的文本——我不能再说手动这个词了(在此插入掌纹)——但你明白这一点。 三个小组,以不同的方式做着完全相同的事情。我们都试图找到媒体渠道中讨论的热门话题,然后应用情感分析,看看它们有什么不同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Our LDA results from our analysis on the top topics found in Media Channels from 2016–2018 — no surprise “trump” is in there…!

尽管我们做了多余的方法工作,我们的小组还是很有趣。我们有来自意大利、波斯、英国、希腊和德国的人,一起工作。我们可能有一点太多的乐趣,因为当监视第二组时,相比之下,他们似乎在一起。他们已经准备好了幻灯片,时间到了,一切都准备好了。第一组在做什么?还在管理 LDA。以三种不同的方式。在我开始介绍我们的研究和成果的时候,我们的 LDA 仍然在运行,并最终加载了我们的研究和成果。玩笑归玩笑,这是一种非常有创意的方式,让社会科学家参与到计算方法中来,并让研究人员在一天内集中精力完成大量的工作!

我期待着下一次——正式志愿在这里帮助组织它——有更多的时间进行黑客活动,更多现成的小吃,最重要的是咖啡因,因为它不可能是一次没有任何形式的能量消耗和某种睡眠剥夺的黑客马拉松!

黑客马拉松一结束,几杯啤酒下肚,“科学满贯”就结束了会议的第一天,笨拙的博士生们对他们的工作进行了 7 分钟的简短陈述。是的。有免费啤酒。

第二天—研讨会第一部分在 Maternushaus 举行

在沿着莱茵河跑完 10 公里后,我喝了第一杯咖啡,如果我们很乐意在前一天举行的黑客马拉松上发表一篇论文,那么与一名小组成员就我们需要解决的所有“待办事项”进行交流是一件很棒的事情。很高兴能与一位既有计算机科学背景又对社会科学感兴趣的同事分享这份承诺和兴趣。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有的咖啡因和运动内啡肽,我已经准备好迎接充满谈话和社交的一天——来吧!第一位主旨发言人是来自东北大学的 Christo Wilson,他就如何调查职业搜索引擎算法中的性别偏见做了精彩的演讲。很高兴发现前 5-10 个结果没有偏见,但一旦招聘人员查看其他排名,就会发现尽管同等资格和优点,男性申请人仍排在第一位。令人害怕的是,当创建一个账户时,算法在没有性别输入的情况下生成了这个数据

然而,今天的话题——毫无疑问——让我大吃一惊——是 Juergen Pfeffer 关于 Twitter API 的采样算法。从本质上来说,这是一个关于如何将 1%的数据片段从 Twitter 提供给数据用户的令人敬畏的黑客技术,它只需要一个良好的(也就是昂贵的)互联网连接,就可以达到一个特定的毫秒窗口(657-666 毫秒或某个特定的范围),然后爆炸!你可以危险地操纵、利用、偏见或任何你喜欢的术语,整个采样数据集!迈克。放下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,正如你所见,没有任何 2 分钟的海报宣传(没有头韵的意图)可以与之相比,尽管大声喊出来的是来自爱丁堡的博士生 Justin Chu-Ting Ho,他的工作有一个关于新脸书 API 如何严重偏见的 rad 海报。没错。理智检查:所有这些“偏见”的谈论实际上意味着以下内容:研究人员使用社交媒体数据来回答关于世界、人类以及人类在这个世界上如何行为的基本问题。脸书、推特和所有其他人拥有大量的数据,这些数据正是这些人自愿放弃的——为了免费——然而脸书、推特和类似的人拒绝分享这些非常公开的数据。我会让你思考其中的含义,但如果你需要任何帮助,请告诉我。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

带着一点愤世嫉俗的口吻,我们有了非常需要的午休时间。有机会与世界各地的研究人员交谈,甚至讨论潜在的合作。这就是会议的目的,对吧?

研讨会第二天的最后一位主题演讲人 Sara Hajian 非常专业,她分享了她对我们在数据收集中遇到的上述(数量惊人的)偏见的一些解决方案。

我们都去了科隆当地的圣诞市场,几乎每隔几个街区就有一个不同的圣诞市场——足够接下来的 5 年左右了!得到了美味的半米长的肉棒、gluhwein(热葡萄酒)和大量的糖果!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第三天—研讨会第二部分在 Maternushaus 举行

研讨会的最后一天,最好的描述是有点懒散,要么是咖啡中的咖啡因被严重稀释,要么是我的大脑被前一天收到的信息严重饱和。不管怎样,这又是一个谈话繁忙的日子,又是一个看海报并投票选出最佳海报的机会。

这一天的亮点最终是听取了社会模式研究人员在研讨会期间进行的一项实验,因为我们都同意在我们的挂绳上佩戴 RFID 芯片。我真的很期待实验的结果,如果你跟踪我的互动,我想我会成为一只社交蜜蜂——有测试谦虚的方法吗?我不太确定我会怎么做…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总的来说,这次会议让你大开眼界,作为一名研究人员,你在收集数据时必须考虑哪些因素,但作为一名数据消费者,所有这些信息可能会加剧我们社会的偏见。我遇到并有机会与之交谈的人提供了一个很好的思想和熟人交流的机会,这种交流可能会在未来保持下去。最后,科隆是一个值得参观和探索的可爱城市,有可爱的市场和美味的椒盐卷饼。Bis zum nä chsten Mal!

先别进球,梅西!

原文:https://towardsdatascience.com/when-to-score-the-first-goal-to-beat-your-opponent-in-soccer-8d7b4e94035?source=collection_archive---------9-----------------------

看一看足球比赛中得分的最佳时机。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Picture from pexels.com

比赛开始,你的球队在比赛的第一分钟踢进第一个球。这听起来很理想,但是你的对手回来的几率增加了吗?如果你在其他任何一分钟打进比赛的第一个进球,你赢得比赛的机会有多大,它们相比如何?

使用这个 Kaggle 数据集(其中包括从 2012 年到 2017 年欧洲一些顶级联赛的 9K 场比赛的详细事件),我试图了解在职业足球比赛中打入第一个进球的最佳时间,以增加你最终赢得比赛的机会。

第一个进球是足球比赛中最重要的里程碑之一。它可以给得分队增加能量和信心,给失球队增加压力,使他们更容易再次失球。有人可能会推断,尽快打进第一个球是最理想的,但数据显示并非如此。我们来探索一下。

如果你进球早,你的球队可以放松,甚至可以踢得更好,进更多的球。过早得分也会让对手立即紧张,因此更有可能犯更多的错误,让你的球队再次得分。

但是提前进球对对手来说也是好消息。你的团队可能会因为领先而放松,并招致坚定的对手的压力,因为他们知道自己有足够的时间扳回一局。

相关,不是因果

这一分析旨在作为理解第一个进球的时间和赢得比赛的概率之间的相关性的简单的第一步。由于这只是观察数据*,因此无法断言因果关系*。

方法论

对于数据集中的每一场比赛,我记下了第一个进球的时刻。因此,t 他的方法从数据集中排除了所有以 0-0 平局结束的比赛。然后,我通过比较每支球队的进球数来计算每场比赛的赢家(或平局)。

最后,对于第一个进球的每一分钟,我都会计算进球球队获胜、平局或失败的比赛百分比。这是结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1. Probability of each result for each minute of the first goal. The result is from the perspective of the team that scored the first goal. Legend: Green — Win, Orange — Draw, Red — Loss. The two dotted vertical lines indicate the half time (45) and full time (90) minutes.

样本大小

为了增加上述分布的可信度,我绘制了每一分钟内第一个进球得分的游戏数量(即每个条形的样本大小)。比赛越多,我们对结果的分配就越有信心。在一次聪明的数据可视化的尝试中,我重新创建了上面图 1 中的图,并使每个条形的透明度与其样本大小成比例。因此,第 20 分钟的条形图比第 76 分钟更不透明,因为有更多的比赛在第 20 分钟取得了第一个进球,而不是第 76 分钟(149 比 39)。不透明度的精确计算是通过将游戏数量的范围归一化到[0,1]区间来完成的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2. Left: The number of games in the dataset that had their first goal scored in each minute. Right: The distribution of results for each minute when the first goal was scored. Each bar’s transparency is weighted according to plot on the left. The two bright bars are on the 45th and 90th minute (half time and full time).

花絮

  1. 平均而言,打进比赛第一球的球队有 69%的可能赢得比赛, 19%的可能打平,11%的可能输掉比赛。上半场进第一球的球队,概率分别是 66%、20%、14%。最后,下半场攻入第一球的球队有 79%、16%和 5%的概率。
  2. 无论你在哪一分钟打进第一球,你赢得比赛的概率保持相对稳定。这很有趣,因为平局要求对手至少进一个球(因为你的球队进了第一个球),因此你越早进球,对手越有可能进球。这种可能表明失败的一方表现出“额外的努力”来扳平比分,如果他们落后的话,但他们会更加谨慎地比赛,这样他们就不会再次得分。
  3. 一般来说,你越晚打进比赛的第一个球,你赢得比赛的机会就越大。如图 2(左)所示,随着比赛的进行,第一个进球会越来越少。可以想象,持续很长时间没有进球的比赛可能表明两支队伍势均力敌。因此,他们中的任何一个得分的可能性都较低。
  4. 以上两点表明你得分越晚你输的概率越低。有趣的是,你的抽到的概率并不会随着你得分的增加而降低。
  5. **线性回归的斜率在后半段更陡。**图 1 还显示,如果你单独观察每一半,赢的概率在两个部分都在增加。但是它在下半年增长得更快。
  6. 最佳得分时间是在中场休息后。也许从剧情中跳出来的最有趣的事情之一是,如果你在半场结束后的第一个进球中打进了比赛的第一个球,你赢得比赛的机会就会大大增加。这可能是由多种原因造成的。比赛中过早得分会给对手留下充足的反击时间。另一方面,你“等待”得分的时间越长,你得分的可能性就越小,而被得分的可能性就越大。因此,半场结束后进球可能是最佳时机。这一发现也可能是由下半场开始并立即得分的对手的心理所驱动的。最后,结果可以简单地是相关性:也许得分队的经理做出了战术上的改变,并发表了半场讲话,使球队变得更好,这反过来又提高了得分的概率,并普遍赢得了比赛。

结论

这显然主要是理论分析。如果你在比赛的最后阶段打进第一球,赢得比赛的机会非常高,但这并不一定意味着一支球队应该有目的地 等待晚进球,因为这允许的对手先进球。或许这一分析中最具可操作性的见解之一是,下半场的前几分钟非常关键。各队应该格外小心,不要认输。

然而,这一分析提供了一个有趣的数据驱动的视角,即下次你最喜欢的球队在比赛早期得分时,你是否应该真正放松!

教练会建议在关键时刻得分吗?这种分析在其他体育/电竞中是什么样子的?

感谢阅读!

你可以在这里 找到产生了本帖提到的所有分析的 jupyter 笔记本

如果你想要更多的足球数据分析,我也写了一篇关于 2-0 领先是否是足球中“最危险的领先”的文章。你可以在这里看到帖子

附注:关于额外时间的说明

我们注意到在第 45 分钟和第 90 分钟有第一个进球的比赛数量大幅上升。峰值如此之大,仅仅说团队在最后几分钟更加匆忙并产生更多行动是无法合理解释的。

我的假设是那些“分钟”实际上是几分钟,因为它们占了所有增加的(也叫受伤,也叫额外)时间。在足球比赛中,每半场结束时都会多打几分钟,以弥补实际比赛中损失的时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3. Number of events per game per minute

增加的分钟数由裁判指示,旨在捕捉任何由于犯规、进球或任何其他停止比赛的事件而损失的比赛时间(但不是时钟)。但这意味着,理论上,第 45 分钟(上半场的最后一分钟)可以再拖几分钟。这是因为进入加时赛的 1 分钟是而不是第 46 分钟,因为第 46 分钟是下半场的第一分钟。对每场比赛每分钟发生的事件数量的研究揭示了一个相对稳定的趋势。它还显示了在第 45 分钟发生的事件的数量大约是 2.6,而在之前的几分钟大约是 1。这表明在半场结束时平均增加的时间大约是 2.6 分钟,这听起来是正确的。同样的分析显示全职工作平均增加了 3.8 分钟,这听起来也很合理。如果你有其他假设,请告诉我。

加时赛编辑:主场 vs 客场

感谢 Rich Ford 对取得第一个进球的球队(主场或客场)的分析结果的评论。这是它看起来的样子。

当主队打进第一个球时,他们总是比客队打进第一个球时更有可能赢得比赛。如果我们将获胜概率视为得分时间的线性函数,则上述见解可以重新表述为线性模型的截距主队高于客场队。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

How the chances of winning change depending on the minute of the first goal, broken down by the team that scored the first goal, home or away.

但是即使客队获胜概率的截距低于主队,客队的斜率也更陡。这意味着客队得分越晚,他们获胜的机会就比主队增加得越快。也许这表明了一种震惊和压力因素,主队在自己的球迷面前发现自己落后于比分。

什么时候去参加聚会比较合适?

原文:https://towardsdatascience.com/when-to-show-up-to-a-party-and-what-it-says-about-you-71641dce9a83?source=collection_archive---------2-----------------------

关于“时髦迟到”实际含义的指南

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

啊…一个聚会

如果你不喜欢我,你就不会和我说话。如果你恨我,你会邀请我参加你的派对。

除了需要在聚会上与人交谈,聚会的另一个问题是决定什么时候去。我是一个准时的人。“时髦地迟到”与我存在的核心相冲突。

然而,我参加过足够多的聚会,意识到守时并不总是受欢迎的。我记得参加了一个朋友的朋友举办的聚会。脸书邀请的开始时间是晚上 9 点。我和我的朋友在晚上 9:05 出现。

只有我们在那里。

其中一位主持人甚至没有完全打扮好,她说她没想到会有人这么早来。我被弄糊涂了,我们不是准时吗?

所以,如果准时是一种虚伪,那么什么时候才是出现的正确时间呢?像我在生活中面临的许多问题一样,我转向了互联网。我进行了一项在线调查,以确定参加聚会的最佳时间。之后,我还采访了我那些社交能力更强的朋友,想弄清楚不同的派对到达时间会告诉你什么。

我在网上随便问了些什么?

我招募了 71 个人,给他们看了三个派对:

  • 常规家庭聚会——20 至 50 人的家庭聚会,正式开始时间为晚上 10 点
  • 小型家庭聚会——10 到 20 人的家庭聚会,正式开始时间是晚上 10 点
  • 早期家庭聚会——20 到 50 人的家庭聚会,正式开始时间是晚上 8 点

对于每个假设的聚会,我问了参与者三个问题:

  1. 你希望你的客人最早什么时候到达?
  2. 您希望您的客人最晚什么时候到达?
  3. 你希望普通客人什么时候到达?

这是我的发现:

调查显示…

1.准时出现,不要迟到 15 分钟。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

超过 50%的人希望客人准时到达,不要迟到 15 分钟。对于较小的聚会来说尤其如此:68%的人说那是理想的出席时间。

对于大型派对,近三分之一的人希望客人比正式开始时间晚 15 分钟到达。所以,如果你是一个守时的人,在出发去你的社交聚会之前,在办公室再看一集。

2.如果你不得不早到,不要早到超过 15 分钟

超过 50%的人不介意客人在三个派对的正式开始时间之前到达。但是,不要太早到达*。很少有人认为客人提前 15 分钟以上到达是可以接受的。如果你过早出现会有危险,在敲门之前,在附近多走几圈。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.有时髦的迟到,也有迟到超过一个半小时的。

人们认为客人多晚出现是可以接受的,这一点各不相同。

对于小型聚会,78%的人说客人不应该迟到超过一个小时。对于大型聚会,75%的人不介意客人迟到 1.5 小时。7%的人也属于“我不在乎 CK”一类,他们不在乎客人何时出现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.仅仅因为一个聚会在晚上早些时候开始并不意味着你可以晚些出现。事实上,聚会越小,你越应该准时。

我认为聚会开始时间会影响人们对客人到达时间的预期。我错了。数据表明不管派对是在晚上 8 点还是 10 点开始,你都应该准时或者稍微晚一点到达。

聚会的规模对准时性的期望有更大的影响——聚会越小,你应该越准时。

你的派对到达时间说明了你什么

数据告诉我什么时候去参加聚会。但是当你提前 30 分钟或迟到 2 小时到达聚会时,人们实际上在想什么呢?我招募了一些更擅长社交的朋友(比如:高中里的酷孩子),并采访了他们关于派对到达时间的问题。我发现,当你出现在派对上时,会透露出很多关于你的信息——你的个性、你与主人的关系,以及你当晚的目标。

1.你很早就出现了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你早到,你无疑是第一个到的。你可能看到主人正在布置或穿衣服。期待一些关于“不要这么早期待任何人”的评论

你…

  1. 是主人最好的朋友
  2. 错误地认为人们欣赏你的早到。
  3. 不知道去派对需要多长时间

如果你是主人最好的朋友,一切都可以原谅。你可能已经预料到了。你的存在意味着你可以帮助东道主设置,或者更好的是,赛前。

如果你是 2),就当这是你的觉醒。希望这些数据已经让你相信那些“你来早了!”不是因为主人见到你很兴奋。

很可能你是 3)。你不确定到达聚会需要多长时间,所以你比预期的要早到达。你没有绕着街区转几圈,而是决定按门铃——最坏会发生什么?当你看到主人脸上困惑和判断的表情时,你立刻后悔自己的决定。下次你早到的时候,你会像正常人一样耐心地在车里等着。

2.你准时出现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你很可能仍然是第一个到达的人,除非有一个奇怪的人提前出现。我是说谁会那样做,即使你比那更有社交技巧。

取决于你的主人准备得如何,两种情绪中的一种会掠过他们的脑海。如果他们被安排好了,他们会因为人们真的来参加聚会而感到宽慰。当其他客人出现时,你也可以让派对看起来更受欢迎。

如果你的主人还在设置,他们在诅咒你的存在。**他们知道邀请严格来说说的是晚上 9 点,但是谁实际上在晚上 9 点出现呢?现在,他们不得不继续准备,同时感到有义务进行闲聊。

那你为什么准时出现?你要么是…

  1. 准时的
  2. 无聊的

一种选择是你喜欢准时。你的大学绰号是“守时”。你手腕上纹了个秒表。脸书邀请函上说晚上 10 点,该死的,你得在晚上 10 点出现。

另一个选择是这个派对是你今晚的巅峰。一天能看的真侦探集就这么多。实际上,现在只有两季,而你今天已经看完了。所以你准时到达,因为你宁愿做别的事情,也不愿在你的住处多呆一分钟。

3.你在开始时间后十五到二十分钟出现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人们开始稀稀拉拉地进来,每个人都站成一大圈。你真的可以听到其他人说话。

您可以:

  1. 我讨厌大群人。
  2. 有别的地方要去。

也许你更喜欢在较小的群体中聊天,但不想与主持人进行一对一的闲聊。如果你在聚会上不认识很多人,相对早一点到达是一个好策略。虽然聚会很小,但你可以在那里见到每个人。随着人们慢慢进入,人们也会被你所在的社交圈吸引,并向你介绍自己。

这个时候出现也可能意味着这个派对不是你今晚的最终目的地。你觉得自己有义务去露面,但你实际上只是在等待一段可接受的时间,然后你就可以去你真正的目的地了。与此同时,你不能拒绝别人送的酒。

4.你迟到了三十分钟到一个小时

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

派对越来越热闹,饮酒游戏已经出现,人们没有喝醉,但他们肯定在喝酒。

如果这个时候到了,说明你是正常的。

当你走进房间时,你在心里为自己时髦的迟到而拍拍自己的背。别介意你在过去的两个小时里一直在看猫的视频,这样你就不会早到了。

每一个决定都是计划好的。你带了 6 瓶啤酒——足够显示你不是一个贪财的人,但又不够让人认为你渴望朋友。你的衣柜放在一起足够好看,但不要太放在一起看起来这个派对是一件大事。事实上,你试穿了五套不同的衣服,然后才找到你现在穿的那套,这不是重点。**

5.你迟到了一个半小时到三个小时。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

聚会进行得如火如荼。对话包括对着对方的耳朵大喊大叫。像一个入侵物种,红色的 Solo 杯在房间里蔓延。啤酒乒乓球桌有一个等候名单。

你…

  1. 不认识主持人。
  2. 是从其他地方来的

*你没见过主持人。事实上,你并不知道这个派对的存在,直到 10 分钟前你的朋友带领你的朋友们来到这里。**你在这里只是因为第一次聚会没有酒了,这是所有人能想到的最好的选择。*这是在收到几条确认这个聚会确实是“poppin”的短信之后。

或者这是今晚的第二或第三站。你在“之前最酷的酒吧”并且让你遇到的任何人都明白。现在你要让自己的陶醉程度与派对的水平相匹配。如果你的水平太低,你就拍一些镜头来赶上。如果你水平太高,还是拍些镜头来埋尴尬。

6.你迟到了三个多小时。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你喝醉了。

你不知道你是怎么来的。当你环顾四周,你不认识房间里的任何一个人。人们瞥了你一眼,并和他们的朋友窃窃私语,但你无法理解这一切意味着什么。你会打电话给你的朋友,但是你在两个目的地之前丢失了你的电话。现在你只是坐在沙发上,手里拿着一杯水,还是一杯啤酒?你只需要让你的眼睛休息一小会儿…

派对时间到了…

所以希望你现在知道什么时候出现在你的下一个派对上——耶。如果你不相信你真的想要* 出现 我有一篇文章要写给你但是现在,我必须拍一张照片,抓起我的夹克,带上微笑,然后出门……唉。*

你可能喜欢的其他文章

如果你喜欢这篇文章,请访问LateNightFroyo.com,阅读引发关于爱情、生活等话题的话题。

如何走出去?

多年轻才算年轻到不能约会?

何时使用机器学习与基于分数的搜索排序

原文:https://towardsdatascience.com/when-to-use-a-machine-learned-vs-score-based-search-ranker-aa8762cd9aa9?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Photo coutesy: Catarina Moreira)

什么时候是从简单的基于分数的机器学习搜索排名的正确时机

传统的信息检索始于使用诸如 TF-IDF [1]或 BM25 [2]之类的分数对搜索结果进行基于分数的排序。随着搜索引擎变得更好,他们使用的分数也开始变得更好。许多大型搜索引擎使用启发式/基于分数的搜索排名模型。最著名的是,就在 2011 年,谷歌在搜索排名中使用了启发式模型[3],尽管它在机器学习方面拥有非常强大的内部专业知识。

使用机器学习模型对搜索结果进行排名已经探索了至少二十年。在过去的十年左右,随着学习排序技术的流行,它变得更加突出。例如,Bing 至少从 2009 年就开始使用学习排序技术对其搜索结果进行排序[5]。

这是许多新的和现有的搜索引擎必须做出的选择:他们应该选择手动调整的基于分数的模型,还是应该使用机器学习来对搜索结果进行排名。

以下是一些重要的因素,应该纳入你的决策中。请注意,这些要点中的大多数都足够通用,可以应用于任何预测/排名问题,并且不严格限于搜索。

1。可解释性

对于大多数最大似然算法,特别是对于目前流行的算法,如集成或神经网络,排序本质上是一个可解释的黑箱。你可以控制输入,但是很难解释特定的输入对输出有什么确切的影响。因此,最终的模型不是很好解释。

基于分数的模型,尤其是分数被精心构造的模型,通常更容易推理和解释。

2。实施时间

构建 ML 模型的新版本通常需要花费大量的时间。在您的模型准备好进行 A/B 测试之前,您需要运行“收集/清理数据->训练->验证->测试”循环的多次迭代。

更新基于分数的模型可以像调整分数一样简单,因此可以在很短的时间内完成 A/B 测试。

3。优化指标

对于大多数搜索引擎来说,很难找到一个客观的指标来优化。这是告诉您特定搜索查询的结果良好且搜索成功的指标。这一标准会根据您正在构建的产品和您的搜索“成功”的构成而变化。你可能想开始优化用户点击,但是如果你盲目地使用点击,你可能会训练出一个更倾向于坏的“点击诱饵”结果的模型。大型搜索引擎在建立人类相关性系统[6]上花费了大量资金,在这些系统中,训练有素的人类评分员使用明确定义的准则来为每个搜索结果生成客观的“成功评级”。由这些系统生成的训练数据然后可以用于训练 ML 模型来对搜索结果进行排名。较小的搜索引擎可能没有大型搜索引擎那么多的资源,也可能没有能力建立这样的系统。

这个优化指标对于 ML 和基于分数的系统都很重要。然而,如果您没有一个好的优化度量,ML 模型会遭受更多的损失,因为您可能最终会学习到一个训练有素的模型,该模型针对一个完全错误的度量进行优化。相比之下,基于分数的系统受到的影响要小一些,因为分数是使用理性和直觉结合您试图优化的指标构建的。

4。结果相关性

如果你能得到正确的优化度量,这就是 ML 模型能给你巨大红利的地方。直接从数据中学习通常胜过任何可以在基于分数的模型中编码的直觉。如果相关性对你来说比其他任何因素都重要,那么使用 ML 模型通常是一个不错的选择。

5。灵活性

在 ML 模型中很难进行局部修正。解决问题的最佳方式是通过使用更好/更多的训练数据或更好的特征工程或超参数调整,所有这些都很耗时。

在基于分数的模型中,快速修复问题要容易得多。给定一个 bug,你可以很容易地调整这个模型,然后马上把它提供给用户。

6。工程爬坡时间

如果你使用的是众所周知的 ML 模型,一个好的机器学习工程师相对容易适应你的系统。模型从数据中学习,虽然您需要一些时间来了解整个系统,但在开始对模型进行更改之前,您不需要了解模型内部发生的所有细节。

基于分数的模型是手动调整的,在有效地使用它之前,您需要理解模型中包含的所有直觉和权衡。对于一个相当复杂的手工调整的模型,即使是一个好的工程师也可能需要几个月的时间才有足够的上下文来理解多年来在模型工作中形成的所有直觉。这个问题通常随着模特年龄的增长而变得更加严重。

混合 ML/手动调谐系统

如您所见,ML 模型在相关性方面可能更好,但也有一些其他缺点。为了克服这些缺点,大多数使用 ML 模型的搜索引擎使用混合 ML/手动调整系统。在这种情况下,即使你的主要排名模型是一个 ML 训练的模型,你仍然有手动调整的杠杆,如黑名单,约束,或强制排名,以快速修复惊人的错误。注意,如果您这样做,手工调整的组件保持非常简单和易于使用是很重要的,否则您可能最终不得不维护一个相当复杂的 ML 模型和一个相当复杂的手工调整的系统。

对新搜索引擎的建议

对于新的搜索引擎,考虑到上述各种因素,一个好的经验法则是:

  1. 从手动调谐模型开始。它们更容易预先构建,让您立即投入运行。
  2. 获得你的初始用户。让他们使用你的搜索一段时间,这样你就可以为你未来的 ML 模型生成良好的训练数据。
  3. 当你达到这样一个规模,即相关性的增量收益比其余因素更重要时,考虑转向 ML 模型。但是在您开始处理 ML 模型之前,请确保您对“优化度量”问题有一个好的答案。

原载于【www.quora.com】

笔记

[1]TF–IDF
【2】Okapi BM25
【3】为什么机器学习被大量用于谷歌的广告排名而较少用于他们的搜索排名?
【4】Nikhil dande kar 的回答学习 RankNet、LambdaRank、LambdaMART 这样的排名和算法的直观解释是什么?
【5】用户需求、功能和必应背后的科学
【6】Nikhil dande kar 对谷歌如何衡量其搜索结果质量的回答?

何时使用卡桑德拉,何时避开

原文:https://towardsdatascience.com/when-to-use-cassandra-and-when-to-steer-clear-72b7f2cede76?source=collection_archive---------1-----------------------

“但是卡珊德拉做得不好!”在部署了 Cassandra 集群并开始使用它之后,您肯定不想听到这样的话。在进行任何投资之前,让我们检查一下 Apache Cassandra 是否与您的任务兼容。那么,应该用卡珊德拉吗?

当答案是“是”的时候

Cassandra 天生适合于繁重的编写工作*。节点间的数据分发很快,写入很便宜,这使得卡珊德拉每秒处理几十万次写入操作只是一个普通的星期二。此外,Cassandra 非常好地处理了 繁重的读取工作负载 ,尽管有一些进一步描述的限制。*

如果您计划跨 多个数据中心和云可用性区域 进行数据分发,Cassandra 也很适合。您在波士顿和檀香山的用户将访问他们本地的数据中心(速度更快),但将使用相同的数据池。

由于数据复制,Cassandra 适合“永远在线”的应用程序,因为它的集群是 永远可用的 。数据存储在多个节点和多个数据中心,因此如果集群中多达一半的节点(甚至整个数据中心)出现故障,Cassandra 仍然可以很好地管理。

与 Apache Spark 之类的结合,Cassandra 可以成为实时分析的强大‘骨干’。而它 线性缩放 。因此,如果您预期您的实时数据会增长,Cassandra 在这方面绝对有最大的优势。**

当答案是“不”的时候

卡珊德拉在以下方面有局限性:

酸交易。如果你指望 Cassandra 建立一个支持 ACID 属性(原子性、一致性、隔离性和持久性)的系统,不幸的是,这是行不通的。Cassandra 处理数据的方式不够“严格”:它可能允许部分成功的交易,包含重复、矛盾等等。这就是为什么依赖于 ACID 的系统(例如,处理银行转账的核心银行系统等等)不应该和 Cassandra 一起使用。事实上,没有 NoSQL 技术可以做到这一点:这样的系统需要关系数据库。尽管 Cassandra 有一个旨在保护 ACID 属性的轻量级事务特性,但它还不够好。

强一致性。为了实现高可用性,Cassandra 牺牲了强一致性,只授予最终一致性。卡珊德拉有补救措施,但这不足以解决精度要求高的问题。“补救措施”之一是调整数据库,使其不复制数据,但这就扼杀了 Cassandra 的王牌——可用性。

大量的更新和删除。卡珊德拉在写作方面令人难以置信(以下是这一惊人写作表现的原因)。但它只是面向追加的。如果你需要更新很多,Cassandra 并不好:对于每次更新,它只是添加一个具有相同主键的“年轻”数据版本。想象一下,对于读操作来说,在它们的“相似”池中找到所需的数据版本是多么痛苦。此外,Cassandra 处理删除的方式类似:它向数据添加一个墓碑,而不是实际删除它。因此,针对同一主键的读取会发现大量“不死”数据,而不仅仅是最新值。有时会进行压缩,所有不必要的数据都会被删除,但是在压缩之间,读取时间会更长。**

大量扫描。卡珊德拉阅读数据非常好。但是只要知道想要的数据主键就很好读。如果你不这样做,Cassandra 将不得不扫描所有节点来找到你需要的,这将需要一段时间。如果超过等待时间阈值,扫描将根本无法完成。

“确定”时的真实用例

为了更清楚地描述何时使用 Cassandra,我们给出了一些最流行的用例。

传感器数据

Cassandra 的数据模型的组织方式以及 Cassandra 专为密集型写入工作负载而设计的事实使其非常适合传感器数据。它 适合完全不同的行业 ,无论是制造、物流、医疗保健、房地产、能源生产、农业还是其他。无论传感器类型如何,Cassandra 都能很好地处理传入的数据流,并为进一步的数据分析提供可能性。

信息系统

消息系统(聊天、协作和即时消息应用等。)对 Cassandra 来说就像传感器数据一样完美,因为它们不需要数据更新。Cassandra 可以快速编写新收到的信息,允许快速阅读和其他附加功能。例如,你可以给消息一个“生存时间”,当这个时间用完时,Cassandra 会删除它,避免昂贵的墓碑和压缩。

电子商务网站

数据模型设计、面向写入、相当快的读取速度和线性可伸缩性使 Cassandra 适合于具有类似 产品目录推荐或个性化引擎 等功能的电子商务网站。对于后者,Cassandra 可以存储属于同一细分市场的访问者的活动,这些访问者彼此靠近,这将允许分析工具快速访问数据,例如,为想要离开网站的用户提供诱人的建议。

娱乐网站

Cassandra 还帮助各种娱乐网站跟踪和监控用户的活动。它存储了用户看过、玩过、读过或听过的电影、游戏、文章或歌曲的数据,以及他们在每项活动上花费的时间等。然后,Cassandra 可以将这些数据输入分析工具,向用户推荐他们可能喜欢的其他电影、游戏、文章或歌曲。

银行欺诈检测

尽管 Cassandra 不太适合银行账户之间的转账,也不太适合 ACID 交易,但银行仍然可以从中受益。他们为分析客户数据而构建的大数据解决方案可以通过启用 欺诈检测 为客户提供额外的安全级别。Cassandra 做得非常出色,它通过与 Apache Spark 的无缝集成提供了很高的速度和对实时分析的支持。

小测验

卡珊德拉不是银弹,就像任何 NoSQL 数据库不是。它有自己的优点和缺点要考虑。如果你想检查你对它们的记忆程度,这里有一个小测验:

1.Cassandra 可以在多个同步的数据中心上运行吗?

2.Cassandra 可以与哪些技术配合使用来进行实时分析?

3.Cassandra 在升级和密集写入方面做得如何?

4.Cassandra 适合一个需要 ACID 事务,扫描,删除,更新的项目吗?

5.卡珊德拉的典型特征是什么:强一致性还是持续可用性?

然而,最大的问题是:你应该使用卡桑德拉还是避开它?现在,你已经掌握了做出这个重要决定的所有背景信息。

堆栈溢出何时回复:如何用 BigQuery 预测

原文:https://towardsdatascience.com/when-will-stack-overflow-reply-how-to-predict-with-bigquery-553c24b546a3?source=collection_archive---------14-----------------------

Stack Overflow predictions: You can play with this interactive dashboard!

当你最后发布一个关于栈溢出的问题时,一个漫长的等待就开始了。有人会回答你的问题吗?社区会否决你的问题,认为你的问题不好吗?有人会给你答案吗?他们回答了吗?我们能预测这些吗?就这么办吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Stack Overflow stats per month

我喜欢堆栈溢出。它回答了我的大多数编程问题,如果没有,我可以发布一个新的。正常情况下,一个月会有超过 120,000 名用户提出新问题,超过 75,000 名社区成员随时准备提供帮助。我知道,因为我两边都去过

BigQuery 为提供了许多公共数据集,其中之一是 Stack Overflow 的季度更新副本。我们可以使用这些数据和最近发布的 BigQuery ML 特性来预测需要多长时间来回答您的堆栈溢出问题。

你刚刚发布了一个关于堆栈溢出的问题吗?在您等待的时候,让我们回顾一下这些预测是如何运行的。

背后的科学

第一步是测量用户在堆栈溢出的人给他们一个答案之前要等待多长时间。我们将从 BigQuery 中的问题表中得到这个,并通过一个相关子查询得到答案:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Average time to get an answer on Stack Overflow, per tag. Keep reading, because we’ll debunk these numbers in a few.

将答案与问题结合起来的基本查询,产生问题与其第一个答案之间的时间:

WITH question_answers_join AS (
  SELECT *
    , GREATEST(1, TIMESTAMP_DIFF(answers.first, creation_date, minute)) minutes_2_answer
  FROM (
    SELECT id, creation_date, title
      , (SELECT AS STRUCT MIN(creation_date) first, COUNT(*) c
         FROM `bigquery-public-data.stackoverflow.posts_answers` 
         WHERE a.id=parent_id
      ) answers
      , SPLIT(tags, '|') tags
    FROM `bigquery-public-data.stackoverflow.posts_questions` a
    WHERE EXTRACT(year FROM creation_date) > 2016
  )
)SELECT * 
FROM question_answers_join
WHERE 'google-bigquery' IN UNNEST(tags)
AND answers.c > 0
ORDER BY RAND()
LIMIT 10

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Some sample questions — when were they posted, how long it took to get an answer.

这是一个好的开始,让我们来看看一些流行标签的平均价格:

SELECT COUNT(*) questions, tag
  , ROUND(**AVG((minutes_2_answer)**), 2) avg_minutes
FROM question_answers_join, UNNEST(tags) tag
WHERE tag IN ('javascript', 'python', 'rust', 'java', 'php', 'ruby', 'perl', 'ios', 'android', 'angularjs')
AND answers.c > 0
GROUP BY tag
ORDER BY avg_minutes

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Naive average time per tag to get an answer.

事实证明 Perl 拥有最令人惊奇的社区:它是回复最快的!其次是 Rust、Ruby、PHP。最慢的社区是 Android 和 iOS。在这之间你有…停在那里

警告:普通平均值在这里是不好的。相反,我们将计算几何平均值

我不会在这里详细解释为什么普通平均值不好——但是您应该注意的第一件事是,这些数字告诉我们,我们必须等待几天才能得到关于堆栈溢出的回复——这并不反映我们的正常体验。为了减少异常值的影响,我们可以要求使用几何平均值和中位数来代替:

SELECT COUNT(*) questions, tag
  , ROUND(EXP(AVG(LOG(minutes_2_answer))), 2) mean_geo_minutes
  , APPROX_QUANTILES(minutes_2_answer, 100)[SAFE_OFFSET(50)] median
FROM question_answers_join, UNNEST(tags) tag
WHERE tag IN ('javascript', 'python', 'rust', 'java', 'php', 'ruby', 'perl', 'ios', 'android', 'angularjs')
AND answers.c > 0
GROUP BY tag
ORDER BY mean_geo_minutes

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Geometric mean and median time to get an answer in Stack Overflow per tag

这更有意义:你的 JavaScript 问题将在 35 分钟内得到回答,而 Rust、Android 和 iOS 问题将需要一个多小时才能出现。

我们也可以计算得到答案的几率:

SELECT COUNT(*) questions, tag
  , ROUND(EXP(AVG(LOG(minutes_2_answer))), 2) avg_minutes
  , FORMAT('%.2f%%', 100***COUNT(minutes_2_answer)/COUNT(*)**) chance_of_answer
FROM question_answers_join, UNNEST(tags) tag
WHERE tag IN ('javascript', 'python', 'rust', 'java', 'php', 'ruby', 'perl', 'ios', 'android', 'angularjs')
GROUP BY tag
ORDER BY avg_minutes

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Perl、Ruby 和 Rust 在这里看起来不错:从我们的选择中,这些是仅有的回复率高于 80%的标签。有趣的是,这些标签比其他标签得到的问题少得多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Time to answer vs chance of answer: iOS and Android are the slowest to reply, while they also have the lowest chance of replying. Perl has a high probability of getting a reply. Meanwhile Javascript, Python and PHP have more questions than Perl, and are quicker to reply. (DS source)

现在,我们可以探索很多其他的变量:是在周一还是周六需要更多的时间来得到答案?新栈溢出用户比资深用户得到更快的回复?用哪个词开始提问很重要吗?问题不用问号结尾有关系吗?更长的问题还是更短的问题?一天中的什么时候?让我们来回答所有这些问题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

First word: Most people ask ‘how’ questions. ‘Can’ take longer to answer than ‘why’s.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Day of week (UTC): More questions during the week, faster answers, but with a lower probability of answer.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hour of the day (UTC). Faster answers — with lower chance of getting an answer: 14:00 UTC, which is 7am in California. The opposite at 00:00 UTC, 5pm California.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Account creation year: New users get quick replies. Veteran users ask questions that take longer to reply, but more of their questions are replied. Note there seems to be a linear relationship between account age and time to answer, but a non-linear one with probability of answer.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Length of question: Shorter questions are easier to answer, and with a higher chance.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Did they use a ?: Questions that end with a question mark get quicker answers with a higher chance?

我获取所有这些维度的基本查询:

WITH answers AS (
  SELECT * 
    , REGEXP_EXTRACT(LOWER(title), '[a-z]+') first_word
    , '?' = SUBSTR(title, LENGTH(title)) ends_question
    , GREATEST(1, TIMESTAMP_DIFF(answers.first, creation_date, minute)) minutes_first_answer
    , answers.c > 0 was_answered
  FROM (
    SELECT creation_date, title
      , CASE WHEN LENGTH(body)<700 THEN 'short' WHEN LENGTH(body)<1700 THEN 'medium' ELSE 'long' END question_length
      , (SELECT AS STRUCT MIN(creation_date) first, COUNT(*) c
         FROM `bigquery-public-data.stackoverflow.posts_answers` 
         WHERE a.id=parent_id
      ) answers
      ,(SELECT  AS STRUCT EXTRACT(year FROM creation_date) account_creation_year
         FROM `bigquery-public-data.stackoverflow.users`  
         WHERE a.owner_user_id=id 
      ) user
      , SPLIT(tags, '|') tags
    FROM `bigquery-public-data.stackoverflow.posts_questions` a
    WHERE EXTRACT(year FROM creation_date) > 2016
  )
)SELECT tag, 60*EXP(AVG(LOG(minutes_first_answer ))) time_to_answer, COUNT(minutes_first_answer)/COUNT(*) chance_of_answer
   , COUNT(*) questions
-- first_word, ends_question, tag
--   , FORMAT_TIMESTAMP('%H', creation_date) hour_utc
--   , FORMAT_TIMESTAMP('%A', creation_date) weekday_utc
--   , user.account_creation_year
--   , question_length
FROM answers, UNNEST(tags) tag
WHERE tag IN ('javascript', 'python', 'rust', 'java', 'php', 'ruby', 'perl', 'ios', 'android', 'angularjs')
--AND first_word IN UNNEST(['why','what','how','is','can', 'i'])
GROUP BY 1

结合一切:回归!

那么我们如何综合所有这些平均值呢?如果我在周四下午 3 点有一个简短的 SQL 问题,并且我自 2009 年以来一直是一个堆栈溢出用户,该怎么办?我的问题以“什么”开头,我会确保以提问的形式提问。我们能不能创建一个公式,囊括所有这些指标,即使以前没有人尝试过这种组合?

是啊!这就是为什么 BigQuery 现在支持线性和逻辑回归(期待更多)。跟我的朋友打个招呼, BigQuery ML

要创建一个线性回归模型,将所有这些特征组合成一个预测,预测您需要等待多长时间才能得到答案,只需执行以下操作:

CREATE MODEL `dataset.stacko_predicted_time`
OPTIONS  (model_type='linear_reg' ) ASSELECT first_word, ends_question, tag
  , FORMAT_TIMESTAMP('%H', creation_date) hour_utc
  , FORMAT_TIMESTAMP('%A', creation_date) weekday_utc
  , user.account_creation_year
  , question_length
  , **LOG(minutes_first_answer) label**
FROM answers, UNNEST(tags) tag
WHERE was_answered

该查询涉及 3,784,571 个问题及其回复,超过 46,178 个不同的标签。您可能会注意到,我为他们的每个标签复制了问题(当他们有多个标签时),这样总共有 11,297,337 行。这可能会给一些标签一个不公平的平衡,但我们可以稍后再讨论。训练这个模型花了多长时间?6 分钟,我最后一次尝试。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Different instances of training this model .

一些统计数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SELECT processed_input, weight
  , ARRAY(SELECT AS STRUCT * FROM UNNEST(category_weights) WHERE weight<0.7 ORDER BY RAND() DESC LIMIT 2) category_weights
FROM ML.WEIGHTS(MODEL `dataset.stacko_predicted_time`)SELECT *
FROM ML.EVALUATE(MODEL `dataset.stacko_predicted_time`)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要检查这些值的含义,请参见机器学习词汇表,或者参见莎拉·罗宾逊预测 CPU 性能中对不同预测的类似值的分析。在试图赋予权重意义之前,请检查上的 Lak Lakshmanan 为什么机器学习模型中的特征权重是无意义的。

对于 6 分钟的实验来说,还不错。我们可以做很多改进,但现在让我们继续。

训练答案的概率同样简单,只是这次用了逻辑回归:

CREATE MODEL `dataset.stacko_predicted_answered`
OPTIONS  (**model_type='logistic_reg'**) ASSELECT first_word, ends_question, tag
  , FORMAT_TIMESTAMP('%H', creation_date) hour_utc
  , FORMAT_TIMESTAMP('%A', creation_date) weekday_utc
  , user.account_creation_year
  , question_length
  , **IF(was_answered, 1, 0) label**
FROM answers, UNNEST(tags) tag

哦,如果没有时态表answers,上面的查询将无法工作,它具有我们建模的特性:

WITH answers AS (
  SELECT * 
    , REGEXP_EXTRACT(LOWER(title), '[a-z]+') first_word
    , '?' = SUBSTR(title, LENGTH(title)) ends_question
    , GREATEST(1, TIMESTAMP_DIFF(answers.first, creation_date, minute)) minutes_first_answer
    , answers.c > 0 was_answered
  FROM (
    SELECT creation_date, title
      , CASE WHEN LENGTH(body)<700 THEN 'short' WHEN LENGTH(body)<1700 THEN 'medium' ELSE 'long' END question_length
      , (SELECT AS STRUCT MIN(creation_date) first, COUNT(*) c
         FROM `bigquery-public-data.stackoverflow.posts_answers` 
         WHERE a.id=parent_id
      ) answers
      ,(SELECT  AS STRUCT EXTRACT(year FROM creation_date) account_creation_year
         FROM `bigquery-public-data.stackoverflow.users`  
         WHERE a.owner_user_id=id 
      ) user
      , SPLIT(tags, '|') tags
    FROM `bigquery-public-data.stackoverflow.posts_questions` a
    WHERE EXTRACT(year FROM creation_date) > 2016
  )
)

预测

一旦创建了模型,您就可以使用如下查询来预测任何类型的组合:

SELECT * FROM ML.PREDICT(
  MODEL `fh-bigquery.bqml_models.stacko_201809_time` 
  , (
    SELECT 'why' first_word
      , true ends_question
      , 'google-bigquery' tag
      , '7' hour_utc
      , 'Monday' weekday_utc
      , 2013 account_creation_year 
      , 'short' question_length
    )
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Prediction results

并在一个查询中组合所有 3 个模型:

WITH features AS (
  SELECT 'why' first_word, true ends_question
    , 'google-bigquery' tag, '7' hour_utc
    , 'Monday' weekday_utc, 2013 account_creation_year 
    , 'short' question_length
)SELECT predicted_label minutes, * EXCEPT(predicted_label)
FROM ML.PREDICT(
  MODEL `fh-bigquery.bqml_models.stacko_201809_time` 
  , (SELECT 
      (SELECT prob FROM UNNEST(predicted_label_probs) WHERE label=1 LIMIT 1) prob_down
      , * EXCEPT(predicted_label, predicted_label_probs)
    FROM ML.PREDICT(
      MODEL `fh-bigquery.bqml_models.stacko_201809_downvoted` 
      , (SELECT 
          (SELECT prob FROM UNNEST(predicted_label_probs) WHERE label=1 LIMIT 1) prob_answer
          , * EXCEPT(predicted_label, predicted_label_probs)
        FROM ML.PREDICT(
          MODEL `fh-bigquery.bqml_models.stacko_201809_answered`, TABLE features
        )
      )
    )
  )  
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1 query, 3 predictions

为结果服务

你可能想知道“这个交互数据工作室仪表板怎么会这么快?”,或者“将 Data Studio 连接到 BigQuery 的成本是多少”?我们将不得不把这段对话留到以后的文章中,但现在先预览一下:

感谢

感谢大家的牛逼点评:凯西·科济尔科夫拉克什马南弗兰克·范·普弗伦萨拉·罗宾逊阿布舍克·卡什雅普史蒂夫·切里尼

后续步骤

想要更多的故事?查看我的媒体关注我的推特,订阅reddit.com/r/bigquery。试试 BigQuery 吧——每个月你都可以从免费的网站上获得一个完整的万亿字节的分析。

[## 这些是真正的堆栈溢出趋势:使用页面视图

直到今天,获得 Stack Overflow 的季度浏览量并不容易。了解如何获得这些…

towardsdatascience.com](/these-are-the-real-stack-overflow-trends-use-the-pageviews-c439903cd1a)

当你作为数据科学家的工作完成后

原文:https://towardsdatascience.com/when-your-job-is-done-as-a-data-scientist-c5d887bb0d0e?source=collection_archive---------7-----------------------

如何应对不确定性并开展有影响力的工作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Unsplash

灰色的世界

有充分的证据表明,数据科学的成长和发展非常迅速。很难相信,自《哈佛商业报告》宣布数据科学家是最性感的工作已经过去五年了。自那篇文章发表以来,该领域无疑取得了长足的进步。

话虽如此,但我认为我们仍然知之甚少。

重要的是要明白,从本质上讲,数据科学是一门静止的科学。在科学中,很少有具体的东西。总是有新的发现、出版物和研究出现,改进了以前的工作。科学在这方面是极其反复的。

“一个重要的观点是,科学是一种实现学习的手段,一方面不是通过纯粹的理论推测,另一方面也不是通过实践事实的无指导的积累,而是通过理论和实践之间的有动机的迭代”——乔治·e·p·博克斯

数据科学也不例外。迭代对我们的日常工作至关重要。无论我们是在改进以前的机器学习模型,探索关键指标的趋势,还是调查一个复杂的问题,都归结为迭代。

作为数据科学家,很少有非黑即白的事情。我们在灰色的世界里工作。

对许多人来说,这是这个职业的后果——是一件坏事。然而,我不敢苟同。至少对我来说,所有的灰色都代表着无限的可能性。

它们代表了无限的分析和解决问题的方法。正是它们让数据科学对如此庞大的人群如此具有挑战性和趣味性。最重要的是,它们让聪明人能够在数据科学及其他领域产生影响。

产生影响

至少在行业中,数据科学家被雇佣来为决策提供信息并对业务产生影响。您所做的所有幕后探索性数据分析和可视化通常会在报告或某种明智的决策中体现出来。

你可能也注意到了,无论你是在小公司还是大公司,时间都是你最宝贵的资源。总会有另一个问题需要回答,另一个特性需要分析,另一个模型需要构建。

对于你和你的团队的成功来说,你必须毫不留情地对待你的时间和优先事项。

因此,考虑到这一点,让我们回到手头的问题…

我什么时候发货?

决定什么时候完成一个项目,然后转移到下一件事情上并不容易。像数据科学中的许多事情一样,这个问题通常不会有一个正确的答案。

然而,这并不意味着我们不能在简单的启发式的帮助下更容易做出这个决定。在一天结束时,这一切都归结于你的工作的影响。

这篇文章的灵感来自于当地乐观人士的一篇精彩文章,其中写道:

“如果他们不能对我们的输出做出决定,那么你的工作就没有完成。”

和大多数启发式方法一样,这有点一般化,但是我相信这是非常有用的。

作为数据科学家,我们需要更好地不断提醒自己,我们的主要关注点应该是推动影响。

如果你已经完成了做出明智决定所需要的东西,那么就把工作交付出去,继续你待办事项中的下一个任务。一个常见的错误是让你自己陷入的困境,在复杂的事情上花费太多时间,却没有可操作的见解。

包扎

坐在这里结束“产生影响”很容易,但我认为这低估了我想说的。创作有影响力的作品应该一直在你的脑海中占据首要位置。无论你在做什么项目,这都应该是你优先考虑的事情。对于工业界的数据科学家来说,这应该是一种边缘困扰。

这看起来相当简单,但是你可能会发现在实践中实现起来比听起来要困难得多。这可能需要你做一些深思熟虑的工作和磕磕绊绊,但有了你的建议,我相信你会度过难关。

感谢阅读!如果你喜欢这篇文章,请继续向鼓掌按钮展示你的爱。对更多的帖子感兴趣吗?请务必关注我并订阅下面的我的简讯以接收任何新内容。想了解更多关于我和我在做什么,请查看我的网站。

人工智能和人工智能在市场营销中的发展方向

原文:https://towardsdatascience.com/where-ai-and-ml-in-marketing-is-headed-6b651f5f7eaa?source=collection_archive---------11-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人工智能(AI)和机器学习(ML)是当今广告界的前沿,因为这些技术提供了将工具和数据集转化为有价值的营销见解的机会,从而有助于提高公司的投资回报率。现在,人工智能和人工智能比以往任何时候都更有价值,因为最近开发了比以往任何时候都更先进的负担得起和可访问的数据分析工具。

企业能够实现更大、更丰富的数据集,以过去成本的一小部分来宣传自己,从而改善决策。人工智能和人工智能在营销中的应用也越来越被广泛接受,成为积累数据和优化利用数据以增加利润的必要步骤。WorkFusion 通过其智能流程自动化机器人提供了这样的解决方案,可以同时收集和分析来自多个来源的数据。

以下是公司利用这些技术领先于竞争对手的三种方式。

1)人工智能使用大量数据来识别有价值的模式

营销人员在数据驱动的广告中面临的一个常见问题是,存在大量带有噪声数据的数据源、分析包和营销软件服务,如果没有适当的技术来分析这些数据,很难对这些数据进行分类。公司正在寻求以一种比当前解决方案更省时、成本更低的方式将洞察整合到所有这些工具中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决这一困境的一种方法是使用人工智能分析来收集所有这些工具、平台和数据集的输出,以帮助确定有助于未来决策的新模式。通过分析分析,企业可以使用人工智能来确定这些数据如何与消费者相关的更综合的想法,从而更容易知道最佳营销技术是什么,以及这些技术应该推广到什么平台。其中一个帮助你满足营销需求的工具就是 WorkFusion 的 RPA Express ,它集成了核心系统并自动执行任务。

2) ML 有助于创造更高级的客户互动

与消费者建立直接关系是任何企业取得成功的重要因素,近年来,许多公司都在利用 ML 扩展他们的客户服务和其他消费者对话工具。这里的关键是摆脱传统的内容营销工具,使这些沟通更加以客户为中心。通过这样做,公司将能够在正确的时间向正确的人提供正确的内容。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然聊天机器人和语音自动化命令已被证明在加强与消费者的关系方面很有价值,但公司现在正朝着这些技术的下一步发展。微软就是这样一家公司,它使用 ML 开发多感官体验,检查客户的视觉、声音、触觉、手势甚至凝视,以便与他们进行模拟真实事物的全面互动。

3。人工智能带来更加个性化的消费者体验

有很多营销个性化工具被用来为客户创造真正个性化的体验。这些工具收集消费者的信息,并定制营销工具来接触这些消费者。人工智能在这方面变得越来越复杂,因为他们正在学习更多关于个人的数据,为他们提供更个性化的购物或营销体验。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人工智能平台依赖于一个预测积分系统,该系统可以监控客户何时开始他们在零售或在线服务网站上的旅程。然后,该工具会跟随客户的整个旅程,在整个旅程中为他们提供独特的内容。

底线…

如今,将人工智能应用到他们的业务中对于寻求优化营销的公司来说至关重要。这项技术可以帮助整理大型数据集,对它们进行分类,并根据这些信息提出营销建议。此外,ML 有助于使营销体验对消费者更具针对性和个性化,确保正确的产品和服务被广告给正确的人。

有了所有可用的人工智能营销工具,公司正在改造传统的营销技术和数据库,以换取先进的分析和数据处理技术,这些技术将增加消费者流量,并从长远来看提高他们的投资回报率。

乔治亚理工学院 OMSCS 的女性在哪里?

原文:https://towardsdatascience.com/where-are-the-women-in-georgia-techs-omscs-53f16153dfc5?source=collection_archive---------7-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于在线计算机科学硕士课程的学生调查和成绩数据的分析。

介绍

2014 年 1 月,佐治亚理工学院迎来了其在线计算机科学硕士(OMSCS)项目的第一批学生。然而,截至 2018 年春季,女性仅占 OMSCS 学生总数的 14.9%。

这低于佐治亚理工学院计算机科学硕士项目中女性的比例,也低于美国每年计算机科学硕士项目中已经非常低的女性毕业比例。

对于一个以使更多的学生能够接受高水平、先进的计算机科学教育为具体目标的项目来说,这个统计数字低得惊人。

因此,利用从 2015 年夏季至 2016 年秋季开设的三个 omsc 班的 854 名不同学生(123 名女性,715 名男性,16 名未知)中收集的课程调查和成绩数据,以及从 160 名过去和现在的 omsc 学生(57 名女性和 103 名男性)的在线调查中收集的数据,我决定调查为什么会出现这种情况。

相同但不同

在我的分析中,我调查了一系列可能对 OMSCS 中的女性人数产生负面影响的不同变量,以了解它们在性别上的差异。特别是,我探索了以下方面的差异:人口统计学;学习成绩;OMSCS 前的计算经验;自信;和归属感。

然而,有趣的是,男性和女性之间的相似性,而不是差异,可能是 OMSCS 学生中存在性别差距的最大原因之一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: Comparison of field of highest educational attainment by gender

如图 1 所示,男性和女性 OMSCS 学生最有可能来自计算机科学或工程教育背景。考虑到 OMSCS 项目的主题,这并不奇怪。

然而,计算机科学和工程是所有教育学科中性别最不平衡的两个。在经合组织国家,女性仅占所有工程专业毕业生的 24%,仅略高于女性占计算机专业毕业生的 21%。

如果 OMSCS 主要从由 75%到 80%的男性组成的群体中吸引学生,那么不可避免的是,该项目录取的大多数学生也将是男性。

信心游戏

在被 OMSCS 项目录取的学生中,女性先前获得高等学位(即硕士或博士学位)的可能性高出 44%,并且在学术上与男性同学表现一样好。

然而,尽管如此,有证据表明,与男生相比,omsc 女生对自己的计算能力缺乏信心,特别是在编程方面,并且对 omsc 和计算的归属感较低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2: Comparison of confidence in succeeding at OMSCS (left) and average level of agreement with statements relating to self-confidence, equality and belonging (right) by gender

图 2 显示,在开始 OMSCS 之前,女性对自己在项目中取得成功的能力的信心平均比男性低 20%,即使在开始研究之后,女性对自己取得成功的能力的信心仍然比男性低 7%。

它还表明,尽管 omsc 的女生有更强的性别平等意识,但她们对 omsc 的归属感以及对计算机科学的归属感总体上比男生弱。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3: Comparison of pre-OMSCS programming experience (left) and computer science work experience (right) by gender

对此的一个可能的解释是,如图 3 所示,女性 OMSCS 学生通常在编程经验和计算机科学工作经验较少的情况下进入该计划,并且之前在大学水平上学习计算机科学的可能性比男性低 32%。

即使考虑到年龄等其他变量,男性在 OMSCS 之前的编程和计算机科学工作经验也明显比女性多。

计算机科学/omsc 的归属感较低也可能是女性比例较低的结果,不仅是在 omsc 的学生中,而且在 omsc 的教师中,2018 年秋季开办的 28 个班级中只有两个班级有女教师。

与男生相比,在 OMSCS 女生中观察到的对计算技能的自信心水平较低、对计算机文化的归属感较低以及对计算经验的接触较少,这与以前关于缺乏女性参与计算机科学的原因的调查结果相一致。

解决办法?

如果佐治亚理工学院真的想利用 omsc 计划作为一种手段,使计算机科学教育更加普及,那么它就有义务做出认真和持续的承诺,吸引合适的合格女性加入 omsc,并增加女性对该计划的参与。

有可能促进女性参与组织管理中心的三项举措包括:

1。扩大潜在女性 OMSCS 申请人的范围

在经合组织国家,女性占所有数学和统计学毕业生的 44%,占物理科学毕业生的 44%,是女性计算机科学和工程毕业生比例的两倍多。

OMSCS 的录取标准中没有任何东西阻止来自这些教育背景的人获得该项目的录取。

积极向计算机科学相关领域的女性推销 omsc,但女性比例较高,如数学/统计或物理科学,不会损害 omsc 目前的招生标准,并可能导致 omsc 招聘活动接触到更多的女性。

2。为学生提供建立计算机科学和编程能力信心的机会

在加入 OMSCS 这样的项目时,女性在技能和信心方面都处于劣势。为什么不为女性提供一种方法来弥补这一点,弥补她们技能上的差距呢?

这可以采取为最近被录取或正在考虑申请的人准备课程的形式,甚至可以采取“微型硕士”计划的形式,成功完成该计划可以保证进入 OMSCS。

为很少或没有编程经验的学生提供参与计算机科学的途径已被成功地用于解决美国其他大学本科女生经历的计算机科学信心问题,促使这些大学计算机科学专业女生的比例大幅上升。

3。通过为 OMSCS 女生创建可见的角色模型,建立女性对计算机科学的归属感

OMSCS 计划中几乎完全没有可见的女性榜样。对于未来的 omsc 女性申请者和 omsc 女性学生在计算机科学中的位置,这传递了什么信息?

在大学阶段,受到榜样鼓励的女孩比没有受到榜样鼓励的女孩更有可能主修计算机科学,这种可能性是没有榜样鼓励的女孩的四倍多。为什么不将同样的理念应用于 OMSCS 呢?

可以通过教师中更大的性别多样性,通过为女生创造与计算机科学领域的女性互动并接受其指导的机会,为女生创造可见的榜样,无论她们是其他 OMSCS 学生,还是佐治亚理工学院的计算机科学研究人员。

结论

自 20 世纪 80 年代中期以来,攻读计算机科学学位的女性比例直线下降。

作为美国最大的计算机科学硕士项目,佐治亚理工学院的 OMSCS 项目有可能帮助扭转这一趋势,但迄今为止,佐治亚理工学院 OMSCS 项目录取的女生比例甚至低于其同等的校内计算机科学硕士项目。

其他大学的经验表明,通过认真和持续的投入,有可能显著提高女性在计算机科学领域的参与度,为此,我提出了佐治亚理工学院可以实施的三项举措。

据估计,OMSCS 项目有可能将美国计算机科学硕士学位持有者的人数增加 8%。想象一下,如果这些人中有一半是女性,对计算机科学性别差距的影响。

要了解关于这个分析的更多信息,请访问这个项目的 GitHub 资源库,这里有。

Genevieve Hayes 博士是数据科学家、教育家和人工智能及分析专家,拥有Genevieve Hayes Consulting。你可以在LinkedIn或者Twitter上关注她。她还是 价值驱动数据科学 的主持人,这是一个每月两次的播客,面向希望最大化其数据和数据团队价值的企业。

想要发掘企业数据的价值,但不知道从哪里开始?**下载免费的数据科学项目发现指南。

我能从我的家乡飞到哪里?

原文:https://towardsdatascience.com/where-can-i-fly-to-from-my-home-town-72aaf5b3b223?source=collection_archive---------13-----------------------

任何经常旅行的人都想知道航空公司从他们居住的地方提供什么路线。通常的方法是使用航班搜索服务,如 SkyscannerGoogle FlightsMomondo ,并动态地发现答案(同时检查机票价格),但作为数据科学家,我们可以用更系统的方式来做这件事。

当然,为此我们需要一个静态的、组织良好的路线数据库。幸运的是, OpenFlights 已经为我们收集了这些数据,这些数据来自:

  • 机场(另外还有火车站和轮渡码头)。
  • 航空公司。
  • 实际飞行路线。

你可以从他们的网站或者从 Kaggle 下载这些数据,在那里他们友好地将以上 3 个数据集分发给社区。这些是通过不同 id 匹配的 CSV(例如,路线从一个机场 id 到另一个机场 id),因此我们首先要做的是合并所有信息**。** 熊猫 来救援了!

Reading and merging info

这看起来有点令人不知所措,但我们只是读取 3 个来源,过滤一些东西(例如,只有机场-没有车站-和直接路线-没有中途停留-),防止丢失值,并连接 3 个表。 df 中的最终结果是一个数据帧,包含:

  • 出发地机场的位置、名称和城市。
  • 目的地机场的位置、名称和城市。
  • 运营该航线的航空公司。

现在我们已经有了所有的数据,是时候可视化并回答一些有趣的问题了。我一直对记录和极限很感兴趣,问这种"最大/最高/最长……"的问题?在这种情况下,我想到的一些问题是:

  • 出发/抵达路线最多的国家/城市有哪些

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有两个明显胜出的国家:美国(亚特兰大、芝加哥、纽约、洛杉机、达拉斯……)和中国 ( 上海、北京、香港……)。然而,他们的许多路线都是国内的,所以如果我们只考虑城市,那么也有像伦敦、巴黎或莫斯科这样的欧洲枢纽站在第一位。以上是进来的路线:如果你考虑出去的路线,它几乎是相同的故事,因为大多数路线是对称的(如果有从 X 到 Y 的路线,也有从 Y 到 X 的相同路线)。

  • 航线最多/飞往最多国家的航空公司有哪些

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不出意外,美国 ( 美国美联航达美……)和中国 ( 南航国航 东航……)航母占优,但而 易捷 的航线比 汉莎 荷航 多,这是我没想到的。同样,国内航班的效果非常显著:如果你有兴趣访问尽可能多的国家,你最好选择 法航 土耳其航空 而不是美国航空公司(更不用说中国航空公司,因为它们基本上是在中国周边飞行,所以不在此列)。另一个惊喜是,如果一些非洲航空公司名列前茅,你会说埃塞俄比亚航空公司比阿联酋航空公司更国际化吗?我打赌不会!

那么,作为两种观点的混合,你能猜出我们从哪些城市到达大多数国家吗?对,基本上就是上述航空公司的总部(法国航空的巴黎,英国航空的伦敦,德国汉莎航空的法兰克福等等)。从现在开始,我将使用这些:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Cities with routes to most countries

关于获得上面的情节的一些提示:我使用了holo views,这是一个非常强大的可视化库,它建立在 Python 中使用最广泛的两个可视化工具(即 bokehmatplotlib )之上。 Holoviews 与 pandas 巧妙集成,允许通过 3 个步骤抽象绘图来绘制数据帧的信息:

  1. 选择类型的图(散点图、条形图、热图等)。).
  2. 建立关键维度(用他们的行话来说就是 kdims ),也就是确定要绘制的信息部分的维度。
  3. 建立值尺寸 ( vdims ),即将要在图中显示的变量。

因此,为了从城市获得国家的条形图,我们可以:

我按城市分组,统计了他们飞往的不同国家,挑选了 30 个最国际化的国家,然后选择了一个 holoviews 图,其中航空公司作为关键维度(x 轴,每个条与谁相关),目的地国家作为值维度(y 轴,条的高度)。然后,我使用了一些可用的选项,使情节看起来更好。

顺便说一下,上面的图片是静态的,但 holoviews 会生成交互式的图:例如,如果你将鼠标悬停在一个条上,就会出现一个图例:看看这个下载并运行 完整代码

太好了,我们离我们的目标越来越近了,给定一个城市,我们可以飞到哪里。如果我们能画出一张显示全球路线的图表,那就太酷了。 Holoviews 还提供了一个 图形 对象与交互支持,但是地球地图呢?一种选择是用国家多边形(例如,用我的上一篇文章的国家地理数据框)构建一个 多边形 对象,并用图形覆盖它,但是我们可以在全息视图上使用另一个库: 地理视图

所以,这个想法很简单。给定一个城市,我们必须:

  1. df 中选择从该城市出发的路线。
  2. 从这些航线中,选择所有涉及的机场(出发地和目的地)。
  3. 用这些机场的位置建立图节点
  4. 用所选路线连接的机场建立图边
  5. 调整图形选项以获得更好的可视化效果

由于一些小细节,代码相当长,例如可能有一个以上的源机场(例如,巴黎有戴高乐机场和奥利机场)以及我希望交互显示的信息(可读且不太长的名称、运营每条航线的航空公司等)。) :

马德里的结果看起来是这样的(这里也是静态的,但是如果你下载并运行完整的代码,你可以用蓝色和黄色突出显示每条路线,并且它的信息显示在交互式图例中):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Routes from Madrid (straight line version)

对于最后的绝技,让我们利用直线并不是飞机实际遵循的路线这一事实。听说过 测地线 吗?嗯,令人悲伤的事实是,给定两个城市,它们之间的最短路线不是直线,因为它们位于地球的球面上,而不是平面几何形状。例如,我今年夏天从北京飞往马德里,航线经过贝加尔湖和西伯利亚,所以它比上面显示的线更靠北。我们能改变路线来反映这一点吗?

是的,我们可以。 Python 也有专门为测地线、投影和制图设计的库,比如pyprojshapely。我们没有给出图 edgepaths=None ,而是使用可选参数测地线显式构建路径,并将其传递给函数 routes_from :

所以现在的结果更加真实:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Flights from Madrid (geodesic version)

但是仍然有一个警告。如果我们尝试用大多数路线生成之前看到的 30 个城市的图表,有些情况下会失败。以纽约为例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Flights from New York (geodesic version, something wrong!)

嘿嘿,到底是什么(字面上的地球,lol)出问题了?这是一个投影问题:路线计算正确,但是当 geoviews 试图将其投影回一个平面(默认情况下使用 墨卡托投影 )穿过太平洋的路线(从地图的右端到左端,反之亦然)错误地加入了一个不应该在那里的额外线段。如何解决这个问题?

这不是很优雅,但我想出了这个快速的方法:想法是当检测到一条路线穿过太平洋(即,从经度 180°切换到-180°或相反方向)时,它将线串分成具有两段的多线串,每侧一段。代码如下:

因此,如果我们用几何=边.应用(修复 _ 线)而不是几何=边边路径构建地理数据框,我们会得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Flights from New York (geodesic version, fixed)

太好了!并且当我们选择太平洋上空的特定航线时,两个航段都会高亮显示!你可以在我的 Github 代码中查看这一点,我在那里生成了我们在上一节中看到的 30 个最国际化城市的图表。为了完整起见,下面是这样做的代码:

我构建了一个全息地图来存储所有 30 个图形。绘制时,它会自动创建一个选择框,我们可以从中选择我们想要的城市。注意 opts 指令:它类似于我们之前使用的 options 函数,但是专用于 Jupyter 笔记本。我使用了很多选项来调整节点和边的大小、颜色和整体外观。此外,ESRI 图块源是我们在图片中看到的卫星背景,而*运算符用于叠加图。

希望你喜欢这个解释!我鼓励你下载笔记本数据,用 Jupyter 运行笔记本,然后玩结果。欢迎建议!

最小二乘法从何而来?

原文:https://towardsdatascience.com/where-did-the-least-square-come-from-3f1abc7f7caf?source=collection_archive---------3-----------------------

在机器学习面试中,如果被问及最小二乘损失函数的数学基础,你会怎么回答?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

承认

感谢我在佐治亚理工学院的 CS7641 课程,在我的 MS 分析项目中,我发现了这个概念,并受到了写这个概念的启发。感谢 Brandon 让我在本文中使用他美丽的贝叶斯推断视频。

问题 :为什么要对一个回归机器学习任务中的误差进行平方?

Ans :“为什么,当然是把所有的误差(残差)变成正的量!”

问题 :“好吧,为什么不用一个更简单的绝对值函数| x |使所有误差为正?”

Ans :“啊哈,你在骗我。绝对值函数不是处处可微的!”

问题 :“那对数值算法应该没多大关系。套索回归使用一个有绝对值的项,可以处理。还有,为什么不是 x 的 4 次方或者 log(1+ x )?平方误差有什么特别的?

Ans :嗯……

贝叶斯论证

请记住,对于机器学习中所有棘手的问题,如果你在你的论点中混合使用单词“ 贝叶斯 ”,你就可以很快找到一个听起来很严肃的答案。

好吧,我是在开玩笑。

但是,是的,我们应该明确准备好关于像最小二乘和交叉熵这样的流行损失函数来自哪里的论点——至少当我们试图使用贝叶斯论点为监督学习问题找到最可能的假设时。

请继续阅读…

基础知识:贝叶斯定理和“最可能假设”

贝叶斯定理可能是对现代机器学习和人工智能系统最有影响的概率论恒等式。关于这个话题的超级直观的介绍,请参见由 Brandon Rohrer 撰写的这个伟大的教程。我会专注于方程式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这实质上是告诉你在看到数据/证据(可能性)后更新你的信念(先验概率,并将更新后的信念度赋予术语后验概率。你可以从一个信念开始,但是每一个数据点都会加强或削弱这个信念,并且你一直在更新你的假设。

现在让我们用不同的符号——属于数据科学的符号——来改写贝叶斯定理。让我们用 D 表示数据,用表示假设。这意味着在给定数据 的情况下,我们应用贝叶斯公式来尝试确定 数据来自什么假设。我们将定理改写为,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,一般来说,我们有一个大的(通常是无限的)假设空间,也就是说,有许多假设可供选择。贝叶斯推断的本质是我们想要检查数据,以最大化最有可能产生观察数据的一个假设的概率。我们主要是想确定中的arg max(h|D)也就是说,给定观察到的,我们想知道哪个 h 可能性最大。****

一个捷径:最大可能性

上面的等式看起来很简单,但在实践中计算起来却非常棘手——因为在复杂的概率分布函数上计算积分时,假设空间非常大且非常复杂。

然而,在我们寻求’给定数据的最可能假设时,'我们可以进一步简化它。

  • 我们可以把分母中的项去掉,它没有任何包含 h 的项即假设。我们可以把它想象成使总概率总和为 1 的规格化器。
  • 一致先验假设 —这实质上是通过使其一致来放松对P**(h)性质的任何假设,即所有假设都是可能的。那么它是一个常数 1/|Vsd|其中|Vsd|是 版本空间的大小,即与训练数据一致的所有假设的集合。那么它在确定最大可能假设时实际上并不重要。****

在这两个简化的假设之后,最大似然(ML) 假设可以由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这仅仅意味着最可能的假设是观测数据(给定假设)的 条件概率 达到最大的假设。**

拼图的下一块:数据中的噪音

我们通常在学习 Stats 101 中的简单线性回归时开始使用最小二乘误差,但这个看起来简单的损失函数牢牢地存在于几乎每个监督机器学习算法中,即。线性模型、样条、决策树或深度学习网络。

那么,它有什么特别之处呢?这和贝叶斯推理有什么关系吗?

事实证明,最小二乘误差和贝叶斯推断之间的关键联系是通过误差或残差的假定性质。

测量/观察数据从来都不是无误差的,并且总是有随机噪声与数据相关联,这可以被认为是感兴趣的信号。机器学习算法的任务是通过从噪声中分离信号来估计/近似可能产生数据的函数。****

但是我们能对这种噪音的本质说些什么呢?原来噪声可以被建模为一个随机变量。因此,我们可以将我们选择的一个概率分布关联到这个随机变量上。

最小二乘优化的关键假设之一是残差的概率分布是我们信任的老朋友——高斯正态。

这意味着监督学习训练数据集中的每个数据点( d )可以写成未知函数f**(x)(学习算法试图近似的)和从零均值( μ )和未知方差σ【t3t】的正态分布中得出的误差项之和这就是我的意思,****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这个断言,我们可以很容易地得出,最大可能的假设是最小化最小平方误差的假设。

M 而且没有好的方法在 Medium 中输入数学。所以,我必须粘贴一个图像来显示推导过程。请随意跳过这一部分,我将在下一部分总结关键结论。

从最大似然假设推导最小二乘

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传********外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

瞧!最后一项只不过是简单的最小二乘最小化。

那么,这些数学显示了什么?

它表明,从监督训练数据集的误差分布在高斯正态分布的假设出发,该训练数据的最大似然假设是最小化最小平方误差损失函数的假设。

没有关于学习算法类型的假设。这同样适用于任何事情,从简单的线性回归到深度神经网络。

这就是贝叶斯推理的力量和统一性。

这是线性回归拟合的典型场景。贝叶斯推理论证在这个模型上起作用,并使选择误差的平方作为最佳损失函数变得可信。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

常态的假设是否足够合理?

你可以质疑关于正态分布误差项的假设的有效性。但在大多数情况下,它是有效的。这是根据中心极限定理 (CLT)得出的,在某种意义上,错误或噪声从来不是由单个底层过程产生的,而是由多个子过程的综合影响产生的。当大量随机子过程组合时,它们的平均值服从正态分布(来自 CLT)。因此,对于我们承担的大多数机器学习任务来说,假设这样的分布并不困难。

通过高斯-马尔可夫定理的另一个(更强的)论证

事实证明,在没有误差分布信息的情况下,最小二乘法仍然是所有线性估计中最好的线性无偏估计(根据高斯-马尔可夫定理)。唯一的要求是误差的期望值为零,不相关,方差相等。

类似的论点适用于分类问题吗?

最小平方损失函数用于回归任务。但是当我们处理类别和概率,而不是任意的实数时,分类问题又如何呢?

令人惊讶的是,使用 ML 假设和简单的类定义选择可以完成类似的推导,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

…也就是交叉熵损失函数。

因此,相同的贝叶斯推理产生交叉熵作为在分类问题中获得最大可能假设的损失函数的优选选择。

总结和结论

我们可以通过以下几点来总结和延伸我们在文章中的讨论和论点,

  • 最大似然估计(MLE) 是一种强大的技术,如果我们能够做出一致的先验假设,即在开始时,所有假设都是同等可能的,则可以得出给定数据集的最可能假设。
  • 如果我们可以假设机器学习任务中的每个数据点都是真实函数和一些正态分布的随机噪声变量之和,那么我们可以推导出这样一个事实,即最大可能假设是最小化平方损失函数的假设。
  • 无论机器学习算法的性质如何,这个结论都是正确的。
  • 然而,另一个隐含的假设是数据点的相互独立性,这使得我们能够将联合概率写成单个概率的简单乘积。这也强调了在建立机器学习模型之前消除训练样本间共线性的重要性。

最终,你可以说最小二乘最小化非常特别,因为事实上,它与宇宙中最著名的分布函数 :-)密切相关

如果你有任何问题或想法要分享,请联系作者tirthajyoti【AT】Gmail . com。此外,您可以查看作者的 GitHub 资源库 中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。如果你像我一样对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我在 Twitter 上关注我。

**** [## Tirthajyoti Sarkar -高级首席工程师-低压设计工程-半导体上|…

查看 Tirthajyoti Sarkar 在世界上最大的职业社区 LinkedIn 上的个人资料。Tirthajyoti 有 8 份工作…

www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)****

市长从哪里来?

原文:https://towardsdatascience.com/where-do-mayors-come-from-querying-wikidata-with-python-and-sparql-91f3c0af22e2?source=collection_archive---------12-----------------------

用 Python 和 SPARQL 查询 Wikidata

想象一下,你想要一个画家的儿子的列表,或者你想知道哪个市长出生在最遥远的地方。用 SPARQL 在 Wikidata 上进行简单的查询,就可以完成大量繁琐的研究工作。在本文中,通过了解欧洲市长的出生地,您将看到如何使用 Python 和 SPARQL 为 Wikidata 构建查询。

这篇文章和交互可视化的所有代码都可以在这个中找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Where do Mayors Come From?

Wikidata 是一个免费的协作式链接开放数据(LOD) 知识库,可以由人类和机器编辑。该项目始于 2012 年,由维基媒体基金会发起,旨在集中维基链接、信息框和丰富的查询。它雄心勃勃的目标是以机器可读的方式构建整个人类知识,这很好地体现了蒂姆·伯纳斯·李在 2009 年 TED 演讲中的愿景。令人惊讶的是,语义网的想法在 2001 年就已经存在了,它是由关联数据组成的。在维基数据之前有很多项目。有 DBpedia 基于维基百科中的信息框,朋友的朋友(FOAF) 这是一个描述社交网络中关系的本体, GeoNames 提供了一个带有地理名称的数据库,上层映射和绑定交换层(UMBEL) 这是一个概念和实体的知识图以及一整套其他项目,但维基数据似乎是它们之间最雄心勃勃的项目。

它的工作方式类似于维基百科,它是建立在贡献者的工作之上的。那里的所有数据都是免费的(在 CC0 1.0 下,也就是公共领域),任何人都可以编辑和贡献。在大多数(如果不是全部)维基百科页面上,有一个维基数据条目链接到它在维基数据中的对应条目,在那里你可以找到列出的链接信息。请注意,您仍然可以找到漏洞,但由于这是一个社区的努力,随着时间的推移,随着每一次贡献,这将变得越来越好。要访问结构化数据,您可以使用它的 SPARQL 端点来查询 Wikidata,这使您能够运行高级查询,或者使用它的 REST API

但是你可能会问,那些维基数据是什么?在这个图表中,您可以看到一个 Wikidata 条目的结构。他们每个人都有一个语句的列表,是以SUBJECT - PREDICATE - OBJECT形式的三元组(例如道格拉斯·亚当斯圣约翰学院教育)。在维基数据中,主语指的是一个,谓语指的是属性。每个属性都有一个值,可以是项目、文本、数字、日期或 GPS 坐标等。每个值可以有额外的限定符,这些限定符具有其他属性-值对的额外信息,比如开始时间。当您开始用 SPARQL 表达查询时,这种结构将非常重要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image from SPARQL/WIKIDATA Qualifiers, References and Ranks

SPARQL 简介

SPARQL?这是另一个 SQL 派生吗?因为您处理的是链接数据,而不是通常的关系数据,所以您需要一种不同的方法来查询数据库(也称为 triplestore),但它非常相似,使用起来也非常简单。SPARQL 是一种查询语言,用于检索存储为 RDF (资源描述框架)的数据,它由 W3C 标准化。它是一种强大的查询链接数据的语言,已经被 Wikidata 选用。语法类似于 SQL,但是对于接受过 SQL 培训的人来说有一些不同。一个关键的区别是,在 SQL 中,您倾向于避免使用JOIN子句,因为它们会降低查询速度,但是在 SPARQL 中,查询主要由连接组成。但是坚持住,让我们来看看这样一个查询。在本例中,我们希望列出欧盟的所有国家:

SELECT ?country ?countryLabel WHERE {
  ?country wdt:P463 wd:Q458.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

你可以自己尝试这个查询这里。请注意,您可以在https://query.wikidata.org/测试每个查询。那里的编辑器提供了一些有用的特性。如果您将鼠标悬停在编辑器中的属性和项目上,您将获得关于它们的信息,编辑器还提供了自动完成功能。你还会发现一系列例子,这些例子在你重新开始时非常有用。好了,继续。

SELECT子句开始,定义想要获取的变量(变量以问号为前缀)。在WHERE子句中,您设置了一些限制,这些限制大多采用您之前看到的三元组的形式。语句?country wdt:P463 wd:Q458.将对象为欧盟(Q458) 的属性为成员(P463) 的所有项目收集到变量country中。如您所见,这些声明读起来像一个句子(该国是欧盟成员国)。您还会注意到前缀wd:wdt:被认为是 SPARQL 中的快捷缩写(您可以在这里找到内置前缀列表)。这些用wd:表示项目,用wdt:表示属性。在本教程的后面,当您更深入地了解 SPARQL 数据表示时,我们将讨论更复杂的前缀。

最后,您将看到查询中令人困惑的部分SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }。这个代码片段负责将收集到的项目的标签检索到一个附加变量中,该变量带有指定语言(在本例中为英语)的后缀Label。在这个查询中,这将是存储country变量标签的countryLabel变量。请注意,仅检索具有所选特定语言标签的项目的标签(在本例中"en"为英语),因为可能存在未翻译成该特定语言的项目。

有趣的补充说明:当运行查询时,您会注意到欧洲国家列表中的荷兰王国和维基百科条目 Q29999 。令人惊讶的是,荷兰 ( Q55 )是荷兰王国的组成国,但不是国家。这类似于英格兰是联合王国的一部分。如果你感到困惑,这个视频可以很好地解释这种情况。

高级查询

现在让我们探索一下我们所选择的国家的其他属性。如果你看一下德国(Q183) ,那么你可以看到一大堆属性,比如人口(P1082)收入中位数(P3529) ,甚至是带有图像(P18) 属性的图像。SPARQL 也使我们能够检索这些内容,这将我们引向下一个查询:

SELECT 
  ?country ?countryLabel ?population ?area ?medianIncome
WHERE {
  ?country wdt:P463 wd:Q458.
  ?country wdt:P1082 ?population.
  ?country wdt:P2046 ?area.
  ?country wdt:P3529 ?medianIncome.

  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

你可以试试这个查询这里

还记得我们说过 SPARQL 主要由连接组成吗?你可以看到,每个语句都是这样一个连接,增加了更多的链接。尝试这个查询后,您会注意到国家列表变短了。这是因为查询忽略了没有人口、面积或中值收入作为属性的每个国家项目。您可以将这些三元组想象成一个过滤器,限制只匹配这个查询的三元组。我们可以添加OPTIONAL子句,如果查询在该子句中找不到三元组,该子句会将这些变量留空:

SELECT 
  ?country ?countryLabel ?population ?area ?medianIncome
WHERE {
  ?country wdt:P463 wd:Q458.
  OPTIONAL { ?country wdt:P1082 ?population }
  OPTIONAL { ?country wdt:P2046 ?area }
  OPTIONAL { ?country wdt:P3529 ?medianIncome }

  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

你可以试试这个查询这里。现在,您可以在表格中看到,您将再次找到所有国家/地区的更多附加信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Query Result for all countries

SPARQL 数据表示

我们用一个更复杂的查询继续我们的旅程,我们将一步一步地解开它。我们的目标是现在得到所有国家,首都,人口,市长,他的生日,最后是他的出生地。结果查询如下所示:

SELECT DISTINCT 
  ?country ?countryLabel ?capital ?capitalLabel ?population 
  ?mayor ?mayorLabel ?birth_place ?birth_placeLabel ?birth_date ?age
WHERE {
  # Get all european countries, their capitals and the population of the capital
  ?country wdt:P463 wd:Q458.
  ?country wdt:P36 ?capital.
  OPTIONAL { ?capital wdt:P1082 ?population. }

  # Get all mayors without an end date
  ?capital p:P6 ?statement.
  ?statement ps:P6 ?mayor.
  FILTER NOT EXISTS { ?statement pq:P582 ?end_date }

  # Get birth place, birth date and age of mayor
  ?mayor wdt:P19 ?birth_place.
  ?mayor wdt:P569 ?birth_date.
  BIND(year(now()) - year(?birth_date) AS ?age)

  SERVICE wikibase:label { 
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". 
  }
}

你可以试试这个查询这里

让我们解开这里发生的事情。首先,你首先通过首都(P36) 属性获得这个国家的首都。接下来,你进入一个更复杂的部分。要理解如何访问市长,您必须查看下图中的 SPARQL 数据表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image from SPARQL/WIKIDATA Qualifiers, References and Ranks

这看起来确实令人困惑,但是不要放弃。你只需要专注于你需要的数据。这个数据表示图展示了使用 SPARQL 从一个条目开始遍历它以获得各种信息的方法(在图中显示为wd:Q1234)。您可以在左侧看到我们在前面的三元组中使用的经典路径,它使用了前缀wdt:,导致的值可以是另一个项目、一个数值(例如,在前面的一个查询中的人口)或各种其他数据类型。

如果你看一下像罗马(Q220) 这样的项目,你会注意到对于政府首脑(P6) 有各种各样的说法。你想要一个没有结束日期的。您可以通过遍历带有p:前缀的语句节点并将其存储在statement变量中来实现这一点。从这个变量中,您可以得到带有ps:前缀的市长。你本可以用wdt:做到这一点,因为你已经学会了,但你想更进一步。您希望到达作为限定符存储在语句中的结束时间(P582) 。您可以遍历带有前缀pq:的限定符,这将给出结束日期,但是您想要没有结束日期的市长。这可以通过使用FILTER NOT EXISTS子句来完成,该子句排除了所有具有结束日期的语句节点的三元组。

在最后一部分,您收集市长的出生地、出生日期和年龄。为了计算他的年龄,可以使用BIND表达式。这个表达式可以用来将一些表达式绑定到一个变量(在我们的例子中是年龄变量)。对于这个表达式,我们用当前年份减去出生日期的年份。这个查询到此结束。您可以在 SPARQL/WIKIDATA 限定符、引用和等级中更深入地挖掘,它更详细地描述了数据表示。请确保对这个查询稍加研究,以便更好地理解它,因为它确实涵盖了各种各样的主题。

用 Python 检索 SPARQL 查询

您已经了解了如何使用 SPARQL,也可以在编辑器中下载结果表,但是如何自动化整个过程呢?您还可以使用 Python 访问 Wikidata SPARQL 端点,这使您能够直接加载和分析您查询的数据。为此,您将使用出色的请求模块,该模块通过其所有必要的工具在处理 HTTP 请求方面表现出色。您可以通过添加查询作为参数来创建请求,如下所示。

import requestsurl = 'https://query.wikidata.org/sparql'
query = """
SELECT 
  ?countryLabel ?population ?area ?medianIncome ?age
WHERE {
  ?country wdt:P463 wd:Q458.
  OPTIONAL { ?country wdt:P1082 ?population }
  OPTIONAL { ?country wdt:P2046 ?area }
  OPTIONAL { ?country wdt:P3529 ?medianIncome }
  OPTIONAL { ?country wdt:P571 ?inception. 
    BIND(year(now()) - year(?inception) AS ?age)
  }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
"""
r = requests.get(url, params = {'format': 'json', 'query': query})
data = r.json()

您已经将查询打包到了query变量中,并且需要额外提供带有 SPARQL 端点 URL 的请求,该 URL 是https://query.wikidata.org/sparql。默认情况下,这将返回一个 XML,但是如果您想使用 JSON 作为输出文件,您也可以将它添加到您的请求中。除了 XML 和 JSON,API 还支持 TSV、CSV 和二进制 RDF。这个请求返回一个 JSON,其中包含从查询中收集的所有行,您可以使用这个 JSON 将这些行收集到一个包含以下代码片段的 Pandas DataFrame 中:

import pandas as pd
from collections import OrderedDictcountries = []
for item in data['results']['bindings']:
    countries.append(OrderedDict({
        'country': item['countryLabel']['value'],
        'population': item['population']['value'],
        'area': item['area']['value'] 
            if 'area' in item else None,
        'medianIncome': item['medianIncome']['value'] 
            if 'medianIncome' in item else None,
        'age': item['age']['value'] 
            if 'age' in item else None}))df = pd.DataFrame(countries)
df.set_index('country', inplace=True)
df = df.astype({'population': float, 'area': float, 'medianIncome': float, 'age': float})
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们直观地研究收集的数据,并比较每个国家的各种属性:

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')plt.figure(figsize=(16, 12))
for i, label in enumerate(['population', 'medianIncome', 'area', 'age']):
    plt.subplot(2, 2, i + 1)
    df_plot = df[label].sort_values().dropna()
    df_plot.plot(kind='barh', color='C0', ax=plt.gca());
    plt.ylabel('')
    plt.xticks(rotation=30)
    plt.title(label.capitalize())
    plt.ticklabel_format(style='plain', axis='x')
plt.tight_layout()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太好了!现在让我们继续更高级的查询。

欧洲各国首都的市长

在我们最后的查询中,通过将坐标添加到查询中,您将看到市长出生的地方。为了获得经纬度坐标作为变量,需要添加以下语句:

?capital p:P625/psv:P625 ?capital_node.
?capital_node wikibase:geoLatitude ?capital_lat.
?capital_node wikibase:geoLongitude ?capital_lon.

在第一行中,您遍历前面显示的数据表示图。p:P625/psv:P625中的斜线表示您继续到坐标位置(P625)值节点,而没有为语句节点使用单独的变量。然后,wikibase:geoLatitudewikibase:geoLongitude分别负责从值节点中检索经纬度。欲了解更多信息,请查看关于精度、单位和坐标的文档。您将使用请求库向 SPARQL 端点发送查询:

url = 'https://query.wikidata.org/sparql'
query="""
SELECT DISTINCT 
  ?countryLabel ?capitalLabel ?population ?capital_lon ?capital_lat
  ?mayorLabel ?birth_date ?age ?birth_place ?birth_placeLabel ?birth_place_lon ?birth_place_lat
WHERE {
  ?country wdt:P463 wd:Q458.
  ?country wdt:P36 ?capital.
  OPTIONAL { ?capital wdt:P1082 ?population. }

  # Get latitude longitude coordinates of capital
  ?capital p:P625/psv:P625 ?capital_node.
  ?capital_node wikibase:geoLatitude ?capital_lat.
  ?capital_node wikibase:geoLongitude ?capital_lon. ?capital p:P6 ?statement.
  ?statement ps:P6 ?mayor.
  FILTER NOT EXISTS { ?statement pq:P582 ?end_date } ?mayor wdt:P569 ?birth_date.
  BIND(year(now()) - year(?birth_date) AS ?age)
  ?mayor wdt:P19 ?birth_place.
  ?birth_place wdt:P625 ?birth_place_coordinates.

  # Get latitude longitude coordinates of birth place
  ?birth_place p:P625/psv:P625 ?birth_place_node.
  ?birth_place_node wikibase:geoLatitude ?birth_place_lat.
  ?birth_place_node wikibase:geoLongitude ?birth_place_lon.

  SERVICE wikibase:label { 
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". 
  }
}
"""r = requests.get(url, params = {'format': 'json', 'query': query})
data = r.json()

现在,您需要将生成的 JSON 数据转换成 Pandas 数据框架,以便进一步处理数据:

countries = []
for item in data['results']['bindings']:
    countries.append(OrderedDict({
        label : item[label]['value'] if label in item else None
        for label in ['countryLabel', 'capitalLabel', 
                      'capital_lon', 'capital_lat', 'population', 
                      'mayorLabel', 'birth_date', 'age', 
                      'birth_placeLabel', 'birth_place_lon',      
                      'birth_place_lat']}))df = pd.DataFrame(countries)
df.set_index('capitalLabel', inplace=True)
df = df.astype({'population': float, 'age': float,
                'capital_lon': float, 'capital_lat': float, 
                'birth_place_lon': float, 'birth_place_lat': float})
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用该数据集,您现在可以探索市长的年龄以及他们所服务的首都的人口:

plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
df['age'].sort_values().plot(kind='barh', color='C0', title='Mayors Age')
plt.ylabel('')
plt.subplot(1, 2, 2)
df['population'].sort_values().plot(kind='barh', color='C0', title='Population')
plt.ylabel('')
plt.ticklabel_format(style='plain', axis='x')
plt.tight_layout()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,欧洲首都最老的市长似乎是马德里的住房。接下来,我们来看看市长出生在离首都多远的地方。为此,您可以使用 geopy 包来计算坐标之间的距离。这个教程涵盖了这个话题,如果你好奇为什么我们不能只在 GPS 坐标上使用欧几里德距离(剧透:地球不是平的)。要计算距离,您可以使用距离的distance()函数和米(.m)属性:

from geopy.distance import distancecoordinates = df[['capital_lon', 'capital_lat', 
                  'birth_place_lon', 'birth_place_lat']]
df['distance'] = [distance((lat0, lon0), (lat1, lon1)).m 
                for lon0, lat0, lon1, lat1 in coordinates.values]df['distance'].sort_values().plot(
    kind='barh', color='C0', logx=True)
plt.xlabel('Distance (m)')
plt.ylabel('');

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,你可以看到大多数市长往往出生在他们后来任职的城市或其附近(注意,该图表是对数标度)。你可以看到雅典领先例外,他们的现任市长(乔治·卡米尼斯)出生在美国纽约,巴黎的现任市长(安妮·伊达尔戈)出生在西班牙圣费尔南多。从那里开始,距离显著下降。

要在 Wikidata 中获得欧洲所有市长的列表,请看一下这个脚本,它更复杂,因为它必须处理一些例外情况(比如出生在不再存在的国家的市长),并且需要对每个国家分别进行查询,因为查询有限制。最终的交互可视化可以在这里找到,包括这个笔记本在内的完整代码可以在这个找到。

结论

您已经学习了如何使用 Wikidata 和 SPARQL,以及如何将其与 Python 和 Pandas 集成。Wikidata 是一个很棒的数据库,它可以实现在您最喜欢的搜索引擎上进行普通搜索所无法实现的查询和发现。这为进行数据科学和探索性数据分析开辟了令人兴奋的新可能性,并为了解我们积累的人类知识中的关系和好奇的发现开辟了一条迷人的新途径。

感谢阅读!如果你有一些反馈或者想要合作,请随时联系我。你可以在GithubTwitterLinkedIn上找到我或者你可以在我的 主页 上找到我的邮箱。**

资源和一堆链接

在文章 Wikidata:一个免费的协作知识库中可以找到关于 Wikidata 的历史和概述。作者:vrandei d .&krtzsch m .(2014 年)。有一个很棒的 SPARQL 教程涵盖了这里提到的许多内容,并且更加深入地理解 SPARQL。如果你对维基数据感到兴奋,并想做出贡献,有维基数据之旅可以指导你完成这个过程。如果你计划进行大型查询,请确保查看可公开下载的维基数据转储,它们是整个维基数据集的定期更新转储,这里有一个关于维基数据库数据模型的文档。维基数据也为程序员提供了一个工具列表。

这里是一个非结构化的资源列表,包含有用的文档、教程或使用 Wikidata 的例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值