数据仓库指南
关于不同数据建模技术的简短而全面的信息
卢克·切瑟在 Unsplash 上的照片
在本指南中,我将尝试涵盖几种方法,解释它们的差异,以及何时以及为什么(在我看来)一种比另一种更好,并可能介绍一些在建模 DWH(数据仓库)或 EDW(企业数据仓库)时可以使用的工具。
我的故事
我在一家小公司开始了我的 BI(商业智能)职业生涯,该公司向其他公司咨询如何改进他们的流程,或者只是帮助他们建立一个 BI 系统,以便他们可以自己做出决定。
那段时间我是如何想象工作的(几乎是大学一毕业):我会去工作,得到设备,有人会解释我必须做什么,我会开始做。当我第一天来上班时,我感到非常惊讶:我已经拿到了 Ralph Kimball 的书“数据仓库工具包”,我的经理告诉我要阅读和学习。于是,我开始阅读,试图理解它。我花了一些时间。我不记得花了多长时间,但也许一周左右,才能得到适当的理解(至少在我看来)。
词汇表
需要解释的术语,您可能会在本文中找到:
暂存区 —原始/源数据的副本在我们拥有 DWH 的同一个数据库/机器上
转换区 —转换后的暂存数据。准备装载到 DWH
事实表 —带有一些度量的事务性或基于事件的数据。即销售信息、仓库产品移动。
维度表 —特定事物的所有信息都在一个地方。即所有产品相关信息、客户信息。
涵盖的方法
金博尔方法论
我从一个我首先学会的技术开始,主要是因为它容易理解。
它是由拉尔夫·金博尔和他的同事创造的(因此得名)。这种方法被认为是一种自下而上的设计方法。对于更一般的受众来说,可能更熟悉的是次元建模名称。就个人而言,我喜欢这种建模方式的原因是——易于设计和分析。它旨在回答特定问题或帮助理解特定领域(如人力资源、销售)。这种方法允许快速开发,但是我们失去了一些灵活性。通常,我们需要重新构建 DWH(或它的某些部分)来应用这些更改。大多数 BI 报告工具可以理解这种模型,并且可以快速拖放报告(即 MS SQL Server Analysis Services,Tableau)
金博尔流量:
- 将数据从源系统加载到登台
- 转换数据
- 加载 do 星形/雪花模式。
我将在下面的小节中更详细地介绍星型和雪花型模式。
星形模式
在星型模式中,我们有一个事实表和维度表(事实表中有所有的外键)。你可以在这篇维基百科文章中找到更多细节。简单地说,看起来是这样的:
优点:
- 如果我们想在某些维度上进行过滤,速度会更快(不需要多个连接)
- 简单建模(不需要标准化)
缺点:
- 我们需要更多的空间来存储事实表中的所有外键。
- 向事实表添加额外的维度键需要更大的努力(如果很大,更新将需要更多的时间)
雪花模式
雪花是一个多层次的星型模式。也就是说,我们在商店维度中有一个地址。我们可以用 address_PK 创建一个地址维度,它将指向 dim_shop。你可以在这篇维基百科文章中阅读雪花模式。简化的 it 视图:
优点:
- 减少在现有维度上添加额外层或分组的工作量
- 更少的存储
缺点:
- 更难过滤值(可能需要更多连接)
我并不是说一种建模比另一种更好;这完全取决于用例、可用资源和最终目标。权衡所有选项,考虑是否要向维度添加更多分组,是否要在以后添加更多原子层(用维度表的外键更新事实表)。
英蒙方法论
实际上我没有使用过它,所以这将是一个更理论性的概述。
这种方法是由比尔·恩门创立的,被认为是一种自上而下的方法。我们必须有一个完整的图片,并相应地将其建模为 3NF(范式),这使得这种方法比 Kimballs 更复杂。不利的一面是,您需要有技能的人来设计这个数据模型,并将所有的主题领域集成到其中。与 Kimballs 相比,它需要更多的时间来运行,但它更容易维护,而且更像是一种企业级的方法。
Inmon 流量:
- 将数据从源加载到阶段
- 将数据添加到符合 3NF 标准的 EDW(企业数据仓库)
- 在 EDW 上构建数据集市
为了将这些数据与 it 进行比较,我们需要对公司/业务领域的数据进行建模。从我个人的经验来看,我的第一个项目来自零售客户。我们在 Kimball 上做了一个星型模式的模型,因为我们知道需求和他们的数据问题。如果它想要更多的集成到他们的 DWH,像加入那些工作的员工,库存管理,它将更适合与 Inmon 的方法。
在我看来,如果一家公司很小,他们只想跟踪和改进特定的元素——通常用 Kimballs 的方法会更容易、更快。
数据库
从小公司跳槽到大公司对我来说也是一种打击。我更好地理解了有时候我们需要一个更好更简单的 EDW。那是我开始使用 Data Vault 的时候。在我看来——它是 Kimballs 星型模式和 Inmons 方法论的结合。两全其美。如果你想看得更详细,可以去丹·林斯特兹网站看看,他是这种方法的创始人。
我将介绍 Data Vault 的几个最重要的组件。
中心
Hub 是所有不同实体的集合,例如,对于 account hub,我们有一个帐户,account_ID,load_date,src_name 。因此,我们可以跟踪记录最初是从哪里加载的,以及我们是否需要从业务键生成一个代理键。
链接
听起来不好笑,但是链接是不同集线器之间的链接。也就是说,我们有员工,他们属于团队。团队和员工有不同的中心,所以我们可以有 team_employee_link,它会有 team_employee_link,team_id,employee_id,load_date,src_name 。
卫星
特定实体属性的维度缓慢变化。也就是说,我们有一个作为实体的产品。我们有多个产品信息栏,名称,价格。因此,我们将此信息作为一个渐变维度加载,其中包含信息产品标识、打开日期、关闭日期、已删除、产品名称、产品价格。捕捉所有的变化让我们能够重新创建数据的快照,并了解它是如何演变的。
除了这些最基本的实体,我们还有卫星链接,交易链接。这些我就不赘述了;如果你想了解更多——查看丹·林斯特茨网站或维基百科。
数据湖
我来自一个简单的数据背景,遇到了一个数据湖术语。它存储了我们所有的信息(结构化的和非结构化的)。如今,像大数据、数据湖这样的术语正得到大量关注。直到我开始处理大量的数据,我才明白为什么我们需要存储那么多不同类型的数据。数据是今天和未来的黄金。根据我对所有数据驱动型公司的经验,数据湖几乎是必须的。尽可能多地储存,然后进行分析,寻找见解。
以原始格式存储来自多个来源的数据有其自身的成本。
如果您不正确地记录和管理您的数据湖,它可能会变成一个数据沼泽。
在我看来,这是创建 EDW 前的一个附加层。数据工程师将原始数据引入数据湖,并在此基础上构建 EDW。分析师可以工作并依赖预处理和净化的数据。
莱克豪斯
Databricks 公司在 2020 年1 月底引入了这个术语。这里的想法是我们直接在源数据上做任何事情。大多数 ML/AI 工具更多地是为非结构化数据(文本、图像、视频、声音)设计的。将它们处理到 DWH 或数据湖需要一些时间,而且肯定不会接近实时。我对这种方法有点怀疑。这就像创造了一个巨大的数据沼泽,让人们淹没在其中。太多未经管理和清理的数据可能会导致错误的假设,并且不会成为大公司的真实来源。至少现在,虽然流不是一件大事情,但我认为等待这种方法更加成熟是值得的。除非你是某个想在竞争中遥遥领先并使用尖端技术的科技初创公司,但这只是我的假设。
摘要
在我看来,所有这些方法将长期共存。这完全取决于公司及其使用案例!
如果它只是一个小型或中型企业,如果旧的学校数据仓库方法满足您的需求,为什么要使用可能不会为您带来更多利润的东西呢?
如果是大型企业,如果您想保持竞争力并为客户提供优质服务,数据湖可能是必不可少的。在我看来,您仍然需要创建一个预处理层,这将是报告的某种真实来源,具有更多聚合/清理的数据。这里最适合的(在我看来)是星型或雪花型模式。它将使我们能够更快地寻找一般模式和趋势。如果我们需要深入研究,而 DWH/数据集市过于集中,我们可以随时去数据湖查看原始数据。
或者,也许你的员工精通技术,而你是一家下一代科技创业公司,你想通过提供见解并使用尖端技术来击败竞争对手——也许你需要一个湖边小屋?不幸的是,我还没有看到真正的用例,想不出它如何能与旧的学校方法一起工作,进行更干净和更流畅的分析。
引用表
[2]https://en.wikipedia.org/wiki/Star_schema
[3]https://en.wikipedia.org/wiki/Snowflake_schema
https://danlinstedt.com/solutions-2/data-vault-basics/
https://en.wikipedia.org/wiki/Data_vault_modeling
[6]https://databricks . com/blog/2020/01/30/what-is-a-data-lake house . html
单细胞 RNA-seq 分析中的降维指南
图片来源: Unsplash
2000 年初,单细胞 RNA 测序(scRNA-seq)技术在组学领域取得了重大突破。分离和排序单细胞遗传物质的能力使研究人员能够识别每个细胞中哪些基因是活跃的。这为批量 RNA 测序技术提供了前所未有的机会,批量 RNA 测序技术可以在群体水平上产生平均基因表达谱。据信,scRNA-seq 将在未来十年内改变生物学和医学研究的格局。
典型的 scRNA-seq 数据表由大约 20,000 个基因作为列/特征和 50,000 到多达一百万个细胞作为行/观察值组成。正如你可以立即指出的,这种技术受到“维数灾难”的困扰。并不是所有的基因对于根据它们的表达谱将细胞分类成有意义的簇都是重要的。因此,降维技术被用于降低数据复杂性和数据可视化。它还有助于下游应用,如聚类分析,因为一些聚类算法受到高维数的影响。在这篇文章中,我将讨论三种最流行的用于 scRNA-seq 数据的降维技术——PCA、t-SNE 和 UMAP。在简要介绍了它们的工作原理和优缺点之后,我们将在真实世界的数据集上应用它们。
主成分分析
让我们考虑一个有 m 个变量和 n 个观测值的 mxn 数据集矩阵。我们数据集中的每个观察值都是 m 维向量空间中的一个向量,该向量空间由某个正交基跨越。我们知道变量之间存在固有的冗余,并且不是所有的 m 维对于理解数据集的动态都是重要的。主成分分析提出一个问题:是否存在另一种基,它是原始基的线性组合,能最好地重新表达我们的数据集?
PCA 对原始数据集执行正交变换,以创建一组新的、不相关的变量或主成分。这些主成分是原始数据集中变量的线性组合。该变换被定义为使得主分量以方差的降序排列。因此,第一主成分达到最大可能方差。其思想是丢弃方差最小的主成分,在不损失太多信息的情况下有效地降低数据集的维数。
关于 PCA 更直观的解释请参考的帖子。
优点
高度可解释、计算高效
缺点
由于遗漏事件(弱表达基因被遗漏),scRNA-seq 数据是稀疏的,这意味着数据矩阵中有 60-80%的零。它是高度非线性的结构,而 PCA 是线性降维技术,因此被认为非常不适合数据可视化。PCA 仅用于选择大约前 10-50 个主成分,这些主成分可以用下游应用程序(如聚类分析)进行处理。
t-随机邻域嵌入(t-SNE)
t-SNE 是一种基于图形的非线性降维技术。它将高维数据投影到 2D 或 3D 组件上,是一种非常流行的数据可视化方法。关于 t-SNE 的精彩直观解释,我强烈推荐你观看 StatQuest 网站上的这个视频。简而言之,该算法首先创建定义高维空间中点之间关系的高斯概率分布。然后,它使用学生 t 分布在低维空间中重建概率分布。使用梯度下降来优化低维空间中的嵌入。
利弊
非线性数据集 : t-SNE 强有力地捕捉了高维数据集中的非线性,并能够保留低维中的局部结构。这是对 PCA 的巨大改进。例如,考虑下图所示的瑞士滚动流形。由 PCA 计算的两个突出显示点之间的接近度将是连接这两个点的直线,而 t-SNE 在理论上应该能够通过适当地展开它来解决流形的非线性。
最先进的方法:算法被设计成保留局部结构,因此高维空间中的邻近点在低维嵌入中结束得更近。t-SNE 已被用作 scRNA-seq 数据可视化的金标准方法。
缺点
随机性: t-SNE 是一种随机方法,涉及随机初始化,在连续运行时不会产生类似的输出。虽然这可能会让用户感到不安,但重要的是要注意保留了局部子结构。因此,只要您允许足够数量的迭代以允许收敛,总体输出不会有太大变化。此外,您可以始终设置一个种子,以确保每次运行算法时结果都是相同的。
例如,以下图像是使用相同输入参数运行两次的程序的 t-SNE 输出(没有设置随机种子)。如您所见,聚类改变了它们的位置,但是两个输出产生了总体上相似的结果,即 5 个聚类。
**全局结构未保留:**t-SNE 的工作方式是,在进行降维的同时,不可能保留全局结构。这可能与优化 Kullback-Liebler 分歧有关,更多细节请参考这篇优秀的在 Medium 上的帖子。在上面的示例中,两个输出中各个组的形状相似,即保留了局部结构。但是,在两个输出中,组之间的距离有很大不同(参见紫色和红色组),因此没有意义。
仅数据可视化 : t-SNE 仅将数据点嵌入 2 维或最多 3 维。与 PCA 不同,它不会产生 10-50 个可被聚类算法利用的成分。t-SNE 作为一种降维技术,因此只限于数据探索或可视化。
**计算量大:**对于庞大的数据集,算法需要很长的运行时间。通常首先通过 PCA 降低维度,然后对顶部的几个主成分执行 t-SNE。尽管已经设计出了一种叫做 FItsne 的更快的实现,但它仍然存在 t-SNE 的其他缺点。
一致流形逼近和投影(UMAP)
UMAP 是麦金尼斯等人在 2018 年推出的一种相对较新的降维技术。该算法是基于图形的,主要类似于 t-SNE,它构建数据的高维图形表示,然后优化低维图形,使其在结构上尽可能相似。其背后的数学知识要高级得多,超出了本文的范围。感兴趣的读者不妨参考原文或者麦金尼斯在 youtube 上的解释。
优点
非线性数据集 : UMAP 是多方面学习降维技术,从而捕捉真实世界数据集的非线性。在数据可视化方面,它与 SNE 霸王龙不相上下。
计算效率:UMAP 的数学改进使得运行时性能优于 t-SNE(以及临时算法 FItsne)。
**全局结构保存:**与 t-SNE 相比,UMAP 能更好地保存数据的全局结构。通过调整超参数n_neighbours
和min_dist
,用户可以有效地控制局部和全局结构之间的平衡。
下游应用:与 t-SNE 不同,UMAP 对嵌入维数没有计算限制,可以用作有效的预处理步骤来提升基于密度的聚类算法的性能。
缺点
**缺乏可解释性:**与主成分分析不同,主成分是源数据的最大方差方向,UMAP 的低维嵌入缺乏强可解释性。
**噪声的伪检测:**UMAP 的核心假设之一是数据中存在流形结构。正因为如此,UMAP 倾向于在数据集的噪声中找到流形结构。UMAP 对较大的数据集更稳健,因为在较大的数据集中,明显受噪声影响的结构量趋于减少。
**全局结构的准确性:**虽然 UMAP 比 t-SNE 等其他技术保留了更多的全局结构,但它主要关心的是准确地表示局部结构。如果全局结构是主要兴趣,那么 UMAP 可能不是降维的最佳选择。
对比分析
现在我们已经讨论了每种方法的优缺点,让我们在真实数据集上评估它们。我承认一个数据集是不够的,应该使用几个大小和复杂程度不同的数据集进行综合评估。有一些同行评审的出版物也是这样做的,你可能希望参考和。
我选择了一个包含真实聚类信息的数据集,该数据集可以用作比较分析中的基础事实。它是由癌症基因组图谱泛癌分析项目维护的来自不同类型癌症组织的基因表达的整理。样本(实例)按行存储。每个样本的变量(属性)是 illumina HiSeq 平台测得的 RNA-Seq 基因表达水平。每个属性都有一个假名(gene_XX)。下载链接可以在 kaggle 上找到(**注:**这不是一个单细胞 RNA-seq 数据集,但想法是相同的,并服务于我们对降维技术进行比较分析的目的。)
请查看我的 github 获取完整的脚本,这里我只展示了 PCA、t-SNE 和 UMAP 分析的代码。
在解决数据的异质性方面,主成分分析显然是次优的。虽然有几种其他基于矩阵分解方法的降维技术,但可能比 PCA 效果更好;一般来说,它们更擅长保存全局结构,而不太注重保存数据的局部结构。为了理解复杂生物数据集的动力学,通过保持相邻点之间的连接来维持局部结构是重要的。这就是 t-SNE 和 UMAP 等基于邻图的方法优于基于矩阵分解的方法的地方。
然而,PCA 仍然被广泛用作聚类算法的预处理步骤。例如,在我们的癌症数据集中,累积解释方差图显示前 100 个主成分解释了约 80%的数据方差。在这 100 台电脑上应用聚类算法将提高它们的性能,而不会损失太多信息。
SNE 霸王龙在分辨单个集群方面做得更好。LUAD(橙色)簇中只有 3 个数据点被不恰当地指定为 BRCA 和 COAD。输出在视觉上很吸引人,难怪在过去十年中它被用作单细胞分析的黄金标准技术。记住 t-SNE 的局限性,如前所述,这是一个值得探索的技术,并适当调整参数。
与 t-SNE 相比,UMAP 产生了同样好或者更好的分辨率。它还在一定程度上保留了全局结构,并且运行速度明显快于 SNE 霸王龙,这使得它非常有吸引力,在不久的将来,研究人员更倾向于 UMAP 也就不足为奇了。
我希望这篇文章对单细胞分析中使用的最重要的降维技术有一个很好的概述。我计划写一篇类似的文章来讨论聚类算法。敬请期待!
在 Pyspark 和 R 中实现线性回归的指南
凯利·西克玛在 Unsplash 上的照片
我应该使用哪种编程工具来构建我的线性回归模型?在预测准确性方面有什么不同吗?用几行代码实现哪个更简单?我的训练数据的大小有影响吗?让我们在这篇文章中探讨所有这些问题。
资料组
我使用的数据集是一个虚拟数据集,只包含两个变量,年资和薪水。我们试图找出一个雇员的工资是否与他的工作年限成线性关系,从逻辑上讲,我们希望这种关系存在。
按作者分类的图像-数据集预览
Pyspark
我们将利用 Pyspark 在 Python 中训练我们的线性回归模型,因为 Pyspark 能够提升数据处理速度,这在大数据领域非常受重视。由于本文更侧重于实现线性回归模型,所以我不会触及设置 Pyspark(即 SparkContext、SparkSession、SparkConf)的技术方面,你可以在我之前的帖子中找到。
from pyspark import SQLContext, SparkConf, SparkContext
from pyspark.sql import SparkSessionsc = SparkContext.getOrCreate()if (sc is None):
sc = SparkContext(master="local[*]", appName="Linear Regression")
spark = SparkSession(sparkContext=sc)sqlcontext = SQLContext(sc)
data = sqlcontext.read.csv('./Salary_Data.csv', header = True, inferSchema = True)
一旦我们将数据导入 Pyspark,我们需要告诉它哪些是我们的特征变量,哪些是我们的目标变量。对于这个数据集,很明显年资是我们的特征变量,而薪水是我们的目标变量。我们有我们的数据,我们将建立我们的模型,但我们如何知道我们的模型是否表现良好?在数据科学家中,将我们的数据集分成训练和测试数据是一种方法,通常的比例是 70:30 或 80:20。在 Pyspark 中实现机器学习算法需要注意的另一件事是,我们可以利用向量汇编器,它将所有特征组合成一个稀疏的单个向量,这大大减少了机器学习模型的训练时间。
from pyspark.ml.feature import VectorAssembler# defining Salary as our label/predictor variable
dataset = data.select(data.YearsExperience, data.Salary.alias('label'))# split data into 70% training and 30% testing data
training, test = dataset.randomSplit([0.7, 0.3], seed = 100)
# assembler to assemble the features into vector form
assembler = VectorAssembler().setInputCols(['YearsExperience',]).setOutputCol('features')
trainingSet = assembler.transform(training)
# select only features column and label column since we have already vectorised our features
trainingSet = trainingSet.select("features","label")
最后,我们准备使用我们的训练数据集来训练线性回归模型。如上所述,我们还将利用测试数据集来了解我们的模型表现如何。如下面的输出所示,我们的模型现在包含一个预测列,当我们将我们的特征列(即年资)作为测试数据集放入我们的线性回归模型时,该列包含预测工资。我们可以看到,有些预测值接近实际值,有些则不然。
from pyspark.ml.regression import LinearRegression# fit the training set to linear regression model
lr = LinearRegression()
lr_Model = lr.fit(trainingSet)# assembler to assemble the features into vector form
testSet = assembler.transform(test)
# select only features column and label column since we have already vectorised our features
testSet = testSet.select("features", "label")
# fit the testing data into our linear regression model
testSet = lr_Model.transform(testSet)testSet.show(truncate=False)
按作者分类的图片 Jupyter 笔记本输出预测值
那么,我们如何衡量线性回归模型的表现呢?我们可以利用 R ,它是 0 到 100%之间的拟合优度的度量。我们只用两行代码就可以在 Pyspark 中轻松实现。
from pyspark.ml.evaluation import RegressionEvaluatorevaluator = RegressionEvaluator()
print(evaluator.evaluate(testSet, {evaluator.metricName: "r2"}))
作者图片 Pyspark 中 R 度量的 Jupyter 笔记本输出
93.9%的 R 值表明,当我们使用年的经验拟合我们的训练模型时,我们的线性回归在预测工资方面表现得非常好。
稀有
现在,让我们在 r 中构建我们的线性回归模型。我们将数据分为 70%的训练数据和 30%的测试数据,就像我们在 Pyspark 中所做的那样。然而,让我们尝试使用我们在 Pyspark 中使用的相同测试数据,看看在模型的预测中 R 性能是否有任何差异。
data = read.csv("./Salary_Data.csv")# sample data
# set.seed(100)
# dt = sort(sample(nrow(data), nrow(data)*.7))
dt = c(5,8,9,10,16,19,20,22,26,27)
# split data into training and testing data
trainingSet<-data[-dt,]
testingSet<-data[dt,]
获得训练和测试数据集后,我们使用训练数据集训练我们的线性回归模型,并使用测试数据集预测工资。
# fit linear regression model
lm_model = lm(data = trainingSet, Salary~.)
# predict the target variable with testing data
predicted_salary = predict(lm_model, testingSet)
然后,我们通过计算 R 来测量预测值的拟合优度。注意,在 R 中,我们不能运行库或命令来直接获得 R。因此,我们必须通过获得残差平方和和以及平方和来手动计算它们,这可以在此处进一步探讨。
# residual sum of squares
rss <- sum((predicted_salary - testingSet$Salary) ^ 2)
# total sum of squares
tss <- sum((testingSet$Salary - mean(testingSet$Salary)) ^ 2)
# obtain r^2
rsq <- 1 - rss/tss
rsq
按作者分类的图像— Jupyter 笔记本输出的 R 度量单位为 R
摘要
我们获得了与在 Pyspark 中相同的 R,这意味着就模型的准确性而言,选择 Pyspark 或 R 来训练您的模型并不重要。显然,在 R 中训练线性回归模型比在 Pyspark 中简单得多。然而,需要注意的一点是,Pyspark 在训练大数据方面更为可取,处理速度将明显快于 R 本身。
以下是我在构建线性回归模型时选择 R 还是 Pyspark 的建议:
py spark->-适合处理大量数据
R->适合于简单实现
感谢阅读,我将在接下来的几篇文章中研究其他几种机器学习算法,干杯!
可解释机器学习指南
破除深度学习黑箱神话的技术。
如果不能简单的解释,说明你理解的不够好。— 阿尔伯特·爱因斯坦
**免责声明:**本文借鉴并扩展了(1) Christoph Molnar 关于 可解释机器学习 的优秀书籍中的材料,我肯定会推荐给好奇的读者,(2)来自哈佛 ComputeFest 2020 的深度学习可视化研讨会,以及(3)来自哈佛大学的 CS282R 的材料,由 Ike Lage 和伊马·拉卡茹教授,他们都是该领域的杰出研究人员本文旨在向普通数据科学家浓缩和总结可解释机器学习领域,并激发他们对该主题的兴趣。
机器学习系统越来越多地用于复杂的高风险环境,如医学(如放射学、药物开发)、金融技术(如股票价格预测、数字金融顾问),甚至法律(如案例总结、诉讼预测)。尽管利用率有所提高,但仍然缺乏足够的技术来解释和诠释这些深度学习算法的决策。在某些领域,算法的决策必须是可解释的,或者归因于法律或法规规定的某些特征(如解释权),或者需要问责制,这可能会很成问题。
算法问责的必要性已被多次强调,其中最著名的案例是谷歌的面部识别算法,该算法将一些黑人标记为大猩猩,以及优步的自动驾驶汽车闯了一个停车标志。由于谷歌无法修复算法并消除导致这一问题的算法偏见,他们通过从谷歌照片的搜索引擎中删除与猴子有关的词语来解决问题。这说明了许多机器学习算法所谓的黑盒本质。
由于其预测性,黑盒问题主要与监督机器学习范例相关联。
黑盒算法——谁知道它在做什么?显然,没人。
仅仅精确是不够的。
深度学习领域的学者敏锐地意识到了这个可解释性和可解释性问题,尽管一些人(如上面引用的山姆·哈里斯)认为这些模型本质上是黑盒,但近年来已经有了一些发展,用于可视化深度神经网络的各个方面,如它们所学习的特征和表示。“信息贫乏”一词被用来指当决策是基于许多个人特征时,由于信息过载而难以提供透明度。自 2015 年以来,机器学习中的可解释性和可解释性领域出现了爆炸式增长,现在有几十篇关于该主题的论文,其中一些可以在参考文献中找到。
正如我们将在本文中看到的那样,这些可视化技术不足以完全解释深度学习算法学习到的复杂表示,但希望你会相信深度学习的黑盒解释不是真的——我们只是需要更好的技术来理解和解释这些模型。
黑盒子
机器学习中的所有算法在某种程度上都是黑盒。机器学习的一个关键思想是模型是数据驱动的——模型是根据数据配置的。这从根本上给我们带来了这样的问题,如 (1) 我们应该如何解释模型, (2) 如何确保它们在决策中是透明的,以及 (3) 确保所述算法的结果是公平的和统计上有效的。
对于像线性回归这样的东西,模型是非常好理解和高度可解释的。当我们转向支持向量机(SVM)或随机森林模型时,事情变得有点困难。从这个意义上说,在机器学习中没有白盒或黑盒算法,可解释性是作为一个光谱或不同灰度的“灰盒”而存在的。
碰巧的是,在我们“灰色”区域的远端是神经网络。在这个灰色区域的更远处是深层神经网络。当你有一个拥有 15 亿个参数的深度神经网络时——就像用于语言建模的 GPT-2 算法一样——解释模型学习到的表示就变得极其困难。
2020 年 2 月,微软发布了现存最大的深度神经网络【图灵-NLG 。这个网络包含 170 亿个参数,大约是人脑中 850 亿个神经元的 1/5(尽管在神经网络中,参数代表连接,其中人脑中有约 100 万亿个)。显然,解释一个 170 亿参数的神经网络将非常困难,但它的性能可能远远优于其他模型,因为它可以在海量数据上训练而不会饱和——这是一个更复杂的表示可以由具有更多参数的模型存储的想法。
比较图灵-NLG 与其他深度神经网络,如伯特和 GPT-2。来源
显然,表示是存在的,我们只是没有完全理解它们,因此我们必须想出更好的技术来解释模型。遗憾的是,这比读取线性回归中的系数更困难!
神经网络是强大的模型,但比更简单、更传统的模型更难解释。
通常,我们并不关心一个算法如何得出一个特定的决定,特别是当它们在低风险环境中被操作时。在这些场景中,我们在选择算法时不会受到任何可解释性限制的限制。然而,如果可解释性在我们的算法中很重要——就像它通常在高风险环境中一样——那么我们必须接受准确性和可解释性之间的折衷。
那么有什么技术可以帮助我们更好地解释和理解我们的模型呢?事实证明有很多这样的方法,区分这些不同类型的技术帮助我们检查什么是有帮助的。
本地对全球
技术可以是局部的,帮助我们研究网络的一小部分,就像观察神经网络中的单个过滤器一样。
技术可以是全局的,允许我们从整体上建立一个更好的模型,这可以包括深度神经网络中权重分布的可视化,或者通过网络传播的神经网络层的可视化。
特定型号与不特定型号的对比
高度特定于型号的技术仅适用于单一型号。例如,层可视化仅适用于神经网络,而部分依赖图可用于许多不同类型的模型,并被描述为模型不可知。
特定于模型的技术通常涉及检查算法或中间表示的结构,而模型不可知的技术通常涉及检查输入或输出数据分布。
不同模型可视化技术和可解释性度量之间的区别。来源
我将在整篇文章中讨论上述所有技术,但是也将讨论在哪里以及如何使用它们来帮助我们洞察我们的模型。
因为正确的原因而正确
由于我们缺乏模型可解释性而产生的一个问题是,我们不知道模型已经被训练了什么。最好用一个虚构的例子来说明这一点(关于这个故事的真实性还有一些争论,但我们可以从中吸取的教训仍然是有价值的)。
捉迷藏
根据 AI 民间传说,在 20 世纪 60 年代,美国陆军对开发一种能够在图像中检测坦克的神经网络算法感兴趣。研究人员开发了一种算法,能够非常准确地做到这一点,每个人都对结果非常满意。
然而,当该算法在额外的图像上进行测试时,它的表现非常差。这让研究人员感到困惑,因为研究结果在开发过程中是如此积极。在所有人都摸不着头脑的一段时间后,其中一名研究人员注意到,在查看两组图像时,一组图像中的天空比另一组图像中的天空更暗。
很明显,该算法实际上并没有学会探测伪装的坦克,而是在观察天空的亮度!
虽然这个故事加剧了对深度学习的一个常见批评,但事实是,在神经网络中,尤其是深度神经网络中,你并不真正知道模型正在学习什么。
这种强有力的批评和深度学习在学术界和工业界日益增长的重要性导致了对可解释性和可解释性的日益关注。如果一个行业专家不能让他们的客户相信他们理解他们建立的模型在做什么,那么当有大的风险时,比如财务损失或人们的生命安全,真的应该使用它吗?
可解释性
在这一点上,你可能会问自己,鉴于可能有无限多种可行的解释,可视化如何帮助我们解释一个模型。定义和衡量可解释性的含义并不是一项简单的任务,而且在如何评价它的问题上几乎没有共识。
可解释性没有数学定义。文献中提出的两个定义是:
“可解释性是人类能够理解决策原因的程度.” —提姆·米勒
“可解释性是人类能够持续预测模型结果的程度.”— 后土金
机器学习模型的可解释性越高,人们就越容易理解为什么会做出某些决定或预测。如果一个模型的决策比另一个模型的决策更容易让人理解,那么这个模型就比另一个模型更容易解释。我们可以开始评估模型可解释性的一种方式是通过 可量化的代理 。
一个代理是与我们感兴趣研究的东西高度相关,但与感兴趣的对象有本质区别的东西。代理往往比感兴趣的对象更容易测量,或者在这种情况下,只是可测量的——而我们感兴趣的对象(如可解释性)可能不可测量。
代理人的想法在许多领域都很普遍,其中一个领域是心理学,它们被用来测量抽象概念。最著名的代表可能是智商(IQ ),它是智力的代表。虽然智商和智力之间的相关性不是 100%,但它足够高,我们可以从测量智商中获得一些有用的信息。没有直接测量智力的已知方法。
一种使用降维来允许我们在低维空间中可视化高维数据的算法为我们提供了可视化数据分布的代理。同样,一组训练图像为我们提供了感兴趣的完整数据分布的代理,但不可避免地会与真实分布有些不同(如果您在构建训练集方面做得很好,它应该不会与给定的测试集相差太多)。
事后解释呢?
事后解释(或事后解释)可能有用,但有时会误导人。这些只是为黑盒的算法行为提供了一个看似合理的合理化,不一定是具体的证据,因此应该谨慎使用。事后合理化可以用可量化的代理来完成,我们将讨论的一些技术可以做到这一点。
选择可视化
设计可视化需要我们考虑以下因素:
- 我们要介绍的观众(谁) —这是为了调试的目的吗?说服客户吗?说服一个同行审稿人写一篇研究文章?
- 可视化的目标(是什么) —我们是在试图理解输入(例如,来自图像的 EXIF 元数据是否被正确读取,以使图像不会从侧面进入 CNN)、输出或我们模型的参数分布吗?我们感兴趣的是输入如何在网络中演变,还是网络的静态特征,如特征图或过滤器?
- 正在开发的模型 【如何】 —很明显,如果您没有使用神经网络,您就无法可视化网络层的特征地图。类似地,特征重要性可以用于一些模型,例如 XGBoost 或随机森林算法,但不能用于其他模型。因此,模型选择固有地偏向可以使用的技术,一些技术比其他技术更通用和通用。开发多个模型可以提供更多的多样性。
深度模型对可视化提出了独特的挑战:我们可以回答关于模型的相同问题,但是我们的询问方法必须改变!由于这一点的重要性,我们将在本文的剩余部分主要关注深度学习可视化。
深度学习可视化的子领域
深度学习可视化文献主要有三个子领域:
- **可解释性&可解释性:**有助于理解深度学习模型如何做出决策以及它们的学习表征。
- **调试&改进:**帮助模型管理员和开发人员构建和解决他们的模型,希望加速迭代实验过程,最终提高性能。
- **教授深度学习:**帮助教育业余用户关于人工智能——更具体地说,机器学习。
为什么解释一个神经网络如此困难?
为了理解为什么解释神经网络是困难和不直观的,我们必须理解网络对我们的数据做了什么。
本质上,我们传递到输入层的数据(这可能是一幅图像或一组用于预测变量的相关特征)可以绘制成一些复杂的分布,如下图所示(这只是一个 2D 表示,想象一下 1000 维)。
如果我们通过线性分类器运行这些数据,模型会尽最大努力分离数据,但由于我们仅限于仅包含线性函数的假设类,我们的模型将表现不佳,因为大部分数据不是线性可分离的。
这就是神经网络的用武之地。神经网络是一个非常特殊的功能。已经证明,具有单个隐藏层的神经网络能够表示所有非线性函数的假设类,只要我们在网络中有足够的节点。这就是所谓的通用近似定理。
事实证明,我们拥有的节点越多,我们可以表示的函数类就越大。如果我们有一个只有十层的网络,并试图用它来分类一百万张图像,网络将很快饱和并达到最大容量。如果我们有 1000 万个参数,随着非线性变换数量的增加,它将能够学习网络的更好表示。我们说这个型号有更大的型号容量。
人们使用深度神经网络而不是单层神经网络,因为单层网络中所需的神经元数量随着模型容量呈指数增长。隐藏层的抽象大大减少了对更多神经元的需求,但这是以可解释性为代价的。我们越深入,这个网络就变得越难以解释。
神经网络的非线性变换允许我们将数据重新映射到线性可分的空间中。在神经网络的输出层,我们可以任意使用线性分类器将最初的非线性数据分成两类,如下所示。
使用神经网络将非线性数据集转换为可线性分离的数据集。来源
问题是,我们如何知道这个多层非线性变换中发生了什么,它可能包含数百万个参数?
想象一下一个 GAN 模型(两个网络为了模拟输入数据的分布而相互争斗)在一个 512x512 的图像数据集上工作。当图像被引入神经网络时,每个像素都成为神经网络的一个特征。对于这样大小的图像,特征的数量是 262,144。这意味着我们正在对超过 200,000 个特征执行潜在的 8 或 9 个卷积和非线性变换。这怎么解释呢?
更极端的例子是 1024x1024 图像,这是由 NVIDIA 的 StyleGAN 实现开发的。由于像素数量增加了四倍,图像大小增加了一倍,我们将有超过一百万个特征作为 GAN 的输入。因此,我们现在有一个一百万特征的神经网络,执行卷积运算和非线性激活,并在数十万张图像的数据集上执行这些操作。
希望我已经让你相信解释深层神经网络是非常困难的。尽管神经网络的操作看似简单,但它们可以通过某种形式的涌现产生极其复杂的结果。
形象化
在本文的剩余部分,我将讨论可用于深度神经网络的可视化技术,因为它们在机器学习的可解释性和可解释性方面提出了最大的挑战。
权重直方图
权重直方图通常适用于任何数据类型,所以我选择先介绍这些。权重直方图对于确定深度神经网络中权重的总体分布非常有用。通常,直方图显示给定值相对于其他值的出现次数。如果权重的分布是均匀的,正态分布或呈现某种有序结构可以告诉我们有用的信息。
例如,如果我们想检查我们所有的网络层是否都在从给定的批次中学习,我们可以看到在对该批次进行训练之后权重分布是如何变化的。虽然一开始这可能不是最有用的可视化,但我们仍然可以从权重直方图中获得有价值的洞察力。
下图显示了一个四层网络在 Tensorboard — Tensorflow 的主要可视化工具中的权重和偏差直方图。
张量板中的重量直方图。
对于不熟悉的人来说,还有一个绘制权重分布的工具是Weights and bias(W&B),这是一家比较新的公司,专门从事深度学习的实验跟踪。当训练具有数百万个参数的大型网络(如 GAN)时,W & B 提供的实验跟踪非常有助于日志记录,并提供了比 Tensorboard 更多的功能(对学术界的人来说是免费的)。
权重和偏差中的权重直方图。
显著图
回到我们之前讨论的 tank 问题,我们如何对这个网络进行故障排除,以确保分类器检查图像的正确部分来进行预测?一种方法是使用显著图。
显著图是在 2013 年的论文“ 深入卷积网络内部:可视化图像分类模型和显著图 ”中提出的,以及类别最大化(稍后讨论)。他们背后的想法相当简单。首先,我们计算输出类别相对于输入图像的梯度。这为我们提供了一个指标,表明我们的分类相对于每个输入图像像素的微小变化是如何变化的。如果微小的变化产生了正梯度,那么我们知道该像素的变化增加了输出值。通过可视化梯度,我们可以检查哪些像素对激活最重要,并确保被检查的图像部分对应于感兴趣的对象。
显著图提供了输出类的输入敏感度的可视化表示。
显著图为我们提供了一种计算给定图像中给定类别的空间支持度的方法(图像特定类别显著图)。这意味着我们可以查看卷积网络的分类输出,执行反向传播,并查看图像的哪些部分参与了将图像分类为给定类别。
特定类别图像及其该类别的预期显著性图的示例。来源
可以使用另一种对显著性方法的简单调整,称为校正显著性。这包括在反向传播步骤中剪切负梯度,以便只传播正梯度信息。因此,仅传达与输出增加相关的信息。您可以在论文可视化和理解卷积网络中找到更多信息
给定具有像素位置 i 和 j 以及 c 颜色通道(RGB 图像中的红色、蓝色和绿色)的图像,我们反向传播输出以找到对应于每个像素的导数。然后,我们取权重的所有颜色通道的绝对值的最大值,并将其用作显著图 M 的第 ij 个值。
显著图 M 是具有像素位置 I 和 j 的 2D 图像。该图在每个点的值是从所有图像颜色通道 c 的反向传播中找到的导数的最大绝对值
使用 Keras 函数“可视化显著性”和“可视化显著性损失”,可以在 Keras 中轻松实现显著性图的可视化。
遮挡贴图
用于辨别图像预测中像素重要性的显著性映射的类似技术是遮挡映射。在遮挡贴图中,我们仍然在开发与图像输出相关的贴图。然而,这次我们感兴趣的是遮挡图像的一部分如何影响图像的预测输出。
基于遮挡的方法使用灰色正方形系统地遮挡(阻挡)部分输入图像,并监控分类器输出。下图-显示了一个旨在预测黑色素瘤的图像分类器-清楚地显示了该模型正在定位场景中的对象,因为当对象被遮挡时,正确分类的概率显著下降(热图在黑色素瘤所在的区域变暗,因为遮挡会降低分类器的输出性能)。
分类器显示预测黑色素瘤的分类器的遮挡图。来源
遮挡贴图实现起来相当简单,因为它只需要在给定的像素位置扭曲图像,并将预测输出保存到热图中。阿克谢·舒拉在 GitHub 上的一个很好的实现可以在这里找到。
类别最大化
研究神经网络的一个非常强大的技术是类最大化。这允许我们查看一个类的样本,即会导致分类器的类值在输出中最大化的输入。对于图像数据,我们称之为一个类的图像样本。从数学上讲,这相当于:
其中 x* 对应于类别 c 的图像样本。这种符号表示我们想要的图像对于类 c 给出了最大可能的输出,这可以解释为什么是完美的 c ?
大规模分类网络的输出非常有趣。下面是由 Nguyen、Yosinski 和 Clune 在他们 2016 年关于深度卷积网络可视化的论文中生成的一些图像。他们在一个深度卷积神经网络上执行类最大化,该网络在 ILSVRC-2013 数据集上进行训练。
由深度卷积网络上的类最大化生成的图像。来源
激活最大化
类似于类最大化,激活最大化帮助我们可视化卷积过滤器的范例。类别最大化是激活最大化的子集,由此分类算法的输出 softmax 层被最大化。数学上,激活最大化可以描述为:
其中 x* 对应于深度神经网络中隐含层 l 或滤波器 f 的样本。这种符号表示我们想要最大化滤波器或层的输入(在卷积网络的情况下是图像)。这在下面针对深度卷积神经网络的 8 层来说明。
深度卷积网络上激活最大化生成的图像。来源
LIME(局部可解释的模型不可知解释)
LIME 代表本地可解释的模型不可知解释,甚至有自己的 Python 包。因为该方法被设计为模型不可知的,所以它可以应用于许多不同的机器学习模型。它首先出现在马尔科·图利奥·里贝罗和他的同事们的论文中,包括 “机器学习的模型不可知可解释性” 和’“我为什么要相信你?”:解释任何分类器的预测’ *,*均发表于 2016 年。
局部代理模型是用于解释黑盒机器学习模型的个体预测的可解释模型。LIME 是本地代理模型的一个实现。
代理模型被训练来近似底层黑盒模型的预测。
LIME 不是训练一个全局代理模型,而是专注于训练局部代理模型来解释个体预测。
向人类决策者解释个人预测。 来源
在 LIME 中,我们扰动输入并分析我们的预测如何变化。不管听起来如何,这与遮挡映射和显著性映射非常不同。我们的目标是在由邻近性度量 πₓ 管理的给定位置,使用来自一组可能模型 G 的可解释模型 g (例如具有几个系数的线性模型)来近似底层模型 f 。我们还添加了一个正则项ω,以确保可解释的模型尽可能简单。这在下面的等式中说明。
实例 x 的解释模型是最小化损失 L(例如,均方误差)的模型 g(例如,线性回归模型),其测量解释与原始模型 f(例如,xgboost 模型)的预测有多接近,同时模型复杂度ω(g)保持较低(例如,偏好较少的特征)。g 是可能解释的族,例如,所有可能的线性回归模型。邻近度πₓ定义了我们在解释时考虑的实例 x 周围的邻域有多大。
图像的 LIME 与表格数据和文本的 LIME 工作方式不同。直觉上,干扰单个像素没有多大意义,因为不止一个像素对一个类有贡献。随机改变单个像素可能不会改变预测太多。因此,通过将图像分割成“超像素”并关闭或打开超像素来创建图像的变体。
被分割成超像素的猫的图像。来源
超像素是具有相似颜色的互连像素,可以通过用用户定义的颜色(如灰色)替换每个像素来关闭。用户还可以指定在每个排列中关闭超像素的概率。
解释谷歌的 Inception 神经网络做出的一个图像分类预测。预测的前 3 类分别是“电吉他”(p = 0.32)、“木吉他”(p = 0.24)和“拉布拉多”(p = 0.21)。来源
保真度度量(可解释模型逼近黑盒预测的程度,由我们的损失值 L 给出)让我们很好地了解了可解释模型在解释感兴趣的数据实例附近的黑盒预测时的可靠性。
LIME 也是为数不多的用于表格数据、文本和图像的方法之一。
注意,我们也可以生成全局代理模型,它遵循相同的思想,但用作整个黑盒算法的近似模型,而不仅仅是算法的局部子集。
部分相关图
部分相关性图显示了一个或两个特征对机器学习模型的预测结果的边际影响。如果我们使用具有一百个特征的数据集(包括前几天的黄金价值)来分析像黄金这样的金属的市场价格,我们会发现黄金价格对一些特征的依赖性比其他特征高得多。例如,黄金价格可能与石油价格密切相关,而与鳄梨价格没有密切联系。该信息在部分相关性图中可见。
自行车租赁与温度、湿度和风速的部分相关图示例。我们看到,在这三个变量中,温度对自行车租赁数量的依赖性最强。来源
请注意,这与线性回归模型不同。如果这是在线性回归模型上执行的,则每个部分相关性图将是线性的。部分依赖图允许我们看到关系的全部复杂性,它可能是线性的、指数的或一些其他复杂的关系。
部分依赖图的主要缺陷之一是,它只能真实地显示涉及一个或两个特征的 2D 解释。因此,对多个变量之间的高阶交互项进行建模是困难的。
还有一个变量独立性的固有假设,但通常不是这样(例如身高和体重之间的相关性,这是医学数据集中的两个常见参数)。由于多重共线性,变量之间的这些相关性可能导致其中一个变量冗余或给算法带来问题。当这成为一个问题时,使用累积局部效应(ALE)是更可取的,因为当涉及到共线性时,它不会遭受与部分相关图相同的陷阱。
为了避免过度解释数据稀疏特征区域中的结果,在部分相关性图的底部添加 rug 图有助于查看数据丰富和数据稀疏区域出现的位置。
个体条件期望
ICE 类似于部分依赖关系图,只是为数据集中的每个实例绘制了不同的线条。因此,部分依赖图为我们提供了一个特性变量对输出变量的依赖的平均视图,而 ICE 允许我们看到特性变量的特定于实例的依赖。当交互变量存在时,这是有用的,当查看平均结果时,交互变量可能被掩盖,但是当使用 ICE 时,交互变量变得非常明显。
自行车租赁关于温度、湿度和风速的单个条件期望图示例。我们看到,每个图在实例之间没有表现出任何异质性,因此不太可能存在任何重要的相互作用项。来源
存在不同类型的冰图,例如也存在中心冰图和衍生冰图,但是本质上以不同的形式提供相同的信息。
沙普利值
沙普利值是由劳埃德·沙普利于 1953 年从合作博弈论的一个方面得出的概念。在合作博弈理论中,Shapley 值根据每个玩家在所有排列中的平均贡献来优化他们的支出。当应用于机器学习时,我们假设每个特征都是游戏中的一个玩家,所有人一起工作以最大化预测,这可以被认为是支出。Shapley 值根据每个要素对输出值的贡献将支出的一部分分配给每个要素。
例如,如果您正在查看房价,并且从分析中移除了单个要素,这会如何影响模型预测?如果预测值下降了一个数量,我们可以推断该特征对预测的贡献如此之大。当然,事情并不那么简单,我们必须对每个可能的特征组合进行计算,这意味着我们需要运行 2ˣ 模型,其中 x 是特征的数量。
因此,Shapley 值是一个特征值在所有可能的联合中的平均边际贡献。
ϕ沙普利值的方程式,来自合作博弈理论。
这个等式可能看起来令人生畏,所以让我们从右到左一点一点地检查它。为了知道我们点 *xᵢ、*的边际贡献,我们使用我们的特征子集 S 中不包含特征 *xᵢ、*的所有特征来计算我们的模型的预测值,且我们从仍然存在该特征的子集的预测值中减去该预测值。然后,我们对特征排列的总数进行缩放,然后对所有这些贡献进行求和。因此,我们现在有了一个值,该值实质上是使用每个可能的特征子集的训练模型的特征的平均贡献。
这个讨论可能看起来很抽象,所以举个例子会很有帮助。Christoph 的书中使用的例子是考虑房价的一个很好的例子。如果我们有预测房价的特征,包括(1)公寓的大小(数字),(2)离附近公园的远近(二元),以及(3)公寓所在的楼层。为了计算每个特性的 Shapley 值,我们采用每个可能的特性子集,并预测每种情况下的输出(包括没有特性的情况)。然后,我们将每个特征的边际贡献相加。
计算简单房价预测模型的 Shapley 值时需要考虑的所有可能的特征排列。来源
一个参与者可以是单个特征值,例如对于表格数据,但是一个参与者也可以是一组特征值。例如,为了解释图像,可以将像素分组为超像素,并在它们之间分配预测。
据我所知,Python 上没有 Shapley 值的官方包,但有一些可用的存储库已经实现了它,用于机器学习。一个这样的包可以在这里找到。
Shapley 值的主要缺点是,对于大量的特征,由于特征数量的线性增加,可能的排列数量呈指数增加,因此计算非常昂贵和耗时。因此,对于特征数量非常大的应用,Shapley 值通常使用特征排列的子集来近似。
锚
马尔科·图利奥·里贝罗、萨梅尔·辛格和卡洛斯·盖斯特林在 2018 年的一篇论文中首次介绍了这一点,他们是创造石灰的同一批研究人员。它也有自己的由 Marco 开发的 Python 包。Python 的 ALIBI 包中也有。
锚点解决了局部解释方法的一个关键缺点,如 LIME 以线性方式代理模型的局部行为。然而,不清楚该解释在多大程度上在要解释的实例周围的区域中成立,因为模型和数据在该实例的邻域中都可以表现出非线性行为。这种方法很容易导致解释的过度自信和对看不见但相似的例子的误导性结论。anchor 算法通过将覆盖范围(解释适用的区域)合并到优化问题中来解决这个问题。
与 LIME 类似,锚点可以用于文本、表格和图像数据。对于图像,我们首先将它们分割成超像素,同时仍然保持局部图像结构。然后,可解释的表示包括锚中每个超像素的存在或不存在。几种图像分割技术可用于将图像分割成超像素,如 slic 或 quickshift 。
该算法支持多种标准图像分割算法( felzenszwalb、slic 和 quickshift ),并允许用户提供自定义分割功能。
当使用初始网络分类时,小猎犬的锚被叠加在其他图像背景上,而预测准确性没有降低。来源
反事实
反事实是锚的对立面。锚是当存在时足以锚定预测的特征(即,防止其通过改变其他特征而被改变)。在锚点部分,我们看了一个例子,这些锚点是图像的超像素。事实上,图像中不属于锚点的每个超像素都是反事实——我们可以通过改变反事实来改变预测,而不是改变锚点。
反事实是在沃希特等人 2017 年题为 “不打开黑盒的反事实解释:自动化决策和 GDPR”的论文中首次提出的。反事实的基本思想是,我们希望找到我们能够对最少数量的特征做出的最小改变,以便获得我们想要的期望输出。
预测的反事实解释描述了将预测改变为预定义输出的特征值的最小变化。
什么是反事实?这是我们的特征空间的最小变化,允许我们跨越一个决策边界。来源
这听起来像是一个欠定义的任务,因为我们有很多方法可以改变我们的实例以满足我们期望的输出。这种现象被称为“罗生门效应”,因此,我们必须将我们的问题转换成优化问题的形式。首先,我们希望确保尽可能少地改变特征,并且尽可能少地改变这些特征,同时还维护可能给定数据联合分布的实例。我们的优化问题的损失函数可以转换为
作为反事实优化问题的一部分要最小化的损失函数。
损失函数的第一项表示模型预测*f’(x’)和预期输出y’之间的二次距离。第二项表示原始实例和反事实实例之间的距离度量。二次项具有缩放参数,该参数将预测输出的重要性缩放到正常实例 x 和反事实实例x’*之间的距离。
我们使用的距离度量是曼哈顿距离,因为反事实不仅应该接近原始实例,还应该尽可能少地改变特征。距离函数被描述为
这是使用中间绝对偏差缩放的曼哈顿距离。
如果我们有一个小的缩放参数,距离度量就更重要,我们更喜欢看到接近正常情况的反事实。如果我们有一个大的尺度参数,预测就变得更加重要,我们对反事实与正常情况的接近程度就不那么在意了。
当我们运行我们的算法时,我们不需要为我们的缩放参数选择一个值。相反,作者建议由用户给出一个容差ϵ,它代表我们可以容忍预测与我们的输出有多远。这表现为
我们优化问题的一个附加约束。
我们的优化问题可以简洁地描述为
我们的目标是找到反事实 x ’,使我们的总损失函数最小化,同时改变缩放参数 λ。
反事实的优化机制可以描述为“生长球体”方法,其中输入实例 x 、输出值*y’*和容差参数 ϵ 由用户给出。最初,设定比例参数 λ 的一个小值。对当前允许的反事实“范围”内的随机实例进行采样,然后将其用作优化的起点,直到该实例满足上述约束条件(即,如果预测值和输出值之间的差异低于我们的容差)。然后,我们将这个实例添加到我们的反事实列表中,并增加 *λ,*的值,这有效地增加了我们的“球体”的大小。我们递归地这样做,生成一个反事实列表。在程序的最后,我们选择最小化损失函数的反事实。
反事实是在 Python 包 ALIBI 中实现的,你可以在这里阅读(它们也有一个替代描述,可能比我自己的描述更有帮助和清晰)。
其他技术
这里还有一些我没有提到的技术,我建议感兴趣的读者参考一下。这些包括但不限于:
在这个 GitHub 页面上也可以找到一个很好的关于机器学习可解释性主题的知识库,它涵盖了关于该主题的论文、讲座和其他博客。
最终意见
深度学习可视化是一个复杂的话题,最近几年才刚刚开始研究。然而,随着深度学习技术越来越多地融入我们的数据驱动型社会,它将变得更加重要。我们大多数人可能更看重表现而不是理解,但我认为能够解释和说明模型将在未来为个人和公司提供竞争优势,这肯定会有市场。
可视化不是解释或解释深度神经网络结果的唯一方法或最佳方法,但它们肯定是一种方法,它们可以为我们提供对复杂网络决策过程的有用见解。
问题在于,单一指标(如分类准确率)无法完整描述大多数现实任务 —多希-维勒兹和金 2017
时事通讯
关于新博客文章和额外内容的更新,请注册我的时事通讯。
丰富您的学术之旅,加入一个由科学家,研究人员和行业专业人士组成的社区,以获得…
mailchi.mp](https://mailchi.mp/6304809e49e7/matthew-stewart)
参考
这里有我在这篇文章中引用的论文,以及我认为读者可能会发现的关于算法可解释性和可解释性的论文。
【1】迈向可解释机器学习的严谨科学——多希-维勒兹和金,2017
【2】模型可解释性的神话——利普顿,2017
【3】透明度:动机与挑战 — 韦勒,2019
【4】****对人类的一种评价——解释性的解释——拉赫等人。艾尔。,2019
【5】操纵和测量模型可解释性— Poursabzi-Sangdeh,2018
【6】使用规则和贝叶斯分析的可解释分类器:构建更好的中风预测模型— Letham and Rudin,2015
【7】可解释决策集:描述和预测的联合框架 — Lakkaraju 等。艾尔。,2016 年
【8】通过原型进行案例推理的深度学习:解释其预测的神经网络 — 李等。艾尔。,2017 年
【9】贝叶斯案例模型:一种基于案例推理和原型分类的生成方法 — Kim 等人。艾尔。,2014 年
【10】学习优化风险分值——乌斯顿和鲁丁,2017
【11】可理解的医疗保健模型:预测肺炎风险和住院 30 天再入院——卡鲁阿纳等人。艾尔。,2015 年
【12】“我为什么要相信你?”解释任何分类器的预测 — 里贝罗等人。艾尔。,2016 年
【13】停止解释高风险决策的黑盒机器学习模型,转而使用可解释的模型 — Rudin,2019
【14】神经网络的解释是脆弱的——Ghorbani 等人。艾尔。,2019
【15】可视化深度神经网络决策:预测差异分析 — Zintgraf 等。艾尔。,2017
【16】显著图的健全性检查——阿德巴约等人。艾尔。,2018
【2017】解释模型预测的统一方法——伦德伯格和李,2017
****【18】特征归因之外的可解释性:用概念激活向量进行定量测试(TCAV)—Kim et al .艾尔。,2018
【19】不打开黑盒的反事实解释:自动化决策和 GDPR——沃希特等。艾尔。,2018
【20】线性分类中的可诉追索权 — Ustun 等。艾尔。,2018
【21】黑箱模型的因果解释——赵、哈斯蒂,2018
【22】学习具有成本效益且可解释的治疗制度——Lakkaraju 和 Rudin,2017 年
【23】人在回路的可解释性优先 — 拉赫等人。艾尔。,2018
【24】黑盒模型的忠实可定制解释——Lakkaraju 等人。艾尔。,2019
【25】通过影响函数理解黑箱预测 — Koh 和梁,2017
【26】简单创造不公平:对公平、刻板印象和可解释性的影响 — Kleinberg 和 Mullainathan,2019
【27】通过深度可视化理解神经网络——约辛斯基等,2015
【28】深入卷积网络内部:可视化图像分类模型和显著图 — Simonyan、Vedaldi 和 Zisserman,2014 年
【29】多方面特征可视化:揭示深度神经网络中每个神经元学习的不同类型特征——Nguyen,Yosinski,和 Clune,2016
****【30】人工智能中的解释:来自社会科学的洞见 — 提姆·米勒,2017
【31】例子还不够,学会批判!对可解释性的批评— Kim,Been,Rajiv Khanna,和 Oluwasanmi O. Koyejo,2016 年
【32】黑匣子里面是什么?律师和研究人员面临的人工智能挑战——Ronald Yu 和 Gabriele Spina Ali,2019
豚鼠品种分类
如何通过机器学习利用图像识别豚鼠品种
TL:DR 我用深度学习模型从图片中识别出了豚鼠的品种。该模型是图像 CNN,其应用了来自 Inception V3 模型的迁移学习,其中权重在 ImageNet 上预先训练。源图像来自多个图像搜索引擎。最终的模型能够对四种不同的豚鼠品种进行分类。
密码和笔记本可以在 这里 找到。
目录
- 前言
- 简介
- 模型建立和发现
步骤 0。项目文件夹格式化
步骤 1。 Raw 图像刮
步骤 2。数据集创建
第三步。图像数据预处理步骤 4
。基线模型训练
第五步。深度学习模型训练
步骤 6。型号比较和选择 - 结论
前言
这是我在 Metis 数据科学训练营 完成的第三个项目。当时,我们正在学习分类、各自的分类器和指标。我想给图像分类一个镜头,但不是用 狗 vs。既然我的妻子和我都是豚鼠爱好者,那么为什么不应用我的领域知识,并从中获得一些乐趣呢?旅程就这样开始了…
Bonnie Kittle 在 Unsplash 上拍摄的照片
介绍
豚鼠(或豚鼠)通常被作为家庭宠物饲养,因为它们的大小易于控制(0.7-1.2 公斤),友好的天性和极度的可爱。这些可爱的动物是啮齿动物,大小介于仓鼠和龙猫之间。它们是食草动物,吃的食物和兔子差不多:颗粒饲料、干草、蔬菜和水果。
根据 维基百科 记载,豚鼠的品种很多(13-18)。与大小和形状各异的狗不同,豚鼠的一切都与毛发有关:
在这个项目中,我选择了四个最容易识别的品种:
用于图像分类的豚鼠品种
模型构建和发现
对于本文的其余部分,您可以跟随我的 Google Colab 笔记本 。这是我完成这个项目的步骤的节略版。
你所要做的就是在你 Google Drive 的’ Colab Notebooks ‘文件夹下新建一个名为’ cavy_breed_clf 的子文件夹。将下面的笔记本和文件夹复制到’ cavy_breed_clf '中,你就可以开始了。
- /data (~163kB)
- /图像(~130MB)
- /lib (~67kB)
- cavy _ breed _ clf _ train _ and _ predict _ bridged . ipynb
然而,如果你想知道我是如何到达那里的,我已经把我的脚本和笔记本按数字顺序分类了。我希望这将为以下过程提供更清晰的感觉:数据准备、训练(经典 ML,然后是神经网络)和度量/预测。
步骤 0。项目文件夹格式
这是第一个项目,我根据这里的和这里的的建议,努力组织我的代码和文档。
- /data —项目数据集:原始、培训、验证和测试
- /images —原始图像存储在按品种排序的子文件夹中,另外还有一个样本子文件夹,用于存储数据集之外的临时图像
- /lib/data _ common . py-图像数据预处理例程
- /lib/ml_common.py —经典的 ml 处理流程,包括分类指标
- /lib/nn_common.py —神经网络 DL 处理过程
第一步。原始图像刮擦
拥有大量优质、干净和正确类型的数据非常重要。这可能是最痛苦的部分,但也是你 ML 项目中最关键的部分。它将确保你的模型将执行它被设定的目的,或者至少是一个像样的 MVP。在训练营期间,我们真正学到了这一课。
AFAIK,没有可用于机器学习的公共 cavy 图像数据集。幸运的是,基于这篇 文章 有很多有用的搜索引擎。对我来说,我主要依靠 谷歌雅虎 和 必应 。
一开始,我能为每个品种收集 500 到 1000 张原始图像。我非常依赖这个出色的 Chrome 扩展 Fatkun 批量下载图片 来批量下载图片。
请注意,每个品种 1000 张图片听起来可能很多,但事实并非如此。这些都是未加工的,没有标签。我不得不在下载期间和下载后仔细检查所有 4000 多张图片,以筛选出不合格的候选人:
- 贴错标签的动物种类或豚鼠品种
- 图像中缺少 cavy(是的,即使搜索引擎也不是完美的)
- 多个 cavies(模型最好只从每个图像中学习一个)
- 漫画,而不是真正的照片
- 重要的品种特征没有完全展示出来(例如红阿比的玫瑰花结)
- 分辨率太低
- 太模糊了
最终,我把它缩减到 1600 多张图片:
- 红阿比:553 人
- 美国人:519
- 西尔基:267
- 瘦子:292
这是一个适度不平衡的数据集,但我相信它不会对模型的训练产生重大影响。
第二步。数据集创建
在我收集了需要的图片后,我将它们分类到各自的子文件夹中。然后,我运行一个简短的脚本(也作为笔记本)来生成这些数据集;原始、培训、验证和测试。后三个数据集将成为所有未来 ML 训练、验证和测试的输入数据。
快速健全检查,以确保品种分布均匀的数据集。
跨培训、验证和测试数据集的品种分布
再次检查以确保特征和目标处于良好状态。
对功能和目标进行健全性检查
第三步。图像数据预处理
每个图像文件将被转换为 ML ready 格式,方法是将其调整为特定的图像形状(150,150),然后将其展平为一维数组。这些将被保存为特征(X_train,X_val,X_test)。
通过 OpenCV 进行图像转换
每个图像的品种将被一次热编码以成为标签(y_train,y_val,y_test)。
要素和标签的数据预处理
快速视觉健全检查,以确保一切正常:
第四步。基线模型训练
我从一开始就决定“随机森林”分类器将是我的基线模型。然而,我把这作为一个学习的机会,看看其他经典分类器与我的基线模型相比会有多好。
我创建了一个例程(Vanilla_ML_Run)来一起训练这四个分类器:
一旦已训练的分类器被保存/重新加载,我将性能与以下进行比较:
NB:我强烈推荐阅读这个和这个来很好的把握 PR 和 ROC 曲线。还有这个关于微观平均和宏观平均。
步骤 4a。高斯 NB 分类器
不用说,虚拟分类器做得不太好,显然,高斯分类器也是如此。“Silkie”和“Skinny”的准确率和召回率都很低。让我们以“Skinny”为例来看看:
- 这里的低精度意味着它的许多预测不是“瘦的”(假阳性)
- 召回率低意味着许多真正的“瘦子”被错误地识别为其他品种(假阴性)
混乱矩阵证实了这种理解。
步骤 4b。逻辑回归分类器
这种分类器的表现比 GaussianNB 好得多,GaussianNB 的大多数精度和召回分数都在 50 以上或接近 50。
然而,公关曲线似乎告诉了一个更清晰的故事,这种模式并没有表现得很好,特别是“瘦”。它的面积远不如其他的理想,它的曲线也偏离微观平均曲线最远。
不同品种的精确召回曲线(面积=平均值。精确分数)
步骤 4c。随机森林分类器
随机森林似乎是比逻辑回归更好的模型,尽管只是稍微好一点。看起来整体较高的分数是以“丝滑”和“骨瘦如柴”较低的回忆分数为代价的。
F1 分数和 PR 曲线强烈地表明,该模型对于较小的类(“丝滑”和“瘦”)表现得不是很好。
不同品种的精确召回曲线(面积=平均值。精确分数)
第五步。深度学习模型训练
既然我们已经训练和审查了我们的基线模型,我们接下来可以继续两个不同的 DL 模型,即:
- 多层图像 CNN(卷积神经网络)
- 使用 ImageNet 上预先训练的权重转移从 Inception V3 开始的学习
一旦训练完毕,我会用和以前一样的标准来比较模型的表现。
步骤 5a。多层图像 CNN 大楼
该架构对于一个图像 CNN 模型来说相当简单,你可以从 这里 找到更多关于它的信息。
图像 CNN 模型架构
经过 100 个历元的训练,该模型达到了 78%的训练准确率和 67%的验证准确率。它肯定比基线模型更准确,但我认为它已经过度拟合了。
训练/验证准确度与历元数
我们来看看分类报告。与基线模型相比,总体分数令人信服地更好。令人惊讶的是,“瘦子”是最好的演员。没想到啊!
分类报告
有趣的是,其他品种的精确度和召回分数参差不齐。PR 和 ROC 曲线也是如此。“瘦子”在其他班级中非常突出。训练出一个能够区分无毛豚鼠和有毛豚鼠的模型确实很酷。😃
不同品种的精确召回曲线(面积=平均值。精确分数)
受试者工作特征曲线(AUC =曲线下面积)
步骤 5b。从 InceptionV3 (ImageNet)转移学习
这个模型是使用迁移学习技术构建的,如这里的T5所示。它使用在 ImageNet 上预先训练的权重。对于这个特定的模型,我选择冻结前 230 层。
经过 100 个历元的训练,该模型达到了 99 %的训练准确率和 82%的验证准确率。这肯定是过度拟合,起伏不定的验证曲线似乎也支持这一点。这也可能意味着我的数据仍然不够。
训练/验证准确度与历元数
当我查看分类报告时,除了三个非常具体的问题,精确度和召回分数总体上都非常好。这个模型似乎倾向于将“红阿比”和“西尔基”误标为“美国人”。
分类报告
混淆矩阵也支持这一观察。这位模特狂热地将“红阿比”(31 岁)和“西尔基”(9 岁)误标为“美国人”。
直觉上,这是有道理的。与“瘦子”不同,“红阿比”是短毛,“西尔基”是皮毛光滑,从某些角度看,这两个品种很容易被误认为是“美国人”。
注意:当然,这也可能是一个简单的糟糕的原始图像的例子。我绝对想调查一下以确定。
第六步。模型比较和选择
InceptionV3 迁移学习模式总体得分最高。
不同模型的度量比较
最重要的是,它能够出色地分类“瘦”,而经典分类器通常都失败了(高召回率)。值得注意的是,没有一个模型能够自信地识别“红阿比”本身(低回忆)。似乎这个品种特有的玫瑰花结图案并没有那么明显。可能需要获得更高质量的图像来改进。
不同模型的回忆分数比较
深度学习模型能够在预测中巧妙地区分大多数品种(高精度)。
在所有模型中,只有“美国”遭受了类似的痛苦:在预测过程中,这些模型经常将其他品种视为“美国”(低精度)。DL 型号稍微好一点,但也好不了多少。
不同模型的精度分数比较
当我们一起比较所有模型的 PR 曲线时,很明显我们有一个真正的赢家。
类似地,迁移学习模型也以最好的 ROC 曲线开始。
因此,通过迁移学习训练的最终模型显然是最佳候选。为了好玩,我甚至用它来预测保存在子文件夹“/images/new _ samples”中的超范围图像。
结论
这无疑是一个奇妙而充满乐趣的项目。尽管我知道迁移学习会创造奇迹,但亲眼目睹它就发生在我眼前确实令人振奋。当我不得不处理一个小数据集时,这尤其令人鼓舞,这个数据集的大部分图像质量都很差。你能想象如果我们有更多的数据,更好的图像,这个模型会变得多好吗?
此外,深度学习模型特别“聪明”,能够区分“瘦”和其他品种。这是经典分类器无法做到的。同样,我没有用其他分类器进行测试,尤其是 XGBoost。
对我来说这还不是结束。我非常希望将这个项目扩展到以下目标:
- 添加更多高质量的图像
- 识别更多品种
- 尝试其他分类器和预训练模型
- 部署 API
- 创建一个网站
- 构建移动应用程序
当网站或应用程序准备好了,我一定会在社交媒体上与其他豚鼠爱好者分享。
谢谢你阅读这篇文章,我希望你和我一样喜欢!
H2O 无人驾驶人工智能
autoML 系列的第五名—可视化和可解释性的第一名
图片来自皮克斯拜
今天,我继续我在 autoML 工具中的冒险。其中一个领导者是 H2O 的无人驾驶人工智能产品。它有一些让我印象深刻的功能。我在这次评估中的一个缺点是,我没有足够的时间来正确训练“沃森”数据集。虽然无法获得结果,但我已经分享了足够多的经验,让您对该工具有所了解。
为什么是无人驾驶 AI?
在过去的几年里,我已经看过几次无人驾驶人工智能的演示。我自己在 2018 年用我的 AWS 账户里的试用做了一个评测。我从经验和名声中知道;这是可用的顶级 autoML 工具之一。他们兜售他们的可视化,两年前我对他们印象深刻。
设置和成本
像 DataRobot 一样,无人驾驶 AI 是一种特许产品。自去年以来,无人驾驶人工智能已经可以通过 IBM 和其他云平台使用。我无法找到一个指定用户 2020 年的确切许可成本。根据我的研究,价格似乎与每年 8 万美元的 DataRobot 费用相当。
幸运的是,我们可以免费试用无人驾驶人工智能。有几个选择。您可以获得 14 天的云实施或 2 小时的托管平台。过去,我一直使用 AWS Marketplace 产品。对于这个演示,我使用的是托管平台。两个小时是很短的时间,所以我需要有效率。
我在水族馆上开了一个账号。有几个实验室可供使用。按照建议,我开始了试驾实验室。我最初不确定是否可以加载我的数据集。我很高兴看到我可以。
等待我的实验室运转起来——作者的 gif 图
实验室启动后,我得到了一个指向 AWS 实例的 URL。又快又简单。
数据
为了保持本系列中各种工具的平等性,我将坚持使用 Kaggle 培训文件。矛盾,我亲爱的华生。使用 TPUs 检测多语言文本中的矛盾和蕴涵。在这个入门竞赛中,我们将句子对(由一个前提和一个假设组成)分为三类——蕴涵、矛盾或中性。
6 列 x 13k+行—斯坦福 NLP 文档
- 身份证明(identification)
- 前提
- 假设
- 朗 abv
- 语言
- 标签
加载数据
加载数据非常容易,在进行任何训练之前,都可以看到一些非常好的可视化效果。您还可以在列表中添加图表,这是一个很好的特性。大多数 autoML 工具不会给你关联图和雷达图。我认为数据热图有点弱,但这似乎是由于数据(文本)的多样性。有趣的是,当你下载可视化效果时,它们就出现了。svg 格式。如果你有 Adobe 许可证就好了。
作者截图
作者截图
训练您的模型
让模特接受培训很简单。发射实验。您可以根据自己的喜好调整精确度、时间和可解释性刻度盘。还有很多专家设置可以查看。
作者截图
在这个主要的可视化和日志之间,您可以很好地了解您的培训工作正在取得的进展。我很欣赏这一点!我可能对我的拨号盘过于激进,在我分配的时间内,我无法完全完成整个实验。
实验运行—作者 gif
评估培训结果
嗯,我没有足够的时间用我的时间来训练模特。我试图启动一个新的实验室,并再次尝试,但我只是得到了 45 分钟的“等待工人”的消息。我会对生成的特征感兴趣。特征生成是该工具的一个显著特点。
好消息是有一些预运行的项目,你可以自己浏览。
我确实看到 H2O 增加了自动报告功能!很好的补充。这份报告不像 DataRobot 的报告那样全面,但它在正确的方向上做得很好。
作者的自动报告内容截图
H2O 有一本关于模型可解释性的免费小册子,我强烈推荐。他们是这个地区的领导者。
[## 机器学习可解释性介绍——AI 和 ML 领域的开源领导者
理解和信任模型及其结果是好科学的标志。分析师、工程师、医生…
www.h2o.ai](https://www.h2o.ai/resources/ebook/introduction-to-machine-learning-interpretability/)
当您单击“解释此模型”时,您必须等待流程运行。不要盯着屏幕,否则你会发现你的眼睛在状态上打转。
作者 gif
慢慢地,解释变得可行了。结果值得等待。
作者截图
作者截图
结论
无人驾驶人工智能是一个伟大的工具。它们提供了有趣的可视化效果,并允许您添加更多的可视化效果。模型可解释性度量和图表非常棒。和 DataRobot 一样,你需要为伟大付出代价。
实验室是免费的,所以我鼓励你今天就去尝试。预先训练的项目给你一个良好的开端,让你可以看看自己。
如果您错过了本系列中的一篇文章,这里有链接。
[## AWS Sagemaker Studio 自动驾驶仪准备好迎接黄金时段了吗?
带有一些评论的自动驾驶界面演示
towardsdatascience.com](/is-aws-sagemaker-studio-autopilot-ready-for-prime-time-dcbca718bae7) [## 免费体验 Google autoML 表格
autoML 工具用户体验评论系列之二。
towardsdatascience.com](/experience-google-automl-tables-for-free-d5648ae3d0e5) [## Azure Automated ML 倾听他们的设计师
本 autoML 系列的第 3 部分,微软,绝地大师
towardsdatascience.com](/azure-automated-ml-listens-to-their-designers-7f1c68d19eb4) [## DataRobot 让生活变得简单。
汽车系列之四——设计之美
towardsdatascience.com](/datarobot-makes-life-easy-8505637241e5)
黑客马拉松是为 c̶o̶d̶e̶r̶s̶所有人准备的
关于黑客马拉松让你无法从中受益的 3 个误区
在我最近的黑客马拉松上,加州斯坦福。
当我注册参加我的第一次黑客马拉松时,对未知的恐惧困扰着我。快速的谷歌搜索显示,我需要熬夜 24 小时来构思和创造一个符合黑客马拉松广泛主题的产品。作为一名地球科学家,我在编码方面经验有限,完全没有开发经验。因为我进入了未知的水域,我决定保持低调,静静地观察其他参与者。
这些年来,我意识到我的恐惧大多是没有根据的。黑客马拉松不仅仅限于程序员,而且黑客马拉松不是为了炫耀你知道什么,而是为了学习你不知道的。甚至在今天,当我参加黑客马拉松时,我看到我的朋友们扬起眉毛问“你要参加吗?”为了消除所有的误解,让每个人都从中受益,我在这里分享了 3 个关于黑客马拉松的常见误区。
编码经验对 r̶e̶q̶u̶i̶r̶e̶d̶有益
在一次黑客马拉松中使用 CSS 和 Javascript 构建了我的第一个应用程序界面来预测野火风险,而在此之前我并不知道这两种语言。
这是我遇到的关于黑客马拉松的最大误区之一。运行良好的黑客马拉松几乎没有资格要求,除了真诚的学习热情。因此,如果您几乎没有编码经验,也没有理由感到失望。
事实上,黑客马拉松可能是学习新编程语言/API/软件工具的最快方式之一,因为有限的时间促使人们寻找快速学习新技能的方法。你可以直接跳到 Stackoverflow 去了解他们到底需要什么,而不是在教程上花费无尽的时间。此外,编码只是整个工作的一部分。将代码转换成产品需要大量的设计思维。黑客马拉松的最佳团队有效地将一个简单的想法与智能产品开发和创造性设计思维结合起来。
如果你不是一个程序员,你可以使用这些技巧中的一个来迎接挑战-
- 利用办公时间:在黑客马拉松期间,通常会有几位导师来帮助你完成项目。不要羞于使用它们。
- 与具有互补技能的人合作:这样,你可以专注于项目中适合你专长的部分。然而,如果你真的想学习一项新技能,这是不可取的。一个知道做某事的队友可能会自己做,却没有时间教你。
黑客马拉松大多有与软件 o̶n̶l̶y̶相关的项目
我最喜欢的硬件黑客之一— SafeCup 识别下药事件
尽管大多数黑客马拉松项目都是基于软件的,但也有例外。黑客马拉松通常要求参与者拿出一个面向技术(而不是面向软件)的产品。例如,今年在的 TreeHacks (斯坦福大学的黑客马拉松)中,大约 20%的获胜者的项目中有硬件组件。黑客马拉松的广泛主题(如“创造更美好的未来”)提供了巨大的灵活性。因此,如果你有一个符合问题陈述的想法,没有理由不去追求它,即使它仅仅是硬件!
硬件黑客需要牢记的一些常见技巧-
- 硬件产品比软件产品有更多的失败途径。在扩展功能之前使其健壮。
- 硬件产品可能更耗时(尤其是 AR/VR hacks)。因此,快速失效方法可能是有用的。
黑客马拉松是为 s̶h̶o̶w̶i̶n̶g̶-̶o̶f̶f̶学习准备的
在我的第一次黑客马拉松中向他人学习,谷歌总部,加州
黑客马拉松的参与者通常非常多样化。他们跨越了几个层次的技能集和知识库,在团队之间产生了巨大的力量差异。在一次黑客马拉松中,甚至在开始之前,一些参与者就在一个致力于团队组建的频道上分享了他们的 Devpost 个人资料,以展示他们在黑客马拉松中的辉煌记录。他们最终独自参加,因为没有人愿意加入他们。
大多数人参加黑客马拉松是为了学习。机器学习工程师可能想要学习一种新的算法。全栈开发人员可能想学习一种新的集成。黑客马拉松的评委们对你产品的技术细节很好奇,就像他们对你从构建产品中学到了什么一样。
促进你在黑客马拉松中学习的技巧:
- 远离吹牛的人。
- 作为项目的一部分,至少尝试一件新事物。
- 在最后一次展览期间,花些时间探索其他项目。
结论
黑客马拉松是学习新技能或提高现有技能的绝佳机会。有限的时间加上充满活力的环境可以帮助你学得更快。如果你不知道编码,你不必担心。如果你的项目没有大的软件组件,你也不必担心。重要的是你从度过一个不眠之夜中有所收获。这只有在你不是去炫耀而是去学习的情况下才有可能。
通过项目优先的方法理解自然语言技术的现状
当人工智能遇到语言
蓝图,以实际操作的方式了解自然语言技术的最新进展。
来源:维基媒体
注意:涵盖的主题包括转换器、语言模型(BERT,GPT-2)、评估基准和对话界面(聊天机器人)。
2020 年 6 月初,我决定了解 NLP(自然语言处理)的现状,以及相应的(狭义)人工智能的角色。我通常理解一个主题的方法是自下而上的。在开始一个项目之前,彻底理解基本原理。受时间的限制,也受像 Fast AI 这样的人推广的教学法的启发,我决定先做项目。
旁注:从知识的角度来看,我已经习惯了 机器学习神经网络PyData栈和 云计算 。如果你计划复制这种方法,请记住这一点。**
本文提供了项目和潜在动机的更高层次的概述。你可以决定追寻或复制这条道路。我可能会决定写一些个人作品。现在,我总结一下我的经历和学习。
入门指南
我最初的项目列表如下:
- 利用 OpenAI 的 GPT-2 更好地理解语言模型的项目
- 一个 ML 驱动的聊天机器人,目的是更好地了解 NLU
- 一个记录和分析音频对话(在线或电话)的工具
注:在我开始这个项目一周后, OpenAI 发布了他们的 API 。如果你被流言所迷惑,下一部分可能会特别有趣。
这份名单是有意开放的。计划是做感兴趣的项目,并在此过程中完善想法。选择探索 GPT-2 语言模型是因为有丰富的相关学习资源和讨论。围绕前两组想法的实验描述如下。我还没有机会开始写第三部。
玩弄 GPT-2
GPT-2 出现在 2018–19 年 NLP 中 transformer 架构和转移学习出现期间。迁移学习是一个强有力的概念。它允许预先训练的大型神经网络(在这种情况下是语言模型)为下游任务进行微调。这省去了从业者从头重新训练整个模型的麻烦。这种灵活性是语言模型成功的一个重要原因。
开始时,我四处寻找现有的 GPT-2 项目进行复制。就在那时,我偶然发现了 Max Woolf 的相关 Python 包。他的作品让初学者也能轻松入门。就在那时,我决定做一个模仿 Twitter 的机器人作为第一个项目。
模仿推特机器人
推特用户 dril 的一个模仿机器人在 2019 年变得流行起来。它是由一个 GPT-2 模型驱动的,这个模型是在 dril 的推特上微调的。
本着同样的精神,我制作了一个模仿机器人账户,该账户由 5 个不同的模仿账户组成。这些角色包括伊丽莎白女王、伏地魔、达斯·维德和无聊的埃隆·马斯克。为了获取推文,我使用了令人惊叹的 twint 包。
艾的多面性
最终的机器人账户被命名为女王达斯·伏地魔·马斯克,这是他们名字的第一个。是的,你没看错。
复制这个项目所需的信息可以在这里找到。
变形金刚,伯特和 GPT-2
然后,我走了一点弯路,阅读了 GPT-2 和 NLP 中的迁移学习背后的理论。BERT 是另一个不断出现的语言模型。GPT 和伯特都是基于变压器架构。然而,伯特只有编码器模块,而 GPT-2 只有来自变压器的解码器模块。这使得它们更适合不同类型的任务。
试图理解这两种流行模型的技术差异和功能是一项有益的工作。我强烈建议这样做!
以下是围绕这个话题的一些相关链接:
这个弯路也让我有了下一个项目的想法。
评估 NLP 基准
机器学习的胜利与它们在标准基准上的表现息息相关。即使你不是一名研究人员,也知道像 GLUE 这样的基准会给你关于该领域的重要见解。如果你着手对比 BERT 和 GPT-2,即使没有深入的专业知识,看看他们被评估的基准会让你知道他们适合的问题。这对从业者是有帮助的。
NLP 基准,如 GLUE 和小队由多个任务组成。不同的任务测试语言不同方面的熟练程度,如实体识别、问答和共指消解。结合起来,他们测试 T21 的一般语言理解能力。
对于这个项目,我有两个目标:
- 从相关基准中至少评估一项伯特和 GPT 新协议
- 根据流行的基准实现各种任务
为了实现,我通过 HuggingFace 使用了 transformers Python 库。我将很快发布相关的笔记本,希望能写更多关于这个子主题的内容。
同时,这里有一些有用的链接:
- GLUE 解释:通过基准测试了解 BERT】
- 视频 NLP 的最新技术
- 为什么 GPT-2 不在 GLUE leadership 董事会上?
- hugging face 的(NLP)任务大表
实用 NLU:对话界面
对话界面变得越来越普遍。对于面向消费者的应用来说,它们将变得越来越重要。对于新兴经济体来说尤其如此,在那里,语音优先界面可以为新的互联网用户增加巨大的价值。
当我在思考对话界面时,我遇到了 Rasa 的一个在线活动。我参加了一些会谈。他们帮助我从一个开发者的角度获得了一种直觉。在那之后,我对语音界面的偏好帮助我选择了下一个项目。
AI 语音助手
对于这一次,我只是按照一个伟大的教程端到端。下面是— 如何用开源的 Rasa 和 Mozilla 工具构建语音助手。
在此实现的大多数功能都作为托管服务提供。就个人选择而言,我选择从开源工具开始。当然,在考虑生产场景时,需要考虑权衡。
Rasa 已经开发了丰富的资源和活跃的社区。他们非常有帮助。
客服聊天机器人
使用过开源工具后,我想尝试一下托管服务。像 GCP、AWS、Azure 和 IBM 这样的公司提供了选择。我选择了谷歌的对话流。
你友好的邻居银行机器人
一旦你熟悉了基本原理,比如意图和动作,构建一个机器人就简单了。预训练的机器人是一个方便的功能,但导入它们并不是一个流畅的体验。每个项目一个机器人的特性和它出现的延迟让我困惑了几分钟。
总结想法
进行上述实验是一次有趣的经历。有时,我渴望深入主题。选择放手让我探索手边的广度。这也让我可以在日程安排中挤出一些简短的黑客会议。
最近在自然语言处理领域有了一些令人兴奋的发展。在新兴经济体中,语音作为一种界面正越来越多地被采用。提高机器对语言的理解也将促进技术的民主化。
与此同时,我们需要对其局限性持现实态度。OpenAI 的 GPT-3 驱动的 API 的用例已经像病毒一样传播开来。以至于他们的首席执行官萨姆·奥尔特曼发了一条讽刺性的推特来谈论这种炒作。
Rasa 提出了对话式人工智能 5 个层次的概念。他们还提到,我们也许离第五层还有十年。
语言是人类进步的关键。通过新兴技术的视角来探索它是一项有趣的尝试。我希望创新的列车将以负责任的方式继续前行。
如果你想进行讨论或分享想法,请随时联系我们。
原载于 2020 年 7 月 30 日https://www . akashtandon . in。**
黑客超级智能
照片由 Allan Beaufour 拍摄,许可: CC BY-NC-ND 2.0
人工智能/人工智能正在影响敏感的决策——为了保护我们的系统,我们需要一个统一的框架和一个新的学科:人工智能安全
世界上出现了一种新型的网络攻击。这些攻击与传统攻击不同,无法用传统方法应对。今天,这种攻击还很少,但在未来十年,我们可能会面临一场海啸。为了做好准备,我们需要从今天开始保护我们的人工智能系统。
我想从人工智能安全性的前提开始,只是意识到我在冒一个关于人工智能如何具有破坏性的陈词滥调的风险。为了让它离开桌子,我将提到 AI 不仅是我们日常生活的一部分(搜索引擎建议,照片过滤器,数字语音助手)。它已经参与了关键的决策过程;国家机构使用 AI 来更好地分析数据。汽车使用它来做出拯救生命的决定(并自动驾驶)。金融机构每天都在使用它——我们可能正在经历人工智能应用的寒武纪大爆发,在未来十年,人工智能将改变我们生活中最敏感的领域:医疗诊断、金融机构的决策、关键基础设施的控制和军事系统的决策。
基于 30 多年的数字黑客和欺诈,我们可以假设犯罪分子已经在努力利用这项技术的弱点——其中一些弱点就像人工智能一样新[1]。尽管如此,在成千上万致力于开发这些人工智能系统的人中,可能只有一小部分人在关注 人工智能系统的安全性。
在这篇短文中,我打算简要回顾一下“人工智能固有的风险”,提供一些人工智能政策的背景,以强调这个主题被处理的强度,然后提出一个新的安全规程的框架:人工智能安全。
风险
" 人工智能是未来,不仅仅是俄罗斯,而是全人类。它带来了巨大的机遇,但也带来了难以预测的威胁。谁成为这个领域的领导者,谁就将成为世界的统治者。——弗拉基米尔·普京( RT )
在技术世界里,新的风险通常伴随着创新。这些风险开始很小,然后爆炸(见我关于指数风险的帖子,特别是物联网用例)。人工智能具有指数级的破坏力。想想它对数字数据的影响;想想所有的在线视频、录音电话、安全摄像头、网站……现在想象一种人工智能算法,它可以分析任何这样的数据,找到隐藏的联系,并从中提取新的意义。数据分析创建了一个新的数据体,几乎和原始数据体一样大,没有人能预料这些数据会是什么样子。今天,我们赋予这些系统反应和交互的能力,例如,让人工智能接听电话或驾驶汽车,从而成倍增加了破坏的途径。依靠不可预测的数据,以不可预测的方式做出决策。你觉得有多安全?
即使你信任人工智能做出正确决定的能力,并且你信任使用人工智能的企业/机构,也有另一个重要的警告:人工智能容易受到新型攻击。当今的网络安全主要集中在保护 IT 系统和网络物理系统(CPS)免受逻辑、代码或架构中漏洞的利用。当攻击人工智能系统时,攻击者拥有几乎无人能敌的新操作方法,例如:
- 在学习阶段毒害训练数据以使模型产生偏差。
- 利用训练白点欺骗人工智能的对抗性攻击。
- 暴力迫使模型提取训练数据,违反隐私或数据保密。
- 物理模型提取,允许攻击者提取模型,从而侵犯所有者的知识产权。
还有许多其他的例子[2]。当人工智能在公司的业务流程和敏感决策中变得至关重要时,很容易看到上述攻击如何在 SFOP 范围内导致损害场景:安全、财务、运营和隐私。
相关政策和研究
AI 战略文件时间表,自 2020 年 4 月起生效,犯罪司法所根据 CC BY-SA 4.0
人工智能安全工程一词早在 2010 年就由 Roman Yampolskiy 创造,开始引起人们对我们面临的问题的关注。2017 年 1 月,一群领先的行业和学术研究人员设计了 Asilomar AI 原则[3] 。由 1600 多名研究人员签名,并得到埃隆·马斯克和斯蒂芬·霍金等名字的认可,阿西洛马人工智能原则旨在为人工智能研究提供一个重要考虑因素的框架。大部分原则都是围绕 AI 伦理和价值观。原则 6 明确指出 AI 安全必须是所有 AI 实现中的一个考虑因素。人们的意识肯定在提高,然而,只有一小部分人在积极研究人工智能的安全性。
从好的方面来看,世界各地的监管者都很早就意识到了这种风险。这与过去的技术风险相反。例如,GDPR 是在技术侵犯我们的隐私约 30 年后,以及物联网成为现实 20 年后加州物联网法案[4]出台的。就人工智能而言,政府很早就开始关注了[5]。例如,白宫在 2018 年发布了“美国人民的人工智能”概况介绍。欧盟委员会于 2019 年 4 月发布了“可信人工智能(AI)道德准则”[6],中国多年来一直在该领域投资。人工智能政策是一个伟大的话题,我不会在这篇文章中详细阐述。为了更深入的了解,你可以研究上述战略文件的时间表,并阅读 CLTC 的总结论文[7]。
但即使有所有这些政策,任何人都可以在几分钟内编写一个人工智能应用程序,而不被人注意。我们用来管理风险的工具实际上并不存在。
解决人工智能安全有很多角度,作为一名技术人员,我想把重点放在技术选项上。
解决方案景观
首先,让我们定义我们的术语。
AI 安全,在我的词汇里,只涵盖了我们需要信任 AI 的一部分。概括来说,我使用术语人工智能信任:当人工智能算法做出决策时,企业和用户睡得好的能力。为了指明保护人工智能系统免受攻击的原则,我使用了术语人工智能安全。
人工智能信任:人类信任人工智能考虑结果的能力:
- 有限可解释性
- 易受针对 IT 系统的网络攻击
- 易受针对人工智能工作方式的攻击(例如敌对攻击、投毒等)
- 重大数据泄露的风险
人工智能安全:保护人工智能系统免受以下危害的规则:
- 人工智能本土攻击(敌对,中毒等…)
- 盗窃人工智能模型(即知识产权)
- 训练数据的推断
- 侵犯隐私
虽然我一直在说只有一小部分人从事 AI 安全/安保,但业界和学术界并没有完全睡着。在加州大学的一篇技术论文[8]中,作者绘制了考虑到人工智能大规模采用的不同研究领域。其中三个领域属于人工智能安全领域:稳健决策、安全领域、机密数据共享学习和对抗学习。近年来,各大会议都选择将 AI 安全作为主题。例如,在 Black Hat USA 2020 中,围绕 ML/AI 主题进行了 8 次简报,其中两次直接关注模型提取[9]和防范敌对攻击[10]。ACM 人工智能与安全研讨会( AISec )涵盖了越来越多的人工智能安全主题会议。除了学术兴趣之外,我们还应该加上业界的关注点:例如,参见华为[11]的这篇综述文章和 IBM [12]领导的开源项目,该项目为您提供了一个完整的工具包,让您的系统做好准备,以应对恶意攻击(您可以在此处下载)。
AI 安全技术
研究兴趣导致了实际的解决方案。有远见的公司已经可以依靠现有的知识体系来对抗人工智能的攻击。从专业的角度来看,我认为我们应该首先报道那些无聊的东西:
作者图片
治理:
- 人工智能安全领域的清晰定义:我们要解决什么?
- 组织中 AI 安全的明确责任:是产品所有者、工程部门还是合规部门?
R&D 进程:
- 在开发生命周期中考虑与 AI 相关的风险。这应涵盖产品开发和数据科学运营。
- 每个项目应在开始时确定人工智能风险和相关的人工智能安全目标。
- 安全测试和红队应该被训练使用人工智能攻击媒介。
- 必须保护培训数据,并对威胁进行分析。
技术:
- R&D 团队应该使用标准的现成工具来强化系统。
- 必须对数据进行过滤,并做好应对敌对攻击的准备。
- 人工智能模型应该被强化以降低敏感度,如果可能的话,还应该能够抵御攻击。
- 生产中的部署应该使用不同的控制措施来保护模型和培训数据的机密性。
监控:
- 应该监控人工智能系统的偏见、中毒和其他攻击企图。
- 应在生产中分析推理和查询,以检测攻击企图(即恶意攻击或数据提取)。
就技术而言,现有工具至少可以应对基本威胁:
- **模型提取:**分析输入以检测模型推理尝试。例如,在线集成 PRADA 检测模型[13]并采取措施应对攻击企图。
- **投毒:**验证训练数据并采样(疏删样本,有多疼就多:)。在生产中,尽量实现不同独立模型之间推理结果的比较,即集成分析。此外,寻找数据中的异常。
- **对抗性攻击:**用对抗性训练数据训练你的模型。这可以在培训阶段使用 ART 工具箱来实现。在生产之前,尝试最小化你的模型的敏感性,例如通过使用知识转移[14]。最后,探索通过重建[15]和检测可疑输入来保护您的模型的选项。
- **IP 盗窃:**模型的部署,尤其是在边缘部署的情况下,必须在一个架构中保护模型的至少一部分免受本地攻击者的攻击。这可以通过在不使用模型时对其进行加密,并利用安全区域和三通来保护关键部分来实现。最后,考虑在你的模型中加入特定的水印,使用只由特定输入触发的神经路径,它可以帮助你发现别人是否偷了你的模型。
正如这篇 2016 年的论文[16]中提到的,我们真正需要的是一个统一的框架。像网络安全的其他领域一样,我们不希望每家公司都开发自己的安全风格——从社会的角度来看,技术领导者开发人工智能安全学科和最先进的技术来保护人工智能系统非常重要。
AI 安全创新
在我看来,我们需要一个整体的解决方案,让公司在购买现成安全产品的同时专注于人工智能开发。该解决方案将涵盖从构思、开发到部署的人工智能安全。这种解决方案至少应包括以下要素:
- **风险和流程:**基础培训、治理框架和专业安全测试应由有能力的公司和卓越中心作为专业服务提供。
- 数据卫生性和健壮性:过滤训练数据中的异常点,并向训练数据中注入敌对样本。
- 模型安全性:执行标准例程(提取、修剪)并集成高级控制,使模型更加健壮。将水印路径注入到模型中,以便能够在野外进行模型盗窃检测。
- 安全部署:通过在不可信和可信执行环境之间划分模型部署,保护模型免受物理盗窃[17]。在边缘运行时自动加密和解密模型。
- 威胁防范&检测:在操作过程中(“现场”)过滤和预处理输入,以阻止攻击企图。监控使用情况以检测敌对攻击企图和/或模型提取企图。
作者图片
将上述控制集成到 AI 开发周期中对于任何客户来说都应该是容易和可访问的,从而将开发团队从开发内部能力和自制 AI 安全工具的需要中解放出来。它应该是每个公司都使用的标准解决方案,就像所有公司都在其系统中使用 TLS 并安装现成的防火墙一样。此外,还可以提供人工智能安全专业服务:例如,专注于人工智能的红队、风险评估和监控 SOC。
我们应该问自己的唯一问题是,是否有足够强大的商业案例来开发上述解决方案并将其作为产品进行营销。我认为这不是一个“如果会有商业案例”的问题,而是一个“什么时候的问题。至少有 4 种力量在发挥作用,使未来 5 年成为人工智能安全领域创新的有利可图的时间(没有特定的顺序):
- 人工智能在商业决策过程中的流行[18]
- 规程
- 信息物理系统开始利用人工智能[19]
- 人工智能操作成为一件事(简而言之:在人工智能世界里有一个类似 DevOps 的运动)[20]
但是对于投机者来说,未来 5 年内什么时候是个问题。既然我们在谈论安全性,那么有理由假设大玩家(即方)会照顾好自己,少数早期采用者会从外部寻找解决方案,而市场的大多数人只会等待大黑客的消息。让我们看看结果如何。
总结
作为一名在保护 CPS 方面拥有专业知识的网络安全专家,我亲眼目睹了安全创新如何通常跟随风险而不是先于风险。对于一家开发人工智能的公司来说,正常的轨迹是首先投资让它工作,然后优化它,然后才保护它。然而,由于我们处于 2020 年,考虑到这项技术的颠覆性,我们不能等待人工智能安全的投资。监管机构非常(也是可以理解的)关注可解释性— 但是人工智能信任,即我们信任人工智能做出决策的能力,需要同样多的投资来应对这项技术带来的新攻击。
今天有很多事情可以做,甚至使用开源工具来保护你的人工智能系统。下一步自然是行业开发人工智能安全产品。虽然我不能 100%肯定会有一家领先的人工智能安全产品公司,但我非常确信我们会在该领域看到专家顾问和专业服务的利基。如果你觉得这个话题有趣,现在可以是发展你的人工智能安全技能的好时机。
我希望这篇短文提供一些思考的食粮,也许是管理你自己的 AI 安全风险的起点。
我如果你想参与讨论,请评论,分享,随时联系我:【harpakguy@gmail.com】T4
谢谢:)
免责声明:我的观点仅代表我个人,与我工作的任何公司或个人无关。
参考资料:
[1]- Roman V. Yampolskiy,人工智能安全和网络安全:人工智能失败的时间线(2016 年), Arxiv
[2]- 亚历山大·波利亚科夫,AI 安全与对抗机器学习 101 (2019),中
[3]-阿西洛马尔原则(2017),https://futureoflife.org/ai-principles/?cn-reloaded=1
[4]- 参议院第 327 号法案
[5]-维基百科:人工智能条例
[6]- 可信人工智能(AI)的伦理准则
[7]-加州大学伯克利分校 CLTC 分校,走向人工智能安全:全球对更具弹性的未来的渴望, CLTC
[8]–斯托伊察、扬和宋、道恩和波帕、拉卢卡·阿达和帕特森、大卫·A .和马奥尼、迈克尔·w .和卡茨、兰迪·h .和约瑟夫、安东尼·d .和乔丹、迈克尔和赫勒斯坦、约瑟夫·m .和冈萨雷斯、约瑟夫和戈德堡、肯和古德西、阿里和卡勒、大卫·e .和阿贝耳、彼得、伯克利的人工智能系统挑战观点(2017),链接
[9]-于,杨,张,蔡永元,何永元,金永元,“云漏洞:通过对抗实例窃取大规模深度学习模型”,《网络与分布式系统安全研讨会论文集》,(NDSS),2020
[10]- Ariel Herbert-Voss,对抗对抗性机器学习的实际防御(2020), Blackhat 2020
[11]-华为,AI 安全白皮书(2018 年 10 月 01 日),华为
[12]-玛丽亚-伊琳娜·尼古拉、马蒂厄·辛恩、明·恩哥克·特兰、比特·布瑟尔、安布里什·拉瓦特、马丁·威斯特巴、瓦伦蒂娜·赞泰德斯基、娜塔莉·巴拉卡尔多、布赖恩特·陈、海科·路德维希、伊恩·m·莫洛伊、本·爱德华兹,对抗性鲁棒性工具箱 v1.0.0 (2018), Arxiv
[13]-米卡·尤蒂,塞巴斯蒂安·西勒,萨缪尔·马沙尔,n .阿索坎,普拉达:防范 DNN 模特窃取攻击(2019), Arxiv
[14]- Nicolas Papernot,Patrick McDaniel,Wu,Somesh Jha,Ananthram Swami,蒸馏作为对抗深度神经网络的对抗性扰动的防御(2016), Arxiv
[15]——石祥·古,卢卡·里加齐奥,面向对抗示例的深度神经网络架构(2015), Arxiv
[16]- Nicolas Papernot,Patrick McDaniel,Arunesh Sinha,Michael Wellman,SoK:走向机器学习中的安全和隐私科学(2016), Arxiv
[17]- GlobalPlatform,TEE 系统架构 v1.2,https://global platform . org/specs-library/TEE-System-Architecture-v1-2/
[18]-约瑟芬·沃尔夫(Josephine Wolff),如何为人工智能提高网络安全(2020),布鲁金斯学会
[19]-https://www . the guardian . com/science/2019/mar/29/uk-us-Russia-opposing-killer-robot-ban-un-ai
[20]-比如:【https://research.aimultiple.com/ai-platform/】T4
入侵数据科学管道
特征工程系列
功能改进—以#02.01 为例
昆腾·德格拉夫在 Unsplash 上的照片
这篇博文的目的
这是特征工程系列的第 02.01 课。在 Take#01 中,我们专注于获得与 EDA 相结合的基线模型以及对数据的理解。我们能够为 ML 基线模型获得 0.59035 的 AUC -ROC。
因此,要击败的 AUC -ROC 是 0.59035!
让我们继续“特性改进”的项目演练,这是特性工程管道的第二个也是最重要的组成部分之一。
面临的挑战是创建一个模型,使用重症监护最初 24 小时的数据预测患者的存活率(标签:“hospital _ death”)。麻省理工学院的 GOSSIS community initiative 拥有哈佛隐私实验室的隐私认证,提供了超过 130,000 名医院重症监护病房(ICU)患者的数据集,时间跨度为一年。【来源】。关于挑战的详细描述可以在这里找到
说够了,让我们开始吧!
照片由 Mael BALLAND 在 Unsplash 上拍摄
定义路线图……🚵
深入调查潜在的数据问题,如下所示:
里程碑# 1:确定明确的缺失值
里程碑# 2:注意隐式/ 隐藏的缺失值&不正确的数据值
最后是结束语。
里程碑# 1:识别明确缺失的值
所以在我们之前的迭代中,我们已经看到了缺失值的分布。这是一个简单的简写,因为我们能够识别编码为*nan 的缺失值。*就这么简单!
里程碑# 2:注意隐式/ 伪装的缺失值&不正确的数据值
事实上,您也应该始终在数据集中寻找“伪装的”缺失值,以确保缺失值被正确编码为缺失值,更准确地说是 NaN。缺失值的几种伪装形式描述如下:
- 范畴变量:名词性/序数串 —空串/“未知数”/?”表示缺少的值
很公平。
问题是,要识别隐藏的缺失值和潜在的损坏/不正确的数据,您几乎总是依赖于与您试图解决的问题的领域专家合作。在我们的例子中,领域专家是医疗从业者,但是由于它是一个 Kaggle 数据集,与领域专家合作的可能性是不存在的。但还是要注意一点!
幸运的是,我们得到了数据文档,它本身并不详细,也没有指出数据问题,但是快速 EDA 和浏览文档向我揭示了许多关于隐藏的缺失值和可能不正确的数据的见解,这正是我接下来几分钟要关注的内容。
文档看起来是这样的:
很明显,我们对每个属性 都有一个 【类别】。下面的图表总结了上述类别分布的信息:
上面清楚地显示了什么特定的数据类型属于什么特定的类别。考虑到生命体征、实验室和实验室血气主要由数字变量组成,让我们首先关注它们。
探究这些变量是否由零值组成揭示了:
此外,通过对属于这三个类别的变量的描述,可以发现它们与人体内特定化学物质的存在有关,如果一个人活着,那么“0”表示有效值本身是没有意义的。这可以通过浏览这些变量的描述,由领域知识(如文档中提供的)进一步验证。例如,对于属于生命体征类别的变量:
提供的数据符合患者之前的 24 小时,记录的值与患者死亡时间不完全一致。这引出了两个主要观点:
- 如果值为“0 ”,则患者不可能活着
- 反之亦然可能不是真的。例如,有可能患者已经死亡,但是的“一些更低的”值可能存在。但是,这是一个假设,我们需要更多的 ed a 来验证这一点,如下所示:**
上述趋势分叉为医院死亡1 和医院死亡0,表明在“医院死亡”1 的情况下有总体下降趋势。所以这确实支持了我们的第二个假设,即如果
医院 _ 死亡1,一般会发现下降趋势。
接下来,对于我们的第一个假设,我们需要进一步放大精确“0”的值,我们可能会寻找“0”与检测为异常值的值的交集。这可以进一步验证我们的概念,即这些“0”实际上是丢失的值。
异常值分布
让我们来看看这些变量的异常值的一般分布
“0”在生命体征变量中的分布显示,D1 _ heart rate _ min&D1 _ resprate _ min具有大部分 0 值,而D1 _ spo 2 _ min*&h1 _ resprate _ min具有相对较少的“0”。让我们绘制异常值分布。*****
哇!因此,该图确实显示,对于具有相对较高数量的“0”的变量,作为异常值的“0”的数量也较高!我们可以通过明确检查所有这些“0”是否也是每个变量的总异常值集的一部分来进一步验证我们的想法,即“0”是缺失值。
将离群值的 0 分布与原始数据集中的 0 分布进行匹配:
**“0”和“1”列对应的是 hospital_death0 和 hospital_death1。原始数据集中的所有“0”都在异常值中找到并完全匹配!
所以到目前为止,我们已经收集了足够的证据来支持我们的论点,即对于生命体征类别的上述变量,0 的 最有可能是缺失值 。
我们不是 100%确定托梁的概念,但同时,我们也不是绝对的盲点!
我想在这里提一下,这又是一个强调与领域专家合作的问题,如果这个问题是在现场处理的话,我们将有机会进一步验证我们的发现!
现在,通过将这些“0”编码为适当缺失的值【nans】,反映数据分布的变化总是一个好主意。****
“平均值”的变化百分比
不出所料,由于 D1 _ heart rate _ min&D1 _ resp rate _ min的“0”数最多,因此它们被更改的次数最多。
最后结束语……
- 作为一名精明的数据科学家,您不断地与领域专家互动和协作!你将会向他们透露一些发现,另一方面,领域专家将会为你设定一个方向。它总是一个联合的努力。
- 然而, 您必须始终亲自检查数据完整性 ,千万不要拘泥于您刚刚听到的 (就当它是潜在的进展) 因为在大多数情况下,公司本身也没有意识到潜在的数据问题,就像我们上面遇到的那些问题一样。
即将发布的帖子将包括:
在这篇博文中,我们仅限于对生命体征变量的详细分析。在下一篇博文中,我们将转向其他类型的变量,并继续识别和修复其他数据问题。这很费时间,但最终,结果将是值得的!
敬请期待!📻
如果您有任何想法、意见或问题,欢迎在下面评论或联系📞跟我上 LinkedIn
入侵数据科学管道!
特征工程系列
理解数据—参加#01
昆腾·德格拉夫在 Unsplash 上的照片
我们有 最先进的先进算法 来生成完全迷人的可视化效果,揭示数十亿美元的消费者购买模式,并利用大数据结合令人瞠目结舌的可扩展分析引擎来分析收入流。但是作为一名数据科学家,这一切都归结为一个切入点,特别是当步入行业时— “我从哪里开始一个数据科学项目!!!"
这篇博文的目的
揭开完整的数据科学项目管道……
有大量的在线课程提供了训练通用机器机器学习模型的完整路径,从基本的机器学习算法到高度复杂的深度神经网络和强化学习。但是,从原始、混乱和不完整的真实世界数据集中破解建模特征的数据科学管道是最不可或缺的难题之一,没有它,为真实世界训练尖端机器学习模型的梦想仍然无法实现!
照片由 Rodion Kutsaev 在 Unsplash 上拍摄
目标受众是谁?
您应该在以下领域拥有扎实的专业知识:
- 机器学习术语
- 充分理解和深入实践基本的 ML 算法
如果您的工具包中有上述内容,并且您正在进一步寻找实践经验来展开从数据获取到构建特性集的特性工程过程,以提高您的 ML 模型的性能增益,那么这篇博客正是为您准备的!
本教程的结果
我们将通过最近在 WiDS Datathon 2020 举行的黑客马拉松的真实世界数据集的亲身体验,走过特征工程管道的早期阶段。
选择该数据集的原因如下:
- 这不是练习 ML 算法的玩具数据集。事实上,这是一个真实世界的数据集,它需要有效的特征工程过程来训练一个良好性能的 ML 模型。
- 有大量丢失的行和大量的数据问题,您在日常的数据科学项目中同样会遇到这些问题。
- 完成工作后,您将开始欣赏特征工程的价值,以及为什么值得花时间玩数据集!
4.挑战在于创建一个模型,使用从最初 24 小时的重症监护到 的数据来预测患者的存活率(标签:“医院 _ 死亡”) 。麻省理工学院的 GOSSIS community initiative 拥有哈佛隐私实验室的隐私认证,提供了超过 130,000 名医院重症监护病房(ICU)患者的数据集,时间跨度为一年。 [ 来源 ]
5.关于挑战的详细描述可以在这里找到
如何跟进这个 BlogPost 项目演练?
我建议阅读并理解一般的思维过程,然后 在你自己选择的真实世界数据集上调整这里定义的思维过程 。
说够了,让我们开始吧!
定义路线图……🚵
里程碑# 1:特色工程&其不可或缺的价值!
然后:完成特征工程过程前期的项目走查
里程碑# 2:功能理解
里程碑# 3:功能改进
里程碑# 4:培训基线模型
最后是结束语。
特色工程&其不可或缺的价值!
什么是特征工程? 从原始数据中挖掘/建模/提取 特征的过程 。
特征工程的目标? 要素是嵌入基础数据模式的数据集属性,因此从原始数据属性中提取/建模要素意味着模型的高性能增益!
数据科学项目趣闻:通常情况下,数据科学家将项目时间的 80%花在功能工程上,只有 20%花在训练前沿模型上。事实上,特征工程是任何数据科学项目中最有价值但最不被重视的部分。有效的特征工程付出了艰苦的努力,一旦你开始钻研真实世界的数据集,你将很快开始意识到它有价值的重要性!
来源:https://whatshebigdata . com/2016/05/01/data-scientists-spend-the-most-time-cleaning-data/
特征工程过程早期阶段的项目走查
里程碑# 2:特性理解
特性理解侧重于 “理解您的数据” 我的意思是按照以下路线图仔细检查您的数据集(这不是每个数据科学项目的硬编码路线图!) :
你可以在这里找到完整的项目代码
1。检查您的数据是结构化的还是非结构化的。对于这篇博文,我们将只处理结构化数据。
2。签出数据集的行和列。
3。计算描述性统计数据
4。确定给定数据集中的数据类型,并确定每个属性位于四个数据级别中的哪个级别
将数据类型映射到分类和数值数据类型。此外,在数字数据类型的分类、区间和比率级别中寻找序数和名词。这将为你的 EDA 提供基础!你会在 Github Repo Jupyter 笔记本中找到更全面的 EDA(为了这篇博文,让它简短一点)。此外,EDA 将贯穿任何数据科学项目的迭代,如本文后面所述。
里程碑# 3:功能改进
数据清理
功能改进处理数据清理,只有在理解数据的基础上,您才能以合理的方式进一步清理数据集。
更准确地说,数据清理处理:
根据数据类型和识别缺失值,然后定义处理它们的策略。例如,字符串数据类型可以编码为空字符串作为缺失数据,而数字数据可以编码为 NaN 或简单的“0”来表示缺失值。此外,如果通过删除丢失的行,您只剩下一半的数据集或者大量的行被删除,则删除丢失的值不是明智之举。另一方面,缺失值的插补取决于哪种特定的插补策略能够最好地填补缺失值。
缺失值的一些插补方法有:
- 通过均值、中值或众数替换缺失值。这同样取决于你对数据的理解。例如,对于名义数据类型,只有模式可能是填充缺失值的快速策略。但是对于序数和更高层次的数据属性,均值和中值也可能是值得探索的可行候选者。
- 对于具有大量缺失值的属性,通过另一个训练好的模型来输入缺失值也可以是手边的策略之一。
在没有识别缺失值的情况下继续进行数据科学项目,会立即破坏您的结果,尤其是当您将使用聚合函数(更准确地说,是我们一直最喜欢的均值和计数)时,除此之外还有很多情况。趋势将完全相反,最后,你将回溯不正确的平均值,通过考虑“0”作为一个合法的变量值,而不是一个丢失的值。字符串值也是如此!空字符串值仍然会出现在计数函数中。为了避免这种情况,您应该将数字缺失值编码为适当的“NaN”和字符串,以表示其他一些缺失的标识符。
带走:要识别缺失值,首先要确保它们被正确编码为缺失值!然后,是丢弃缺失值还是对其进行插补,以及进一步选择插补标准,都取决于您手中的数据问题类型,以及在硬件资源和时间方面遇到的项目限制。
足够的理论——映射到我们上面的问题陈述
让我们针对数据集中的每一列检查缺失值的分布
该图清楚地显示了缺失值百分比从 0%到 90%的变化分布。哇!对于这个项目,这似乎是最大的数据问题之一,如果解决得当,也是最有回报的事情。
此外,dataset distributors 已经提供了一个完整的数据字典,需要对其进行详细的研究,以探索数据的进一步维度,最重要的是,缺失值是否可以用除 0 和空字符串之外的其他方式进行编码!
即使没有提供文档,我们仍然需要更深入地挖掘属性,以获得关于缺失值的见解。比如“身高”“bmi”等属性永远不能为零!如果对于这样的属性,存在零,这意味着我们的数据中缺少值!
让我们检查在我们的数据集中有多少行至少有 1 个缺失值
**整个 91688 数据集中只有 25 行有完整的值!**因此,放弃它们显然不是明智之举。似乎几乎每隔一行都有缺失值。让我们更深入地了解哪些列具有完整的行值。
因为我们不能删除缺少值的行,所以暂时让我们关注上面的列,因为我们的目标是训练一个基线模型。另外,还要注意有 4 个 id 列与预测没有关联,因此我们将删除它们。这样,在总共 185 个属性中,我们只剩下 6 个子集列(不包括标签列)。
里程碑# 3:培训基准模型
探索特征子集
在这一点上,我们有 6 个特征的子集,没有很多缺失值。该功能集由以下数据属性组成:
**1\. elective_surgery
2\. icu_stay_type
3\. icu_type
4\. pre_icu_los_days
5\. readmission_status
6\. apache_post_operative**
标签/预测变量
**hospital_death**
数据类型分布的 EDA
- 由数据分配器(即 WiDS)分配数据类型字典中提供的数据类型
2。当从 raw csv 文件中读取时分配数据类型
上面一个简单的 EDA 表明,相当多的二进制/布尔数据类型在被读取的文件中以 【数字】 数据类型结束。作为一名精明的数据科学家,对这些微小的细节保持警惕非常重要!
让我结合一个真实的生活场景。将二进制/布尔变量编码为数字似乎没有什么坏处,但是这会在内存中增加二进制/布尔变量,与浮点对象相比占用更少的字节!如果你的内存已经不足,那么这些被转换成浮点数的小的布尔字节将会聚集起来成为大字节,耗尽你的内存!再次强调——尽可能多地理解你的数据!
阅读数据附带的文档资源总是值得的。他们会让你对数据有敏锐的理解。例如,通过我阅读的文档,我可以相对容易地通过文档来确保提供的数据类型和编码的数据类型是相同的类型。
此外,对于数字列,您可以通过文档解码,将丢失的值编码为“0”。在年龄、身高和 bmi 等变量中解码“0”很容易(因为我们已经有了领域知识),但当我们自己的领域知识匮乏时,文档开辟了新的探索方式。
例如,在给定的数据集中可能有几个其他属性可能有大量的缺失值,对于我这样一个没有医学背景的人来说,文档和与领域专家的合作讨论将提供更深层次的数据理解。
事实上,与领域专家的密切合作也是精明的数据科学家从不同的看不见的维度分析数据从而提高性能的不可或缺的实践之一!
继续 EDA…
注意:下图对应于完全没有缺失值的数据类型/列,即左侧列出的列
3。删除缺失值并选择 6 个特征的子集后,文件读取数据类型的数据类型分布显示
4。进一步挖掘上面的可视化——将文件读取数据类型进一步映射到 dict 提供的数据类型后的数据类型分布
将 8 个整型变量中的 4 个分解为布尔数据类型。
现在,我们已经固定了所有的固定数据类型,删除了 11 列中基于 ID 的列,剩下 7 列(包括标签列)。除了pre _ ICU _ los _ days之外,所有属性本质上都是范畴属性。
默认情况下,pd。DataFrame.describe()仅显示连续/数字变量的统计信息。还有,
2。删除重复项!
我们还需要根据特性集的 6 列来检查原始数据集中和所选数据集中的重复项。
所以我们**最初有 91713 行,其中针对所选 6 个特性的唯一行仅构成 19438 行!**我想在这里强调两点非常重要:
- 始终确保输入到模型中的数据集包含唯一的行!否则,你会毫无理由地增加计算时间,在现实世界中,时间已经是满足项目期限的紧迫资源。这也可能会降低性能。
- 如果您注意到,6 个所选要素的总行数为 91713,即等于数据集本身的行数。但是,删除所选 6 个特性的重复项只会显示 19438 行!现在想象一下,如果我错过了这个复制步骤,并继续训练一个以“k”为重要超参数的 KNN 模型,这将会产生怎样的破坏性影响!该模型不仅计算时间长,而且从性能角度来看也很糟糕!
- 在基于特征集删除重复项时,我保留了 drop_duplicated 的 keep 参数“False”而不是“first”
保持=假的原因?
使用 keep=first 会引入噪声!为什么?因为考虑到基于 6 个要素的数据框,相同的行可能会有不同的标注。所以我选择删除所有这些误导性的行(它们实际上并不误导,但基于 6 个特征,是的,它们是误导的)。如果您在这 6 个特性和标签的整个数据帧上调用 unique,您将得到 91713 行,但是如果我们打算只基于 6 列提供特性集,这是完全错误的(目前基线模型就是这种情况)
再次强调,这些看似微小的点将会对你的模型产生巨大的影响——小心!
另请注意,我们目前只从大约 20%的数据集学习基线模型!是的,我们很适合基线模型,但同时,这也揭示了:
- 模型性能显然会很低,除非假设我们幸运地选择了仅包含特征(有价值的属性)的 6 个属性的子集!
关于以上这一点,在以后的迭代中,我们一点也没有盲点。通过属性/列与标签的相关性,可以洞察上述内容的有效性,并检查 6 个属性中是否包含相关性较高的重要列。此外,如果仅考虑 6 个属性的子集,标签的分布有显著变化,则数据的形状一定发生了变化,因此这也将导致低性能(更准确地说是数据不平衡)。
当我们添加更多的列和更多的行(唯一的行)时,在以后的迭代中还有改进的空间。
相关矩阵
#悟性—另一种见解!列 readmission_status 没有出现在相关矩阵中! 深挖其独特价值可见一斑:
对于所选的列和行的子集,它都是假的!因此,我们也将删除该列,因为它在提取模式或生成预测方面不起任何作用!
#savvy —简单的 EDA 和如此有价值的洞察力。再次一分钟的观察,但完全值得!
训练基线模型
到目前为止,我们已经有了 5 列,我们可以开始训练基线模型了。请注意,我们有两个分类“字符串”变量/属性,在将数据输入训练模型之前,我们需要一些数值转换。为此,我们将在数据预处理管道中使用哑编码。
我们将使用 KNN 作为分类器。数据集的拆分、分类变量的虚拟化、缩放(Z 分数标准化)和“k”的网格搜索都已添加到数据预处理管道中(更准确地说是 sklearn 的管道组件)。
fit&通过管道转换数据,调用 fit 显示:
- 训练行数:14578
- 训练列数:12(列数从 5 增加到 12,因为在转换过程中为每个分类变量添加了(n-1)列,即哑编码),其中 n 对应于每个分类字符串变量的唯一值的总数。另外,布尔分类变量没有经过任何虚拟编码或标准缩放的转换。
- 到目前为止,最佳 k 值为 99,与以下候选值进行了交叉验证
测试基线模型
- 测试行:4860
- 测试列:12
- ROC_AUC : 0.72 —(考虑到只使用了 20%的只有 5 列的数据集,这一点也不差)
Kaggle 预测
太好了!让我们预测 kaggle 测试集
值得一提的一点
值得检查的是测试集的许多值实际上是如何存在的以及考虑到我们现在拥有的 5 列的特征子集,测试集有多少唯一值存在
#悟性—洞察力!因此,考虑到测试集只有 5 列,我们实际上预测的是 39308 行中的9768 行,这只是 24% !此时我们认为大多数测试集行是相同的,但事实并非如此,但这也意味着模型性能(以及 Kaggle 提交)有很大的潜在增益空间。
Kaggle 评分
得分率为 0.59035!这比排行榜上表现最差的型号要好😅
这是基线模型的简要概述
项目演练流程图
最后,这是我们到目前为止完成的整个过程的流程图
总结注释…
培训基线模型的重要性
到目前为止,我们有一个很好的基线模型。基线模型作为性能增益的基准。我们继续将组件添加到我们的功能工程管道中,并将新获得的性能与基线模型中添加的每个组件进行比较,以评估我们在性能增益方面的进展。
毫无疑问——良好的软件工程实践是不可或缺的!!!
虽然,我没有在这篇博文中包含代码片段,但是你可以在我的 Github Repo 中找到完整的项目代码。对于真实世界的数据科学项目,我们严格遵循 OOP 原则和管道方法。向管道方法添加新组件相当容易。随着更多东西的出现,你的代码将更容易重用、维护、调试并变得可扩展。这也意味着在后面的迭代中,您将有更多的时间花在问题本身上。
如果你不信任我,拿任何 python 数据科学框架的源代码,你就能分析所有投入工作的软件工程原理!
数据科学项目之美!
尽管任何数据科学项目都有标准的特征工程流程,但是每个数据集都有无限的创造力!你越深入研究特征工程,你就越被迫跳出框框思考,用你的数据分析问题,探索可能的解决方案,不仅是特征工程,也是 ML,并继续提升你的数据科学专业知识,乐趣永无止境!
即将发布的帖子将包括:
- 为特征工程管道 的下一阶段继续相同的 项目走查。
- AUC_ROC 为 0.59035
敬请期待!📻
如果您有任何想法、意见或问题,欢迎在下面评论或联系📞与我一起上 LinkedIn
用 OpenBCI,Node.js 和 PsychoPy 来黑你的大脑
我如何使用 Python、Node.js 和 OpenBCI 硬件来准确读取我的大脑信号
如最初出现在我的 个人博客 。
我热爱编码,也研究大脑——为什么不同时解决这两个问题呢?在这篇文章中,我将向你展示如何利用代码和来自 OpenBCI 的令人惊叹的低成本硬件来操控你的大脑信号,从而破解你的大脑。我在 2014 年开始了我的神经科学之旅。从那以后,我一直想用现有的脑电图来探索大脑。这应该是每个认知神经科学学生和研究人员的必修实验室,因为它代表了探索许多神经科学问题的机会。反正最近才买了 OpenBCI 芯片一直用到现在。在这篇博文中,我将报告我的第一次探索,这对于我未来关于#brain_hacking 之旅的帖子至关重要。
但是 BCI 怎么了?
这是一个合理的问题——我们为什么要关心与大脑的交流呢?有很多原因,我在这里将提到几个申请 BCI 希望他们会说服你。我想到的第一个应用是将 BCI 用于辅助和修复目的。具体来说,像耳蜗和视网膜植入物、假肢和深度大脑刺激技术这样的 BCI 工具正在帮助全世界数百万人。
恢复已经丧失的大脑功能是 BCI 技术背后最重要的动机之一。然而,还有许多其他的应用让大多数人兴奋,例如通过神经反馈增强大脑功能,使用思维的力量(独自)控制你最喜欢的设备或玩视频游戏,以及许多其他应用(如果你想查看可能应用的更广泛覆盖范围,请查看维基百科上令人惊叹的脑机接口条目)。
P300
P300 是一种非常显著的神经活动,发生在看到受试者关心的东西的第一秒钟。它被用于许多创新的方式,如测谎和打字(仅用你的思想),使它成为一种可行的工具,用于使瘫痪的病人能够用他们的思想交流。
试验设计
实验设计:使用两幅不同空间频率的图像作为刺激。它们被呈现 0.5 秒,然后是 3 秒的试验间间隔。仅背景的第三条件(未示出)被用作控制条件。每个条件被呈现 50 次。
我的实验设计非常简单。它们都包括随机展示不同的图像,同时记录枕部和颞区的脑电波。在这篇文章中,我使用了由多个以不同空间频率(或多或少的条)排列的黑条组成的光栅图像(见图)。这些图像在视觉研究中非常流行,原因超出了本文的范围。每个图像重复 50 次,产生 150 个图像呈现(空间频率为 3、12,没有图像)。每幅图像呈现半秒钟,随后是 3 秒钟的试验间隔(ITI ),其间呈现一个“+”符号。
结果
老实说,直到我看到这张图片,我才知道 P300 (该图片仅来自第一个通道,但在所有通道中都观察到了确切的模式)。这种积极的变化出现在我使用各种刺激类型进行的每个实验中(我将在以后的文章中探讨其中的一些)。请注意,控制条件没有显示任何偏转,而两个实验条件(显示实际图像)都显示了该模式。我没有预料到的是,第二个正斜坡仅在 400ms 左右出现在橙色部分(高频条),而不是蓝色部分。这使得机器学习算法区分这两者变得容易得多。事实上,一个非常简单的逻辑回归分类器在区分这三个类别时达到了约 52%的准确率(在交叉验证设置中)。
在 3 个不同图像期间的神经反应:蓝线是当看到具有 3 个条的光栅图像时神经反应的平均值,橙线是相同的,但是当看到具有 12 个条的光栅图像时,绿线是没有图像显示的控制条件。阴影区域是标准误差。请注意,当看到图像时有两个斜坡,而当看不到图像时没有斜坡。
在这里,我展示了低成本的硬件(获得所有设备需要 322 美元)可以让你获得非常高质量的脑电图信号。事实上,OpenBCI 保存了一份在数据收集中使用 OpenBCI 的科学出版物的运行列表。我计划进行进一步的实验,并在这个博客中分享他们的结果。
最后,我要感谢 OpenBCI 团队和社区做出的巨大努力,让神经科学和 BCI 的硬件和软件工具更容易为公众所用,还要感谢 Neurotech@Berkeley 团队提供的令人惊叹的课程和软件,我曾用它们来做实验。
关于技术设置的更多细节:我使用了从 OpenBCI 提供 4 个通道的神经节设备。这些通道附着于(大约)O1、O2、T1 和 T2(覆盖枕叶和颞区的两侧)。我使用 Node.js 连接芯片,并在 python 脚本中处理数据(通过实验室流层),该脚本还将记录存储在文本文件中。所有这些工具都改编自神经技术课程实验室。伴随着录音,我还使用了心理来设计和运行实验。
Hadoop 分布式文件系统
理解 HDFS 及其内部运作的综合指南
从计算的角度来看,基本上有两种类型的扩展—垂直和水平。在垂直扩展中,我们只是向单台计算机/机器(也称为“节点”)添加更多 RAM 和存储。在水平扩展中,我们添加更多通过公共网络连接的节点,从而增加系统的整体容量。记住这一点,让我们开始吧。
块大小
文件分割成块
当一个文件被保存在 HDFS 时,文件被分割成更小的块,如上面的 GIF 图所示。块的数量取决于“块大小”。默认是 128 MB ,但是可以很容易地更改/配置。
在我们的示例中,一个 500 MB 的文件需要分成 128 MB 的块。 *500/128 = 3 块 128 MB 和 1 块 116 MB。*剩余的 12 MB 块空间被返回到名称节点,用于其他地方,从而防止任何浪费。任何文件系统都是如此,例如,Windows NTFS 的块大小在 4 KB 和 64 KB 之间,具体取决于文件大小(最大为 256 TB)。考虑到 Pb 及以上的大数据处理,KBs 会非常低效,可想而知。这就是 HDFS 块大小为 128 MB 的原因。
复制因子
分身术
HDFS 是一个容错和弹性系统,这意味着它可以防止一个节点的故障影响整个系统的健康,并允许从故障中恢复。为了实现这一点,存储在 HDFS 中的数据会跨不同的节点自动复制。
复印了多少份?这个要看“复制因子”了。默认设置为 3,即 1 份原件和 2 份复印件。这也很容易配置。
在左侧的 GIF 中,我们看到一个文件被分成多个块,每个块都在其他数据节点上复制以实现冗余。
存储和复制架构
存储和复制架构
Hadoop 分布式文件系统(HDFS)遵循主从架构,其中“名称节点”为主节点,“数据节点”为从/工作节点。这仅仅意味着名称节点监视数据节点的健康和活动。数据节点是文件以块的形式实际存储的地方。
让我们继续上图中大小为 500 MB 的文件的相同示例。HDFS 的默认块大小为 128 MB,该文件分为 4 个块 B1-B4。请注意,A-E 是我们的数据节点。HDFS 的默认复制因子为 3,数据块在我们的 5 节点集群中复制。数据块 B1(黄色)在节点 A、B 和 D 之间复制,依此类推(遵循彩色线条)。
在这里,名称节点维护元数据,即关于数据的数据。哪个文件的哪个块的哪个副本存储在哪个节点维护在 NN 中—文件 xyz.csv 的块 B1 的副本 2 存储在节点 b 中。
因此,一个大小为 500 MB 的文件由于其复制,在 HDFS 需要 1500 MB 的总存储容量。这是从终端用户的角度抽象出来的,用户只能看到存储在 HDFS 的一个大小为 500 MB 的文件。
现在是动手的好时机:
常见的 HDFS 命令
medium.com](https://medium.com/@prathamesh.nimkar/hdfs-commands-79dccfd721d7)
块复制算法
块复制算法
该算法首先在 HDFS 的默认配置文件夹下搜索 topology.map 文件。这个。映射文件包含有关其包含的所有可用机架和节点的元数据信息。在上图的示例中,我们有 2 个机架和 10 个数据节点。
一旦文件被划分为数据块,第一个数据块的第一个拷贝就被插入到离客户端(即终端用户)最近的机架和数据节点中。创建第一个数据块的副本,并通过 TCP/IP 将其移动到下一个可用机架(即机架 2)上,并存储在任何可用的数据节点中。在这里创建另一个拷贝,并通过 TCP/IP 等将其移动到下一个可用的机架上。但是,由于我们只有 2 个机架,该算法会在同一机架(即机架 2)上查找下一个可用的数据节点,并将第三个副本存储在那里。这种冗余性的存在使得即使一个机架出现故障,我们仍然有第二个机架来检索数据,从而实现容错和弹性。
高可用性架构
在 Hadoop 1.x 中,生态系统仅附带 1 个名称节点,导致单点故障。有一个辅助或备份名称节点,需要一个多小时的手动干预才能启动。随后,任何数据丢失都是不可恢复的。
在 Hadoop 2.x 中,提供了高可用性作为标准模式的替代方案。在标准模式下,您仍然有一个主要和次要的名称节点。在高可用性模式下,您有一个主动和被动名称节点。
数据节点向“活动”名称节点发送活动更新(至少每 5 秒一次—可配置)。此元数据实时同步到“袖手旁观”名称节点。因此,当“主动”服务器出现故障时,“袖手旁观”服务器拥有切换所需的所有元数据。
Zookeeper 通过其故障转移控制器,通过从每个 NN(每 5 秒,同样可配置)接收到的心跳或即时通知来监控活动和袖手旁观名称节点的健康状况。它还包含所有可用的袖手旁观名称节点的信息(Hadoop 3.x 允许多个袖手旁观名称节点)。
因此,建立了数据节点、名称节点和 zookeeper 之间的连接。当一个活动名称节点出现故障时,动物园管理员会选择一个合适的袖手旁观名称节点,并促进自动切换。袖手旁观成为新的活动名称节点,并向所有数据节点广播该选举。现在,数据节点会在几分钟内将其活动更新发送到新选出的活动名称节点。
什么是 NameNode 元数据?
NameNode 元数据
名称节点(NN)元数据由两个持久性文件组成,即 FsImage —名称空间和编辑日志—事务日志(插入、附加)
名称空间& FsImage
在每个文件系统中,都有一个到所需文件的路径— On Windows: C:\Users\username\learning\BigData\namenode.txt and on Unix: /usr/username/learning/BigData/namenode.txt.
HDFS 遵循 Unix 的命名空间方式。此命名空间存储为 FsImage 的一部分。文件的每个细节,即谁、什么、何时等。也存储在 FsImage 快照中。为了一致性、持久性和安全性,FsImage 存储在磁盘上。
编辑日志
对所有文件的任何实时更改都会记录在“编辑日志”中。这些记录在内存(RAM)中,包含更改和相应文件/数据块的每个细节。
在 HDFS 启动时,从 FsImage 读取元数据,并将更改写入编辑日志。一旦在编辑日志中记录了当天的数据,它就会被刷新到 FsImage 中。这是两者协同工作的方式。
另外,FsImage 和编辑日志是不可读的。它们被二进制压缩(序列化)并存储在文件系统中。然而,出于调试目的,可以将其转换成 xml 格式,以便使用离线图像查看器读取。
NameNode 元数据如何同步?
正如您在“HDFS 高可用性架构”图像中所想象或看到的那样,名称节点元数据是一个单点故障,因此此元数据被复制以引入冗余并实现高可用性(HA)。
共享存储
共享存储同步
我们现在知道存在一个活动名称节点和一个备用名称节点。活动中的任何更改都会实时同步到共享文件夹/存储器,即网络文件系统(NFS)。此 NFS 可由备用服务器访问,备用服务器实时下载所有相关的增量信息,以保持命名节点之间的同步。因此,如果活动节点出现故障,备用节点名称节点已经拥有所有相关信息,可以在故障切换后继续“照常工作”。这不用于生产环境。
仲裁日志节点(QJN)
QJN 同步
“法定人数”是指促成一项活动所需的最低人数。这个词通常用于政治;这是众议院进行议事所需的最低代表人数。
这里,我们使用这个概念来确定建立多数和维护元数据同步所需的最小日志节点数(也称为仲裁数)。
该图显示了三个(总是奇数)日志节点(进程线程而不是物理节点),它们有助于建立元数据同步。当一个活跃的神经网络收到一个变化,它把它推到大多数 QJ 节点(遵循单一的颜色)。备用 NN 实时地向多数 QJ 节点请求建立同步所需的元数据。
QJN 起作用的最小数目是 3,法定人数/多数由以下公式确定:
**Q = (N+1)/2**
where N = total number of Journal Nodes
For example, if we have N=5, the quorum/majority would be established by (5+1)/2 i.e. 3\. The metadata change would be written to 3 journal nodes.
QJN 是元数据同步的首选生产方法,因为它也是“高度可用的”。如果任何一个 QJ 节点出现故障,任何剩余的节点都可以提供维护元数据同步所需的数据。因此,备用服务器已经拥有了所有相关信息,可以在故障转移后继续“照常工作”。
这就把我们带到了我关于 HDFS 及其内部运作的综合指南的结尾。
参考资料:
[1] HDFS 架构 (2019),Apache Hadoop,ASF
[2] 管理 HDFS ,云时代
[## Google Cloud 上的 Cloudera 管理器
通过 GCP 上的 CM 6.3.1 逐步安装 Hadoop 生态系统
medium.com](https://medium.com/@prathamesh.nimkar/cloudera-manager-on-google-cloud-3da9b4d64d74) [## HDFS 擦除编码
通过利用擦除编码,显著降低 HDFS 集群的存储开销
towardsdatascience.com](/simplifying-hdfs-erasure-coding-9d9588975113) [## 使用 Hadoop 生态系统的大数据分析渠道
登录页面
medium.com](https://medium.com/@prathamesh.nimkar/big-data-analytics-using-the-hadoop-ecosystem-411d629084d3)
Hadoop &树莓派:我最后一年的项目
图片来自 Unsplash — 哈里森·布罗德本特的照片
我并不总是对网络安全感兴趣。事实上,在我攻读计算机科学(网络)学士学位期间,我不知何故决定 Hadoop 是未来,我的未来就是 Hadoop。2014 年,我刚刚在黑莓完成了一年的实习,我回到了赫特福德郡大学,更加专注,更加坚定,也更加明确地知道自己想做什么。(我是实习年的强烈拥护者,尤其是那些让你尝试不同技术流的公司)。因此,我选择死在运行 Hadoop 的 Raspberry Pi 集群是最后一年项目的一个好主意。
为什么
对我来说,学习新技能是计算机科学有趣的部分。因此,当我打算专攻网络学位时,我想展示我的范围,这样我就知道我的项目会有所不同。我花了 2015 年夏天的大部分时间研究不同的项目,因为我对微型计算机感兴趣,并将其融入日常生活,我知道我的项目必须在树莓 Pi 上运行。
我论文的封面
Hadoop 对我来说是一个相当新的概念,我对大数据很感兴趣,但可访问性是一个问题。没有人愿意让一年生接近他们的数据湖。所以我最初的想法是,我应该在 Raspberry Pi 集群上运行 Hadoop,唯一的目的是让 Wordcount 系统分析 tweets。由此产生了这个美妙的标题。
非结构化数据的安全组织和存储,用于单板微型计算机的态势感知和漏洞分析。
我的问题陈述以富有远见的陈述开始,我想为希望使用 Hadoop 的中小企业创建一个大数据解决方案,同时确保这是一个安全的选择。我的研究包括:
- 调查中小型企业(SME)管理、存储和处理数据的现有解决方案。
- [树莓 Pi 微电脑](http://www.raspberrypi.org Teach, Learn, and Make with Raspberry Pi – Raspberry Pi)及其他竞争对手分析。
- 解决方案的漏洞评估和压力测试
第一章重点介绍了从大数据解决方案到 NoSQL 解决方案的所有术语,这些术语都使用了哈佛参考系统。
让我们复习一下,这些术语是什么:
Hadoop 徽标—归功于 Apache Hadoop
Apache Hadoop ,一个 Java 开发的框架,主要用于在行业标准的商用硬件集群上运行应用程序。Hadoop 是一种分布式架构,需要多台计算机来运行。Hadoop 非常灵活和模块化,因为它是基于开源框架构建的。Hadoop 可以被视为两个部分:数据存储功能(HDFS)和数据处理功能(MapReduce)。
(Hadoop 分布式文件系统) 是 Apache Hadoop 项目的主要组成部分。在 Hadoop 集群中,数据被分析并分解成可管理的小块(称为块),然后在整个集群中分配。这使得 map 和 reduce 函数可以在大型数据集的小子集上执行。然后,这些函数允许跨 Hadoop 集群对数据进行高性能访问。由于 HDFS 通常部署在低端硬件上,服务器故障非常常见。
那么这一切是如何联系在一起的呢?
这是我的功劳,斯蒂芬·查彭达玛的《HDFS 示意图》
MapReduce 是支持和允许 Hadoop 可伸缩功能的编程结构。MapReduce 基于 Java,受 Apache Hadoop 软件框架支持。虽然 MapReduce 是基于 Java 的,但是为了利用诸如“map”和“Reduce”之类的功能,可以使用任何编程语言。与 HDFS 类似,MapReduce 也有一个共同的特点,那就是它是容错的,并且可以在大规模分布中工作。MapReduce 通过将输入的数据分割成更小的可管理的块(任务)来工作,这些被称为地图任务。这些映射任务可以在并行进程中执行。处理后,地图任务输出将减少(减少任务)并保存到系统中。
因此,如果我们想利用 Hadoop,我们需要多个节点吗?
不,但那就违背了目的。所以我们倾向于运行 Hadoop 集群。
集群计算是指一组紧密连接在网络上的计算机节点,它们作为一个系统相互工作和支持。与网格计算不同,每个节点都被设置为执行相同的任务,并由软件运行和控制。Hadoop 是一个使用集群计算来实现其目标的软件示例。通常,所有节点都运行相同的软件,因为一个节点通常会在整个集群中克隆和复制。通过使用开源集群应用资源 (OSCAR),可以在集群中运行不同的操作系统。集群计算的一个例子是贝奥武夫集群。通常是商用级计算机联网成局域网,共享程序和库。这将产生一个*“来自廉价个人计算机硬件的高性能并行计算集群。”*集群计算的优势包括速度和容错能力。因为多个节点正在处理一个任务,所以如果一个节点出现故障,速度将保持不变,因为其他负载将承担重量,即使一个节点出现故障,其他节点仍在处理一个任务。集群计算增加了虚拟机的受欢迎程度,因为从 SMEs 的角度来看,由于不涉及实际的物理硬件,这意味着管理工作减少了。
让我们聚在一起
当时我没有足够的谷歌云信用额度(我希望我有),所以买 4 个树莓派和克隆 SD 卡似乎是最好的主意。由于这是一个网络项目,我必须确保涵盖网络安全,所以我还决定使用 Kali Linux 进行集群的渗透测试。然而,我面临的一个不足是,当时我住在大学礼堂,所以我不能控制自己的 Wifi。然而,我的房间有一个以太网端口,所以我能够插入一个交换机,并确保我的 Pi 可以在一个网络接口下连接。还有一些我无法控制的网络政策(这令人沮丧)。我的攻击计划是:
- 分析和分类网络能力和系统资源
- 对资源的相对重要性级别进行分类
- 分析和识别对资源库的潜在威胁
- 制定应对任何威胁的行动计划
- 定义并制定一个计划,以便在攻击发生时将影响降至最低
我是否考虑过 Pi 的替代方案?
我喜欢它是蓝色的,但是价格标签不适合我。— 照片归功于英特尔
基于英特尔 x86 架构的英特尔 Galileo 是 Arduino 认证开发板系列中的首款产品。截至2016 年 10 月 3 日,目前有两个版本,分别称为第一代和第二代英特尔 Galileo。英特尔 Galileo 和 Raspberry Pi 的主要区别在于价格。Raspberry Pi 的起价为 35 美元,而英特尔的产品起价为 70 美元。几乎是两倍的价格,但内存和处理能力却更少。同样值得注意的是,Galileo 只支持 1 个操作系统,需要更多的电源。
伽利略于 2017 年 6 月到达其生命终点。
由于我的安装说明已经超过 4 年了,我决定不在本文中使用它们。然而,我将分享一个更新的指南:
安装完成后我拍的截图——感谢斯蒂芬·查彭达玛
我成功地安装了 Hadoop,并且在 Pi 上访问了 Web GUI:
规格很糟糕,我知道——HDFS 跑步的截图
项目的其余部分涉及运行一些 Hadoop 函数,并检查圆周率是否没有融化。幸运的是,他们设法熬过了这一切。按照我的课程要求,我应该向我的项目主管和另一位讲师演示我的解决方案。我通过拆除集群并恢复到单个节点来为我的演示日做准备。我的计划是演示一个运行 Hadoop 的单个节点,一本书的字数分析,同时展示 Pi 无需超频就可以处理这些。我在节点 1 和节点 2 上练习了这个演示,以防万一。在演示日,Node1 最初不会打开,这是一个糟糕的开始。当它打开时,它不能连接到互联网,因为我现在在一个不同的校园里。所有这些小问题都很快得到了解决,但是当 Hadoop 运行到高潮时,内存泄漏导致了它的崩溃。这一创伤的结果是,我现在在构建系统时过度配置服务器,以防万一。我设法完成了令人痛苦的演示,但如果我完全诚实,我的 Hadoop 梦想在那天破灭了。
这个项目是对大数据的一次令人兴奋的尝试,它绝对是一个 Pi 项目,当你在谷歌上看到第 30 页时,你就会找到你的解决方案。我会再做一次吗?很遗憾是的😶。由于我已经在网络安全领域工作了几年,我的兴趣已经发生了变化,但有一点是不变的,那就是我对大数据的访问以及寻找管理大数据的解决方案的需求。如果我有时间,我想把我的一个蜜罐连接到一个 Raspberry Pi Hadoop 集群,我目前还不知道为什么,但我肯定会找到一个。
raspbian Jessie—Pi 基金会提供
延伸阅读:
第 1/3 部分——预测我的半程马拉松完成时间,误差小于 45 秒。
跑步的机器学习-数据分析与介绍。
图片由 Marvin Ronsdrof 拍摄
哥德堡马拉松是世界上最大的半程马拉松。2019 年 5 月,比赛庆祝了 40 周年,吸引了超过 50,0 00 名选手和 200,00 0 名观众。
作为一名观众,你可以跟踪一份跑步者名单,看看他们在比赛中是如何进步的。这是可能的,因为跑步者每隔 5 公里就要经过跑道上的检查站。当你看不到你的朋友时,这是一种保持联系的有趣方式。您还将看到跑步者的预计完成时间,这是基于他们目前的平均配速。
结束时间预测是如此的基础和不准确,这一直困扰着我。它忽略了比赛的海拔曲线等因素,以及大多数跑步者在比赛中越跑越累的事实。它也无法在比赛开始前估计你的完成时间。
我们将在这个博客系列中解决这个问题,分为三个部分:
- 第一部分—数据分析(你在这里)
仅仅从不同角度看数据,我们能学到什么? - Part 2 —狂妄分析什么年龄和性别的群体最高估自己的能力?这一部分还包括一些特征工程,这些特征工程将在第 3 部分中涉及的预测模型中发挥巨大作用。
- 第三部分——跑步者完成时间预测我们能在比赛前和比赛中多好地预测跑步者的完成时间?
这场比赛
哥德堡是围绕哥德堡市中心的半程马拉松。与大城市的其他半程马拉松相比,它的海拔曲线颇具挑战性。如果我们使用谷歌地图的海拔数据,我们可以绘制出比赛的海拔。谷歌高程数据的一个缺点是,它完全基于地球表面,如下所示:
比赛高度——是的,那条橙色的线是一座桥。
数据集
为了帮助回答上述问题,我们有一个由 ~39000 个跑步者组成的表格数据集(每行一个——仅包括实际开始的跑步者)。35%的参赛者是女性(13600 人)。它只包括 2019 年的数据,这是一个苛刻的限制。如果我们有过去 20 年左右的历史数据,我们可以做得更多。
虽然有一些跑步者来自世界各地,但大多数来自瑞典和中欧:
跑步者家乡的热图,经纬度映射到他们所代表的城市。
除了国籍和家乡(由每位跑步者在注册时声明),我们还有以下信息:
一般信息
- 年龄
- 性别
- 起始号码
- 开始组
- 公司
每位跑步者的关卡时间:
- 5 公里
- 10 公里
- 15 公里
- 20 公里
- 终点(21 公里)
我们会对这些数据做很多不同的折叠来理解它。可视化数据集让我们对跑步者群体有了很好的了解——这将有助于我们在第 3 部分中为机器学习模型设计功能。
让我们更好地了解我们的跑步者:
按性别划分的完成时间分布
男性和女性的完成时间都遵循正态分布。
年龄分布
25-30 岁的女性对这一比赛的兴趣增加,30 多岁时兴趣减少,40 出头时强势回归。
年龄分布非常有趣,因为没有一条曲线(男性或女性)属于正态分布。人们可能会写文章解释为什么我们看到 30-40 岁的跑步者突然减少,但我简单的猜测是因为孩子和家人花了更多的时间。还需要指出的是,25-29 岁的人比其他任何年龄的人都要多一点(来自瑞典年龄结构的统计数据)。我们看到男性也有类似的双峰曲线,与女性相比,第一个峰值较小。
因为年龄分布不遵循正态分布,我们可以通过使用内核密度估计值绘制年龄分布与完成时间的关系图,从我们的数据中获得进一步的见解,以查看组出现的位置:
完成时间与年龄密度
在考察年龄与完成时间时,有两种不同的“典型跑步者”场景——30 岁的人跑了不到两个小时,40 岁出头的人跑了差不多同样的时间。
让我们以稍微不同的方式绘制年龄与完成时间的关系图,看看我们是否能学到更多东西:
按年龄组的完成时间分布
按年龄组显示完成时间的山脊图。在 48 岁以上的年龄组,我们可以看到完成时间的变化(脊线随着其密度向右移动)。
我们可以观察到年轻跑步者和老年跑步者的最大差距,平均完成时间约为两小时。令人鼓舞的是,32-48 岁的跑步者并没有明显慢于年轻跑步者。如果你仔细观察上图中每个年龄组在两个小时左右的峰值,你会看到心理学的最佳状态。
让我们仔细看看 2 小时左右的结束时间。
2:00:00 左右每次完成时间的跑步人数
进一步调查先前地块中的主要峰值。12 秒钟。两个小时的标记无疑激励了跑步者。
两小时前后的正负两分钟,在分布上似乎有显著的差异。仅使用从 1:58:00 到 2:02:00 的数据,刚刚成功的跑步者的百分比大约为 57% (将每一边相加,然后将左边除以总数——使用桶围绕中心加减两分钟)。
使用这种测量方法,让我们看看哪个结束时间这种心理效应最强。我们不使用固定的 4 分钟窗口,而是通过使用 4 分钟窗口作为两小时里程碑的基础,将窗口大小标准化为里程碑时间(这算出约为 3%)。
不同完成时间的心理效应
对于 x 轴上的每个值,我们使用 x 轴值周围 3%的窗口来测量低于完成时间的跑步者的百分比(y 值)。
我们可以看到,这种影响在 5 分钟和 10 分钟左右最强。这是因为人们倾向于在偶数时间设定目标,比如 2:00:00。
图中的趋势是成功率随着完成时间的增加而增加,这意味着当我们达到更慢的完成时间时,成功的平均百分比会慢慢增加。这很有道理。如果我们要画一条趋势线,我们会看到它在 2:05:00 左右突破 50%(这也是所有跑步者的平均时间)。
另一个有趣的观察是在里程碑之间有看似随机的峰值。比如看一下 2:07:00。这是跑步者设定配速目标而不是完成时间目标的结果。全程以每公里 6 分钟的速度跑步,你的总完成时间是 2:06:35。
这个情节并不意味着跑得慢的人更擅长完成目标,或者跑得快的人不太关心他们的目标。因为完成时间遵循正态分布,自然有更多的人在窗口的较慢一侧完成(因为完成时间比平均值快)。例如,遵循正态分布,您更有可能在 1:35:00 到 1:36:00 之间找到跑步者,而不是在 1:34:00 到 1:35:00 之间。同样,你在 2:44:00 到 2:45:00 之间找到跑步者的可能性比在 2:45:00 到 2:46:00 之间找到跑步者的可能性更大。请记住这一点,我们看同样的情节,但按男女分组:
不同完成时间的心理效应,按性别
对于 x 轴上的每个值,我们使用 x 值周围 3%的窗口来测量跑者在完成时间内的百分比(y 值)。这种心理影响对两性都存在,但似乎在时间对男性和女性的重要性上略有不同。
很难从这个情节中得出进一步的结论。因为我们可以观察到男性和女性都有明显的峰值,所以这种心理效应对两种性别都存在。对于女性来说,两小时的峰值没有男性高,但这可能是因为她们遵循不同的正态分布,并且女性设定的其他目标更接近她们的平均完成时间。比如 2:40:00 左右效果好像差不多。
一种想法是将所有数据相对于它们的平均值进行归一化,以消除性别之间的绝对时间差异——然而,这种方法的主要缺点是失去了偶数里程碑时间的效果,因为所有的完成时间都会略有偏移。
我们可以天真地说,男人比女人设定更多的目标,甚至说男人更擅长实现他们的目标。然而,也可能是女性设定了更严格的目标,或者没有设定同样多的目标,或者是男性故意跑得更慢以达到他们的目标——我们不知道。我们将不得不参考其他的研究来找出更多的信息,以及男性和女性在设定和实现目标的方式上是否存在差异。
我们可以做的是浏览这些数据,并找出男性和女性是否倾向于设定完成时间的具体目标,或速度的具体目标。当我这样做时,我没有发现统计上的显著差异。
下面是一个类似的图,但显示了每个年龄组的影响,在 2 小时左右的 10 分钟标记处:
10 分钟里程碑对不同年龄组的心理影响
对于不同的年龄组和每个里程碑周围的小窗口(里程碑时间的 3%),跑得刚好在时间之下和刚好在时间之上的跑步者的百分比是多少?图例显示每个年龄组的平均完成时间。
我们可以看到,尽管平均完成时间(02:04:17)比其他 3 组慢,但 16-24 岁的人在 2 小时里程碑附近的成功率最高。然而,当谈到打破 1:50:00 大关时,年龄似乎很重要——在这个里程碑,56-64 岁年龄组完全主导了年轻选手。在这个博客系列的第 2 部分中,我们将会得到一些可能导致这种情况的想法。
我们已经研究了跑步者的一些,但不是全部(起跑组、配速)特性。这有助于我们理解它们。但是是什么造就了一个跑得快的人呢?区分跑得快的人和跑得慢的人的标准是什么?光看别人的数据我们能学到什么?
有些事情你可以改变,但你不能改变自己——例如,你不能变得更年轻,你不能改变性别(嗯…),你不能改变你的身体特征成为埃塞俄比亚人。
那么你能改变什么呢?准备是关键,一个好的建议显然是在比赛前进行更多的训练,并提高你的技术。如果我们通过观察北欧人口的平均值得出结论,你应该搬到库拉维克或奥斯陆。但是搬到另一个城市不会让你跑得更快,至少不会马上。相反,我们将查看检查点的数据,看看你是否可以对整场比赛中自己调整速度的方式做些什么。这将在第 2 部分继续。让我用这个情节来逗逗你。
速度变化——完成时间与年龄
为每位跑步者单独计算的五个不同检查点的跑步配速标准偏差。越暗意味着速度越不均衡。每个跑步者一圈。
继续阅读:
- 第一部分——数据分析(你在这里)
- 第二部分——狂妄分析
- 第三部分——跑步者完成时间预测