观看现代人工智能方法的应用
在学习不同的人工智能方法时,我非常有兴趣了解这些方法是如何工作的。不是他们描述内在数学的公式或论文,而是真正的见他们。所以,我搜索了一些有趣的例子,并把它们收藏起来,现在我想分享其中最值得注意的例子。
张量流游乐场
这是一个具有许多不同参数的交互式神经网络。您可以选择问题类型,尝试不同的架构,并立即看到培训结果。适合初学者的简单神经网络的完美例子。
逐步构建决策树的直观示例
直观和交互式的决策树介绍。只要继续滚动,一切都会显示出来。有英语、法语、俄语和 10 多种语言版本。
如果你对更高级的决策树例子感兴趣,请查看这个。美丽的可视化决策树集成(包括数学)。你也可以在这里玩梯度提升训练。
遗传算法
进化不仅仅是一些生物理论,也是一个伟大的灵感如何与试验。检查进化中的汽车或僵尸。
进化神经网络
构建神经网络可能非常耗时,但遗传算法可以自动完成这一过程。
本页将向你展示进化中的神经网络。
回旋
卷积是许多现代神经网络的非常重要的构件。在这里你可以找到动画,展示这个操作是如何工作的。如果你想看它的运行,请访问 keras-js 。
只要画任何东西,你的浏览器内部的神经网络就会试图识别数字,显示下面所有的中间计算。你也应该看看卷积 VAE 演示,这个网络可以产生许多不同的手写数字只有 2 个输入!用类似的方法,你甚至可以生成面。
强化学习
让我们从高度抽象环境中的简单代理开始。链接
他的目标——尽可能靠近绿点,避免接触红点。通过调整参数,你可以改变他的行为和学习动力。您还可以在上层菜单中找到更多样品。
又一个有很多 RL 技术和简单可视化的网站:
您可以尝试不同设置,看看这些算法如何解决同一任务。此外,你可能会发现每一项都有详细的数学描述。
这些点和网格非常好,但我们需要一些更真实的东西。边浏览边训练自动驾驶汽车怎么样?你可以先试试简化版的 DeepTraffic 。如果你想要一个真正的挑战,去 DeepTesla 。
警告:这些例子可能需要一些编码技巧来调整
数学
现代人工智能背后有相当多的数学知识,很好地理解这些原理对设计这样的系统非常有用。 Setosa.io 对一些底层概念有很好的可视化,比如条件概率、回归、PCA 和马尔可夫链。这里和这里你可以找到马尔可夫链蒙特卡罗方法的交互例子。要获得更多关于机器学习背后的数学的详细信息,请查看distilt . pub。
请分享你最喜欢的可视化!
水泵维护预测:数据-科学图解
Photo by Jainath Ponnala on Unsplash
这篇文章有两个目标:
- 专注于可以通过机器学习解决的真实(即物理)世界问题
- 解释机器学习食谱的主要成分
虽然数据分析是一个相当“古老”的话题,但毫无疑问,是最近的数字化浪潮使它成为一个“热门”话题。预测网页点击和在线欺诈的迫切需要尚未对预测模型库产生巨大影响,但它肯定有助于使它们更容易被更多的受众使用。仅 Coursera 上涵盖该主题的 MOOCs 数量就令人印象深刻。反过来,这对非数字化的问题也非常有益:我们在现实世界中面临的问题。
在这篇文章中,我将讨论坦桑尼亚水泵维护的优化。数据集和问题描述可以在 DrivenData.org 的这一页上找到。如果你对预测分析的类似“高社会影响力”应用感兴趣,我在这里整理了一份公开挑战列表:
数据科学是一个相对廉价的实验领域,但它不是免费的:你需要获得大量的数据源…
becominghuman.ai](https://becominghuman.ai/high-impact-data-science-challenges-381e812770e4)
备注:这篇文章使用 Python 作为代码片段,但是在 R 和许多其他编程语言中语法非常相似。
这个数据集的完整 Python 笔记本在这个 GitHub repo 上。
关于非数字变量,先说一句
作为高中生,至少在我这一代,我们可能会在数学/科学课上遇到我们的第一个数据分析问题。因为这些课程着重于数字变量,我们倾向于觉得更符合数字数据建模。然而,许多最具信息性的数据属性是分类的:国家、星期几、职业……此外,总是可以使用“范围”将数字变量转化为离散的类别,而反之则不成立。因此,对于数据科学专业的学生来说,掌握分类变量真的是一件头等大事:它们往往信息量很大,使用起来非常方便。
入门指南
Python 中必需的数据工具包
- 为了执行常见的数据操作,比如过滤和分组,我们使用了 Pandas 包。Pandas DataFrame 对象保存数据集。
- 为了构建数据的标准预测模型,我们使用了 scikit-learn 软件包。
- *【可选】*使用 Python 最便捷的方法大概就是使用 conda 包管理器。它允许您用不同的包创建不同的环境,以避免配置冲突。
导入数据
将 CSV 数据集加载到 Pandas DataFrame 对象就像这样简单:
请注意,数据集有两个文件,一个用于预测变量(模型中的 X ),另一个用于目标变量(模型中的 Y)。这在数据挑战数据集上很常见,因为模型的目的是预测 Y,所以在现实生活中你不知道 Y。
处理缺失值和默认值
丰富的数据集包含许多解释变量。候选解释变量越多,我们就越有可能建立一个好的预测模型。
不幸的是,通常每个变量只为记录的子集正确填充,并且跨所有特征指定的记录集太小。为了处理完整的数据集,我们必须提供适当的“虚构”值,而不是缺失的值。
至少有两种方法可以找到丢失的值。
最简单的情况是数据文件中没有值。这是 Pandas 用“ dataframe.isnull ”方法标记的“清除缺失值”场景:
需要仔细目视检查的困难情况,以及缺省值隐藏丢失值的情况,缺省值通常是“0”或“无”。要发现它们,我们需要找到在给定列中出现频率非常高的值。Pandas 通过" dataframe.value_counts "方法向我们提供这些信息:
处理缺失的分类值和布尔值
缺失分类值是最容易处理的:我们认为它们自己形成了一个“缺失”类别。我们使用" dataframe.loc[selector,field] = value "语法重写相关记录,如下所示:
对于布尔字段,我们注意到它们只是二进制类别的一种特殊情况,因此我们将它们转换为字符串编码并用“MISSING”替换空值:
处理缺失的数值和日期值
为了填补一个缺失的日期(对于连续的数字也是如此),我们通常使用平均值或中间值。也有这样的情况(这取决于数据收集的方式),使用一个极值,例如最早的日期可能更合适:例如,我们可以假设没有数据是已知的,因为“那时”的数据收集不正确。
在任何情况下,我们都应该保留现有的信息,即“数据集中缺少的数据”。我们通过在覆盖数据之前添加 0/1 缺失标志列来做到这一点。
处理丢失的 GPS 数据
使用“ dataframe.describe ”方法,我们识别 GPS 坐标的奇怪极值:
- 最低高度是-90 米,而坦桑尼亚的最低水平是海平面
- 最小经度是 0 度,而坦桑尼亚在 30/40 范围内
- 最大纬度是-2.e-08(实际上是 0°),而坦桑尼亚在-1/-11°范围内
我们可以用它们的场平均值来代替这些极值,但我们可以更精确。相反,我们选择正确坐标框中的所有坐标,并计算每个“流域”的平均值,流域是一个很大的地理单位,将国家分为 9 个区域。通过这种方式,我们用局部平均值代替所有不正确的值,而不是用普通的替代值。
与日期和数字空值一样,在覆盖不正确的值之前,我们创建二进制标志来跟踪它们在原始数据集中的存在。
备注:这样的条件平均并不针对地理数据,但这个案例非常适合说明。
编码
修剪高基数分类变量
为了使分类变量具有可靠的预测能力,需要对其进行大量的观察;否则,我们无法对其影响有信心。当然,许多机器学习算法可以自己丢弃不可靠的预测器,以确保鲁棒性,但如果我们能够在上游处理它,它仍然有所帮助。
在下面的代码片段中,我将所有稀有(即在包含> 50,000 条记录的数据集中出现的次数少于 40 次)分类值分组为一个“稀有”值。我们使用“ dataframe.value_counts ”方法来实现这一点,我们以前曾使用该方法来查找非常高的频率值。
备注:要深入了解稳健估计的主题,您可以阅读关于套索和脊正则化技术的内容。
编码分类变量
一旦我们完成了对分类列的清理/整理,我们就可以将它们转换成数字,以便将它们输入到我们选择的预测模型中。
我们如何将美国、西班牙、俄罗斯、澳大利亚等数值转化为数字?我们没有!实际上,我们将分类值转化为向量。这可以通过显式编码或隐式编码来完成。因为这篇文章的目标是呈现机器学习食谱的一般成分,所以我只呈现一个明确的方法;一键编码。
One-hot-encoding 首先将每个值映射到一个索引整数,然后将该整数映射到一个向量,该向量在相应的索引上等于 1,在其他地方等于 0。以美国、西班牙、俄罗斯、澳大利亚为例,我们可以:
- USA => 0 => (1,0,0,0)
- 西班牙=> 1 => (0,1,0,0)
- 俄罗斯=> 2 =>(0,0,1,0)
- 澳大利亚=> 3 =>(0,0,0,1)
在 Pandas 中,我们使用" pandas.get_dummies "函数执行这种转换,如下所示:
备注:如果你有大量可能的唯一值,向量空间将会非常大并且非常稀疏,但是我们之前已经注意到修剪稀有值。
备注:隐式编码让训练算法确定每个值的最佳向量表示,这通常被称为嵌入,这在文本的神经网络建模中非常常见。要了解更多信息,你可以从这篇博客文章开始。
编码数字变量
在这一阶段,不是绝对有必要进一步转换数值变量,但它可以帮助模型估计阶段(进一步向下)重新调整它们。事实上,根据经验观察(以及理论上理解),如果所有的预测变量都被缩放到一个共同的值范围,那么对数据的模型校准的优化阶段工作得最好。给定的分类变量被编码为 0/1,我们在几个单位的尺度上缩放一切。常用的缩放方法有:
- 正常:(X[I]-均值(X))/标准偏差(X)
- min/Max:(X[I]-min(X))/(Max(X)-min(X))
- 分位数:百分位数(X[i],X)
以下是使用“ pandas.qcut ”函数的分位数编码示例:
编码日期变量
通过使用" dataframe.apply "方法和自定义 Python " lambda "函数拆分日期戳,为年、月、星期添加新功能:
[更高级]编码 GPS 数据
相对于区域划分,GPS 坐标有一个优势:它们考虑了空间顺序,而这在区域名称中是没有的。此外,区域名称并不重要,适当的表示是靠近区域边界的所有区域。然而,区域名有一个优点:稀疏。
充分利用坐标和区域聚类的一种方法是:
- 在地图上覆盖一个网格
- “衡量”每个记录的每个网格节点的相关性
在下面的例子中,我覆盖了一个 4x5=20 个节点的网格。让我们将节点标记为 N(1),…,N(20)(顺序无关紧要)。然后,我们向数据集添加 20 个额外的“权重”特征/列,定义如下:
- 权重(GPS[i],N(1)) =核(距离(GPS[i],N(1)))
- …
- 权重(GPS[i],N(20)) =核(距离(GPS[i],N(20)))
这里,核函数表示高斯函数(具有适当的标准偏差),使得权函数在接近节点时达到最大值。
Image source : https://commons.wikimedia.org/wiki/User:TUBS
备注:由于只有网格节点重要,网格甚至不必是方形的,例如可以由区域中心坐标组成,因为它们可能反映关键位置。
建模
识别高度相关的特征
当数据集中收集了许多信息时,很可能成对的列是高度“相关”的。
在这种情况下,为了避免模型估计过程中的“共线性”问题并减少模型优化问题的维度,我们应该删除一些近似等效的列。
当特征是连续变量时,我们使用简单的相关性度量来识别它们。在分类值的更一般的情况下(记住我们可以将数字转化为分位数),我们使用 克莱姆的 V 统计量 来测量“相关”程度,一个介于 0 和 1 之间的数字,1 表示完全相关。
在本例中,我们看到 3 个地理要素携带相似的信息,因此我们应该删除其中的 2 个。
识别关键预测特征
识别对目标变量有显著预测能力的变量类似于识别“相关”变量。因此,我们可以通过重新使用 列联表 和**克莱姆的 V 统计量:**来执行这项任务
逻辑回归:瞧!
经过所有这些细致的数据准备工作,我们终于可以估算出一个预测模型。由于这一切都是由令人敬畏的 scikit-learn 库为我们完成的,因此这可能是最容易的一步!只有一个微妙的问题需要考虑(不是自动化的):将数据集分成两部分。为了避免夸大我们模型的性能,我们应该:
- 在数据集的一部分进行校准
- 在数据集的另一部分上测量其性能
我们通过在拆分桌面之前重新调整数据集行的顺序来实现这一点:
进一步建模
虽然逻辑回归是最标准的分类方法,但它很少是表现最好的方法。尽管如此,它仍然提供了一个非常好的基础性能,您可以从中进行迭代。
如果你的数据集预测变量有很多有用的相互作用(参见笔记本),这些模型很可能会优于逻辑回归精度:随机森林(笔记本中有介绍)和 XGBoost 。
祝你好运!
我们使用的熊猫和 scikit-learn 函数列表
- 熊猫:功能 read_csv
- 熊猫:方法数据帧. isnull
- 熊猫:方法数据帧.值计数
- 熊猫:方法数据框架. loc
- 熊猫:功能获取 _ 假人
- 熊猫:方法数据框架.应用
- 熊猫:功能 qcut
- 熊猫:函数交叉表
- 熊猫:方法数据框架.示例
- scikit-learn:模型物流回归
1 最后一句话
如果你喜欢读这篇文章,你可以用下面(在左手边)的绿色心形小按钮来提高它的可见度。
谢谢!
Spark 结构化流中的水印技术
处理迟到事件是流处理引擎的一个关键功能。这个问题的一个解决方案是水印的概念。并且从 Spark 2.1 开始支持结构化流 API。
什么是水印?
水印是帮助流处理引擎处理延迟的有用方法。基本上,一个水印是一个阈值,用于指定系统等待延迟事件多长时间。如果到达的事件位于水印内,它被用来更新查询。否则,如果它比水印旧,它将被丢弃,并且不会被流媒体引擎进一步处理。
Flooding watermarks
但是,我为什么要在乎呢?
在分布式和网络化系统中,总有可能发生中断——节点故障、传感器失去连接等等。因此,不能保证数据会按照创建的顺序到达流处理引擎。为了容错,因此有必要处理此类无序数据。
为了解决这个问题,必须保留聚合的状态。如果发生延迟事件,可以重新处理查询。但是这意味着所有聚集的状态必须无限期地保持,这导致内存使用也无限期地增长。这在现实世界中是不实际的,除非系统有无限的资源(例如无限制的预算)。因此水印对于通过设计约束系统并防止其在运行时爆炸是一个有用的概念。
怎么用?
自从 Spark 2.1 ,水印被引入结构化流 API。您可以通过简单地将**withWatermark**
-操作符添加到查询中来启用它:
withWatermark(eventTime: String, delayThreshold: String): Dataset[T]
它使用两个参数,a)一个事件时间列(必须与聚合正在处理的相同)和 b)一个阈值来指定延迟数据应该被处理多长时间(以事件时间为单位)。然后,Spark 将维持一个集合的状态,直到max eventTime — delayThreshold > T
,其中max eventTime
是引擎看到的最新事件时间,T
是窗口的开始时间。如果延迟数据在此阈值范围内,查询最终会得到更新(下图中的右侧图像)。否则,它将被丢弃,不会触发重新处理(下图中的左图)。
Late donkey in structured word count: event dropped (left), event within watermark updates Window 2 (right).
值得一提的是,查询的输出模式必须设置为"append"
(默认设置)或"update”
。Complete
-根据设计,模式不能与水印一起使用,因为它要求保存所有数据,以便将整个结果表输出到接收器。
一个快速演示,如何在一个简单的 Spark 结构化流应用程序中使用这个概念,可以在这里找到——这是一个字数**(有一些小的 NLP 增强)还有什么:D**
参考
结构化流媒体编程指南、 Spark 结构化流媒体书籍作者亚采克·拉斯科夫斯基、 databricks 博客、 post 作者马杜、 post 作者 vishnu viswanath 、waitingforcode 上的 post 、 Knoldus 博客、 SoftwareMill 【T21
婴儿的名字和太阳耀斑有什么共同点
The ripple effect in water, Pexels
最近,我遇到了“永恒循环”,这是一个古老的印度/埃及/希腊观点,认为宇宙中的一切都是一个循环,过程无限重复。起初,这对我来说是一个荒谬的想法——我肯定能想到几个非循环的例子。尽管我很想驳回这种说法,但是,我很快就开始看到它背后的价值,我无法停止思考这个想法。很快,我到处寻找,发现了循环过程的证据。
这篇文章是我对无所不在的永恒轮回的思考和发现的延伸。我的工作试图为以下关键问题提供证据:
任何看似“随机”的事件可以用循环模式来解释吗?
如果答案是肯定的,我们人类可能会有一种看待宇宙的新方式。我请求你,读者,在阅读这篇文章的时候,保持开放的心态,试着用一种不同的方式来观察这个世界。
波浪周期介绍
本文的前提基于“波浪周期”,这个术语代表一种模式化的行为,从波谷循环到波峰,然后再返回——很像波浪。波浪周期最常见的表示是 f(x) = sin(x)的图形。
Graph of the sine function, created by Abhinav Raghunathan
波动周期是大自然的美丽创造,有可能解释我们在宇宙中观察到的许多现象——人造的和自然的。
这篇文章并不完全是数学性的——相反,它是一项旨在尝试和诊断宇宙在多大程度上受这些波支配的调查。周期行为的应用是无止境的,但是这篇文章的目的是告诉你一些最有趣的,甚至是最奇特的波周期占主导地位的例子。
波的数学导论
波浪的区别因素之一是它们的波峰和波谷——代表最大值和最小值的高点和低点。古埃及、希腊和印度的数学家认识到了这个概念的力量,并发展了三角函数(正弦、余弦、正切等)。).让·巴普蒂斯特·约瑟夫·傅立叶和丹尼尔·伯努利等有影响力的思想家的发展导致了 1807 年“傅立叶级数”的发现,这是一个革命性的概念,表明任何函数都可以表示为这些“波”函数(特别是正弦)的总和。
Fourier Series approximation [3]
本质上,傅立叶引入了逻辑证明,即自然界或宇宙中发生的任何函数都可以表示为波周期的总和。
科学中的循环行为
重复行为与英国物理学家罗伯特·胡克提出的胡克物理学关系最为密切。虎克因发现虎克定律而出名,虎克定律从本质上解释了当弹簧被压缩或拉伸时,膨胀力或收缩力的增加。他的发现彻底改变了经典物理学,但也(令人惊讶地)对科学家模拟量子相互作用的方式产生了深远的影响。他在 17 世纪 60 年代的发现为亨得里克·安顿·洛伦兹等其他科学家发表他的“洛伦兹振荡器模型”铺平了道路这个模型允许物理学家近似电子的运动,就像它被系在弹簧上一样。这种电子的运动反映了简谐振子的运动,它具有轮廓分明的波状模式。
Simple harmonic oscillator [5]
由周期支配的另一个有趣的领域是太阳学,研究太阳及其各种组成部分。感兴趣的具体课题是太阳活动周期。众所周知,这是 11 年一次的重复,这些图案由太阳极小期和太阳极大期组成[8]。像美国宇航局这样的机构利用这种循环模式来预测和识别危险的太阳事件,如日冕物质抛射(CMEs)和太阳耀斑。使用美国宇航局 RHESSI 任务的数据,以下分析表明,2002-2015 年太阳耀斑的总体趋势可以解释为正弦函数的一个周期[6]。
Solar Flares 2002–2015 [14], created by Abhinav Raghunathan
神经科学和心理学中的循环行为
从我们早上起床到晚上睡觉,所有的事情都是由某种类型的波动模式控制的。我们的睡眠周期具有很强的周期性,从急剧下降到“阶段 4”睡眠开始,然后是浅睡眠(REM)和部分觉醒。
Hypnogram of a normal sleep cycle [4]
睡眠之外,甚至我们正常的大脑活动也是波浪式的。当处于警戒状态时,我们的β波看起来像这样:
Beta brain waves [1]
放松或睡觉时,我们的 delta 波看起来像这样:
Delta brain waves [2]
我们的幸福也像波浪一样起伏。心理学和神经科学规定了多巴胺、血清素和内啡肽等神经递质的一部分“兴奋感”,这些神经递质都以类似的重复模式激活神经受体。考虑波动周期的净效应当然很有趣——它们不仅让我们感受情感,还让我们活着。
本节最后一个(可能也是最有趣的)波动周期应用是汽车销售。在美国,众所周知,汽车销售是季节性的——夏季较高,冬季较低。对此的解释是,汽车制造商在夏季左右发布下一代车型,因此经销商经常被迫清理现有库存。还有一种理论认为,在春天,温暖的天气会鼓励消费者购买汽车。事实上,芝加哥大学行为科学系的 Devin G. Pope 进行的一项研究发现,“气温上升 20 度会导致某些汽车的销量显著增加”[7]。虽然这的确很有趣,但这种周期性行为甚至在气候更稳定的地方也存在吗?
下一个合乎逻辑的步骤是在另一个国家测试汽车销售。挪威的季节模式与美国相似,但其温度范围从冬季的约 27 华氏度到夏季的约 64 华氏度。Veitrafikken AS 的opplysningsrdet(一个报告挪威汽车销售统计数据和数字的政治独立组织)的数据用于执行以下分析【13】。
New car sales in Norway 2012–2015 [13], created by Abhinav Raghunathan
似乎汽车销售在一段时间内的分布有两个高峰——一个在早春,另一个在初夏。数据显示,挪威的汽车销售趋势与美国相似,7 月气温最高,1 月最低。即使在这里,波动周期也与季节性一致——这是一个重复的周期,年与年之间没有太大的差异。
其他波浪周期现象
这一节将讲述看似不相关的领域,在这些领域中波动周期以某种方式占主导地位。大多数人只有关于为什么这些现象是波动周期的理论,但它们绝不是随机的产物。
特殊波动周期模式的第一个例子是枪支暴力。Pierre Alexis Geoffroy 博士和 Ali Amad 博士在《美国公共卫生杂志》发表的一篇关于“大规模枪击事件的季节性影响”的论文中,研究了美国大规模枪击事件可能存在的季节性[13]。通过使用一种叫做 余弦模型的先进统计方法,研究人员在 2013 年、2014 年和 2015 年发现了强烈的季节相关性。
下一步是将这一发现扩展到所有形式的枪支暴力。枪支暴力档案馆(GVA) ,一家旨在传播美国枪支暴力相关准确信息的非营利公司,为接下来的探索提供了必要的关键数据[12]。
Gun violence time series decomposition 2014–2018 [12], created by Abhinav Raghunathan
通过时间序列分解,观察到的图被分解成趋势线、季节性成分和随机噪声。这种分解的前提是:
Observed Data = Trend Line + Seasonality + Random Noise
利用这一点,时间序列的季节性成分似乎代表了数据的一个非常重要的部分,表明枪支暴力与季节性密切相关。为了加强这一观点,相同数据的周期图如下所示。
Periodogram for gun violence in the US [12], created by Abhinav Raghunathan
周期图有几个峰值,其中最有意义的位于大约 0.12813 的频率处,这与大约 7.8 个月的波浪周期相关。这表明枪支暴力的模式大约每八个月重复一次。这是一个相当奇特的结果,但仍然是一个有趣的结果——关于为什么这个波动周期以它似乎逃避这个简短研究的方式重复的明确解释。
本文的最后一个例子涵盖了历史上婴儿名字中波周期的存在。一些有趣的文章,如《时代》杂志的“婴儿名字预测者”和对“英国婴儿中心”编辑的采访,发现美国婴儿的名字在某种程度上是周期性的[9][10]。虽然没有对这一现象给出解释,但 Data.gov 发布并托管在 Kaggle 上的美国社会保障应用程序的数据被用来更深入地研究这一波周期[11]。
Baby names over time [9], created by Abhinav Raghunathan
从数据看,这三个名字确实显示出周期性的迹象(尽管如果它们是波周期,它们的周期跨度约为 80 或 90 年),但并非所有名字都是如此。当然,如果这些名字真的需要 80 年才能重新出现,只有时间才能证明新的婴儿名字是否真的是波动周期(至少在美国是如此)。
结论
很明显,周期性行为支配着自然和生活的许多方面。波动周期可能决定一切,从行星运动和太阳活动到我们的睡眠周期,但我们仍然不知道它们的力量。尽管科学和技术尽了最大的努力,模式化行为优越性的真实程度也许永远不会完全为人所知,因为它的影响遍及微观、中观和宏观。周期性是一个如此强大的概念,以至于许多来自印度、埃及和希腊的古老宗教都相信死后轮回的概念。随着技术的进步,越来越多的波动周期和模式化行为的联系变得显而易见(如最近科学新闻中的引力波)——也许有一天我们将能够认识到并充分利用宇宙节律性的力量。
我邀请你,读者,从这篇文章中汲取灵感,用真实世界的数据为自己进行调查。模式统治着我们的世界——要识别它们,关键是你要睁大你的眼睛,打开你的思维!
如果你喜欢这篇文章,请鼓掌并跟随 Delta 理论来到 Medium!
编后记
我在本文中创建的图表和执行的数据科学是用 R 制作的,这是一种因其功能和速度而备受青睐的统计编程语言。我要感谢 R 及其相关库背后的开发人员,没有他们,我的这个小项目就不可能实现。
图书馆:
- ggplot2,ggthemes
- 预测,tseries,TSA
- dplyr,plyr
- 润滑剂
我用 R 写的数据分析可以在这里找到——如果你想和我讨论这篇文章中的任何信息,你可以在 LinkedIn 上联系我。
引用和免责声明
所有图片均根据知识共享署名-相同分享 3.0 未授权获得许可。
****Images*:*** *[1] Eeg beta* [Image]. (2005, December 22). Retrieved from [https://commons.wikimedia.org/wiki/File:Eeg_beta.svg](https://commons.wikimedia.org/wiki/File:Eeg_beta.svg)*[2] Eeg delta* [Image]. (2005, December 22). Retrieved from [https://commons.wikimedia.org/wiki/File:Eeg_delta.svg](https://commons.wikimedia.org/wiki/File:Eeg_delta.svg)*[3] Fourier series for trig poly high degree* [Image]. (2010, November 15). Retrieved from [https://commons.wikimedia.org/wiki/File:Fourier_series_for_trig_poly_high_degree.gif](https://commons.wikimedia.org/wiki/File:Fourier_series_for_trig_poly_high_degree.gif)*[4] Sleep Hypnogram* [Image]. (2011, December 20). Retrieved from [https://commons.wikimedia.org/wiki/File:Sleep_Hypnogram.svg](https://commons.wikimedia.org/wiki/File:Sleep_Hypnogram.svg)[5] *The Simple Harmonic Oscillator* [Image]. (n.d.). Retrieved July 21, 2018, from The University of Texas at Austin Department of Physics website: [https://web2.ph.utexas.edu%2F~coker2%2Findex.files%2Fsho3.html](https://web2.ph.utexas.edu%2F~coker2%2Findex.files%2Fsho3.html)**Web Pages:**
[6] HESSI Scientific Objectives. (n.d.). Retrieved July 21, 2018, from NASA website: [https://hesperia.gsfc.nasa.gov/hessi/objectives.htm](https://hesperia.gsfc.nasa.gov/hessi/objectives.htm)[7] The Seduction of a Sunny Day: How Weather Biases Car Buying Behavior. (2015, May 14). Retrieved July 22, 2018, from Association for Psychological Science website: [https://www.psychologicalscience.org/news/motr/the-seduction-of-a-sunny-day-how-weather-biases-car-buying-behavior.html](https://www.psychologicalscience.org/news/motr/the-seduction-of-a-sunny-day-how-weather-biases-car-buying-behavior.html)[8] [Solar cycles]. (n.d.). Retrieved July 21, 2018, from NASA StarChild website: [https://starchild.gsfc.nasa.gov/docs/StarChild/questions/question17.html](https://starchild.gsfc.nasa.gov/docs/StarChild/questions/question17.html)[9] Williams, L. (2015, February 2). What's in a Baby's Name? The Cyclical Trends and Spread of Unusual Names. Retrieved July 22, 2018, from Independent website: [https://www.independent.co.uk/life-style/health-and-families/features/baby-names-the-most-popular-cyclical-trends-and-spread-of-unusual-names-10018000.html](https://www.independent.co.uk/life-style/health-and-families/features/baby-names-the-most-popular-cyclical-trends-and-spread-of-unusual-names-10018000.html)[10] Wilson, C. (2014, May 11). How Popular Will Your Name Be in 25 Years? Retrieved July 22, 2018, from TIME website: [http://time.com/93911/baby-name-predictor/](http://time.com/93911/baby-name-predictor/)**Reviewed and Published Datasets:** [11] Kaggle. (2017). *US Baby Names* [data file]. Retrieved from [https://www.kaggle.com/kaggle/us-baby-names/home](https://www.kaggle.com/kaggle/us-baby-names/home)[12] Ko, James. (2018). *Gun Violence Data* [data file]. Retrieved from [https://www.kaggle.com/jameslko/gun-violence-data/home](https://www.kaggle.com/jameslko/gun-violence-data/home)[13] Opplysningsrådet for Veitrafikken AS, “dmi3kno”. (2018). New Car Sales in Norway [data file]. Retrieved from [https://www.kaggle.com/dmi3kno/newcarsalesnorway](https://www.kaggle.com/dmi3kno/newcarsalesnorway)[14] Samaha, Kheiralla. (2017). *Solar Flares from RHESSI Mission* [data file]. Retrieved from [https://www.kaggle.com/khsamaha/solar-flares-rhessi/home](https://www.kaggle.com/khsamaha/solar-flares-rhessi/home)**Scientific Papers:** [15] Geoffroy, P. A., & Amad, A. (2016). Seasonal Influence on Mass Shootings. *American Journal of Public Health*, *106*(5), e15\. [http://doi.org/10.2105/AJPH.2016.303065](http://doi.org/10.2105/AJPH.2016.303065)*
使用外部来源的所有数据和图像从未打算用于商业目的,也没有以任何方式修改。
WaveNet:谷歌助手的语音合成器。
Sundar Pichai, CEO of Google, presents improvements in Google Assistant’s Voice after WaveNet at the I/O conference on May 8, 2018 in Mountain View, California.
有没有想过机器合成人类声音的可能性,听起来几乎像人类一样自然?WaveNet 使之成为可能。
语音合成。串联的。参数化。DL。
让机器合成类似人类的语音(文本到语音)的想法由来已久。在深度学习出现之前,有两种主要的方法来构建语音合成系统,即拼接和参数化。
*在拼接 TTS 中,其思想是从说话者那里收集一长串句子的语音记录,将这些记录分割成单元,并尝试将对应于新呈现文本的单元拼接起来,以产生其语音。*由拼接 TTS 产生的语音对于已经存在于原始收集的录音中的文本部分来说听起来很自然,但是对于以前没有见过的文本部分来说,听起来有点失真。除此之外,修改声音将需要我们在一个全新的录音集合上完成所有这些工作。*而在参数化 TTS 中,想法是使用参数化物理模型(本质上是函数)来模拟人类的声道,并使用记录的语音来调整这些参数。*参数化 TTS 合成的语音听起来比拼接 TTS 更不自然,但通过调整模型中的某些参数来修改语音更容易。
最近,随着 WaveNet 的到来,我们有可能以端到端的方式(从音频记录本身)生成原始音频样本,轻松修改语音,更重要的是,与现有方法相比,听起来明显更自然。这一切都要归功于深度学习的出现。
WaveNet。为什么这么激动?
为了在 WaveNet 和现有的语音合成方法之间进行比较,进行了主观的 5 级 平均意见得分(MOS)测试。在 MOS 测试中,向受试者(人类)呈现从任一语音合成系统生成的语音样本,并要求他们以五分制评分(1:差,2:差,3:一般,4:好,5:优秀)对语音样本的自然度进行评级。
Subjective 5-scale mean opinion scores of speech samples from LSTM-RNN-based statistical Parametric, HMM-driven unit selection Concatenative, and WaveNet-based speech synthesizers.
从条形图中可以清楚地看到,WaveNet 在 5 级 MOS 测试中获得了 4.0 以上的自然度,明显优于其他基线系统,非常接近真实的人类语音。务必在 DeepMind 的博客上查看语音样本,以了解这些方法合成的语音在自然度上的差异!除了能够生成音频样本作为输出, WaveNet 可以很容易地根据各种语音特征,如文本,说话人身份等,以产生符合我们要求的语音。这才是更令人兴奋的地方。
Wavenet。生成模型。
生成模型。那是什么?*给定一般的未标记数据点,生成模型试图学习什么概率分布生成那些数据点,目的是通过利用学习到的分布生成新的数据点(类似于输入数据点)。生成模型可以以不同的方式对概率分布建模,隐式地(具有易处理的或近似的密度)或显式地。*当我们说生成模型显式地模拟概率分布时,我们的意思是我们显式地定义概率分布,并尝试根据输入的未标记数据点来调整该分布。与此相反,隐式生成模型学习概率分布,该概率分布可以直接用于采样新的数据点,而不需要显式定义它。GANs(生成对抗网络)是目前深度学习的圣杯,属于隐式生成模型的范畴。而 WaveNet 及其同类 Pixel CNN/RNNs 是显式生成模型。
WaveNet 如何对概率分布进行显式建模? WaveNet 试图将数据流 X 的联合概率分布建模为流中每个元素 Xt *的逐元素条件分布的乘积。*因此对于一个原始音频波形 X = {X1,X2,X3 … XT}, 联合概率因式分解如下:
因此,每个音频样本 Xt 以所有先前时间步的样本为条件。这看起来是不是类似于时间序列预测模型,其中一个时间步长的观测值取决于之前时间步长的观测值(这就是我们试图使用这些条件分布项建模的内容)?其实 WaveNet 是一个自回归模型。
我们应该如何继续对这些条件分布项建模?作为强大的非线性序列模型,RNNs 或 LSTMs 是最明显的选择。实际上,像素 RNN 利用相同的想法来生成看起来类似于输入图像的合成图像。我们可以用这个想法来产生合成语音吗?语音采样频率至少为 16KHz,这意味着每秒钟至少有 16000 个样本。rnn 或 LSTMs 不能模拟如此长的(大约 10,000 个时间步长的)时间相关性,因为它们最多可以模拟 100 个时间步长的时间相关性,因此它们不太适合语音合成。 *此外,训练 rnn、LSTMs 将会非常慢,因为由于它们固有的顺序性质,它们不能被并行化。*我们可以用 CNN 来处理这个问题吗?等等,CNN?怎么会?类似于像素 CNN 中已经采用的想法。
CNN。因果关系。扩张了。
我们为什么要尝试 CNN?*与 rnn 或 LSTMs 相比,CNN 通常训练得更快,尤其是当应用于长的 1-D 序列时,因为与掩模或滤波器的每个卷积位置相关的操作可以以并行和独立的方式执行。*更快的训练。听起来不错!自回归(一个时间步长的输出仅依赖于先前时间步长的输出,而不依赖于未来时间步长的输出)属性如何?这就是因果卷积发挥作用的地方。 *1-D 因果卷积可以通过用适当数量的零对要执行卷积的输入 1-D 序列进行左填充,然后执行有效的卷积来容易地实现。*与 RNNs 或 LSTMs 相比,因果卷积将允许我们对更长的时间依赖性进行建模(允许我们指定回看长度)。
Causal Convolutions to make sure that the model cannot violate the ordering in which we model the data.
太好了!我们已经轻松地解决了自回归违规。但是,如何管理数千个样本的订单的回顾长度呢(因此,我们的模型在得出关于当前时间步长的输出的结论之前,至少要回顾一秒钟的音频)?我想到的最简单的事情就是将滤波器的尺寸增加到足够大,以使回看长度适当,但这真的有帮助吗?在我看来,这样做将减少模型的非线性,这反过来将使我们的模型难以学习复杂的时间依赖性,从而限制我们模型的性能。你可能想到的下一件事是增加神经网络的层数。可能会有帮助。但是,这在计算上是不可行的,因为感受野的大小或输出中时间步长的回望长度随着模型中隐藏层的数量而线性增加,并且对于我们来说,具有几千个隐藏层的模型在计算上是不明智的。现在,我们不得不限制隐藏层的数量和过滤器的大小,同时增加回看长度?我们将如何着手做这件事?扩张的脑回会帮助我们。
扩张卷积试图通过在大于其长度的区域上应用过滤器并以一定的步长跳过输入值来增加回望长度或感受野大小。它相当于从原始滤波器通过用零扩展而得到的更大滤波器的卷积,但效率明显更高。在 WaveNet 中,多个扩大的卷积层一层一层堆叠起来,只有几层就有非常大的感受野。扩张因子的指数增加(加倍)导致感受野随深度的指数增长。
Stack of dilated causal convolutional layers: Doubling the dilation factor with each layer results in O(2^n) receptive field growth.
Softmax 分布。Mu-law 压扩。
*为了对条件概率建模,WaveNet 采用 softmax(分类)分布而不是其他混合模型,因为分类分布更灵活,并且可以更容易地对任意分布建模,因为它不对它们的形状进行假设。*原始音频通常存储为一系列 16 位整数值(32,768 至 32,767),使用 softmax 层输出概率分布将要求我们的模型在每个时间步长输出 65,535 个值。这不是会拖慢我们的模型吗?肯定会的。对此我们能做些什么?减少位深度在这里是可行的。如果我们继续使用线性位深度(除以 256 ),减少将对低振幅样本产生比高振幅样本更大的影响。假设一个 16 位样本的原始值为 32767,这是可能的最大正值。转换为 8 位后,样本值变为 127 (32767/256 = 127,余数为 255),舍入误差为 255/32768。这是小于 1%的量化误差。但与最低幅度 16 位样本(0 至 255 之间)的误差相比。当减少到比特深度 8 时,它们都舍入到零,这是 100%的误差。*关键在于,对于线性位深度缩减方法,向下舍入对低振幅样本的影响比对高振幅样本的影响更大。*如果我们能够重新分配样本值,使得在较低幅度处有更多的量化级别,而在较高幅度处有更少的量化级别,则可以减少这种量化误差。这就是为什么在 WaveNet 中使用 Mu-law 压扩(一种非线性量化)而不是简单的线性量化。
Expression to carry out Mu-law companding results in a better (sounds similar to original audio) reconstructed output than linear quantization.
在上面的表达式中,1 < Xt < 1(从 32,768…32,767 到 1…1 重新采样的不同时间步长的音频采样)和= 255。这将使模型在每个时间步只输出 256 个值,而不是 65,535 个值,从而加快训练和推理。
门控激活。跳过和剩余连接。
非线性激活函数在任何深度学习模型中都是必不可少的,以学习输出和输入之间的复杂关系。 RELU 最初在 WaveNet 中使用,但在进行实验后,发现具有 sigmoid 激活的非线性双曲正切门控(受 Pixel CNN 启发)更适合 WaveNet。
Expression for gated activation function used in WaveNet.
在上面的表达式中, W 表示可学习的滤波器, ******* 表示卷积算子,圈起来的点表示逐元素的乘法。*剩余连接(将底层的输出添加到上层的输出)和跳过连接(将底层的输出直接添加到输出层)已被发现在减少神经网络的收敛时间和训练更深的网络方面是有用的。*因此,在 WaveNet 的架构中采用了它们,如下图所示。
WaveNet’s architecture: showing gated activation function, skip connections and residual connections.
调理。本地的。全球。
我们还没有讨论如何根据各种特征,如说话者身份、相应的文本等来调节输出语音。 *WaveNet 的输出语音可以以两种方式进行调节:全局调节,单个特征偏置所有时间步长的输出,如说话人身份或局部调节,具有多个特征,实际上是不同时间序列的特征,其偏置不同时间步长的输出,如语音的底层文本。*如果我们更正式地表达这一点,那么这将意味着在实际模型中的条件分布项中引入新的参数(局部调节中的 Ht 和全局调节中的 H )。
Modified conditional distribution term, after introduction of a conditioning input.
在局部调节中,调节输入的时间序列可能比音频的时间序列长度短,对于局部调节,要求两个时间序列的长度必须相同。为了匹配长度,我们可以使用转置 CNN(一种可学习的上采样方案)或其他上采样方案来增加条件输入的长度。
Expression after introduction of the bias term h.
在上面的表达式中, V 是可学习的线性投影,其本质上服务于两个目的:变换以校正尺寸和学习用于偏置输出的正确权重。
很棒的模型。快速训练。推理慢?
*WaveNet 的架构,无论我们到目前为止谈论了什么,都很好地捕捉了复杂的时间依赖性和条件。除此之外,由于高度并行化,它在训练时真的很快。但是推论呢?*由于一个时间步长的输出依赖于前一个时间步长的输出,因此对新音频的采样本质上是连续的。产生 1 秒钟的输出大约需要 1 分钟的 GPU 时间。如果谷歌在他们的助手上部署了这种模式,那么像“嘿,谷歌!天气怎么样?”。那他们是如何提高推断时间的呢?IAF 就是答案。
使流量正常化。IAF。
正常化流程?标准化流程是一系列转换,它学习从简单概率密度(如高斯分布)到丰富复杂分布的映射(双射)。假设你从概率分布 q(z) 和概率分布 q(x) 中采样了足够多的点,那么可以使用归一化流来学习变换,该变换将从【q(x)中采样的点映射到其在分布 q(z) 中的对应映射。这是怎么做到的?让我们考虑一个变换 f ,一个可逆且平滑的映射。如果我们用这种映射来变换一个随机变量*【q(z),那么得到的随机变量【z’*= f(z)有一个分布【q(z’:
为了直观地了解我们是如何得到这个变换后的随机变量分布的表达式的,请查看 Eric Jang 的博客文章。一次变身 f 够吗?事实上,我们可以通过组合几个简单的变换,并连续应用上述表达式来构造任意复杂的密度。通过一系列变换 fk 连续变换一个随机变量z0Q0得到的密度 qK(z) 为:**
这些变换 fi 的 中的每一个都可以容易地使用矩阵乘法(具有可学习的值)来建模,之后是诸如 ReLU 的非线性。然后,想法是用您最喜欢的优化算法更新变换的可学习参数,通过在变换的概率分布 qK(z)下优化从【q(x)采样的点的似然性(对数似然性)。 这将使分布与 q(x) 非常相似,从而学习从 q(z) 到 q(x) 的适当映射。
Distribution flows through a sequence of invertible transforms.
规范化流程的想法如何帮助我们进行快速推理?请记住,WaveNet 是一个生成模型,除了尝试学习会产生训练数据的概率分布之外什么也不做,因为它是一个显式定义的生成模型(具有易处理的密度),所以我们可以很容易地学习一个变换,该变换可以将点从简单分布(如高斯分布)映射到 WaveNet 学习的复杂分类分布。如果学习到的标准化流程具有快速推理方案,那么我们在 WaveNet 中的慢速推理问题可以很容易地得到解决。IAF(逆自回归流)可以很好的适合这个思路。
在 IAF 中,想法是首先从z∞Logistic(0,I)** 中抽取随机样本,然后对抽取的样本应用以下变换,**
A simple scale and shift transform on zt where scaling factor (s) and shifting factor (µ) are computed by using learnable parameters (θ) and values in input sample z from previous time-steps.
为了输出时间步长 xt 的正确分布,逆自回归流可以隐式地推断它在先前时间步长 x1,.。。,XT 1基于噪声输入 z1,.。。,ZT 1,允许其并行输出所有 xt 给定的 zt 。下图会让事情变得更清楚(注意变化的符号)。
In Inverse Autoregressive Flow, outputs at different time-steps can be computed in parallel because the output of a time-step isn’t dependent on the output of previous time steps.
太好了!IAF 具有快速推理方案(甚至可以并行计算易处理的条件概率),但是它们训练起来较慢。为什么?因为如果给我们一个新的数据点,并要求我们评估密度,我们需要恢复,这个过程本来就是连续的,速度很慢。并行 WaveNet 利用了这一事实,提出了使用简单 WaveNet(教师 WaveNet)训练 IAF(学生 WaveNet)的概念。**
平行。更快。WaveNet。
在并行 WaveNet 中,想法是利用 IAF 具有快速推理方案的事实。因此,在第一阶段,我们训练出一个简单的 WaveNet 模型(我们称之为教师培训)。在第二阶段,我们冻结教师 WaveNet 的权重,并利用它来训练一个 IAF(学生蒸馏)。其思想是首先从z∞Logistic(0,I)*** 中抽取一个随机样本,以并行方式通过 IAF。这将为我们提供转换分布的要点以及相关的条件概率。想法是在简单的教师波网上传递变换分布中的这个点,这将产生关于已经训练的教师波网的条件概率。然后,我们尝试最小化从任一模型接收的条件概率之间的 KL-散度。这将允许 IAF(学生 WaveNet)学习与其教师几乎相似的概率分布,并且结果验证了这一事实,因为从教师和学生 WaveNet 接收的输出之间的 5-标度 MOS 分数几乎可以忽略不计。***
Parallel WaveNet’s training procedure.
**这样部署够快吗?是的,它是。事实上,它能够以超过实时 20 倍的速度生成语音样本。但是还有一个问题,每次我们需要重新训练我们的模型时,我们会先训练老师的 WaveNet,然后再训练学生的 WaveNet。此外,学生 WaveNet 的表现在很大程度上取决于教师 WaveNet 的培训程度。但总的来说,去部署还是不错的。
“空谈是廉价的。给我看看代码。”
在线上有许多简单 WaveNet 的实现。对于并行实现,我还没有找到一个。
- 在 Keras 中实施
- py torch 中的实现
- tensor flow 中的实现(这是网上引用最多的一个)
参考资料:
- 音频压缩扩展。
- NLP 任务中的卷积层。
- 扩张的脑回。
- 规范流程:Eric Jang 的教程- 第 1 部分,第 2 部分。变分推理与规范化流程(论文)。
- 深度语音:实时神经文本到语音转换(Paper) :附录对于理解 WaveNet 相当有用。
- wave net:raw 音频(纸张)的生成模型。
- P 平行波网:快速高保真语音合成(论文)。
- PixelCNN,Wavenet &变分自动编码器—圣地亚哥 Pascual — UPC 2017。
检测和移除异常值的方法
Unsplash — A small lone mushroom on moss
在从事数据科学项目时,你在寻找什么?EDA 阶段最重要的部分是什么?有些事情如果不在 EDA 阶段完成,会影响进一步的统计/机器学习建模。其中之一就是寻找“离群值”。在这篇文章中,我们将试着理解什么是离群值?为什么识别异常值很重要?有哪些剔除异常值的方法?不要担心,我们不会只讨论理论部分,我们还会对数据进行编码和绘图。
遇见异数
维基百科的定义,
在统计学中,异常值是指远离其他观察值的观察点。
上述定义表明,离群值是与人群分离/不同的东西。很多激励视频建议与众不同,尤其是马尔科姆·格拉德威尔。从统计学的角度来看,这是否也是一件好事?我们将通过这篇文章找到答案。
数据收集和异常值
我们现在知道什么是异常值,但是,您是否也想知道异常值是如何引入到人群中的?
数据科学项目从收集数据开始,这也是离群值首次引入人群的时候。但是,在收集阶段,您根本不知道异常值。异常值可能是数据收集过程中出现错误的结果,也可能只是数据中出现偏差的迹象。
让我们来看一些例子。假设你被要求观察印度板球队的表现,即每个球员的跑动并收集数据。
Collected data
从上面收集的数据可以看出,除了 10 分的 Player3,其他玩家都是 300+。这个数字可能只是一个键入的错误,或者它显示了你的数据中的差异,表明 Player3 表现非常差,因此需要改进。
现在我们知道异常值可能是一个错误或者仅仅是一个方差,你将如何决定它们是否重要。如果它们是错误的结果,那就很简单了,我们可以忽略它们,但是如果它只是数据中的一个差异,我们就需要想得更远一些。在我们试图理解是否忽略离群值之前,我们需要知道识别它们的方法。
寻找异常值
你们大多数人可能会想,哦!我只需要一个峰值数据就可以找到异常值,就像我们在前面提到的 cricket 例子中所做的那样。让我们考虑一个有 500+列和 10k+行的文件,你还认为可以手工找到离群值吗?为了便于发现异常值,我们有大量的统计方法,但我们将只讨论其中的几个。大多数情况下,我们会试图看到可视化方法(最简单的方法)而不是数学方法。
那么,让我们开始吧。我们将使用包含在 sklearn 数据集 API 中的波士顿房价数据集。我们将加载数据集,并分离出特征和目标。
boston = load_boston()
x = boston.data
y = boston.target
columns = boston.feature_names#create the dataframe
boston_df = pd.DataFrame(boston.data)
boston_df.columns = columns
boston_df.head()
Boston Housing Data
特征/独立变量将用于寻找任何异常值。看上面的数据,似乎我们只有数值,也就是说,我们不需要做任何数据格式化。(叹气!)
我们将遵循两种类型的分析来发现异常值-单变量(单变量异常值分析)和多变量(两个或多个变量异常值分析)。不要搞混了,当你开始编码和绘制数据时,你会发现发现异常值是多么容易。为了简单起见,我们将从检测异常值的基本方法开始,然后慢慢转向高级方法。
使用可视化工具发现异常值
盒子剧情-
维基百科的定义,
在描述统计学中,箱线图是一种通过四分位数图形化描述数字数据组的方法。盒状图也可以有从盒状图垂直延伸的线(须状图 ) 表示上下四分位数之外的 可变性,因此有盒须图和盒须图之称。异常值可能被标绘为单个点。
上述定义表明,如果有一个异常值,它将被绘制为箱线图中的点,但其他群体将被分组在一起,并显示为方框。让我们自己试试看。
import seaborn as sns
sns.boxplot(x=boston_df['DIS'])
Boxplot — Distance to Employment Center
上图显示了 10 到 12 之间的三个点,这些是异常值,因为没有包括在其他观察值的框中,即没有靠近四分位数的地方。
这里我们分析了单变量异常值,即我们仅使用 DIS 列来检查异常值。但是我们也可以做多元异常分析。我们能用箱线图做多元分析吗?视情况而定,如果您有一个分类值,那么您可以将它用于任何连续变量,并进行多元异常值分析。由于我们在波士顿住房数据集中没有分类值,我们可能需要忘记使用箱线图进行多元异常值分析。
散点图-
维基百科定义
散点图,是一种使用笛卡尔坐标显示一组数据的典型两个变量的值的图表或数学图。数据显示为点的集合,每个点具有确定水平轴上位置的变量的值和确定垂直轴上位置的其他变量的值。****
顾名思义,散点图是显示两个变量的值的点的集合。我们可以试着从我们的住房数据中画出两个变量的散点图。
fig, ax = plt.subplots(figsize=(16,8))
ax.scatter(boston_df['INDUS'], boston_df['TAX'])
ax.set_xlabel('Proportion of non-retail business acres per town')
ax.set_ylabel('Full-value property-tax rate per $10,000')
plt.show()
Scatter plot — Proportion of non-retail business acres per town v/s Full value property tax
看上面的图,我们可以发现大部分数据点位于左下角,但也有一些点远离人群,如右上角。
用数学函数发现异常值
Z 值-
维基百科定义
Z 值是一个观察值或数据点高于所观察或测量的平均值的标准偏差的有符号数。
Z-score 背后的直觉是通过找到它们与数据点组的标准差和均值的关系来描述任何数据点。Z-score 是寻找平均值为 0 且标准差为 1 的数据分布,即正态分布。
您一定想知道,这对识别异常值有什么帮助?嗯,在计算 Z 分数时,我们重新调整数据的比例并将其居中,寻找离零太远的数据点。这些离零太远的数据点将被视为异常值。在大多数情况下,使用阈值 3 或-3,即如果 Z 分值分别大于或小于 3 或-3,则该数据点将被识别为异常值。
我们将使用 scipy 库中定义的 Z 分数函数来检测异常值。
from scipy import stats
import numpy as npz = np.abs(stats.zscore(boston_df))
print(z)
Z-score of Boston Housing Data
看看上面的代码和输出,很难说哪个数据点是异常值。让我们尝试定义一个阈值来识别异常值。
threshold = 3
print(np.where(z > 3))
这将产生如下结果-
Data points where Z-scores is greater than 3
不要被结果迷惑。第一个数组包含行号列表,第二个数组包含相应的列号,这意味着 z[55][1]的 Z 得分高于 3。
print(z[55][1])3.375038763517309
因此,ZN 列上的数据点—第 55 条记录是异常值。
IQR 得分-
箱线图使用 IQR 方法来显示数据和异常值(数据的形状),但为了获得已识别异常值的列表,我们需要使用数学公式并检索异常值数据。
维基百科定义
四分位数间距 ( IQR ),也称为中间分布或中间 50% ,或技术上的 H 分布,是统计离差的度量,等于第 75 个和第 25 个百分位数之间的差值,或上下四分位数之间的差值,IQR =Q3—Q1。
换句话说,IQR 是第三个四分位数减去第一个四分位数;这些四分位数可以在数据的箱线图上清楚地看到。
它是离差的一种度量,类似于标准差或方差,但对异常值更稳健。
在寻找数据的分布,然后保留一些阈值来识别异常值方面,IQR 有点类似于 Z-score。
让我们看看我们可以使用 IQR 来绘制箱线图,以及如何使用它来查找异常值列表,就像我们使用 Z 得分计算一样。首先我们将计算 IQR,
Q1 = boston_df_o1.quantile(0.25)
Q3 = boston_df_o1.quantile(0.75)
IQR = Q3 - Q1
print(IQR)
这里我们将得到每列的 IQR。
IQR for each column
现在我们有了 IQR 分数,是时候抓住异常值了。下面的代码将给出一个包含真值和假值的输出。False 表示这些值有效的数据点,而 True 表示存在异常值。
print(boston_df_o1 < (Q1 - 1.5 * IQR)) |(boston_df_o1 > (Q3 + 1.5 * IQR))
Detecting outlier with IQR
既然我们知道了如何检测异常值,那么了解它们是否需要被删除或纠正就很重要了。在下一节中,我们将考虑一些去除异常值的方法,如果需要,还可以输入新值。
使用异常值:更正,删除
在数据分析过程中,当您发现异常值时,最困难的决策之一可能是如何处理异常值。他们应该删除它们还是纠正它们?在讨论这个问题之前,我们先来看看去除异常值的几种方法。
Z 分数
在上一节中,我们看到了如何使用 Z 分数来检测异常值,但现在我们想要移除或过滤异常值并获得干净的数据。这可以用一行代码来完成,因为我们已经计算了 Z 值。
boston_df_o = boston_df_o[(z < 3).all(axis=1)]
With and without outlier size of the dataset
因此,上述代码从数据集中删除了大约 90+行,即离群值已被删除。
IQR 得分-
就像 Z-score 一样,我们可以使用之前计算的 IQR 分数,通过只保留有效值来过滤出异常值。
boston_df_out = boston_df_o1[~((boston_df_o1 < (Q1 - 1.5 * IQR)) |(boston_df_o1 > (Q3 + 1.5 * IQR))).any(axis=1)]boston_df_out.shape
上述代码将从数据集中删除离群值。
有多种方法可以检测和移除异常值但是我们在本练习中使用的方法被广泛使用并且易于理解。
是否应该移除异常值。每个数据分析师/数据科学家可能在他们处理的每个问题中都有一次这样的想法。我发现了一些很好的解释-
https://www . the analysis factor . com/outliers-to-drop-or-not-to-drop/
总结他们的解释-坏数据,错误的计算,这些可以被确定为异常值,应该被删除,但同时你可能也想纠正它们,因为它们改变了数据的级别,即意味着当你建模你的数据时会导致问题。前 5 名员工的工资分别是 10K、20K、30K、40K 和 50K,突然其中一人开始拿到 100K 的工资。考虑这种情况,因为你是雇主,新的工资更新可能会被视为有偏见的,你可能需要增加其他员工的工资,以保持平衡。因此,您可能有多种原因想要了解并纠正异常值。
摘要
在整个练习中,我们看到了在数据分析阶段如何遇到一些不寻常的数据,即异常值。我们了解了可以用来检测和消除这些异常值的技术。但是有一个问题是关于保证是否可以移除异常值。为了回答这些问题,我们找到了进一步的阅读材料(这些链接在前一节中提到过)。希望这篇文章能帮助读者了解异常值。
注意- 在本练习中,使用了以下工具和库。
框架- Jupyter 笔记本,语言- Python,库 - sklearn 库,Numpy,Panda 和 Scipy, Plot Lib- Seaborn 和 Matplot。
参考文献
改善地图可视化的方法
如何让地图可视化更上一层楼?
Photo by Joey Csunyo on Unsplash
首先,我将介绍为什么使用地图可视化数据通常会吸引观众的两个原因。然后,我将介绍三个技巧,帮助您在构建地图可视化时从优秀过渡到卓越。
为什么要使用地图进行数据可视化?
它将为你的数据提供重要的背景。
让我们从一个假设的场景开始。这是你工作的第一周,你的任务是向公司老板汇报每月的销售业绩。财务部的罗恩会把数据发给你,你会把一些幻灯片放在一起。应该是小菜一碟。如果你打开数据文件,只有一个数字呢?
就我个人而言,我希望财务部的罗恩对新员工开了一个有趣的玩笑。你知道我要去哪里吗?数据需要上下文才能为受众提供价值。销售额与上月相比是上升还是下降?谁是我们的顶级销售代表?销售收入如何与利润挂钩?不管你公司的老板有多好——如果这是你在会议上唯一带去的东西,那很可能不会有好结果。
还记得那些 五个 w吗?谁,什么,哪里,什么时候,为什么。这个列表是为了帮助记者们在构思故事之前弄清楚一个主题的重要背景。它之所以有效,是因为它们也是观众想知道的东西。从这个意义上说,做记者和用数据交流没有太大区别。在您构思数据故事之前,请尝试在地图上绘制数据。这样可以快速求解出在哪里。
从年轻时开始,我们都接触过地理概念。
数据可视化设计师 Ryan Sleeper 在他的书《实用的 Tableau》中写道,“地图的力量来自于它们固有的利用用户多年来构建的模式的能力。”
这是一个巨大的优势,因为观众可以快速理解地图可视化。理解可视化设计的努力越少,就越能专注于可视化中的数据所表达的内容。你解码第一张图片和第二张图片需要多长时间?
Visualization: Shelby Temple, made with Tableau; data: Tableau Sample Superstore
Visualization: Shelby Temple, made with Tableau; data: Tableau Sample Superstore
将地理学引入数据可视化还有很多原因,但我认为这足以证明这种类型的可视化有显著的优势。如前所述,让我们来看看如何让地图可视化更上一层楼的一些技巧。
1。使用绿色或岩浆色
当选择数据可视化的颜色时,我注意到人们经常选择最吸引他们的颜色。不幸的是,这不是最好的方法——因为对你有吸引力的可能对其他人没有吸引力。
数据可视化需要有最能引起观众共鸣的颜色。此外,它应该导致快速和准确的决策。使用某些调色板(如 Jet,Python 包 Matplotlib 的旧默认调色板)会导致决策速度变慢且不准确。
不用担心,Nathaniel Smith 和 Stefan van der Walt 已经创建了开放源代码调色板,这些调色板丰富多彩,漂亮,可供色盲观众使用,现在研究支持成为快速准确决策的有效调色板。
Visualization: Shelby Temple, made with Tableau; Inspired by work of Jacob Olsufka; Data: Temperature data from MarkieAnn Packer
Jet 的缺点是在感觉上不一致或对色盲不友好。根据颜色范围加热,容易洗掉。
如果你想了解更多关于色彩理论和绿色的发展,这个来自创作者的视频 既有娱乐性又有知识性。
此外,这里是 的一篇文章 ,Viridis 与其他常见调色板进行了测试,在速度和决策准确性方面表现良好。
快速感谢 Ben Jones,他的 Tweet 最初引起了我对这些调色板的注意。
2。使用六边形瓷砖网格图
Hex 平铺网格地图是最近创建的,作为对平铺网格地图的改进。创建平铺网格地图是为了处理一些问题,例如试图创建一幅美国与阿拉斯加和罗德岛的地图。阿拉斯加需要太多的视觉地产,而罗德岛经常迷路。在这里,我画出了各州平均龙卷风路径长度。
Visualization: Shelby Temple, made with Tableau; data: https://www.ncdc.noaa.gov/stormevents/
Visualization: Shelby Temple, made with Tableau; Inspired by work of Matt Chambers; data: https://www.ncdc.noaa.gov/stormevents/
这些地图很像美国的参议院,每个地区都有平等的(视觉)代表。罗德岛现在和阿拉斯加一样大,但是这个位置仍然让观众明白他们正在看美国的可视化地图。
六边形栅格地图通过允许相同距离的更多相邻形状而改进了平铺地图。距正方形瓷砖中心的距离仅在上、下、左和右是相同的。对角方块的中心距离更远。在六边形栅格地图中,您可以将更多的图块放在一起,从而提高地图的方向准确性。
我通过 Matt Chambers ( ,他在 Tableau )到 2015 年在 NPR 从事数据新闻工作的 Danny DeBellus、Alyson Hurt 和 Brian Boyer,追踪了作为数据可视化的 hex grid map 的创建。这里是 那条 。
3。去掉边框,增加密度
国家、州、城市和邮政编码非常有用,因为它们提供了一种一致的分层方式来按地理位置浏览数据。
然而,许多空间现象并不局限于这些人为的边界。一个入室抢劫犯会不会走到一个邮政编码的边界,耸耸肩,然后说,“哎呀!我猜是时候转身了。”—可能不会。
像强盗一样,龙卷风也不在乎邮政编码。这使得它成为密度热图的绝佳候选。
Visualization: Shelby Temple, made with Tableau; data: https://www.ncdc.noaa.gov/stormevents/
密度图通过聚类来可视化数据。这允许对任何新兴模式的真正理解,因为它们不局限于想象中的人为边界。
我看到这个问题发生的一个常见例子是按州查看数据。圣路易斯位于伊利诺伊州和密苏里州的交界处。按州查看您的数据会将这个大都市切成两半,该区域的任何模式或趋势都可能丢失。
结论
这些是我最喜欢的改进地图的方法。如果你正在寻找更多,我建议检查一下使用距离或半径过滤器 和 归一化人口数据 。
留给你最后一张可以欣赏的地图!
我们是美国
谁组成了我们这个国家?
“American flag” by Thomas Ashlock on Unsplash
我偶然看到这篇关于如何在 R 中创建点密度图的教程帖子,它非常详细,所以我决定用美国人口普查数据试一试。每年都要收集全国的人口构成数据。在这里,我使用在县一级收集的特定种族和民族的人口普查估计数。所有提取和绘制数据的代码都贴在这里。
本教程提供了一些将县估计值转换为点数据的函数。在收集数据并转换成点之后,使用 ggplot2 对其进行映射就非常简单了。
按种族和民族划分的美国人口地理分布
我错误判断了最终会得到的数据点的数量,所以地图有点拥挤。然后,我认为这作为一个互动的情节会更好,并决定我将创建一个闪亮的应用程序——尽管这被证明是一个令人沮丧的过程。所以,我选择了画面…是的,我知道你在想什么:
在我的辩护中,我以前从未建立过一个闪亮的应用程序,我会用一个更简单的项目再试一次。Tableau 相对简单,但需要一些数据准备。在连接到仪表板之前,我必须将点数据提取到 shapefile 中,然后在 QGIS 中编辑该文件(必须删除夏威夷和阿拉斯加)。
当我写这篇文章的时候,我知道你不能在媒体中嵌入画面。这里可以找到互动剧情。
更好的是,我留给你这个…
我们是拼贴
“Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks” Published in ICCV 2017
达达、Instagram 和人工智能的未来
拼贴是当下的语言,但已经有 100 多年了。让我们来看看它从哪里来(达达),它现在怎么样(Instagram),以及为什么它对人工智能的未来不可或缺(深度假货,GANS 和根深蒂固的副本)。
昨天:达达
虽然最简单形式的剪切和粘贴技术可以追溯到公元前 200 年左右中国发明纸张的时候,但是直到 20 世纪初现代主义的早期阶段,艺术家们采用大规模生产的印刷媒体作为材料,拼贴才成为一种不可或缺的交流方式。入场,舞台左边汉娜·霍奇。
Hannah Höch, Da-Dandy, 1919
霍赫是一位德国达达主义者,在两次大战之间的威玛时期一直工作到二战结束。她的作品对魏玛政府的失败、她那个时代的社会约束和对女性角色的规定,以及日益泛滥的流行文化进行了超现实主义的探索。在一段支离破碎、混乱不堪的时间里,霍奇用时尚杂志、报纸和照片的碎片来构建她的作品,声称“绘画拼贴的材料没有限制——首先,它们可以在摄影中找到,也可以在文字和印刷品中找到,甚至可以在废品中找到。”(1)她的作品拥抱矛盾,揉合了当时的性别、种族、政治和物质紧张关系,包括一头扎进今天仍然普遍存在的艺术与工艺部落主义。
“[刺绣]是一种艺术,应该像艺术一样对待……你们,女工匠,现代女性,你们觉得你们的精神在你们的作品中,你们决心要求你们的权利(经济和道德),你们相信你们的脚在现实中牢牢地扎根,至少你们应该知道你们的刺绣作品是你们自己时代的记录。”
—汉娜·霍奇,刺绣和蕾丝,1918 年
Hannah Höch, Untitled (Large hand over woman’s head), 1930
但是霍奇,这也是我选择和她一起开始的原因之一,她不仅粉碎了这些珍贵的印刷材料,她还制作了它们。十多年来,正如 Artsy.net 的 Madeleine Boucher 所写的,“白天,hoch 为女性爱好期刊和插图日报设计刺绣图案,而到了晚上,她就在自己的作品中把这些图像撕成碎片。她的作品经常猛烈抨击那些杂志重新包装并作为时尚推广的女性和美化家庭生活的理想。(2)
拼贴重视这种与无所不在的文化材料的双重关系,但这种立场是一把双刃剑。《拼贴文化》(Collage Culture)的作者大卫·巴纳什(David Banash)认为,使用现成的组件是 20 世纪艺术创作的核心,因为尽管它凸显了“不可避免的消费文化的可能性和局限性”,并且“有能力批评[它的]意识形态”,但拼贴也“依赖于消费文化的材料,并且毫不夸张地重现了大规模生产和消费的确切过程。”(3)
所有物质形式的拼贴美学不仅有助于激发现代主义,它还通过后现代主义和超越后现代主义获得了巨大的文化相关性。让我们快速回顾一下这段历史,这样我们就能在这些概念和时期上达成共识。
时代有点像刻板的青少年拒绝他们父母的方式。现代主义需要启蒙运动来对抗。大约从 1620 年到 1800 年的启蒙运动,主要描述了发生在欧洲的早期科学和反君主制活动。开始于 19 世纪晚期的现代主义,拒绝了启蒙运动的确定性和还原论。二战后出现的后现代主义抛弃了现代主义的客观性和普遍性。今天,在一个我喜欢称之为过渡时代的时期,我们正在抛弃后现代主义的讽刺和无所不能的态度。
在考虑“后现代主义”之后的新时代的名字时,人们发现前缀“trans”以一种特殊的方式突出出来。20 世纪的后三分之一是在“后”的标志下发展起来的,这标志着“真实”、“客观”、“原创”、“真诚”等现代性概念的消亡,所有这些概念现在都以“跨主体性”、“跨原创”、“跨抒情”、“跨感伤”等形式获得新生
米哈伊尔·爱泼斯坦,俄罗斯文学批评家,后现代主义在后现代性中的地位(4)
在所有这些剧变中,拼贴以其对混合、界限和交叉的专注,成为艺术和交流的重要而持久的工具。“好吧,好吧,所以拼贴是伟大和有用的,有这整个血统或什么的。你想说什么?你答应了迷因和 AI!”
今日:Instagram
Instagram Story post by the author
因此,尽管生产者-消费者混合体诞生于照片拼贴的熔炉中,但在过去的 100 年里,它已经进入了社会、政治和艺术生活的每一个角落。甚至写作这件作品的过程也是由拼贴美学促成的。我正在从网上资源中剪辑引文,即时重组我的文字,并将产品粘贴到发布平台上。想想嘻哈和采样,想想傲慢与偏见和僵尸,想想励志演讲 supercuts ,想想你参与过的每一个 meme,想想社交媒体平台界面设计与开发。
如果这是一个播客,我会在这里插入录音草稿。
因为不仅仅是我们用来在 Instagram 上宣传我们的虚拟形象的图像,甚至是应用程序中提供的具有剪切粘贴美学的功能和界面,而是用来制作软件本身的技术。Instagram 最初是一个相当简单的照片源,但直到它开始直接复制粘贴其竞争对手 Snapchat 的功能后才火了起来。发送给个人或朋友群体的消失的照片和视频,后来成为公开的“故事”,面部滤镜和动画贴纸装饰都源于 Snapchat。(5)
这并不一定是对 Instagram 设计实践的价值判断,(我对他们有意包含习惯形成功能的选择非常不满,但不是对竞争对手的复制),而是旨在指出拼贴是当今所有技术交流规模的组成部分。不仅仅是大型平台从其他地方获取零碎的东西来构建自己。如今的软件开发从来都不是从空白的画布开始的。几乎总是有一个库、API 或组件系统被 zee interonets 或内部遗留代码窃取。当然,是的,也许我延伸了拼贴的概念,远远超出了它最初的含义,但事实证明语言是由使用它的人创造的。离开我的烟雾弥漫的人行道语言警察!(当我写这篇文章时,营火仍在燃烧。今天旧金山的空气质量指数是 265。)
就像进化不能从现有的身体形式直接跳到完美的理想状态,而是必须盲目地穿过错综复杂的微小突变一样,技术变革也倾向于逐步改进。但是后来,我们发明了一种叫做基因工程的东西,它使得基因结构发生了巨大的变化,这种变化仅仅通过进化是不可能的。**拼贴是技术创新的基因工程。**就像在不同的人群中工作一样,拼贴将他们不同的背景和思维方式重新组合成更广泛的可能结果,通过接触不同来源和类型的材料,拼贴扩展了可能创造的边界
我在 SAP、Y-Combinator Research 和现在的微软专门从事的基于艺术的技术探索研究,这种研究风格严重依赖拼贴作为一种探究技术。基于艺术的研究试图跳到遥远的、不稳定的、目前通常不可行的睡莲叶子上,而不是专注于渐进的改进,以拓宽我们创新途径的菜单。拼贴是一种技能,一种艺术,也是未来人工智能民主化的关键。
明天:艾
纽约现代艺术博物馆的前馆长劳拉·霍普特曼说,拼贴让我们“同时体验信息……就像一朵水平的云。”(6)对今天的人工智能来说,这似乎是一个恰当的描述:工具本质上允许我们通过浓缩和表现来把握我们不断增长的信息海洋。人工智能是大规模的拼贴。它的预测和世代是人类知识的集合,如癌症筛查的标签集,以及物质文化,如图像的宝库,切碎成大量的值,仔细检查并重组为新的知识和材料。
随着人工智能变得越来越普遍,它将变得类似于霍赫时代的那些业余爱好期刊和插图日报,就像今天的 gif 和 memes 一样,本身也受到材料重组的影响。这已经发生了。以谷歌大脑研究员伊恩·古德菲勒(7)于 2016 年提出的生殖对抗网络为例。**甘的算法是两种已经存在的算法的拼贴。**这是一种用于从一组原始声音中创建新版本的技术,例如从人类语音库中创建人工声音,或者从一组人脸中创建新的人脸。把甘想成一个很有耐心的艺术家,一个很有眼光的买家。这位艺术家被委托画一幅肖像,并得到了一大堆原始资料。艺术家每完成一幅画像,买家就会给他们打分。起初,这是一个非常糟糕的分数,但很快,在经过一百万次尝试后,分数变得更好(不完美,但非常接近,头发和虹膜仍然很难)。
Image Source: NVIDIA via NYT
Image Source: NVIDIA via NYT
Image Source: NVIDIA via NYT
现在,因为我们在谈论人工智能,我们必须记住,无论是“艺术家”还是“购买者”都不知道什么是脸,甚至什么是图像。两者都将像素颜色分解成数值数组,然后进行统计比较并进行调整。一个 AI,至少按照目前的定义,是无法理解设置给它的问题的。它只能非常快速地聚合成千上万个“数据化”的人类行为,比如给一幅图像贴标签,或者为它提供的集合创建统计上相似的示例,比如创建一幅图像。癌症筛查人工智能可能比任何一个医生都更容易做到,但这不是因为它“更聪明”,而是因为它使用了数千名医生的知识。(我是不是把这些成堆的微积分工作原理过于简单化了?是的。网上至少有 1 万亿篇文章可以教你基础知识。往前走!)
现在 Goodfellow 是一个超级专家,目前这是制作一个好的人工智能拼贴画所需要的。但是,如果不把我们所有的努力集中在创造更容易的方式让人们编写他们自己版本的人工智能(生成器,分类器,异常检测器等)上,会怎么样呢?),相反,我们促进广泛的人工智能拼贴。**胶水!剪刀!工具丰富!**为了让大量的人,每个人,面包店老板,数字艺术家,中学生,能够制作有用的和有意义的人工智能,我们不应该只专注于让编码小说模型更加平易近人的方法。拼贴的血统向我们展示了这样一种界面,它可以访问现有的人工智能算法,并让人们以奇怪和反直觉的方式重新组合它们,这将导致谁在创造人工智能,以及它被要求做什么有趣、怪异甚至可能是革命性的事情。这就是我们如何通过自动化来避免混淆。**这就是我们如何深度伪造迷因战争。**这就是我们取胜的方式!
哇哦。原来美术技能就像…有用?谁想到它…
支持
感谢杰伦·拉尼尔和微软一直以来的支持和指导。
笔记
- 汉娜·霍赫,“拼贴,”在汉娜·霍赫,编辑。道恩·阿德斯,丹尼尔·赫尔曼(伦敦:白教堂画廊,2014 年)
- 马德琳·鲍彻,“艺术还是工艺?:汉娜·霍奇的拼贴画拥抱了艺术与工艺、达达与商业主义之间的冲突”,artsy.net,2014 年 10 月 14 日出版,2018 年 11 月 12 日访问,https://www . artsy . net/article/madeleineb-Art-or-Craft-Hannah-hochs-Collages-enchanted
- David Banash 接受 Rick Poynor 采访,“拼贴文化:怀旧与批判”,《设计观察家》,2013 年 11 月 11 日出版,2018 年 11 月 17 日访问https://Design Observer . com/feature/Collage-Culture-怀旧与批判/38187
- 米哈伊尔·爱泼斯坦,“后现代主义在后现代性中的位置”,出版于 1998 年,访问于 2018 年 11 月 17 日,http://www.focusing.org/apm_papers/epstein.html
- 卡丽莎·贝尔,“Instagram 证明无耻的复制是有回报的”,Mashable,2018 年 5 月 12 日发布,2018 年 11 月 17 日访问https://Mashable . com/2018/06/12/insta gram-proves-copy-is-the-best-strategy/# NysItTmXfaqo
- 瑞秋·沃尔夫,“剪切粘贴文化:新拼贴”,Artnews.com,2013 年 12 月 12 日出版,2018 年 11 月 18 日访问,http://www.artnews.com/2013/12/12/the-new-collage/
- 维基百科,2018 年 11 月 19 日访问https://en . Wikipedia . org/wiki/Generative _ adversarial _ network
- Tero Karras、Timo Aila、Samuli Laine、Jaakko Lehtinen,“Gans 的渐进增长,以提高质量、稳定性和变化性”,发表于 2018 年【https://arxiv.org/pdf/1710.10196.pdf】ICLR
我们是数据点:剑桥分析丑闻后的网络身份
We are just tiny data points in a vast data universe | Image source Hunter Bryant
剑桥分析公司+脸书丑闻中有一线希望,它引发了一场关于我们在线隐私权的辩论。我们的虚拟房子被入侵了:政府进来拿走了我们的身份。抛开是否是美国邀请了侵略者这个问题,今天我们将探讨这个丑闻的核心:网络身份的概念。这个案子到底有什么让我们困扰的?删除脸书代表着什么?为了发泄我们的愤怒,让我们回顾一下法律意义上的个人数据是什么,监管中有哪些疏漏,以及我们的网络足迹是否应该引起我们的担忧。
受法律保护(*有法律时)
信息安全部门在个人身份信息的标签下提供了最全面的个人数据定义。PII 是指可以识别特定人的信息。这个定义包括诸如任何身份号码(护照、社会安全号码、驾照)、位置、联系方式、面部、指纹和基因等指针。你会注意到可识别的概念比个人更狭隘:我们的个性、行为和信仰(不一定是宗教信仰)不受 PII 保护伞的保护。
在 PII 的阴影下隐藏着它更丑陋的兄弟:仍然指向特定人的非特定信息。例如,一个人的性别并不特别明显,因为很有可能另外几十亿人也有同样的性别。然而,如果你是男性主导的职场中唯一的女性,即使这些信息也不会泄露你的身份。
PII 是数据隐私法规中的一个流行术语,但是以 PII 为中心的立法根据每个国家对它的解释而有所不同。不严格地说,PII 的个人数据经常被忽视,或者很少提供指导以确保其保护。剑桥分析公司丑闻(以及之前曝光的 NSA 行为)凸显了美国对非 PII 数据的监管是多么薄弱。当美国人在自己做的床上醒来时,美国公民正在为即将到来的通用数据保护条例欢呼雀跃。在地球的另一边,中国正以只有中国会做的方式拥抱 PII 和非 PII:通过对其公民进行评级系统试验。大多数非洲国家缺乏任何监管,他们的公民数据自由公开——你可以打赌他们有自己的剑桥分析公司的故事。
PII 的多面性
保护 PII 的概念存在于全球立法中,但在现实中并没有得到积极的执行。欧盟的 GDPR 是迄今为止最强有力的控制 PII 滥用的尝试,它让每一个存储欧盟公民数据的组织都成为它的保管员。如果这些公司不遵守规定,将会被罚款。对于欧洲人来说,这是一项重大的集体努力,因为个人信息有多种形式:除了姓名、年龄和银行信息,公司还必须保护所有本地化信息和任何生物特征数据。
PII 泄密是非法冒充行为的温床:犯罪分子使用我们窃取的身份申请贷款,访问我们的银行账户,或跟踪我们。就位置数据所能揭示的信息而言,它本身就是一个潘多拉盒子。想象一下,苹果泄露了我们精心储存在 iphone 上的每日路线。你去的地方、生活的地方、工作的地方和闲逛的地方都会暴露出来。更糟糕的是,你的缺席是可以预测的,你的房子可能会被抢劫。定位不仅仅是 GPS 设备的领域:每一项现代营销努力都将涉及收集客户定位库。这些不是由于受到严格监管而无法代表其人口的经济地位和利益的行政区域。现代营销区域由传感器、信标、IP 翻译和脸书签到定义:称之为数据驱动的地理。生物特征数据——唯一区分我们生物特征的数据——同样是当代信息收集中无处不在的资产。被授权进行安全共享的实体多种多样,从语音控制设备、保存我们的图片和视频的社交媒体服务器,到操作闭路电视的实体商店老板。
最后,谈谈基因组学和 PII。人类基因组计划实现了所有基因的测序和绘图,为分子生物学和医学的惊人进步打开了大门。基因组数据不同于 PII 环境中的任何其他数据:虽然其他 PII 属性可以改变,但 DNA 集永远是唯一的。一旦它出现在公众面前,它就消失了;伤害是不可逆的。监管也更具挑战性。与其他数据类型不同,它无法在不损失其价值的情况下成功匿名或匿名。它需要完整地可供分析。这就要求在基因治疗成为主流之前,需要额外的专门监管。
龙在这里:PII 领域之外的数据
如果 PII 是一个令人头疼的监管问题,我们应该如何处理 PII 定义之外的数据?龙来了:根据法律,非 PII 信息(除了财务数据)大多是未开发的领域。现代立法只保护我们的社会安全号码、地址和基因,而不保护我们的行为数据。窃取 PII 是犯罪——窃取非 PII 的数据在道德上是不酷的,但是没有人会因此而入狱。
我们就是我们所做的,营销人员最清楚这一点。网飞的商业模式是基于行为数据的:一个节目的长度是针对目标观众优化的,这样我们就不会失去兴趣;悬崖衣架是由转换率决定的,而不仅仅是它们的艺术价值。当我们向网络 cookie 输入我们的兴趣、购物偏好和平均决策时间时,它会跟踪我们的互联网冒险,然后向数据经纪人报告。我们不断了解到行为信息比我们报道的兴趣更优越。网飞跟踪我们的点击,知道我们并不像我们说的那样热爱外国电影和纪录片。根据 OKCupid 的数据显示,Christian Rudder 的 Dataclysm 专门为我们在网络上的谎言写了几章。
这些点击和行为模式的集合都是人类特征的分支,但还不足以具体到某个人。因此,根据定义,它不属于 PII 范式。行为数据的收集和分析正是剑桥分析公司数据收集工作的支柱:我们刚刚了解到数据泄露会造成多大的伤害。
数据经济建立在我们的个人行为数据之上。我们的点击(和缺乏点击)被货币化,出售和转售,并由该经济体的参与者进行分析。正如亚历克·罗斯在的《未来的产业、中所报道的,私人公司现在收集并出售关于普通美国消费者的 75,000 个个人数据点。“我们的数据支持营销工作,并支持推出新服务。看到我们的生活被量化成一点一点,感觉几乎失去了人性。但抛开偏执不谈,当亚马逊根据我们的兴趣向我们推荐伟大的交易时,我们真的不喜欢吗?
摘要
个人数据的多维性带来了多重问题:对我们、对监管者、对整个经济。我们不仅被我们的名字和地址所识别,还被我们的生理和行为所识别。我们是我们所想、所做以及我们想而没做的事情的储存库:所有这些都被上传到互联网上。剑桥分析报告强调了我们对自己的网络足迹知之甚少,以及我们的法律是多么的不完善。监管者需要从互联网出现前的心态中走出来,在这种心态下,我们的想法和行为只有有限的家人和朋友圈子知道。GDPR 是朝着更自觉地处理我们的个人信息迈出的奇妙一步,这有可能激励其他国家。我们对自己的数据几乎没有控制权,因为我们不仅依赖于我们分享的内容,还依赖于我们的朋友、我们使用的服务、医生、工作场所和政府设法保密的内容。我们需要法律来保护我们。
— — — — — — — — —本文原载于数据漫游。
在 Twitter 上关注我了解更多数据故事!
“…我们已经不在堪萨斯了”——采访中的挣扎
欢迎回来!这是我如何从地球科学职业转向数据科学系列的第五篇。
读者现在应该对我为你的第一份数据科学工作找工作的方法和哲学有了一个坚实的理解。现在,让我们进入“典型的”数据科学面试的面试准备和形式部分。
你应该知道如何申请,如何让你的名字出现在简历上。希望你在几个公司的系统中有一些推荐。很快,你就要参加面试了。开始准备面试永远不会太早。
与石油和天然气行业相比,面试“技术”行业中需要任何编码技能的技术职位是一件非常不同的事情。
例如,对于我在(超级)大型石油公司的职位,流程包括:
- 校园面试——技术和软技能,以确保我在基础知识上是坚定的,并有逻辑思维流程
- 现场面试—包括技术部分和软技能部分。还要求我提交论文。
- 报价阶段/谈判
数据科学相关职位的面试通常有 4-5 个步骤:
- 人力资源电话筛选——这基本上是为了验证你是否适合这个职位。它本质上不应该是技术性的,但要准备好谈论你以前的工作与数据科学的关系。对我来说,这通常包括描述我在石油和天然气领域帮助支持的地质统计模型,以及这些模型与手头角色的关系。这些通常是简短的谈话,平均 30 分钟左右。
- 技术电话筛选——通常由招聘经理或高级个人贡献者进行。这可以有一个技术编码部分(通过在线界面或口头),技术建模部分(方法,解释等)。)和商业敏锐度组件(解决问题的方法、KPI 等)。).这些可能长达(或超过)一小时。有时候你也会得到一个很傻的脑筋急转弯来“热身”。
- 案例研究/项目(可选。)—为了进一步建立技能,许多(但不是全部)公司会给出一个简短的案例研究或项目,要求候选人展示他们拥有的技能和能够完成的事情。这可能需要一些时间,取决于你的分析有多深入,以及你的编码能力有多强。有时你要在一定的时间内交上来并被评分,有时你要在现场面试中展示你的发现。
- 现场面试——类似于其他行业的面试,通常是半天到一整天(通常,但不总是)的午餐时间。包括编码块(在“可怕的”白板上)、机器学习原理、软技能、逻辑谜题、工作流程和业务问题/敏锐度。
- 报价阶段/谈判
对于经验丰富的专业人士来说,前三个阶段通常很容易准备。它们与其他行业和职业非常相似。请注意,你必须详细解释支持你的项目的职责,而且电话那头的人可能对石油和天然气行业的内部运作一无所知*。*
让招聘人员或招聘经理不知道你的职业会对你有利。请详细解释你和你的家人或朋友一起做的事情,他们都不在能源行业。我发现向他人扩展我们的谋生知识真的很有趣。见鬼,考虑到这个博客系列的创建,我仍然从谈论它中获得快乐!
出于不同的原因,第 4 和第 5 阶段对我们来说是摆脱石油和天然气的棘手阶段。
我将从简单的第五阶段开始。
要约和谈判对任何求职者来说都是困难的。你真的想获得你的第一份数据科学工作,我们大多数人也需要进行现实检查。 石油天然气行业涨工资 。我已经说过了,这并不是说你再也挣不到你曾经挣过的工资,但很可能不会是你的 第一 数据科学职位。
我个人转向数据科学是为了更好的生活质量和解决有趣的问题。在我优先考虑的事情中,基本工资排在后面。如果薪水是你最想要/最需要的,你可能会失望。
很多时候,你会被追问在前任雇主那里挣了多少钱。转移,转移,转移!在美国,法律不要求你提供这些信息,你以前的雇主也不能透露。
我总是全面地看待每个机会,这真的取决于工作要求和责任,以及我对公司的价值。如果角色和职责很重要,我会拿较低的薪水,但是,不太重要的职责,过高的薪水可能会通过。
谈判更难建议。有些公司的基本工资有很大的浮动空间,有些则没有。意识到这一点,如果这是一份梦寐以求的工作,而且薪水很低,就协商其他事情。假期、职称、奖金和晋升时间表都可以商量。发挥创造力,从他人那里获得关于如何进入谈判阶段的想法。
最难准备的阶段是 阶段 4 。
现场面试。在软件工程领域(特别是破解编码面试)已经有了一本书又一本书,老实说,许多数据科学面试在编码方面与软件工程面试没有太大区别。
不要缩短准备现场面试的时间。在网上练习,和当地小组一起练习(如果有的话),练习,练习,再练习!
转向数据科学的地球科学家应该将他们的努力集中在三个基本领域😗*
- 编码实践——实践常见的算法和技术,动态地改进您的代码。不要在面试中一开始就找到最佳解决方案。总是从你的 MVP(最小可行产品)代码开始,并在时间允许的情况下进行优化。让面试官带你走向优化。
- 谜题练习——不管你喜不喜欢,许多公司仍然喜欢猜谜语。"加利福尼亚州有多少个斯博克岛?"这些都是愚蠢的问题,但是旨在让你在处理问题时更有逻辑。这就像一个面试官递给我们一块石头,在告诉他们这是一块花岗岩之前,解释一下你看到了什么。“我看到钾长石、石英和黑云母。它是一种长英质侵入火成岩,具有明显的结构。我推断它最有可能是花岗岩。”好吧,用这个类似的逻辑来解释这个谜语。
- 概率和统计——练习基本的 101 级概率和统计。包括贝叶斯定理、组合学、回归、常见的机器学习算法(决策树、森林、SVM、NLP、神经网络)。你不需要成为机器学习的大师,但是要知道每种算法的基本功能,以及在面试阶段什么时候使用它们。**
我很幸运有我的激励社区通过模拟面试来帮助准备面试过程。我鼓励其他人找到当地的小组或创建他们来帮助练习面试策略。
最后一个小贴士是做好“失败”的准备。你不会每次面试都成功,也不会每次现场都表现出色。我经历了惨痛的教训。
拒绝是 硬 。
找工作就像约会。你在讨好潜在的雇主,因为他们和你在一起。有时候事情并不顺利…
你认为你已经搞定了,但还是被拒绝了。你可能认为你悲惨地失败了,然而却被置于谈判阶段。只要你对事物保持幽默感,并坚持不懈,你会找到一个适合你职业抱负的人。
就我个人而言,为我的第一份数据科学工作找到最合适的角色比我预期的要长。我一路上跌跌撞撞,受了点伤。然而,我确实获得了一个很好的机会。其中,我将在我的旅程的下一集描述。
在我的职业支点系列中补上或回顾以前的条目:为什么地球科学家成为优秀的数据科学家、填补知识空白、构建求职框架和解读工作描述。
继续第 6-8 集,为什么咨询,我的第一个咨询项目和寻找未经加工的钻石。
“我想,我们从头开始吧。”
作为一个在脸书、Twitter、Tumblr 和类似网站时代的 20 多岁的人,我冒险写博客只是时间问题。实际上,在之前,我曾经尝试过一次博客,最终它变成了一个不经常更新的总统辩论饮酒游戏库——配有 gif。
Out with the old and in with the new, I suppose!
鉴于我正在尝试一个新的博客,它回避了这个问题:我应该写些什么?我对很多事情都充满热情——数据科学、教育、政治、法律、定量扫盲——尤其是当这些兴趣重叠的时候。将自己归入一个领域似乎很傻,但收集一些不相关的散漫内容似乎更傻。
幸运的是,如果我在过去几年中学到了什么,数据科学几乎与所有东西都有重叠。
所以这就是我要开始的地方:将数据科学应用于一些*(希望如此)酷问题。但是我该如何开始呢?正如乔治·奥威尔在 1984 年的中所说,“在纸上做记号是决定性的行为。”感觉就像带着新买的笔记本开始了新的学年。一旦你动笔,事情就有了定论。然而,在那一刻之前,可能性是无限的。*
我最近重读了《华氏 451 度》,下面这段话在我的记忆中尤为突出:**
蒙塔格从地板上拿起一本小册子。“我们从哪里开始?”他把书打开一半,仔细看了看。“我想,我们从头开始吧。”
所以,我想这是开始。在接下来的几天和几周内,将会有关于使用信息和证据解决问题的帖子,但目前,欢迎!
我们知道你也想去 C2
在为期三天的令人难以置信的 C2 MTL 会议人工智能论坛中,研究和创业领域的创新者分享了他们关于人工智能(AI)的知识和经验,激发了关于这些技术的应用和潜力的富有成效的讨论。演讲范围从机器学习将在医疗保健中发挥的关键作用,到成功的人工智能创业公司的关键特征,再到该领域伦理问题的思考。展示了令人难以置信的洞察力,来自各种人工智能应用的不同观点的碰撞为未来的行动带来了兴奋感。魁北克 MESI 和蒙特利尔国际在促成这一切的过程中发挥了关键作用。
Montreal: an electric feeling in the air. Source: Jonathan Denney, Unsplash.com
一个深思熟虑的早餐小组讨论了媒体和人工智能的成熟度,提到了与更琐碎的应用程序相比,人工智能技术的通信和翻译应用程序的重要性;例如,文本到语音技术消除了对转录语言信息的需要,从而释放了大量以前难以访问和共享的知识。随着开源研究和创造的令人钦佩的扩张,数据预计将成为开发人工智能技术的关键因素,正如 aifred 的数据驱动的医疗预测一样。
在小组讨论期间,创业的一个有趣优势浮出水面;在失败和随后的调整方面,初创公司与大公司相比的敏捷性。失败是任何创新努力的核心组成部分,成功努力的定义特征(不仅限于人工智能初创公司)是基于失误调整计划和愿望的能力,以便打造更强大的竞争对手。
Data is the Atlas of the AI world. Source: Markus Spiske, Unsplash.com
通用电气首席营销官琳达·博夫(Linda Boff)谈到了创造力的重要性,这是将卑微和危险的劳动转移到人工智能技术运行的机器上的结果;这意味着创新和创新思想在世界舞台上扮演着重要而令人垂涎的角色。这个想法是利用人工智能的力量,作为可以产生最大影响的学科中开创性应用的基础,例如 3D 打印器官为医疗保健专业人员提供更好的诊断提供了潜力。
加拿大人工智能“生态系统”的现状和未来潜力是根据当代作为基于认知能力扩展的工业革命来探索的,与扩展人类机械能力的经典工业革命相反。丰富的数据、灵活的模型和可用的计算能力推动了人工智能革命;这些因素为人工智能在不同行业中的指数级影响提供了基础。
From mechanical revolution to cognitive revelation: The Canadian AI Ecosystem sparks justified excitement. Source: Unsplash.com
乔尔·贝克曼,作曲家和人造音乐的创始人讨论了一个经常被忽视的声音对人类认知和体验的影响的有趣演示,他提出声音是设计的一个方面,分享了视觉设计的相同原则。对声音的生物反应比其他感官快得多,因此这种感官形式在构建其他感官的感知和输入中起着作用。他的想法是一个完美的例子,说明如何以创新的方式应用人工智能,在未探索的领域用创造性的方法解决问题。例如,医疗保健中的警报疲劳可以通过医疗保健专业人员的习惯化来消除,这违背了警报本身的目的;可以通过分析声音来诊断自然生态系统的健康状况。声音是人工智能研究领域的一个主要例子,它充满了创新的潜力,有许多应用等待被解锁,也许是在前面提到的通信环境中。
关于艺术和文化意义,长野健也提到了声音的未实现的潜在影响;声音在传输过程中会因流式传输而损失很多质量,而重点是通过流式传输来提高视觉质量。视觉媒体质量的这种偏见可能在当今世界视觉图像优于声音的优势中发挥作用,人工智能拥有潜在的调整这种焦点不平衡的能力。
Kent Nagano, Music Director of Orchestre symphonique de Montréal, presents a wonderful performance.
aifred 团队特别感兴趣的是江泽龙·拉瓦莱和乔纳森·卡内夫斯基通过“人工智能优先”的镜头重新想象医疗保健的想法;这一领域的注意力集中在诊断上,因为这是目前最精确和相应最有价值的数据所在。未来的研究和创新可以使用听觉数据和视觉数据,从分析生物功能模式来检测健康问题(如血栓)的风险,到分析医生行动和互动的视频。人工智能的魅力在于它可以提供可访问性,通过消除不重要的、机器可控的细节的干扰,并允许人类的创造力和高级思维出现。例如,从结肠镜检查中获取视频图像并应用人工智能,以便经验较少的医生可以在专家的水平上进行操作,或者应用人工智能来分析生活方式因素,以查看哪些因素在人类疾病的背景下可能是重要的。这与 aifred 背后的价值观和灵感极其相关,特别是在精神保健方面。
当然,伟大的 Yoshua Bengio ,Element AI的联合创始人兼蒙特利尔学习算法研究所所长,分享了他对人工智能及其应用的想法,特别是自然语言理解和生成、医疗保健和机器人技术的成功和障碍。关于语言理解和生成,在这一领域进行了大量投资,包括微调虚拟个人助理、语音识别、文件检索(这可能会使有能力轻松负担法律服务的人更容易获得服务,并改变司法系统中的偏见)和教育对话系统。
Pictured: Internally excited yet outwardly calm aifred Project Leader Abhishek Gupta and Yoshua Bengio.
深度学习再一次被讨论到它在医学上的潜力。人工智能可以处理医生没有时间自己筛选的高维数据;来自患者数据和医生笔记的信息可以用来预测未来的结果和估计未来事件的概率,但只有足够的训练数据才能用于机器学习模型。医学中可用于训练机器学习模型的数据的当前状态相当分散,这是我们在寻求生物数据以用作心理健康治疗的预测器时亲身经历的,但一个积极的趋势表明,这种数据的集中化正在上升;这对于人工智能在医疗保健领域的进步至关重要。必须面对的挑战围绕着可供分析和分类为相关或不相关的大量数据,必须进一步考虑其收集与各种形式的研究不一致的问题。
此外,在大踏步前进的过程中,走出去并思考创新可能带来的问题总是很重要的,特别是在人工智能领域等快速增长的努力。来自 Google 的 Blaise Agüera y Arcas 讨论了在 AI 技术中引入人类偏见(将人类价值观注入具有预测偏差的机器学习模型)、在没有充分预见的情况下将 AI 盲目应用于现实世界问题、失业影响、安全考虑以及与这些日益复杂的技术(如机器人)的发展相关的法律权利方面必须做出的重要考虑。随着人工智能应用的出现,这些主题将变得越来越多地被讨论和相关,在思想发展和人工智能进化的整个过程中讨论它们是重要的。
Blaise-ing new trails in the consideration of AI ethics.
关于人工智能技术的各种观点和深思熟虑的思考由许多激动人心和深刻的演讲者组成。 Ben Boyd 强调了在“不信任时代”具体体验和真实客户意见的重要性。的迈克尔·斯拉比展示了技术在政治中的作用,包括脸书在圈定新闻来源方面的影响,这些新闻来源通常会被忽视,以努力使民主更知情和更有效,以及技术应该旨在改善政治的方向;参与的民主化和集中精确的开源数据可访问性。视觉驱动的设计实践也是 Drod Benstrit 的谈话主题,他谈到了人类对有意义的联系的热情,以及我们的经历对我们如何感知现在和塑造未来的影响,以及合作创新和投资实验的重要性。Amanda Hill介绍了当今世界中内容创作者与消费者之间的不平衡(估计为 2000:1 ),在这个世界中,注意力是一种稀缺商品。这是一个重要的考虑因素,尤其是在一个无数信息不断争夺注意力的世界里,选择什么样的内容最强大、最有意义。穆罕默德·尤努斯(Muhammed Yunus)详细讨论了全球财富不平等及其伴随的问题,他建议对年轻人进行再教育,让他们成为企业家,并将社会焦点转向个人创造力的价值。
最后,医疗保健和人工智能再次与 *Dialogue、*的联合创始人兼首席执行官亚历克西斯·斯米尔诺夫(Alexis Smirnov)发生了碰撞,他谈到了通过可穿戴设备进行慢性病管理,消除了定期去看医生的需要,或者在整个怀孕期间持续跟踪胎儿健康。持续健康跟踪的更主动性质可以是关于生活方式的数据收集,例如运动胸罩跟踪呼吸模式并推荐相应的锻炼方案,通过言语模式识别精神病,或通过跟踪眼球运动检测自闭症。人工智能的可能性似乎是无限的,即使在医学领域,其应用也在不断涌现,并以越来越实用和有影响力的想法为基础。aifred 团队很高兴能够成为这个人工智能时代的一部分,我们非常感激能够在今年的 C2 MTL 会议上有机会向这些才华横溢的人学习。我们非常感谢蒙特利尔国际让 aifred 有可能体验这个非凡的 AI 论坛。对于人工智能技术来说,这是一个令人兴奋的时代,置身其中就像站在一场思想和创新的龙卷风中,有可能解决世界问题;我们已经不在堪萨斯了,但我们肯定会去旅行。
The future is in our hands. Source: Oliver Thomas Klein, Unsplash.com
我们必须是老师
“机器学习是人工智能(AI)的一种应用,它为系统提供了自动学习和根据经验改进的能力,而无需显式编程。”~ 什么是机器学习?
关于机器学习,以及它有望提供超出编程范围的洞察力,人们既兴奋又有些担忧。特别是当结合今天可用的海量数据时,人们预计人工智能将最终提供大数据长期以来承诺的好处。
但是许多想使用机器学习的人误解了它的优点和缺点。在与许多人谈论机器学习在当前状态和过去更有限的技术中的前景、危险和失败时,我想起了阿瑟·c·克拉克的名言,“任何足够先进的技术都与魔法没有区别。”
作为人类,我们倾向于用魔法来看待无法解释的事情。但是,尽管它很复杂,机器学习不是魔法,这样对待它将大大降低它实现承诺的机会。它可以用来检测趋势和相关性,但它不能挥舞魔杖,召唤出我们认为理所当然的数据关系和隐含意义。
如果我们抛弃 AI 是魔法的想法,我们可以开始将机器学习视为与其他类似过程相关的过程。当我们想让我们的孩子学习时,我们不会简单地把他们留在图书馆里,然后抱最好的希望。我们引导他们找到最合适的资源。我们纠正他们的错误。我们回答他们的问题,并提出我们自己的问题来激发他们的思考。我们是他们的老师。
简而言之,如果我们想了解如何最好地完成机器学习,我们需要了解教育策略。虽然机器的学习方式与儿童不完全相同,但也有相似之处。我们应该注意两者的相同点和不同点来指导我们的机器教学。
孩子们的优势在于,他们可以通过与父母、老师和同龄人之间越来越复杂的反馈回路进行学习。我们不能用机器复制这一点,但我们可以提供反馈。IBM Watson 并不是通过被灌输一本百科全书而学会在《危险边缘》中获胜的,尽管毫无疑问它被灌输了很多。它通过输入问题并纠正答案来学习。
我们不能简单地把数据转储进去,然后希望建立正确的连接。我们需要投入更少的资金,尝试我们希望得到答案的问题,并给出反馈。在《国王和我》中,安娜唱道“……如果你成为一名教师。你的学生会教你。”正是如此,当我们从人工智能那里得到答案时,我们必须学会如何提出问题来引出我们想要的答案,以及我们需要向系统提供哪些额外的信息,以便它可以回答我们可能会问的各种问题。
机器在快速吸收大量数据的能力方面具有优势,这既带来了机遇,也带来了威胁。对于孩子,我们有时间去识别他们什么时候会朝着一个意想不到的、不受欢迎的方向发展。对于机器来说,如果学到了错误的教训,不重新开始就很难忘记它们。
这给我们带来了我们必须教给孩子和机器的最重要的一课。我们不能假设学习会灌输价值观。当人工智能被灌输了大量的社交媒体内容时,它首先学到的一些东西是种族主义和不容忍。虽然你可能不认为你的公司的数据集会朝着这个方向发展,但它们很可能会比你想象的更黑暗。
让我们假设你的公司是一个利润驱动的企业。理论上,这意味着所做的决策应该完全由最小化成本、最大化利润和支持底线的动机驱动。但是除了在最极端的情况下,人们会考虑很多其他因素。他们权衡客户的良好意愿、员工的福祉以及某项决策的社会影响。他们有价值观,这些价值观以成千上万种大大小小的方式与底线相平衡。
但是机器就像孩子一样,只学习教给他们的东西。如果你的人工智能每次回答一个问题时都向它提供反馈,但你的唯一标准是它是否实现了利润最大化,那么如果它后来提出了令人震惊的建议,不要感到惊讶。您必须构建数据来支持基于价值的决策,并鼓励对这些决策进行加权。
举个简单的例子,如果你不提供任何关于不同产品类型的环境影响(例如,包装或能源使用)的数据,人工智能就无法在决策中权衡这些因素。同样,如果当人工智能推荐环保选择时,你不提供虚拟的赞美,它就不会学会重视这些选择。
机器学习不是魔法。虽然它可能会提供你从来没有考虑过的精彩想法和见解,但它只能与输入和价值观以及它所学到的教训一起工作。我们必须是老师。认真对待你在指导和教授你的人工智能中的角色,就像对待孩子一样,当它显示出你灌输的智慧、知识和价值观时,你的回报就会到来。
我们需要听到你的声音!
走向数据科学调查 |⏱3 分钟
我们在 2016 年 10 月推出了我们的媒体出版物,以更好地分享数据科学概念、思想和教育。今天,我们对你们所有人的热情感到非常惊讶。你们让我们的出版物充满活力,我们为此感谢你们所有人!
现在,我们的读者数量显著增加,我们意识到我们有责任呈现更高质量的内容,并将我们的出版物提升到一个新的水平;这就是为什么我们需要听到你的声音。
我们需要谈论“数据”
我最近读了一些有见地的博客,很多都是关于数据的。像这一个,和这一个,和许多其他的博客。数据是目前的热门话题,这很好。
不幸的是,随着每一篇关于“数据”的新博文,一个越来越响亮的“但是……”正悄悄潜入我的脑海。让我解释一下。
在处理数据产品时,我经常使用“过载术语”这个短语,以至于它自己也有变成过载术语的危险。我们在谈论数据时使用的许多词语根据上下文有许多微妙的不同的含义,如果我们不小心弄清楚我们的意思,我们也有使复杂的空间疏远的风险。
当我第一次加入我现在的团队时,我总是被这些词汇地雷绊倒。一个特别突出的例子是——我们编写了一种新的格式来指定我们特殊类型的数据集,并且我们试图给它命名。工作名称让人们感到困惑,现在它是我们正在迭代的东西,它需要一个永久的、容易理解的名称。
代表?哦不。“语言”?绝对不行!格式?也许吧,但是……‘好的,说明’?嗯,我们已经有了一个叫“松鼠”的东西……这种情况持续了几天,直到我威胁要把这个东西叫做“松鼠”,并列出所有明智的选项供团队投票。
因此,在粒度级别上,作为一个社区,我们在明确我们的术语方面尽职尽责,但我们遗漏了一个绝对的错误。“数据”是一个超载的术语。
Let’s put an end to lexical buckaroo, before it kicks off
对数据趋势和发展的理解,以及对它们所带来的挑战和机遇的参与真的越来越多,以至于“数据”不是一个足够微妙的术语来清楚地谈论我们正在工作和思考的事情。
一天早上,当我端着咖啡,半听着广播四台的时候,这个想法开始变得有点尖锐。有一场关于的讨论正在进行,这是一项关于对癌症患者进行常规基因组图谱绘制的最新提议以生成关于医疗保健的更准确的数据洞察。一位讨论者表示,这并没有太大的争议,因为医生已经有了很多关于病人的数据,使他们能够安排和预约。
这种比较意味着所有数据都是等同的,我认为这是不真诚的,只会加剧对任何涉及数据的不信任,因为数据对个人来说是侵入性和不透明的。由个体独特的基因组图谱产生的数据,在几个非常基本的方面不同于显示医生预约的可用性和工作模式的数据。
在思考这个问题时,我试图阐明我认为区分数据“类型”的标准(故意不在这里说“数据类型”,因为:重载术语)。
**出处:**数据是从哪里来的?它是如何收集的,数据主体对收集知道些什么?
**应用:**现在的数据在用什么?它与原点的对齐程度如何?数据主体是否同意此申请?
**处理:**数据是否与其他东西结合,数据主体对那个‘其他东西’有什么控制?它是用于识别聚合模式,还是用于扩展单个数据主体的数据范围?
**敏感性:**是否有可能对数据主体造成伤害或损害,尤其是在考虑治疗的情况下?
我认为这些标准可以帮助我们区分,比如说,开发团队用来改进他们正在构建的软件的分析,服务提供给用户以完成任务的数据,或者服务要求用户提供以完成任务的数据。
这让我想起了大约一年前我第一次读到的一篇博客文章,作者是一位前谷歌设计伦理学家:
如果你控制了菜单,你就控制了选择[……]数百万人激烈地捍卫我们做出“自由”选择的权利,而我们却忽视了这些选择是如何在上游被我们最初没有选择的菜单所操纵的。
在上下文中应用,呈现给用户选择的数据的来源可能完全是用例不可知的——比如像寄存器这样的核心参考数据集——但是它的应用和处理会对用户能够(和不能够)做什么产生真正的影响。有时这是正确的做法,会让服务对用户来说更清晰、更有用,但我认为我们必须开始清晰、透明地思考和谈论我们所说的“数据”是什么意思。
在我的脑海中,我可以看到从基础设施到洞察力的某种光谱上的“数据”,但我说“某种程度上”是因为我不确定这是一条从一个到另一个的直线,或者在这两者之间或超越这两者的是什么(尽管我们可以非常肯定在某个地方有大量的创新),但我真的很高兴找到答案,并听取其他人的想法。
我们用人工智能评估了华盛顿的食用大麻市场
Image sourced from Wikimedia Commons
随着加拿大成为 G7 国家中第一个将娱乐用大麻合法化的国家,它可能会向美国华盛顿州寻求暗示。2012 年,华盛顿州和科罗拉多州成为第一个这样做的州,尽管面临联邦政府的禁令。然而,即使美国有机会观察,我们国家对该行业的了解仍不完善。华盛顿到底卖了多少 THC 这种让使用者兴奋的化学物质——仍然不得而知。
这一数字对于回答美国和加拿大决策者的问题至关重要:我们能否将整个社会的 THC 消费与公共卫生结果联系起来?大麻的精神作用和麻醉作用主要是由于四氢大麻酚,而且由于植物的效力千差万别,理解四氢大麻酚背景下的行业规模是有意义的,而不仅仅是植物的质量。
我是卡耐基梅隆大学海因茨学院学生团队的一员,支持兰德公司对这一行业的分析,在我们的工作中,我们使用人工智能来估计食用大麻产品中合法销售的四氢大麻酚的数量。我们的团队首次对西澳大利亚进行了此类评估。
我们的数据杂乱无章,缺少信息
我们得到了一个 60gb 的从种子到销售交易的数据集,其中包括 1000 万份可食用大麻产品的销售。我们需要估计所有这些产品中销售的四氢大麻酚的数量,但是所有食物中四氢大麻酚含量的数值都丢失了。我们收到的信息看起来有点像这样[1]:
Data provided includes some numeric variables (sale time, price, potency, etc.), categorical variables, and unstructured text (product names).
我们需要以某种方式获得这些 THC 值。
兰德研究人员史蒂文·达文波特注意到,一些产品,比如上面的“PButter_TRIPLES_10mg”,在其名称中提到了重量。他判断这些重量指的是产品中 THC 的数量[2]。这些重量可能显示为“10 毫克”、“10 毫克”、“0.01 克”或其他多种形式,但对人眼来说,其含义很清楚:带有这种标签的产品含有 10 毫克四氢大麻酚。
利用这些信息,他编写了一个脚本来识别这些模式[3],并从 44%的交易中提取这些权重。
**计算 THC 销售额的第一种方法表现不佳:**平均值和价格回归
对于另外 560 万的销售,产品名称并没有给我们一个拐杖。例如,“主曲奇 9”没有提到重量。处理这个问题的最简单的方法是假设这些其他交易的每笔销售的 THC 与之前的 44%相同。如果我们可以从 200 万份固体食物中提取 THC 估计值,其中每份食物含有 1 毫克 THC,还剩下 100 万份固体食物,那么我们可以说固体食物与 300 万毫克 THC 有关(200 万 x 1 毫克+100 万 x 1 毫克)。
这是我们的第一个“模型”。
但是当然,这是一个可怕的假设。如果这些交易因为人们购买更多的 THC 而变得更加昂贵呢?或者后 56%中的产品类型是否与给我们提供有用产品名称的 44%不同?我们可以想出一百万种出错的方式,所以我们必须做得比基于这种假设的计算更好。
你可以通过在他们没有见过的数据上使用模型来测试你的模型有多好。我们通过交叉验证来判断我们的方法工作得有多好,这是对这一基本思想的一个更稳健的应用。每笔交易的平均误差为 40 毫克 THC,我们的第一个模型并不好。
因此,我们认为我们可以通过利用价格和数据中的其他数字做得更好。更贵的产品可能含有更多的主要活性化学物质,包括四氢大麻酚。通过考虑每家商店周围的销售时间和家庭收入,我们控制了两个关键趋势:THC 价格如何随着时间的推移而下降,以及高收入消费者如何抬高价格。这种基于回归的模型做得更好——每笔交易的误差为 20 毫克 THC 但仍有很多不确定性。
机器学习/人工智能极大地改善了预测
这促使我们更进一步:利用非结构化文本数据来预测 THC 的数量。
在上面的数据表中,猜测“PButter_Triples_10mg”和“PButter_Triples”很可能是相似的产品,可能具有相似的 THC 含量是合理的。他们有许多相同的名字。同样,“PButter_Triples”可能与“酊剂 Wintermint”有很大不同——它们没有相似的名字。为了利用这些信息,我们计算了所有交易中每个单词的每个唯一单词的频率。[4]有了这个庞大的频率表,我们将文本转换成了定量信息,以训练人工智能对 THC 含量进行预测。
Converting text into a “bag of words” model gives us usable data for machine learning.
我们选择的机器学习算法是“随机森林”,它使用来自数百棵决策树的预测。这些树中的每一个都不断地将数据分成许多类别来进行预测。我们数据的一个简化树可能如下所示:
Decision trees partition data into many categories according to rules. Here, in this toy, if a transaction’s price is less than $50 and its product name contains “PButter”, then we believe it has 10 mg of THC.
使用所有可用的信息——价格、销售时间、当地收入、产品名称、效力和所有其他变量——我们的 AI 创建了一个“随机森林”,试图最小化预测每笔销售的 THC 数量的误差。每笔交易的交叉验证误差仅为 5 毫克 THC,其性能远远超过所有以前的模型。事实证明,这是估算其余 560 万笔交易中每笔交易的 THC 含量的最佳方法。
跨车型的交叉验证性能
新能力,新答案
虽然我们的算法是熟悉的,但它们在这里的应用在药物政策领域开启了全新的机会。
我们对出售的四氢大麻酚含量的估计表明,华盛顿的大麻合法市场在不断扩大。我们不确定这是因为更多的人在消费大麻,还是合法市场正在蚕食黑市。
但是根据我们的估计,他们让决策者有能力回答更深层次的问题,即 THC 如何合法地到达消费者手中。到底是哪些产品让消费者兴奋?我们看到固体食物支配着液体食物。然而,从 2016 年 7 月到 2017 年 6 月,通过食品合法销售的 THC 只有 0.3 公吨,仅占同期西澳大利亚合法市场销售的 24 公吨 THC 的一小部分。
食物是获取 THC 的廉价途径吗?显然不是——它们每单位 THC 的价格大约是可用大麻产品的九倍。对大麻的需求完全由合法产品的销售来满足吗?不,差距很大。【5】如果没有,有黑市满足吗?也许吧。
这对消费者的健康有什么影响?我们的工作才刚刚开始。
我们揭示了这个行业规模和特征的另一个谜团。走出国门,我们在这里描绘的画面可能预示着加拿大市场将如何在未来几年发生变化。我相信数据科学家也会关注它。
脚注
[1]这不是数据的精确复制,因为在链接不同表中的匹配记录时涉及多个数据库连接。
[2]对生物多样性产品采用了单独的程序。为了简洁起见,这里省略了这些。
[3]兰德公司的研究人员史蒂文·达文波特利用正则表达式得出这些值。
[4]实际上,我们使用了一个 TF-IDF 矩阵来训练我们的模型。这些矩阵特别有用,因为它们降低了像“of”和“the”这样的非信息性单词的重要性。使用主成分分析,我们的 TF-IDF 矩阵的大小也减少了几百维,这大大加快了计算时间。
[5]我们在一个单独的项目中,通过根据抽样偏差重新加权的消费者调查,开发了我们对需求的估计——定义为消费者对大麻的消费,无论它是否是在受管制的市场上获得的。
我们用数据科学来探索艾德·希兰的歌曲,以下是我们的发现
那是星期五下午,艾德·希兰在那天早上发布了他的最新专辑。当我第一次坐着听它的时候,一个想法在我的脑海中闪过,“这张专辑听起来真的不太新鲜**。要么是我听了太多他的歌,要么是他的大部分歌曲都是如此相似,以至于我现在或多或少能猜出歌词中的下一首是什么。在我考虑周五晚上的计划时,我给里法德发了条短信,像任何一个理智的计算机科学一年级学生一样,问他,“伙计,你愿意放弃周五晚上的计划,去听听艾德·希兰的歌吗?”令我惊讶的是,他很快就回来了,说他准备让自己经历在音乐网站上搜索歌词和在 d3.js 中创建可视化的痛苦。**
Most popular words in Ed Sheeran’s songs
于是黑客攻击开始了。
这个想法是,我们将使用已知的自然语言处理技术,如词频、句子相似度和情感分析,来找出艾德·希兰歌曲的多样性。首先,我们必须从某个地方获取数据,Rifad 很快组装了一个刮刀,从互联网上众多歌词网站中的一个网站上获取歌词,后来我们才意识到我们可以使用 Genius API 来找到这些歌词。
尽管如此,一旦歌词保存下来,我的工作就开始了。最近,我一直在试验一种奇特的 word2vec 模型,它可以将单词转换为向量,然后人们可以使用这些向量,使用余弦相似度或欧几里德距离等现有技术,在句子、短语甚至整个文档之间找到某种程度的相似度。我想到的处理这个特定数据集的方法是,首先生成专门针对艾德·希兰歌词的单词嵌入,计算他所有歌曲的归一化向量,然后应用降维算法将向量维度从 50 个减少到 2 个,使其易于可视化。在这个过程中,我希望在他的歌曲中找到流行词,以及他的词汇是多么的丰富多彩。
点燃一个 Jupyter 笔记本,我开始工作。我使用了 gensim 的 word2vec 模型来生成单词嵌入。word2vec 模型的工作方式是将一个大型文本语料库作为输入,然后从中生成一个几维的向量空间。在相似的上下文中使用的单词在这个空间中彼此放置得更近。这里要注意的一点是,它需要大量的文本。我的文本语料库由 40 多首歌曲组成,词汇长度大约为 2500 个单词,虽然不完全是最好的输入源,但因为我们只是出于好奇才这样做的,所以我决定继续。我想我可以通过询问一些“粉丝”对他音乐的看法来评估这位模特的表现。现在,由于我使用的是微不足道的 4gb MacBook Air,我只使用了 50 维。最好的模型使用接近 300 个维度。单词的上下文窗口是 7,并且对频繁出现的单词进行子采样。在训练结束时,我有了一个 1.5 mb 的模型,其中他的歌曲中使用的每个单词现在都是一个 50 维的向量。
下一步是将他的歌曲作为向量构建一个相当特别的表示。为了做到这一点,我计算了每首歌的矢量和,然后将矢量归一化。标准化这些向量背后的原因是它有助于找到各对向量之间的相似性。事后看来,人们可能会认为,更公平的表示可能会利用某种方法,这种方法利用了一个词的 tf-idf 得分等指标。
有了这些向量,我决定快速构建一个单词云。毫不奇怪,使用最多的词是爱**,紧随其后的是知和来。(边注:如果你足够用心的看上面的云字,你可以在云字里看到艾德·希兰的剪影;) )**
现在更有趣的部分来了,把我的 50 维向量空间投影到 2。从文献来看,有两种方法可以做到这一点,如果维度太高,主成分分析可以很好地将其减少到更易于管理的程度,然后可以使用 t 分布随机邻居嵌入算法再次将其减少到 2-3 个维度,然后可以可视化。另一种方法是直接使用 t-sne,这就是我所做的,因为它可以在 500 次迭代中轻松处理 50 个维度。
一旦尘埃落定,这就是我们得到的。
像A 队**(最左边)和形状的你(最右边,绿点)这样的歌和他其他的歌很不一样。我们对此的一个解释是,他的大部分歌曲在某些方面都是怀旧的,因此在中间有一簇。集群中的一些歌曲是山上的城堡和照片。这有某种直观的意义,因为 word2vec 模型将相似上下文中的单词放得更近。这也是一个被艾德·希兰的青少年粉丝证实的观点,他们玩着观想游戏。**
随着星期五的到来,我结束了一天的工作,把数据交给了里法德,这样他就可以计算歌曲的情感分数。他想利用谷歌情感分析 API 和 Spotify API,这样他就可以找到最悲伤/最快乐的歌曲。Google 情感 API 返回两个高度相关的分数,一个是情感分数,另一个是代表不同长度文本中情感的量级。因此,较长的文本将具有较高的量级。另一方面,Spotify API 返回了一堆有趣的指标,比如可跳舞性、语速和效价。我们想出了一个非常粗略的、背在纸上的公式来计算最终的歌情。因为效价和情感分数是相似的值,我们把它们加在一起,然后乘以数量级。然后,我们将结果按语速划分,认为对于包含更多单词的歌曲,结果应该是正常的。然后,我们对结果进行平方,并计算结果的对数值。我们当然认为这个公式没有最好地代表歌曲中的情感,然而,它有一些坚持人类对歌曲的判断的外表,这可能是对的,也可能是错的。
分数越高的歌曲越积极。不出所料,不要是最悲观的,或者说可能是使用了最多带有负面含义的词语的人。我知道什么真的让我们觉得我们知道什么,它有一个不自然的高分。我想我们可以把这部分归因于他歌词的模糊性。
总的来说,这是一个很好的星期五到星期六,用来编写相当业余的文本挖掘脚本。更重要的是,我们学到了很多关于这个过程的知识,获得了一些真正的乐趣,偶尔还会遇到令人惊讶的结果。
我们制作了一个快捷的网站,在那里我们所有的互动可视化都是——https://r1fad.github.io/edSheeran/
我们所有的代码都可以在这里找到——【https://github.com/r1fad/edSheeran】T21
微型杀伤性武器:我们的“喜欢”如何劫持民主
Excel 文件揭示脸书/剑桥分析公司丑闻背后的数据科学
“我们能够建立一个模型来预测美国每个成年人的性格。”—剑桥分析公司前首席执行官亚历山大·尼克斯
舔“喜欢”是我们大多数人不假思索就会做的事情。这是一种社会货币,它给我们短暂的震动,并加速我们的多巴胺中心。然而,谁知道我们所有的“喜欢”会预测我们的个性,并变成反对我们的政治说服工具呢?
接下来是:
- 这是一个警示性的故事,说明大数据如何被坏人滥用。
- 一步一步的电子表格教程,解释了个性预测算法,套索回归。
- 以及对你在网络上留下的数字足迹的警告。
震惊世界的大选过去近两年后,剑桥分析公司(简称“ca”)的脸书丑闻仍然是媒体关注的焦点。似乎这个故事的每个有趣的角度都被报道了。
但是有一个问题仍然没有解决:
这些模型是如何工作的??
而不是表面上的(你喜欢的脸书页面与个性测验分数的关联)。但是在引擎盖下。用一种大多数人都能理解的语言……好啊 Excel 先生。
作为一个自称的数据迷和电子表格活动家,我试图满足我的好奇心,并对我发现的简单性感到惊讶。
通过一个名为 LASSO regression 的一般线性回归模型,我将使用电子表格向您展示机器学习如何比只有 125 个脸书喜欢的家庭更好地预测您的个性。听起来有点反乌托邦,但却是事实。
你的数据是有价值的,你有权知道它是如何被使用的。
**第 1-3 部分(约 10 分钟)讲述了所发生的事情,并向你介绍了丑闻的背景。**您将了解微定位(根据您的个性档案向您发送个性化广告)的实践,以及如何收获 8700 万份脸书档案。
第 4-5 部分(约 15 分钟)向您展示了如何做到这一点——数据科学。如果你对丑闻很熟悉,只是想要教程,跳过这里。第 5 部分是我们打开引擎盖查看细节的地方。
Google Drive 电子表格链接:
这个模型最好在 Excel 中查看,但是你也可以在 Google Sheets 中在线查看(calcs 比较慢),并且有一个 PDF 格式的数学(文章的第 5 部分),便于离线参考。
像任何超能力一样,机器学习会被反派(Cambridge Analytica)和英雄一样使用(危机文本行)。小心行事。
如果你喜欢这篇文章,并想获得其他免费的电子表格教程,帮助你理解像面部识别或网飞如何提出你的建议,在这里注册我的电子邮件列表:
剑桥分析公司(Cambridge Analytica)是一家数据驱动的分析公司,专门从事心理特征分析或“心理战”,于 2016 年 6 月被特朗普竞选团队聘用,负责领导其数字行动,直至 11 月的大选,并吹嘘说他们拥有美国每个成年人的多达 5000 个数据点。
Source: https://cambridgeanalytica.org/
呼气…哇。
事实上,他们在其网站上将此列为一项成就(连同截至 2018 年 5 月的破产通知)。
Source: https://ca-political.com/
在选举前的几个月里,CA 将他们的数据宝库投入到他们的个性预测机器中,建立了针对不同受众的 10,000 高度个性化的脸书广告,以努力操纵未决选民的投票行为,抑制投票率。
肯·波恩有人吗?
他们称这种广告行为为“微定位”帮助开发这些工具的前 CA 神童数据科学家和告密者 Christopher Wiley称之为:
Source: The Guardian; (Note: caption added by me)
你的选民记录,你在哪里购物,你的推文,你的地理位置电话数据,你去什么教堂,你看的电视节目,你的脸书喜欢。他们有。
尤其是你这样的人。
有了足够多的你喜欢的人,心理剖析领域的前沿研究人员在 2014 年证明,计算机在预测你的性格方面比你最亲近的人更准确。
- 只要有 9 个脸书喜欢,计算机就能预测你和同事的性格。
- 有 65 个赞,还有一个朋友。
- 有了 125 个赞,你的家人。
“Computer-based personality judgments are more accurate than those made by humans”: http://www.pnas.org/content/pnas/112/4/1036.full.pdf
根据剑桥研究人员的说法,他们最终收获了 CA 微定位操作中使用的脸书数据,仅在 1 周内就可以从头开始学习这样的机器学习模型:
数据远比模型更有价值,因为如果你有数据,建立模型是非常容易的——因为模型只使用一些很好理解的统计技术来建立它们。我能够在一周内从不做机器学习变成知道我需要知道什么。就这么多。亚历山大·科岗
他是对的。
在大计划中,模型(你的喜好和个性测验分数之间的一种关联)是容易的部分。
在讨论如何使用心理分析以及如何收集 8700 万份脸书档案之前,有几件事我想说出来…
我的 4 个警告—数据科学不是万能的
- 数据科学不是万能的。光靠它不能操纵选举或让一个好的候选人变坏。然而,当选举由极微弱优势决定时,毫无疑问,技术可以发挥作用。
- 微观定位在政治中的有效性广受争议,但我们不知道它在特朗普竞选中的效果如何。在选举之后,丑闻各方的关键人物(川普竞选团队、CA、特德·克鲁兹竞选团队、亚历山大·科岗)都公开声称 CA 的模特是一文不值的蛇油、自切片面包以来最好的东西,或者根本没用过。其他怀疑者对微定位的有效性进行了辩论,而该领域的研究人员则持不同意见。鉴于 CA 的模型不在公共领域(谢天谢地),我不会猜测它们在多大程度上帮助或没有帮助特朗普获胜。请记住,大多数方面都受到激励,要么保持距离,要么邀功。
Source: https://overthinkgroup.com/facebook-cambridge-analytica/
3。这一丑闻的根源是同意。在 2014 年之前,脸书的开发者政策允许第三方应用在没有朋友同意的情况下收集脸书用户朋友的数据。因此,尽管只有约 30 万人参加了在线性格测试并表示同意……这也暴露了他们朋友的数据(他们没有明确表示同意)……8700 万人。该数据随后与 CA 共享(违反脸书的政策)。没有黑客入侵,数据永远在外面。
**4。您的数字足迹正在增长。机器变得越来越智能。政治是一场高风险的游戏。**这不是你最后一次听说坏人利用你的数据进行邪恶的活动(叹气),但是知情是很重要的,这样你就可以在数据隐私方面做出自己的选择。数据经纪人不歧视政党,在某些情况下,你可以看到这些机构掌握的你的数据。像 CA 这样的组织已经被用于2020 年的选举,脸书现在有一个选举作战室来应对新出现的威胁,所以这不是你最后一次听到这个消息。
既然我已经一吐为快了,让我们来看看心理侧写是如何工作的。
你思想的隐形操纵者
心理测量是一种测量个人性格的科学尝试,自 20 世纪 80 年代以来一直存在。
简单来说,人们参加一个问答性格测验,他们在标准的“大五”性格特征(海洋)上得分。
Source: Cambridge Analytica
一旦你知道了某人的个性,你就可以将他们分成不同的广告段,并根据他们的个人口味,发布量身定制的有说服力的广告。
大数据的兴起
尽管心理特征分析已经存在了几十年,但问题总是在于数据收集。
由于大多数性格测验涉及 100 多个问题(如下例),需要 20-30 分钟才能完成……从全球范围内的大范围人群中收集数据从来都不容易。
Sample personality question from IPIP
然后脸书在 2004 年出现了。
“大数据”一词是在 2005 年创造的。
第一代 iPhone 发布于 2007 年。
我们的数字足迹开始呈指数增长。
大研究和炸薯条
突然,研究人员看到了机会。
2007 年,剑桥心理测量中心的两名心理学研究人员开发了一款脸书性格测试应用(myPersonality),并迅速走红。超过 600 万人使用该应用程序,其中近一半的人允许研究人员使用他们的脸书数据。
社会科学家现在有了一座个性数据的金矿,他们可以从中挖掘洞察力。
2013 年,他们发表了突破性的研究,表明你对脸书的喜欢可以预测你的个性和政治观点(以及其他方面):
Source: http://www.pnas.org/content/pnas/early/2013/03/06/1218772110.full.pdf
Source: http://www.pnas.org/content/pnas/early/2013/03/06/1218772110.full.pdf
有趣的是,它表明高智商的最佳预测者是“雷暴”、“科尔伯特报告”和“卷曲的薯条”(注意:相关不等于因果……吃薯条不会让你更聪明,斯蒂芬哈哈!)。
“I can feel my brain getting bigger.” — Stephen Colbert (https://archive.org/details/COM_20130328_083000_The_Colbert_Report/start/840/end/900)
同样,喜欢“Hello Kitty”的人往往有“O——开放”的分数。
在他们的研究中,他们就数据隐私和所有权的含义敲响了警钟,但有其他议程的人很快注意到了这一点。
一个坏主意
在加入加州大学之前的 2013 年夏天, Christopher Wiley 发现了这篇论文并说:
“然后我偶然看到一篇关于性格特征如何可能是政治行为的先兆的论文,它突然变得有意义了。自由主义与高度开放和低自觉性相关,当你想到自由民主党时,他们是心不在焉的教授和嬉皮士。他们是早期采用者…他们对新思想非常开放。突然间,一切都变得明朗起来。”
2013 年晚些时候,Wiley 被介绍给了 Alexander Nix,后者向他提供了一份在英国行为研究和传播公司战略传播实验室(Strategic communication s Laboratories)担任研究总监的工作,该公司随后创建了美国子公司 Cambridge Analytica。
尼克斯告诉怀利,
“我们会给你完全的自由。实验。来测试你所有疯狂的想法。”
那不是个好主意。
在为 SCL 做研究时,威利与史蒂夫·班农取得了联系。鉴于班农作为《布莱巴特》主编对政治的兴趣以及他对奈杰尔·法拉奇脱离欧盟英国退出欧盟运动的支持,克里斯关于政治信息的想法激起了班农的兴趣。
12 月,CA 成立,班农担任副总统,并得到共和党超级捐助者和人工智能先驱罗伯特·默瑟的资金支持。
有了充足的储备,CA 需要找到一种方法来获得脸书的数据并实现他们的政治说服承诺。
数据采集季节到了
亚历山大·科岗出场了。
科岗是剑桥大学的一名研究员,2014 年初,威利和科岗经人介绍认识了对方。
威利和 CA 对科岗的研究实验室从他们的应用程序中获得的脸书数据感兴趣。
CA 愿意向研究人员支付数据费用;然而,科岗和他的大学同事们之间的谈判破裂了(他们既有伦理上的顾虑,也和科岗有金钱上的纠纷),所以科岗和 CA 设计了另一个计划。
科岗主动提出开发自己的应用程序,自己收集数据。CA 同意并帮助他建立了一个名为全球科学研究或“GSR 的独立实体 GSR 将获取数据,与 CA 共享,CA 将补偿 GSR 的费用。
Data Harvesting
为了加快收集数据,GSR 使用了第三方在线调查公司 Qualtrics,并通过亚马逊的 Mechanical Turk 向用户支付 2 至 4 美元进行性格调查。
受访者被要求授权访问他们在脸书的个人资料,科岗的应用程序执行了它的唯一功能——收集他们在脸书的数据和朋友的数据。
Senate Judiciary Hearing on April 10, 2018; Source: https://youtu.be/BylLTX05jSY?t=13699
总共有超过 300,000 名脸书用户参加了这次测验(CA 花费了大约 100 万美元),这相当于收集了大约 8,700 万人的脸书数据(你的喜欢和其他个人资料数据,如你的位置、你的名字等……)。
以下是我整理的时间表,展示了一些关键角色之间的联系:
Good Research, Bad Actors
那么哪里出了问题?
- 在应用程序审核过程中,脸书未能阅读 GSR 应用程序的所有条款和条件(见上面的条款图片&条件)。他们在法庭上承认了这一点,GSR 的条款规定他们可以出售人们的数据。
- 不管 GSR 自己的条款如何,GSR 自己忽略了脸书的应用程序开发者政策(科岗声称没有阅读),该政策禁止他们与 CA 共享数据。
- 朋友没有明确同意 —脸书的应用开发者政策(当时)允许一个人同意他们所有朋友的数据。
现在 CA 有了他们的数据,是时候让他们使用,呃…“滥用”它了。
从实验室到政治说服
“我们利用脸书收集了数百万人的个人资料。并建立模型来利用我们对他们的了解并锁定他们内心的恶魔。这是整个公司建立的基础。”— Christopher Wiley,加州大学前数据科学家
这里有一个简单的例子来说明微定位是如何工作的:
- 识别选民——利用选民记录和其他数据,识别尚未做出决定的选民
- ID 热点话题 —选择一个对选民来说重要的“热点”话题,如第二修正案(持枪权)
- 调整广告以适应个性——根据个人的个性档案,细微调整信息以更好地引起那个人的共鸣。
- 匿名投放广告——通过一种被称为“暗帖”(现已被禁止)的脸书做法,匿名购买广告并投放给符合你标准的人
正如 Alexander Nix 所解释的那样,例如,一个高度神经质(‘N’)和高度尽责(‘C’)的人需要一个理性的、基于恐惧的信息。他们会看到一张窃贼进入他们家的照片,因为入室盗窃的威胁以及拥有枪支的保险单很有说服力。
Source: Cambridge Analytica
相反,一个开放程度低(“O”)且非常随和(“A”)的人需要根植于传统和家庭的信息。他们会看到一张父亲将价值观传递给儿子的照片。
根据一名前 CA 员工泄露的内部幻灯片显示,在特朗普竞选期间,他们的广告被观看了 15 亿次。
随着大数据的兴起,广告变得越来越个性化也就不足为奇了。不过,问题不在于个性化广告。问题在于数据隐私、缺乏透明度和同意。
现在我将使用一步一步的电子表格来解释丑闻背后的数据科学。是的,有数学。但是你可以遵循所有的公式…不需要编码。
在这一部分,我将讨论:
- 性格预测研究中使用的算法概述
- 拉索回归简介
- 拉索回归中如何选择最佳λ
将第 4 部分视为套索回归的“鸟瞰”级别视图;然而,第 5 部分是“虫眼”视图。
在第 5 部分中,您将看到所有的逐步数学推导和对 Excel 文件中公式的引用。它非常详细,但坦率地说,我不能忍受教程隐藏这些细节,所以我们将得到引擎盖下!
4.1 个性预测算法概述
尽管 CA 使用的确切算法并不公开,但我们可以转向他们的想法所基于的研究论文,并从采访中收集见解。
以下是我们从两篇重要研究论文中了解到的情况:
LASSO: http://www.pnas.org/content/pnas/112/4/1036.full.pdf; SVD: http://www.pnas.org/content/pnas/early/2013/03/06/1218772110.full.pdf
我选择 LASSO 回归作为本教程的参考,是因为两篇论文背后的一位研究人员和亚历山大·科岗(剑桥的研究人员,他给了 CA 所有的脸书数据)所做的评论。
2018 年在艾伦·图灵研究所谈论他 2014 年的论文时,论文背后的一名研究人员这样说:
“我们没有做奇异值分解,而是做了套索回归,这提高了我们的精确度.”
再者,科岗有说:
“我们并没有完全使用 SVD,”他写道,并指出当一些用户比其他人有更多的“喜欢”时,SVD 可能会很困难。相反,科岗解释说,“这项技术实际上是我们自己开发的……它不属于公共领域。”没有深入细节,科岗将他们的方法描述为“多步骤共现方法”
当你有高维数据时,SVD 和 LASSO 都是强有力的技术(一个“大”的特征…就像我们例子中的数百万个“脸书页面”)。它们都为您提供了消除数据冗余、关注最具预测影响力的信息以及提高计算效率的方法。LASSO 还有一个额外的优点,那就是可解释性。
4.2 套索回归简介
套索回归是一种线性回归,它使用 L1 正则化(如下所述)来防止过度拟合和执行自动特征选择。
由于我们的目标是找到最重要的脸书页面对个性得分的预测影响,自动特征选择(消除没有影响或多余影响的脸书页面)非常有吸引力。
Each Facebook Page‘s coefficient determines that page’s predictive influence
先定义 LASSO 代表什么,定义背后的目标函数(基于 scikit-learn 对 LASSO 的实现)。
L 东AbShrinkageS选举 O 操作员
目标是找到使我们的目标函数最小化的系数(贝塔系数)(下面以 4 种不同方式给出):
在方程的前半部分,拟合度,我们有一个简单的均方误差方程(前面的 1/2 项是为了简化我们将在第 5 部分探讨的数学)。
在等式的后半部分,L1 惩罚,如果λ(我们控制的调谐参数)大于零,那么如果我们希望最小化目标函数,添加我们的系数的绝对值意味着我们的系数必须收缩(与没有惩罚的系数值相比)。
因此,套索中的“最小绝对收缩率”或“LAS”。
把 L1 的处罚想象成收缩射线。它将缩小系数的大小…并且有可能使系数消失。
L1 penalty is like a shrink ray gun. It shrinks coefficients and sometimes makes them disappear!
你可能想知道为什么我们要增加一个惩罚来缩小系数的大小?答案是防止“过度拟合”
当算法“记忆训练数据”时,就会发生过度拟合,这意味着它不会针对看不见的/测试数据进行很好的概括。添加惩罚有助于“调整”系数的大小,并改进算法对从未见过的维持数据的预测。
L1 penalty prevents overfitting
正如我们将在下一节中看到的,当 lambda 值足够高时,它也会迫使一些系数为零,因此充当’选择运算符’(LASso 中的“SO”)。具有零系数的页面意味着该页面在预测中被忽略,并且当我们有许多具有零系数的页面时,这被称为“稀疏解”
反之,如果系数很大(真的很高或者真的很低),则说明该页面的影响力度很高。
4.3 如何在 LASSO 回归中选择λ
选择最佳 lambda 值的一种流行技术叫做交叉验证。
在 k-fold 交叉验证中,您任意选择一系列 lambda(我在 Excel 模型中使用 0.0、0.01、0.10、1.0),查看每个在您的验证集上的表现,并选择在所有验证集中具有最低平均误差的 lambda。
例如,如果我们有足够的数据(未在 Excel 中显示),我们会将我们的数据分成训练/测试集,然后进一步将我们的训练数据分成 5 (k)个折叠或分区。在 5 个验证集上测试了每个 lambda 之后,我们会选择平均误差最小的一个。
在 Excel 模型中,我使用了一个难以置信的小数据集作为文件,旨在便于遵循并向您传授关键原则:
- 训练集= 5 人(和 8 个可能的脸书页面)
- 测试集= 2 人
- 验证集=无
假设没有验证集,两个人的测试集将足以在 Excel 模型中选择最佳的 lambda😎
在测试了所有的λ之后,当我们增加λ的大小时,可视化收敛的脸书页面系数的路径是有帮助的(参见表“C1”。Excel 文件中的分析-套索追踪):
LASSO Trace — Tracking Coefficient Values Based on Different Lambdas
这给了我们几个推论:
- 随着λ的增加,稀疏度增加…零系数的数量从零增加到全部
- 当λ为零时(没有 L1 惩罚),使用所有系数,并且训练 MSE 是最佳的;然而,当 lambda 为 0.10 时,测试 MSE(最终影响因素)是最佳的。
- 当λ太低时,0.0,我们过度拟合(低训练 MSE,较高测试 MSE)。当λ太高(1.0)时,我们处于拟合不足状态(高训练和测试 MSE)。
现在你已经对 LASSO 做了什么有了一个高层次的了解,我们将处理一些具体的数学问题,并浏览如何在 Excel 模型中为特定的 lambda 训练算法。
现在是我们动手的时候了…在我们训练算法的时候,我会处理下面的每个部分。
- 定义目标函数、关键术语和 Excel 文件概述
- 数据预处理——从“喜欢”到“标准化”
- 用零初始化系数
- 循环坐标下降—一次更新一个系数
- 迭代直至收敛
我们的目标是找到对某人的开放程度最有预测性影响的脸书页面(海洋人格得分中的“O”)。虽然 Excel 文件中的人是虚构的,但脸书的 8 页是研究论文中最有影响力的部分。
5.1 定义目标函数、关键术语、Excel 文件
如第 4 部分所述,我们的目标是找到使套索成本函数最小化的系数(为了清楚起见,下面给出了几种方法)。在函数下面是一个图例,解释每个希腊符号。
当我们完成训练算法的步骤时,您可以参考表“B1”。TrainingAlgorithm_Lambda_.01”了解数学运算。
我会告诉你如何更新 1 脸书页的系数。
由于每个系数是“一次一个”更新的(而不是像梯度下降中那样“一次/同时更新”),您可以将相同的数学方法应用于后续的系数更新。
Excel 表从左到右将“迭代”(所有系数的完整训练循环)组织成多个部分。在每次迭代中,你可以看到每个脸书页的系数是如何一次更新一个的。最后,你可以在左上角看到我们的 lambda 超参数。
在我们训练我们的算法之前,我们必须把我们的‘喜欢’转换成计算机能理解的语言……0 和 1!
5.2 数据预处理:从“喜欢”到“标准化”
我们训练管道的第一步是预处理我们的数据。参见 Excel 文件中的表“a .预处理数据”。
我们首先将每个“Like”转换为“1 ”,其他的都变成“0 ”:
接下来,为了确保一个页面的受欢迎程度不会影响算法对该页面的权重,我们必须让每个脸书页面处于相同的比例。
如果一个页面非常受欢迎(比如“TED”——5 个人中有 4 个人喜欢它),我们需要一种方法来确保算法不会对这个页面和一个不太受欢迎的页面(比如“单身汉”——5 个人中只有 2 个人喜欢它)产生不同的权重。
为了实现这种缩放,我们使用一种称为标准化的技术。标准化使每个页面居中,因此每个页面的平均分数为 0,标准偏差为 1(这使每个页面符合相同的“钟形曲线”)。
**Standardization Formula (also in Excel file):** (Sample Page Raw Score — Page’s Average Score)
= ______________________________________________
Page’s Standard Deviation
Preprocessing Data — Standardization
5.3 用零初始化系数
在训练开始时,每个脸书页面的系数从 0 开始。
然后,使用一种称为“循环坐标下降”的迭代更新方法,该模型“学习”每次调整 1 个系数,以根据我们的训练数据生成更好的预测。每个系数都可以被认为是一个“坐标”,我们按顺序循环(从第一个开始,到第八个结束)。
由于我们的数据在训练开始时是标准化的,我们可以有效地忽略偏差,因为它对模型没有影响。
参见表 B1。TrainingAlgorithm_Lambda_.01 ":
为了确保这个算法可以重现,我在每次迭代中以循环顺序更新系数;但是,这不会在生产中产生最好的效果。
由于 LASSO 在消除冗余方面做得很好,因此按顺序更新它们将导致算法保留第一个脸书页面的系数,如果有两个页面有相同的喜欢。
如果你用 Python 实现 LASSO(比如 sci-kit learn 的包),最好选择“随机”而不是“循环”这将确保每次迭代中系数更新的顺序是随机的,这也将导致更快的收敛。
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html
5.4 循环坐标下降:更新系数
⚠️在这一节,有很多数学 ⚠️
为了清晰起见,展示了每一个艰苦的步骤,您将看到机器实际上是如何“学习”更新系数的。
为了便于参考,您可以查看作为 PDF 的数学步骤,或者参考 Excel 文件中的“D. LASSO 回归数学”表。
所有数学运算的最终结果提供了用于更新每个系数的 3 个更新规则。例如,参见表“B1”中的第 36–45 行。Excel 文件中的 TrainingAlgorithm_Lambda_.01 "。
如果这不适合你,你可以试试这种方法…
循环坐标下降是一种优化算法。在每次迭代中,一个坐标(或“系数”)在使我们的目标函数最小化的方向上更新。
与梯度下降的关键区别在于套索目标函数中的 L1 罚项因绝对值符号而不可微。
本质上,如果我们知道函数的输出(如误差)将通过改变输入(如系数)的值而改变,那么函数就是可微的。
因为绝对值的导数可以是-1,未定义,或 1,所以它是不可微的。因此,我们必须计算“子梯度”,我们的更新规则将根据满足的条件采取 3 种形式中的 1 种。
以下是我们将涉及的 4 个步骤:
- 计算 MSE 相对于 1 系数的梯度(套索成本的第 1 部分)
- 简化步骤 1 的结果,重新定义术语
- 计算 L1 罚金的次梯度(套索成本的第 2 部分)
- 将步骤 1 中的梯度与步骤 3 中的子梯度相结合,并定义 3 个更新规则。
第 1 步,共 4 步:
第 2 步,共 4 步:
在 Excel 文件中,您可以在工作表“B1”上看到这些计算。第 16–34 行中的 TrainingAlgorithm_Lambda_.01 "。
第 3 步,共 4 步:
第 4 步,共 4 步:
在 Excel 文件中,您可以在工作表“B1”上看到这些计算。第 36–45 行中的 TrainingAlgorithm_Lambda_.01 "。
在你训练算法时一次更新一个系数之后,下一个问题是…你什么时候停止训练?
5.5 迭代直到收敛
在 LASSO 回归中,收敛标准是用户定义的,当满足以下两个条件之一时,算法停止训练:
- 最大迭代— 一旦算法经过(插入次数)次迭代(对所有系数进行“训练循环”),训练停止。
- **‘Tol = Tolerance’—**Tolerance 代表迭代前后系数值的变化。在每次迭代结束时,该算法比较该迭代之前/之后的每个系数的值,如果至少有一个系数的变化没有超过容差值,则训练停止。
在 Excel 文件中,可以在第 373–385 行看到公差标准,我使用的公差为 0.001。
停止训练后,您应该选择在验证集上表现最好的 lambda,并检查系数。
包裹
当您拥有数百万个要素并且正在寻找一种简单的方法来解释结果时,套索回归是一种强大的工具。
在我们的例子中,我们可以看到“科尔伯特报告”是最有预测影响力的脸书页面;但是,请记住,算法首先看到了这一页,因为我们没有以随机顺序更新系数,所以这是一个有偏差的结果。
当我们反思脸书丑闻时,信任是双向的,当这种信任被打破时,各方都应该重新审视自己的信念、政策和行动。
我们正处于数字时代的婴儿期,我们几乎还没有找到自己的立足点,但随着技术的加速发展,我们的数字足迹将继续呈指数级增长:
在此类丑闻之后,社会对数据隐私的看法将继续被重塑,未能发展的公司将通过自然选择被淘汰。
数据科学既不是万灵药,也不是诅咒。当谈到心理测量学的未来时,斯坦福大学的研究员迈克尔·科辛斯基总结道:
“这有点像火,”他说。“你可以用火来温暖你的房子,也可以烧掉它。你不能禁火,也不能阻止某些人纵火。你需要的是消防员和消防设备。”
订阅更多并分享
如果你喜欢这个,并且想在 Excel 中获得更多免费的机器学习教程,直接发送到你的收件箱,请点击下面并输入你的电子邮件。
课程包括如何建立你的第一个神经网络,面部识别如何工作,以及网飞如何生成你的建议。
如果你是一个电子表格积极分子,请与他人分享这篇文章😉
其他资源:
- 电影——关于心理测量学的 14 分钟纪录片+丑闻
- 拉索回归——VBA 教程(帮我做了详细的数学)
- 拉索回归(L1) vs .岭回归(L2)——Python 中的精彩概述来自 Aarshay Jain 和 Team AV
- 套索回归— Coursera 第一课
- 脸书于 2012 年提交的个性预测专利申请(在“喜欢”的预测能力研究发表之前)
基于网络的语音命令识别
上次我们将音频缓冲区转换成图像。这次我们将拍摄这些图像,并使用 deeplearn.js 训练一个神经网络。结果是一个基于浏览器的演示,让你说出一个命令(“是”或“否”),并实时查看分类器的输出,就像这样:
很好奇想玩玩它,看看它除了识别是和否之外,是否还识别耶或否?现场试用。你会很快发现表演远非完美。但这对我来说没问题:这个例子是为了成为在网络上进行各种音频识别的合理起点。现在,让我们深入了解这是如何工作的。
快速入门:训练和测试命令识别器
以下是你如何训练自己的是/否分类器:
2.单击训练按钮,您将看到一个显示训练进度的图表。一旦你准备好了(这将需要一段时间,可能 500 次迭代或 2 分钟,取决于你的硬件),停止训练,并按下保存重量(文件)按钮。这将下载一个 JSON 文件。
3.然后进入推理演示页面,按下 load weights (file)按钮,选择下载的 JSON 文件,加载训练好的模型。
4.翻转开关,允许使用麦克风,并尝试说“是”或“否”。您将在页面底部看到麦克风和置信度。
以上是对训练示例如何工作的机械描述。如果你有兴趣了解血淋淋的(和有趣的)细节,请继续阅读。
数据预处理和加载
训练一个神经网络需要大量的训练数据。在实践中,可能需要数百万个样本,但我们将使用的数据集按照现代标准来看是很小的,只有 65,000 个标记样本。每个示例都是一个单独的 wav 文件,文件名中带有标签。
将每一个训练 wav 作为一个单独的请求来加载被证明是非常慢的。每个请求的开销很小,但是当超过几千次时,就真的开始感觉到了。为了更快地加载数据,一个简单的优化方法是将带有相同标签的所有示例放入一个长音频文件中。解码音频文件非常快,把它们分成一秒钟长的缓冲区也是如此。进一步的优化是使用压缩音频格式,例如 mp3。[scripts/preprocess.py](https://github.com/google/web-audio-recognition/blob/master/train-model/scripts/preprocess.py)
会为你做这个连接,产生这个迷人的结果。
在我们“再水合”我们的原始音频示例之后,我们将原始数据的缓冲区处理成特征。我们使用我在上一篇文章中提到的音频特征提取器来完成这项工作,它接收原始音频,并生成 log-mel 声谱图。这相对较慢,并且占据了加载数据集的大部分时间。
模型培训注意事项
对于是/否识别器,我们只关心两个命令:“是”和“否”。但是我们也想发现任何这样的话语的缺乏,以及沉默。我们包括一组随机话语作为“其他”类别(没有一个是或不是)。这个例子也是由预处理脚本生成的。
因为我们面对的是真正的麦克风,我们从来没有期望听到纯粹的寂静。相反,“静音”是某种程度的环境噪音加上糟糕的麦克风质量。幸运的是,训练数据还包括背景噪声,我们将它与不同音量的训练样本混合在一起。我们还生成了一组无声示例,其中仅包括背景音频。一旦我们准备好样品,我们就生成最终的光谱图作为我们的输入。
为了生成这些最终的频谱图,我们需要决定缓冲区和跳跃长度。合理的缓冲长度是 1024,跳长是 512。由于我们处理的是 16000 Hz 的采样速率,因此计算出的窗口持续时间约为 60ms,每 30ms 采样一次。
一旦我们标记了光谱图,我们需要将输入和标签转换为 deeplearn 数组。标签字符串“是”、“否”、“其他”、“沉默”会被一键编码为四个整数的Array1D
s,意思是“是”对应[1, 0, 0, 0]
,“否”对应[0, 1, 0, 0]
。来自特征提取器的光谱图需要转换成一个Array3D
,作为模型的输入。
我们正在训练的模型由两个卷积层和一个完全连接的层组成。我直接从 deeplearn.js 的 MNIST 示例中获得了这个架构,并且根本没有为处理 spectrograms 进行定制。结果,性能与最先进的语音识别相差甚远。要查看更多的错误分类,请尝试音频的MNIST,它可以识别语音数字(例如“0”到“10”)。我相信,通过遵循本文我们可以做得更好。现实世界的语音识别器可能根本不使用卷积,而是选择更适合处理时间序列数据的 LSTM 。
最后,我们想告诉机器学习框架如何训练模型。用 ML 的说法,我们需要设置超参数,包括设置学习率(每步跟随梯度多少)和批量大小(一次摄取多少个例子)。我们出发去比赛:
在训练过程中,梯度下降算法试图最小化成本,你可以看到蓝色。我们还用橙色绘制了准确性,这是偶尔通过在测试集上运行推理来计算的。我们使用测试集的随机子集,因为推理需要时间,我们希望尽可能快地训练。
一旦我们对测试的准确性感到满意,我们就可以保存模型权重并用它们来推断结果。
保存和加载模型权重
一个模型由它的架构和它的承重节点的重量来定义。权重是在模型训练过程中学习的值,并且不是所有节点都具有权重。ReLUs 和 flatten 节点不会。但是卷积和全连接节点既有权重也有偏差。这些重量是任意形状的张量。为了保存和加载模型,我们需要能够保存图和的权重。
保存和加载模型很重要,原因如下:
- 模特训练需要时间,所以你可能想训练一下,减肥,休息一下,然后从你停下的地方继续。这称为检查点。
- 从推论上来说,拥有一个可以加载和运行的自包含模型是很有用的。
在撰写本文时,deeplearn.js 还没有序列化模型和模型权重的工具。对于这个例子,我实现了一种加载和保存权重的方法,假设模型架构本身是硬编码的。[GraphSaverLoader](https://github.com/google/web-audio-recognition/blob/master/train-model/src/GraphSaverLoader.ts)
类可以保存来自本地存储(IndexedDB)或文件的&负载。最终,我们将需要一种非黑客的方式来保存和加载模型及其相应的权重,我对 ML 开发人员工效学的改进感到兴奋。
包扎
非常感谢 Nikhil 和 Daniel 在 deeplearn.js 上的辛勤工作,以及愿意回答我一连串愚蠢的小问题。另外,还要感谢皮特,他负责创建和发布我在这篇文章中使用的数据集。亲爱的读者,谢谢你读到这里。
我很高兴看到这种基于浏览器的音频识别技术如何应用于令人兴奋的教育 ML 项目,如可教机器。如果你能制造一个自我改进的系统,对每一个额外的口语进行训练,那该有多酷?在浏览器中训练这些类型的模型的能力允许我们以保护隐私的方式考虑这样的可能性,而不用向任何服务器发送任何东西。
所以你有它!这是对网络上语音命令识别的解释。我们在的上一篇文章中讨论了特征提取,而这一次,我们稍微探讨了一下完全在浏览器中进行的模型训练和实时推理。
如果你以这个例子为基础,请在 twitter 上给我留言。
最初发表于smus.com。
面向数据科学家的 Web 开发
一口大小的数据科学第三集
几乎从定义上来说,数据科学是跨学科的。一个好的数据科学家既是统计学家,又是主题专家,还是开发人员。
但是,你如何检查这些盒子呢?你需要知道的大多数统计数据和模型构建都可以通过像 Udacity 和 Fast.ai 这样的 MOOCs 获得。你需要的大部分主题经验,你可以在工作中学习,或者通过阅读维基百科的文章。
但是开发者盒子呢?在数据科学的上下文中,“开发”是什么意思?弄清楚这一点可能是在数据科学领域立足的最具挑战性的方面,因为大多数进入数据科学的人都是为了算法和模型构建。
他们通常不知道如何编写干净的代码,或者如何进行 web 开发——或者为什么这很重要。
这就是为什么 Wesley 在本周的指导中开始关注网络开发。
Web 抓取:Scrapy 和 Selenium 概述,第一部分
kaggle.com
关于可以节省您时间的铲运机设计的想法
在这篇文章中,我分享了我第一次使用网络抓取的经验和我用过的工具( Scrapy 和 Selenium )。我希望这篇文章能对那些寻求普遍指导的人有所帮助,因为我涵盖了我认为有价值的知识和我希望在第一次想到刮擦时就知道的事情。具体来说,我想强调一起使用这两个工具的特点以及何时使用什么,因为我在网上找到的许多解释都集中在其中一个上。我不会讨论代码的细节,我会在另一篇文章中讨论,但我会通过 Airbnb 的例子来回顾我随着时间的推移而形成的概念理解,我发现 Airbnb 是这个主题的一个很好的榜样。作为旁注,我将使用术语网络抓取,抓取和网络爬行作为同义词。
F 首先,这不是火箭科学。可以说,开始这种项目的最好方法是边做边学,对于某些网站,你可以用 Python 的基础知识和手头的教程在几天内构建一个工作的 scraper。我开始从学习这种【真正有用】的零碎课程,打折时大约 10 美元。在很大程度上,本课程涵盖了 Scrapy 在网络爬行中的使用,但也涉及到了 Selenium 的使用。这两个可以单独使用,并合并在一个刮刀。如果您是 Python / JavaScript 初学者,合并它们可能需要一些额外的研究,但这是完全值得的。就我个人而言,我发现 Corey 的 YouTube 频道在学习 Python 基础知识方面很有帮助,因为他有很好的方法来分解概念。
D 不同网站——不同工具。 虽然 Scrapy 是一个专门为 web 爬行而设计的 Python 框架,但它最适合正确呈现的 XML 和 HTML 页面,可能不适用于 JavaScript 驱动的页面,这些页面使用 React 和 Angular 等框架。实际上,这意味着您将向 Scrapy 传递一个有效的元素选择器,但将得到一个空输出。这方面的一个例子是不同种类的定时器和交互元素。Scrapy 的另一个特点是,它通过访问页面的 URL 来浏览页面,然而,当您检查元素或获取源代码(通过xpath
或css
)时,您会发现一些按钮没有任何链接到它们的 URL。例如,这个导游有一个href
(网址),所以你可以重定向到旅游信息。
airbnb.ae
另一方面,这个 Airbnb 的“成为主机”按钮在你检查源代码的时候是没有 href (=URL)的。
airbnb.ae
最后一种情况的另一个例子是无限加载页面,以及在某些情况下的“加载更多”或“下一步”按钮。比如这个“显示全部”按钮:
airbnb.ae
在这些情况下,如果你想使用 Python,你会求助于其他工具,比如 Selenium ,我发现这是一个对初学者相当友好但优化程度较低的抓取工具。具体来说,Selenium 使得与网站互动变得容易,或者简单地点击页面,同时获得我感兴趣的元素。
同时, Selenium 在处理某些 Scrapy 优雅处理的异常时显得笨拙。其中一个例子是NoSuchElementException
,Scrapy 返回一个空列表,而 Selenium 不能返回特定页面的所有元素。例如,考虑 Airbnb 上房屋的评论计数,如果一个物业有评论,计数器就会显示,你可以在跨度内的class="_1lykgvlh"
中看到它。
airbnb.ae
然而,下面的属性没有 reviews,计数器也不是源代码的一个元素,在同一个class="_1lykgvlh"
中没有什么可以“检查”的:
airbnb.ae
因此,如果您遍历所有这些类以从中获取所有元素,比如“new”标签、评论计数和“free cancel”标签,Selenium 将为第一个属性返回所有这些元素,并为第二个属性删除这些元素(即使只找到 1 个元素会触发 NoSuchElementException)。出于这个原因,在 Selenium 中处理这个异常和所有其他异常是非常重要的,因此您的 scraper 是健壮的和功能性的。
Selenium 的一个特性是,它必须为每个请求打开一个浏览器来get
URL。这意味着 Selenium 是一个内存密集型工具,您可能会遇到内存利用问题。出于这个原因,我选择只在必要的时候使用硒,而不是过度使用。在 Airbnb 的例子中,如果我可以选择,我会从目录页面中抓取所有属性的详细信息,而不是进入每个属性配置文件,从那里抓取详细信息并返回到目录。
S scrapers 不通用 不用说,不同的网站会要求构建不同的 scraper,除非它们有相同的源代码。也就是说,一旦网站发生变化,为特定网站编写的 scraper 可能需要更改,因此您可能需要调整脚本。例如,开发人员可能会更改某个元素的类名或 id,这将导致异常或空结果。因此,有必要在浏览器、终端中监控抓取过程,或者只是查看输出文件。
B e 好听。并且避免被堵 一般来说,态度好一点,温柔的接近服务器。如果网站有 API,就使用它,如果没有,你真的需要它们,小心不要让他们的服务器崩溃,避免你的 IP 被封锁,所以要掌握 DOWNLOAD_DELAY , sleep() 的窍门,设置并发请求的限制或其他暂停你的刮板的方法。一个好主意是避免从你的主工作站启动铲运机,至少在你开始熟悉它的行为时。因为如果 IP 地址被屏蔽或被标记为可疑,这不仅对你来说是痛苦的,对你的同事、家人和任何使用同一网络的人来说也是痛苦的。这意味着,要特别留意具有重要战略意义的网站,比如 google.com(它不会屏蔽你,但会邀请你参加 CAPCHAs 会议)。
我喜欢熟悉该网站的机器人政策,阅读 robots.txt 以大致了解他们更喜欢允许和不允许机器人做什么,并搜索他们的网站以了解他们是否允许机器人出现在他们的网站上。
robots.txt for airbnb.ae
仅仅看一下限制列表就会让你感觉到他们对 crawler 有多严格。网站可以区别对待机器人,抓取工具通常会被自动屏蔽。如果您的日志中有 500 的请求状态,并带有Request denied
或HTTP status is not handled or not allowed
等,您就可以识别出这种行为。
如果没有 API,并且在设置延迟后你一直得到 500 个,你可以为你的 scraper 设置一个USER_AGENT
,它会将它的头从pythonX.X
或任何其他默认名称(很容易被服务器识别和过滤)更改为你指定的代理的名称,因此服务器会将你的 bot 视为浏览器。在 Scrapy 中,最简单的方法之一就是通过设置。但是请记住,您希望让用户代理与您的机器操作系统和浏览器名称保持一致。例如,这个USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
可以在 Mac 上运行,但不能在 Ubuntu 上运行。
T 现在有很多工具可供选择 Scrapy 和 Selenium 并不是网页抓取的唯一选择。有许多 Python 库(例如, BeautifulSoup 、 urllib 、 lxml 、 Requests )和其他工具,如谷歌的木偶师(node . js),可以提供类似的结果。区别在于他们可以处理的框架和成本。因此,你的目标是熟悉他们的能力,并以最有效的方式使用他们。
这些是我做第一批刮擦项目时学到的主要东西。和大多数事情一样,最困难的是开始,不要迷路。因此,我建议参加在线课程,比如我发现非常有用的网上课程,如果你是初学者的话,可以逐渐加深理解。
这是这篇文章的第一部分,我将继续第二部分,在这里我将与你分享一个 Python 代码,并解释它的功能,这样你就可以复制它。
如果你有问题,请在下面评论,如果你想建立关系网,请在 LinkedIn 上与我联系。
LinkedIn:【https://www.linkedin.com/in/areusova/T2
GitHub:https://github.com/khunreus
从新闻博客中抓取和分析 400,000 篇文章
领先在线出版商的每日发帖频率有什么趋势&季节性吗?
在这篇文章中,我将分析由希腊领先的在线出版商之一 NEWSBEAST 发表的文章。核心问题是**“news beast 的每日发布频率有任何趋势&季节性吗?”**数据分析前的主要步骤(文末有完整 r 代码的链接可以):
- 使用 R 中的 rvest & car 库从站点(www.newsbeast.gr)抓取文章
- 数据准备(包括数据清理、转换)
- 探索性分析
让我们创建一个散点图来查看过去 4 年每天发布的文章数量。
Image by Author
我们可以清楚地发现,在每天发表的文章数量上有两种不同模式的持续趋势(在过去 4 年中)。我们怀疑在特定的工作日(可能是周末?)发表的日常文章明显少了。第二个趋势(不太明显)可能是每年发表的文章越来越少。现在让我们用不同颜色来区分每个工作日,以获得更清晰的视图。
Image by Author
所以现在很明显,周末期间的每日帖子数量比工作日少得多。
现在,让我们尝试在每个工作日建立一个模型,并创建一个图来展示这些。在下图中,每个工作日通过使用黄土回归拟合一条单独的平滑线来表示
Image by Author
周末的标准误差(95%置信水平)表明与工作日的差异是显著的。
现在让我们调查不同年份之间是否有显著差异。
Image by Author
通过查看误差线,看起来所有的差异(不同年份之间)在统计上都是显著的,除非在比较 2016 年和 2017 年时,误差线是重叠的。
这一发现可以通过在不同样本中应用非参数 Wilcoxon 符号秩检验来证实(见下表)
年份:2014–2015 | P 值< 0.001
年份:2015–2016 | P 值< 0.001
年份:2016–2017 | P 值< 0.001
所有的 p 值都非常低(< 0.01),置信水平为 0.95,因此发布的每日平均文章的差异非常显著。
最后,为了研究其他不太明显的季节性趋势,我们使用了一个专用于时间序列分析的软件包。使用 prophet package for R 拟合了一个预测模型,如下所示,它揭示了更多的季节性趋势。特别是在圣诞节和暑假期间(大约在 8 月份)的日常文章中出现了两个主要的“下降”。在复活节期间也有一个小的“下降”。
Image by Author
另一个有用的功能是能够绘制各种成分的图表(如下图),这是一个简单的方法来得出每日/每周/每年的趋势。特别是在下面的图表中,我们可以很容易地发现周末的下降,在圣诞节期间、暑假、复活节期间的日常文章中的“下降”以及每年的“下降”。
Image by Author
结论
分析表明,这个新闻博客发布的内容越来越少。另一个有趣的发现是,在假期期间(圣诞节、复活节、夏天和周末),发布的帖子显著减少。这很奇怪,因为众所周知,人们倾向于使用这些新闻博客,尤其是在假期。他们肯定应该在假期期间试着发布更多的文章。
特别是:
- 在过去的 4 年里,每日发布的文章显著减少。总体围绕 30% 的文章较少。
- 周末发表的文章比平日少得多。
- 每年圣诞节和暑假期间,日常生活用品会有两次显著的“下降”。
- 每年复活节假期期间,每日发表的文章数量都有小幅“下降”。
斯德哥尔摩的网络搜集公寓列表
使用 Python 进行抓取,使用 MS SQL server 进行存储
我和我的合伙人已经卖掉了我们的公寓,正在寻找一个新的。因为大多数人在寻找新公寓时,都要手动穿过 https://www.hemnet.se/,这对我来说似乎既乏味又累人。所以我想——为什么不利用我的 Python 知识,通过编程找到最合适的公寓呢?这就是我所做的,我做了一个非常简单的网页抓取器来找到待售的物品。
Photo by Adam Gavlák on Unsplash
目录
1.刮网部分
下面是一对通过库 BeautifulSoup 处理 HTML 对象的函数。请记住,这些功能可以用更专业和最佳的方式编写,但这个项目的范围确实是快速获得数据,以便完成一个“最佳”公寓交易。
1.1 刮削功能
首先,我们需要处理 BeautifulSoup 对象,我们在一个标准的 Python 函数中处理这个对象,我选择将这个函数命名为“Booli_ScrapeObjects”。该函数有两个输入参数(page 和 object_info ),其中 page 是 URL,object _ info是一个 Pandas 数据帧,用于存储每个对象的所有有趣信息。该函数的工作前提是网站的 HTML 对象保持静态。该函数如下:
**def** *Booli_ScrapeObjects*(page, object_info):
request = requests.get(page)
soup = BeautifulSoup(request.text,'lxml')
links = soup.select("a[href*=/annons/]")
**for** *j, row* in enumerate(links):
info = row.contents[5].text.split("\n")
**while** '' in info:
info.remove('')
info[0] = info[0].strip(" kr")
info[1] = info[1].strip(" kr/m²")
info[2] = info[2].strip(" kr/mån")
object_info.append(info)
**try:**
info.insert(0,"https://www.booli.se" + links[j]["href"])
#FETCHING ADDRESS, # ROOMS AND M2
request_apartment = requests.get(info[0])
soup_apartment = BeautifulSoup(request_apartment.text, 'lxml')
address = soup_apartment.findAll('span',
class_ = 'property__header__street-address')
address = address[0].contents[0].strip("\n\t\t")
info.append(address)
size = soup_apartment.findAll('span',
class_ = 'property__base-info__title__size')
size = size[0].contents[0].strip("\n\t").split(",")
rooms = size[0].strip(" rum")
m2 = size[1].strip(" m²")
info.append(rooms)
info.append(m2)
**except:**
info.insert(0, "Unknown") #Link
info.append("Unknown") #Address
info.append("Unknown") #Rooms
info.append("Unknown") #m2
info.append("Unknown") #Estimate
continue
**return** object_info
Print Screen from Boolis webpage - showing number of objects per page.
上面的函数抓取可以在给定页面上找到的对象。如果找到的对象数量大于 38 个,对象将被分割成多个页面(见左图)。这个问题在下面的函数中解决了,它采用相同的 URL 参数来计算我们有多少个页面,前提是每个页面最多包含 38 个对象。
**def** *Booli_findNumberOfPagesData*(url):
request = requests.get(url)
soup = BeautifulSoup(request.text,'lxml')
data = soup.findAll('div',
class_ = 'search-list__pagination-summary')
numberOfObjectsPerPage = 38
try:
numberOfObjects = int(data[0].text[
-(len(data[0].text)-3 - data[0].text.rfind("av")):])except:
numberOfObjects = 0
numberOfPages = int(
np.ceil(numberOfObjects/numberOfObjectsPerPage))**return** numberOfPages, numberOfObjects
有了上面的两个函数,我们可以编写一个新的函数,循环遍历每个 URL,并将信息存储在 Pandas 数据帧中。该函数如下:
**def** *loopThroughRegions*(data_url,
m2_max,
m2_min,
maxListPrice,
minListPrice):
object_info = []
region = []
length = [0]
**for** *index, row* in data_url.iterrows():
#Base URL
url = "https://www.booli.se/{}/{}/?
maxListPrice={}&
maxLivingArea={}&
minListPrice={}&
minLivingArea={}&
objectType=L%C3%A4genhet&
page=1&
upcomingSale=
".format(row["Region"],
row["RegionID"],
maxListPrice,
m2_max,
minListPrice,
m2_min)
object_info = **Booli_ScrapeObjects**(*url, object_info*)
numberOfPages, numberOfObjects = **Booli_findNumberOfPagesData**(*url)* **for** *page* in range(2, numberOfPages):
url = "https://www.booli.se/{}/{}/?
maxListPrice={}&
maxLivingArea={}&
minListPrice={}&
minLivingArea={}&
objectType=L%C3%A4genhet&
page={}&
upcomingSale=
".format(row["Region"],
row["RegionID"],
maxListPrice,
m2_max,
minListPrice,
m2_min,
page)
object_info = **Booli_ScrapeObjects**(*url, object_info*)
length.append(len(object_info))#Creating a simple vector containing duplicates of regions up to number of object stored for each region
**for** *i* in range(0, length[len(length)-1] - length[len(length) - 2]):
region.append(row["Region"])**return** object_info, region
为了在常规的 Microsoft SQL Server 数据库中存储 Pandas 数据框,我们需要清理数据。例如,我们想要两个重写对象,从 1 个房间到 1.5 个房间,依此类推。执行这一简单清洁过程的简单函数如下:
**def** *cleaningData*(object_info):
**for** *index, row* in object_info.iterrows():**if** row["m2"].find("+") != -1:
m2s = row["m2"].split("+")
newM2 = int(m2s[0]) + int(m2s[1])
object_info.set_value(index, "m2", newM2)**if** row["Number of rooms"].find("½") != -1:
rooms = row["Number of rooms"].split("½")**if** rooms[0] == "":
newRooms = 0.5
**else:** newRooms = float(0.5) + float(rooms[0])object_info.set_value(index, "Number of rooms", newRooms)**if** row["Rent"].find("—") != -1:
newRent = 0
object_info.set_value(index, "Rent", newRent)
**else:** newRent = "".join(row["Rent"].split())
object_info.set_value(index, "Rent", newRent)**return** object_info
1.2 数据库存储部分
最后,我们有了结构化格式的所有数据——所以现在是时候以一种方便的方式存储它了,即存储在数据库中。我们将所有数据存储在熊猫数据框中,如下所示:
Pandas Data Frame containing apartment data.
所以我们需要构建一个可以存储每一列的数据库表。这可以通过下面的 SQL 代码轻松完成(假设您使用的是 MS SQL server,尽管语法与其他数据库类似):
Query for creating the table “UpcomingSales”.
现在让我们编写一个简单的函数,它可以使用 pyodbc-package 连接到我的本地“本地”数据库。该函数如下:
**def** *mssql_connect*(server, database, driver):
cnxn = pyodbc.connect('DRIVER='+driver+ \
';SERVER='+server+ \
';DATABASE='+database + \
';Trusted_Connection=yes')
cursor = cnxn.cursor()
**return** cnxn, cursor
使用这个函数结合一个按行插入数据的查询,我们最终达到了我们的目标 (这个查询最好使用一个简单的 merge 语句来编写):
#SQL INPUT PARAMETERS
pyodbc.pooling = False
server = 'server'
database = 'database'
username = 'username'
password = 'password'
driver= '{ODBC Driver 13 for SQL Server}'cnxn, cursor = mssql_connect( server,
database,
username,
password,
driver)
data = result.values.tolist()
**for** *i, item* in enumerate(data):
insert_query = "IF NOT EXISTS ( \
SELECT \
* \
FROM \
[Booli].[UpcomingSales] \
WHERE \
[Link] = '" + str(item[0]) + "' AND
[DateInserted] = '" +
str(date.today()) +"') \
BEGIN \
INSERT INTO [Booli].[UpcomingSales] \
VALUES ('" + str(item[0]) + \
"'," + str(item[1]) + \
"," + str(item[2]) + \
"," + str(item[3]) + \
",'" + str(item[4]) + \
"'," + str(item[5]) + \
"," + str(item[6]) + \
",'" + str(item[7]) + \
"','" + str(date.today()) +"') \
END"cursor.execute(insert_query)#Cleanup
cnxn.commit()
cursor.close()
cnxn.close()
现在,我们可以通过一个简单的 select-query 与数据库对话来获得结果:
Select-query to the table that holds the object data.
2.可视化销售对象的数据
很容易调整代码,以抓取售出的对象,而不是待售的对象,我不会介绍如何做到这一点,而是我会显示一些简单的可视化从售出的对象抓取数据。首先,我们通过 SQL 查询调用数据库来获取数据。生成的数据将存储在名为“数据”的熊猫数据框中。获取数据的 Python 代码如下所示:
query = "SELECT
* \
FROM \
[Booli].[SoldObjects]"
data = pd.read_sql(query, cnxn)
输出如下所示:
此外,我们使用内置的 pandas 功能“cut”将租金成本分成不同的价格部分:
bins = [0, 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 10000]
labels = ['-500', '500-1000', '1000-1500', '1500-2000', '2000-2500', '2500-3000', '3000-3500', '3500-4000', '4000-10000'])data["Rent categories"] = pd.cut(
data['Rent'],
bins = bins,
include_lowest = True,
labels = labels
)
现在我们可以绘制数据,以了解不同租金类别的价格随时间的变化情况
直觉告诉你——租金越低,价格越高。现在让我们仔细看看斯德哥尔摩不同地区的价格差异
对于那些住在斯德哥尔摩的人来说,结果可能不会令人惊讶,因为奥斯特马尔姆的平均售价最高,远远高于整体平均水平。
现在,让我们来看看每个地区[价格/平方米]的分布及其各自的平均值
以及整个样本的[价格/平方米]的分布:
正如我们所见,整个样本的平均价格为 85000 SEK。
最后,我们来看看每个地区的平均[价格/平方米]以及这些物品的房间数量。
如前所述,该样本缺乏较高“#房间数”范围内公寓的数据,因此平均值不能代表实际市场价格。为了让我的观点更清楚,让我们计算每个区域的对象数和“房间数”
如图所示,在最好的情况下,我们可以说“# rooms”= 1、2、3 和 4 具有代表性平均值,而“# rooms”> 4 的平均值由于数据点较少而具有高度失真的平均值。
3.评论
首先,Python 代码肯定可以写得更有效率,但正如我指出的,这个项目的目的不是为抓取组件编写生产就绪代码,这只是一个用于特定目的的一次性项目。如上所述,刮擦部分的一个明显的优化是搜索多个区域而不是一个区域。
URL-structure for multiple areas.
4.进一步的工作
我们可以使用“每平方米价格”的响应变量 Y 实现一个简单的回归模型,以找出每个独立变量 x 的贡献。在给定一组独立变量值的情况下,该模型也可以用作价格估计器。
感谢您的阅读。如果您有任何问题,请通过 cfuru@kth.se 联系我,也可以在 linkedin 加我。