深度学习应用 TensorFlow 2.x 初学者指南
深度学习用 tensor flow 2 . x—Part 1 |Part 2→|Part 3→|Part 4→→→
了解 TensorFlow 平台以及它能为机器学习专家提供什么
如果你正在阅读这篇文章,我确信我们有着相似的兴趣,并且正在/将要从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . Yal n—Linkedin
如果你最近开始学习机器学习,你可能已经意识到与传统机器学习相比,人工神经网络和深度学习的力量。与其他模型相比,人工神经网络需要一套额外的技术技能和概念知识。
图一。深度学习和传统机器学习方法的比较(作者提供图片)
这些技术技能中最重要的是使用深度学习框架的能力。一个好的深度学习框架可以加速开发过程,并提供高效的数据处理、可视化和部署工具。当谈到选择深度学习框架时,截至 2020 年,你只有两个可行的选择:
嗯,我们可以连续几天比较 TensorFlow 和 PyTorch,但这篇文章不是关于框架基准测试的。这篇文章是关于你可以用 TensorFlow 实现什么。
什么是张量流?
TensorFlow 是一个端到端的框架和平台,旨在构建和训练机器学习模型,尤其是深度学习模型。它由谷歌开发,于 2015 年作为开源平台发布。
具有稳定和官方 TensorFlow APIs 的两种编程语言是 Python 和 C。此外,C++、Java、JavaScript、Go 和 Swift 是开发人员可能会发现有限到广泛 TensorFlow 兼容性的其他编程语言。大多数开发人员最终都使用 Python,因为 Python 有令人信服的数据库,如 NumPy、pandas 和 Matplotlib。
为什么要用 TensorFlow?
使用强大的深度学习框架有几个优势,下面的非穷举列表指出了其中的一些优势:
- 减少构建和训练模型的时间;
- 有用的数据处理工具;
- 与其他流行的数据库如 NumPy、matplotlib 和 pandas 的兼容性;
- TF Hub 的预训练模型的丰富目录;
- 跨 iOS、Android、Windows、macOS、Web 等不同设备部署训练好的模型的工具;
- 巨大的社区支持;
- 这是科技公司需要的技能。
张量流简史
目前在用的是 TensorFlow 的第二个主要版本: TensorFlow 2.x 。达到这种成熟水平花了将近九年的时间。然而,我可以说,我们仍然处于最终深度学习平台的开始阶段,因为当前的趋势表明,深度学习过程在未来将更加简化。一些人声称,基于 API 的实践将成为使用深度学习和人工神经网络的标准方式。但是,我们不要急于求成,先来看看 TensorFlow 平台的历史:
The TensorFlow team deliberately uses the term *platform* since its deep learning library is just a part of the whole technology.
2011–2016:婴儿期和初步发展
I**——**2011 年,Google Brain 开发了一个专有的机器学习库,供 Google 内部使用,名为 DistBelief。DistBelief 主要用于谷歌的核心业务,如谷歌搜索和谷歌广告。
I**—**2015 年,为了加快人工智能的进步,谷歌决定发布 TensorFlow 作为开源库。Tensorflow Beta 发布。
我**——**2016 年,Google 公布了张量处理单元(TPUs)。张量是 TensorFlow 应用的积木,顾名思义,TPU 是专门为深度学习操作设计的 ASICs。
图 4。维基百科上的谷歌张量处理单元
ASIC stands for application-specific integrated circuit. ASICs are customized for a particular use such as deep learning or cryptocurrency mining, rather than general-purpose use.
2017–2019:第一个主要版本和跨平台技术的进步
2017 年的发展:
I**—**2 月,TensorFlow 1.0 发布,树立里程碑。2017 年 2 月之前,TensorFlow 还在 0.x.x 版本,最初的开发流程。In general, version 1.0.0 defines the public API with a stable production capability.
因此,2017 年 2 月对于 TensorFlow 来说确实是一个很大的里程碑。
I**——**看到移动技术的快速进步,TensorFlow 团队于 2017 年 5 月宣布了 TensorFlow Lite ,这是一个用于移动设备中机器学习开发的库。
我**——**终于在 2017 年 12 月,谷歌推出了 KubeFlow 。Kubeflow 是一个开源平台,允许在 Kubernetes 上运行和部署 TensorFlow 模型。换句话说,“Kubernetes 的机器学习工具包”
2018 年的发展:
I**——**3 月,谷歌宣布 TensorFlow.js 1.0,该版本使开发者能够使用 JavaScript 实现和服务机器学习模型。
我**——**2018 年 7 月,谷歌公布了 Edge TPU 。Edge TPU 是谷歌专门构建的 ASIC,旨在智能手机上运行 TensorFlow Lite 机器学习(ML)模型。
2019 年的动态:
I**—**2019 年 1 月,TensorFlow 团队宣布 TensorFlow 2.0.0 正式发布日期:2019 年 9 月。
I**—**2019 年 5 月, TensorFlow Graphics 宣布着手解决图形渲染和三维建模相关问题。
2019–2020:2019 年 9 月起:TensorFlow 2.0+
I**——**2019 年 9 月,TensorFlow 团队发布了 TensorFlow 2.0,目前的主要版本,精简了构建神经网络的诸多不便。
随着 2.0 版本的发布,TensorFlow 最终将 Keras 作为官方主要的高级 API 来构建、训练和评估神经网络。
I**—**tensor flow 2.0 精简了数据加载和处理工具,并提供了新增功能。
I—急切执行成为默认选项,取代图形执行。之所以采用这种策略,是因为 PyTorch 以热切的执行力吸引了很多研究人员。
With Eager execution, TensorFlow calculates the values of tensors as they occur in your code.
如你所见,TensorFlow 不仅仅是 Python 的深度学习库。这是一个端到端的平台,你可以处理你的数据,建立和训练机器学习模型,在不同设备上使用不同的编程语言为训练好的模型服务。下面你可以看到 TensorFlow 平台的当前示意图:
图 5。TensorFlow 平台的当前图(图由作者提供)
TensorFlow 到底有多受欢迎?
截至 2020 年,真正的竞争正在 TensorFlow 和 PyTorch 之间展开。由于其成熟性、对多种编程语言的广泛支持、在就业市场中的受欢迎程度、广泛的社区支持和支持技术,TensorFlow 目前占据上风。
图 6。深度学习框架 Power Score 2018(基于杰夫·黑尔的作品)(图由作者提供)
2018 年,杰夫·黑尔为市场上的深度学习框架开发了一个权力排名。他权衡了在网上工作列表、相关文章和博客帖子以及 GitHub 上发现的提及。2018 年以来,PyTorch 取得了上升的势头,我相信到现在它一定有更高的分数。但是,我相信 TensorFlow 仍然比 PyTorch 有优势,因为它很成熟。
我深信不疑!下一步是什么?
你已经到了这一步,我希望你已经理解了什么是张量流,以及你如何从中受益。如果你确信要学习 TensorFlow,在接下来的文章中,我将用实际的代码示例解释下面的主题:
- 张量流的基础:张量、变量和急切执行;和
- TensorFlow 2.x 覆盖整个深度学习管道运营的五大能力。
第二个帖子已经发布:
[## 通过 5 个简单的步骤掌握 TensorFlow 张量
探索 TensorFlow 的构建模块如何在较低的级别工作,并学习如何充分利用张量…
towardsdatascience.com](/mastering-tensorflow-tensors-in-5-easy-steps-35f21998bb86)
第三个是:
[## 用 5 个简单的步骤掌握 TensorFlow“变量”
了解如何使用张量流变量,它们与普通张量对象的区别,以及它们何时优于…
towardsdatascience.com](/mastering-tensorflow-variables-in-5-easy-step-5ba8062a1756)
您可以关注我的账户并订阅我的简讯:
最终注释
多年来,TensorFlow 变成了一个大平台,从头到脚覆盖了机器学习专家的每一个需求。还有很长的路要走,但与十年前相比,我们已经遥遥领先。加入这项新技术的崛起,并在 TensorFlow 的帮助下学习实现自己的深度学习模型。不要错过…
最后,如果你对应用深度学习教程感兴趣,可以看看我的一些文章:
[## 使用 MNIST 数据集在 10 分钟内完成图像分类
利用 TensorFlow 和 Keras |监督深度学习使用卷积神经网络来分类手写数字
towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d) [## 利用生成性对抗网络在 10 分钟内生成图像
使用无监督深度学习生成手写数字与深度卷积甘斯使用张量流和…
towardsdatascience.com](/image-generation-in-10-minutes-with-generative-adversarial-networks-c2afc56bfa3b) [## 使用卷积自动编码器在 10 分钟内降低图像噪声
在时尚 MNIST 的帮助下,使用深度卷积自动编码器清洁(或去噪)有噪声的图像
towardsdatascience.com](/image-noise-reduction-in-10-minutes-with-convolutional-autoencoders-d16219d2956a) [## 使用递归神经网络预测比特币(BTC)价格
如果你能以某种方式预测明天的比特币(BTC)价格,这不是很棒吗?加密货币市场已经…
towardsdatascience.com](/using-recurrent-neural-networks-to-predict-bitcoin-btc-prices-c4ff70f9f3e4)
在 Google Colab 上转移学习的初学者指南
了解如何利用深度神经网络的力量来构建和训练最先进的模型
照片来自 Unsplash
海量的原始数据是当前最有价值的资源之一,这是巨大收入的潜在来源,这要归功于深度学习和相关硬件的进步,这些硬件是加速无数矩阵乘法所需的。如果我们没有很多数据,并且获取更多数据不可行,那该怎么办?还是我们缺少训练深度网络所必需的昂贵硬件?这两个问题都可以通过使用迁移学习的概念来解决,我们很快就会发现这是我们无意识熟悉的东西。
迁移学习是一种监督学习方法,使用先前构建和微调模型的预训练权重来帮助构建新模型。回想一下你生活中的那些情况,你不得不做出一个决定,但是缺乏相应的领域知识。一种做法是接近你的家人、教授、朋友和同龄人;倾听他们对问题的理解,运用自己的直觉,最终做出明智的决定。这正是迁移学习中发生的事情。迁移学习有几种不同的应用方式
- **按原样使用预先训练好的模型:**从我们的类比来看,这相当于听取他人的建议,并将其不加修改地应用于手头的问题。
- 作为特征提取器:我们利用模型已经学习的特征,并进一步扩展模型,以便它也可以有效地学习我们数据集特有的新特征,这些新特征可能与预训练模型已经训练的数据集不同。这类似于根据自己的智慧加上他人的建议形成一种观点。
- 微调模型:在这种情况下,我们训练整个模型,添加一些我们自己的层以获得最佳性能。而在特征提取中,我们冻结预训练层以确保学习的特征在反向传播过程中不会更新,我们在这种方法中解冻所有层,因为我们希望这种方式可以更好地为当前数据集泛化模型。
我们通过迁移学习达到了什么目的?
- 当我们需要用小规模数据集构建高性能模型,而又缺乏时间、金钱和资源来获得更大的、无偏见的数据集时,这是最佳选择之一。
- 缺乏训练深度网络所需的大量时间。
- 缺少必要的硬件
简而言之,你不必从头开始,但是强烈建议你在迁移到迁移学习之前,训练一些可行的小网络来很好地理解基础知识。
缺乏昂贵的 GPU 可以通过使用像谷歌的合作实验室这样的平台来弥补,这是一个谷歌的研究项目,使所有人都可以访问机器学习,无论硬件要求如何,拥有 Jupyter 笔记本环境,GPU 或 TPU 支持,所有这些都通过云带给你。要了解更多关于规格的信息,请查看他们的笔记本示例,链接于此https://colab . research . Google . com/drive/1 _ x 67 fw9 y 5 abw 72 A8 agepfllkpvklpnbl
我们将把这种技术应用于一个简单的二值图像分类问题,猫和狗图像的区分。我们的数据集非常简单,总共有 1000 张狗和猫的图像,分别用标签 0 和 1 编码。对于图像分类,在使用预训练的网络体系结构之前,有许多已建立的网络体系结构可供我们从头开始推导我们的模型。LeNet-5 是第一个用于手写数字分类的方法。随着 ImageNet 大规模视觉识别挑战赛的到来,AlexNet 诞生了,还有其他像 VGG-16,VGG-19,ResNet50,Inception,Xception,MobileNet 和最终的 NASNet,这是一个神经网络模型,它可以找出自己的神经网络架构。基于 AlexNet 的简单模型得到了 93%的训练准确率和 83%的测试准确率。理论上,用于这种类型图像分类的模型可以产生的最小误差应该与人类水平的误差相似。人类擅长对狗和猫的图像进行分类,所以我们的模型应该表现出 95%以上的准确率。
从头开始制作模型的结果
让我们用 VGG-16 来试试迁移学习
from keras.applications.vgg16 import VGG16
from keras.models import Model
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import Dropout
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import regularizersvgg_model=VGG16(include_top=False, input_shape=(64,64,3))
for layer in vgg_model.layers:
layer.trainable=False
在 keras.applications 提供的许多预训练模型中,我们选择了 VGG-16,因为它的架构与我们已经使用的架构相似。为了将模型用作特征提取器,我们设置 include_top=False,这样我们可以将我们的自定义 ANN 或 CNN 添加到现有模型中。为了进一步确保预训练的权重在反向传播期间不被调整,我们设置 layer.trainable = False。然而,后来发现这个设置的准确性没有超过 78%,所以它将被注释掉以执行微调。
x = vgg_model.output
#add flatten layer so we can add the fully connected layer later
#This is using the Keras functional API but Sequential API works #just as well
x = Flatten()(x)
x = Dense(64, activation='relu')(x)
x = Dropout(0.2)(x)
x = Dense(1, activation='sigmoid')(x)#create the new model
model = Model(input=vgg_model.input, output=x)
print(model.summary())
接下来,自定义模型,这里添加了一个简单的人工神经网络。然后构建最终模型。应用图像数据扩充来补偿数据集的大小。在一些超参数调整之后,仅 37 个时期就获得了 98%和 91%的训练和测试准确度,而我们需要 70 个时期才能在从头开始的一个时期上获得 83%的准确度。同样的方法也适用于 ResNet50 ,其训练和测试精度分别为 92%和 87%。然而,这些都不是完美的,随着更多的调整,将获得更高的精度。
ResNet50 的结果
最后,迁移学习中出现的一些事情
- 所有预先训练的模型都期望 RGB 彩色图像。
- 所有模型都有一个不能任意改变的最小图像尺寸,否则在一系列卷积之后,后面的层将被期望执行不兼容尺寸的阵列的矩阵乘法。
- 小批量< 128 aren’t helpful for the current problem.
- ResNet50, MobileNet and similar architectures have a BatchNormalization layer. During training, these layers aren’t updated, so the normalization is done with pre-computed values from the dataset on which this has been trained previously. If these values are widely different from the current dataset, low accuracy will be obtained. Unfreezing the layers yielded better results. (Frankly this is what I understood from this discussion here https://github . com/keras-team/keras/issues/9214 # issue comment-397916155随时指出错误并添加您的观点)
- 训练后,狗和猫的图像如预期的那样被正确识别。它也开始把狮子归类为猫,把狼归类为狗。它也对狗和猫的卡通图像进行分类。
来自 VGG-16 的结果
这里是我谦卑的尝试,试图揭开控制迁移学习的一些基本概念的神秘面纱,并希望减轻程序员们向深度学习领域的过渡。我自己也是一个初学者,涉足这些,因为我觉得它非常有趣和酷,努力成为一个自学成才的数据科学家。如果你也处于同样的情况,我希望你很快就能得到你现在正在为之奋斗的模型精度。感谢你读到这里,欢迎你指出错误,分享你的想法和快乐学习!
从 SAS 过渡到 Python 的初学者指南
10 个常见的数据分析任务以及如何在 SAS 和 Python 中完成这些任务
介绍
SAS 是一种专门的数据分析编程语言,自 1976 年以来一直存在。这比 Python 在 1990 年首次作为通用编程语言出现早了 14 年,比 Pandas 在 2008 年首次发布并将 Python 转变为开源数据分析工具早了 32 年。虽然 SAS 由于其效率和支持可用性而仍然受到广泛尊重并在各公司中使用,但 Python 由于其开放源代码的性质以及机器学习和人工智能库的快速发展而日益成为首选语言。我广泛地使用这两种语言,经常被问到是否有简单的指导,让了解 SAS 的人能够容易地过渡到 Python。我写这篇文章的目的就是开发这样一个指南。
我们将看看 10 个最常见的数据分析任务,以及如何在 SAS 和 Python 中完成它们。我将使用的过程和功能比我将要介绍的功能强大得多。然而,我在这里的目的并不是深入研究某个特定的过程或函数,而是让大家感受一下在两种语言中如何完成相同的任务。
我将使用 Kaggle 著名的泰坦尼克号训练数据集。你可以在这里下载并找到关于这个数据的细节。您将需要 SAS 和 Python 来跟进。Python 是开源的,因此可以免费安装。SAS 是专有软件,但为学术和非商业用途提供免费的大学版。这对于本教程来说应该足够了。一旦你可以使用 SAS 和 Python,你需要做的最后一件事就是为 Python 安装 pandas。这可以通过使用“pip”并运行下面的命令来完成。
pip install pandas
一旦成功安装了 pandas,就需要将其导入到 Python 工作会话中。您可以通过运行下面的代码来做到这一点。注意,我喜欢在和熊猫一起工作的时候用一个别名——PD。
import pandas as pd
让我们从 10 个常见的数据分析任务以及如何在 SAS 和 Python 中完成这些任务开始。
1.从平面文件读取数据
导入数据通常是任何数据分析项目中最常见的第一步。分隔的平面文件通常用于移动数据。SAS 提供了一个强大的过程来做到这一点。以下代码显示了如何将 titanic_train.csv 逗号分隔文件导入名为“titanic”的 SAS 数据集。
proc import
datafile = "&path.titanic_train.csv"
out = titanic
dbms = csv;
run;
Pandas 提供了read_csv()
函数来完成这项工作。在这里,我通过使用 read_csv()导入 titanic_train 文件来创建一个 Pandas DataFrame 对象。数据帧相当于 SAS 数据集。
titanic=pd.read_csv('titanic_train.csv')
2.查看汇总统计数据
导入数据后的首要任务之一通常是查看数值字段的汇总统计数据。PROC MEANS
是一个很棒的工具,它为 SAS 用户提供了一种生成这些信息的简单方法。
PROC MEANS DATA=titanic;
VAR _numeric_;
OUTPUT OUT=stats;
RUN;
Pandas 提供了一个名为describe()
的等效功能。
titanic.describe()
下面是来自 SAS 和 Python 的结果以及它们如何比较的快照。
SAS 和 Python 的汇总统计输出
3.按组汇总统计数据
很多时候,我们希望查看组级别的汇总统计数据。例如,我们可能希望根据性别对 Titanic 数据进行分组,并查看男性和女性之间的统计数据如何进行比较。在 SAS 中,我们可以添加 CLASS 或 BY 语句来做到这一点。
PROC MEANS DATA=titanic;
CLASS Sex;
VAR _numeric_;
OUTPUT OUT=stats;
RUN;
在 Python 中,Pandas 提供了一个groupby()
函数,该函数可以使用点符号与describe()
函数链接,以获得组级别的摘要。
titanic.groupby('Sex').describe()
4.更改列名
SAS 提供了一个强大的数据步骤来操作 SAS 数据集的行和列。您可以在数据步骤中使用rename statement
来更改列名。
data titanic2;
set titanic;
rename Pclass=passengerclass;
run;
在 Python 中,您可以使用rename()
函数来重命名列名。如果希望更新多个列的名称,可以在字典中传递多个元素。
titanic2=titanic.rename(columns={'Pclass':'passengerclass'})
5.删除并保留列
只保留需要使用的列并删除不需要的列总是一个好主意。虽然这在 SAS 中可能没有太大关系,但在 Python 中工作时可能会有性能影响。原因是 Pandas 数据帧驻留在内存中,不像 SAS 数据集驻留在磁盘上。我经常在 SAS 数据步骤中使用DROP
和KEEP
语句来删除和保留数据集中的某些列。
data titanic2;
set titanic;
drop pclass;
run;data titanic2;
set titanic;
keep pclass;
run;
Pandas 提供了drop()
函数来删除列。我们可以将想要删除的列的列表传递给drop()
函数的 columns 参数。为了保留某些列,我们可以将想要保留的列的列表传递给slicing operator
或方括号[]。列列表类似于PROC PRINT
中的VAR
语句。还要注意,在 Python 中,列名(以及几乎所有内容)是区分大小写的。在 SAS 中,列名不区分大小写。
titanic2=titanic.drop(columns=['Pclass'])titanic2=titanic[['Pclass']]
6.添加新列
在数据分析项目中,几乎总是需要根据现有字段添加新列。SAS 数据步骤使它非常容易做到。然而,在某些情况下,使用数据步骤可能有点棘手。例如,我在这里添加了一个新列“fare_deviation”,它是通过从每一行(乘客)的票价中减去总平均票价来计算的。谢天谢地,SAS 提供了PROC SQL
来轻松做到这一点。我喜欢 PROC SQL,因为它提供了一种方法来利用 SQL 的强大功能,以便与其他 SAS 过程一起进行分析。
proc sql noprint;
create table titanic2 as
select *,fare-mean(fare) as fare_deviation from titanic;
quit;
这在 Python 中很容易做到,事实上,只用一行代码就可以做到。在下面的代码中,我使用了mean()
函数来计算‘Fare’列的平均值,并将其从‘Fare’序列中减去。组成 DataFrame 的每个单独的列都可以被认为是 Pandas 系列对象。一个新的系列可以被添加为一个数据帧列,就像我创建新的数据帧列’ Fare_deviation '一样。
titanic['Fare_deviation']=titanic['Fare']-titanic['Fare'].mean()
7.子集数据
在 SAS 中,我们可以在数据步骤中使用 IF 或 WHERE 语句对行进行子集划分,对列进行保留和删除。
data titanic2;
set titanic;
if sex='male';
keep Name Sex Pclass pclass;
run;
在 Python 中,我们可以使用loc[]
方法对数据进行子集化。在这里,我为“男性”乘客选择行,只保留“姓名”、“性别”和“Pclass”列。
titanic2=titanic.loc[titanic['Sex']=='male',['Name','Sex','Pclass']]
8.排序数据
PROC SORT
提供了一种在 SAS 中对数据集进行排序的理想方法。默认行为是按升序排序。对于降序排序,需要在 BY 语句后添加“descending”。
proc sort data=titanic;
by descending passengerid;
run;
在 Python 中,我们可以使用sort_values()
函数对数据帧进行排序。inplace 参数告诉 python 应用操作并更新调用该函数的同一数据帧。
titanic.sort_values(by=['PassengerId'],ascending=False,inplace=True)
9.内部、外部和左侧连接
在我演示如何执行连接之前,让我们首先从我们庞大的数据中创建两个子集。我正在为乘客编号为 887,888,889,890,891 的乘客创建一个包含“乘客编号”、“姓名”和“性别”列的“titanic_a”数据集。’ titanic_b ‘数据集包含 passengerid 为 887,888,889,890,891 乘客’ passengerid ','年龄’和’幸存’列。
data titanic_a(keep=passengerid name sex) titanic_b(keep=passengerid age survived);
set titanic;
if (passengerid in (887,888,889,890,891)) then output titanic_a;
if (passengerid in (884,885,886,887,888)) then output titanic_b;
run;
下面,我正在创建两个熊猫数据框,就像我上面在 SAS 中创建的一样。
titanic_a=titanic.loc[titanic['PassengerId'].isin([887,888,889,890,891]),['PassengerId','Name','Sex']]
titanic_b=titanic.loc[titanic['PassengerId'].isin([884,885,886,887,888]),['PassengerId','Age','Survived']]
现在我们有了两个数据集,我们准备好查看连接。我经常喜欢在 SAS 中使用PROC SQL
来执行连接,因为我发现使用 SQL 很直观。MERGE
的说法同样受欢迎。在下面的代码中,我们创建了三个数据集— titanic inner(由 titanic_a 和 titanic_b 之间的 passengerid 上的内部联接产生)、titanic_outer(由 titanic_a 和 titanic_b 之间的 passengerid 上的外部联接产生)和 titanic_left_a(由 titanic_a 和 titanic_b 之间的 passengerid 上的左联接产生)。
data titanic_inner titanic_left_a titanic_outer;
merge titanic_a (in = a)titanic_b (in = b);
by descending passengerid;
if a and b then output titanic_inner;
if a then output titanic_left_a;
if a or b then output titanic_outer;
run;
使用 pandas 提供的 merge()函数可以获得类似的结果。
titanic_inner=titanic_a.merge(titanic_b,how='inner',on='PassengerId')
titanic_left_a=titanic_a.merge(titanic_b,how='left',on='PassengerId')
titanic_outer=titanic_a.merge(titanic_b,how='outer',on='PassengerId')
10.导出数据
最后一个例子是将数据导出为平面文件。在 SAS 中,这可以使用PROC EXPORT
来完成。
PROC EXPORT
DATA=titanic_outer
DBMS=csv
OUTFILE="&path.titanic_outer.csv";
run;
在 Python 中,您可以使用to_csv()
函数写出一个平面文件。
titanic_outer.to_csv('titanic_outer.csv')
结论
我希望本指南为 SAS 程序员提供一个良好的起点,让他们尝试使用 Python 进行数据分析,并让 Python 程序员使用 SAS。
初学者掌握数据科学的路线图
揭示数据科学的各个方面以及掌握数据科学需要学习的东西
照片由 Unsplash 上的 Dariusz Sankowski 拍摄
数据科学是当今最热门的技术领域。在过去几年中,对数据科学工作列表的需求稳步上升。据财富报道,统计数据显示,在过去的 4 年里,人工智能专家的雇佣量增长了 74%。数据科学被认为是当代人最热门的工作。
对熟练数据科学家的需求正以前所未有的速度增长。对机器学习、深度学习、计算机视觉、统计学和自然语言处理等人工智能子领域专家的需求和空缺职位每天都在激增。
在本文中,我们将涵盖掌握数据科学并通过创建大量令人难以置信的项目成为成功的数据科学家所需了解的所有重要方面。
我为这篇文章做了一个小的目录列表,它将帮助你对我们将要遇到的事情有一个了解的感觉。
目录:
- 数学
- 编程;编排
- 数据挖掘
- 数据可视化
- 机器学习
- 深度学习
- 其他重要分支
- 结论
如果你是初学者,我会建议你阅读所有这些东西,但是如果你有信心,那么可以随意跳到你最感兴趣的部分。
1.数学
照片由 Antoine Dautry 在 Unsplash 上拍摄
我发现数学是一门你要么学着喜欢,要么最终爱着讨厌它的学科。有些人觉得数学是一门神奇的学科,而有些人觉得所有这些数字的东西有点无聊。不管你在光谱的哪一边,因为数学是数据科学最基本的要求之一。
数学是数据科学的基本要求。为了征服数据科学的所有数学方面,线性代数、微积分、概率和统计是你需要知道的最重要的概念。
对于初学者来说,高中对这些概念的基本理解就足以进入数据科学的世界。然而,如果你对这些概念不太有信心,或者需要简单梳理一下,那么我强烈推荐你去阅读一些关于 TDS 的文章,因为它们简单易懂地解释了大多数概念。YouTube 视频也是学习这些概念的一个很好的选择。
建立预测机器学习模型、理解解决贝叶斯和其他类似问题的概率和确定性方法、理解深度神经网络中的反向传播、分析梯度下降等等都需要数学。
2.编程;编排
凯利·西克玛在 Unsplash 上的照片
在编程领域,大约有 700 种编码语言。理解每种编程语言的意义以及它们如何影响我们需要执行的特定任务是至关重要的。在数据科学中广泛使用的一种编程语言是 Python。
Python 是一种面向对象的高级编程语言,早在 1991 年就发布了。Python 具有高度的可解释性和高效性。简单来说——Python 很神奇。我最初是从 C、C++和 Java 这样的语言开始的。当我终于遇到 python 的时候,我发现它相当优雅,简单易学,易于使用。
Python 对于任何人来说都是最好的方式,即使是以前没有编程或编码语言经验的人也是如此。尽管有一些缺陷,比如被认为是一种“慢”语言,python 仍然是人工智能和机器学习的最佳语言之一。
尽管有像 R 这样的其他语言,Python 在机器学习中如此受欢迎的主要原因如下
- 如前所述,python 非常简单和一致。
- 与其他编程语言相比,受欢迎程度的快速增长。
- 与各种库和框架相关的丰富资源。我们将在本系列的下一部分进一步详细讨论这一点。
- 多功能性和平台独立性。这意味着 python 也可以导入用其他编程语言构建的基本模块。
- 伟大的社区和持续更新。总的来说,python 社区充满了令人惊奇的人,并且不断更新以改进 python。
要开始使用 python,你可以从这里下载。
3.数据挖掘
托拜厄斯·菲舍尔在 Unsplash 上的照片
数据收集是在一个已建立的系统中收集和测量目标变量信息的过程,然后使人们能够回答相关问题并评估结果。
数据挖掘是在大型数据集中发现模式的过程,涉及机器学习、统计学和数据库系统的交叉方法。数据挖掘是计算机科学和统计学的交叉学科,其总体目标是从数据集中提取信息(用智能方法)并将信息转换成可理解的结构以供进一步使用。
谷歌搜索显然是寻找新资源的最佳方式。Kaggle 为其举办的每个特定比赛提供了一些最佳数据和数据集选项。有时在 GitHub 上也可以找到非常有趣的数据集。
如果你正在寻找做一些自然语言处理项目,那么你也可以利用维基百科或其他类似的网站通过网络抓取来提取数据。
Data.gov 和 UCI 机器学习库是其他很棒的网站,它们提供了大量丰富的数据集选项。
4.数据可视化
可视化是任何数据科学项目的一个重要方面。
在统计学中,探索性数据分析是一种分析数据集以总结其主要特征的方法,通常采用可视化方法。可以使用或不使用统计模型,但 EDA 主要是为了查看数据可以告诉我们什么,而不仅仅是正式的建模或假设测试任务。
探索性数据分析在数据科学和机器学习项目领域的作用是能够详细了解手头的数据。
探索性数据分析提供了许多图表和种类来可视化和分析可用的数据。它提供了对如何进一步发展的简要理解和想法。
pyplot 和 seaborn 是用于可视化和执行探索性数据分析任务的两个最佳库模块。这些允许你画出许多图形结构,这对分析你的数据非常有帮助。
5.机器学习
机器学习是程序自动学习和提高效率的能力,而无需显式编程。这意味着给定一个训练集,你可以训练机器学习模型,它将理解一个模型到底是如何工作的。在对测试集、验证集或任何其他看不见的数据进行测试时,模型仍然能够评估特定的任务。
让我们用一个简单的例子来理解这一点。假设我们有一个 30,000 封电子邮件的数据集,其中一些被分类为垃圾邮件,一些被分类为非垃圾邮件。机器学习模型将在数据集上训练。一旦训练过程完成,我们可以用一封没有包含在我们的训练数据集中的邮件来测试它。机器学习模型可以对以下输入进行预测,并正确分类输入的电子邮件是否是垃圾邮件。
机器学习方法主要有三种。我们将讨论每一种方法。然后,我将为每种方法列举一些例子和应用。
1.监督学习—
这是使用专门标记的数据集训练模型的方法。数据集可以是二元分类,也可以是多类分类。这些数据集将具有指定正确和错误选项或一系列选项的标注数据。在监督下,即在这些标记数据的帮助下,对模型进行预训练。
2.无监督学习—
无监督学习是在未标记的数据集上训练模型。这意味着模型没有先验信息。它通过将相似的特征和模式组合在一起来训练自己。无监督学习的一个例子可以是狗和猫的分类。给我们的数据将是一个未标记的数据集,包含狗和猫的图像。无监督算法将发现模式中的相似性,并在不指定数据类型的情况下将狗和猫分别分组。
3.强化学习—
强化学习(RL)是机器学习的一个领域,涉及软件代理应该如何在环境中采取行动,以最大化累积回报的概念。强化学习是与监督学习和非监督学习并列的三种基本机器学习范式之一。
6.深度学习
马里乌斯·马萨拉尔在 Unsplash 上的照片
深度学习是机器学习的一个子领域,它基于人工神经网络的概念来执行特定的任务。人工神经网络从人脑中提取灵感。
然而,最重要的是要注意,它们在理论上不像我们的大脑那样运作,甚至一点也不像!它们被命名为人工神经网络,因为它们可以完成精确的任务,同时达到理想的精度,而无需用任何特定的规则显式编程。
几十年前 AI 失败的主要原因是因为缺乏数据和计算能力。然而,在过去几年里,这种情况发生了显著变化。大量的数据每天都在激增,因为大型科技巨头和跨国公司正在投资这些数据。由于强大的图形处理单元(GPU),计算能力也不再是一个大问题。
我将在我的其他帖子中更具体地介绍深度学习,请关注那些即将发布的文章。
7.其他重要分支
让我们简单了解一下作为初学者掌握数据科学所需的其他主题。这些概念对于创建独特和令人敬畏的项目非常有帮助。事不宜迟,让我们来看看它们。
1]计算机视觉
计算机视觉是人工智能的一个领域,它通过处理图像和图片来解决现实生活中的视觉问题。计算机识别、理解和识别数字图像或视频以自动化任务的能力是计算机视觉任务寻求成功完成和执行的主要目标。
人类识别周围的物体和环境没有问题。然而,对于计算机来说,识别和区分环境中的各种模式、视觉、图像和物体并不容易。
出现这种困难的原因是因为人脑和眼睛的解释能力不同于计算机,计算机解释大部分输出是 0 或 1,即二进制。
图像经常被转换成由红色、蓝色、绿色组成的三维阵列。它们的取值范围是从 0 到 255,使用这种传统的数组方法,我们可以编写代码来识别图像。
您可以通过以下链接了解有关计算机视觉的更多信息:
[## OpenCV:用代码掌握计算机视觉基础的完全初学者指南!
包含代码的教程,用于掌握计算机视觉的所有重要概念,以及如何使用 OpenCV 实现它们
towardsdatascience.com](/opencv-complete-beginners-guide-to-master-the-basics-of-computer-vision-with-code-4a1cd0c687f9)
2]自然语言处理
自然语言处理是数据科学的一个分支,在这里你可以处理语言和语音交流。您可以开发项目,对试图相互交流的人进行语义理解。
这是大多数语言预测模型的工作原理,如下一个单词预测或自动更正。自然语言处理具有巨大的范围,并为高级项目开发智能人工智能提供了广泛的选择。
大公司和小公司都使用的一个例子是聊天机器人,它可以为大多数观众和进入网站的观众提供人机交互。
机器人技术
机器人和人工智能在未来有着广阔的前景。数据科学项目与机器人的集成具有巨大的潜力,可以在几乎不需要人力的行业中实施顶级产品制造。
除此之外,机器人和数据科学可以专门用于在许多预编程任务中实现人类水平的性能。物联网和社区的进步也非常有利于将人工智能集成到机器人中,以开发智能和有效的设备。
结论:
随着数据科学和人工智能的迅速崛起,这可能是任何人投入时间了解这些学科的深度和质量的最佳时机。由于这些领域日益增长的需求和受欢迎程度,每天都有大量的机会等待着每个人。
我希望这篇文章能够让读者了解掌握数据科学所需的基本知识。由于数据科学是一个巨大的领域,需要一些时间来掌握本文中提到的所有技能。但是如果你对这个主题感兴趣的话,它完全值得你花费所有的时间!
让我知道你对数据科学的未来有什么想法,并随时向我提出关于本文的任何疑问。我会尽量最晚回复他们!
看看我的其他一些文章,你可能会喜欢读!
用 python 解决公司面试中问的各种模式编程问题。
towardsdatascience.com](/solutions-to-interview-questions-on-pattern-programming-cb1cff41844) [## 了解 ReLU:5 分钟最受欢迎的激活功能!
5 分钟左右深度学习的整流线性单元概念理解。
towardsdatascience.com](/understanding-relu-the-most-popular-activation-function-in-5-minutes-459e3a2124f) [## 在数据科学领域取得成功的三个要做和三个不要做
我希望开始时就知道的黄金法则。深入了解如何转变为一个…
towardsdatascience.com](/3-dos-and-3-don-ts-to-become-successful-in-data-science-c49e2c293a56)
谢谢你们坚持到最后。我希望你们喜欢阅读这篇文章。我希望你们都有美好的一天!
行为代码分析 101:利用法庭技术
技术债务不仅仅是技术上的东西。行为分析在发现技术债务的形成过程中起到了拯救作用。
行为代码分析之于静态代码分析,正如宇宙学之于天文学。它处理宏观尺度,即代码库的宇宙——从它的开始到当前状态,不要忘记幕后的组织机构。
行为代码分析是关于宏的。关于大局。 照片由格雷格·拉科齐在 Unsplash 上拍摄
我已经使用 Sonarqube 来帮助测量 React 项目中的技术债务。作为一个静态分析工具,它返回一个技术负债最高的文件列表。主要的一个是 renderer.js ,有九个问题,包括重复和无用赋值。但这是技术债吗,值得重构吗?
所以我在这里的观点是,静态分析不应该成为指引我们重构之旅的北极星。它只告诉我们代码库的症状。不是疾病。重构后看起来很糟糕的代码可能会很容易地返回到以前的状态,如果你真的不知道它最初为什么会处于那种状态。
诸如贡献者的数量、变更的频率、变更耦合的度量是揭示代码是否腐烂以及为什么腐烂的基础。你不能像 Sonarqube 那样,把一个又一个文件作为单独的部分来分析,而是要通过行为分析把它们作为一个网络来分析。
目录
- 技术债不是技术债
- 行为代码分析技巧
- 组织机构
技术债不是技术债 😕
“一塌糊涂不是技术债。它没有机会在未来支付。一塌糊涂就是永远亏本。”罗伯特·马丁。
技术债务就像金融债务一样,随着时间的推移会变得越来越昂贵,除非我们不断偿还。我们这样做是因为这是一种生存行为,一种赌注,以保证我们的软件满足短期的商业期望。不利的一面是差点的实施。没有正确地在将来集成其他新功能。
我们的技术债务越多,就越接近技术破产,在这种状态下,集成新功能的时间太长了,这使得它们不值得。
留意 莱曼持续变化定律 ,没有新特性,你的软件会变得没那么有用。那么,无用的作业怎么会是技术债务呢?嗯,我们不能只看代码就知道,我们必须看版本控制工具,它会告诉我们维护这个文件有多困难。
行为代码分析技术
研究表明,文件更改的次数是质量下降的一个很好的指标,会导致错误。为什么不呢?如果一个类改变得太频繁,是不是因为它有太多的责任,或者对它的理解不够。此外,我们经常工作的地方也是重构最有用的地方。
热点
亚当·桑希尔称之为热点。React 有很多这样的例子,ExhaustiveDeps.js 就是其中之一。这些都是潜在的重构目标,是滋生错误代码的温床。它们是复杂代码和活动代码的结果。
复杂性趋势
然后,我们可以开始确定每个潜在重构目标的复杂度趋势。就像火山一样,我们可以分类热点是活跃(即复杂性增加的趋势)休眠(复杂性不变的趋势),还是消亡(复杂性趋势已经开始降低)。虽然文件expletivedeps . js处于休眠状态,但还有其他文件处于活动状态,如 ReactFiberWorkLoop.old.js、。如果不注意的话,将会持续增长到无法维持。
更换联轴器
reactfiberworkloop . old . js是 2759 行代码,本身有 50 多个函数。在掌握它的所有功能之前,我们可以应用另一种技术来理解所有这些功能进化背后的动力。那就是,**改变联结。这是两个函数/文件之间的一种共享逻辑,如果你改变其中一个,你很可能必须改变另一个。注意,这不同于软件工程中通常的“耦合”,因为它是不可见的,**隐含在代码中。我们只能通过观察随着时间的推移所做的改变来注意到它。很快,可以注意到函数 commitRootImpl 和 prepareFreshStack 之间的耦合百分比非常高,为 47%。因此,这成为我们开始重构的候选对象。
高耦合度并不一定是错误的,事实上,它在单元测试和它们各自的类中都是意料之中的,但是在其他情况下,我们必须开始问自己它是否容易被察觉。例如,通过遵循 接近 原则,将一起变化的函数分组,我们正在传递仅通过代码不可能表达的信息。
总之,通过热点、复杂性趋势和变化耦合等技术,我们有了一个不同于 Sonarqube 最初给我们的视角。这是因为行为分析背后的范式不同于 Sonarqube,在 Sonarqube 中,从维护的角度来看,并非所有代码都同等重要。仅仅因为一些代码是坏的,并不意味着它是一个问题。我们工作最多的代码越重要。
组织机构这个问题不是技术性的,而是社会性的。
技术债总会有的。重要的是我们如何处理它。大自然母亲长期以来一直教导我们要学会适应未来不可预见的常态。而这正是根源所在,把 的越轨行为正常化:
不可接受的实践或标准逐渐变得可接受的过程。当越轨行为被重复而没有灾难性的结果时,它就成为了组织的社会规范。
解决原因,而不是症状
在软件领域,这意味着当我们接受并继续使用不寻常的功能/系统/行为时,它们就变成了新常态,而其他未来的偏差就变成了另一个新常态,一次又一次。这种现象是无国界的,即使是美国宇航局,一个错误就可能导致生命的损失,也经历过不同的时间——挑战者号,哥伦比亚号。想想看,如果这种现象发生在 Nasa 的组织文化中,为什么在我们的日常项目中不会发生呢?然而,开发商是罪魁祸首。因为没有其他人应该为好看的可维护代码辩护。
“在不召开大型员工会议的情况下,你能在多大程度上实现新功能,这是对一个架构成功与否的最终检验。”作者亚当·托恩希尔。
自 70 年代以来,软件行业的人口持续增长,,预计未来四年全球增长率将达到 20%。意思是发展变得越来越团队化。
然而,社会学已经证明,一个团队拥有的元素越多,就越难以协调,也就越有可能出现沟通上的差距,即所谓的****。此外,在团队中工作时,我们更容易受到影响,因为无论你是否注意到,我们的价值观和决策都会突然受到团队行为的影响。这种现象通常被称为 旁观者效应 ,可以通过两个主要的社会方面来解释。
- 多元无知 。这是一个群体状态,群体的规范被公开接受,却被私下拒绝。这是因为每个人都觉得自己是唯一这样想的人,害怕被排斥。所以所有人都没有采取行动。例如,这在人际关系中很常见,在学生课堂上——当害怕在课堂上暴露怀疑时——甚至在紧急情况下,如果有一个旁观者而不是一群人在场,受害者有更好的生存机会。
- 责任扩散 。一个人的状态,在一大群人当中感觉不那么负责,不那么负责。责任被稀释了,从个人到群体,但如果每个人都有这种感觉,那么就没有人会对那个责任负责。
这个问题不是技术性的,而是社会性的。照片由哈维尔·阿莱格·巴罗斯在 Unsplash 上拍摄
除了关注重构什么,我们不应该低估组织机构。研究表明,实践代码评审,并有一个主要的维护者对代码的质量有积极的影响。这个问题不是技术性的,而是社会性的。我们不应该只依靠自己,因为我们是主观的,有偏见的,适应性强的。但是我们可以利用从行为分析中得出的不带偏见的、客观的试探法,来了解幕后发生的事情。
我的行为代码分析的学习之路是从亚当·托希尔的书开始的, 【你的代码作为犯罪现场】软件设计 x 光片 。在这段旅程中,我学到了更多关于代码的社会方面,除了跟踪代码本身,版本控制工具还有多强大。最后,让我开发一个新的开源工具,它可以很好地完成上面强调的技术。**
该工具利用 Kibana 的可视化特性,提供更加可定制的分析体验。
github.com](https://github.com/pbmiguel/behavioural-code-analyser)***
冠状病毒死亡率的背后
对死亡率的进一步观察。它告诉我们什么?
2020 年 2 月 21 日丁香元冠状病毒确诊病例图
在之前的文章中,我介绍了一个 Python 工具箱来收集和分析冠状病毒流行数据。在本文中,我将使用 Python 工具箱深入研究流行病的一个衡量指标——死亡率。我将重点讨论以下几个问题:
- 死亡率的地区差异是什么?
- 目前的死亡率可能是低估还是高估?
现在我们开始吧。
健全性检查
就像任何数据分析任务一样,我们应该总是在实际工作之前执行健全性检查。所以让我们独立验证一下世界卫生组织对 2020 年 1 月 29 日~2%死亡率的估计:
我们可以看到,死亡率大多在 2%~3%以内,与世卫组织官方的估计完全一致。
1.调查死亡率的地区差异
为简单起见,我们将“死亡率”(MR)定义如下:
MR(T)= T 日累计死亡人数/T 日累计确诊人数
这个计算有点“幼稚”,但是对于区域可变性的讨论来说,这是一个很好的代理。我们将在本文后面重新讨论这个计算。
由于疫情是从武汉市开始的,而大部分病例都集中在湖北省,我们自然要把数据拆分成三个地区:
- 武汉市
- 湖北省除武汉市、
- 中国除了湖北省。
以下是这三个地区每日新确认的人数。它证实了这是一个合理的分割。Plot.ly 是一个很棒的工具,可以用来建立互动的情节。所以我将使用它而不是更传统的 Matplotlib,这样读者可以自己深入研究数据。
2020 年 2 月 13 日,新增确诊病例激增。这是因为湖北省在那一天放宽了“确诊”的定义,以便与其他省份的报告保持一致。新的定义在标准中增加了临床诊断,因此包括了许多以前被遗漏的患者。
在下图中,我们可以很容易地比较三个地区的死亡率以及全国平均水平:
很明显,武汉的死亡率远高于湖北省的其他地区,而湖北省的死亡率又远高于中国的其他地区。这一结果与中国国家卫生委员会的报告一致。而据约翰霍普金斯 CSSE 统计,截至 2020 年 2 月 20 日,中国境外确诊病例 634 例,死亡 3 例,所以除了湖北省外,国际死亡率与中国大致持平。因此,取决于你在哪里,死亡率差异可能是 10 倍或更多。
在撰写本文时(2020 年 2 月 21 日),没有证据表明该病毒发生了变异。那为什么不同地区的死亡率差别这么大呢?一种解释是,这种病毒传染性很强,如果不加控制,可以在短时间内感染大量人群。因此,武汉和湖北省的医院很快饱和,许多病人因资源不足而死亡。相反,病毒传播到其他省份的时间相对较晚,当时国家已经采取了严格的控制措施。因此,考虑到与医疗资源相比,患者的增长要慢得多,其他省份的死亡率要低得多。
我们必须认识到,中国是一个独特的国家,它能够迅速动员大量资源,采取前所未有的措施来遏制疾病的传播。但是,如果这种病毒蔓延到其他没有能力控制这种病毒的国家,结果可能会更加灾难性,导致更高的死亡率。
2.死亡率估计
现在让我们回到死亡率的值。其当前价值 2~3%可能是低估还是高估?
正如前面指出的,死亡率的简单公式略有缺陷。这个公式只有在疫情结束时才是准确的。在疫情期间, T 时间的死亡人数只是几天前 T-t. 确诊病例的结果,更准确地说,取决于患者的生存概率分布,这在疫情期间很难估计。
然而,可以肯定的是,我们“天真”公式中的分母太大了。因此,我们可以得出结论,目前对死亡率的估计很可能是低估了。
为了了解低估的程度,我们可以用不同的滞后时间绘制死亡率图。根据一些早期的研究,从确诊到死亡的平均时间大约是 7 days⁴.因此,我们绘制了无滞后、4 天滞后和 8 天滞后的死亡率。
计算非常简单:
但是策划有点复杂:
正如你所看到的,滞后死亡率比预期的要高,但不会高很多。而最近的趋同表明疫情趋于稳定或降温。因此,如果没有进一步的爆发,我们可以合理地估计,武汉的死亡率将在 3%~6%的范围内,湖北省其他地区在 2.5%~3%的范围内,中国其他地区在 0.6%~0.9%的范围内。
更新(2020 年 3 月 8 日):
这三个地区的死亡率稳定在:
- 武汉:4.8%
- 除武汉外的湖北省:3.5%
- 除湖北省外的中国其他地区:0.7%
这些数字大致符合我对 2020 年 2 月 21 日的预测。
最后的话
本文中的大部分情节都是互动的,读者可以放大阅读精确的数字。对于那些想自己玩数据的人来说,重现所有这些情节的 Python 笔记本在 GitHub repo 里,可以在 Google Colab 上运行。
(2020 年 2 月 24 日更新:我的 plot.ly 账号每天只允许 1000 次浏览。为了避免“404 错误”,我已经把所有的互动图表都换成了静态图片。但是 plot.ly 代码仍然有效。你仍然可以在谷歌实验室或你自己的机器上探索交互式图表。)
承认
我要感谢我的朋友 David Tian,他是一名机器学习工程师,对 Google Colab 的设置提供了慷慨的帮助,并对本文提出了宝贵的建议。看看他有趣的自驾* DeepPiCar *博客。
参考资料:
[1] 关于新型冠状病毒的最新情况[文字记录] —世界卫生组织(世卫组织),2020 年 1 月 29 日
[2]湖北新冠肺炎确诊人数激增的原因, 《中美聚焦》Feb 18, 2020.
[3] 2020 年 2 月 4 日新闻发布会文字实录, National Health Commission (NHC) of China press conference on Feb 4, 2020.
[4] 中国武汉 2019 新型冠状病毒感染肺炎住院患者 138 例临床特征 —王等。铝,牙买加,2020 年 2 月 7 日
幕后——流媒体服务如何知道我们接下来想看什么?
推荐系统综述
网飞公司成立于 1997 年,最初是一家通过邮件租赁 DVD 的公司,在十年内发展成为一家视频流媒体服务公司,现在已经成为我们生活中不可分割的一部分。通过后端的推荐引擎,它可以发现一个又一个值得狂欢的标题,从而确保客户粘性。事实上,主页上的“网飞流行”并不是全球流行图书的权威排名,而是基于浏览历史的相似用户中流行图书的代表。推荐系统是网飞收入的一个重要贡献者,为该平台上约 80%的时间提供了动力。
该平台分析观众如何点击、搜索、观看、播放和暂停,以生成隐性评分,从而对出现在主页上的标题进行个性化设置。这是一种比依赖用户的明确评级更具可扩展性的方法(例如——星星的数量,如按钮等)。
为了更好地识别用户的偏好,内容被分为成千上万个微观类型,具体如“备受好评的情感失败者电影”或“20 世纪 70 年代的中国动作和冒险”然后,网飞将流派标签与用户的观看历史配对。数据点被组合以创建具有相同内容偏好的人的聚类。
网飞已经确定了 2000 多个味觉社区。一组订阅了《纸牌屋》(T8)的用户还订阅了《费城永远阳光灿烂》(T9)。那些看《黑镜》的人往往会被同样愤世嫉俗和尖锐的纪录片所吸引。
在这篇文章中,我们将研究推荐引擎背后的算法。参考数据集是 MovieLens 1M 数据。这些数据包括用户、电影和收视率数据。
电影数据有 3883 个条目,并包含以下各列:
收视率数据有一百万个条目,每行对应一个用户电影收视率。该数据包含以下各列:
首先,我们将看一个基于内容的推荐系统。会根据以往的观看历史推荐类似的电影。电影之间的相似性可以基于几个因素来确定,例如演员、电影发行年份、导演等。在这种情况下,由于我们没有任何其他信息,相似性将根据流派进行计算。
为了分析流派,我们将流派分成一个数组,如下所示:
此后, TfidVectorizer 被应用于流派列,以识别每部电影的区别特征。对于每部电影来说,具有最高 Tfidf 分数的类型是表征该电影的类型。
tf = TfidfVectorizer(analyzer='word',ngram_range=(1, 2),min_df=0, stop_words='english')
tfidf_matrix = tf.fit_transform(movies['genre'])
tfidf_matrix.shapeOutput: (3883, 127)
基于 Tfidf 分数,使用余弦计算电影之间的相似度。
cosine_sim = cosine_similarity(tfidf_matrix)
np.fill_diagonal(cosine_sim, 0 )
cosine_sim.shapeOutput: (3883, 3883)
矩阵 cosine_sim 的每一行都给了我们每部电影和其他 3882 部电影之间的相似性得分。以下函数计算与特定标题最相似的电影。
titles = movies['title']
indices = pd.Series(movies.index, index=movies['title'])def genre_recommendation(title):
idx=indices[title]
ranked = np.argsort(cosine_sim[idx])
largest_indices = ranked[::-1]
return titles.iloc[largest_indices]
在为《玩具总动员》运行这个函数时,我们得到了前十部类似的电影:
genre_recommendation("Toy Story (1995)").head(10)
然而,基于内容的推荐受到过于领域特定和同质的困扰。例如,如果用户过去观看过喜剧,则未来的推荐也将围绕喜剧,而不考虑用户也可能喜欢其他类型。
因此,一种协同过滤方法被更多地使用。该方法分析用户之间的关系和产品之间的相互依赖性,以识别新的用户-项目关联。该方法中使用的两种主要技术是— 邻域模型和潜在因素模型。
邻里模型
在 Unsplash 上由bùI Thanh TM拍摄的照片
用户邻居是那些以类似方式评价电影的人。项目邻居是被同一用户相似地评级的电影。因此,通过找到用户的邻居,我们可以根据某个用户的邻居看过的电影,向她推荐一部未看过的电影。相反,我们会查看一部电影的最近邻居,以预测特定用户对这部电影的评价。
在这篇文章中,我们将研究用户-用户协同过滤。首先,计算每个用户的平均等级。
目标是获得一个评级矩阵,其中用户 id 作为行索引,电影 id 作为列索引,评级作为值。
然而,用户通常在他们的评级中有偏见。有些人可能倾向于总是评价低,而有些人可能总是评价高。为了使数值标准化,我们将从每个个人评分中减去平均评分。
标准化后,低评分变成负数,高评分变成正数。如果我们然后取余弦距离,我们发现对他们共同观看的电影具有相反视图的用户将具有几乎相反方向的向量,并且可以被认为尽可能远。但是,对共同评分的电影有相似意见的用户,他们之间的角度会相对较小。
减去每个用户的平均评级后,最终评级矩阵如下:
Nan 值仅仅是用户没有看过的电影。我们需要预测这些未看过的电影的收视率,以便能够确定用户是否愿意观看这些电影。在计算用户之间的相似性之前,我们将用行平均值填充 Nan 值。
rating_final_user = rating_final.apply(lambda row:row.fillna(row.mean()), axis=1)
评级矩阵现在看起来像这样:
最后,计算用户之间的相似性:
cosine = cosine_similarity(rating_final_user)
np.fill_diagonal(cosine, 0 )
user_similarity = pd.DataFrame(cosine,index=rating_final_user.index)
user_similarity.columns=rating_final_user.index
user_similarity.head()
计算每个用户的前 30 个邻居:
最后,我们通过以下步骤预测特定用户对电影的评价:
I)我们找到我们想要预测其评级的用户的前 30 个邻居。
ii)接下来,我们找到这些邻居对所讨论的电影给出的评级值。没有对该特定电影进行评级的邻居被忽略。
iii)我们现在有两个数据点——邻居用户对特定电影给出的评级以及他们相对于我们想要预测其评级的用户的相似性值。通过将评级和相似性值的总和除以相似性值来计算加权分数。
iv)然后将其添加到我们想要预测的用户的平均评级中,以得出最终数字。
v)根据这个值,我们可以最终决定是否要向用户推荐这部电影。
借助下图,可以直观地理解该过程:
这个评分矩阵显示了 12 个用户对 6 部电影的评分。列“avg”是每个用户的平均等级,“sim”是每个用户相对于用户 1 的相似性值。
从每个值中减去平均评分后,计算标准化矩阵。
假设,我们想预测用户 1 会给电影 2 打多少分。
与 1 最相似的用户是用户 10、11 和 2。然而,用户 2 没有看过电影 2,因此我们可以忽略该行。因此,用户 1 对电影 2 的预测评级是用户 10 和 11 的评级的加权平均值。这种情况下的权重是相似性值。最后,我们得到用户 1 给出的电影 2 的值-1.3。这意味着用户 1 对电影的评价比他的平均值低 1.3 分。十有八九我们不应该向用户 1 推荐这部电影。
通过转置评级矩阵并重复这些步骤来寻找相似的项目而不是相似的用户,可以为项目-项目协同过滤重复该过程。
通常用户数量远远超过任何平台上的项目数量。因此,项目-项目协同过滤给了我们一个更好的结果,因为它更容易分组相似的项目,而不是相似的用户。
潜在因素模型
我们有多少次在不知道自己喜欢这首歌的确切原因的情况下循环播放了这首歌?
潜在因素模型试图发现那些不容易被发现的隐藏特征。他们根据这些特征来描述用户和物品的特征。
矩阵分解
这是通过称为 矩阵分解 *,*的方法来完成的,该方法将用户(n) x 项目(m)矩阵分解成两个矩阵:用户(n) x 特征(f) *特征(f) x 项目(m)
电影推荐的矩阵分解。资料来源:Alpaydin,2016 年。
直观上,这意味着用户对第一矩阵中的特定电影给出的评级是该电影所具有的特征的函数。这类似于创建用户配置文件和电影配置文件。特征值被随机初始化,以通过将两个矩阵相乘来产生某个额定值。目标是在训练期间找到一个尽可能接近原始评级矩阵的值,这是通过梯度下降实现的。一旦我们有了分解的矩阵,我们就可以根据特征值将用户与电影匹配起来。例如,如果特征的数量是 2,一个用户可能具有两个特征的对应值[4,3]。如果特定电影的这两个特征的值是[3.8,2.7],我们可以断定用户和电影简档匹配。值越接近,用户对电影的评价越高,因此我们应该推荐相同的值。
除了寻找潜在的特征,这种方法还帮助我们将一个大矩阵转化为两个小矩阵。假设有 5000 个用户,1000 部电影。因此,第一个矩阵将有 5000 x 1000 = 500 万个占位符。
现在,假设我们有 20 个功能,等式右侧的第一个矩阵将有 5000 个用户 20 个功能= 100k 个占位符。类似地,第二个矩阵将有 20 个特征 x 1000 个电影= 20k 个占位符。这一共是 120k,比 500 万减少了一大截。
【奇异向量分解】
矩阵分解技术发展成更复杂的 SVD 技术,将评级矩阵分解成 3 个矩阵,而不是 2 个。
给定一个 m × n 矩阵 A,秩为 k,奇异值分解 SV D(A)定义为 SVD(A) = U(m,k)× S(k,k) × V (k,n)。
*V 是电影(n) x 特征(k)矩阵的转置。
矩阵 S 是只有 k 个非零元素的对角矩阵。S 的对角元(s1,s2,…,sk)具有 si > 0 且 s1 ≥ s2 ≥ … ≥ sk 的性质。因此,S 矩阵是一个特征矩阵,它以降序给出了特征的相对重要性。通过丢弃 r 其他不重要的条目,可以只保留 k-r 奇异值。还通过分别从 U 中移除 r 列和从 V 中移除 r 行来缩减矩阵 U 和 V。通过将三者相乘得到的简化矩阵是原始矩阵的良好近似。
Python 通过惊喜包方便了 SVD 的应用。
关于这里涉及的所有主题的详细代码,请参考 github 链接 。
协同过滤存在冷启动问题和流行偏见。网飞试图通过要求新用户列出一些初始偏好来管理冷启动问题,以便未来的推荐可以基于相同的偏好。有不同的方法来防止流行偏见,但是这超出了本文的范围。网飞在向用户推荐书目时会考虑几个参数,比如新鲜度和多样性,从而避免流行偏见。
本文旨在提供一个推荐系统如何工作的简要框架。在现实生活场景中,大量的计算和数据挖掘用于创建用户简档、电影简档,并且通常使用几种算法的组合来最终得出可以向用户推出的推荐。
我希望我已经能够开始了解推荐引擎背后的直觉!一如既往,欢迎反馈!
参考文献:
现在是周四晚上,你在电视机前。为了省钱,你把有线电视套餐换成了 10.99 美元…
www.buzzfeednews.com](https://www.buzzfeednews.com/article/nicolenguyen/netflix-recommendation-algorithm-explained-binge-watching) [## 为什么我会看到这个?
视频和电商平台如何利用算法驱动对用户的推荐。
www.newamerica.org](https://www.newamerica.org/oti/reports/why-am-i-seeing-this/case-study-netflix/#:~:text=Netflix%27s%20recommendation%20system%20is%20an,targeted%20advertisements%20to%20its%20users.) [## 网飞推荐:超越五星(下)
更深入地了解我们更广泛的个性化技术。
netflixtechblog.com](https://netflixtechblog.com/netflix-recommendations-beyond-the-5-stars-part-2-d9b96aa399f5)
用于高度可扩展推荐系统的增量奇异值分解算法(Badrul Sarwar、George Karypis、Joseph Konstan 和 John Riedl { Sarwar、Karypis、Konstan、riedl}@cs.umn.edu Group lens Research Group/美国明尼苏达州明尼阿波利斯市明尼苏达大学计算机科学与工程系陆军 HPC 研究中心,邮编:55455)
【http://www.mmds.org/】T2(第九章)
基于 CUDA 的 GPU 上 Bellman-Ford 单源最短路径算法
计算连通图中从一个源顶点到所有其它顶点最短距离的并行算法
蒂莫·沃尔茨在 Unsplash 上的照片
概观
遍历大型图来计算不同的信息在现实世界中有各种用例,如社交媒体网络、通信网络、搜索引擎索引和页面排名、VLSI 设计和生物网络分析。贝尔曼-福特、迪杰斯特拉和德尔塔步进是广泛使用的单源最短路径算法(SSSP)算法。Dijkstra 的算法提供了一种高效的实现方式,而 Bellman-Ford 则提供了一种简单的并行实现方式。增量步进算法在两者之间引入了一种折衷。本文介绍了在图形处理器(GPGPU)上使用统一计算设备架构(CUDA)加速贝尔曼-福特 SSSP 算法的三种并行实现技术。我们还在大型图上比较了所有三种变体的性能。我们观察到,对于具有 40 万个顶点和 100 万条边的稀疏图,使用优化的 CUDA 实现,顺序实现的运行时间可以减少 99.4%。
什么是单源最短路径(SSSP)?
图 G = (V,E ),其中 V 是顶点集,E 是边集。边(u,v,w)是从节点 u 到 v 的路径,其权重为 w。如果我们将节点视为城市,则边是城市之间的路线,权重是城市之间的距离。
在下面显示的示例图中,V = {A,B,C,D,E}和 E = {(A,B,9),(A,C,4),(B,C,10),(B,D,2),(B,E,3),(C,D,2),(C,E,11),(D,B,2),(E,D,2)}。单源最短路径是从源顶点(例如“A ”)到所有其他顶点的最短距离。
直接加权图
在上面的示例图中,从源顶点“A”到所有其他顶点的 SSSP 由蓝色箭头给出。即 A → C → D → B → E
数据集
我们使用了两种不同类型的大型图表。美国道路网络图数据集来自 DIMACS 最短路径实施挑战(离散数学和理论计算机科学中心)。第 9 届 DIMACS 实施挑战)和 Cherkassky、Goldberg 和 Radzik 使用 SPRAND 工具随机生成的图形(参考文献[1])
图表示
图 G(V,E)通常通过邻接矩阵或邻接表来表示。对于像道路网络这样的稀疏图,邻接表是首选的表示方法,因为它占用的空间更少。压缩稀疏行 (CSR)表示是邻接表的另一种形式,其中顶点列表被打包成一个大数组。我们发现这种表示适合 CUDA 实现(参考文献[2]、[3])。如下图所示,四个数组用于表示图形;存储所有顶点的顶点数组 V ,存储每个**V【I】**的边的邻接表的起始位置的索引数组 I ,存储每个边的权重的边数组 E ,以及存储每个边的权重的权重数组 W 。**I[I+1]—I[I]**提供 V[i] 的边数
图的压缩稀疏行表示
GPU 和 CUDA
图形处理单元(GPGPU)上通用计算使用的增加为我们提供了大规模并行计算能力。GPGPU 基于单指令多线程(SIMT)执行模型,其中每个线程执行相同的代码。计算统一设备架构 CUDA(Compute Unified Device Architecture)是 Nvidia 打造的并行计算平台和 API。它为通用计算提供了 GPU 并行性,并保留了性能。它是基于行业标准 C++开发的。CUDA 由一小组扩展组成,支持异构编程。
基本图片:CUDA C/C++基础,超级计算 2011 教程,Cyril Zeller,NVIDIA 公司
GPGPU 由几个流多处理器(SMs)组成。每个 SM 由几个流处理器(sp)组成。每个 SM 都有自己的内存,称为共享内存,由 SM 中的所有 sp 共享。从开发人员的角度来看,GPU 可以被视为网格,SMs 可以被视为块,sp 可以被视为线程。内核是由线程执行的一段代码。每个线程都有自己的 ID,它在决定线程要访问输入数据的哪一部分时起着至关重要的作用。
贝尔曼-福特顺序算法
贝尔曼-福特算法是一种使用边缘松弛技术的简单算法。它将所有边缘放松| V | 1 次。其中| V |是图中顶点的数量。如果没有负边循环,它也可以在具有负权重边的图上工作。在这项研究中,只考虑了边权重为正的图。
顺序贝尔曼-福特算法
什么是边缘松弛?
这是一种用正确的距离来修正近似距离的技术。在下图中,d[u]是从源“s”到“u”的距离,d[v]是从源“s”到“v”的距离。“u”和“v”之间有一条边,权重为“w”。如果 v 的距离大于(u,v)的 u +权重的距离,则用(u,v)的 u +权重的距离更新 v 的距离。
贝尔曼-福特松弛法
贝尔曼-福特并行 CUDA 实现
版本 1 —单片内核
在我们的第一种方法中,我们引入了一个单片 CUDA 内核,其中图形的每个顶点都被分配给一个单独的线程。每个线程放松由线程 ID 标识的顶点的所有输出边。在这种方法中,GPU 块数是在运行时根据输入图形中的顶点数计算的。这种类型的内核假设我们有足够的线程来覆盖输入图的所有顶点。
版本 1 —单片内核
版本 2 —具有网格步长循环的内核
在加速并行实现的第二项技术中,我们在 CUDA 内核中使用了 grid stride。使用 blockDim.x * gridDim.x 计算跨距,它等于网格中的线程总数。例如,如果网格中有 1024 个线程,线程 0 将处理索引为 0、1024、2048 等的顶点。这种网格步长循环方法提供了可伸缩性和线程重用。它还确保没有线程空闲,并且每个线程都做等量的工作
版本 2 —具有网格步长循环的内核
版本 3 —内核具有网格步长循环,仅在需要时放松边缘
为了进一步优化性能,我们引入了大小为|V|的布尔数组 F。对于图形的所有顶点,该数组在开始时被初始化为 false。源设置为真。作为松弛的一部分,当一个顶点用离源更短的距离更新时,它在 F 数组中的对应标志被设置为真。这表明在下一次迭代中,该顶点的所有输出边都需要进一步松弛。松弛内核使用该信息,并且仅当对应顶点的标志设置为真时才松弛。这种方法与 grid-stride 循环相结合,减少了每个线程所做的不必要的工作,从而确保了整体执行速度的进一步提高。
版本 3 —内核具有网格步长循环,仅在需要时放松边缘
测试环境
我们使用德克萨斯高级计算中心(TACC)的 Maverick2 超级计算机系统在大型图上分析我们所有实现的性能。Maverick2 拥有 Nividia GeForce GTX 1080 Ti GPU 设备,每个 SM 有 28 个 SMs 和 128 个 sp,以及 11GB 的全局内存。每个 SM 大约有 49 KB 的共享内存。
技术性能分析
贝尔曼-福特实现的运行时间比较
我们的分析表明,版本 3 的实现性能最好。与稀疏的真实世界道路网络图相比,随机生成的密集图的性能甚至更好。首先,我们记录了基本的顺序实现花费了 3.25 个小时来对具有 400,000 多个顶点和超过一百万条边的稀疏的纽约道路网络图执行 SSSP 计算。相比之下,CUDA 版本 1 用了 39 秒,版本 2 用了 42 秒,版本 3 用了 16 秒。我们还观察到,版本 2,即网格步长循环内核,对于具有超过 100 万个顶点和 400 万条边的较大图形表现得更好。对于随机生成的密集图,性能甚至更好。这表明启动新线程块的开销随着网格步长循环的引入而减少,这确保了块大小不会随着输入的增加而增加,从而允许每个线程处理更多的工作。下表显示了我们的 Bellman-Ford 实现对于各种大型图形所用的运行时间。
结论
我们提出了 Bellman-Ford 单源最短路径算法在 GPU 上使用 CUDA 并行实现的三种变体。具有网格步长循环的内核和仅在需要时放松边的逻辑,对于具有 1-1000 万条边的较大图形表现更好。我们在实现中使用了 CSR 表示。对于密集图形,这种方法需要更多的空间。可以做进一步的研究,使用密集图形的替代格式(如邻接矩阵),并使用 CUDA 块内的共享内存来研究性能。
这篇博文基于我和我的合作伙伴 Stephan Garland 提交给 2020 年夏天在奥斯汀的德克萨斯大学并行算法课程的学期论文。非常感谢Vijay Garg博士精心组织和精彩讲授的并行算法课程。
Github 链接:【https://github.com/sengorajkumar/gpu_graph_algorithms
参考
[1]Boris cherkasky、Andrew V. Goldberg 和 Tomasz Radzik。最短路径算法:理论和实验评估。数学编程,第 129-174 页。1993.
[2]潘卡利·阿加瓦尔和弥勒佛·杜塔。基于计算机统一设计架构(CUDA)的 Bellman-Ford 算法在 GPU 上的新方法。国际计算机应用杂志(0975–8887,110 — №13.2015。
[3]Pawan Harish 和 P. J. Narayanan。使用 CUDA 在 GPU 上加速大型图形算法。印度海德拉巴国际信息技术研究所视觉信息技术中心。
[4]马克·哈里斯。CUDA Pro 提示:用 Grid-Stride Loops 编写灵活的内核 https://developer . NVIDIA . com/blog/CUDA-Pro-Tip-Write-Flexible-Kernels-Grid-Stride-loops/,2013 年 4 月 22 日。
[5]马克·哈里斯。CUDA C/C++内核如何高效访问全局内存. https://developer . NVIDIA . com/blog/how-Access-Global-Memory-efficient-CUDA-C-kernels/,2013 年 1 月 7 日。
[6]Cyril Zeller,NVIDIA 公司,CUDA C/C++基础,超级计算 2011 年教程
基准图神经网络
这是一篇论文基准图神经网络的介绍性博客,该论文是与柴坦尼亚·k·乔希、托马斯·洛朗、约舒阿·本吉奥和泽维尔·布列松合作的。
图 0:在稀疏秩 2 张量上运行的 GCNs(上)和在密集秩 2 张量上运行的 WL-GNNs(下)的标准实验管道。
如今,图形神经网络(GNNs)广泛应用于社会科学、知识图、化学、物理、神经科学等领域。,相应地,对文献的兴趣和论文数量也有了很大的增长。
然而,在缺乏标准且被广泛采用的基准测试的情况下,衡量新模型的有效性和验证普遍适用于更大和更复杂数据集的新想法变得越来越困难。
为了解决图学习研究中存在的这一最重要的问题,我们开发了一个开源、易于使用且可重复的基准测试框架,该框架具有严格的实验协议,代表了 GNNs 的分类进步。
这篇文章概述了GNN文献中的问题 提出了基准测试的需求,在论文中提出的框架,广泛使用的强大 GNN 基准测试的主要类别,以及从大量实验中获得的见解。
为什么要进行基准测试?
在深度学习的任何核心研究或应用领域,基准有助于识别和量化哪些类型的架构、原则或机制是通用的,可推广到现实世界的任务和大型数据集。特别是,这个人工智能领域最近的革命通常被认为可能在很大程度上是由大规模基准图像数据集 ImageNet 触发的。(显然,其他驱动因素包括研究量的增加、更多数据集、计算、广泛采用等。)
图 1:来自paperswithcode.com的 ImageNet 分类排行榜
标杆管理已经被证明有利于推动进步,识别基本思想,解决许多科学子领域中的领域相关问题。这个项目就是基于这一基本动机而构思的。
GNNs 需要一个基准框架
a.数据集:
GNN 文献中许多被广泛引用的论文都包含了在小型图数据集上评估的实验,这些数据集只有几百(或几千)个图。
图 2:广泛使用的 TU 数据集的统计数据。资料来源 Errica 等人,2020 年
以为例,酶数据集,它几乎出现在用于分类任务的 GNN 的所有工作中。如果使用随机 10 折交叉验证(在大多数论文中),测试集将有 60 个图(即 600 个总图的 10%)。这意味着正确的分类(或者错误的分类)将改变 1.67%的测试准确度分数。几个样本可以确定 3.33%的性能测量差异,这通常是在文献中验证一个新想法时的一个重要增益分数。你看,样本的数量不可靠,无法具体地确认进步。
我们的实验也表明,在这样的数据集上,性能的标准偏差很大,这使得很难对一个研究想法做出实质性的结论。此外,大多数 gnn 在这些数据集上的统计性能是相同的。这些数据集的质量也让人怀疑你是否应该在验证 GNNs 上的想法时使用它们。在其中几个数据集上,更简单的模型,有时,表现得和一样好,甚至胜过 GNNs。
因此,区分复杂、简单和图机器学习的图不可知架构变得很困难。
b.一致的实验方案:
GNN 文献中的几篇论文在统一和稳健的实验设置上没有达成共识,这导致讨论不一致之处和重新评估几篇论文的实验。
为了在此强调几个例子, Ying 等人,2018 对固定数目的时期的 10 倍分裂数据进行训练,并报告具有*“在任何时期跨越分裂的最高平均验证准确度”的时期的性能,而 Lee 等人,2019 通过监控时期式验证损失使用“早期停止标准”,并报告 10 个时期的“最后时期的平均测试准确度”*
现在,如果我们将这两篇论文的结果放在同一个表中,并声称具有最高性能分数的模型是所有模型中最有希望的,我们能确信这种比较是公平的吗?
还有其他与超参数选择、可训练参数的不公平预算比较、不同训练验证测试分割的使用等相关的问题。
这些问题的存在促使我们开发了一个 GNN 基准框架,该框架使 GNN 研究标准化,并帮助研究人员取得更有意义的进展。
建立 GNN 基准的挑战
缺乏基准一直是 GNN 文献中的一个主要问题,因为上述要求没有得到严格执行。
设计基准测试极具挑战性,因为我们必须为编码框架、实验设置和适当的数据集做出稳健的决策。基准还应该全面,涵盖大多数基本任务,表明研究可以应用的应用领域。例如,图形学习问题包括预测节点级、边级和图形级的属性。基准应该试图涵盖其中的许多方面,如果不是全部的话。
同样,收集真实且有代表性的大规模数据集也具有挑战性。由于缺乏理论工具来定义数据集的质量或验证其在给定任务中的统计代表性,因此很难对数据集做出决定。此外,由于大多数流行的图形学习框架不能*【非常有效】*地适应大型图形,因此需要对图形的节点和边的特征以及图形大小的比例进行任意选择。
最近有一个很有前途的努力, 【开放图基准(OGB) ,收集有意义的中大规模数据集,以指导图学习研究。该倡议是对该项目的目标的补充。
提议的基准框架:
我们为图形神经网络提出了一个基准框架,具有以下关键特征:
- 我们开发了一个模块化的编码基础设施,可以用来加速新思想的发展
- 我们的框架采用了严格而公平的实验协议,
- 我们提出了适当的中等规模的数据集,可以作为后续研究的插件。
- 涵盖了图机器学习中的四个基本任务,即图分类、图回归、节点分类和边分类。
a.编码基础设施:
从高层次来看,我们的框架统一了以下独立组件:I)数据管道,ii) GNN 层和模型,iii)培训和评估功能,iv)网络和超参数配置,以及 v)用于再现性的单一执行脚本。
图 3:我们在 GitHub 上开源的模块化编码框架的快照
关于使用这些组件的详细用户说明在 GitHub 自述文件中有所描述。
b.数据集:
我们包括来自化学、数学建模、计算机视觉、组合优化和社交网络等不同领域的 8 个数据集。
图 4:建议的基准中包含的数据集的统计摘要
本文描述了数据集准备的步骤及其与基准图神经网络的相关性。
值得一提的是,我们纳入了来自 OGB 的-COLLAB,这表明我们可以 灵活地纳入来自 OGB 倡议的 任何当前和未来数据集。
c.实验方案:
我们为基准图神经网络模型定义了一个严格和公平的实验协议。
**数据集分割:**鉴于文献对不同的模型使用不同的训练值测试分割存在问题,我们确保我们的数据管道为每个比较的 GNN 模型提供相同的训练、验证和测试分割。我们遵循可用数据集的标准分割。对于没有标准分割的合成数据集,我们确保分割中的类分布或合成属性是相同的。更多细节请参考论文。
**培训:**我们对所有实验使用相同的培训设置和报告方案。我们使用 Adam 优化器以基于确认损失的学习率衰减策略来训练 GNNs。我们对每个实验进行未指定次数的训练,在此期间,模型停止以没有显著学习的最小学习速率进行训练。
重要的是,这种策略使得用户很容易不理解选择多少个纪元来训练他们的模型。
每个实验在 4 个不同的种子上运行,最多 12 小时的训练时间,并且报告 4 个实验的最后时期分数的汇总统计。
**参数预算:**我们决定使用两个可训练的参数预算:(I)所有任务的每个 gnn 的 100k 参数,以及(ii)gnn 的 500k 参数,我们研究将模型缩放到更大的参数和更深的层。相应地选择隐藏层和隐藏维度的数量以匹配这些预算。
为了公平比较,我们选择了相似的参数预算,因为否则很难严格评估不同的模型。在 GNN 文献中,经常可以看到一个新的模型与现有的文献相比,没有任何参数数量的细节,或任何具有相同大小的模型的尝试。话虽如此,我们的目标并不是为每个模型找到最优的超参数集,这是一项计算密集型任务。
d.图形神经网络:
我们对两大类 gnn 进行了基准测试,它们代表了最近文献中所见证的图形神经网络架构的分类进步。为了命名,我们将这两类称为 GCNs(图卷积网络)和WL-GNNs(Weisfeiler-Lehman GNNs)。
gcn 是指流行的基于消息传递的 gnn,其利用稀疏张量计算,WL-gnn 是基于 WL 测试的理论上有表达力的 gnn,用于区分需要在每层进行密集张量计算的非同构图形。
因此,我们的实验管道显示在图 5 的 GCNs 和图 6 的 WL-GNNs。
图 5:我们在稀疏的秩为 2 的张量上运行的 gcn 的标准实验流水线。
图 6:我们在稠密秩 2 张量上运行的 WL-gnn 的标准实验流水线。
我们将读者引向我们的论文和相应的著作,以获得关于 GNNs 的数学公式的更多细节。对于感兴趣的读者,我们还在论文中包括了每个 GNN 基准测试的层更新的框图。
在这一阶段,我们简单回顾了一下,我们讨论了基准测试的需求,构建这样一个框架的挑战,以及我们提议的基准测试框架的细节。我们现在深入研究实验。
我们对基于消息传递的 gcn 和 WL-gnn 进行了原则性的调查,以揭示重要的见解,并强调在构建强大的 GNN 模型中的关键潜在挑战。
在建议的数据集上对 GNNs 进行基准测试。
我们使用当前包含在我们的基准框架中的每个 GNN 模型,在所有数据集上执行全面的实验。这些实验帮助我们获得了许多真知灼见,这里只讨论其中的一部分。我们建议阅读这篇论文,了解实验结果的细节。
我们评测的 GNNs 有: 香草图卷积网络(GCN) ,Graph sage, 图注意力网络(GAT) , 高斯混合模型(MoNet) ,
1。图形不可知的神经网络在建议的数据集上表现不佳:我们将所有的神经网络与一个简单的 MLP 进行比较,后者独立于彼此更新每个节点的特征,即忽略图形结构。
ℓ层的 MLP 节点更新方程为:
MLP 在每个数据集上的评估得分一直很低,这表明有必要考虑这些任务的图形结构。这一结果也表明了这些数据集对 GNN 研究有多合适,因为它们在统计上区分了模型性能。
2。在建议的数据集上,GCNs 优于 WL-GNNs:虽然 WL-GNNs 在图形同构和表达能力方面可以证明是强大的,但是我们考虑的 WL-GNN 模型不能优于 GCNs。与利用稀疏张量的 gcn 相比,这些模型的空间/时间复杂度低,因此在扩展到更大的数据集时受到限制。
gcn 可以方便地扩展到 16 层,并在所有数据集上提供最佳结果,而 WL-gnn 在尝试构建更深层次的网络时面临丢失发散和/或内存不足的错误。
3。各向异性机制改善消息传递 GCNs 架构:在消息传递 GCNs 中的模型中,我们可以将其分为各向同性和各向异性。
其节点更新方程平等对待每个边缘方向的 GCN 模型被认为是各向同性的;并且其节点更新方程不同地对待每个边缘方向的 GCN 模型被认为是各向异性的。
各向同性层更新方程:
各向异性层更新方程:
根据上述方程,GCN、GraphSage 和 GIN 是各向同性的 GCN,而 GAT、MoNet 和 GatedGCN 是各向异性的 gcn。
我们的基准实验表明,各向异性机制是 GCNs 中的一个架构改进,它始终给出令人印象深刻的结果。注意,稀疏和密集注意机制(分别在 GAT 和 GatedGCN 中)是 GNN 中各向异性成分的例子。
4。训练理论上强大的 WL-GNNs 存在潜在的挑战:我们观察到 WL-GNNs 的表现分数有很高的标准差。(回想一下,我们报告了使用不同种子的 4 次运行的每次性能)。这就暴露了训练这些模特的问题。
像批量训练和批量归一化这样的通用训练过程没有在 WL-GNNs 中使用,因为它们在稠密的秩 2 张量上操作。
为了清楚地描述这一点,在稀疏秩 2 张量上操作的领先图机器学习库中的 gcn 的批处理方法涉及为一批图准备一个稀疏块对角邻接矩阵。
图 7:用一个稀疏块对角矩阵表示的小批量图。来源
在稠密秩 2 张量上操作的 WL-gnn 具有计算稠密张量中每个位置处/来自每个位置的信息的组件。因此,相同的方法(图 7)是不适用的,因为它将使整个块对角矩阵密集,并将破坏稀疏性。
gcn 利用批量训练和批量标准化来实现稳定快速的训练。此外,目前设计的 WL-高斯神经网络不适用于单一的大图,如 OGBL-科拉布图。我们未能在 GPU 和 CPU 内存上容纳如此大尺寸的稠密张量。
因此,我们的基准表明,需要重新思考更好的 WL-广义神经网络设计方法,可以利用稀疏性,批处理,规范化方案等。已经成为深度学习的普遍成分。
更多阅读
有了这个 GNN 基准框架的介绍和有用性,我们结束这篇博客,但是如果你对这个工作感兴趣,还有更多阅读。
特别是,我们在本文中更详细地研究了链接预测的各向异性和边缘表示,并提出了一种改进低结构表达 GCNs 的新方法。我们将在以后的博客文章中单独讨论这些,以便清楚地理解。
如果这个基准框架在你的研究中使用,请在你的工作中使用下面的 bibtex。如需讨论,请向我们咨询 GitHub 问题。我们很乐意讨论和改进基准,以指导图形神经网络中更有意义的研究。
@article{dwivedi2020benchmarkgnns,
title={Benchmarking Graph Neural Networks},
author={Dwivedi, Vijay Prakash **and** Joshi, Chaitanya K **and** Laurent, Thomas **and** Bengio, Yoshua **and** Bresson, Xavier},
journal={arXiv preprint arXiv:2003.00982},
year={2020}
}
脚注:
- 这样说,我们并不意味着这些想法没有用,或者作者的工作没有意义。每一项努力都同样有助于这一领域的发展。
- 举个例子,你可以参考 到 这些 的作品 ,利用我们的框架来方便地研究他们的研究思路。它表明了拥有这样一个框架的有效性。
- 请注意,我们的目标不是开发一个软件库,而是提出一个编码框架,其中每个组件都是简单的,并且对尽可能多的用户是透明的。
本帖原载于 NTU 图深度学习网站 。
自然语言处理的基准语言检测
入门
用于识别文本语言的四个 Python 工具,以及速度和准确性测试
杰奎琳·布兰德韦恩在 Unsplash 上的照片
大多数 NLP 应用程序往往是特定于语言的,因此需要单语数据。为了用目标语言构建应用程序,您可能需要应用一种预处理技术,过滤掉用非目标语言编写的文本。这需要正确识别每个输入示例的语言。下面我列出了一些工具,您可以使用它们作为 Python 模块来满足这个预处理需求,并提供了一个性能基准来评估每一个工具的速度和准确性。
1)语言检测
Nakatani Shuyo 的语言检测库(版本从 03/03/2014)到 Python 的移植。$ pip 安装语言检测…
pypi.org](https://pypi.org/project/langdetect/)
langdetect
是 Google 的语言检测库从 Java 到 Python 的重新实现。只需将您的文本传递给导入的detect
函数,它将输出模型给出最高置信度得分的语言的两个字母的 ISO 693 代码。(参见本页了解 693 个代码及其各自语言的完整列表。)如果你使用detect_langs
来代替,它将输出一个列表,列出模型已经预测到的顶级语言,以及它们的概率。
from langdetect import DetectorFactory, detect, detect_langstext = "My lubimy mleko i chleb."detect(text) # 'cs'
detect_langs(text) # [cs:0.7142840957132709, pl:0.14285810606233737, sk:0.14285779665739756]
几个点缀点:
- 库制作者建议您将
DetectorFactory
种子设置为某个数字。这是因为 langdetect 的算法是不确定的,这意味着如果你试图在太短或太模糊的文本上运行它,你可能每次运行它都会得到不同的结果。设定种子在开发/评估期间强制执行一致的结果。 - 您可能还想在 try/except 块中用
LanguageDetectException
包围detect
调用,否则您可能会得到一个“文本中没有特性”错误,当给定输入的语言不能被评估时,例如当它包含 URL、数字、公式等字符串时,就会出现这个错误。
from langdetect import DetectorFactory, detect
from langdetect.lang_detect_exception import LangDetectExceptionDetectorFactory.seed = 0def is_english(text):
try:
if detect(text) != "en":
return False
except LangDetectException:
return False
return True
2)空间语言检测器
一个完全可定制的语言检测管道,用于空间安装
空间. io](https://spacy.io/universe/project/spacy-langdetect)
如果您使用 spaCy 来满足您的 NLP 需求,您可以向您现有的 spaCy 管道添加一个定制的语言检测组件,这将使您能够在Doc
对象上设置一个名为.language
的扩展属性。然后可以通过Doc._.language
访问该属性,它将返回预测的语言及其概率。
import spacy
from spacy_langdetect import LanguageDetectortext2 = 'In 1793, Alexander Hamilton recruited Webster to move to New York City and become an editor for a Federalist Party newspaper.'nlp = spacy.load('en_core_web_sm')
nlp.add_pipe(LanguageDetector(), name='language_detector', last=True)doc = nlp(text)
doc._.language # {'language': 'en', 'score': 0.9999978351575265}
3) langid
langid 特别吹嘘它的速度(下面会详细介绍)。它的工作方式类似于上面的工具,但是它还可以通过运行python langid.py
作为命令行工具使用。查看他们的回购协议,了解更多细节和其他选择。
py 是一个独立的语言识别(langid)工具。设计原则如下:快速预训练…
github.com](https://github.com/saffsd/langid.py)
要将 langid 用作 Python 库,请使用classify
函数:
import langidlangid.classify(text2) # ('en', -127.75649309158325)
您可以将最初在对数概率空间中计算的概率预测校准为可以解释为 0 到 1 范围内的置信度得分:
from langid.langid import LanguageIdentifier, modellang_identifier = LanguageIdentifier.from_modelstring(model, norm_probs=True)
lang_identifier.classify(text2) # ('en', 0.999999999999998)
4)快速文本
fasttext 指出,其预训练的语言识别模型占用的内存不到 1MB,但每秒钟能够分类数千份文件。
下载您选择的型号:
- lid.176.bin :速度更快,精度略高(文件大小=126MB)。
- lid.176.ftz :模型的压缩版本(文件大小=917kB)。
import fasttext
path_to_pretrained_model = '/tmp/lid.176.bin'
fmodel = fasttext.load_model(path_to_pretrained_model)
fmodel.predict([text2]) # ([['__label__en']], [array([0.9331119], dtype=float32)]
速度🚅
如果您计划在生产中使用需要语言识别的应用程序,速度可能是一个重要的考虑因素。下面是上述四种工具的快速基准测试。
我从 Kaggle 下载了一个包含 10,502 条推文的数据集,这些推文是从来自 130 个不同国家的公开发布的带地理标记的 Twitter 消息中随机抽取的。除了其他特征之外,它们还被标注为英语或非英语。
数据来源:https://www . ka ggle . com/rtatman/the-umass-global-English-on-Twitter-dataset。
import pandas as pddf = pd.read_csv('all_annotated.tsv', sep='\t')
Kaggle 数据集前六行
速度测试的结果!
速度测试结果
fasttext 只用了 129 毫秒就对 10,000 多个数据点进行了预测。兰吉德名列第二,其他竞争者慢了许多数量级。
准确(性)🔬
from sklearn.metrics import accuracy_scoreytrue = df['Definitely English'].to_list()
tweets = df['Tweet'].to_list()# get the predictions of each detectorlangdetect_preds = [lang_detect(t) for t in tweets]
spacy_preds = [nlp(t)._.language['language'] for t in tweets]
langid_preds = [lang_identifier.classify(text)[0] for t in tweets]
fasttext_preds = [p[0].replace('__label__', '') for p in fmodel.predict(tweets)[0]]# binarize the labelslangdetect_preds_binary = [1 if p == 'en' else 0 for p in langdetect_preds]
spacy_preds_binary = [1 if p == 'en' else 0 for p in spacy_preds]
langid_preds_binary = [1 if p == 'en' else 0 for p in langid_preds]
fasttext_preds_binary = [1 if p == 'en' else 0 for p in fasttext_preds]# evaluate accuracy against the true labels (1 for English, 0 otherwise)accuracy_score(ytrue, langdetect_preds_binary) # 0.8448866882498571
accuracy_score(ytrue, spacy_preds_binary) # 0.8448866882498571
accuracy_score(ytrue, langid_preds_binary) # 0.8268901161683488
accuracy_score(ytrue, fasttext_preds_binary) # **0.8598362216720624**
fasttext 的准确率最高,其次是 langdetect 和 spacy-langdetect。直觉告诉我 spacy-langdetect 只是引擎盖下的 langdetect。;)(它们有完全相同的准确率……这也解释了相似的库名。)
为了更好地衡量,这里是每个模型的精确度、召回率和 f1 值。
from sklearn.metrics import classification_reportprint(classification_report(ytrue, langdetect_preds_binary))
print(classification_report(ytrue, spacy_preds_binary))
print(classification_report(ytrue, langid_preds_binary))
print(classification_report(ytrue, fasttext_preds_binary))# langdetect
precision recall f1-score support
0 0.80 0.94 0.86 5416
1 0.92 0.75 0.82 5086
accuracy 0.84 10502
macro avg 0.86 0.84 0.84 10502
weighted avg 0.86 0.84 0.84 10502# spacy-langdetect
precision recall f1-score support
0 0.80 0.94 0.86 5416
1 0.92 0.75 0.82 5086
accuracy 0.84 10502
macro avg 0.86 0.84 0.84 10502
weighted avg 0.86 0.84 0.84 10502 # langid
precision recall f1-score support
0 0.79 0.90 0.84 5416
1 0.88 0.74 0.81 5086
accuracy 0.83 10502
macro avg 0.83 0.82 0.82 10502
weighted avg 0.83 0.83 0.83 10502# fasttext
precision recall f1-score support
0 0.91 0.80 0.86 5416
1 0.82 0.92 0.86 5086
accuracy 0.86 10502
macro avg 0.86 0.86 0.86 10502
weighted avg 0.87 0.86 0.86 10502
外卖食品
如果你要处理一个非常大的数据集,我会选择 fasttext。
命名实体识别基准:StanfordNLP、IBM、spaCy、Dialogflow 和 TextSpace
在这篇文章中,我们比较了 TextSpace 的命名实体识别(NER)与 StanfordNLP 、 IBM 、 spaCy 和谷歌 Dialogflow 提供的最先进的解决方案的表现。
NER 是信息提取的一个子任务,其寻求定位非结构化文本中的命名实体提及并将其分类为预定义的类别,例如人名、组织、位置、医疗代码、时间表达式、数量、货币值、百分比等。
NER 是文本空间的特征之一。要了解它在特征意图分类中的比较,请阅读这篇文章。
我们已经创建了自己的小型测试数据集,其中 11 个例子取自谷歌的模仿大师 2 数据集,该数据集刚刚于 2020 年 2 月发布。我们将该数据集视为 NER 解决方案未来研究和产品的基准数据集,因此我们非常兴奋地探索 TextSpace 与上述产品的对比情况。
这个数据集中的短语在长度和包含的信息方面可能有所不同,但我们选择了其中有很多实体的短语,因此我们可以从最先进的 NER 解决方案中分离出小麦和谷壳。我们测试集中的短语来自不同的领域,因为我们想看看我们在这篇文章中比较的解决方案有多灵活。注意,在这些例子中使用了 Dialogflow 的预定义代理,因此我们期望 Dialogflow 在这些例子中表现得近乎完美。
我们将首先详细讨论两个例子,但最后会有一个总结我们所有发现的表格。
机票预订
让我们从一个想要预订航班的用户的示例短语开始:
“哦,我想今晚某个时候乘飞机出去,4 天后晚上飞回来。从,我想去丹佛。我要飞离旧金山。”
IBM 的 MAX 命名实体 Tagger 错误地将“I”分类为事件。
IBM 的 MAX 命名实体 Tagger 表现不佳,仅返回哪些单词属于时间和地点类别。不幸的是,它甚至将“我”这个词错误地归类为第二句开头的事件。
相比之下,斯坦福大学 NER 模型表现更好。找到所有可能的实体,甚至返回正确的日期。然而,一个小小的错误发生了,那就是没有认识到“四天之夜”是属于彼此的。它把“晚上”归类为今天的晚上,而不是四天后的晚上。
spaCy NER 模型与 IBM 的表现相当,并且只返回属于时间、日期或地点类别的单词。它没有像 StanfordNLP 那样显示确切的日期。
我们的解决方案 TextSpace 在这个例子中表现很好,提取了所有可能的具有确切日期的实体,类似于 StanfordNLP。但是,TextSpace 也返回不太具体的时间段的间隔,例如“晚上”或“今晚”。首先是位置:
和时间:
不幸的是,TextSpace 也不承认“傍晚”和“4 天内”属于同一个词,它返回写作当天的傍晚,这与 StanfordNLP 完全一样。
使用 Dialogflow 预建的机票预订代理,我们得到以下平庸的结果。它能正确识别日期和时间、出发和到达城市,但完全漏掉了“4 天内”。令人失望的是,我们使用谷歌数据集和 Dialogflow 的特定领域代理来预订机票。
酒店预订
接下来,我们在下面的句子中比较这四种解决方案:
“我想在柏悦 Aviara 度假村预订一个房间,每晚 279 美元。它被评为 4.8 星。它提供一个 18 洞高尔夫球场、一个室外游泳池和网球场,外加一个水疗中心和高级餐厅。”
IBM 的 MAX Entity Tagger 整体表现令人失望。
我们从 IBM 的 MAX Entity Tagger开始。我们想要入住的酒店被识别为一个地点,而“&”被错误地识别为一个组织。例如,价格“279 美元”完全被忽略了。与我们之前的航班预订示例一样,性能相当差。
StanfordNLP 做得更好,发现“$279”是钱,是停留的时间和星星的数量。不幸的是,我们的酒店也被归类为一个位置,而不是一个组织——这可能会在一些应用程序中发挥作用,但当用户希望自动转到酒店的网站时,这可能就行不通了。它也不承认$279 的价格属于“每晚”,它返回“晚上”作为日期。
我们使用 Dialogflow 的经过预先培训的酒店预订代理,这让我们自然地期望它的结果应该至少与 StanfordNLP 的结果一样好。不幸的是,事实并非如此,甚至找不到“279 美元”的价格。它正确地将“凯悦”归类为场馆连锁,但错误地将其业务名称归类为“度假村,费用为 279 美元”。日期也完全漏掉了。
spaCy 做的和前面的例子一样差。我们的酒店“Park Hyatt Aviara Resort”被归类为设施( FAC ),这不太正确,但“279”被正确归类为货币价值。不幸的是,“spa & fine”被错误地视为一个组织。
在所有五个解决方案中,TextSpace 做得最好。它发现“Hyatt”是一个组织,货币值为“$279”,跳过“night ”,因为它知道$279 是每晚的价格,并找到所有数字。
将“Hyatt”和“$279”分别正确分类为组织和金额。
两个号码都找到了。
总体结果
正如承诺的那样,我们现在比较所有这五个解决方案在我们的测试集中的所有 11 个示例中的表现。衡量这一点的方法很简单:我们知道解决方案预先训练了哪些类别,并衡量在示例短语中找到的所有可能类别的百分比。例如,在句子“所以,我想今晚某个时候飞出去,4 天后晚上飞回来。从,我想去丹佛。我要飞离旧金山。”如果一个解决方案将“今晚”和“4 天后的晚上”分类为带有时间范围的正确日期,将“丹佛”和“旧金山”分类为地点或城市,则该解决方案将实现 100% 的精确度和召回率。换句话说,所有潜在的实体都被找到,并且都被正确分类。只要漏掉其中一个,比如说“4 天内的晚上”,四个中只有三个是正确的,这样给出的召回率是 75%。如果另外一个词被错误分类,比如说“我”是一个组织,准确率会下降到 4/5,或者 80%。如果找到了日期,但只返回“时间”或“日期”而没有精确的日期或时间,我们将减去 0.5。
与其他四个解决方案相比,TextSpace 的 NER 表现最佳,紧随其后的是 StanfordNLP。IBM 的 MAX Entity Tagger 整体令人失望。
这是这些条形图的数字:
重现我们的结果
如果你想重现这些结果,下面是我们使用的 11 个短语:
-航班预订 1:“所以,我想今晚某个时候飞出去,4 天后晚上飞回来。从,我想去丹佛。我要飞离旧金山。”
-机票预订 2:“好的,你得到了,所以看起来联合航空公司在晚上 9 点 20 分离开。这是直达航班,飞行时间为 2 小时 28 分钟,价格为 337 美元。”
-航班预订 3:“我找到了一个航班,周一早上 7:35 离开西雅图,下午 4:10 到达坦帕。”
-酒店预订 1:“柏悦阿维亚拉度假村高尔夫俱乐部和水疗中心,每晚 279 美元。它被评为 4.8 星。度假村提供 18 洞高尔夫球场、室外游泳池&网球场和水疗中心&高级餐厅。
-酒店预订 2:“stay bridge Suites Carlsbad,每晚 145 美元。它被评为 4.5 星。舒适的酒店内设有厨房的温馨套房,配有室外游泳池、健身房&和烧烤区。
-电影院 1:“木乃伊今天下午 4:30 在富豪戴维斯 5 号体育场上映。”
-电影院 2:“晚上 9:50 我有筹码在玩。晚上 10:15 我出去玩了。并在晚上 10:25 开始播放音乐 1:“这是一首由蕾哈娜原创,由一个声音儿童合唱团翻唱的歌曲《钻石》。”
-餐厅 1:“嗨,我现在在加州宜家。我在找餐馆吃晚饭。”
-餐厅 2:“我在厨房里发现了一家评级很高的餐厅,名为二楼,它是 4.3 星(满分 5 分),它被描述为精致环境中的新美国品尝菜单。听起来如何?”
-体育 1:“上周六,9 月 9 日,洛杉矶道奇队对阵纽约红牛队,比分是 1 比 1。”
查看我们的 GitHub 库了解更多关于实现的细节。
基准现成的情绪分析
来源:https://pixabay.com/
介绍
Power BI 正在越来越多地增加和促进人工智能能力;文本分析领域的功能之一是情感评分。对于不熟悉的人来说,这个想法很简单。你给预训练的模型输入一些文本,它会给出一个从 0 到 1 的分数,0 表示高度负面,1 表示正面。换句话说,像“多么了不起的产品”这样的文本应该返回一个高值(接近 1),而像“糟糕的体验”这样的文本应该返回一个接近 0 的值。
以前,除了熟悉 NLP 的基础知识之外,您还必须具备一些编码技能,而今天,更多的平台正在提供“现成的”解决方案,您所要做的就是点击几个按钮。
Power BI 就是这些解决方案之一。使用本教程,在有 Power BI Premium 容量的情况下,可以自己尝试一下。
来源:https://docs . Microsoft . com/en-us/power-bi/desktop-ai-insights
实验
设置
由于我对 Power BI 的情感分析的性能很好奇,所以我想出了一个非常基本的实验来测试它,就是将来自评论的情感分析与作者给出的实际评级进行比较。我去寻找一个产品评论的数据集,其中既有字符串形式的评论,也有数字形式的评分。
这个想法是让 Power BI 对作者写的评论进行评分,并与用户给出的实际分数进行比较。我的假设是,用户的分数反映了他或她所写评论的真实情绪。
方法学
有很多方法可以评估 AI 模型的性能。这些方法在你想要获得的数据和解释的类型上有很大的不同。对于这个测试,我选择了均方根误差或简单的 RMSE。
RMSE 通常用于测试定量预测的性能。它基本上归结为一个模型,分析每个观察的误差。通过求差值的平方,较大的误差将受到较大的惩罚。就解释而言,较低的 RMSE 表明模型的性能较好。
额外角度
为了获得更完整的图片,我决定使用 Python 添加另一个基准。Python VADER 库就像 Power BI 特性一样,是一个现成的情感分析。所谓现成的,我的意思是它不需要任何配置和培训。VADER 库非常简单,只需要几行代码:
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzeranalyser = SentimentIntensityAnalyzer()def print_sentiment_scores(sentence):
snt = analyser.polarity_scores(sentence)
return (snt[‘compound’])
该库接受一个字符串作为输入,并返回 4 个数值;
- 负分
- 中性分数
- 正面得分
- 复合分数
对于这个测试,我只使用了复合分数,因为它最接近于 Power BI 分数。
除了 Python 模型之外,我还向数据中添加了一个额外的列来生成随机分数。它只是一个随机数生成器,将随机选取 0 到 5 之间的一个值。添加随机数可以简化对 RMSE 等指标的解释。
数据
尽管有很棒的搜索引擎,如谷歌数据集搜索,我仍然主要使用 Kaggle 来寻找符合我项目需求的数据集。对于这个项目,我需要一个数据集,既包含书面评论(英文)以及数字分数。简单搜索关键词“产品评论”,我得到了一个数据集,上面有亚马逊对耳机的评论。
数据看起来像这样:
形状:(14337,4)
我将文件导入 Power BI 并运行情感分析。如果你想自己运行情绪分析,你可以在这里找到指南。在让 Power BI 添加了情绪得分栏之后,我运行了一个 Jupyter 笔记本来做性能测试。
然而,在执行测试之前,我运行了以下步骤来清理/准备数据:
- 移除不需要的列
- 重命名的列
- 移除没有审核分数的行
- 删除了没有审阅文本的行
- 将所有分数标准化为 1-5 分
- 添加了包含评论长度的列
- 增加了一列随机分数(随机数生成器)
- 为每个源添加了一个“正确”列,如果预测分数与实际分数匹配,则返回 True。
在应用 Power BI 情感分析和 Python 脚本后,数据现在看起来像这样:
形状:(13394,10)
结果呢
现在我们有了清晰格式的数据和来自三个不同来源的情感分数:
- 实际用户分数
- 功率 BI 生成的分数
- Python (VADER)评分
是时候评价他们的表现了。正如方法论中所解释的,我将使用 RMSE 或均方根误差。
模型性能
在我们查看结果的准确性之前,让我们先来比较不同来源的评分分布。使用内核密度图,我们可以得到所有三个来源的概述。
如果我们要处理完美的模型,所有的线都会重叠。正如你所看到的,在现实中,实际的用户分数和模型之间有相当大的差异。作为参考,您可以看到由随机分数组成的绿色虚线。从第一次探索来看,似乎模型在极端得分和中间挣扎时表现更好。
让我们再深入一点,看看下面的值:
- 均方根误差
- 正确得分的百分比
- 每个实际用户得分的模型得分分布
每个图表代表一个模型。在 x 轴上,您可以看到实际的用户分数,而 y 轴代表模型分数。每条竖线的点代表相应用户得分的模型得分分布。在理想情况下,红色指导线上应该只有点,这意味着模型只有与用户分数匹配的值。在一个好的模型中,最大的点(预测的较大部分)应该尽可能靠近红线。
RMSE 和正确得分百分比都表明 Power BI 模型是最好的。尽管该模型似乎不是一个完美的预测器,但我们可以肯定地说,它可以作为评论情绪的指标。对比随机打分,我们可以清楚地看到一个规律。此外,就像在内核密度图中一样,很明显,两个模型在极端得分下表现更好。
长度作为一个因素
尽管 NLP 在过去的几年里取得了巨大的进步,但仍然有很长的路要走。我们的机器人朋友仍然在与我们人类产生的所有非结构化语言作斗争。我们经常看到,情感分析更容易对较短的字符串进行评级,而不是对可能包含冲突信息的较长字符串进行评级。在某种意义上,这也适用于我们人类的理解。从评论*“伟大的产品”中把握正面情绪是非常直接的,而像这样较长的评论“我喜欢该产品,但电池不好,不如声音更好的竞争对手”*则需要更深入的分析。
根据这一理论,比较不同评论长度的模型表现似乎是明智的。在我开始将数据划分为评论长度之前,让我们用一个简单的箱线图来看看分布长度。
由于数据包含大量异常值,我将 x 轴从 0 重新调整到 100 个单词:
由于大多数评论都在 10 到 30 个单词左右,我将使用以下临界值来划分数据:
- 简短评论:0 到 15 个单词(n=6226)
- 中等评论:16 到 40 个单词(n=5021)
- 长评论:+40 字(n=2147)
现在让我们来看看新的结果:
结果非常有趣,很明显,当美联储的简短评论(RMSE 1,2)时,Power BI 模型表现明显更好,Python 模型似乎相反。然而,重要的是要补充的是,长评论的数据部分比短评论的数据部分要小得多。对于这两个模型,中等长度的评论似乎仍然优于使用完整数据集的模型。
极端值
最后,作为一名负责任的数据专家,我们应该始终从查看和理解数据开始和结束。下面你可以找到一些完全错误的评论。换句话说,它们是用户分数为 1 而模型分数为 5 的评论或者是反之亦然。让我们检查一下可能出了什么问题。
模型分数差的评论样本。
从这个随机样本可以看出,很容易理解为什么模型给出了错误的分数。审查包含以下内容:
- 错别字:"音质 bed 无法连接所有手机"
- 矛盾信息:“好,但不好”
- 评分不一致:“还不错”(用户评分:1)
结论
现成的模型性能
RMSE 为 1.2,我们可以说现成的模型当然可以作为情绪的指标。随着进一步的清理和 NLP 建模,分数可能会进一步提高,因为许多糟糕的分数是由打字错误和不一致的用户评级造成的。
尽管自我训练的模型最有可能胜过这些现成的解决方案,但理解简单性/性能之间的权衡还是很重要的。Power BI 情绪分析非常容易应用,只需几次点击,您就可以在几秒钟内获得数千条评论的评级。
其次,我们目前仍处于开箱即用人工智能的非常早期的阶段,尽管我个人更喜欢亲自动手编写代码,但我必须承认这些解决方案的未来似乎很有希望。
最后,重要的是要明白这只是一个个人实验,而不是一篇同行评议的论文。与任何研究项目一样,有一些考虑因素,如了解我如何标准化和四舍五入分数,这可能会有影响。
进一步研究
现在我们已经得出了一些结论,我们可以进行进一步的实验了。我认为以下方法可能会很有趣:
- 用更多不同的数据集重新进行实验
- 使用更多指标进行评估
- 使用不同于用户评分的另一个基准(通常是有偏差的)
- 比较比 Power BI 和 Python 库更多的工具
- 随着时间的推移,重新运行实验,因为预先训练的模型可能会改善
如果你要在上面提到的步骤中做一些研究,我会非常有兴趣阅读它,所以请标记/发送给我。
关于我:我叫 Bruno,是一名数据科学家,目前专攻 Power BI。可以通过我的网站与我联系:https://www . zhongtron . me
有一个明显的赢家?
网络安全机器学习:CVE/米特 ATT 和 CK 制图
像 Kaggle 这样的机器学习竞赛通常只有一个明确的赢家。然而,当涉及到生产部署时,许多因素起作用:成本、性能、可解释性、偏差、速度。在这里,我们研究了应用于网络安全的机器学习部署中的实际权衡。
介绍
目前网络安全领域最大的机遇之一是将脆弱性(CVEs)全面映射到米特 ATT&CK 框架中。下面,我们解释什么是米特 ATT 和 CK/CVE,商业机会的大小,并对当前竞争对手的简历与米特 ATT 和 CK 进行比较。我们将使用一个简单的入室抢劫的类比来使文章更容易理解。
类比:举个例子,大多数入室抢劫都是从侧窗进入,而不是从房门进入。有了这些信息,并意识到我在家里留了 3 扇开着的窗户,这有助于我优先考虑我的防御策略。首先,我应该关上窗户。
来源:Mitre,viaattack . Mitre(CC0)
什么是米特 ATT 和 CK?
"米特 ATT & CK 是一个基于真实世界观察的全球可访问的对手战术和技术知识库。ATT & CK 知识库被用作私营部门、政府以及网络安全产品和服务社区开发特定威胁模型和方法的基础。”—attack.mitre.org
类比:换句话说,米特里·ATT&CK 将会是强盗抢劫一所房子的剧本。(识别无人居住的房屋。确定窗口的访问路径。找到贵重物品等。)
什么是 CVEs(网络安全漏洞和暴露)?
“CVE 是一本字典,为公开披露的网络安全漏洞和暴露提供定义。CVE 的目标是通过这些定义使跨独立漏洞功能(工具、数据库和服务)共享数据变得更加容易。CVE 条目由识别号、描述和至少一个公共参考组成—cve.mitre.org
类比:在我们的入室抢劫类比中,漏洞是你房子安全中的弱点:没锁的门,坏了的摄像头,你的生日作为安全密码
为什么会将 CVEs 映射到 MITRE ATT & CK ?
当你有多个漏洞时,你应该如何分配你的时间和资源?通过结合对您的情况的了解(CVE)和对最常见的犯罪行为的理解(MITRE),您可以分配一个风险因素并采取相应的行动。然而,目前只有 4%的 CVE 被手动映射到米特 ATT 和 CKs,因此安全专业人员无法根据他们在攻击链中的角色来确定 CVE 的优先级。由于各种 APT(黑客)在 ATT&CK 框架中使用不同的途径,一些控制措施可能会产生不相称的影响,给定当前系统中的漏洞(CVE)。
类比:知道你的房子有一个坏掉的摄像头和开着的窗户,允许你优先关闭窗户,因为大多数攻击者会利用它们破门而入。然而,如果您的情况(CVE)和攻击者协议(MITRE)之间的关系偏离了 5%,您可能会优先考虑不太可能阻止抢劫的安全措施。
来源:好心,viakindlyanswer . me(CC0)
如何实现这种映射?
以下是基于价格、速度和质量的 6 种有竞争力的方法。
- 大多数供应商已经开始考虑这一点,并手动将最常见的简历映射到相应的米特 ATT 和 CK。
- 一些供应商已经构建了复杂的试探法来映射所有当前存在的 CVE。
- 一些供应商开始使用复杂的机器学习技术,包括深度学习和 NLP。
来源:好心,viakindlyanswer . me(CC0)
哪个最好?
总结:没有一个好的厂商。手动绘制在野外看到的攻击给出了一个大约 4000 个 CVE 的小列表,具有很高的准确性。启发式算法可扩展到所有 10 万个 CVE,具有很强的模型可解释性。机器学习技术的一个优点是,它们对于新出现的、以前未被启发式算法发现的 CVE 表现良好。
详情:
- 最昂贵的解决方案并不总是最好的。其中一个手动映射对完整服务收取$$$的费用,尽管它只适用于 4k CVEs。最好的机器学习解决方案用同样的钱映射+100k CVEs $ $。
- 供应商之间的差异非常大。这两种手动映射的质量差别很大,这取决于是合格的安全分析师还是 Amazon Turk 执行这项工作。由于有限的数据集大小,自然语言处理的准确性几乎是深度学习技术的两倍。
- **对于某些解决方案,效果会随着时间而改善。**虽然试探法在现有的 CVE 上表现良好,但是新出现的 CVE 可以通过自然语言技术更好地映射,这可以指示试探法的过度拟合。
结论:选择最好的取决于 1)你的具体情况,以及 2)随着新 CVE 的发布而变化。我们的元 API 满足了这两种需求。我们会在第一时间找到你最适合的,并随着新 API 的发布继续重新评估(所有这些都不需要你的共同努力)。
下一步?
如果您有自己的解决方案来绘制 CVE/米特 ATT 和 CK 的地图,请联系我们,以便加入持续基准测试,或者与 hi@kindlyanswer.me 分享您自己的模型 API。你将获得我们从中获得的收入的 90%,你保留你的知识产权,因为我们不需要代码提交。如果您是在其产品中显示 CVE 的供应商,请查看这些 API 以提高您的产品和映射准确性,并联系 hi@kindlyanswer.me 以了解更多详细信息。(从其中一个供应商处购买模型代码,购买数据转储,接收您的 API 密钥或无限制请求的登录凭证)附录
开放源码
为了提高我们工作的透明度,我们在我们的 GitHub 中共享了我们验证数据的子集。您可以随时通过推送请求为其做出贡献。为了避免供应商的欺诈,我们使用精心策划的维持数据集进行实际的基准测试。
Tableau 给数据科学家带来的好处
Tableau 在有编程和没有编程的情况下如何有用?
目录
- 介绍
- 快速简单
- SQL、R、Python 和 MATLAB
- k 均值算法
- 跨职能部门
- 摘要
- 参考
介绍
Tableau【2】对数据科学家来说越来越有用,因为它包含了更精细的功能。如果你不熟悉 Tableau,它本质上是一个工具,被几种不同类型的人在各自的职业生涯中广泛使用。您可以将数据可视化并与其他人共享,这样您就可以看到它不仅对数据科学家有好处,而且对产品经理、SQL 开发人员、数据分析师、商业智能分析师等等也有好处——这样的例子不胜枚举。但是,真正的问题是,是什么让这个工具对数据科学家特别有用?下面,我将讨论数据科学家可以获得的一些一般好处,以及一些更具轮廓的数据科学工具和利用 Tableau 的好处。
快速简单
作为一个更广泛的好处,Tableau 可以很快和简单地使用。如果您准备好了 CSV 文件,您可以在几分钟内创建一个仪表板。这个仪表板将包括几个不同的可视化表单,无论是地图、图表还是表格(等。)。实际上,您可以将字段拖放到工作表中,然后选择一个可视化效果——就这么简单。现在,让我们来谈谈如何将一些编程语言融入其中。
SQL、R、Python 和 MATLAB
您可以选择静态 CSV 文件或通过 SQL 数据库的实时连接,在 SQL 数据库中,您更新相同的查询以更新您的数据及其各自的表、仪表板和与之连接的故事。
作为一名数据科学家,你将熟悉 SQL,或结构化查询语言。为了开发数据科学模型的数据集,您需要使用 SQL ( 最有可能是)查询数据库。Tableau 使连接到您当前的 SQL 数据库变得容易,这样您就可以在 Tableau 中执行查询,然后从那里开发报告。对于数据科学,当您需要执行以下操作时,此功能会很有用:
- 可视化探索性数据分析
- 可视化模型指标
集成
— R 集成
您可以导入 R 包以及它们相关的库。更强大的是,您还可以将保存的数据模型导入 Tableau。
— Python
也被称为 TabPy ,Tableau 的这种集成允许用户使用一个可以远程执行 Python 代码的框架。一些主要用途是用于数据清理和预测算法(以及计算字段的使用)。这里有一个对 tabby[3]有用的链接:
动态执行 Python 代码,并在 Tableau 可视化中显示结果:-Tableau/tabby
github.com](https://github.com/tableau/TabPy)
— MATLAB
对于从 MATLAB 部署模型,您可以利用这种集成。它包括在预测洞察力中的使用,以及预处理数据。
当然,所有这些集成和语言都可以作为数据科学过程的一部分用于数据分析。此外,您从预测模型中得出的结果可以显示在 Tableau 中。
k 均值算法
你可以使用 Tableau 本身的机器学习算法。这种聚类算法也被称为 k-means 。其思想是通过将相似的数据从其特征中组合在一起来发现数据中的模式。您还需要确保这些相同的组不同于其他组。这种分组的技术术语包括组内平方和 (WGSS)和组间平方和 (BGSS)。在 Tableau 中,您所要做的就是加载数据,然后选择列和行,同时隔离您想要构建集群的变量。您可以根据指标自动创建集群,也可以手动强制集群数量。
由于 Tableau 侧重于可视化,您的集群将被很好地标记、交互和着色,以便于查看和理解。
在 Tableau 中使用这个流行的算法的好处是,它执行起来相当快,并且不需要您编写任何代码。
这里有一个链接,更详细地描述了 Tableau 中的聚类[4]:
聚类分析将视图中的标记划分为多个聚类,每个聚类中的标记更类似于…
help.tableau.com](https://help.tableau.com/current/pro/desktop/en-us/clustering.htm)
跨职能部门
对于数据科学家来说,Tableau 最重要的好处可能是您可以将该工具用于其主要功能——可视化地共享数据。作为一名数据科学家,你可能会在公司内部不同类型的部门遇到不同类型的人。你的工作是向他人解释你复杂的机器学习算法及其各自的结果。最好的方法之一就是把它形象化。您可以使用任何图表来描述您的模型结果—您是否对业务进行了改进,哪些数据组表现更好,等等。Tableau 在数据科学中的用例数不胜数。以下是 Tableau 在数据科学方面的一些优势。
- 很多人使用 Tableau,所以分享可视化效果会很容易
- 很多公司,所以了解一下总体情况很好
- 你可以把复杂的模型变成易读的视觉效果
摘要
正如您所看到的,Tableau 对于许多不同的角色有几个主要的好处,对于数据科学家也是如此。无论您想要简单地拖放数据以创建简单的探索性数据分析,还是在 Tableau 中从头创建模型,它都可以作为整个数据科学过程的整体工具。
总而言之,下面列出并总结了一些好处:
Quick and SimpleSQL, R, Python, and MATLABk-means AlgorithmCross-functional
感谢您的阅读!我很感激。请随时在下面发表评论,并以任何用户或数据科学家的身份写下您对 Tableau 的体验。
参考
[1]照片由凯特琳·贝克在Unsplash(2017)上拍摄
[2] TABLEAU SOFTWARE,LLC,一家 SALESFORCE 公司,TABLEAU 主页,(2003–2020)
[3] TABLEAU SOFTWARE,LLC,SALESFORCE 公司,tabby,(2003–2020 年)
[4] TABLEAU SOFTWARE,LLC,一家 SALESFORCE 公司,在数据中查找聚类,(2003–2020)
[5]由活动创建者在 Unsplash 上拍摄的照片,(2018)
本福特定律——一个简单的解释
拉蒂夫·纳塞尔在他的网飞节目中没有告诉我们的“第一位数法则”是什么,连线。
尼克·希利尔在 Unsplash 上的照片
如果你还没有看过,看看网飞系列,*连接。*很好看的节目。主持人拉蒂夫·纳赛尔讨论了流行科学中的各种主题。网飞将其吹捧为一个系列“调查我们与彼此、世界和宇宙之间令人惊讶和错综复杂的联系方式”[1]
在第四集的数字中,拉蒂夫探索了本福德定律(BL),也称为第一位数定律。据观察,许多数据集,无论是人工的还是自然的,包含的以数字 1 开头的数字比其他任何数字都多,约占所有数字的 30%。并且随后的前导数字的频率下降,直到数字 9,其在数据集中仅约 5%的数字中作为第一个数字出现。这是令人惊讶的,因为你会期望数字的九个可能的前导数字平均分布在 11%左右。
该节目着眼于商业智能的历史,并显示出各种各样的数据集,如火山的大小,古典音乐中音符的组合长度,以及公司的财务报表似乎都遵循商业智能。
有一个问题被提出,但从未真正得到回答——为什么许多数据集遵循 BL?该节目暗示 BL 的存在揭示了宇宙的某种深层宇宙计划。
这里有一个简单的解释,纳赛尔和他采访的任何人都没有提到过:
由多个独立因素的乘积组成的数据集将遵循本福特定律。
这个解释已经为人所知一段时间了[2][3][4],但并没有在节目中出现。本福德定律不是我们宇宙的神秘属性。这只是基本的数学。
概观
在本文中,我将简要介绍 BL 的背景,解释两个关键概念:正态分布和对数,展示掷骰子练习如何导致 BL,最后看看一些真实的数据集,看看这个解释是否成立。
西蒙·纽康图片来自维基媒体,公共领域弗兰克·本福特作者根据公共领域Nigrini.com的一张图片所作的图片说明
背景
本福德定律是以美国物理学家弗兰克·本福德的名字命名的,他在 1938 年发表了一篇名为“异常数字定律”的论文,描述了在数据集[5]中观察到的数字的第一个数字的频率。请注意,这种现象之前已经被加拿大天文学家西蒙·纽康在 1881 年观察到并发表过[6]。
(简短的旁注:事实上,事物经常以不是第一个发现它的人的名字命名是很常见的。事实上,对此有一个名称,斯蒂格勒的借代法则。它是由美国统计学教授斯蒂芬·斯蒂格勒在 1980 年提出的,当时他写道,没有一项科学发现是以其最初发现者的名字命名的。具有讽刺意味的是,斯蒂格勒承认,美国社会学家罗伯特·默顿之前已经发现了“斯蒂格勒定律”。)
回到本福特。他在论文中观察到,许多不同的数据集都紧密遵循以下第一位数字的分布,在下图中显示为百分比。
作者图片
本福德查看的数据集包括各种各样的东西,如城市人口、化合物的原子量、财务支出,甚至是他在某份报纸上能找到的所有数字。这是他论文的摘录。
摘自弗兰克·本福特的论文《反常数定律》,1938 年,公共领域
他继续用数学术语解释他观察到的第一个数字频率的定律,但他并没有真正提出原因。他写道,该定律“显然比我们的数字系统能够独立解释的更深入原始原因的根源。”[5]
接下来,我们将通过观察公路交通速度来了解正态分布。
正态分布
你可能已经看到了正态分布的样子。这是概率论中著名的“钟形曲线”。正态分布,也称为高斯分布,是一种变量的连续概率分布。
例如,假设一个城市的规划者想要检查高速公路上特定地点的平均速度。他们在路上放下一对传感器条,开始记录过往车辆的速度。看看下面直方图中的样本数据。
作者图片
车辆的平均速度大约是每小时 52 英里,大多数旅行者的速度在每小时 45 到 60 英里之间。有几个例外。至少有一辆车以每小时 35 英里的速度行驶,另一辆车以每小时 70 多英里的速度超速行驶。
对数
第二个关键概念是理解对数是如何工作的。对数是指数运算的反函数。对于这次讨论,我们将坚持以 10 为基数的对数,尽管也存在其他对数。例如,如果我们取 10 的 5 次方,我们得到 100,000(一个有五个零的前导 1)。所以 100,000 的对数等于 5。10,000 的对数是 4。你明白了。
对数在查看接近零的值聚集在一起的数据时非常有用,但是较高的值更分散。考虑下面的两个图表。
作者提供的图片
这两个图表在不同的水平刻度上显示相同的数据。上图显示了线性轴上的数据点,下图显示了对数轴上的数据点。请注意对数刻度上的数据点是如何更加均匀地分布的。同样在底部的图中,请注意前导数字为 1 的数字之间的间隔比其他数字之间的间隔大得多。在下一节中,我将告诉您更多关于这些间隔的信息。
在下一部分,我们将进行三次掷骰子的模拟。
照片由 Riho Kroll 在 Unsplash 上拍摄
掷骰子
为了更好地理解分布如何遵循 BL,我们来看三个使用掷骰子的模拟。
想象一下,你正在上一堂网上统计课。这是一个大班级。有一万名学生。老师要求每个学生掷出一个六面骰子,并将结果输入到电子表格中。这是结果的直方图。
作者图片
有 10,000 卷,每卷有六种可能的结果,预期结果是每种结果大约 1,666 卷。上面的结果与此接近,从数字 1 的 1,624 到数字 5 的 1,714。这是一个均匀分布的近似值。
总结掷骰子
在下一个练习中,老师要求每个学生掷骰子 100 次,然后将它们相加。每个学生的总数大约是 350 英镑。这是因为 3.5 是 1 和 6 的中间值,他们各表演了 100 个翻滚。你可以在下面的柱状图中看到结果。
作者图片
这又是我们的正态分布。有的同学考了 300 以下的低分,有的考了 400 以上的高分,但大部分都在 330 到 370 的范围内。
为什么我们会得到一个钟形曲线呢?概率论中的中心极限定理(CLT)指出,独立随机变量相加将趋于正态分布[4]。
乘法骰子滚动
在第三个也是最后一个练习中,老师要求每个学生再掷一次骰子,但只能掷 15 次,然后将每个数字相乘。产品变得相当大。平均约为 760 亿。直方图显示了下面的结果,但这次水平轴使用的是对数刻度。
作者图片
我们再一次看到我们的正态分布。但是因为 x 轴是对数标度,所以该分布称为对数正态分布。为什么我们会得到这样的分布?乘法中心极限定理(MCLT)指出,相乘的独立随机变量将趋于对数正态分布[4]。
请注意,上面直方图的 x 轴使用 10 的幂作为刻度线。结果从一百万(10⁶)到十万亿(10)不等。让我们仔细看看 x 轴上 10⁹和 10 ⁰.之间的间隔
作者图片
您可以看到大的绿色条纹跨越了大约 30%的数据段,刻度线之间的 8 个间隔从左到右逐渐变小,直到下一个绿色条纹开始。事实上,跨度正好是 BL 定义的区间的大小。
Number Interval 1-2 2-3 3-4 4-5 5-6 6-7 7-8 8-9 9-10
Log Interval .301 .176 .125 .097 .079 .067 .058 .051 .046
因为直方图中的分布有些连续(大致沿着一条平滑的线),并且它跨越许多数量级(具有七个条纹),所以可以得出这个例子中的数字将符合 B1。这些数字落入本福特大小的桶中。
这一观察在 R. M. Fewster 的论文《本福特定律的简单解释》中有所涉及。他把它和一顶有条纹的帽子联系起来。在他的类比中,帽子代表数字的对数正态分布,边缘代表 x 轴,条纹代表 30.1%的数字以 1 开头的区域。如果条纹覆盖了帽沿的一部分,那么如果条纹足够多的话,它们将覆盖整个帽子的大致相同的部分。
让我们来看看第三次掷骰子练习中前导数字的频率。
作者图片
果不其然,前导数字的频率与本福特的预测(橙色菱形)相当吻合。如果我们用更多的产品和/或更多的学生进行模拟,结果会更接近。
注意,并非所有对数正态分布的数据集都符合 BL。埃塞克斯大学的 Paul D. Scott 和 Maria Fasli 在论文“本福德定律:一个实证调查和一个新颖的解释”中阐述了这些警告。
“其分布符合对数正态分布且[标准偏差]超过 1.2 的数据应产生满足[本福特]定律的前导数字分布。可能满足这个标准的数据将:(1)只有正值。(2)具有其模态值不为零的单峰分布。(3)具有正偏态分布,其中中位数不超过平均数的一半。”保罗·斯科特和玛丽亚·法斯利
相反,并不是所有符合 BL 的数据集都具有对数正态分布。这个事实被 Anro Berger 和 Ted Hill 在他们的书“本福德定律的基本理论”[3]中涵盖。例如,他们提到组合独立的数据集将导致符合 BL。
接下来,我们将看看现实世界中的一些数据集。
本·欧布罗在 Unsplash 上的照片
城镇人口
紧随 BL 的“海报儿童”数据集之一是城镇人口。不管你看的是城市、县、州还是国家。只要你有跨越几个数量级的数百个数据点,这些数据似乎与 BL 很好地吻合。
下面是来自 2010 年美国人口普查的美国城镇数据集[9]。从只有一个人的城镇,如印第安纳州的切斯特菲尔德,到拥有 370 万人口的大城市,如洛杉矶。
作者图片
该分布显然是对数正态的,并且第一个数字紧跟 BL。
为什么城市/城镇人口具有对数正态分布?我的第一个想法是,这里可能有多个独立的因素在起作用。例如,城市有不同的面积、住房单元密度和每个住房单元的居民人数。将这些因素以及其他因素相乘,可能会得出对数正态分布。
研究了城市人口的分布。例如,有一篇 Ethan Decker 等人的论文,题为“城市规模分布的全球模式及其基本驱动因素”[10]。
“在这里,我们表明国家、地区和大陆城市的规模分布,无论是基于人口普查数据还是从遥感夜间灯光的聚集区推断,实际上都是对数正态分布通过大多数城市…为了探索生成过程,我们使用了一个简单的模型,该模型仅包含两个基本的人类动力学,即迁移和繁殖…”Ethan Decker 等人。
好吧,好像是成长的事情。接下来,我们来看看财务。
资产
金融界的许多数据集似乎都遵循 BL。会计师可以利用这一事实来帮助发现欺诈和其他违规行为。
人们发现恩福德定律适用于许多组财务数据,包括所得税或股票交易数据、公司支出和销售数据、人口统计数据和科学数据[11] —马克·尼格里尼
下图显示了俄克拉荷马州在 2019 年支付的所有费用[12]。
作者图片
您可以看到有一个对数正态分布,但它有点向左倾斜。此外,第一个数字与 BL 有一点偏差。例如,以数字 9 开头的数字似乎不合规。目前还不清楚这一分析是否表明账簿存在问题。我将把它留给审计人员来仔细检查。
辛迪·杜奇(Cindy Durtschi)等人有一篇关于这个主题的很好的论文,叫做“有效利用本福特定律来协助检测会计数据中的欺诈”[12]。该文件有一个表格,显示哪些类型的财务数据预计将遵循基本原则。
C . Durtschi,W . hill ison,C . Pacini——法务会计杂志,2004 年
注意,本福特分析可能有用的前两个例子是卖出数量*价格和**买入数量*价格。**这些值是独立因素的产物。这些类型的值的其他倍增因素可能包括税和百分比费用。如果值跨越几个数量级,这可能会使该帐户数据遵循对数正态分布。
接下来让我们来看看来自大自然的东西:河流的长度。
在前面的例子中,我们看到了具有对数正态分布并遵循 BL 的数据集,这些数据集由人类确定的事物组成:城市/城镇人口和金融行项目。但这些类型的数据集也可以在自然界中找到,很少或没有人类的参与。例如,我们将根据 data.ny.gov 的数据来看看纽约州的河流长度。
作者提供的图片
这一次,分布向右侧倾斜。我们还可以看到,前导数字为 1 的数字低于 BL 预测。后者可能是由于动态范围(最大值和最小值之间的比率)不是很大。分布直方图只有三条绿色条纹,没有一条抓住曲线的峰值。而在上面的人口和支付示例中,我们分别看到五条和六条绿色条纹。
为什么河流长度遵循对数正态分布?亚历克斯·科索夫斯基有一个合理的解释。他说…
“……河流的长度和宽度取决于平均降雨量(作为参数),而降雨量又取决于太阳黑子、盛行风和地理位置,所有这些都是降雨量的参数。”亚历克斯·科索夫斯基
等等,什么?太阳黑子影响降雨?根据美国国家航空航天局的说法,显然是这样的。所以看起来河流的长度是由多个独立的因素决定的。
自然界中还有其他地方可以找到对数正态分布的数据集。例如,Malcolm Sambridge 等人在他们的论文“自然科学中的本福德定律”[17]中探索了许多物理数据集。这是他们论文中的一个表格。
摘自 Sambridge S .、Tkalč ić H 和 Jackson A .,“自然科学中的本福德定律”
你可以看到这些数据集非常接近 BL。至于为什么会这样,Alex Kossovsky 总结得相当好[4]。
“对于本福德定律在自然科学中的流行,一个看似合理的解释是,该定律的这种物理表现是通过少数或许多乘法随机因素的累积效应获得的,所有这些因素导致对数正态分布成为最终分布……”—亚历克斯·科索夫斯基
摘要
在这篇文章中,我给出了本福德定律的概述,包括一些背景和历史。为了理解对数正态分布,我解释了正态分布和对数。通过一些理论上的掷骰子练习,我展示了多个独立变量如何导致正态分布(加法)和对数正态分布(乘法)。然后我展示了一些对数正态分布的数据集是如何符合 BL 的。最后,我浏览了三个真实数据集的示例(城市/城镇人口、应付账款和河流长度),以展示具有对数正态分布的数据集将如何遵循 BL。
未来的工作
未来的工作可能包括探索两种类型的分析,即遵守对数正态分布和遵守本福特定律,在数据集与理想值不紧密匹配时可能如何相关。这些工具一起可以帮助确定数据中任何差异的潜在原因。
感谢
我要感谢詹尼弗·林和马修·康罗伊对这个项目的帮助和反馈。
源代码
创建本文图表的所有数据和源代码都可以在 GitHub 上获得。这些源代码在 CC BY-NC-SA 许可下发布。
归属-分享相似
参考
[1]https://www.netflix.com/title/81031737,连线,20200,网飞
[2] Scott,p .和 Fasli,m .,“CSM-349 —本福特定律:一个实证调查和一个新颖的解释”,2001 年,【http://repository.essex.ac.uk/8664/1/CSM-349.pdf】T2
[3] Berger,A .,Hill,T.P .,《本福德定律的一个基本理论》,概率调查,2011 年,https://project Euclid . org/download/pdf view _ 1/Euclid . PS/1311860830
[4]科索夫斯基(Kossovsky A. E .),《战争的算术牵引与本福特定律》,2014 年,https://arxiv.org/ftp/arxiv/papers/1410/1410.2174.pdf
[5]本福特,f .【反常数定律】,美国哲学会论文集,78,551–572,1938,https://MD porter . github . io/sys 6018/other/(本福特)反常 Numbers.pdf 定律
[6] Newcomb,s .,“关于自然数中不同数字使用频率的注记”,《美国数学杂志》。4, 39–40, 1881
[7]施蒂格勒 s .,《施蒂格勒的借代法则》,1980 年,https://archive . org/details/science social str 0039 unse/page/147/mode/2up
[8] Fewster,R.M .,《本福特定律的简单解释》,美国统计学家,第 63 卷,2009 年第 1 期,https://www . stat . Auckland . AC . NZ/~ few ster/rfe wster _ Ben Ford . pdf
[9]美国人口普查数据,2010 年,https://www2.census.gov
[10]e . h .德克尔、A. J .克霍夫和 M. E .摩西(2007 年)。城市规模分布的全球模式及其基本驱动力。 PloS 一,二 (9),e934。https://doi.org/10.1371/journal.pone.0000934
[11]m . j .尼格里尼,“我有你的号码”,会计杂志,1999 年,https://www . Journal of Accountancy . com/issues/1999/may/Nigrini . html
[12]俄克拉荷马州,《俄克拉荷马州公开数据》,https://data.ok.gov,2019
[13] Durtschi,c .,Hillison,W. Pacini C .,“有效利用本福特定律协助检测会计数据中的舞弊”,法务会计杂志,2004 年,http://www . agacgfm . org/AGA/fraud toolkit/documents/benfordslaw . pdf
[14]纽约州,水体分类,2019 年,https://data . ny . gov/Energy-Environment/water body-Classifications/8xz 8-5u5u
[15] Kossovsky A. E .,“对前导数字现象的更好理解”,2006 年,https://arxiv.org/ftp/math/papers/0612/0612627.pdf
[16]林德博士,“太阳周期的变化会影响我们的气候系统吗?”科学简报,美国国家航空航天局戈达德太空研究所,2009 年,https://www.giss.nasa.gov/research/briefs/rind_03/
[17] Sambridge S .、Tkalč ić H 和 Jackson A .,“自然科学中的本福特定律”,地球物理研究通讯,第 37 卷,L22301,2010 年https://agu pubs . online library . Wiley . com/doi/epdf/10.1029/2010 GL 044830
为了无限制地访问 Medium 上的所有文章,成为会员,每月支付 5 美元。非会员每月只能看三个锁定的故事。
第一部分:孟加拉语。人工智能手写字形分类
工作主持人: 大卫·柯布迪杰森·卡茨迈克尔·哈德奈娜·沃顿**
作为世界上第五大通用语言,孟加拉语也是最复杂的语言之一。孟加拉语的字母表由 11 个元音、7 个辅音和 168 个字母词根组成。这导致了大约 13,000 种不同的字符变化;相比英语的 250 个字符的变化。
这个博客是为了记录我们团队在孟加拉卡格尔比赛中的努力而制作的。AI 手写字形分类比赛。在这个项目中,我们使用卷积神经网络(CNN)来建立一个模型,该模型可以根据元音、辅音和石墨烯的根来正确识别任何给定石墨烯的属性。虽然这个任务并不容易,但 Kaggle 给了我们很多工作。
数据以包的形式出现,然后与包含基于图像 id 的目标变量的测试/训练数据合并。而比赛的训练数据直到比赛当天才公布;提供的数据集很大,将用于 CV。
在上面提供的链接中,你可以找到我们自己的端到端的 MVM(最小可行模型)。我们使用了一些 Kaggle 笔记本,这些笔记本为如何预处理数据、合并数据集和解决问题树立了榜样。通过引导它们,我们能够生产出无缝工作的产品,交付相对成功的结果。下面的图 1 显示了目标类:
图一(https://www.kaggle.com/c/bengaliai-cv19/discussion/122421)
在查看了一些在公共 Kaggle 竞赛中执行的 EDA 之后,我们决定通过分析图素内类值的分布来进行探索性数据分析。EDA 的一个重要组成部分是可视化字形图像,以更好地理解字形的广泛变化。
图 2(https://www . ka ggle . com/kaushal 2896/Bengali-graphemes-starter-EDA-multi-output-CNN)
图 3
一个特别有趣的可视化(见图 4)是按数字和计数的字形根和辅音音调符号的热图。这个图表特别具有启发性,因为它向我们展示了最常见的元音-辅音发音符号是 0–115、0–133 和 0–113。一般来说,最常见的辅音发音符号是 0 辅音。
图 4(https://www . ka ggle . com/gp reda/Bengali-ai-handled-grapheme-getting-started)
引用下面图 5 中的代码块和图 6 中的模式;初始模型首先使用带有 ReLU 激活和填充的卷积层。随后是批量标准化和最大池层。然后,具有 ReLU 激活和填充的另外两个卷积层被应用到最大池层中。再次应用两个卷积层进入最大池的序列。在使用具有 ReLU 激活和丢弃的两个密集层之前,网络具有平坦层。最后,网络分成三个分支。根据网络的分类,输入图像是字素 _ 词根、元音 _ 发音符号或辅音 _ 发音符号;使用 softmax 激活的最终密集层应用的神经元数量等于给定图像类型中可能类别的数量。
图 5
图 6
如上所述,基线卷积神经网络的输出分支对组成孟加拉语字母表的三个不同部分进行分类:字素根、元音发音符号和辅音发音符号。因此,当我们分析基线模型时,我们需要考虑三个不同部分的准确性。
该模型被训练了 1413 个步骤,并在 5021 个样本上进行验证。出于时间和效率的目的,历元的数量被设置为 5,其中每个历元向前和向后通过所有 1413 个步骤。在 5 个时期之后,在验证集上评估模型,并且输出对应于字母表的组成部分的三个准确度值。为神经网络选择 adam 优化器和分类交叉熵损失函数。
图 7
不出所料,字形根具有最低的验证准确性值 0.6963,训练准确性为 0.6710(见图 8)。当我们考虑到该模型需要正确分类 168 个字素根时,较低的准确性分数是有意义的,其中许多字素根看起来非常相似(见图 1)。当我们考虑到字素是手写的时,又增加了一层复杂性,因为看起来相似的字素很容易被错误分类。
图 8
元音变音符号(11 类)和辅音变音符号(7 类)被很好地分类,分别具有. 9185 和. 9209 的高准确度分数。虽然这些精度值相当高,但在类数量较少的情况下,这些值并不意外。图 9 和图 10 描绘了发音符号的训练和验证分数。注意,在这两个图中,训练和验证曲线相交。
总的来说,我们的基线模型表现得相当好。接下来的步骤包括通过增加模型被训练的时期的数量来改进基线模型,尝试不同的优化器如 nadam,测试不同的激活函数和超调不同的参数。
我们计划追求的另一个途径是使用迁移学习来训练和构建我们的模型。我们发现了一篇发表于 2019 年 2 月的论文,该论文在深度卷积神经网络(链接如下)和相应的 GitHub 页面上使用了迁移学习,该页面具有与神经网络对应的权重和代码。这篇新颖的论文在“BanglaLekha-Isolated dataset”(chatter JEE et al .,2019)上经过 47 个时代后,达到了 96.12%的非常高的准确率。因此,我们希望将论文和 GitHub 代码中概述的神经网络用于我们的项目。请注意,我们还计划利用数据扩充来提高我们的模型准确性。当检测现实生活的原始数据时,数据扩充可以导致更稳健的模型(通过训练图片的空间方向/大小的变化)。
附加数字:
图 9
图 10
图 11(精确度图表代码)
链接和资源:
**转移我们下一步计划使用的学习论文和 Github 代码:【https://arxiv.org/html/1902.11133】
**我们用来获取启动代码和引导程序的笔记本:https://www . ka ggle . com/deshwalmahesh/Bengali-ai-complete-beginner-tutorial-95-ACC/data,https://www . ka ggle . com/chekoduadarsh/tutorial-design-your-own-CNN-layer-by-layer,https://www . ka ggle . com/chekoduadarsh/multi-output-cn
**我们为 EDA 查阅的笔记本:https://www . ka ggle . com/kaushal 2896/Bengali-graphemes-starter-EDA-multi-output-CNN,https://www.kaggle.com/pestipeti/bengali-quick-eda,https://www . ka ggle . com/gp reda/Bengali-ai-handled-grapheme-getting-started
柏林房屋租赁市场分析
我支付的价格公平吗?
简介
不久前,柏林曾是一个与低生活成本相关的地方,吸引了许多以低廉价格寻求高质量生活的人。然而,也许由于这种流行和其他宏观经济变化,那些日子已经成为过去。
问问目前住在柏林的任何人,他们都会告诉你获得房屋租赁合同有多难,这不仅是因为报价稀缺和对公寓的大量需求,也是因为价格飙升,尽管国家采取了监管措施。
有了以上的基调,并发现自己正在寻找一个新的住处,我决定使用数据驱动的方法来帮助我进行搜索,并给我基于数据做出好决定的信心。因此,在这篇文章中,我将描述我在这个过程中的一些发现。
在几个月的时间里,我从网站上收集了一些柏林某些地区的市场数据——有些地区没有包括在内,因为我不想在那里生活。根据我收集的数据,我有兴趣回答几个有助于我搜索的问题,但主要问题是:
- 最贵和不贵的地区有哪些?
- 什么时候发布新房源最受欢迎?
- 我支付的价格公平吗?
- 是什么让一些房源比其他房源更有吸引力?
我会在这篇文章中尝试回答这些问题,所以请继续阅读!
最贵和最便宜的地区是哪里?
我想看看我的预算允许我住在哪里,因此知道某个地区的平均要价是第一步。
澄清 暖价 的含义很重要:在德国房价通常分为冷价和暖价,分别对应于取暖费、维修费、垃圾收集费和其他维护费用前后的价格。因此,我们最感兴趣的租赁成本是温暖的价格。
下面的柱状图以降序显示了该数据集中柏林最昂贵的地区。正如我们所料,最昂贵的区域是 Mitte、Tiergarten、Friedrichshain、Prenzlauer Berg 和 Kreuzberg,这些区域通常是城市的标志性区域,因此更受欢迎。另一方面,我们有 **Wedding、Schö neberg、Lichtenberg 和 Treptow,**可以认为是在市中心之外,因此比预期的要便宜。
什么时候发布新房源最受欢迎?
由于市场竞争非常激烈,房源消失得非常快,我很想知道新房源出现的最受欢迎时间,这样我就可以更快地做出反应。
在下图中,我们可以看到列表发布的时间分布。据观察,发布新列表的最受欢迎的时间是在早上,在午餐时间之前达到高峰(12:00-13:00)。
我支付的价格合理吗?
也许最有趣的问题是,我想知道一个房源的要价是否合理,这样我就可以有一个申请公寓或者更重要的是接受报价的依据。
为了实现这一点,我建立了一个线性回归模型来预测最终(温暖)价格,使用公寓是否有阳台、花园或内置厨房,是否是新的或最近装修的,是否来自私人或房地产中介,总居住面积,房间数量或其所在的地区等变量作为特征。
结果如下所示,其中指标的相对强度以降序绘制(正的和负的)。
可以得出结论,最强的指标是公寓是否位于 Wedding 或 Schö neberg,这对价格有负面影响。有点不奇怪的是,一套带有嵌入式厨房或花园的公寓与较高的价格密切相关,但也许更令人惊讶的是,房间数量具有负系数,这意味着房间数量越多,最终价格越低。
尽管居住空间的系数与其他相比相对较低,但人们必须考虑到这是一个连续变量,其变化比布尔变量(在 0 和 1 之间变化)大得多。因此,居住面积每增加一个单位(1 平方米),价格预计将增加约 6 欧元。
有了这个模型,我对自己的决定变得更加自信,并且能够判断一套公寓的要价是否公平。
是什么让一些上市公司比其他公司更有吸引力?
另外,我还想知道上市公司的哪些特征对了解上市公司是否有吸引力更重要。为此,我用一个列表保持在线的时间作为衡量标准,在线时间越短,吸引力和兴趣越高。
为了实现这一点,我运行了一个线性回归模型来预测一个列表保持在线的时间,使用的功能与之前线性模型中使用的相同,加上温暖价格和温暖价格与寒冷价格之间的标准化差异。模型的结果如下图所示。
在这种情况下,如果一个系数为正,那么它与更多的在线时间相关联,反之亦然。例如,可以得出这样的结论:如果一个房源是新建的(或已经翻修过的),有更多的房间或更大的居住空间,有阳台或内置厨房,或者位于 Schö neberg、Tiergarten、Mitte、Treptow 或 Kreuzberg 等街区,那么它在网上停留的时间就更短(受到更多的关注,更快地找到某个人)。另一方面,如果价格差异或温暖价格较高,或者如果房源位于 Lichtenberg、Wedding 或 neuklln 等吸引力较低的街区,则房源会在网上停留更长时间。有点令人惊讶的是,有花园的列表与更多的在线时间相关联。
结论
在这篇文章中,我们通过分析一个由柏林在线出租公寓组成的数据集,获得了一些见解。更具体地说,我们:
- 看到最贵的调查小区是 Mitte ,最少的是 Wedding 。
- 看到发布新房源最热门的时间是在早上。
- 观察到最重要的暖价预测指标是房源是否位于婚礼或舍内贝格附近,以及是否有嵌入式厨房或花园。
- 得出的结论是,与对房源更感兴趣最相关的特征是:它是否是新的、有内置厨房、阳台、房间和居住空间。至于最受欢迎的地区,我们看到最有吸引力的街区是舍内贝格、蒂尔加滕、米特、特雷普托和克罗伊茨贝格。
希望这能对你将来在柏林寻找公寓有所帮助!要查看更详细的分析,请查看 Github repo 。