TowardsDataScience-博客中文翻译-2020-二十一-

龙哥盟 / 2024-10-15 / 原文

TowardsDataScience 博客中文翻译 2020(二十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 中数据科学库的初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-data-science-libraries-in-python-4b1a9326b712?source=collection_archive---------27-----------------------

一个开始数据科学爱好或职业生涯的地方。

卢卡斯·布拉塞克在 Unsplash 上的照片

数据是当今所有行业的驱动力。从分析和预测股市趋势的量化交易者,到预测新生儿流行病严重性和病毒传播的医疗保健专业人员,数据是一切事物共有的关键因素。使用计算器或 excel 电子表格很容易分析少量数据,但一旦计算变得复杂,数据量呈指数级增长,我们就需要更强大的工具。这就是软件分析和数据科学的用武之地。

虽然现在有很多可用的软件分析工具,比如 Matlab 和 R,但是我今天重点关注的是 Python。Python 在数据分析方面非常强大,因为许多人多年来已经构建了大量的库。尽管如果您想从事数据科学方面的职业,尽可能全面地学习这些库是很重要的,但是我将浏览一些人们通常开始使用的初学者库。

NumPy

这是所有数据科学家需要学习的最基础的库。它提供了科学计算中的所有基本功能,能够快速处理大量数据。下面的代码是 NumPy 能做什么的一个简单例子。

使用 NumPy 进行科学计算的示例

上面的代码将产生以下输出:

Input:  [0, 1.5707963267948966, 3.141592653589793, 4.71238898038469, 6.283185307179586]Sine values:  [ 0.0000000e+00  1.0000000e+00  1.2246468e-16 -1.0000000e+00-2.4492936e-16]Cosine values:  [ 1.0000000e+00  6.1232340e-17 -1.0000000e+00 -1.8369702e-161.0000000e+00]Sine values:  [ 0\.  1\.  0\. -1\. -0.]Cosine values:  [ 1\.  0\. -1\. -0\.  1.]

从下图可以看出这是有道理的:

NumPy 还可以进行更复杂的计算,如下所示,它为自动驾驶汽车中的卡尔曼滤波器计算复杂的矩阵:

有一个用于各种科学计算的内置函数的巨大集合,如果你对这个感兴趣,NumPy 是你需要掌握的库。要了解更多信息,请访问 NumPy 的官方文档网站。

熊猫

这是 Python 中最基本的数据分析和操作库。该库能够快速将大型原始数据文件读入 DataFrame 对象,通过自动索引和数据对齐执行各种数据清理和数据挖掘操作,对 DataFrame 表执行所有可能的 SQL 查询,如连接和合并,然后将数据输出到另一个数据文件,甚至直接输出到可视化中。

在 Python 环境中使用 pandas 的真正好处是,Python 是一种脚本语言,这意味着代码可以在不编译的情况下执行。因此,数据科学家可以通过打开 Python 终端执行快速分析,如下所示:

使用 pandas,数据科学家可以通过查询其 clientId 轻松搜索与某个客户相关的数据,并将其与其他原始数据集相结合,就像工程师通常使用数据库但现在使用原始数据文件一样。此外,数据科学家可以使用如下一行代码轻松生成各种可视化效果:

df = pd.DataFrame('some data...')df.plot(x='label1', y='label2', kind='scatter', ...)

面积与人口的样本散点图[ 来源

总而言之,pandas 提供了一种简单的方法来读/写数据,并使得对原始数据文件执行分析变得非常简单和快速,并且是任何数据科学家的武器库中的一个重要工具。要了解更多关于熊猫的信息,请访问官方文档网站。

SciPy

SciPy 库是 NumPy 和其余的 SciPy 栈之上的抽象层。该库包括许多数值例程,如数值积分、插值、优化、线性代数、统计、特殊函数、FFT、信号和图像处理、ODE 求解器以及科学和工程中常见的其他任务。因此,这个库更适合于数学函数,从学术的角度来看,它是为科学家和工程师所做的计算而定制的。要了解更多信息,请访问官方文档网站。

sci kit-学习

Scikit-Learn 库是在 SciPy 基础上进一步抽象的,更加实用和注重应用。该库包括更多关注机器学习应用的函数,如回归、分类、聚类等。热衷于机器学习的人肯定会想了解更多关于这个库提供的功能。例如,通过运行以下代码,您可以轻松地对一组原始数据运行 RANSAC 线性回归:

*# generate random data with a small set of outliers*
np.random.seed(0)
X[:n_outliers] = 3 + 0.5 * np.random.normal(size=(n_outliers, 1))
y[:n_outliers] = -3 + 10 * np.random.normal(size=n_outliers)

*# Fit line using all data*
lr = [linear_model.LinearRegression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression)()
lr.fit(X, y)

*# Robustly fit linear model with RANSAC algorithm*
ransac = [linear_model.RANSACRegressor](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RANSACRegressor.html#sklearn.linear_model.RANSACRegressor)()
ransac.fit(X, y)
inlier_mask = ransac.inlier_mask_
outlier_mask = [np.logical_not](https://docs.scipy.org/doc/numpy/reference/generated/numpy.logical_not.html#numpy.logical_not)(inlier_mask)

*# Predict data of estimated models*
line_X = [np.arange](https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html#numpy.arange)(X.min(), X.max())[:, [np.newaxis](https://docs.scipy.org/doc/numpy/reference/constants.html#numpy.newaxis)]
line_y = lr.predict(line_X)
line_y_ransac = ransac.predict(line_X)

原始数据散点图和数据的线性回归与 RANSAC 回归[ 来源

Scikit-Learn 还包括一个非常有用的包,叫做预处理,非常适合数据挖掘和清理/整理原始数据。这个软件包包含的功能有归一化、将数据缩放到某个范围、缩放稀疏数据,甚至执行非线性转换,如将数据映射到均匀分布。此外,它还有一个随机分割数据以用于模型的功能:

sklearn.model_selection.**train_test_split**(**arrays*, ***options*)[[source]](https://github.com/scikit-learn/scikit-learn/blob/95d4f0841/sklearn/model_selection/_split.py#L2020)

使用 Scikit-Learn,数据科学家只需几行代码就可以创建机器学习模型。要了解更多关于 Scikit-Learn 的信息,请访问官方文档网站。

matplotlib.pyplot

这个库虽然与数据科学的分析部分无关,但也是一个值得学习和使用的关键库。这个库是 Matlab 绘图功能的 Python 改编版。这个库能够生成任何东西,从简单的散点图、直方图、线图到复杂的热图、3D 图、日蚀图、流图等等。这些图的一些例子如下:

带颜色编码的样本散点图[ 来源

3D 绘图示例[ 来源

2D 阵列的可视化示例[ 来源

数据可视化是数据科学的一个重要组成部分,因为如果没有一种以可理解的方式传达结果的方法,所有的分析都是无用的。数据可视化肯定有更好的选择,但大多数是付费的或需要订阅的。Matplotlib 提供了一种可视化数据的 Python 原生方式,这绝对是一个有抱负的分析师应该学习的东西。

结论

还有很多 Python 库我没有介绍。有很多针对生物信息学、深度学习和人工智能、自动驾驶等的图书馆。然而,这里概述的库在数据科学中被广泛使用,并且是许多高级 Python 库的构建块。我相信熟悉这些库将为想要探索数据科学领域的初学者打下坚实的基础。如果你认为还有其他有用的 Python 库,请在下面的评论中分享。

TensorFlow 深度学习初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-deep-learning-with-tensorflow-ca85969b2f2?source=collection_archive---------44-----------------------

使用 TensorFlow 启动并运行您的第一个神经网络

迈克·刘易斯 HeadSmart 媒体在 Unsplash 上拍摄的照片

由谷歌大脑团队于 2015 年开发的 Tensorflow ,是最受欢迎的深度学习框架。这很大程度上是由于它对多种语言的支持,Tensorflow 是用 C++编写的,但你可以通过 Python,Javascript,Go 和 r 与它进行交互,除了它灵活的架构和可扩展性(模型可以在 GPU 和 CPU 上训练,并通过 web 服务,桌面应用程序或移动设备进行部署)。

本文是该工具的完整初学者指南。它不是一个深入的介绍,而是旨在让您开始开发您的第一个深度学习模型。

在我看来,很难找到不包含大量复杂性和繁重数学的深度学习教程。我个人学习得最好的方法是获取足够的知识来建立一个有效的模型,然后在我使用这种方法解决更复杂的问题时学习更多的复杂性。

本教程旨在通过一个不太简单的数据集演示 TensorFlow 的基本用法(演示在现实世界的机器学习问题中遇到的一些复杂性),并提供足够的理论,以便能够自己构建一些东西,然后通过更复杂的文章和课程进一步发展这些知识。

神经网络

在我们开始使用 TensorFlow 构建模型之前,我将简要介绍基于神经网络的算法的概念,因为首先对这个概念有一个基本的了解是一个好主意。

TensorFlow 主要用于开发高度可扩展的基于神经网络的模型。神经网络,通常称为人工神经网络(ANN ),是机器学习(称为深度学习)的子集,大致基于生物信息处理和通信节点的工作方式。

深度神经网络(DNN)是人工神经网络的一种特定形式,在 Tensorflow 中使用,由输入(特征)和输出(目标或预测)之间的若干层组成。当模型被训练时,通过每一层执行数学计算,计算特征代表特定输出或标签的概率。

数据准备

在本文的剩余部分,我们将通过一个例子来使用 TensorFlow 进行分类任务。我们将使用来自 openml.org 网站的数据集,名为‘credit-g’。这包括银行公司客户的一些特征和一个类别,该类别表示发现客户的信用风险是好还是坏。

我们可以使用另一个机器学习库 Scikit-learn 将数据集直接导入到 Python 开发环境中。我在用 Jupyter 实验室。在下面的代码中,我们还将标记为“class”的列重命名为“target ”,以便与 TensorFlow 命名约定更加一致,并将其转换为数值数据,因为 TensorFlow 无法处理目标变量的字符串数据。

数据集中的行和列的样本

来自 Openml.org 的数据集倾向于使用 Pandas 特有的数据类型“category”作为分类列。由于 TensorFlow 无法识别此数据类型,我们需要执行一个额外的步骤,将数据类型为“类别”的列转换为“对象”。

接下来,我们将数据分为训练集、测试集和验证集。

TensorFlow 不能直接获取熊猫数据帧。相反,我们需要将数据帧中的列映射到可用于训练模型的特征。TensorFlow 有一个名为[tf.data](https://www.tensorflow.org/guide/data)的方法,用于为不同的数据类型构建输入管道。

在 TensorFlow 中,您将经常使用批处理,这是要处理的相对较小的数据样本。下面的代码创建了一个函数,将 dataframe 批量映射到 tf.data 对象(摘自 TensorFlow 文档)。

创建要素图层

我们正在处理的数据集包含许多不同的要素类型,它们需要不同的变换。例如,我们有一些分类特征,如“personal_status”列和一些数字列。

在 TensorFlow 中,我们可以应用必要的转换,并将它们编码为 feature_columns,这些列被提供给一个特征层,该特征层将成为我们神经网络的第一层。作为网络的第一步,该层将把该训练数据的每个例子转换成单个张量

要在 Tensorflow 模型中使用列作为特征,我们需要使用 feature_columns 方法。有许多不同的 feature_column 方法可以执行不同的转换,并将转换后的要素提供给模型。

对于我们的数据集,我们将使用三种不同的转换。

下面的代码首先创建一个名为 feature_columns 的空列表,我们将向其中追加不同的特性列类型。第一个转换使用 one-hot-encoding 通过[feature_column.categorical_column_with_vocabulary_list](https://www.tensorflow.org/api_docs/python/tf/feature_column/categorical_column_with_vocabulary_list)方法来转换分类特征。

然后,我们使用[feature_column.bucketized_column](https://www.tensorflow.org/api_docs/python/tf/feature_column/bucketized_column)方法将“age”列转换为分时段组。

最后,我们使用[feature_column.numeric_column](https://www.tensorflow.org/api_docs/python/tf/feature_column/numeric_column)为剩余的数字数据创建特征列。

现在,我们可以使用 feature_columns 来创建要在神经网络中使用的要素图层。

训练模型

我们现在可以构建神经网络,并用特征层中的数据训练和评估模型。在下面的代码中,我们正在构建一种最常见的模型,称为序列模型。这是从要素图层开始的一系列图层。

第二层和第三层被称为活化层。在基本层面上,每个激活层从特征层获取输入,并将其乘以每个节点中的权重。最常用的激活功能被称为整流线性激活单元 (ReLU),在下面的代码中的每个激活层中都有规定。

model.compile代码中,我们指定算法类型为' adam ',其他可用的优化器可以在这里找到。

训练模型的性能输出如下所示。

网络中的层数和每层中的节点数(上述模型中两个激活层中的数字 128)都会影响模型的性能。因此,提高性能的一种方法是对这些元素尝试不同的数量。此外,与其他机器学习算法一样,其他优化包括超参数调整、特征选择和增强的特征变换。

本文给出了使用 TensorFlow 解决分类任务的基本介绍。如果你想探索一些讨论过的概念, fastai 课程实用深度学习课程对于程序员来说是非常好的免费课程。

本教程的完整笔记本可以在这里找到。

感谢阅读!

我每月发一份简讯,如果你想加入请通过这个链接注册。期待成为您学习旅程的一部分!

动态编程初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-dynamic-programming-8eff07195667?source=collection_archive---------3-----------------------

(照片由克里斯里德在 Unsplash 上拍摄)

编程教程

使用一些简单的技术优化你的代码

动态编程是一门艺术,你解决的问题越多,就越容易。

有时当你写代码时,可能需要一些时间来执行,或者即使你的逻辑是好的,它也可能永远不会运行。在解决 Google Foobar 挑战问题时,我也遇到了同样的问题,我意识到这个解决方案并没有优化,而是使用了所有可用的 RAM(对于大值)。

需要一种完全不同的方法来解决此类问题,即通过遵循动态编程的概念来“优化代码”。

什么是动态编程?

动态规划是一种非常好的方法,可以应用于一类问题,以获得有效和最优的解决方案。

简而言之,动态编程背后的概念是将问题分解为子问题,并将结果保存起来以备将来使用,这样我们就不必再次计算同样的问题。优化整体解决方案的子问题的进一步优化被称为最优子结构性质。

可以应用动态编程的两种方式:

自上而下:

在这种方法中,问题被分解,如果问题已经解决,则返回保存的值,否则,函数值被记忆,即它将被第一次计算;每隔一段时间,存储的值将被回调。对于计算量大的程序来说,记忆化是一个很好的方法。不要混淆记忆和记忆。

记忆!=记忆

自下而上:

这是一种通过降低递归增加的时间复杂度(即,由于重新计算相同的值而导致的内存开销)来避免递归的有效方法。在这里,对小问题的解决方案进行计算,从而建立对整体问题的解决方案。(通过本文后面解释的例子,您会对此有更清晰的了解)。

了解在哪里使用这种技术

如上所述,如果您注意到问题可以被分解为子问题,这些子问题可以被分解为更小的子问题,并且其中一些子问题有重叠(即需要计算之前计算的值)。主要目标是通过存储子问题的结果来减少值的重复,从而优化代码。

动态规划可以应用于任何需要重新计算某些值以达到最终解决方案的问题。

递归和动态编程

记住,动态编程不应该与递归混淆。

递归是一种通过直接或间接用一个函数的其他值来表示该函数的值来求解的方法,这种函数称为递归函数。它遵循自上而下的方法。

动态编程只不过是带记忆的递归,即计算和存储值,这些值可以在以后被访问以解决再次出现的子问题,从而使你的代码更快并降低时间复杂度(计算 CPU 周期减少)。

这里的基本思想是通过有效利用空间来节省时间。递归需要时间,但不需要空间,而动态编程使用空间来存储子问题的解决方案以供将来参考,从而节省时间。

通过示例了解动态编程

让我们从斐波那契数列的一个基本例子开始。

斐波那契数列是一个数列,从 0 和 1 开始,每个数字都是前两个数字的和。

F(n) = F(n-1) + F(n-2)

  • 递归方法:
def r_fibo(n):
   if n <= 1:
       return n
   else:
       return(r_fibo(n-1) + r_fibo(n-2))

在这里,程序会一次又一次地调用自己来计算进一步的值。基于递归的方法的时间复杂度的计算大约为 O(2 ^N).这种方法的空间复杂度是 O(N ),因为递归可以达到最大值 N。

举个例子——

F(4)= F(3)+F(2)=((F(2)+F(1))+F(2)=((F(1)+F(0))+F(1)+(F(1)+F(0))

在这个方法中,像 F(2)这样的值被计算两次,对 F(1)和 F(0)的调用被多次进行。想象一下重复的次数如果非要计算的话 F(100)。该方法对大值无效。

  • 自上而下法
def fibo(n, memo):
  if memo[n] != null:
    return memo[n]
  if n <= 1:
    return n
  else:
    res = fibo(n-1) + fibo(n+1)
    memo[n] = res
    return res

这里,计算时间大大减少,因为每次递归后产生的输出都存储在一个列表中,以后可以重用。这个方法比前一个效率高得多。

  • 底部向下
def fib(n):
  if n<=1:
    return n
  list_ = [0]*(n+1)
  list_[0] = 0
  list_[1] = 1 
  for i in range(2, n+1):
    list_[i] = list_[i-1] + list[i-2]
  return list_[n]

这段代码根本没有使用递归。这里,我们创建一个长度为(n+1)的空列表,并在索引位置 0 和 1 处设置 F(0)和 F(1)的基本情况。创建此列表是为了使用索引值 2 到 n 的 for 循环存储相应的计算值。

与递归方法不同,该代码的时间复杂度是线性的,并且计算解所需的时间要少得多,因为循环从 2 运行到 n,即,它在 O ( n )中运行。这种方法是编写程序的最有效方式。

时间复杂度:O(n) <<< O(2​^N)

Now, let’s see another example (this is an intermediate level problem):

(Photo by 作者 ) Google Foobar 挑战问题

问题陈述: 你要以这样的方式建造一个楼梯,每种类型的楼梯都应该由 2 个或更多的台阶组成。不允许两个台阶在同一高度,每个台阶都必须低于前一个台阶。所有步骤必须至少包含一块砖。一个台阶的高度被归类为组成该台阶的砖的总量。
例如,当 N = 3 时,你只有 1 个如何建造楼梯的选择,第一级台阶的高度为 2,第二级台阶的高度为 1 即(2,1)。但是当 N = 5 时,有两种方法可以用给定的砖块建造楼梯。这两个楼梯的高度可以是(4,1)或(3,2)。

编写一个名为 solution(n)的函数,它取一个正整数 n,并返回恰好可以用 n 块砖建造的不同楼梯的数量。n 永远至少是 3(所以你完全可以有一个楼梯),但不超过 200。

这是我在 Google Foobar 挑战赛 第三关必须解决的问题。我建议你在阅读解决方案之前先自己尝试一下这个问题,它会帮助你更好地理解这个概念。****

解决这个问题的直观方法:

  • 我的第一个直观方法是创建一个到n的整数列表l
  • 然后将列表l中所有可能的整数组合追加到一个新列表sol中。
  • 并且,在最后一步,我使用了一个 for 循环来检查列表sol中每个元素的总和是否等于所需的值。如果条件为真,则该元素被附加到另一个新列表final。并且返回final的长度作为问题的最终解。
from itertools import combinationsdef solution(n):
  l = []
  for i in range(1,n):
    l.append(i)
  sol = []
  for k in range(2,len(l)+1):
    for m in combinations(l,k):
      sol.append(m)
  final = []
  for z in (sol):
    if sum(z) == n :
      final.append(z)
  steps = len(final)
  return (steps)
solution(100)

这个代码结果是非常无效并且对于大值无效因为同样的原因,即高时间复杂度和某些值的重复计算。为大值(如 100)运行这段代码将会使用所有可用的 RAM,代码最终会崩溃。

同一个问题的自底向上方法:

def solution(n):
  a = [1]+[0]* n
  for i in range(1, n+1): 
    for k in reversed(range(i, n+1)):
      a[k] = a[k-i] + a[k]
  return a[n] - 1
  • 在第一步,启动一个空列表‘a’来存储来自进一步循环的所有值。
  • 在外部循环的每一次迭代之后,a[j]是你可以建造的高度最多为i的楼梯的数量,其中j是使用的砖的数量。
  • 列表a初始化为[1,0,0,...],因为只能有一级楼梯的块数和高度为 0。
  • 在内循环的每一次迭代中,列表a从表示最大高度i-1转换为表示最大高度i,这是通过在任何较短的楼梯上增加一个高度台阶i的可能性来实现的,这样可以给你留下至少i个街区。
  • 在最后一步中,该函数返回恰好由n砖块建造的不同楼梯的数量(最后减去 1,以排除高度为n的单个楼梯的情况)。

这种方法对于大值也是有效的,因为这里时间复杂度是以空间为代价的。

这种方法也可以应用于其他问题,你只需要识别它们并应用动态编程的基础知识,你就能有效地解决问题。

结论

动态编程是一种非常有效的代码优化技术。这项技术非常简单易学,但是需要一些练习才能掌握。

“不记得过去的人注定要重蹈覆辙。”

-乔治·桑塔亚纳

动态编程

****看看这个:https://www.fiverr.com/share/LDDp34

Bibliography:
[https://www.educative.io/edpresso/learn-dynamic-programming-in-10-minutes](https://www.educative.io/edpresso/learn-dynamic-programming-in-10-minutes)
[https://www.geeksforgeeks.org/dynamic-programming/](https://www.geeksforgeeks.org/dynamic-programming/)
[https://www.hackerearth.com/practice/algorithms/dynamic-programming/introduction-to-dynamic-programming-1/tutorial/](https://www.hackerearth.com/practice/algorithms/dynamic-programming/introduction-to-dynamic-programming-1/tutorial/)
[https://www.programiz.com/dsa/dynamic-programming](https://www.programiz.com/dsa/dynamic-programming)

增强 R 中可视化效果的初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-enhancing-visualizations-in-r-9fa5a00927c9?source=collection_archive---------38-----------------------

通过这个实用的循序渐进的教程,开发您在 R 语言中的可视化技能。

在 Unsplash 上由 Carlos Muza 拍摄的照片

学习用 R 构建完整的可视化就像任何其他数据科学技能一样,是一个旅程。RStudio 的 ggplot2 是一个讲述数据故事的有用包,所以如果你是 ggplot2 的新手,并且想发展你的可视化技能,你很幸运。我开发了一个非常快速且实用的指南来帮助初学者加深对 ggplot2 的理解,并设计一些精美的、具有商业洞察力的图表。因为视觉化的早期成功会非常激励人!

本教程假设你已经完成了至少一个关于 ggplot2、的介绍,就像这个。如果你还没有,我鼓励你先把一些基本的东西记下来。

本教程结束时,您将:

  • 加深您对增强 ggplot2 中可视化效果的理解
  • 熟悉导航 ggplot2 备忘单(有用的工具)
  • 通过一个简单的,一步一步的格式,建立两个原始的,完美的视觉效果,如下所示

可视化#2

在我们开始之前,这里有几个工具可以支持你的学习。首先是‘R Studio 数据可视化用 ggplot2 备忘单’(以下简称‘备忘单’)。我们将从头到尾引用它,以帮助您在将来使用它。

第二个是我做的一个 ' ggplot2 快速指南 ' 帮助我自己更快的建立 ggplot。虽然不全面,但可能会帮助你更快的了解 ggplot2 的全貌。

我们走吧!

在本教程中,我们将使用 IBM HR 员工流失数据集,此处可用。这些数据提供了(虚构的)业务洞察力,不需要预处理。太棒了。

让我们安装库并导入数据。

# install libraries
library(ggplot2)
library(scales)
install.packages("ggthemes") 
library(ggthemes)# import data
data <- read.csv(file.path('C:YourFilePath’, 'data.csv'), stringsAsFactors = TRUE)

然后检查数据和结构。

# view first 5 rows
head(attrition)# check structure
str(attrition)

这样做后,您将看到有 1470 个观察值,35 个员工变量。让我们开始视觉#1。

视觉#1

HR 想知道月收入工作角色员工流失率之间的关系。

第一步。数据、美学、几何

对于这个问题,‘job role’是我们的 X 变量(离散型),而‘monthly income’是我们的 Y 变量(连续型)。“流失”(是/否)是我们的 z 变量。

检查备忘单的第一面,在“两个变量:离散 X,连续 Y”下,注意各种图表。我们将使用 geom_bar()。在备忘单上,它被列为 geom_bar(stat = 'identity ')。这将给出所有员工的总月收入。相反,我们想要平均,所以我们插入(stat = 'summary ',fun = mean)。

# essential layers
ggplot(data, aes(x = JobRole, y = MonthlyIncome, fill=Attrition)) +
  geom_bar(stat = 'summary', fun = mean) #Gives mean monthly income

我们显然看不清这些名字,这就导致了第二步…

第二步。坐标和位置调整

当名称太长时,翻转 x 和 y 轴通常会有所帮助。为此,我们将添加 coord_flip()作为层,如下所示。我们还将通过在代码中的 geom_bar()内添加 position = 'dodge '来拆分条形,以便更好地比较损耗。参考 ggplot2 备忘单第 2 面,“坐标系”和“位置调整”以查看两者的位置。

# unstack bars and flipping axis
ggplot(data, aes(x = JobRole, y = MonthlyIncome, fill=Attrition)) +
  geom_bar(stat = ‘summary’, fun = mean, position = ‘dodge’) +
  coord_flip()

第三步。从最高到最低重新排列条形

现在,让我们从最高月收入到最低月收入重新排列条形,以帮助我们更好地按工作角色进行分析。将下面的重新排序代码添加到美学行中。

# reordering job role
ggplot(data, aes(x = reorder(JobRole, MonthlyIncome), y = MonthlyIncome, fill = Attrition)) +
  geom_bar(stat = 'summary', fun = mean, position = 'dodge') +
  coord_flip()

第四步。更改条形图的颜色和宽度

让我们将条形颜色改为“与公司品牌相匹配”这必须手动完成,所以在备忘单的第二面“Scales”下找到 scale_fill_manual()它列出了以 r 为基础的颜色。你可以尝试一些,但它们不是“公司颜色”我从color-hex.com那里得到了下面的颜色。

此外,我们将通过在 geom_bar()中添加“width=.8”来缩小条形宽度,以增加视觉上吸引人的空间。

ggplot(data, aes(x = reorder(JobRole, MonthlyIncome), y = MonthlyIncome, fill = Attrition)) +
  geom_bar(stat='summary', fun=mean, width=.8, position='dodge') +
  coord_flip() +
  scale_fill_manual(values = c('#96adbd', '#425e72'))

第五步。标题和轴标签

现在让我们添加标题和标签。我们不需要 x 标签,因为职位本身就说明了一切。查看我们如何处理的代码。此外,请查看备忘单第二面的“标签”。

ggplot(data, aes(x = reorder(JobRole, MonthlyIncome), y = MonthlyIncome, fill = Attrition)) +
  geom_bar(stat='summary', fun=mean, width=.8, position='dodge') +
  coord_flip() +
  scale_fill_manual(values = c('#96adbd', '#425e72')) +
  xlab(' ') +  #Removing x label
  ylab('Monthly Income in USD') +
  ggtitle('Employee Attrition by Job Role & Income')

第六步。添加主题

一个主题会让它更上一层楼。我们将在代码末尾添加一个主题层,如下所示。当你开始在 R 中输入“主题”时,它会显示选项。对于这个图,我选择了 theme_clean()

#Adding theme after title
ggtitle('Employee Attrition by Job Role & Income') +
  theme_clean()

第七步。降低图形高度并使轮廓不可见

只是两个简单的调整。首先,我们将删除图形和图例轮廓。第二,图形看起来很高,所以让我们通过主题()中的 aspect.ratio 来降低高度。这是最终图形的完整代码。

ggplot(data, aes(x = reorder(JobRole, MonthlyIncome), y = MonthlyIncome, fill = Attrition)) +
  geom_bar(stat='summary', fun=mean, width=.8, position='dodge') +
  coord_flip() +
  scale_fill_manual(values = c('#96adbd', '#425e72')) +
  xlab(' ') +
  ylab('Monthly Income in USD') +
  ggtitle('Employee Attrition by Job Role & Income') +
  theme_clean() +
  theme(aspect.ratio = .65,
    plot.background = element_rect(color = 'white'),
    legend.background = element_rect(color = 'white'))

很好。我们发现,月收入更多的研究主管更有可能离开公司。其他工作角色则相反。

你已经完成了很多。准备好再试一次了吗?视觉 2 走查将是小菜一碟。

视觉#2

对于第二个视觉,我们想知道员工流失是否与月收入自上次晋升以来的年数以及工作生活平衡有任何关系。另一个多变量分析。

第一步。数据、美学、几何

对于这个问题,“MonthlyIncome”是我们的 X 变量,“YearsSinceLastPromotion”是我们的 Y 变量。两者都是连续的,所以在“两个变量:连续 X,连续 y”下检查备忘单的第一面。对于可视化上下文,我们将使用 geom_smooth(),这是一条经常添加到散点图以揭示模式的回归线。“损耗”将再次通过颜色来区分。

ggplot(data, aes(x=MonthlyIncome, y=YearsSinceLastPromotion, color=Attrition)) +
  geom_smooth(se = FALSE) #se = False removes confidence shading

我们可以看到,离职的员工晋升的频率更低。让我们更深入地研究,通过工作生活平衡来比较。对于第四个变量,我们需要使用“分面”来查看工作生活平衡水平的支线剧情。

第二步。在画布上添加支线剧情

查看备忘单第二面的“刻面”。我们将对矩形布局使用 facet_wrap()。

ggplot(data, aes(x = MonthlyIncome, y = YearsSinceLastPromotion, color=Attrition)) +
  geom_smooth(se = FALSE) +
  facet_wrap(WorkLifeBalance~.)

小平面网格看起来不错,但是数字是什么意思呢?数据描述解释了“工作生活平衡”的代码:1 =“差”,2 =“好”,3 =“更好”,4 =“最好”。在步骤 3 中添加它们。

第三步。给分面支线剧情添加标签

要添加子情节标签,我们需要首先用一个字符向量定义名称,然后在 facet_wrap 中使用“labeller”函数。

# define WorkLifeBalance values
wlb.labs <- c('1' = 'Bad Balance', '2' = 'Good Balance', '3' = 'Better Balance', '4' = 'Best Balance')#Add values to facet_wrap()
ggplot(data, aes(x = MonthlyIncome, y = YearsSinceLastPromotion, color=Attrition)) +
  geom_smooth(se = FALSE) +
  facet_wrap(WorkLifeBalance~., 
    labeller = labeller(WorkLifeBalance = wlb.labs))

第四步。标签和标题

在代码末尾添加标签和标题。

facet_wrap(WorkLifeBalance~.,
    labeller = labeller(WorkLifeBalance = wlb.labs)) +
xlab('Monthly Income') +
ylab('Years Since Last Promotion') +
ggtitle('Employee Attrition by Workplace Factors')

第五步。在标签和刻度线之间添加空格

当我看图表时,x 和 y 标签似乎离刻度线太近了。一个简单的技巧是在标签名中插入换行符(\n)。

xlab('\nMonthly Income') +  #Adds space above label
ylab('Years Since Last Promotion\n')  #Adds space below label

第六步。主题

当你安装了 library('ggthemes '),它给了你更多的选择。为了现代感,我选择了 theme_fivethirtyeight()。简单的加在最后。

ggtitle('Employee Attrition by Workplace Factors') +
  theme_fivethirtyeight()

第七步。覆盖主题默认值

我们的 x 和 y 标签怎么了?嗯,默认的 theme_fivethirtyeight()没有标签。但是我们可以很容易地在代码末尾用第二个 theme()层覆盖它,如下所示。

theme_fivethirtyeight() +
theme(axis.title = element_text())

还不错。但是……人们可能无法马上判断“更好的平衡”和“最好的平衡”是针对顶部还是底部网格。让我们在第 8 步中也改变我们的图例位置。

第八步。添加网格间距并更改图例位置

在顶部和底部网格之间添加空间以及更改图例位置都发生在第二个主题()行中。参见备忘单第 2 面“图例”部分

theme_fivethirtyeight() +
theme(axis.title = element_text(),
  legend.position = 'top',
  legend.justification = 'left',
  panel.spacing = unit(1.5, 'lines'))

第九步。更改线条颜色

如果能改变线条颜色来增加视觉冲击力,那就太棒了。标准的 R 色不太符合我们的需求。我们将手动更改,就像我们对 Visual #1 所做的那样。我从color-hex.com那里获得了颜色#s,它已经成为我们的有用工具。

这是第二个视频的完整代码。

ggplot(data, aes(x = MonthlyIncome, y = YearsSinceLastPromotion, color=Attrition)) +
  geom_smooth(se = FALSE) +
  facet_wrap(WorkLifeBalance~., 
    labeller = labeller(WorkLifeBalance = wlb.labs)) +
  xlab('\nMonthly Income') +  
  ylab('Years Since Last Promotion\n') +
  theme_ggtitle('Employee Attrition by Workplace Factors') +
  theme_fivethirtyeight() +
  theme(axis.title = element_text(),
    legend.position = 'top',
    legend.justification = 'left',
    panel.spacing = unit(1.5, 'lines')) +
  scale_color_manual(values = c('#999999','#ffb500'))

又一项出色的工作。我们发现,如果晋升更频繁,工作与生活缺乏平衡的员工似乎会留下来。在良好或较高的工作生活平衡水平上,损耗的差异不太明显。

在本教程中,我们获得了 ggplot2 视觉增强所需的技能,更加熟悉了 R Studio ggplot2 备忘单,并构建了两个漂亮的视觉效果。我希望逐步的解释和备忘单参考对您有所帮助,并增强您使用 ggplot2 的信心。

在我提高数据科学和机器学习技能时,许多人都在帮助我,所以我的目标是以同样的方式帮助和支持他人。

NVIDIA NeMo 入门指南

原文:https://towardsdatascience.com/beginners-guide-to-nvidia-nemo-e5512862cd8e?source=collection_archive---------34-----------------------

开发和训练语音和语言模型的工具包

戴维·克洛德在 Unsplash 上的照片

这篇文章让你一瞥 NVIDIA NeMo 背后的基本概念。当涉及到为对话式人工智能建立你自己的艺术模型时,它是一个非常强大的工具包。供您参考,一个典型的对话式 AI 管道由以下领域组成:

  1. 自动语音识别(ASR)
  2. 自然语言处理
  3. 文本到语音(TTS)

如果您正在寻找一个成熟的工具包来训练或微调这些领域的模型,您可能想看看 NeMo。它允许研究人员和模型开发人员使用称为神经模块(NeMo) 的可重用组件来构建他们自己的神经网络架构。基于官方文档,神经模块为

“……采用类型的输入并产生类型的输出的神经网络概念模块。这种模块通常代表数据层、编码器、解码器、语言模型、损失函数或组合激活的方法。”

NeMo 的一个主要优点是,它可以用于训练新模型或在现有的预训练模型上执行迁移学习。最重要的是,在 NVIDIA GPU Cloud (NGC) 有相当多的预训练模型可供您使用。在撰写本文时,GPU 加速的云平台具有以下预训练模型:

自动语音识别(Automatic Speech Recognition)

  • 碧玉 10x5 — Librispeech
  • 多数据集 Jasper 10x5 — LibriSpeech、Mozilla Common Voice、WSJ、Fisher 和 Switchboard
  • AI-shell 2 Jasper 10x 5—AI-shell 2 普通话
  • 夸兹涅特——速度扰动下的自由探索
  • QuartzNetLibrispeechMCV—Librispeech,Mozilla common voice
  • 多数据集 Quartznet — LibriSpeech、Mozilla Common Voice、WSJ、Fisher 和 Switchboard
  • WSJ-Quartznet——华尔街日报、Librispeech、Mozilla common voice
  • AI-shell 2 Quartznet—AI-shell 2 普通话

自然语言处理

  • bertalgeuncased—使用 BERT Large 对序列长度为 512 的未分类维基百科和图书语料库进行分类
  • BertBaseCased —使用 BERT Base 对序列长度为 512 的维基百科和图书语料库进行装箱
  • BertBaseUncased —使用 BERT Base 对序列长度为 512 的维基百科和图书语料库进行脱壳
  • 变压器-大 — WikiText-2

自文本至语音的转换

  • Tacotron2 — LJSpeech
  • 波辉 — LJSpeech

设置

确保您满足以下要求:

  • Python 3.6 或 3.7
  • PyTorch 1.4。*支持 GPU
  • NVIDIA APEX(可选)

供您参考,NVIDIA APEX 是一个实用程序,有助于简化 Pytorch 中的混合精度和分布式培训。这不是必需的,但它有助于提高性能和训练时间。如果您打算使用 NVIDIA APEX,强烈建议使用 Linux 操作系统,因为对 Windows 的支持仍处于实验阶段。

如果您使用 docker,安装非常简单。

docker run --runtime=nvidia -it --rm -v --shm-size=16g -p 8888:8888 -p 6006:6006 --ulimit memlock=-1 --ulimit stack=67108864 nvcr.io/nvidia/nemo:v0.11

如果你已经注册了 NVIDIA NGC PyTorch 容器,一个接一个地执行下面的命令。

拉码头工人

docker pull nvcr.io/nvidia/pytorch:20.01-py3

运行以下命令

docker run --gpus all -it --rm -v <nemo_github_folder>:/NeMo  --shm-size=8g -p 8888:8888 -p 6006:6006 --ulimit memlock=-1 --ulimit  stack=67108864 nvcr.io/nvidia/pytorch:20.01-py3

以下步骤是安装其余部分的继续。如果您在本地运行它或者通过 Google Colab 运行它,您应该从这里开始安装。运行以下命令安装必要的依赖项。

apt-get update && apt-get install -y libsndfile1 ffmpeg && pip install Cython

一旦你完成了,下一步是pip install NeMo 模块取决于你的用例。如果您使用它来训练新模型,请运行以下命令

pip install nemo_toolkit

获得自动语音识别集合附带的 NeMo

pip install nemo_toolkit[asr]

NeMo 和自然语言处理集合可以通过

pip install nemo_toolkit[nlp]

要安装 NeMo 和文本到语音集合,请运行以下命令

pip install nemo_toolkit[tts]

如果您正在寻找包含所有集合的完整安装,您可以通过

pip install nemo_toolkit[all]

程序设计模型

基于 NeMo API 的每个应用程序通常使用以下工作流程:

  1. 神经调节因子和必要神经调节因子的产生
  2. 定义神经模块的有向无环图(DAG)
  3. 号召“行动”,如训练

需要注意的一点是,NeMo 遵循懒惰执行模型。这意味着在调用推理之前或训练之后,不会执行任何实际的计算。

神经类型

NeMo 中每个神经模块的所有输入和输出端口都是类型化的。它们是用 Python 类 NeuralType 和从 ElementType、AxisType 和 AxisKindAbstract 派生的辅助类实现的。神经类型由以下数据组成:

  • axes —表示改变特定轴的含义(批次、时间)
  • elements_type —表示激活中存储内容的语义和属性(音频信号、文本嵌入、逻辑)

初始化

实例化主要是在模块的input_portsoutput_ports属性中完成的。你可以如下实例化一个Neural Type

axes: Optional[Tuple] = None, elements_type: ElementType = VoidType(), optional=False

让我们看看下面的(音频)数据层输出端口示例。

{
    'audio_signal': NeuralType(('B', 'T'), AudioSignal(freq=self._sample_rate)),
    'a_sig_length': NeuralType(tuple('B'), LengthsType()),
    'transcripts': NeuralType(('B', 'T'), LabelsType()),
    'transcript_length': NeuralType(tuple('B'), LengthsType()),
}
  • B —代表 AxisKind。一批
  • T —代表 AxisKind。时间
  • D —代表 AxisKind。尺寸

比较

您可以通过compare()功能比较两个NeuralType。它将返回一个NeuralTypeComparisonResult,传达如下意思

  • 相同 = 0
  • 减去 = 1 (A 为 B)
  • 大于 = 2 (B 是 A)
  • 尺寸不兼容 = 3(尺寸不兼容。调整连接器大小可能会修复不兼容性)
  • TRANSPOSE_SAME = 4(数据格式不兼容,但列表和张量之间的转置和/或转换会使它们相同)
  • CONTAINER _ SIZE _ MISMATCH= 5(A 和 B 包含不同数量的元素)
  • 不相容 = 6 (A 和 B 不相容)
  • SAME _ TYPE _ INCOMPATIBLE _ PARAMS= 7(A 和 B 属于同一类型,但参数化不同)

让我们转到下一节,深入探讨示例。

例子

基本示例

让我们看看下面的例子,它建立了一个模型,学习 y=sin(x)的泰勒系数。

import nemo

# instantiate Neural Factory with supported backend
nf = nemo.core.NeuralModuleFactory()

# instantiate necessary neural modules
# RealFunctionDataLayer defaults to f=torch.sin, sampling from x=[-4, 4]
dl = nemo.tutorials.RealFunctionDataLayer(
    n=10000, batch_size=128)
fx = nemo.tutorials.TaylorNet(dim=4)
loss = nemo.tutorials.MSELoss()

# describe activation's flow
x, y = dl()
p = fx(x=x)
lss = loss(predictions=p, target=y)

# SimpleLossLoggerCallback will print loss values to console.
callback = nemo.core.SimpleLossLoggerCallback(
    tensors=[lss],
    print_func=lambda x: logging.info(f'Train Loss: {str(x[0].item())}'))

# Invoke "train" action
nf.train([lss], callbacks=[callback],
         optimization_params={"num_epochs": 3, "lr": 0.0003},
         optimizer="sgd")

自动语音识别(Automatic Speech Recognition)

查看以下笔记本,开始您的语音识别项目:

  • 端到端自动语音识别简介
  • NeMo 中麦克风流的自动语音识别
  • 基于 QuartzNet 模型的语音命令识别

自然语言处理

使用 NeMO 进行自然语言处理任务的笔记本集合:

  • 伯特预训
  • 用于问答的生物机器人
  • 用于命名实体识别的 BioBERT】
  • 用于关系提取的 BioBERT

自文本至语音的转换

使用 NeMo 执行文本到语音转换任务的笔记本示例:

  • Tacotron + WaveGlow 生成音频

结论

让我们回顾一下今天所学的内容。

我们首先简要介绍了 NVIDIA NeMo toolkit。此外,我们接触了一些预先训练好的模型,这些模型在 NVIDIA GPU Cloud (NGC) 很容易获得。

然后,我们通过 docker 或使用 pip install 的本地安装来安装工具包。

我们深入探讨了构成 NeMo 背后的基本概念的编程模型和神经类型。

最后,我们测试了几个自动语音识别、自然语言处理和文本到语音转换任务的例子。

感谢你阅读这篇文章。希望在下一篇文章中再见到你!

参考

  1. 英伟达 NeMo Github
  2. 英伟达 NeMo 文档
  3. 英伟达尼莫的例子

使用 Spotify Top50 2019 歌曲的 pymongo 初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-pymongo-using-spotify-top50-2019-songs-6c0eaa80b1af?source=collection_archive---------37-----------------------

如何使用 pymongo 编程

这篇文章旨在解释如何使用 pymongo 与 mongoDB 接口来执行 CRUD 操作。为了完成这篇文章,如果你对 mongoDB 及其内容有基本的工作知识,这是推荐的,但不是强制的。本帖涵盖的主题如下

  • 简介
  • 在 pymongo 中配置客户端
  • 创建数据库、收藏、文档
  • 从集合中查询单据
  • 更新集合中的文档
  • 从收藏中删除文档
  • 从 mongo 服务器删除数据库、集合
  • 参考文献

如果您只对特定部分感兴趣,请点击上面的主题直接导航到相应的部分。

照片由阿克谢·肖汉在 Unsplash 上拍摄

介绍

MongoDB 是一个 NoSQL(不仅仅是 SQL)数据库,是使用最广泛的数据库之一。它是用 C++原生编写的,这使得它在执行 CRUD 应用程序时非常快速有效。

具体来说,MongoDB 是一个文档数据库,其中的记录或条目以键值格式存储为文档,与 json 或 python 字典非常相似;从而允许使用对象符号从数据库中检索数据。

使用 mongoDB 的一个好处是,作为一个 NoSQL 数据库,只要遵循键值对,就不会受到数据库中可以存储的数据类型的限制。在 SQL 中,有一个非常严格的模式,每个记录都必须遵守,这使得它非常严格,而 MongoDB 在这方面允许完全的灵活性。在一些应用程序中,我们事先不知道会有什么&多少数据到来,但是需要将它存储到数据库中;mongoDB 是解决这种用例的方法。

对 mongoDB 和 SQL 中涉及的术语进行比较分析,可以更好地理解用于存储数据的 mongoDB 服务;内容如下:

  • 数据库是存储在服务器上的一组数据;它在 mongoDB 和 SQL 中都被称为数据库。
  • 数据库是由一些更小的组组成的,在 mongoDB 中称为集合,在 SQL 中称为表。
  • SQL 中的行由保存某些数据类型的数据的记录或行组成,在 mongoDB 中也称为文档。
  • SQL 中的列由可以保存特定数据类型的数据的特征组成;这在 mongoDB 中被称为字段。关键的区别在于,在 mongoDB 中,文档之间的字段可以不同,而对于 SQL 表,所有行的列必须相同。

特别是为了更熟悉 mongoDB,我建议你查看一下这个 GitHub 库,它解释了如何开始使用它。

pymongo 是 python 中的一个包,它帮助我们配置 mongoDB 数据库并从中检索文档。因为对于任何与数据相关的工作,python 都支持处理、建模、争论任何类型的数据,所以将数据存储在像 mongoDB 这样的数据库中并使用 python 按需检索是有意义的,pymongo 非常容易地简化了这个用例。要在您的系统上安装 pymongo,您需要在系统上本地安装 python 和 pip 你可以按照这个教程来获取相同的。一旦你安装了它们,只要在你的终端或命令提示符下运行下面的命令,你就可以很好地完成这篇文章的其余部分了。

pip install pymongo

我们在这里使用的数据包括 2019 年 spotify 排名前 50 的歌曲;数据集中的预览如下:

图片由 Vinayak 提供

数据集包括曲目名称和某些相关字段,如谁演唱了它,它是什么类型,以及其他量化参数,如它有多流行,歌曲有多长等。要深入了解数据集,请访问 kaggle 了解其他参数,可以使用该数据集执行哪些任务等等。我们将使用这个数据集创建一个简单的场景来演示 mongoDB 中的 CRUD(创建、读取、更新和删除)功能。

在 pymongo 中配置客户端

一旦在系统上安装了 python、pymongo 和 mongoDB,就可以打开 python 脚本并开始编码了。

您需要做的第一件事是创建一个到 mongoDB 服务器的连接。安装 mongoDB 后,大多数系统在本地主机上使用端口 27017 来托管 mongoDB 服务器,如果您/您的组织有专用的服务器,请确保获得到您的服务器的链接并创建如下连接。

一旦你有了这个连接,你就可以使用客户端对象来执行任何 CRUD 操作,我们将在下面的章节中看到。

创建数据库、集合、文档

使用上面的集合对象,我们查看现有的数据库、集合和其中包含的文档,并创建新的数据库。让我们首先来看看如何查看现有的数据库和集合。

图片由 Vinayak 提供

如果您最近才安装 mongoDB,默认情况下会创建这三个数据库,因为我们还没有创建其他数据库,所以没有其他数据库。让我们创建一个名为 spotifyData 的数据库,其中有一个名为 Top50 的集合。我们可以这样做

现在,这里有一个陷阱。请注意,数据库和集合是在 MongoDB 中延迟创建的。就像在集合和数据库中一样,只有在第一个文档被插入时才会被创建。到目前为止,我们已经有了指向数据库和集合对象的指针,但是它们还没有被创建。让我们将 Spotify 2019 年前 50 首歌曲数据集的文档插入到前 50 名集合中。

在 mongoDB 集合中创建文档有两种主要方法。

当您有一个文档时,可以使用 insert_one 方法在集合中创建一个文档。当一系列文档都出现在一个列表中时,可以使用 insert_many 方法在集合中创建所有这些文档。

这些文档基本上是 python 中的字典,以字段作为键,以值作为数据。此示例中的样本文档如下:

图片由 Vinayak 提供

对于 mongoDB 来说,id 字段是一个重要的字段。可以认为它类似于 SQL 中的主键。它是每个文档的唯一标识符。任何集合都不能有两个具有相同 id 的文档。如果不显式提供 _id 字段,mongoDB 将自己生成一个,它是一个随机的字符串对象,不匹配任何其他对象的 _id。

从集合中查询文档

接下来是从 mongoDB 集合中读取或查询。一旦我们创建了一个数据库和一个集合来保存我们的前 50 首歌曲,我们就可以使用它来查找任何记录,方法是对不同的字段施加约束,使我们能够只从我们的集合中过滤所需的数据。

假设我们希望看到所有进入 2019 年前 50 名的泰勒·斯威夫特的歌曲,我们可以如下执行我们的查询。

图片由 Vinayak 提供

我们可以看到,泰勒·斯威夫特只有一首歌进入了 2019 年的前 50 名,那就是《你需要冷静》。

请注意,上面的代码片段中显示的 find 方法没有任何约束,将查找并返回集合中所有可用的文档。只有当我们指定一些约束时,它才会返回过滤后的数据。

假设我们想找出所有流行度在 90 或以上的歌曲。我们可以用下面的查询来完成。

图片由 Vinayak 提供

假设我们想找出哪些歌曲来自流行音乐流派,并对所有歌曲进行查询。现在,在文件中,我们有许多不同的流行歌曲,用形容词来描述这些子流派。所以我们将使用一个正则表达式来过滤文档,如下所示。

图片由 Vinayak 提供

因此,在本节中,我们看到了如何使用 pymongo 的 find 函数从 mongoDB 中查询数据。正如我们在上面的例子中所看到的,它提供了一些很好的工具来基于数字和字符串相关的约束提取数据。让我们看看如何使用 pymongo 更新 mongo 集合中文档的数据。

更新集合中的文档

假设我们的集合中有一些数据,我们想要更新一个或多个文档中的一个或多个字段。在 pymongo 中使用 update_one 和 update_many 函数可以做到这一点。我们将研究 update_many 函数,因为前者是后者的一个特例。

在大多数评论/反馈中,我们看到事物被分为 1 到 5 级。然而,在这里,我们看到的是受欢迎程度是按百分比进行评估的。假设我们想更新它,使受欢迎程度限制在 1-5 之间。这可以通过将每个文档的流行度字段除以 20(即乘以 0.05)来完成。下面是我们如何使用 pymongo 来实现它。

因为我们想要更新所有的文档,所以我们传递了一个空的过滤标准,否则如果我们只想更新一组特定的文档,我们也可以这样做。比方说,我们想把所有艾德·希兰的歌曲都换成泰迪这个名字(他的昵称)。这可以通过添加这样的过滤标准来实现。

图片由 Vinayak 提供

我们可以看到,艾德·希兰在 2019 年有 4 首歌,老实说,这对一个歌手来说已经很多了;但所有这些都被修改,以反映艺术家的名字泰迪。upsert 的观点很有趣。如果过滤条件与任何文档都不匹配,它基本上会创建一个文档,如果 upsert 设置为 True,它会将艺术家姓名设置为 teddy。

从集合中删除文档

假设我们想删除德雷克演唱的 2019 年前 50 名歌曲中的歌曲(不是针对他,只是为了演示),我们可以使用 delete_one 或 delete_many 方法。由于我们想要删除所有歌曲,我们可以使用 delete_many 命令,如下所示。

图片由 Vinayak 提供

看起来德雷克只有一首歌进入了前 50 名,所以在这种情况下,delete_one 和 delete_many 会有相同的最终结果。

让我们尝试删除所有受欢迎度为 80 或以下(即在新的分级系统中为 4 或以下)的文档。

图片由 Vinayak 提供

有三首歌的流行度低于 80 或 4(在新的范围内)。

从 mongo 服务器删除数据库、集合

假设我们不需要 mongoDB 数据库中的某个特定集合,我们想删除它。它可能在任何时间点发生,因为任何人都不再需要访问数据,数据已经过时,没有任何用途或任何其他原因。因为我们的数据库中只有一个集合,所以现在删除它没有意义,只是为了演示,下面是我们如何做的。

类似地,如果我们想要删除一个数据库,我们可以使用客户端变量来保存到 mongo 服务器的连接并删除数据库。

为了与 mongodb 服务器交互,显式关闭已经建立的连接总是一个好的做法。您可以简单地通过使用命令来完成

client.close()

这就把我们带到了这篇文章的结尾。我希望您已经有了使用 pymongo 通过脚本与 mongoDB 进行编程交互的良好起点。如果你想在一个地方看这篇文章的所有代码,或者更深入地研究,或者更喜欢教程的视频媒体,请查看下面的参考资料部分。

参考文献

  • Spotify 2019 年数据集前 50 名歌曲
  • py mongo 上的 Datacamp 文章
  • 帖子中代码的 Github 回购链接
  • 视频:pymongo 基础知识,techwithtim 制作

PySpark 初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-pyspark-bbe3b553b79f?source=collection_archive---------1-----------------------

PySpark 教程

第 1 章:使用美国股票价格数据介绍 PySpark

卢克·切瑟在 Unsplash 上的照片

PySparkApache Spark 的 API,Apache Spark 是一个开源的分布式处理系统,用于大数据处理,最初是在加州大学伯克利分校用 Scala 编程语言开发的。Spark 拥有 Scala、Java、Python 和 R 的开发 API,并支持跨多种工作负载的代码重用——批处理、交互式查询、实时分析、机器学习和图形处理。它利用内存缓存和优化的查询执行,针对任何大小的数据进行快速分析查询。它没有自己的文件系统,如 Hadoop HDFS,它支持大多数流行的文件系统,如 Hadoop 分布式文件系统(HDFS),HBase,Cassandra,亚马逊 S3,亚马逊红移,Couchbase,等等

使用 Apache Spark 的优势:

  • 它在内存中运行程序比 Hadoop MapReduce 快 100 倍,在磁盘上快 10 倍。它声明是因为它在 worker 节点的主存中进行处理,防止不必要的 I/O 操作。
  • 它是用户友好的,因为它有用流行语言编写的 API,这使你的开发人员很容易,因为他们将分布式处理的复杂性隐藏在简单的高级操作符后面,大大降低了所需的代码量。
  • 它可以通过 Mesos、Hadoop via Yarn 或 Spark 自己的集群管理器进行部署。
  • 实时计算和低延迟,因为内存计算。

在这篇文章中我们看到

  1. 在 Google Colab 中设置环境
  2. 星火会
  3. 读取数据
  4. 使用 Spark 模式构建数据
  5. 检查数据的不同方法
  6. 列操纵
  7. 处理缺失值
  8. 查询数据
  9. 数据可视化
  10. 将数据写入/保存到文件
  11. 结论
  12. 参考文献

让我们开始吧,✨

由弗兰基·查马基在 Unsplash 上拍摄的照片

在 Google Colab 中设置环境

为了在本地机器上运行 pyspark,我们需要 Java 和其他软件。因此,我们不用繁重的安装程序,而是使用 Google Colaboratory,它有更好的硬件规格,还带有广泛的数据科学和机器学习库。我们需要安装 pysparkPy4J 包。Py4J 使运行在 python 解释器中的 Python 程序能够动态访问 Java 虚拟机中的 Java 对象。安装上述软件包的命令是

火花会议

SparkSession 已经成为 PySpark 的一个入口点,因为在 2.0 版本之前 SparkContext 被用作一个入口点。 SparkSession 是底层 PySpark 功能的入口点,用于以编程方式创建 PySpark RDD、数据帧和数据集。它可以在 replace with SQLContext、HiveContext 和 2.0 之前定义的其他上下文中使用。您还应该知道,SparkSession 在内部使用 SparkSession 提供的配置创建 SparkConfig 和 SparkContext。可以使用SparkSession.builder构建器模式创建 SparkSession。

创建 SparkSession

要创建 SparkSession,您需要使用构建器模式方法builder()

  • getOrCreate() —该方法返回一个已经存在的 SparkSession 如果不存在,它将创建一个新的 SparkSession。
  • master()–如果您在集群上运行它,您需要使用您的主名称作为参数。通常,它可能是[yarn](https://sparkbyexamples.com/hadoop/how-yarn-works/)mesos,这取决于您的集群设置,并且在独立模式下运行时也使用local[X]X应该是一个大于 0 的整数值,表示使用 RDD、数据帧和数据集时应该创建多少个分区。理想情况下,值X应该是 CPU 内核的数量。
  • appName()该方法用于设置你的应用程序的名称。
  • getOrCreate()该方法返回一个现有的 SparkSession,如果它存在,否则它创建一个新的 SparkSession。

创建 SparkSession 的示例

读取数据

pyspark 可以读取各种文件格式的数据,如逗号分隔值(CSV)、JavaScript 对象符号(JSON)、Parquet 等。以下是从不同文件格式读取数据的示例:

使用 Spark 模式构建数据

让我们来看看 Kaggle 数据集中 2019 年 1 月至 2020 年 7 月的美国股票价格数据。

[## 美国股票价格

2019 年 1 月至 2020 年 7 月的标准普尔 500 指数数据

www.kaggle.com](https://www.kaggle.com/dinnymathew/usstockprices)

读取 CSV 文件格式数据的代码。

让我们使用PrintSchema方法来查看数据的模式。

数据的模式

Spark schema 是 DataFrame 或 Dataset 的结构,我们可以使用 StructType 类来定义它,该类是定义列名(字符串)、列类型(数据类型)、可空列(布尔)和元数据(元数据)的 StructField 的集合。spark 从数据中推断模式,但是有时推断的数据类型可能不正确,或者我们可能需要定义自己的列名和数据类型,特别是在处理非结构化和半结构化数据时。

让我们看看如何使用它来组织我们的数据:

上面的代码显示了如何使用StructTypeStructField创建结构。然后将创建的结构传递给模式参数,同时使用spark.read.csv()读取数据。让我们看看结构化数据的模式:

结构化后的数据模式—按作者分类的图像

检查数据的不同方法

有各种方法用于检查数据。它们是 schema、dtypes、show、head、first、take、description、columns、count、distinct、printSchema。我们用一个例子来看看他们方法的解释。

  • schema() :这个方法返回数据的模式(dataframe)。以下示例显示了 w.r.t 美国股票价格数据。

  • dtypes :返回包含列名及其数据类型的元组列表。

  • head(n) :返回 n 行列表。这里有一个例子:

  • show() :默认显示前 20 行,并以数字为参数显示数据的行数。下面是一个例子:show(5)。

美国股票价格数据的前五行—作者图片

  • first() :返回数据的第一行。

  • take(n) :返回数据的前 n 行。

  • describe() :计算数据类型为数值的列的汇总统计数据。

  • :返回包含数据列名的列表。

  • count() :返回数据中行数的计数。

  • distinct() :返回数据中不同的行数。

  • printSchema() :显示数据的模式。

列操作

让我们看看用于添加、更新、删除数据列的不同方法。

  1. 添加列:使用withColumn该方法采用两个参数列名和数据向现有数据添加新列。请参见下面的示例:

添加列后的数据—按作者分类的图像

2.更新列:使用withColumnRenamed来重命名现有的列,T1 带有参数现有的列名和新的列名。请参见下面的示例:

更新后的数据-按作者分类的图像

3.删除列:使用drop获取列名并返回数据的方法。

删除列后的数据-按作者分类的图像

处理缺失值

在处理实时数据时,我们经常会遇到缺失值。这些缺失值被编码为 NaN 、空格和占位符。有各种处理缺失值的技术,其中一些比较流行的是:

  • 删除:删除任意一列中缺失值的行。
  • 用平均值/中值估算:用相应列的平均值/中值替换缺失值。它简单、快速,并且适用于小型数值数据集。
  • 使用最频繁值估算:顾名思义,使用该列中最频繁的值来替换该列中缺失的值。这适用于分类特征,但也可能会在数据中引入偏差。
  • 使用 KNN 估算:K-最近邻是一种分类算法,它使用不同的距离度量来使用特征相似性,例如欧几里德距离、马哈拉诺比斯距离、曼哈顿距离、闵可夫斯基距离和汉明距离,用于任何新的数据点。与上述根据数据集估算缺失值的方法相比,这种方法非常有效,而且计算量大,对异常值敏感。

让我们看看如何使用 PySpark 来处理缺失值:

查询数据

PySpark 和 PySpark SQL 提供了广泛的方法和函数来轻松查询数据。以下是几种最常用的方法:

  • 选择
  • 过滤器
  • 之间
  • 喜欢
  • 分组依据
  • 聚合

挑选

它用于使用列名选择单个或多个列。这里有一个简单的例子:

选择提取单列或多列数据的操作-按作者排序的图像

过滤器

根据给定的条件筛选数据,也可以使用 AND(&)、OR(|)和 NOT(~)运算符给出多个条件。下面是获取 2020 年 1 月股票价格数据的示例。

使用过滤器获取 2020 年 1 月的股票价格数据—图片由作者提供

在...之间

如果 between 方法中传递的值。让我们看一个获取数据的例子,其中调整后的值在 100 和 500 之间。

使用 Between 获取数据—按作者分类的图像

当...的时候

根据给定的条件,它返回 0 或 1,下面的例子显示了当调整后的价格大于等于 200 时,如何选择股票的开盘价和收盘价。

使用何时获取数据-按作者分类的图像

喜欢

它类似于 SQL 中的 like 操作符,下面的例子显示了使用“rlike”提取以 M 或 C 开头的扇区名。

输出—按作者分类的图像

古尔比

该名称本身说明了它根据给定的列名对数据进行分组,并且可以执行不同的操作,如 sum、mean、min、max 等。下面的示例说明了如何获得与行业相关的平均开盘、收盘和调整后的股票价格。

按示例分组—按作者分组的图像

聚合

PySpark 在 DataFrame API 中提供了内置的标准聚合函数定义,当我们需要对数据列进行聚合操作时,这些函数就派上了用场。聚合函数对一组行进行操作,并为每个组计算一个返回值。以下示例显示了如何显示最小值、最大值和平均值;从 2019 年 1 月到 2020 年 1 月与行业相关的开盘、收盘和调整后的股价。

聚合示例—按作者分类的图像

数据可视化

我们将利用 matplotlib 和 pandas 来可视化数据,toPandas()方法用于将数据转换为 pandas dataframe。使用 dataframe,我们利用 plot()方法来可视化数据。下面的代码显示了如何显示该板块的平均开盘价、收盘价和调整后股价的条形图。

平均开盘价、收盘价和调整后的股票价格(相对于行业)——图片由作者提供

类似地,让我们来看看各行业的平均开盘价、收盘价和调整后价格。

行业的平均开盘价、收盘价和调整后股价-图片由作者提供

让我们来看看科技股平均开盘、收盘和调整后股价的时序图。

技术行业的时间序列图—作者图片

将数据写入/保存到文件

“write.save()”方法用于以不同的格式保存数据,如 CSV、JSVON、Parquet、e.t.c。让我们看看如何以不同的文件格式保存数据。我们可以使用' select()'方法保存整个数据和选定的数据。

结论

PySpark 是数据科学家学习的好语言,因为它支持可扩展分析和 ML 管道。如果您已经熟悉 Python、SQL 和 Pandas,那么 PySpark 是一个很好的起点。

本文展示了如何使用 PySpark 执行各种各样的操作,从读取文件到将细节写入文件。它还涵盖了使用 matplotlib 可视化洞察的基本可视化技术。此外,谷歌协作笔记本是开始学习 PySpark 的好方法,无需安装必要的软件。查看有助于更轻松、更快速地学习 PySpark 的参考资料。

通过使用下面的 colab notebook 和 GitHub,您可以随意访问/使用我在文章中写的代码。

快乐学习✨

[## PySpark 初学者指南

第 1 章:使用美国股票价格数据介绍 PySpark

colab.research.google.com](https://colab.research.google.com/drive/1Iwn8bmZjzjzO5_Li2ZFF_zf_b1td44Eg?usp=sharing) [## syamkakarla 98/初学者指南

第 1 章:使用股票价格数据介绍 PySpark

github.com](https://github.com/syamkakarla98/Beginners_Guide_to_PySpark)

参考

[## 使用 PySpark 掌握大数据分析

使用 PySpark 的强大功能有效地将高级分析应用于大数据集关于此视频解决您的大数据…

www.oreilly.com](https://www.oreilly.com/library/view/mastering-big-data/9781838640583/) [## 欢迎使用 Spark Python API 文档!— PySpark 3.0.1 文档

Spark 功能的主要入口点。弹性分布式数据集(RDD),Spark 中的基本抽象。主…

spark.apache.org](https://spark.apache.org/docs/latest/api/python/index.html) [## pyspark.sql 模块— PySpark 2.4.0 文档

Spark SQL 和 DataFrames 的重要类别:在…中使用结构化数据(行和列)的入口点

spark.apache.org](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html)

python 语言入门指南

原文:https://towardsdatascience.com/beginners-guide-to-pythainlp-4df4d58c1fbe?source=collection_archive---------22-----------------------

泰语的文本处理和语言学分析

照片由 Mateusz Turbiński 在 Unsplash 上拍摄

通过阅读这篇文章,您将了解更多关于 PyThaiNLP 背后的基本概念和特性。基于官方文档,PyThaiNLP 提供了

“…泰语的标准 NLP 功能,例如词性标记、语言单位分割(音节、单词或句子)。”

本教程有 3 个部分:

  1. 设置
  2. 履行
  3. 结论

让我们继续下一部分,开始安装必要的模块

1.设置

强烈建议您在继续安装过程之前创建一个虚拟环境。你可以很容易地用 pip install 安装它。

pip install pythainlp

如果您已经有一个现有的包,并且想要更新它,请运行以下命令。

pip install -U pythainlp

某些功能需要额外的软件包,这些软件包可以按如下方式安装:

pip install pythainlp[package1, package2, ...]

完整列表如下:

  • attacut —支持 attacut,一个快速准确的记号赋予器
  • icu —对于 ICU,Unicode 的国际组件,支持音译和标记化
  • ipa —国际音标,支持音译
  • ml —支持分类的 ULMFiT 模型
  • thai2fit —为泰语词矢量
  • thai2rom —用于机器学习的罗马化
  • ner —用于命名实体识别

您可以通过以下命令安装它们

pip install pythainlp[full]

一旦你完成了,让我们进入下一节,开始写 Python 代码。

2.履行

效用

在 Python 文件的顶部添加以下导入声明。我将在本教程中使用 Jupyter 笔记本。

import pythainlp.util

PyThaiNLP 为我们提供了相当多的内置函数。例如,您可以使用以下内容来确定输入文本是否是泰语。

pythainlp.util.isthai("สวัสดี")
#True

此外,您甚至可以获得泰语字符在整个字符串中的百分比计数。

pythainlp.util.countthai("Hello สวัสดี")
#54.54545454545454

排序和整理

可以通过调用collate函数,根据泰语词典中的实际顺序按字母顺序排列。添加以下导入内容

from pythainlp.util import collate

将列表传递给 collate 函数

words = ['แอปเปิ้ล', 'กล้วย', 'ส้ม', 'สับปะรด', 'มะละกอ', 'ทุเรียน']
collate(words)
#['กล้วย', 'ทุเรียน', 'มะละกอ', 'ส้ม', 'สับปะรด', 'แอปเปิ้ล']

您可以指定 reverse 函数以相反的顺序显示它

collate(words, reverse=True)
#['แอปเปิ้ล', 'สับปะรด', 'ส้ม', 'มะละกอ', 'ทุเรียน', 'กล้วย']

日期和时间

供您参考,泰语中的日期时间遵循泰国佛教纪元(公元前)。这个模块提供了一个方便的函数,可以将日期时间对象解析成您想要的格式,就像您通过datetime.strftime()所做的那样。添加以下导入语句。

import datetime
from pythainlp.util import thai_strftime

thai_strftime接受两个参数:

  • 日期时间对象
  • 格式字符串

如下初始化两个变量:

fmt = "%Aที่ %d %B พ.ศ. %Y เวลา %H:%M น. (%a %d-%b-%y)"
date = datetime.datetime(2020, 7, 27, 1, 40)thai_strftime(date, fmt)
#วันจันทร์ที่ 27 กรกฎาคม พ.ศ. 2563 เวลา 01:40 น. (จ 27-ก.ค.-63)

从 2.2 版开始,您可以在 main 指令前添加以下修饰符。

  • - (minus) —不填充数字结果字符串
  • _ (underscore) —用空格填充数字结果字符串
  • 0 (zero) —用零填充数字结果字符串
  • ^ (caret) —将结果字符串中的字母字符转换为大写
  • # (pound sign) —交换结果字符串的大小写
  • O (capital letter o) —使用区域设置的替代数字符号(泰语数字)

让我们再试一次,但这次我们将使用泰语数字显示日期。我在%d中间加了一个大写O

fmt = "%Aที่ %Od %B พ.ศ. %Y เวลา %H:%M น. (%a %d-%b-%y)"
date = datetime.datetime(2020, 7, 27, 1, 40)thai_strftime(date, fmt)
#วันจันทร์ที่ ๒๗ กรกฎาคม พ.ศ. 2563 เวลา 01:40 น. (จ 27-ก.ค.-63)

拼出时间

您可以通过time_to_thaiword()函数完全用泰语显示日期时间对象或字符串(HH:MM:SS)。在此之前,添加以下导入语句

from pythainlp.util import time_to_thaiword

按如下方式传递日期时间对象或字符串(HH:MM:SS):

time_to_thaiword("10:05:34")
#สิบนาฬิกาห้านาทีสามสิบสี่วินาที

您可以指定以下附加参数:

  • fmt —确定拼写方式。它接受以下字符串输入:24h6hm6h
  • precision —接受分钟级别的m或二级级别的s。如果没有,它将只读取非零值。

句子标记化

您可以通过内置的sent_tokenize()功能将一个长段落拆分成句子。按如下方式导入它:

from pythainlp import sent_tokenize

然后,您可以通过向它传递一个字符串来轻松地调用它。让我们看看下面的例子。

text = "เมื่อวันที่ 28 ก.ค.เวลา 07.00 น. ณ บริเวณท้องสนามหลวง พล.อ.อนุพงษ์ เผ่าจินดา รมว.มหาดไทย พร้อมด้วย นายนิพนธ์ บุญญามณี รมช.มหาดไทย นายทรงศักดิ์ ทองศรี รมช.มหาดไทย นายฉัตรชัย พรหมเลิศ ปลัดกระทรวงมหาดไทย และผู้บริหารระดับสูงของกระทรวงมหาดไทย ร่วมพิธีเจริญพระพุทธมนต์ และพิธีทำบุญตักบาตรถวายเป็นพระราชกุศล เนื่องในโอกาสวันเฉลิมพระชนมพรรษา พระบาทสมเด็จพระเจ้าอยู่หัว ประจำปี 2563  ในเวลา 07.30 น. พล.อ. อนุพงษ์ และคณะ ร่วมประกอบพิธีถวายสัตย์ปฏิญาณ เพื่อเป็นข้าราชการที่ดีและพลังของแผ่นดิน"sent_tokenize(text)

默认情况下,它使用crfcut引擎进行句子分词。您可以指定它使用其他引擎。下面的例子使用whitespace+newline引擎。

sent_tokenize(text, engine="whitespace+newline")

单词标记化

PyThaiNLP 还附带了一个分词标记器功能。它使用最大匹配算法,newmm作为默认引擎。添加以下导入语句:

from pythainlp import word_tokenize

您可以指定keep_whitespace参数从最终输出中删除空格

text = "เมื่อวันที่ 28 ก.ค.เวลา 07.00 น. ณ บริเวณท้องสนามหลวง พล.อ.อนุพงษ์ เผ่าจินดา รมว.มหาดไทย พร้อมด้วย นายนิพนธ์ บุญญามณี รมช.มหาดไทย"word_tokenize(text, keep_whitespace=False)

可能的引擎包括:

  • longest
  • newmm
  • newmm-safe
  • attacut —需要额外的依赖性。通过pip install attacut安装。

正常化

您可以调用normalize()函数来删除零宽度空格、重复空格、重复元音和悬空字符。在去除重复元音的过程中,它还对元音和声调标记进行重新排序。让我们看看下面的例子:

from pythainlp.util import normalize

normalize("เเปลก") == "แปลก"
# เ เ ป ล ก  vs แ ป ล ก

数字转换

如果您正在寻找将泰语和数字相互转换的方法,以下函数非常适合您:

  • arabic_digit_to_thai_digit —将阿拉伯数字转换为泰国数字
  • thai_digit_to_arabic_digit —将泰语数字转换为阿拉伯数字
  • digit_to_text —将数字转换为泰语文本

下面的例子说明了调用函数的正确方法

from pythainlp.util import arabic_digit_to_thai_digit, thai_digit_to_arabic_digit, digit_to_texttext = "สำหรับการโทรฉุกเฉิน 999 ๙๙๙"arabic_digit_to_thai_digit(text)
thai_digit_to_arabic_digit(text)
digit_to_text(text)

词性标注

PyThaiNLP 提供了两个分析词性标签的函数。

  • pos_tag —基于文字输入
  • pos_tag_sents —基于句子输入

供您参考,您不能简单地将一个字符串列表传递给pos_tag,因为这会影响结果。最好的方法是循环遍历列表,一个一个地调用。导入post_tag()函数,并如下循环列表:

from pythainlp.tag import pos_tagdoc = ["แอปเปิ้ล", "ส้ม", "กล้วย"]
for i in doc:
    print(pos_tag([i], corpus="orchid_ud"))

您可以指定如下engine参数:

  • perceptron —感知器标记器(默认)
  • unigram —单字标签

corpus参数有三个选项:

  • orchid —带注释的泰国学术文章(默认)
  • orchid_ud —带注释的泰语学术文章,但 POS 标签被映射以符合通用依赖性 POS 标签
  • pud —并行通用依赖(PUD)

您应该得到以下输出

[('แอปเปิ้ล', 'NOUN')]
[('ส้ม', 'NOUN')]
[('กล้วย', 'NOUN')]

命名实体识别

您必须为 NER 安装额外的依赖项。在您的终端中运行以下命令

pip install pythainlp[ner]

导入ThaiNameTagger并初始化如下

from pythainlp.tag.named_entity import ThaiNameTagger

ner = ThaiNameTagger()
ner.get_ner("24 มิ.ย. 2563 ทดสอบระบบเวลา 6:00 น. เดินทางจากขนส่งกรุงเทพใกล้ถนนกำแพงเพชร ไปจังหวัดกำแพงเพชร ตั๋วราคา 297 บาท")

3.结论

让我们回顾一下今天所学的内容。

我们首先根据我们需要的特性安装必要的模块和依赖项。

然后,我们继续深入探讨 PyThaiNLP 背后的基本概念和功能。我们特别在文本标记化、词性标注和命名实体识别方面做了一些尝试。

感谢你阅读这篇文章。希望在下一篇文章中再见到你!

参考

  1. PyThaiNLP Github
  2. PyThaiNLP 文档

SQL 初学者指南:迪士尼公主版

原文:https://towardsdatascience.com/beginners-guide-to-sql-disney-princess-edition-bf830f75529e?source=collection_archive---------59-----------------------

我最近在 Coursera 上完成了一门 SQL 课程,正在寻找项目思路时,我看到了 Amanda 的帖子。我联系了她,她建议我阅读奥科·安妮塔关于基础 SQL 的帖子,她就是从那里受到启发的。毫无疑问,我也受到了她的启发,她用一个非常有趣的数据集描述了简单的查询,使其易于理解。

想要尝试类似的东西,我放下头发,开始在互联网上寻找迪士尼公主数据集,在这个数据集里我可以执行我在课程中学到的一些查询。遗憾的是,我找不到公主们特有的东西,所以我决定用 SQLite 创建自己的数据集。

潘晓珍在 Unsplash 上拍照

1)收集数据

利用本网站给出的民意调查评分,我收集了每位公主的排名以及电影名称、投票数和投票百分比。我决定只用名字人气票数。

2)创建表格

CREATE TABLE "Disney" ( "Name" Varchar(10) NOT NULL UNIQUE,
                        "Popularity" Int NOT NULL,
                        "Votes" Int NOT NULL,
                        PRIMARY KEY("Name")
);

注意:

  • 当创建模式(它只是表的结构)时,为属性(列条目)定义某些“规则”是很重要的。
  • VARCHAR 定义值是字符串(即字母/单词),括号内的数字设置字符总数的限制。
  • INT 用于指定这些值是数字。
  • NOT NULL 是一个子句,用于声明列中的值不能为空。
  • 主键是唯一的属性,可用于标识记录。我选择这个作为公主们的名字,因为我发现没有重复的名字,这是识别她们最有效的方法。

3)添加附加属性

接下来,我想增加几个栏目。我使用了修改表格功能:

ALTER TABLE Disney
ADD "Kindness" INT NOT NULL,
    "Intelligence" INT NOT NULL,
    "Courage" INT NOT NULL
);

4)插入值

下一步是使用收集的数据填写表格。名字、受欢迎程度和投票的数值直接取自上面提到的网站,而其余的是基于我的观点(请不要评判!).

这个过程是使用插件完成的

INSERT INTO Disney VALUES("Belle", 1, 539, 9, 9, 7);
INSERT INTO Disney VALUES("Mulan", 2, 341, 6, 8, 9);
INSERT INTO Disney VALUES("Rapunzel", 3, 291, 8, 8, 7);
INSERT INTO Disney VALUES("Ariel", 4, 281, 8, 4, 7);
INSERT INTO Disney VALUES("Elsa", 5, 267, 7, 7, 7);
INSERT INTO Disney VALUES("Moana", 6, 251, 7, 7, 9);
INSERT INTO Disney VALUES("Jasmine", 7, 243, 8, 6, 8);
INSERT INTO Disney VALUES("Cinderella",8, 204, 9, 4, 5);
INSERT INTO Disney VALUES("Merida", 9, 187, 7, 7, 9);
INSERT INTO Disney VALUES("Tiana", 10, 126, 8, 9, 7);
INSERT INTO Disney VALUES("Anna", 11, 109, 8, 7, 7);
INSERT INTO Disney VALUES("Snow White",12, 95, 8, 5, 4);
INSERT INTO Disney VALUES("Aurora",13, 89, 6, 4, 4);
INSERT INTO Disney VALUES("Pocahontas",14, 77, 8, 8, 9);
INSERT INTO Disney VALUES("Esmeralda",15, 43, 9, 6, 7);

5)查看整个表格

SELECR *
FROM Disney;

6)订购数据

虽然只有 15 个值,并且可以同时查看,但是我想练习使用 ORDER BY 函数。

SELECT * 
FROM Disney
ORDER BY Popularity DESC
LIMIT 5;

7)找出“总分”

现在是最后一步,我想练习使用算术函数,所以我决定计算每个公主的善良、智慧和勇气的总和。

SELECT *, SUM(Kindness+Intelligence+Courage) AS "Total"
FROM Disney
GROUP BY Name
ORDER BY Total DESC;

8)结论

就总分而言,粉丝们一直最喜欢的贝儿和波卡洪塔斯打成平手,尽管其他公主也紧随其后。

虽然它是一个小数据集,但这个项目开始起来非常有趣~我开始回忆我的童年,因为我在练习我在课程中学到的技能时,我在网页上搜寻数据。

我希望得到任何反馈!

现在,如果你不介意的话,我要去看一些经典的迪斯尼电影了

深度学习应用 TensorFlow 2.x 初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-tensorflow-2-x-for-deep-learning-applications-c7ebd0dcfbee?source=collection_archive---------17-----------------------

深度学习用 tensor flow 2 . x—Part 1 |Part 2→|Part 3→|Part 4→→→

了解 TensorFlow 平台以及它能为机器学习专家提供什么

如果你正在阅读这篇文章,我确信我们有着相似的兴趣,并且正在/将要从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . Yal n—Linkedin

如果你最近开始学习机器学习,你可能已经意识到与传统机器学习相比,人工神经网络和深度学习的力量。与其他模型相比,人工神经网络需要一套额外的技术技能和概念知识。

图一。深度学习和传统机器学习方法的比较(作者提供图片)

这些技术技能中最重要的是使用深度学习框架的能力。一个好的深度学习框架可以加速开发过程,并提供高效的数据处理、可视化和部署工具。当谈到选择深度学习框架时,截至 2020 年,你只有两个可行的选择:

图二。 PyTorch by 脸书 |图 3。张量流由谷歌

嗯,我们可以连续几天比较 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:婴儿期和初步发展

II——2011 年,Google Brain 开发了一个专有的机器学习库,供 Google 内部使用,名为 DistBelief。DistBelief 主要用于谷歌的核心业务,如谷歌搜索和谷歌广告。

I2015 年,为了加快人工智能的进步,谷歌决定发布 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 年的发展:

I2 月,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 来说确实是一个很大的里程碑。

II——看到移动技术的快速进步,TensorFlow 团队于 2017 年 5 月宣布了 TensorFlow Lite ,这是一个用于移动设备中机器学习开发的库。

I——终于在 2017 年 12 月,谷歌推出了 KubeFlow 。Kubeflow 是一个开源平台,允许在 Kubernetes 上运行和部署 TensorFlow 模型。换句话说,“Kubernetes 的机器学习工具包

2018 年的发展:

II——3 月,谷歌宣布 TensorFlow.js 1.0,该版本使开发者能够使用 JavaScript 实现和服务机器学习模型。

——2018 年 7 月,谷歌公布了 Edge TPU 。Edge TPU 是谷歌专门构建的 ASIC,旨在智能手机上运行 TensorFlow Lite 机器学习(ML)模型。

2019 年的动态:

I2019 年 1 月,TensorFlow 团队宣布 TensorFlow 2.0.0 正式发布日期:2019 年 9 月

II2019 年 5 月, TensorFlow Graphics 宣布着手解决图形渲染和三维建模相关问题。

2019–2020:2019 年 9 月起:TensorFlow 2.0+

II——2019 年 9 月,TensorFlow 团队发布了 TensorFlow 2.0,目前的主要版本,精简了构建神经网络的诸多不便。

随着 2.0 版本的发布,TensorFlow 最终将 Keras 作为官方主要的高级 API 来构建、训练和评估神经网络。

Itensor 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 上转移学习的初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-transfer-learning-on-google-colab-92bb97122801?source=collection_archive---------25-----------------------

了解如何利用深度神经网络的力量来构建和训练最先进的模型

照片来自 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 的初学者指南

原文:https://towardsdatascience.com/beginners-guide-to-transition-from-sas-to-python-fcd17438a7a6?source=collection_archive---------7-----------------------

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 数据步骤中使用DROPKEEP语句来删除和保留数据集中的某些列。

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。

初学者掌握数据科学的路线图

原文:https://towardsdatascience.com/beginners-roadmap-to-master-data-science-f47c5fdab0f9?source=collection_archive---------35-----------------------

揭示数据科学的各个方面以及掌握数据科学需要学习的东西

照片由 Unsplash 上的 Dariusz Sankowski 拍摄

数据科学是当今最热门的技术领域。在过去几年中,对数据科学工作列表的需求稳步上升。据财富报道,统计数据显示,在过去的 4 年里,人工智能专家的雇佣量增长了 74%。数据科学被认为是当代人最热门的工作。

对熟练数据科学家的需求正以前所未有的速度增长。对机器学习、深度学习、计算机视觉、统计学和自然语言处理等人工智能子领域专家的需求和空缺职位每天都在激增。

在本文中,我们将涵盖掌握数据科学并通过创建大量令人难以置信的项目成为成功的数据科学家所需了解的所有重要方面。

我为这篇文章做了一个小的目录列表,它将帮助你对我们将要遇到的事情有一个了解的感觉。

目录:

  1. 数学
  2. 编程;编排
  3. 数据挖掘
  4. 数据可视化
  5. 机器学习
  6. 深度学习
  7. 其他重要分支
  8. 结论

如果你是初学者,我会建议你阅读所有这些东西,但是如果你有信心,那么可以随意跳到你最感兴趣的部分。

1.数学

照片由 Antoine Dautry 在 Unsplash 上拍摄

我发现数学是一门你要么学着喜欢,要么最终爱着讨厌它的学科。有些人觉得数学是一门神奇的学科,而有些人觉得所有这些数字的东西有点无聊。不管你在光谱的哪一边,因为数学是数据科学最基本的要求之一。

数学是数据科学的基本要求。为了征服数据科学的所有数学方面,线性代数、微积分、概率和统计是你需要知道的最重要的概念。

对于初学者来说,高中对这些概念的基本理解就足以进入数据科学的世界。然而,如果你对这些概念不太有信心,或者需要简单梳理一下,那么我强烈推荐你去阅读一些关于 TDS 的文章,因为它们简单易懂地解释了大多数概念。YouTube 视频也是学习这些概念的一个很好的选择。

建立预测机器学习模型、理解解决贝叶斯和其他类似问题的概率和确定性方法、理解深度神经网络中的反向传播、分析梯度下降等等都需要数学。

2.编程;编排

凯利·西克玛在 Unsplash 上的照片

在编程领域,大约有 700 种编码语言。理解每种编程语言的意义以及它们如何影响我们需要执行的特定任务是至关重要的。在数据科学中广泛使用的一种编程语言是 Python。

Python 是一种面向对象的高级编程语言,早在 1991 年就发布了。Python 具有高度的可解释性和高效性。简单来说——Python 很神奇。我最初是从 C、C++和 Java 这样的语言开始的。当我终于遇到 python 的时候,我发现它相当优雅,简单易学,易于使用。

Python 对于任何人来说都是最好的方式,即使是以前没有编程或编码语言经验的人也是如此。尽管有一些缺陷,比如被认为是一种“慢”语言,python 仍然是人工智能和机器学习的最佳语言之一。

尽管有像 R 这样的其他语言,Python 在机器学习中如此受欢迎的主要原因如下

  1. 如前所述,python 非常简单和一致。
  2. 与其他编程语言相比,受欢迎程度的快速增长。
  3. 与各种库和框架相关的丰富资源。我们将在本系列的下一部分进一步详细讨论这一点。
  4. 多功能性和平台独立性。这意味着 python 也可以导入用其他编程语言构建的基本模块。
  5. 伟大的社区和持续更新。总的来说,python 社区充满了令人惊奇的人,并且不断更新以改进 python。

要开始使用 python,你可以从这里下载。

3.数据挖掘

托拜厄斯·菲舍尔在 Unsplash 上的照片

数据收集是在一个已建立的系统中收集和测量目标变量信息的过程,然后使人们能够回答相关问题并评估结果。

数据挖掘是在大型数据集中发现模式的过程,涉及机器学习、统计学和数据库系统的交叉方法。数据挖掘是计算机科学和统计学的交叉学科,其总体目标是从数据集中提取信息(用智能方法)并将信息转换成可理解的结构以供进一步使用。

谷歌搜索显然是寻找新资源的最佳方式。Kaggle 为其举办的每个特定比赛提供了一些最佳数据和数据集选项。有时在 GitHub 上也可以找到非常有趣的数据集。

如果你正在寻找做一些自然语言处理项目,那么你也可以利用维基百科或其他类似的网站通过网络抓取来提取数据。

Data.gov 和 UCI 机器学习库是其他很棒的网站,它们提供了大量丰富的数据集选项。

4.数据可视化

可视化是任何数据科学项目的一个重要方面。

在统计学中,探索性数据分析是一种分析数据集以总结其主要特征的方法,通常采用可视化方法。可以使用或不使用统计模型,但 EDA 主要是为了查看数据可以告诉我们什么,而不仅仅是正式的建模或假设测试任务。

探索性数据分析在数据科学和机器学习项目领域的作用是能够详细了解手头的数据。

探索性数据分析提供了许多图表和种类来可视化和分析可用的数据。它提供了对如何进一步发展的简要理解和想法。

pyplot 和 seaborn 是用于可视化和执行探索性数据分析任务的两个最佳库模块。这些允许你画出许多图形结构,这对分析你的数据非常有帮助。

5.机器学习

照片由安迪·凯利在 Unsplash 上拍摄

机器学习是程序自动学习和提高效率的能力,而无需显式编程。这意味着给定一个训练集,你可以训练机器学习模型,它将理解一个模型到底是如何工作的。在对测试集、验证集或任何其他看不见的数据进行测试时,模型仍然能够评估特定的任务。

让我们用一个简单的例子来理解这一点。假设我们有一个 30,000 封电子邮件的数据集,其中一些被分类为垃圾邮件,一些被分类为非垃圾邮件。机器学习模型将在数据集上训练。一旦训练过程完成,我们可以用一封没有包含在我们的训练数据集中的邮件来测试它。机器学习模型可以对以下输入进行预测,并正确分类输入的电子邮件是否是垃圾邮件。

机器学习方法主要有三种。我们将讨论每一种方法。然后,我将为每种方法列举一些例子和应用。

1.监督学习—

这是使用专门标记的数据集训练模型的方法。数据集可以是二元分类,也可以是多类分类。这些数据集将具有指定正确和错误选项或一系列选项的标注数据。在监督下,即在这些标记数据的帮助下,对模型进行预训练。

2.无监督学习—

无监督学习是在未标记的数据集上训练模型。这意味着模型没有先验信息。它通过将相似的特征和模式组合在一起来训练自己。无监督学习的一个例子可以是狗和猫的分类。给我们的数据将是一个未标记的数据集,包含狗和猫的图像。无监督算法将发现模式中的相似性,并在不指定数据类型的情况下将狗和猫分别分组。

3.强化学习—

强化学习(RL)是机器学习的一个领域,涉及软件代理应该如何在环境中采取行动,以最大化累积回报的概念。强化学习是与监督学习和非监督学习并列的三种基本机器学习范式之一。

6.深度学习

马里乌斯·马萨拉尔在 Unsplash 上的照片

深度学习是机器学习的一个子领域,它基于人工神经网络的概念来执行特定的任务。人工神经网络从人脑中提取灵感。

然而,最重要的是要注意,它们在理论上不像我们的大脑那样运作,甚至一点也不像!它们被命名为人工神经网络,因为它们可以完成精确的任务,同时达到理想的精度,而无需用任何特定的规则显式编程。

几十年前 AI 失败的主要原因是因为缺乏数据和计算能力。然而,在过去几年里,这种情况发生了显著变化。大量的数据每天都在激增,因为大型科技巨头和跨国公司正在投资这些数据。由于强大的图形处理单元(GPU),计算能力也不再是一个大问题。

我将在我的其他帖子中更具体地介绍深度学习,请关注那些即将发布的文章。

7.其他重要分支

由阿恩尔·哈萨诺维奇在 Unsplash 上拍摄的照片

让我们简单了解一下作为初学者掌握数据科学所需的其他主题。这些概念对于创建独特和令人敬畏的项目非常有帮助。事不宜迟,让我们来看看它们。

1]计算机视觉

计算机视觉是人工智能的一个领域,它通过处理图像和图片来解决现实生活中的视觉问题。计算机识别、理解和识别数字图像或视频以自动化任务的能力是计算机视觉任务寻求成功完成和执行的主要目标。

人类识别周围的物体和环境没有问题。然而,对于计算机来说,识别和区分环境中的各种模式、视觉、图像和物体并不容易。

出现这种困难的原因是因为人脑和眼睛的解释能力不同于计算机,计算机解释大部分输出是 0 或 1,即二进制。

图像经常被转换成由红色、蓝色、绿色组成的三维阵列。它们的取值范围是从 0 到 255,使用这种传统的数组方法,我们可以编写代码来识别图像。

您可以通过以下链接了解有关计算机视觉的更多信息:

[## OpenCV:用代码掌握计算机视觉基础的完全初学者指南!

包含代码的教程,用于掌握计算机视觉的所有重要概念,以及如何使用 OpenCV 实现它们

towardsdatascience.com](/opencv-complete-beginners-guide-to-master-the-basics-of-computer-vision-with-code-4a1cd0c687f9)

2]自然语言处理

自然语言处理是数据科学的一个分支,在这里你可以处理语言和语音交流。您可以开发项目,对试图相互交流的人进行语义理解。

这是大多数语言预测模型的工作原理,如下一个单词预测或自动更正。自然语言处理具有巨大的范围,并为高级项目开发智能人工智能提供了广泛的选择。

大公司和小公司都使用的一个例子是聊天机器人,它可以为大多数观众和进入网站的观众提供人机交互。

机器人技术

机器人和人工智能在未来有着广阔的前景。数据科学项目与机器人的集成具有巨大的潜力,可以在几乎不需要人力的行业中实施顶级产品制造。

除此之外,机器人和数据科学可以专门用于在许多预编程任务中实现人类水平的性能。物联网和社区的进步也非常有利于将人工智能集成到机器人中,以开发智能和有效的设备。

结论:

照片由法比奥在 Unsplash 上拍摄

随着数据科学和人工智能的迅速崛起,这可能是任何人投入时间了解这些学科的深度和质量的最佳时机。由于这些领域日益增长的需求和受欢迎程度,每天都有大量的机会等待着每个人。

我希望这篇文章能够让读者了解掌握数据科学所需的基本知识。由于数据科学是一个巨大的领域,需要一些时间来掌握本文中提到的所有技能。但是如果你对这个主题感兴趣的话,它完全值得你花费所有的时间!

让我知道你对数据科学的未来有什么想法,并随时向我提出关于本文的任何疑问。我会尽量最晚回复他们!

看看我的其他一些文章,你可能会喜欢读!

[## 模式编程面试问题解答!

用 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:利用法庭技术

原文:https://towardsdatascience.com/behavioural-code-analysis-65a226e1a601?source=collection_archive---------80-----------------------

技术债务不仅仅是技术上的东西。行为分析在发现技术债务的形成过程中起到了拯救作用。

行为代码分析之于静态代码分析,正如宇宙学之于天文学。它处理宏观尺度,即代码库的宇宙——从它的开始到当前状态,不要忘记幕后的组织机构。

行为代码分析是关于宏的。关于大局。 照片由格雷格·拉科齐在 Unsplash 上拍摄

我已经使用 Sonarqube 来帮助测量 React 项目中的技术债务。作为一个静态分析工具,它返回一个技术负债最高的文件列表。主要的一个是 renderer.js ,有九个问题,包括重复和无用赋值。但这是技术债吗,值得重构吗?

所以我在这里的观点是,静态分析不应该成为指引我们重构之旅的北极星。它只告诉我们代码库的症状。不是疾病。重构后看起来很糟糕的代码可能会很容易地返回到以前的状态,如果你真的不知道它最初为什么会处于那种状态。

诸如贡献者的数量、变更的频率、变更耦合的度量是揭示代码是否腐烂以及为什么腐烂的基础。你不能像 Sonarqube 那样,把一个又一个文件作为单独的部分来分析,而是要通过行为分析把它们作为一个网络来分析。

目录

  • 技术债不是技术债
  • 行为代码分析技巧
  • 组织机构

技术债不是技术债 😕

“一塌糊涂不是技术债。它没有机会在未来支付。一塌糊涂就是永远亏本。”罗伯特·马丁。

技术债务就像金融债务一样,随着时间的推移会变得越来越昂贵,除非我们不断偿还。我们这样做是因为这是一种生存行为,一种赌注,以保证我们的软件满足短期的商业期望。不利的一面是差点的实施。没有正确地在将来集成其他新功能。

我们的技术债务越多,就越接近技术破产,在这种状态下,集成新功能的时间太长了,这使得它们不值得。

技术债务与项目生命周期的关系。

留意 莱曼持续变化定律 ,没有新特性,你的软件会变得没那么有用。那么,无用的作业怎么会是技术债务呢?嗯,我们不能只看代码就知道,我们必须看版本控制工具,它会告诉我们维护这个文件有多困难。

行为代码分析技术

研究表明,文件更改的次数是质量下降的一个很好的指标,会导致错误。为什么不呢?如果一个类改变得太频繁,是不是因为它有太多的责任,或者对它的理解不够。此外,我们经常工作的地方也是重构最有用的地方。

热点

亚当·桑希尔称之为热点。React 有很多这样的例子,ExhaustiveDeps.js 就是其中之一。这些都是潜在的重构目标,是滋生错误代码的温床。它们是复杂代码和活动代码的结果。

通过 Kibana 显示 React 的热点。

复杂性趋势

然后,我们可以开始确定每个潜在重构目标的复杂度趋势。就像火山一样,我们可以分类热点是活跃(即复杂性增加的趋势)休眠(复杂性不变的趋势),还是消亡(复杂性趋势已经开始降低)。虽然文件expletivedeps . js处于休眠状态,但还有其他文件处于活动状态,如 ReactFiberWorkLoop.old.js、。如果不注意的话,将会持续增长到无法维持。

更换联轴器

reactfiberworkloop . old . js是 2759 行代码,本身有 50 多个函数。在掌握它的所有功能之前,我们可以应用另一种技术来理解所有这些功能进化背后的动力。那就是,改变联结。这是两个函数/文件之间的一种共享逻辑,如果你改变其中一个,你很可能必须改变另一个。注意,这不同于软件工程中通常的“耦合”,因为它是不可见的隐含在代码中。我们只能通过观察随着时间的推移所做的改变来注意到它。很快,可以注意到函数 commitRootImplprepareFreshStack 之间的耦合百分比非常高,为 47%。因此,这成为我们开始重构的候选对象。

高耦合度并不一定是错误的,事实上,它在单元测试和它们各自的类中都是意料之中的,但是在其他情况下,我们必须开始问自己它是否容易被察觉。例如,通过遵循 接近 原则,将一起变化的函数分组,我们正在传递仅通过代码不可能表达的信息。

总之,通过热点、复杂性趋势和变化耦合等技术,我们有了一个不同于 Sonarqube 最初给我们的视角。这是因为行为分析背后的范式不同于 Sonarqube,在 Sonarqube 中,从维护的角度来看,并非所有代码都同等重要。仅仅因为一些代码是坏的,并不意味着它是一个问题。我们工作最多的代码越重要。

组织机构这个问题不是技术性的,而是社会性的。

技术债总会有的。重要的是我们如何处理它。大自然母亲长期以来一直教导我们要学会适应未来不可预见的常态。而这正是根源所在,把 的越轨行为正常化:

不可接受的实践或标准逐渐变得可接受的过程。当越轨行为被重复而没有灾难性的结果时,它就成为了组织的社会规范。

解决原因,而不是症状

在软件领域,这意味着当我们接受并继续使用不寻常的功能/系统/行为时,它们就变成了新常态,而其他未来的偏差就变成了另一个新常态,一次又一次。这种现象是无国界的,即使是美国宇航局,一个错误就可能导致生命的损失,也经历过不同的时间——挑战者号,哥伦比亚号。想想看,如果这种现象发生在 Nasa 的组织文化中,为什么在我们的日常项目中不会发生呢?然而,开发商是罪魁祸首。因为没有其他人应该为好看的可维护代码辩护。

“在不召开大型员工会议的情况下,你能在多大程度上实现新功能,这是对一个架构成功与否的最终检验。”作者亚当·托恩希尔。

自 70 年代以来,软件行业的人口持续增长,,预计未来四年全球增长率将达到 20%。意思是发展变得越来越团队化。

然而,社会学已经证明,一个团队拥有的元素越多,就越难以协调,也就越有可能出现沟通上的差距,即所谓的****。此外,在团队中工作时,我们更容易受到影响,因为无论你是否注意到,我们的价值观和决策都会突然受到团队行为的影响。这种现象通常被称为 旁观者效应 ,可以通过两个主要的社会方面来解释。

  • 多元无知 。这是一个群体状态,群体的规范被公开接受,却被私下拒绝。这是因为每个人都觉得自己是唯一这样想的人,害怕被排斥。所以所有人都没有采取行动。例如,这在人际关系中很常见,在学生课堂上——当害怕在课堂上暴露怀疑时——甚至在紧急情况下,如果有一个旁观者而不是一群人在场,受害者有更好的生存机会。
  • 责任扩散 。一个人的状态,在一大群人当中感觉不那么负责,不那么负责。责任被稀释了,从个人到群体,但如果每个人都有这种感觉,那么就没有人会对那个责任负责。

这个问题不是技术性的,而是社会性的。照片由哈维尔·阿莱格·巴罗斯在 Unsplash 上拍摄

除了关注重构什么,我们不应该低估组织机构。研究表明,实践代码评审,并有一个主要的维护者对代码的质量有积极的影响。这个问题不是技术性的,而是社会性的。我们不应该只依靠自己,因为我们是主观的,有偏见的,适应性强的。但是我们可以利用从行为分析中得出的不带偏见的、客观的试探法,来了解幕后发生的事情。

我的行为代码分析的学习之路是从亚当·托希尔的书开始的, 【你的代码作为犯罪现场】软件设计 x 光片 。在这段旅程中,我学到了更多关于代码的社会方面,除了跟踪代码本身,版本控制工具还有多强大。最后,让我开发一个新的开源工具,它可以很好地完成上面强调的技术。**

*** [## 行为代码分析器

该工具利用 Kibana 的可视化特性,提供更加可定制的分析体验。

github.com](https://github.com/pbmiguel/behavioural-code-analyser)***

冠状病毒死亡率的背后

原文:https://towardsdatascience.com/behind-the-coronavirus-mortality-rate-4501ef3c0724?source=collection_archive---------9-----------------------

对死亡率的进一步观察。它告诉我们什么?

2020 年 2 月 21 日丁香元冠状病毒确诊病例图

在之前的文章中,我介绍了一个 Python 工具箱来收集和分析冠状病毒流行数据。在本文中,我将使用 Python 工具箱深入研究流行病的一个衡量指标——死亡率。我将重点讨论以下几个问题:

  1. 死亡率的地区差异是什么?
  2. 目前的死亡率可能是低估还是高估?

现在我们开始吧。

健全性检查

就像任何数据分析任务一样,我们应该总是在实际工作之前执行健全性检查。所以让我们独立验证一下世界卫生组织对 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 日

幕后——流媒体服务如何知道我们接下来想看什么?

原文:https://towardsdatascience.com/behind-the-scenes-how-does-a-streaming-service-know-what-we-want-to-watch-next-52d5f53731a1?source=collection_archive---------43-----------------------

推荐系统综述

网飞公司成立于 1997 年,最初是一家通过邮件租赁 DVD 的公司,在十年内发展成为一家视频流媒体服务公司,现在已经成为我们生活中不可分割的一部分。通过后端的推荐引擎,它可以发现一个又一个值得狂欢的标题,从而确保客户粘性。事实上,主页上的“网飞流行”并不是全球流行图书的权威排名,而是基于浏览历史的相似用户中流行图书的代表。推荐系统是网飞收入的一个重要贡献者,为该平台上约 80%的时间提供了动力。

照片由 Unsplash 上的延斯·克罗伊特拍摄

该平台分析观众如何点击、搜索、观看、播放和暂停,以生成隐性评分,从而对出现在主页上的标题进行个性化设置。这是一种比依赖用户的明确评级更具可扩展性的方法(例如——星星的数量,如按钮等)。

为了更好地识别用户的偏好,内容被分为成千上万个微观类型,具体如“备受好评的情感失败者电影”或“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 推荐这部电影。

通过转置评级矩阵并重复这些步骤来寻找相似的项目而不是相似的用户,可以为项目-项目协同过滤重复该过程。

通常用户数量远远超过任何平台上的项目数量。因此,项目-项目协同过滤给了我们一个更好的结果,因为它更容易分组相似的项目,而不是相似的用户。

潜在因素模型

照片由布鲁斯·马斯在 Unsplash 上拍摄

我们有多少次在不知道自己喜欢这首歌的确切原因的情况下循环播放了这首歌?

潜在因素模型试图发现那些不容易被发现的隐藏特征。他们根据这些特征来描述用户和物品的特征。

矩阵分解

这是通过称为 矩阵分解 的方法来完成的,该方法将用户(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's recommendation system is an,targeted advertisements to its users.) [## 网飞推荐:超越五星(下)

更深入地了解我们更广泛的个性化技术。

netflixtechblog.com](https://netflixtechblog.com/netflix-recommendations-beyond-the-5-stars-part-2-d9b96aa399f5)

https://blogs . commons . George town . edu/cctp-607-spring 2019/2019/05/06/music-to-my-ears-de-black box-spotifys-recommendation-algorithm/

用于高度可扩展推荐系统的增量奇异值分解算法(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 单源最短路径算法

原文:https://towardsdatascience.com/bellman-ford-single-source-shortest-path-algorithm-on-gpu-using-cuda-a358da20144b?source=collection_archive---------27-----------------------

计算连通图中从一个源顶点到所有其它顶点最短距离的并行算法

蒂莫·沃尔茨在 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 ,以及存储每个边的权重的权重数组 WI[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 年教程

基准图神经网络

原文:https://towardsdatascience.com/benchmarking-graph-neural-networks-d644e0bf54d5?source=collection_archive---------38-----------------------

这是一篇论文基准图神经网络的介绍性博客,该论文是与柴坦尼亚·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) ,收集有意义的中大规模数据集,以指导图学习研究。该倡议是对该项目的目标的补充。

提议的基准框架:

我们为图形神经网络提出了一个基准框架,具有以下关键特征:

  1. 我们开发了一个模块化的编码基础设施,可以用来加速新思想的发展
  2. 我们的框架采用了严格而公平的实验协议,
  3. 我们提出了适当的中等规模的数据集,可以作为后续研究的插件。
  4. 涵盖了图机器学习中的四个基本任务,即图分类、图回归、节点分类和边分类。

a.编码基础设施:

我们的基准代码基础设施基于 Pytorch / DGL 。

从高层次来看,我们的框架统一了以下独立组件: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}
}

脚注:

  1. 这样说,我们并不意味着这些想法没有用,或者作者的工作没有意义。每一项努力都同样有助于这一领域的发展。
  2. 举个例子,你可以参考 这些 的作品 ,利用我们的框架来方便地研究他们的研究思路。它表明了拥有这样一个框架的有效性。
  3. 请注意,我们的目标不是开发一个软件库,而是提出一个编码框架,其中每个组件都是简单的,并且对尽可能多的用户是透明的。

本帖原载于 NTU 图深度学习网站

自然语言处理的基准语言检测

原文:https://towardsdatascience.com/benchmarking-language-detection-for-nlp-8250ea8b67c?source=collection_archive---------6-----------------------

入门

用于识别文本语言的四个 Python 工具,以及速度和准确性测试

杰奎琳·布兰德韦恩在 Unsplash 上的照片

大多数 NLP 应用程序往往是特定于语言的,因此需要单语数据。为了用目标语言构建应用程序,您可能需要应用一种预处理技术,过滤掉用非目标语言编写的文本。这需要正确识别每个输入示例的语言。下面我列出了一些工具,您可以使用它们作为 Python 模块来满足这个预处理需求,并提供了一个性能基准来评估每一个工具的速度和准确性。

1)语言检测

[## langdetect

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]

几个点缀点:

  1. 库制作者建议您将DetectorFactory种子设置为某个数字。这是因为 langdetect 的算法是不确定的,这意味着如果你试图在太短或太模糊的文本上运行它,你可能每次运行它都会得到不同的结果。设定种子在开发/评估期间强制执行一致的结果。
  2. 您可能还想在 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作为命令行工具使用。查看他们的回购协议,了解更多细节和其他选择。

[## saffsd/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

原文:https://towardsdatascience.com/benchmarking-named-entity-recognition-stanfordnlp-ibm-spacy-dialogflow-and-textspace-af6615eb7930?source=collection_archive---------39-----------------------

在这篇文章中,我们比较了 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://towardsdatascience.com/benchmarking-off-the-shelf-sentiment-analysis-c797c732836c?source=collection_archive---------30-----------------------

来源: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

有一个明显的赢家?

原文:https://towardsdatascience.com/benchmarking-with-one-clear-winner-279691cbd11d?source=collection_archive---------44-----------------------

网络安全机器学习: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 给数据科学家带来的好处

原文:https://towardsdatascience.com/benefits-of-tableau-for-data-scientists-fe936a2ae799?source=collection_archive---------26-----------------------

Tableau 在有编程和没有编程的情况下如何有用?

照片由凯特琳·贝克在Unsplash【1】上拍摄。

目录

  1. 介绍
  2. 快速简单
  3. SQL、R、Python 和 MATLAB
  4. k 均值算法
  5. 跨职能部门
  6. 摘要
  7. 参考

介绍

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)

跨职能部门

活动创建者在Unsplash【5】上的照片。

对于数据科学家来说,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)

本福特定律——一个简单的解释

原文:https://towardsdatascience.com/benfords-law-a-simple-explanation-341e17abbe75?source=collection_archive---------2-----------------------

拉蒂夫·纳塞尔在他的网飞节目中没有告诉我们的“第一位数法则”是什么,连线。

尼克·希利尔在 Unsplash 上的照片

如果你还没有看过,看看网飞系列,连接。很好看的节目。主持人拉蒂夫·纳赛尔讨论了流行科学中的各种主题。网飞将其吹捧为一个系列“调查我们与彼此、世界和宇宙之间令人惊讶和错综复杂的联系方式”[1]

在第四集的数字中,拉蒂夫探索了本福德定律(BL),也称为第一位数定律。据观察,许多数据集,无论是人工的还是自然的,包含的以数字 1 开头的数字比其他任何数字都多,约占所有数字的 30%。并且随后的前导数字的频率下降,直到数字 9,其在数据集中仅约 5%的数字中作为第一个数字出现。这是令人惊讶的,因为你会期望数字的九个可能的前导数字平均分布在 11%左右。

该节目着眼于商业智能的历史,并显示出各种各样的数据集,如火山的大小,古典音乐中音符的组合长度,以及公司的财务报表似乎都遵循商业智能。

有一个问题被提出,但从未真正得到回答——为什么许多数据集遵循 BL?该节目暗示 BL 的存在揭示了宇宙的某种深层宇宙计划。

这里有一个简单的解释,纳赛尔和他采访的任何人都没有提到过:

由多个独立因素的乘积组成的数据集将遵循本福特定律。

这个解释已经为人所知一段时间了[2][3][4],但并没有在节目中出现。本福德定律不是我们宇宙的神秘属性。这只是基本的数学。

概观

在本文中,我将简要介绍 BL 的背景,解释两个关键概念:正态分布和对数,展示掷骰子练习如何导致 BL,最后看看一些真实的数据集,看看这个解释是否成立。

西蒙·纽康图片来自维基媒体,公共领域弗兰克·本福特作者根据公共领域Nigrini.com的一张图片所作的图片说明

背景

本福德定律是以美国物理学家弗兰克·本福德的名字命名的,他在 1938 年发表了一篇名为“异常数字定律”的论文,描述了在数据集[5]中观察到的数字的第一个数字的频率。请注意,这种现象之前已经被加拿大天文学家西蒙·纽康在 1881 年观察到并发表过[6]。

(简短的旁注:事实上,事物经常以不是第一个发现它的人的名字命名是很常见的。事实上,对此有一个名称,斯蒂格勒的借代法则。它是由美国统计学教授斯蒂芬·斯蒂格勒在 1980 年提出的,当时他写道,没有一项科学发现是以其最初发现者的名字命名的。具有讽刺意味的是,斯蒂格勒承认,美国社会学家罗伯特·默顿之前已经发现了“斯蒂格勒定律”。)

回到本福特。他在论文中观察到,许多不同的数据集都紧密遵循以下第一位数字的分布,在下图中显示为百分比。

作者图片

本福德查看的数据集包括各种各样的东西,如城市人口、化合物的原子量、财务支出,甚至是他在某份报纸上能找到的所有数字。这是他论文的摘录。

摘自弗兰克·本福特的论文《反常数定律》,1938 年,公共领域

他继续用数学术语解释他观察到的第一个数字频率的定律,但他并没有真正提出原因。他写道,该定律“显然比我们的数字系统能够独立解释的更深入原始原因的根源。”[5]

接下来,我们将通过观察公路交通速度来了解正态分布。

来自 Pixabay 的克里斯汀·斯蓬基亚的图片

正态分布

你可能已经看到了正态分布的样子。这是概率论中著名的“钟形曲线”。正态分布,也称为高斯分布,是一种变量的连续概率分布。

例如,假设一个城市的规划者想要检查高速公路上特定地点的平均速度。他们在路上放下一对传感器条,开始记录过往车辆的速度。看看下面直方图中的样本数据。

作者图片

车辆的平均速度大约是每小时 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 等人。

好吧,好像是成长的事情。接下来,我们来看看财务。

照片由钢网在 Unsplash 上拍摄

资产

金融界的许多数据集似乎都遵循 BL。会计师可以利用这一事实来帮助发现欺诈和其他违规行为。

人们发现恩福德定律适用于许多组财务数据,包括所得税或股票交易数据、公司支出和销售数据、人口统计数据和科学数据[11] —马克·尼格里尼

下图显示了俄克拉荷马州在 2019 年支付的所有费用[12]。

作者图片

您可以看到有一个对数正态分布,但它有点向左倾斜。此外,第一个数字与 BL 有一点偏差。例如,以数字 9 开头的数字似乎不合规。目前还不清楚这一分析是否表明账簿存在问题。我将把它留给审计人员来仔细检查。

辛迪·杜奇(Cindy Durtschi)等人有一篇关于这个主题的很好的论文,叫做“有效利用本福特定律来协助检测会计数据中的欺诈”[12]。该文件有一个表格,显示哪些类型的财务数据预计将遵循基本原则。

C . Durtschi,W . hill ison,C . Pacini——法务会计杂志,2004 年

注意,本福特分析可能有用的前两个例子是卖出数量*价格买入数量*价格。这些值是独立因素的产物。这些类型的值的其他倍增因素可能包括税和百分比费用。如果值跨越几个数量级,这可能会使该帐户数据遵循对数正态分布。

接下来让我们来看看来自大自然的东西:河流的长度。

照片由丹·罗泽尔在 Unsplash 上拍摄

在前面的例子中,我们看到了具有对数正态分布并遵循 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 美元。非会员每月只能看三个锁定的故事。

第一部分:孟加拉语。人工智能手写字形分类

原文:https://towardsdatascience.com/bengali-ai-handwritten-grapheme-classification-adaa73762754?source=collection_archive---------22-----------------------

工作主持人: 大卫·柯布迪杰森·卡茨迈克尔·哈德奈娜·沃顿**

基线模型笔记本

查看 系列第二部分 第三部分

作为世界上第五大通用语言,孟加拉语也是最复杂的语言之一。孟加拉语的字母表由 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

柏林房屋租赁市场分析

原文:https://towardsdatascience.com/berlin-house-rental-market-analysis-18dfc0c2ca9?source=collection_archive---------37-----------------------

我支付的价格公平吗?

简介

不久前,柏林曾是一个与低生活成本相关的地方,吸引了许多以低廉价格寻求高质量生活的人。然而,也许由于这种流行和其他宏观经济变化,那些日子已经成为过去。

问问目前住在柏林的任何人,他们都会告诉你获得房屋租赁合同有多难,这不仅是因为报价稀缺和对公寓的大量需求,也是因为价格飙升,尽管国家采取了监管措施。

有了以上的基调,并发现自己正在寻找一个新的住处,我决定使用数据驱动的方法来帮助我进行搜索,并给我基于数据做出好决定的信心。因此,在这篇文章中,我将描述我在这个过程中的一些发现。

在几个月的时间里,我从网站上收集了一些柏林某些地区的市场数据——有些地区没有包括在内,因为我不想在那里生活。根据我收集的数据,我有兴趣回答几个有助于我搜索的问题,但主要问题是:

  • 最贵和不贵的地区有哪些?
  • 什么时候发布新房源最受欢迎?
  • 我支付的价格公平吗?
  • 是什么让一些房源比其他房源更有吸引力?

我会在这篇文章中尝试回答这些问题,所以请继续阅读!

最贵和最便宜的地区是哪里?

我想看看我的预算允许我住在哪里,因此知道某个地区的平均要价是第一步。

澄清 暖价 的含义很重要:在德国房价通常分为冷价和暖价,分别对应于取暖费、维修费、垃圾收集费和其他维护费用前后的价格。因此,我们最感兴趣的租赁成本是温暖的价格。

下面的柱状图以降序显示了该数据集中柏林最昂贵的地区。正如我们所料,最昂贵的区域是 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 。

多标签文本分类

原文:https://towardsdatascience.com/bert-multilabel-text-classification-a7f560db34e5?source=collection_archive---------19-----------------------

介绍

在我的上一篇文章中,我介绍了各种机器学习方法,这些方法能够为单个电影描述指定一组相关的流派(请访问文章获取数据集)。分类器链模型获得了最好的 F1 值= 0.43。我要验证的想法是用 BERT 嵌入来训练神经网络。

BERT (来自变形金刚的双向编码器表示)是由谷歌人工智能语言的研究人员开发的一个新模型。

它的主要创新是将一种流行的注意力模型 Transformer 的双向训练应用于语言建模。这导致了比单向语言模型更深刻的语言上下文和流程感。

密码

Bert_serving 支持使用 Bert 模型作为句子编码服务,用于将可变长度的句子映射到固定长度的句子。

为了找到最佳的参数,我使用了神圣模块。神圣是一个工具,帮助您配置,组织,记录和复制实验,以便:

  • 记录你实验的所有参数
  • 轻松运行不同设置的实验
  • 在数据库中保存单次运行的配置

修改后的参数如下:

  1. max_seq_len —序列的最大长度。找到的最佳值是 256 ,这需要使用 GPU
  2. batch_size —将通过网络传播的样本数量。选择的号码是 128
  3. gamma —聚焦损失中的聚焦参数,平滑调整简单示例向下加权的速率。焦点损失旨在通过降低内联体(简单的例子)的权重来解决类别不平衡,这样即使它们的数量很大,它们对总损失的贡献也很小。它侧重于训练一组稀疏的硬例子。在我们的例子中,伽马的最佳值是 2

得到了 F1 = 0.49

标签共现

我们需要记住,在我们的数据集中有多个标签,有时一个标签表示另一个标签的出现。为了检查这种百分比依赖性,我创建了共现矩阵。例如,现在我们知道:

Action Comedy -> Action, 0.9722222222222222
Action Comedy -> Comedy, 0.9629629629629629
Action Thrillers -> Action, 0.9492537313432836
Action Thrillers -> Thriller, 0.9253731343283582
Adventure Comedy -> Comedy, 0.9101123595505618

下图显示了前 100 个最强的依赖关系。

标签共现的路由弦

有了获得的知识,我们现在可以尝试修改我们的预测。经过几次尝试,我决定将结果标签的值改为 1,前提是它与指示标签的同现度大于或等于 0.9。

更新后的 F1 成绩是 0.5 ,小进步。

结果

示例结果如下所示。

First Platoon centers around Rock Brannigan ([[Scott Gibson  and his ragtag squad of ex-military zombie hunters trying to make a living in the desert Southwest two years after the zombie apocalypse. Along the way they encounter the grizzled Pa Jericho , and the eccentric Rex Necro .
**Action, Comedy, Horror, Parody, Science Fiction**The life of the S&M-theme artist and author Seiu Ito is depicted in the film. His artistic life and Sadian philosophy, inspired by his torturing of his two wives and Tae, his favorite prostitute, are portrayed as shown in his journalistic writings. Tae is eventually driven insane due to Ito's attentions.
**Drama, Japanese Movies, World cinema**

结论

使用 BERT 嵌入技术使 F1 得分提高了 7%(总体提高了 50%)。

在未来的工作中,我认为减少标签的数量,只保留主要的标签是个好主意。由于“动作喜剧”在 100%的情况下是“动作”,在 100%的情况下是“喜剧”,也许我们真的不需要这个类别。

感谢您的阅读。

BERT NLP——如何构建问答机器人

原文:https://towardsdatascience.com/bert-nlp-how-to-build-a-question-answering-bot-98b1d1594d7b?source=collection_archive---------6-----------------------

通过亲自动手的 PyTorch 代码理解直觉,BERT 在 SQuAD 上进行了微调。

斯蒂夫·约翰森在 Unsplash 上的抽象画

本文将介绍基于神经网络创建和编码问答系统的关键思想。实现使用谷歌的语言模型,称为预训练伯特。实践证明 PyTorch 代码的问题回答与伯特微调和班是在文章的最后提供。

什么是问答?

在问答任务中,模型接收关于文本内容的问题,并被要求在文本中标记答案的开始和结束。

带答案的文本和相关问题示例

在上面的例子中,问题的答案是“除了 SCN 细胞之外,在哪里还发现了独立的昼夜节律?”位于红色突出显示的位置。问题“独立时钟的术语是什么?”在蓝色位置回答。

如果我们有一个非常大的这样的文本集,以及样本问题和答案在文本中的位置,我们可以训练一个神经网络来学习上下文、问题和答案之间的关系。给定与训练文本相似的新上下文,由此产生的网络将能够回答看不见的问题。

几十年来,机器阅读理解一直吸引着计算机科学家的注意力。最近大规模标记数据集的产生使研究人员能够建立受监督的神经系统,自动回答用自然语言提出的问题。

小队数据集

斯坦福问答数据集(SQuAD) 是用于阅读理解的大规模标记数据集的主要例子。Rajpurkar 等人开发了 SQuAD 2.0,它结合了一组维基百科文章中关于同一段落的 10 万个可回答问题和 5 万个无法回答的问题。这些无法回答的问题是由人群工作者以敌对的方式写出来的,看起来与可回答的问题相似。

小队数据集的快照

doc_tokens描述上下文,即我们希望模型理解的文本。

At the 52nd Annual Grammy Awards, Beyoncé received ten nominations, including Album of the Year for I Am... Sasha Fierce, Record of the Year for "Halo", and Song of the Year for "Single Ladies (Put a Ring on It)", among others. She tied with Lauryn Hill for most Grammy nominations in a single year by a female artist. In 2010, Beyoncé was featured on Lady Gaga's single "Telephone" and its music video. The song topped the US Pop Songs chart, becoming the sixth number-one for both Beyoncé and Gaga, tying them with Mariah Carey for most number-ones since the Nielsen Top 40 airplay chart launched in 1992\. "Telephone" received a Grammy Award nomination for Best Pop Collaboration with Vocals.

question_text描述应该从上下文中回答的问题。

How many awards was Beyonce nominated for at the 52nd Grammy Awards?

orig_answer_text代表问题的正确答案。

ten

答案总是从上下文中开始于start_position 并结束于end_position的部分。如果该问题在上下文中没有任何答案,is_impossible 的值为true

问答中的迁移学习

SQuAD 数据集提供了 15 万个问题,这在深度学习世界中并不算多。迁移学习背后的想法是采用一个在非常大的数据集上训练的模型,然后使用 SQuAD 数据集对该模型进行微调。

BERT 的整体预培训和微调程序。图片由 Jacob Devlin 等人@ Google AI Language (来源:Arxiv 上的原始 BERT 论文)

BERT 是一个训练有素的 Transformer 编码器堆栈,基本版有 12 个,大版有 24 个。伯特接受了维基百科和图书语料库的培训,图书语料库包含超过 10,000 本不同流派的书籍。我将在下面的文章中详细介绍 Transformer 架构。

[## 伯特解释道。迷失在翻译中。被变形金刚发现。

打造下一个聊天机器人?伯特,GPT-2:解决变压器模型的奥秘。

towardsdatascience.com](/lost-in-translation-found-by-transformer-46a16bf6418f)

我们可以使用 BERT 从小队文本中提取高质量的语言特征,只需在顶部添加一个线性层。线性图层有两个输出,第一个输出用于预测当前子笔画是答案的开始位置的概率,第二个输出用于预测答案的结束位置。

下面你可以找到一个模型的总结。为了简单起见,我只显示了第一个和最后一个编码器层。同一层通常会重复 12 次。我们可以在开头看到Bert embeddeds层,后面是每个编码器层的 Transformer 架构: BertAttentionBertIntermediateBertOutput 。最后,我们有两个输出的 BertPooler线性层。

训练模型相对简单。底层已经有了很好的英语单词表示,我们只需要训练顶层,在底层进行一些调整来适应我们的问答任务。为此,您可以定制我在下面的文章中提供的代码。

[## 伯特为假人-一步一步教程

变压器 DIY 实用指南。经过实践验证的 PyTorch 代码,用于对 BERT 进行微调的意图分类。

towardsdatascience.com](/bert-for-dummies-step-by-step-tutorial-fb90890ffe03)

你可能期望 F1 分数在 74%左右。如果我们查看当前的 SQuAD 1.0 排行榜,我们会看到对测试数据集的评估使我们进入了前 100 名,鉴于免费 GPU 上可用的资源有限,这是可以接受的。

微调后的模型可用于对我们选择的文本和问题进行推理。

结论

在本文中,我解释了如何在 SQUaD 数据集上微调预训练的 BERT 模型,以解决任何文本上的问答任务。

你可以用 BERT 改编我的 PyTorch 代码用于 NLU 来解决你的问答任务。

一些读者可能会发现这本谷歌 Colab 笔记本中的完整代码更加简单明了。功劳归于微软首席数据科学家 Prachur Bhargava 和美国运通软件工程师 Himanshu Mohan ,他们优雅地解决了在 Google Colab 上训练模型的内存问题。谢谢你,Prachur 和 Himanshu!

你可以在我下面的文章中了解更多关于语言模型的知识。

[## 自然语言处理中的文本表示

理解书面单词:温习 Word2vec、GloVe、TF-IDF、单词袋、N-grams、1-hot 编码…

towardsdatascience.com](/representing-text-in-natural-language-processing-1eead30e57d8) [## 伯特为假人-一步一步教程

变压器 DIY 实用指南。经过实践验证的 PyTorch 代码,用于对 BERT 进行微调的意图分类。

towardsdatascience.com](/bert-for-dummies-step-by-step-tutorial-fb90890ffe03) [## 具有潜在狄利克雷分配(LDA)的主题建模教程

这是一本实用指南,包含经过实践检验的 Python 代码。找到人们在推特上谈论的内容。

towardsdatascience.com](/topic-modeling-with-latent-dirichlet-allocation-by-example-3b22cd10c835) [## 情感分析:一个基准

递归神经网络解释。使用 FCNNs、CNN、RNNs 和嵌入对客户评论进行分类。

towardsdatascience.com](/sentiment-analysis-a-benchmark-903279cab44a) [## 基于序列对序列模型的自然语言理解

如何预测客户询问背后的意图?Seq2Seq 型号说明。在 ATIS 数据集上演示的槽填充…

towardsdatascience.com](/natural-language-understanding-with-sequence-to-sequence-models-e87d41ad258b) [## 假人的神经机器翻译——5 分钟指南

AI 能让濒危语言不消失吗?

towardsdatascience.com](/heres-how-to-build-a-language-translator-in-few-lines-of-code-using-keras-30f7e0b3aa1d) [## 自然语言处理中的真实大小写

恢复推文和短信中的大写字母可以提高可读性。正确的正确大小写对于…至关重要

towardsdatascience.com](/truecasing-in-natural-language-processing-12c4df086c21)

感谢阅读。

不同语言的文本分类

原文:https://towardsdatascience.com/bert-text-classification-in-a-different-language-6af54930f9cb?source=collection_archive---------19-----------------------

用 HuggingFace 和简单的变形金刚构建非英语(德语)BERT 多类文本分类模型。

原载于 2020 年 5 月 22 日https://www . philschmid . de

介绍

目前,我们有 75 亿人生活在世界上大约 200 个国家。其中只有 12 亿人以英语为母语。这导致了大量非结构化的非英语文本数据。

大多数教程和博客帖子都用英语演示了如何使用基于 BERT 的架构来构建文本分类、情感分析、问答或文本生成模型。为了克服这种缺失,我将向大家展示如何建立一个非英语的多类文本分类模型。

英语母语者的世界

打开我的文章,让我来猜猜你是否听说过伯特。如果你还没有,或者你想更新一下,我推荐你阅读这篇文章。

在深度学习中,对于如何建立语言模型,目前有两种选择。您可以构建单语模型或多语言模型。

“使用多种语言,还是不使用多种语言,这是个问题”——就像莎士比亚会说的那样

多语言模型描述了可以理解不同语言的机器学习模型。来自 Google research 的 mBERT 就是一个多语言模型的例子。该型号支持并理解 104 种语言。单语模特,顾名思义能听懂一种语言。

多语言模型已经在某些任务上取得了良好的效果。但是这些模型更大,需要更多的数据,也需要更多的时间来训练。由于需要大量的数据和时间资源,这些特性导致了更高的成本。

由于这个事实,我将向你展示如何训练一个单语的非英语的基于 BERT 的多类文本分类模型。哇,那是一个长句子!

伯特——得到了迷因

辅导的

我们将使用简单变形金刚——一个基于 HuggingFace 的变形金刚库的 NLP 库。Simple Transformers 允许我们用几行代码来微调 Transformer 模型。

作为数据集,我们将使用由德语推文组成的 Germeval 2019 。我们将检测和分类辱骂性语言的推文。这些推文分为四类:PROFANITYINSULTABUSEOTHERS。在这个数据集上获得的最高分是0.7361

我们将:

  • 安装简单的变压器库
  • 选择预先训练好的单语模型
  • 加载数据集
  • 训练/微调我们的模型
  • 评估培训的结果
  • 保存训练好的模型
  • 加载模型并预测一个真实的例子

在本教程中,我使用了带有 GPU 运行时的 Google Colab。如果你不确定如何使用 GPU 运行时,看看这里的。

安装简单的变压器库

首先,我们用 pip 安装simpletransformers。如果你没有使用 Google colab,你可以点击查看安装指南。

选择预先训练好的单语模型

接下来,我们选择预训练模型。如上所述,简单变形金刚库基于 HuggingFace 的变形金刚库。这使我们能够使用变形金刚库中提供的每个预训练模型和所有社区上传的模型。对于包括所有社区上传模型的列表,我指的是https://huggingface.co/models。

我们将使用distilbert-base-german-cased型号,一种更小、更快、更便宜的 BERT 版本。它使用的参数比bert-base-uncased少 40%,运行速度快 60%,同时仍然保留了 95%以上的 Bert 性能。

加载数据集

数据集存储在两个文本文件中,我们可以从竞赛页面中检索。下载它们的一个选择是使用两个简单的wget CLI 命令。

之后,我们使用一些pandas魔法来创建一个数据帧。

因为我们没有测试数据集,所以我们分割数据集— train_dftest_df。我们将 90%的数据用于训练(train_df),10%用于测试(test_df)。

加载预训练模型

下一步是加载预先训练好的模型。我们通过创建一个名为modelClassificationModel实例来做到这一点。此实例采用以下参数:

  • 架构(在我们的案例中是"bert")
  • 预训练模型("distilbert-base-german-cased")
  • 类别标签的数量(4)
  • 还有我们训练用的超参数(train_args)。

您可以在广泛的可能性范围内配置超参数。有关每个属性的详细描述,请参考文档。

训练/微调我们的模型

为了训练我们的模型,我们只需要运行model.train_model()并指定要训练的数据集。

评估培训的结果

在我们成功地训练了我们的模型之后,我们可以对它进行评估。因此,我们创建一个简单的辅助函数f1_multiclass(),用于计算f1_scoref1_score是对模型精度的测量。更多关于那个这里。

我们取得了0.6895f1_score。最初,这似乎相当低,但请记住:在 Germeval 2019 的最高提交量是0.7361。如果不调整超参数,我们将获得前 20 名的排名。这是相当令人印象深刻的!

在以后的文章中,我将向您展示如何通过调优超参数来获得更高的f1_score

保存训练好的模型

Simple Transformers 会在每一步2000和训练过程结束时自动保存model。默认目录是outputs/。但是output_dir是一个超参数,可以被覆盖。我创建了一个助手函数pack_model(),我们用它将所有需要的模型文件pack到一个tar.gz文件中进行部署。

加载模型并预测一个真实的例子

最后一步,我们加载并预测一个真实的例子。因为我们用pack_model()提前一步打包了文件,所以我们必须先用unpack打包它们。因此,我编写了另一个助手函数unpack_model()来解包我们的模型文件。

为了加载一个保存的模型,我们只需要为我们保存的文件提供path,并像我们在训练步骤中那样初始化它。注意:在加载模型时,您需要指定正确的(通常与训练中使用的相同)参数。

初始化之后,我们可以使用model.predict()函数对给定输入的输出进行分类。在这个例子中,我们从 Germeval 2018 数据集中提取了两条推文。

我们的模型预测了正确的类别OTHERINSULT

简历

总之,我们可以说我们实现了创建非英语的基于 BERT 的文本分类模型的目标。

我们的例子提到了德语,但可以很容易地转换成另一种语言。HuggingFace 为法语、西班牙语、意大利语、俄语、汉语、…

感谢阅读。你可以在这里找到带有完整代码的 colab 笔记本。

如果你有任何问题,随时联系我。

使用 Pytorch 的 BERT 文本分类

原文:https://towardsdatascience.com/bert-text-classification-using-pytorch-723dfb8b6b5b?source=collection_archive---------0-----------------------

使用 Huggingface 库提供的 BERT 分类任何文本

照片由克莱门特·H在 Unsplash 上拍摄

介绍

文本分类是自然语言处理中最常见的任务之一。它被广泛应用于各种应用中,包括情感分析、垃圾邮件过滤、新闻分类等。在这里,我们向您展示如何使用最先进的模型来检测假新闻(将文章分类为真实或虚假),这是一个可以扩展到任何文本分类任务的教程。

变压器 是当前最先进的 NLP 架构的基本构建模块。它的主要优势是它的多头注意力机制,与以前的竞争模型(如递归神经网络)相比,它可以提高性能并显著提高并行性。在本教程中,我们将使用预先训练好的 BERT ,这是最流行的变形金刚模型之一,并在假新闻检测上对其进行微调。在后面的教程中,我还使用了一个 LSTM 来完成同样的任务,如果感兴趣的话,请检查一下!

这篇文章的主要源代码可以在这个 Google Colab 笔记本中找到。

预处理代码在这款 Google Colab 笔记本中也有。

入门

Huggingface 是用 Python 实现最新变形器的最知名的库。它提供了清晰的文档和教程,介绍了如何为各种不同的任务实现几十种不同的转换器。我们将使用 Pytorch ,因此请确保 Pytorch 已安装。在确保安装了相关库之后,您可以通过以下方式安装 transformers 库:

pip install transformers

对于数据集,我们将使用来自 Kaggle 的真实和虚假新闻数据集

步骤 1:导入库

这里要注意的最重要的库是,我们导入了 BERTokenizer 和 BERTSequenceClassification,以便稍后构造记号化器和模型。

步骤 2:预处理和准备数据集

在原始数据集中,我们添加了一个额外的 TitleText 列,它是标题和文本的串联。我们想用标题和正文来检验一篇文章是否是假的。

对于记号赋予器,我们使用“bert-base-uncased”版本的 BertTokenizer。使用 TorchText ,我们首先创建文本字段和标签字段。文本字段将用于包含新闻文章,标签是真正的目标。我们将每篇文章限制为 BERT 输入的前 128 个标记。然后,我们从数据集 csv 文件中创建一个 TabularDataset,使用这两个字段来生成训练集、验证集和测试集。然后我们创建迭代器来批量准备它们。

注意:为了在 TorchText 中使用 BERT tokenizer,我们必须设置 *use_vocab=False* *tokenize=tokenizer.encode* 。这将让 TorchText 知道,我们不会使用我们的数据集从头开始构建我们自己的词汇表,而是使用预先训练的 BERT 标记器及其相应的单词到索引的映射。

步骤 3:构建模型

我们使用的是“bert-base-uncased”版本的 bert,这是一个针对小写英文文本训练的较小模型(具有 12 层、768 个隐藏、12 个头、110M 参数)。查看 Huggingface 的文档了解其他版本的 BERT 或其他变压器模型。

第四步:培训

我们分别为模型检查点和训练指标编写保存和加载函数。请注意,模型检查点的保存功能并不保存优化器。我们不保存优化器,因为优化器通常会占用非常大的存储空间,并且我们假设不需要从以前的检查点进行训练。训练度量存储训练损失、验证损失和全局步骤,以便以后可以进行关于训练过程的可视化。

我们使用 Adam 优化器和合适的学习率来调整 5 个时期的 BERT。

我们使用二进制交叉熵作为损失函数,因为假新闻检测是两类问题。在计算目标与其自身之间的损耗之前,确保输出通过 Sigmoid。

在训练期间,我们根据验证集评估我们的模型参数。每次验证损失减少时,我们保存模型,以便我们最终得到具有最低验证损失的模型,该模型可以被认为是最佳模型。以下是培训期间的输出:

作者图片

训练之后,我们可以使用下面的代码绘制一个图表:

作者图片

第五步:评估

对于评估,我们使用我们训练的模型预测文章,并针对真实标签进行评估。我们打印出分类报告,其中包括测试准确度,精确度,召回,F1 分数。我们还打印出混淆矩阵,以查看我们的模型对每个类正确和不正确地预测了多少数据。

作者图片

在对我们的模型进行评估后,我们发现我们的模型达到了令人印象深刻的 96.99%的准确率!

结论

我们发现微调 BERT 在我们的数据集上表现非常好,并且由于开源的 Huggingface Transformers 库,实现起来非常简单。这可以毫无困难地扩展到任何文本分类数据集。

这里是我写的其他文章,如果感兴趣的话😊:

[## 基于 Pytorch 的 LSTM 文本分类

一步一步的指导你如何在 Pytorch 中建立一个双向 LSTM!

towardsdatascience.com](/lstm-text-classification-using-pytorch-2c6c657f8fc0) [## 使用 Pytorch 微调用于文本生成的 GPT2

使用 Pytorch 和 Huggingface 微调用于文本生成的 GPT2。我们在 CMU 图书摘要数据集上进行训练,以生成…

towardsdatascience.com](/fine-tuning-gpt2-for-text-generation-using-pytorch-2ee61a4f1ba7) [## 控制语言模型的文本生成

控制机器生成文本的样式和内容的实际操作方法

towardsdatascience.com](/controlling-text-generation-from-language-models-6334935e80cf) [## 计算机专业学生应该知道的最佳免费资源

有效学习的最重要的事情之一是拥有合适的资源,这不是一个简单的过程

medium.com](https://medium.com/@itsuncheng/best-free-resources-that-computer-science-students-should-definitely-know-d148c51b956e)

参考

[1] A .瓦斯瓦尼,n .沙泽尔,n .帕尔马等。、注意力是你所需要的全部 (2017),第 31 届神经信息处理系统会议

[2] J. Devlin,M. Chang,K. Lee 和 K. Toutanova, BERT:用于语言理解的深度双向转换器的预训练 (2019),计算语言学协会北美分会 2019 年年会

伯特:为什么它会彻底改变自然语言处理

原文:https://towardsdatascience.com/bert-why-its-been-revolutionizing-nlp-5d1bcae76a13?source=collection_archive---------16-----------------------

BERT 是一种语言模型,在许多任务上拥有高性能。但是是什么让它这么好呢?

BERT 代表变压器的双向编码器表示,是一种于 2018 年发布的语言模型,在多项任务上实现了最先进的性能,包括问答和语言理解。它不仅击败了之前最先进的计算模型,还超越了人类在问答方面的表现。

伯特是什么? BERT 是一个将单词转换成数字的计算模型。这个过程至关重要,因为机器学习模型接受数字(而不是单词)作为输入,所以一种将单词转换为数字的算法允许你在原始文本数据上训练机器学习模型。

BERT 是一个将单词转换成数字的计算模型。图片来自 (Devlin 等人,2019) 。

伯特有什么了不起的?对我来说,伯特之所以如此伟大,主要有三点。

  • 第一:根据大量数据进行预先训练。
  • 第二:考虑单词的上下文。
  • 第三:开源。

大家讨论一下。

#1:伯特预先接受了大量数据的训练。最初的 BERT 模型有两种大小:BERT-base(在图书语料库上训练:~8 亿字)和 BERT-large(在英文维基百科上训练:~ 2,500 万字)。这两个模型都有庞大的训练集!正如机器学习领域的任何人都知道的那样,大数据的力量几乎是不可战胜的。当你看过 2,500 万个单词时,你会变得相当好,即使是在新单词上。这意味着,由于 BERT 经过了良好的预训练,因此它可以应用于小数据集,并且仍然具有良好的性能。我在这里用一个例子:我最近参与了一个开发新冠肺炎问答系统的项目。我应用了 BERT-base,在没有对数据集进行微调的情况下,在 15 个类别中获得了 58.1%的准确率。对我来说更有趣的是,“COVID”这个词甚至不在 BERT 的词汇中,但它仍然有相当高的准确性。

伯特能够解释一个单词的上下文。以前的单词嵌入方法会为一个单词返回相同的向量,不管它如何使用,而 BERT 会根据它周围的单词为同一个单词返回不同的向量。例如,在下面的示例中,旧方法将为“信任”返回相同的嵌入:

我不能信任你。

他们不再信任他们的朋友。

他有一个信托基金。

另一方面,BERT 考虑了上下文,并会返回“信任”的不同嵌入,因为该词在不同的上下文中使用。如果您能够区分一个单词的不同用例,您就有了更多的可用信息,并且您的性能可能会因此而提高。一个相关的语言建模方法是 ELMo ,它也考虑了上下文。

#3: BERT 是开源的。容易接近是一大优势。机器学习领域的许多工作正被推动成为开源,因为开源代码通过允许其他研究人员轻松应用你的想法来促进发展。伯特的代码是在 GitHub 上发布的,它包括一个广泛的自述文件,其中有关于如何使用代码的深入信息,这对任何想要使用它的人都非常有帮助。

对我来说,我认为我能够在几分钟内下载一个 BERT 的工作模型,并且花了不到一个小时编写代码,让我在自己的数据集上运行它。

当您将这三个方面结合在一起时,您将获得一个极其强大的语言模型,它可以在 SQuAD、GLUE 和 MultiNLI 等知名数据集上实现一流的性能。它有一些相当大的优势,使它如此强大和适用。

它是在大量数据上预先训练的,所以你可以把它应用到你自己的(可能很小的)数据集上。它有上下文嵌入,所以它的性能会很好。它是开源的,所以你可以下载并使用它。它的应用非常广泛,这就是它革新 NLP 的原因。

谷歌的研究人员(最初的创造者)计划使用 BERT 来理解谷歌搜索,并提高谷歌自己的回答服务的准确性。其他人发现 BERT 不仅仅在谷歌搜索中有用。BERT 似乎承诺在计算语言学的关键领域进行改进,包括聊天机器人、问答、摘要和情感检测。BERT 的广泛适用性显而易见:自从一年前发表以来,这篇论文已经被引用了 8500 多次。此外,向计算语言学协会(ACL)会议(最大的国际 NLP 会议)提交的论文在 BERT 发表后翻了一番,从 2018 年的 1,544 篇论文增加到 2019 年的 2,905 篇论文。

BERT 将继续革新 NLP 领域,因为它为大范围任务的小数据集提供了高性能的机会。

延伸阅读:

  • Devlin 等人的原始论文
  • ELMo,一个使用上下文嵌入的类似语言模型。

2020 年最佳商业智能工具:第一轮,战斗!

原文:https://towardsdatascience.com/best-7-business-intelligence-tools-2020-round-one-fight-3afd4185fd59?source=collection_archive---------35-----------------------

BI 行业在 2019 年爆发。以下是 2020 年最好最值得关注的 BI 工具。留意这些玩家。

应该选择什么 BI 工具?(原图来自维基百科)

去年,分析界发生了许多变化。一些大型 BI 公司被科技巨头收购。一些斗志昂扬的新创公司获得了成功。商业智能继续进入一个又一个行业,从一个不错的必需品变成一个绝对必须品。这似乎是一个对最值得关注的选择进行大汇总的好时机。

以下是 2020 年 7 个最好/最值得关注的商业智能工具

选择你的商务智能工具(来自维基百科的原始图片)

Knowi

Knowi 标志(来自 Knowi.com)

Knowi 是商业智能雷达上的一个新名字,只是最近才开始成为 Looker 和 Tableau 等公司的真正竞争对手。Knowi 平台采用独特的商业智能方法,专注于传统智能工具中没有的三大区别点。这些是数据虚拟化、基于搜索的分析以及对 NoSQL 数据分析的本机支持。

  • 数据虚拟化:数据虚拟化在数据集成领域越来越受关注,但 Knowi 是唯一一个将该技术引入商业智能的平台。数据虚拟化添加了一个逻辑数据层,允许应用程序检索和操作数据,而无需事先了解数据的结构。在 BI 中,这意味着能够拥有仪表板和数据分析,而不必首先使用 ETL 将所有东西迁移到单个数据仓库。
  • 基于搜索的分析:搜索驱动的分析是对您的数据提出问题的能力,就像您在谷歌中键入问题一样,并获得真实的可操作数据、图表或仪表盘来响应您的查询。基于搜索的分析有时也被称为自然语言商业智能。Knowi 在这方面下了很大的赌注,最近发布了这项功能,并很快部署了该功能的 Slack 版本。
  • 原生 NoSQL 数据分析:大多数 BI 工具需要特殊的连接器来从 MongoDB 等来源获取数据,或者需要将数据转移到结构化数据仓库。Knowi 利用数据虚拟化的优势,无需 ETL 或连接器就可以本机连接到大多数 NoSQL 数据源。

另一项值得注意的是,Knowi 支持白标嵌入式分析。这意味着你可以在你的产品中嵌入 Knowi 品牌,而不是 Knowi 品牌。现在有一些成长中的创业公司,他们的产品有一部分是伪装的。

Knowi 还支持你期望从 BI 工具中得到的所有标准特性:数据可视化、交互式仪表板、报告、查询和分析。

值得注意是因为:拥有一些前沿功能,可能会对商业智能世界产生重大影响。

主要不利因素: Knowi 是一家初创公司,因此他们可能会缺少一些大公司的精华。

功率 BI

Power BI 标志(来自 powerbi.microsoft.com)

Power BI 是微软在商业智能游戏中的重磅武器。如果你在微软和 Azure 生态系统中,你可能已经在某种程度上使用了 Power BI。Power BI 是专门为喜爱 Microsoft Excel 的人设计的一个简单过渡工具。以下是它的一些特性:

  • 简单的拖放界面。
  • 无代码平台。允许用户在 GUI 界面中做任何事情。
  • 可以在桌面或云中使用。
  • 平稳集成到任何以 Microsoft/Windows 为中心的工作流中。
  • 捆绑到 Office 365 中

值得注意是因为: Azure 一直处于增长阶段,这给微软生态系统带来了整体提升,并有可能推动 Power BI 的发展。

主要缺点: Power BI 不能连接很多数据源,因为它的预建连接器库有限。据报道,在大型数据集上也有性能问题。

元数据库

元数据库徽标(来自 metabase.com)

Metabase 在许多方面与 Looker 完全相反,因为它完全开源且完全免费。Metabase 的设计主要考虑了更简单的用例,这就是它相当轻量级的原因。以下是一些突出的特点:

  • 交互式仪表盘。
  • 使用类似 SQL 的查询语言。
  • 数据可视化图表在视觉上很吸引人。
  • 工作环境干净且易于操作。
  • 不断增长的开源社区支持一致的免费更新。

值得注意是因为:这是一个对商业用例可行的开源选项。

主要缺点:你需要建立自己的服务器,并用你的元数据库安装来维护它。

(舞台上由人扮的)静态画面

Tableau 标志(来自 Tableau.com)

Tableau 是商业情报的守旧派。如果你在商业分析或数据科学领域工作过一段时间,你应该知道这个名字,并且可能至少用过一次。Tableau 无疑是商业智能工具的市场领导者。这里有几个众所周知的特点:

  • 友好的低代码界面,用于制作可视化和仪表板。
  • 业界一些最有吸引力的开箱即用的可视化技术。
  • 150 多个用于运行常见数据分析操作的预建函数。
  • 用户访问控制和共享性。
  • 强大的移动体验…如果你想在手机上进行数据分析。
  • 生成报告。

值得关注的原因:2020 年还是山中之王。

主要缺点: Tableau 自 2003 年就已经存在,在大多数情况下,它仍被用作下载到本地计算机的程序。该公司已经做了大量工作将其移植到云中,但它在该领域的表现不如许多较新的商业智能工具。

检查员

Looker 标志(来自 looker.com)

近年来, Looker 已经成为商务智能领域的一个大玩家。Looker 往往比其主要竞争对手 Tableau 更能吸引懂技术的观众。它非常强调编写 SQL 查询,但也具有构建仪表板和可视化的所有标准特性。Looker 跨垂直行业使用,用户遍布各行各业。以下是 Looker 的几个突出特点:

  • 基于网络的交互式仪表板。
  • 支持移动设备。
  • 可以在内部或云中安装
  • 名为 LookML 的内置机器学习/数据建模语言。
  • Git 集成。
  • 对 SQL 查询的强大支持。
  • 专为数据探索而设计,是数据工程师和数据科学家的好工具。

值得关注的原因:最近被谷歌以 26 亿美元收购。

主要缺点:学习曲线陡峭。谷歌收购后不确定的未来。

谷歌数据工作室

谷歌数据工作室(来自 datastudio.google.com)

经常被忽视的是, Google Data Studio 可以满足商业智能软件的一些简单用例的需求。谷歌数据工作室于 2016 年作为新的免费谷歌服务出现。不可否认,它能够连接的数据源数量相当有限。一些用户通过将他们的数据移植到 Google Sheets,然后将 Data Studio 连接到那个 Google Sheets 文件来解决这个问题。但看起来,就像 PowerBI 一样,只有当你所做的大部分事情已经在谷歌生态系统中时,谷歌数据工作室才是一个很好的选择。以下是一些特征:

  • 完全免费。
  • 基于 Web 的数据可视化和交互式仪表板。
  • 轻松连接到任何基于谷歌的数据源,如谷歌分析,谷歌广告词,YouTube 和谷歌搜索控制台。
  • 简洁的用户界面。
  • 好用。

值得注意是因为:尽管它可以用于许多用例,尤其是与网站数据分析有关的用例,但它并不经常被认为是一种商业智能工具。

主要缺点:对数据源的严重限制

Sisense /潜望镜数据

Sisense 标志(来自 sisense.com)

在过去的一年里,Sisense 已经与潜望镜数据融合在一起。这两个商业智能工具合并起来提供了一个 BI 解决方案,该解决方案收集和合并来自多个来源的数据,同时管理收集、集成和可视化步骤本身。以下是一些值得注意的特征:

  • Sisense / Periscope 组合产品提供了端到端的分析解决方案。
  • 智能平台可以在内部或云中使用。
  • 该工具支持移动设备。
  • 与众多数据源集成。

值得关注的原因:si sense Periscope 组合产品改变了他们的市场定位和作为商业智能平台的价值主张。看看他们在 2020 年如何定位自己将会很有趣。

主要缺点:一些用户报告说,在他们能够让产品正常工作之前,实施过程又长又贵。

非商业智能荣誉奖

ETL / ELT 解决方案

对于大多数 BI 工具,您需要在数据仓库中清理和准备数据。为此,您需要一个 ETL 解决方案。在 ETL 中,您提取、转换数据并将其加载到数据仓库中。在这里,我们列出了几个伟大的选择。

这里有必要快速指出例外情况。有了 Knowi,因为它建立在数据虚拟化的基础上,所以实际上不需要数据仓库或 ETL 来进行数据分析或构建仪表板。但是随着他们的数据管道的成熟,许多 Knowi 用户仍然合并了数据仓库和 ETL。然后,他们可以使用 Knowi 来组合和分析自己的仓库数据,或者将它与其他数据源组合起来。

SiSense + Periscope 组合智能工具包含 ETL。

盛装

Panoply 徽标(来自 Panoply.io)

Panoply 对于 ETL 和 ELT 来说都是一个很好的选择。Panoply 本机集成了 150 多个数据源,包括 Instagram、脸书、谷歌分析、YouTube、ElasticSearch 和 MongoDB。Panoply 也可以与 Python 或 r 结合使用。

Xplenty

Xplenty 标志(来自 Xplenty.com)

Xplenty 是另一个很好的 ETL 选项。它完全基于云,具有许多平台上的转换工具来清理和转换您的数据。Xplenty 似乎也非常强调数据安全性。

结论

不幸的是,当涉及到 BI 工具时,没有完美的胜利。赢家取决于组织的需求。

说到选择 BI 工具,没有明确的宿命。决定谁是你公司的赢家很大程度上取决于你的用例。如果您的公司看到了数据仓库的价值,那么使用 Xplenty 或 Panoply,然后在其上放置一个 BI 工具,如 Looker、Tableau 或 Knowi,可能会很好。如果你在微软生态系统上有大量投资,PowerBI 是一个显而易见的选择。如果你在寻找免费的东西,Google Data Studio 或 Metabase 可能是你用例的赢家。如果你有大量的 NoSQL 数据或存储在不同数据源的数据,并且希望先获取数据,而不是将其全部转移到同一个数据仓库(并且你不介意与一家成长中的初创公司合作),Knowi 可能是一个不错的选择。

使用 Python 简化 URL

原文:https://towardsdatascience.com/best-apis-for-url-shortening-using-python-2db09d1f86f0?source=collection_archive---------11-----------------------

我们将讨论并学习如何使用各种 Python APIs,只用几行代码来缩短 URL。

奥比·奥尼耶德在 Unsplash 上拍摄的照片

读者你好!所以,你会在各种地方(社交媒体、网站、信息平台等)看到短网址。).短网址容易记忆或输入,所以很受欢迎。没有人喜欢长 URL,所以我们经常需要缩短冗长的 URL。

你可能已经在网上使用过各种 URL 缩短服务,它们都做得很好!甚至谷歌表单,LinkedIn 等等。,缩短 URL 以方便使用。所以,它是互联网上广泛使用的东西。

那么,你有没有想过或者尝试过制作自己的网址缩短器呢?希望有许多可用的库和 API 来帮助我们以编程方式做同样的事情,而不需要访问任何网站和使用任何人的服务。

我们可以根据需要用 Python 语言编写程序。然后我们可以给出一个长的 URL 作为输入,我们会得到短的 URL 作为输出,这也只需要很少几行代码。是不是很刺激?使用各种 API 可以非常容易地做到这一点,而无需深入研究复杂的主题。

因此,有各种各样的 API 可以完成这项工作,所以让我们来看看一些 API,让我们实现它们,看看我们如何使用它们来缩短链接。

一点点网址缩写

Bitly 网址缩写是非常简单的使用。你需要在上做一个小小的账户。然后,进入群组设置,点击高级设置。在那里你会找到 API 选项。因为 API 现在已经贬值,所以单击 OAuth 选项。然后,生成 OAuth 令牌。复制令牌。

现在,安装 bitly_api 。为此,单击这个链接并下载存储库。然后,将其解压缩,并通过以下操作移入文件夹:

cd bitly-api-python-master

然后,你会在文件夹里面;然后,您需要使用以下命令:

python setup.py install

现在,安装工作已经完成。 bitly_api 现在已经安装在您的机器上了。现在,让我们转移到真正的编码部分,这是非常容易的,只有几行。

所以,如你所见,这样做很简单。我们首先需要在代码中导入 bitly_api 。接下来,我们需要放入我们之前生成的访问令牌,并调用包含该访问令牌的连接。

现在,我们需要为用户请求链接。接下来,我们将通过调用之前通过调用 Connection 创建的访问的 shorten 函数来缩短它。

然后,我们将只打印 short_url 函数的‘URL’部分。它也有各种其他信息,如哈希,完整的链接和其他信息,我们不需要。

是的,我们完成了!使用 Bitly URL Shortener API 来缩短链接非常容易。

严格的网址缩写

Cuttly URL Shortener 是另一个我们可以使用的很棒的 URL Shortener。它也很容易使用,虽然需要 2-3 行代码,但不需要安装,所以总体上更简单。

首先,搬到并注册一个新账户。接下来,点击编辑配置文件,并点击生成新的 API 密钥。这将生成一对新的 API 密钥供我们使用。复制那些 API 键。

因此,我们可以直接跳到代码中,而不需要安装任何东西。虽然我们需要一个简单的安装,我想我们大多数人已经安装了。

pip install requests

因此,如果您以前没有安装这个简单的库,现在就安装吧。接下来,让我们来看看它的代码。

如你所见,我们从将请求导入代码开始。接下来,我们输入 API 密钥。然后我们要求用户输入 URL。此外,我们需要指定 api_url 参数。然后,我们把它发给请求获取数据的人。

如果数据是有效的,那么我们获取数据的 shortLink 部分,即缩短的 URL,并打印出来。如果无效,我们返回一个错误。

皮肖特纳

pyshortener 是一个 python 模块,可以使用它的访问键来使用各种 URL shortener 服务。我们不需要为不同的提供者安装单独的库。例如,我们可以使用 Google URL shortener、Bitly shortener、Adf.ly shortener 等

这也有助于我们从缩短的 URL 中获取原始 URL。所以,它有双重用途。

要使用任何缩短服务,我们首先需要注册该服务并获得其访问令牌,就像我们在最后两种方法中所做的那样。

然后,我们需要为 pyshorteners 安装 python 模块。

pip install pyshorteners

在这个例子中,我们将使用 Bitly shortener。我们已经以不同的方式使用了 Bitly,所以让我们以不同的方式尝试相同的提供者。

所以,你可以在下面看到使用 pyshorteners 模块是多么容易。这非常简单,只需要很少几行代码。将收到的访问令牌放入 Bitly OAuth 中。然后只需输入需要缩短的链接。

此外,正如你所看到的,我们也可以很容易地扩展短链接。只需输入短网址,使用。展开以我们使用的相同方式展开短 URL。将其缩短。

所以,以同样的方式,你可以使用各种缩短服务提供商做同样的工作。

所以,我希望你今天学到了一些新东西,你会尝试一些其他的网址提供商,如 adf.ly,Google Shortener 等。你也可以用它来尝试其他各种复杂的事情。

是最基础的部分,也是最重要的部分。你也可以在现有的网站或应用程序中使用它来提高工作效率,或者只是玩玩它,找点乐子!

希望你喜欢这篇文章。在完成这篇文章之后,这里还有一些其他的好文章可以阅读!

[## 使用 React 构建一个博客应用程序——介绍和设置(第 1 部分)

在第一部分中,我们处理项目的基础并设置它。

javascript.plainenglish.io](https://javascript.plainenglish.io/build-a-blog-app-with-react-intro-and-set-up-part-1-ddf5c674d25b) [## 用 MERN 堆栈构建一个电子商务网站——第 1 部分(设置项目)

让我们使用 MERN 堆栈(MongoDB,Express,React 和 Node)建立一个简单的电子商务网站,用户可以在其中添加项目…

shubhamstudent5.medium.com](https://shubhamstudent5.medium.com/build-an-e-commerce-website-with-mern-stack-part-1-setting-up-the-project-eecd710e2696) [## 使用 React 构建一个简单的 Todo 应用程序

让我们用 React 构建一个简单的 Todo 应用程序,它教你 CRUD 的基本原理(创建、读取、更新和…

medium.com](https://medium.com/javascript-in-plain-english/build-a-simple-todo-app-using-react-a492adc9c8a4)

如果您对 Django 和 Django Rest 框架感兴趣,请尝试这些文章系列:

[## 使用 Django Rest 框架构建博客网站——概述(第 1 部分)

让我们使用 Django Rest 框架构建一个简单的博客网站,以了解 DRF 和 REST APIs 是如何工作的,以及我们如何添加…

towardsdatascience.com](/build-a-blog-website-using-django-rest-framework-overview-part-1-1f847d53753f) [## 使用 Django 构建一个社交媒体网站——设置项目(第 1 部分)

在第一部分中,我们集中在设置我们的项目和安装所需的组件,并设置密码…

towardsdatascience.com](/build-a-social-media-website-using-django-setup-the-project-part-1-6e1932c9f221)

学习数据科学的最佳应用

原文:https://towardsdatascience.com/best-apps-to-learn-data-science-in-2020-52c480cda178?source=collection_archive---------9-----------------------

这些应用程序可以很容易地集成到你的学习过程中,以帮助巩固概念,保持你的大脑敏锐!

由 Unsplash 上的 Becca Tapert 拍摄的照片

如今,每个人和他们的母亲都开始意识到数据科学将在我们的社会中扮演的关键角色。我一直在这个领域工作,因为“商业智能”是一个描述数据透视表的花哨术语,所以我看到了从 BI 到大数据、数据科学、机器学习和神经网络等的演变。我记得在 Coursera 上学习大数据课程时,我感到完全迷失了,我还记得那些不眠之夜,我试图配置一个虚拟机,这样我就可以...Hadoop 的一些东西。但本文并非传记,言归正传!

如今的在线资源量简直可笑。要学的东西太多,要尝试的课程太多。阅读 Medium 上的某些主题,似乎每个人都是有抱负的数据科学家或深度学习博士。别误会,我觉得这种热情很棒。但是对于进入这个领域的新人来说,试图找出从哪里开始,或者如何保持专注可能是压倒性的,甚至是令人沮丧的。

就我个人而言,我意识到比我选择哪门课程更重要的是,当我提出自己的学习框架时,我学得更快,也更有动力

我不认为有一个单一的步伐或框架适合所有人,因此我不会浪费你的时间——也不会浪费我的时间——来详细解释我的旅程。但一如既往,如果你想了解更多,可以在下面留下评论。

我想与你分享的部分过程是关于保持你的大脑敏锐并准备好处理任何数据科学任务,即使你不坐在电脑前。

现在,这些应用程序本身不会神奇地将你转变为数据科学家。希望明确这不是重点!这里的目标是用你的手机巩固你在其他地方学到的东西,并保持你的分析能力。默认情况下,我会寻找那些旨在交付简短、简单和清晰任务的应用。理想情况下,你应该可以在上下班的时候使用它们,在排队等东西的时候,在午休的时候,你会有这样的想法…

我还尝试为每一个添加了一个短视频,这样你就可以在决定安装它们之前很容易地检查它们。

1.数据营

如果你在搜索关于数据科学的在线资源时,从未见过 Datacamp ,那你的浏览器一定有问题!Datacamp 是一个拥有数百门课程的惊人平台。从电子表格到 SQL、Python、R,甚至 Git。

一年多以前,Datacamp 是我开始 Python 之旅的地方,我看到他们的订阅价格上涨了,因为他们增加了几十门新课程,并完善了社区论坛体验。你不会学不完的东西,这是肯定的!

关于应用程序,它是为初学者和高级用户设计的,让你练习你已经完成的每门课程的特定部分。这是一个很好的方法来复习简短的片段,巩固你所学的知识。

我主要用它来做可以在电话上轻松完成的小练习,但是有很多东西你可以探索。我找不到专门针对这款应用的视频,但这里有一个视频很好地概述了它们提供的功能。这是一个商业帐户,但工具大多与个人订阅相同。你随时可以拿给你的老板看,说服他/她给你的团队买一个企业账户!

2.举起

很简单:Elevate 被设计成你大脑的私人教练。每天,该应用程序将根据你之前的表现向你展示 3 个挑战,它们专注于提高处理速度、注意力、记忆力、口语(是的,口语!),逻辑等。

考虑到分析和沟通技能对数据科学家的重要性,这是一个很好的培训工具。在切换到 Lumosity 之前,我使用了 Elevate 一段时间(前面有更多关于 Lumosity 的内容),最近当我写这篇文章时,我又安装了它。

我猜免费版可以提供更多的种类,但至少你可以在订阅前知道他们提供什么样的锻炼。

[## 阅读法比奥·内维斯(以及媒体上成千上万的其他作家)的每一个故事

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@fneves/membership)

3.发光度

这是我最近才发现的一款应用,尽管它是最受推荐的应用之一,拥有数百万用户。我认为 Lumosity 是 Elevate 的替代品,但它们并不完全相同。

声明和应用程序结构都类似于 Elevate。一个个性化的大脑教练,免费版每天为你提供 3 个挑战。我确实觉得 Lumosity 练习更有挑战性,更有趣,而且肯定更容易上瘾。

现在我想起来,我确实使用 Elevate 有一段时间了,所以可能我只是很高兴看到一些新的练习!

如上所述,该应用程序提供免费版本或 14 天的订阅试用。如果你正在寻找一种大脑兴奋剂,我建议你试一试。

我省略了 NeuroNation,因为免费版本非常有限,但他们声称它可以改变你的生活,他们的网站上有很多科学标识。像那样大胆的声明总是让我怀疑,所以也许下次…

接下来,统计应用。

4.数据科学基础课程

数据科学 101 顾名思义,是一款教育类 app,可以帮助用户了解机器学习、分类模型等数据科学主题。

它主要是一个面向初学者的应用程序,但任何需要高质量资源来研究该领域并了解不同 ML 算法(如回归、K-最近邻、支持向量网络(SVM)等)的内部工作原理的人都可以使用。

最棒的是,它不仅充当了一个备忘单,而且它还有一些准备使用的代码片段

它又轻又简单。试一试,看看对你有没有用!

5.基本统计

如果我们要在这个数据驱动的时代生存下去,我们都需要一些基本的统计学知识。基础统计可以帮你刷新概念我们大多数人都忘记了高中和大学之间的某个时候。

基础统计学感觉就像是如果有人从我们统计学班最优秀的学生那里拿到笔记,汇编成一个超级简单的 app。

我相信你知道在你学习的时候这些笔记是多么的方便!

6.概率分布

概率分布是对之前应用的一个很好的补充。在这里你可以在手机上绘制和可视化各种概率分布。老实说,你可能想跳过这一条,直到你对统计学有所了解。

它绝对不是一个可以一直带在身边的应用,但当你在酒吧和你的书呆子朋友争论概率时,它是一个很好的工具。是的,书呆子也去酒吧!

接下来,我们继续进行编程

7.编程中心

编程中心就像是编码应用的圣杯。里面有各种各样的编程语言,而且运行得非常好。它包含的语言有 HTML,Javascript,C,C++,C#,Swift,Python,R 编程,Java,CSS。他们还收集了数千个代码示例,您可以将它们移植到您的计算机上。

这不是一个深入的审查,所以我会保持简短。我喜欢互动的体验,以及快速编译代码的方式。当然,如果你想要完整的体验,你需要付费订阅,但是你仍然可以用免费版做很多事情。

开发者也要吃饭吧?

如果你只是测试选择哪种语言,这可能是开始你的编码之旅的好方法。

8.量子 Python

如果没有专门的 Python 资源,这篇文章是不完整的!如果你读过我以前的任何一篇文章,你就会知道我在项目中主要使用 Python。除非你在过去的两三年里一直生活在岩石下,否则你会知道 Python 是最好的通用语言之一。包括数据科学项目。

QPython 至少有两个版本,一个面向初学者,一个面向高级用户(还有一些技术特性)。应用程序的名字一开始可能会令人困惑,但如果你刚刚开始使用,请使用 QPython Ox 。对于更高级的用户,使用 QPython 3x 应用程序。 但是请阅读他们在应用商店 的描述,这样你就完全知道你在安装什么。他们非常清楚不同应用版本的含义。

不幸的是,我相信该应用程序只适用于 Android 用户,但它的功能包括一个 Python 解释器和编辑器,运行时环境,QPYI 和 SL4A 库。它也兼容 Python 2.7。

这不是一个短视频,但我发现开始使用该应用程序真的很有用。如果你对更高级的东西感兴趣,我建议检查这个频道,因为他有很多关于它的教程!

我知道在 Medium 上有大量的“最佳 X 对 Y”的文章,但我试图保持简短,就像我刚开始时喜欢读的文章一样。

如果您刚刚接触数据科学,我希望这些链接对您有用,如果您想更进一步,请查看我的其他文章。我已经发布了几个项目,比如网络抓取教程,以发展一个 Instagram 账户,以及从 Kayak 获取航班价格,这里仅举几个例子。

更新:

我认为在这个列表中加入数据科学是公平的!我读了很多文章

感谢您的阅读!一如既往,我欢迎反馈和建设性的批评。如果你想取得联系,可以在这里联系我或者直接回复下面的文章。

游览伊斯坦布尔的最佳去处

原文:https://towardsdatascience.com/best-areas-to-stay-at-while-visiting-istanbul-4f02478e7e8?source=collection_archive---------34-----------------------

使用 K-means 聚类下一个目的地的区域

这篇博文是 IBM 数据科学专业认证最终任务的一部分:“邻里之战”。

法提赫·于鲁尔在 Unsplash 上的照片

和我的妻子一起,我们都是热情的旅行者。我们尽量不去城镇,我们已经一起去了五大洲的近 30 个国家。虽然我们喜欢旅行中的意外冒险,但我们喜欢在去任何地方之前做好准备。这就是为什么,对于我的 IBM 数据科学专业认证课程的顶点项目,我决定解决我们在准备即将到来的旅程时经常面临的问题。

当计划去一个新的地方旅行时,我们经常很难决定在旅行期间哪个地方最适合居住。一些主要问题是住宿费用和该地区的安全。此外,因为我们是游客,所以我们希望尽可能靠近旅游景点和推荐的餐馆。由于标准的数量,做出最佳选择可能不是那么简单。

在此,我将对去伊斯坦布尔旅行时需要考虑的不同标准进行分析。在此分析的基础上,对其区域进行分类,以表明最适宜居住的区域。

我们俩都没去过土耳其,它在我们的清单上已经有一段时间了。希望,当疫情平静下来,我们将最终有机会去那里,并使用这些发现为我们的准备工作。

正如简介中提到的,需要几个数据集来充分探索给定的问题。对于去伊斯坦布尔旅行的情况,使用了以下数据集:

  • 伊斯坦布尔各区列表,包括简单的统计数据,如人口、面积和人口密度

[## 伊斯坦布尔地区列表

从维基百科,免费的百科全书跳转到导航跳转到搜索这是一个列表,伊斯坦布尔的区在…

en.wikipedia.org](https://en.wikipedia.org/wiki/List_of_districts_of_Istanbul)

  • 伊斯坦布尔各区边界的地理空间数据,用于可视化,从

[## GADM

GADM 为所有国家和地区提供地图和空间数据。您可以浏览我们的地图或下载数据来制作您自己的地图。

gadm.org](https://gadm.org/)

  • 伊斯坦布尔各区的平均租金价格。由于缺乏短期住宿价格的免费 API 或数据集,如酒店、招待所或 Airbnb,因此假设每个地区的公寓租金价格与短期住宿价格正相关。

[## 伊斯坦布尔的平均租金价格为 1486 土耳其里拉

2019 年第三季度房租指数数据显示,伊斯坦布尔房租指数下降 2.25 点……

www.realtygroup.com.tr](https://www.realtygroup.com.tr/average-rent-price-in-istanbul-is-1486-tl/)

  • 每个区报告的犯罪数量。犯罪数据用于计算每个街区的犯罪指数,基于犯罪数量、人口并根据犯罪的严重性进行加权。在方法部分有更多描述。

北卡罗来纳州埃尔贡和佛罗里达州耶尔米贝索卢(2007 年)。伊斯坦布尔不同地区的犯罪率分布。土耳其研究,8(3),435-455 页。土井:10.1468868686867

  • 从 Triposo API 获取伊斯坦布尔的热门景点及其分数和位置坐标。该数据用于计算地区吸引力得分,基于地区到吸引力的距离,并通过其得分的倒数进行加权。
  • 从 Triposo API 获取伊斯坦布尔顶级餐馆及其得分和位置坐标。该数据用于计算地区食品得分,基于地区到餐馆的距离,并根据得分的倒数进行加权。

在为了确定最佳停留区域,使用了 K-means 聚类方法。K-means 方法基于提供的特征将未标记的可观察对象(区域)划分成给定数量的簇,使得每个可观察对象被分配到具有最近中心的簇中。这种方法非常适合给定的问题,即根据相似性对地区进行分组。

为此,需要将收集的数据转化为有用的见解。

  • 使用的第一个功能是住宿价格。因为找到的数据代表每个地区的平均租金价格,所以没有必要对现有的数据集进行额外的修改。
  • 用于分类的另一个特征是犯罪指数,它量化了该地区的安全性。它的计算是基于加拿大国家统计局描述的 T2 犯罪严重指数 T3。它考虑到每种犯罪的危险程度。“严重性权重”来自法院对所犯罪行类型的判决(监禁率和刑期)。罪行越严重,它所获得的“严重性权重”就越高。在这里,使用了加拿大中针对犯罪类型给出的权重。为了更容易,犯罪指数被归一化,其中最危险的地区获得犯罪指数 =100,而犯罪指数 = 0 将表示没有犯罪。犯罪指数的计算方法是将某一类犯罪的报案数量考虑在内,用该犯罪的“严重性权重”进行加权,将所有犯罪类型相加,然后除以该地区的人口:

  • 接下来使用的两个特征是地区-景点地区-美食分数。他们分别根据到顶级景点和餐馆的距离,量化该地区的位置有多好。为了得到这些,哈弗辛公式被用来计算地区中心到每个位置的距离。哈弗辛公式计算两点之间的距离,假设地球是完美的球形。此外,计算的距离由在 Triposo 上获得的位置分数的倒数加权。这种方式反映了即使给定的地点位于更远的地方,但是如果它具有更好的评级,它仍然会被选择访问更近的具有更低评级的地方。随后对每个地区到所有景点和餐馆的加权距离进行平均,以分别获得距离-景点和距离-食物得分。由于所描述的分数反映了距离和评级的倒数,分数较低的地区被认为更适合游客居住。哈弗辛公式,其中ϕ是纬度, λ 是经度, R 是地球半径:

在调查收集的数据时,注意到所使用的犯罪统计数据集缺少一些地区的值。因此,在进入拟合过程之前,必须进行数据插补,以便能够将所有地区纳入分类。为了不偏不倚地对待有缺失数据的区,任何缺失值都将替换为有犯罪统计数据的区的平均犯罪指数。

在进行分类之前,使用 scikit-learn 的 StandardScaler 对所有特征进行标准化。这是为了确保所有特征对拟合过程具有相同的影响。

图一。确定用于 K-均值聚类的聚类数的肘方法。红色虚线显示选择的集群数量。

肘形法用于确定各区应划分的聚类数。为此,对记录相关误差的一系列聚类数进行 K-均值拟合。当然,选择的 k-聚类越多,获得的拟合误差越低。然而,为了避免过度拟合,必须在聚类数量和误差之间进行权衡。如图 1 所示,在 5–6 以上增加更多的聚类不会显著减少误差。因此,对于该分析,选择了 5 个 k-簇。

如前所述,伊斯坦堡的 39 个区被分为 5 个集群。在所有地区中,19 个被分配到群组 0,10 个被分配到群组 1,4 个被分配到群组 2,3 个被分配到群组 3,3 个被分配到群组 4。为了确定哪个聚类包含最适合居住的地区,根据给定聚类中地区的每个要素的平均值对聚类进行评级,如表 1 所示。正如方法一节所述,每个特性的设计都是为了使特性值最低的地区更适合居住(即较低的租金、较低的犯罪率、到最佳评级场所的较短距离)。因此,表 1 中的聚类 0 被认为包含最适合居住的地区,因为它在租金价格方面排名第三,在犯罪指数方面排名第一,在地区景点得分方面排名第一,在地区美食得分方面排名第一,加起来为 3+1+1+1=6,是所有聚类中最低的。

表 1。并列排列每个聚类的平均要素,从最适合居住的区域聚类到最不适合居住的区域聚类进行排序。

图 2 显示了显示所获得的聚类的每个特征的基本统计信息的箱线图。

图二。 箱线图显示每个考虑特征的聚类统计。左上角:平均租金价格;右上:犯罪指数;左下:地区吸引力得分;右下:地区食物得分。

为了在空间上可视化与伊斯坦布尔市相关的分析和统计数据,收集的信息叠加在一些地图上。图 3 显示了各区的分类,图 4 显示了前 100 家餐馆和观光地的位置,图 5 显示了每平方米的平均租金价格,图 6 显示了计算的犯罪指数。叠加在交互式地图上的所有收集的统计数据可在以下位置查看:

https://nb viewer . jupyter . org/github/nowacowski/Coursera _ Capstone/blob/master/伊斯坦布尔/伊斯坦布尔 _ 地图. html

将箱线图与相关地图进行比较,可以对确定的聚类得出一些结论。

  • 最佳居住区,被归类为集群 0,位于严格的市中心之外。
  • 正如所料,租金价格最低的集群由距离市中心最远的区域组成。然而,租金最高的集群(明显高于其他集群,图 2 的左上图)不在严格的市中心,而是位于伊斯坦布尔欧洲和亚洲部分之间的欧洲海岸。
  • 查看犯罪指数箱线图(图 2 右上图),可以注意到第 4 类和其他类之间的显著差异。第 4 类区的平均犯罪指数是所有其他类区的 3 倍。集群 4 中的两个区位于严格的市中心,然而,第三个区位于远离市中心的地方。对犯罪统计数据的更好检查表明,位于中心的聚类 4 的区确实是犯罪数量最高的区之一,但是,其他区获得的高犯罪分数可能是由该区的低人口造成的。
  • 聚类的地区吸引力和地区食物得分盒图似乎显示了几乎相同的统计数据(图 2 底部的图表)。研究图 4 上的地图,可以得出这样的结论,这是因为餐馆和观光地彼此非常接近。此外,因为所有排名靠前的地方都拥挤在市中心,所以计算出的分数高度依赖于各区离市中心的距离。

图三。伊斯坦布尔地图,根据指定的聚类划分为不同颜色的区域。

图 4。伊斯坦布尔的特写地图,根据所分配的区域划分成不同的区域,标记出前 100 个外出就餐(蓝点)和观光(红点)的地方。

图五。根据图例上显示的每平方米平均租金来划分区域的伊斯坦布尔地图。

图 6。伊斯坦布尔地图,根据计算出的犯罪指数着色,如图例所示。未着色区对应于没有犯罪统计数据的区。

通过实施 K-means 算法,伊斯坦堡的 39 个区根据价格、安全以及与最佳餐馆和观光地的距离被分为 5 组。通过对获得的结果进行排序,可以推断出伊斯坦布尔最佳和最差的住宿区。

最适合居住的是位于市中心外围的地区,而由于高物价和高犯罪率,最差的是位于市中心的地区。

虽然最终结果似乎与通常的观点一致,即最好靠近中心而不是在中心本身,但是所执行的分析仍然可以改进。使用的犯罪统计数据来自 10 多年前。在此期间,很多事情可能会发生变化,因此,使用更新的数据会更有好处。对于住宿价格,使用了长期租金价格,而不是每晚的酒店价格。虽然假设两者是相关的,但是如果没有这两个数据,就不能完全确定。至于地区吸引力和地区食物得分,使用直线距离。相反,通勤时间会更好,区分难以到达的区域,例如位于岛屿上的区域。

Jupyter 笔记本包含创建本报告的逐步流程,可在以下位置查看:

https://nb viewer . jupyter . org/github/nowacowski/Coursera _ Capstone/blob/master/伊斯坦布尔/伊斯坦布尔 _ 旅行. ipynb

最佳人工智能读物

原文:https://towardsdatascience.com/best-artificial-intelligence-books-to-read-30d19ece0799?source=collection_archive---------9-----------------------

图片来自 stocksnap.io

人工智能和机器学习非小说类书籍的终极清单

在这个列表中,我试图收集关于人工智能、机器学习和机器人的 10 本最重要和最受欢迎的书籍。我花了一年的时间阅读每一本书,我完全推荐所有的书(好吧,也许有些比其他的更多)。这本集子很好地脱离了所有的技术内容,所以不要期望找到充满数学和算法的技术书籍。

相反,只有从哲学或商业角度分析人工智能的非虚构书籍。在我看来,每个机器学习工程师,对机器学习感兴趣的程序员,希望将 AI 应用到业务中的专业人士都应该至少阅读其中两本。如果我告诉你这个星球上的每个人都应该读一本,不要惊讶。

人工智能已经慢慢证明自己是未来所有技术进步的主要力量,预计将在塑造我们的日常生活方面发挥重要作用,超出我们大多数人的想象。

让我们开始吧:

德乌斯人:明日简史

畅销书《智人》(Sapiens)描述了人类从类人猿到超级智能生物的进化过程,在出版后,Yuav Noah Harari(历史学家、哲学家和耶路撒冷大学历史系教授)继续他对未来的探索。

在他的书《德乌斯人》中,他认为人类会更加努力地去获得完全的幸福、不朽和上帝般的力量,这可能会导致各种各样的未来。人类会对机器失去控制吗?这个人会被当作神来崇拜吗?但整本书的主要思想是,它将以将我们的智力从情感中分离出来而告终。哈拉里深入研究哲学问题,如意识、人类情感、个人主义,所以如果你想进行一些哲学上的提问和思考,请务必阅读这本书。

奇点临近:当人类超越生物学

雷·库兹韦尔(Ray Kurzweil)是一位发明家和未来学家,迄今为止已经写了 5 本畅销书,并通过他的书《奇点临近》(The Singularity is Near)对普及术语“技术奇点”负有部分责任。这本书侧重于人工智能的一个更具技术性的方面,而不是哲学的观点,并分析了智能机器人在人类生活中的社会学影响。它还介绍了与机器融合的可能性,并作为一个控制论的存在活着,像一个半机械人(做一个太空堡垒卡拉狄加参考,抱歉我控制不住自己)。

正如比尔·盖茨所说:“在预测人工智能的未来方面,雷·库兹韦尔是我所知道的最好的人。他引人入胜的新书设想了一个未来,在这个未来,信息技术发展如此之快,以至于人类能够超越其生物学限制——以我们还无法想象的方式改变我们的生活。”

超级智能:路径、危险、策略

尼克·博斯特伦教授的《超级智能》是一本关于人工智能安全的书。博斯特罗姆想象我们如何能够创造一个远超我们想象的人工智能,以及它会带来什么风险。他想到了事情如何出错的例子,以及超级智能是否能取代我们成为地球上的主导生命形式。

有一件事让我印象深刻,那就是人类和大猩猩的并行性。如果大猩猩的命运更多地取决于人类而不是它们自己,这是否意味着人类的命运将更多地取决于人工智能而不是我们的物种?另一本关于人工智能的伟大哲学著作,它提出的问题比它回答的问题还多(这是应该的)

生活 3.0:成为人工智能时代的人类

宇宙学家、麻省理工学院教授马克斯·泰格马克的《生命 3.0》。生命 1.0 来自生物进化,生命 2.0 来自文化进化,生命 3.0 来自技术进化。它再次描述了事情是如何变糟的。但它通过使用真实生活元素的实际例子来做到这一点,并提出具体的行动来防止它们。

听听这个:一家名为 Omega 的公司使用一个名为 Prometheus 的超级智能人工智能代理接管了世界,该代理能够开发突破性系统,优化管理全球资源,甚至创造其他机器。所有这些都是在没有人意识到人工智能在背后支持的情况下实现的。这本书就是这样开始的。你觉得这听起来合理吗?对我来说的确如此。

人工智能超级大国:中国、硅谷和新世界秩序

李开复(他开发了世界上第一个非特定人语音识别系统,并在谷歌、苹果和微软担任高管职位)认为,人工智能带来的巨大变化可能比我们预期的要早得多,并探讨了中国未来的影响。按照他的说法:“如果数据是新的石油,那么中国就是新的沙特阿拉伯”。也许未来终究不是西方的。

他专注于人工智能导致的全球失业问题,并清晰地描述了哪些工作将受到影响,多快以及我们如何提供解决方案。他的书最好的一点是,它不会进入模糊的世界末日预测,而是根据真实世界的数据和他在该领域的经验形成有根据的猜测。

生活分析:理解人工智能、机器学习和数据分析

梅尔特·达姆拉皮纳的《生活分析》是一本非常棒的书,适合想要了解人工智能和高级数据分析的商人、经理、营销人员和企业家。它首先解释了什么是机器学习和大数据,然后涵盖了医疗保健、营销、政府和自然领域的应用实例,解释了哪些工作将被取代,以及公司和初创公司如何应用人工智能来解决他们的用例。总结一下主要思想:AI 可以而且将会改造几乎每一个行业。如果你是专业人士,想要深入机器学习的世界,这是必须的

大师算法:对终极学习机的探索将如何重塑我们的世界

如果你想要机器学习的最佳高层次概述,只需看看佩德罗·多明戈斯(Pedro Domingos)的《大师算法》(Master Algorithm)就行了。多明戈斯设法在一本书里组织 ML 的整个领域并且包括从领域的历史到最新的突破的一切。

它通过将算法分为 5 个不同的思想流派,创建了该领域的概念模型。对于什么是最佳广义算法,每个学校都有自己的观点。然后,他更详细地介绍了它的学派和算法,最后,他提出,最终的主算法是所有这些算法的结合,我们会逐渐朝着这个目标前进。

如何创造思维:揭示人类思维的秘密

《如何创造思维》是雷·库兹韦尔的第二本书。这一次,他将对人工智能的探索推进了一步。创造人工大脑的最好方法是什么?答案是对我们自己的生物大脑进行逆向工程,准确理解它是如何工作的,然后应用这些积累的知识来创造智能机器。

受最新神经科学研究的启发,他描述了我们的大脑只不过是“模式识别器的自组织层次系统”,这些见解将使我们能够使用硅和编程来重建它。

我们最后的发明

在这本书中,詹姆斯·巴拉特(国家地理、探索、公共广播公司等纪录片制作人)将人工智能描述为人类的最终发明。它清楚地暴露了普通人工智能可能带来的风险,它表明超级智能不一定意味着仁慈,它总结了过去几年对潜在人工智能线程的研究。这是通过广泛的研究和对该领域的人的详细采访得出的结论。

我们最后的发明可能有一点悲观的基调,它可能会让你感到绝望,但这就是为什么它是一本伟大的书。它迫使你思考我们的未来,试图找到新的方法来阻止这一切的发生。最佳的社会意识。

人+机器:重新想象人工智能时代的工作

埃森哲的领导者保罗·r·多赫蒂和 h·詹姆士·威尔森用他们的经验揭示了公司如何使用人工智能来推动创新和提高盈利能力,以及人工智能如何明确地改变所有业务流程,从客户服务和新发明到生产力和工作场所文化。我喜欢将它描述为一本剧本,供其他商业领袖理解人工智能将对他们的公司产生的积极影响,以及教育和培训的必要性,以防止造成的破坏。

【https://theaisummer.com】原载于 2020 年 2 月 15 日

每个数据科学家都应该知道的最佳防弹 Python 要素选择方法

原文:https://towardsdatascience.com/best-bulletproof-python-feature-selection-methods-every-data-scientist-should-know-7c1027a833c6?source=collection_archive---------22-----------------------

用几行代码实现 5 种最佳特征选择方法

亚历山大·科特利亚尔在 Unsplash 上的照片

在大多数数据科学项目中,特性选择是探索性数据分析之后的第二个自然步骤。该过程包括选择正确的特征以获得最佳预测。易于使用的特征选择方法通常包括 SelectFromModel、带有递归特征消除的特征排序、基于过滤器的单变量选择、特征重要性、投票选择器。要成为独角兽数据科学家,掌握最新的特征选择方法是一项必备技能。在本文中,我们将回顾 Kaggle winners 的特征选择方法,这些方法可以用简短的 python 代码实现。对于本文,我们将分析巧克力棒评级数据集样本,以“烟熏味”作为目标特征。

你可以在这里找到完整的数据集:。

照片由 Maciej Gerszewski 在 Unsplash 上拍摄

一个具有挑战性的数据集,在分类编码后包含超过 2800 个特征。

  1. 从模型中选择

这种方法基于使用算法(SVC,线性,套索..)只返回最相关的特征。

**#import libraries**
from sklearn.linear_model import LassoCV
from sklearn.feature_selection import SelectFromModel**#Fit the model** clf = LassoCV().fit(X, y)**#Selected features** importance = np.abs(clf.coef_)
idx_third = importance.argsort()[-3]
threshold = importance[idx_third] + 0.01
idx_features = (-importance).argsort()[:10]
name_features = np.array(feature_names)[idx_features]
print('Selected features: {}'.format(name_features))

精选特色:[' cocoa _ percent ' ' first _ taste _ 辛辣葡萄干' ' first _ taste _ pure ' ' first _ taste _ 葡萄干' ' first _ taste _ 葡萄干' ' first _ taste _ 覆盆子' ' first _ taste _ raw ' ' first _ taste _ 红莓' ' first _ taste _ 红果',' first _ taste _ 红酒']

照片由德鲁·比默在 Unsplash 上拍摄

2.递归特征消除的特征排序

递归特征消除(RFE)方法将权重(系数或特征重要性)分配给递归提取数量减少的特征的特征。重复该循环,直到达到最佳特征数量。

**#import libraries** from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
import matplotlib.pyplot as plt**#Fit the model** svc = SVC(kernel="linear")
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2), scoring='accuracy')
rfecv.fit(X, y)**#Selected features** print(X.columns[rfecv.get_support()])
print("Optimal number of features : %d" % rfecv.n_features_)

精选特色:[' specific _ bean _ origin _ or _ bar _ name _ Malo Island,batch Ma20/19 ',' specific _ bean _ origin _ or _ bar _ name _ Venezuela,Trinidad ',' second_taste_sweet']

由安迪·HYD在 Unsplash 上拍摄的照片

3。基于单变量选择的过滤器

统计 scikit-learn library SelectKBest 获得最具影响力的功能。下面的代码使用相关/卡方统计测试来选择最佳特征

**#import libraries** from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
import matplotlib.pyplot as plt**#Fit the model** bestfeatures = SelectKBest(score_func=chi2, k=10)
fit = bestfeatures.fit(X,y)
dfscores = pd.DataFrame(fit.scores_)
dfcolumns = pd.DataFrame(X.columns)**#concatenate the two dataframes** featureScores = pd.concat([dfcolumns,dfscores],axis=1)
featureScores.columns = ['Specs','Score']**#print 10 best features** print(featureScores.nlargest(10,'Score').plot(kind='barh'))**#plot graph of feature importances** plt.show()**#Name selected features** X.iloc[:,62].name,X.iloc[:,127].name,X.iloc[:,1578].name,X.iloc[:,1493].name,X.iloc[:,911].name

使用选择最佳方法的 10 个最佳特性(作者提供图片)

所选功能:[' country _ of _ bean _ origin _ Vanuatu ',' company_location_Vanuatu ',' first_taste_basic ',' specific _ bean _ origin _ or _ bar _ name _ Venezuela,Trinidad ',' specific _ bean _ origin _ or _ bar _ name _ Malo Island,batch Ma20/19']

亚历山大·布朗迪诺在 Unsplash 上拍摄的照片

4。特征重要性

该方法使用基于树的分类器对特征进行评分。分数越高,该特征对于预测我们的目标特征越重要。

**#import libraries** from sklearn.ensemble import ExtraTreesClassifier
import matplotlib.pyplot as plt**#Fit the model** model = ExtraTreesClassifier()
model.fit(X,y)
print(model.feature_importances_)**#plot graph of feature importances** feat_importances = pd.Series(model.feature_importances_, index=X.columns)
feat_importances.nlargest(10).plot(kind='barh')
plt.show()

巧克力数据集中的前 10 个特征(作者提供的图片)

Gabriel Santiago 在 Unsplash上拍摄的照片

5。使用 Xuniverse 的投票选择器

该方法对每个算法的特征进行评分,以最小的努力选择最佳的算法。

**#import libraries** !pip install xverse
from xverse.ensemble import VotingSelector
import matplotlib.pyplot as plt**#Fit the model** clf = VotingSelector()
clf.fit(X, y)**#Selected features** clf.feature_importances_
print(clf.feature_importances_['Random_Forest'].nlargest(10).plot(kind='barh'))
plt.show()**#Name selected features** clf.feature_importances_['Variable_Name'][2],clf.feature_importances_['Variable_Name'][1],clf.feature_importances_['Variable_Name'][12],clf.feature_importances_['Variable_Name'][13]

使用随机森林模型的巧克力数据集中的前 10 个特征(作者提供图片)

所选特征: ['first_taste_basic ',' company_location_Vanuatu ',' rating ',' specific _ bean _ origin _ or _ bar _ name _ Malo Island,batch Ma20/19']

**#Selected features with 6 models** clf.feature_importances_

使用 6 个模型的巧克力数据集中的前 4 个特征(作者的图片)

更多详情,请点击 github.com 的号

照片由本杰明·戴维斯在 Unsplash 上拍摄

如果你有空闲时间,我建议你看看这个:

[## 关于特征选择的一切

1.什么是特征选择?

medium.com](https://medium.com/@adityaguptai/all-about-feature-selection-f98bf5b1201c)

总结一下

参考此链接木质巧克力了解巧克力棒功能的完整选择。这一简要概述提醒我们在数据科学中使用多种特征选择方法的重要性。这篇文章涵盖了提取最佳特性的 5 种基本 python 特性选择方法,并分享了有用的文档。

希望你喜欢,继续探索!

追踪冠状病毒的最佳仪表板

原文:https://towardsdatascience.com/best-dashboards-to-track-coronavirus-7ac4b8b79445?source=collection_archive---------48-----------------------

要关注的区域和前 5 大全球仪表板列表

冠状病毒的传播带来了与之相关的各种数据的传播。海量数据催生了多个仪表盘,帮助总结可用信息,并以视觉上吸引人的方式呈现出来。以下是一些最好的在线仪表板,帮助您在全球范围内跟踪冠状病毒。

第一名——约翰·霍普斯金大学

由约翰·霍普斯金大学系统科学与工程中心(CSSE)开发,这是目前访问量最大的仪表盘。其背后的 JHU 团队从世卫组织和多个国家卫生部门收集数据。数据每天更新多次,每日快照上传到他们的 GitHub 库供公众使用。

链接 : 此处
优点:全球数据的主要来源,有时更新速度比每日世卫组织局势报告还快。
缺点:在灰暗的黑色背景上使用吓人的红色。只需一个时间序列图即可查看一段时间内的全球案例。没有长期的国别比较。

# 2——谷歌数据工作室

DataOutlier 的这个极简仪表板使用了来自 JHU 的数据。它包括多个时间序列图表,以查看不同指标随时间推移的进度。显示的数据是交互式的,可以通过选择世卫组织定义的地区或国家进行更改。

链接 : 此处 优点:干净、交互界面,颜色更酷,不那么吓人。每日和累积指标的多个时间序列图表。缺点:数据每天只更新一次。

第三——微软必应

微软的仪表盘干净且反应灵敏。而 JHU 仪表板仅显示少数国家/地区的省/州级数据(中国、美国、加拿大、澳大利亚等。),该仪表板包含许多国家/地区的次国家/地区(城市、省)数据。

链接:此处优点:多图表、多粒度数据的干净界面。
缺点:结果中的相关视频是多余的。

#4 —世界卫生组织

这个来自世卫组织的仪表盘和 JHU 的非常相似。由于它是基于官方的世卫组织数据,这些数字通常落后于 JHU 数据的更新。

链接 : 此处 优点:世卫组织官方数据
缺点:数据落后于 JHU。没有显示一段时间数据的国家级图表。

第五名——纽约时报

《纽约时报》拥有你在其他地方找不到的大量数据、图表和评论。他们正在收集美国的详细数据,直到县一级,并在他们的 GitHub 上公开分享。

链接 : 此处 优点:优秀的自定义可视化,详细的图表和解说。
缺点:格式更像是一篇文章,而不是仪表盘。

特定区域仪表板

  • 美国:疾病控制中心
  • 中国:疾病预防控制中心
  • 印度:卫生部&家庭福利,志愿者
  • 德国:罗伯特·科赫学院
  • 意大利:联合国世界粮食计划
  • 日本: JAG 日本公司
  • 韩国: ESRI 韩国
  • 新加坡:卫生部, Upcode 学院
  • 香港:政府
  • 巴基斯坦:政府
  • 泰国:公共卫生部
  • 菲律宾:卫生部

2020 年最佳数据科学博客

原文:https://towardsdatascience.com/best-data-science-blogs-to-follow-in-2020-d03044169eb4?source=collection_archive---------12-----------------------

最值得信赖和享有盛誉的来源,让您了解数据科学领域的最新动态。

照片由像素的皮克斯拜拍摄

数据科学是让数据变得有用的学科。

数据科学正以惊人的速度增长,以满足渴望权力的人工智能相关技术 的需求,如机器学习、神经网络和深度学习。由于这些快速的变化,个人和企业可能会发现跟踪行业中的众多变化是令人困惑的。随着行业被更新的趋势和技术所淹没,企业可能会觉得有必要了解并采用这些趋势和技术来优化他们的数据处理和分析过程。

在这篇文章中,我旨在强调一些最值得信赖和最有声望的来源,让您了解数据科学领域的最新动态。

数据确实为我们所做的一切提供了动力。

——领英首席执行官杰夫·韦纳

最佳数据科学博客

互联网上充斥着许多关于这些趋势的研究和深入分析的文章、时事通讯、白皮书和报告。我们列出了一些顶级的在线资源和门户网站,它们经常更新,全面涵盖了数据科学的所有内容。

1.走向数据科学

图片来源— 走向数据科学

共享概念、想法和代码的媒体出版物。

  • 加盟中—2016 年 10 月
  • 网站链接—https://towardsdatascience.com/
  • 作者— 超过 5000 人(截至 2020 年 1 月)
  • 推特关注者——46.4 万关注者( @TDataScience )
  • 脸书追随者—25868(@ tdata science)
  • Linkedin 粉丝—202368(@ tdata science)

《走向数据科学》是一份媒体出版物,酝酿着面向受众的内容不仅仅是关于数据科学,而是众多相关技术,如机器学习、编程、可视化、和人工智能,横跨超过 5800 篇已发表文章

“走向数据科学”正在帮助建立一个内容生态系统,通过让热情的读者和爱好者访问大量精心策划的帖子来激发新想法并教育他们,从而迎合他们。

该平台欢迎有识之士以教程、技巧、分析实践经验的形式向读者分享他们对这些创新的看法。它是获得评论的最可靠来源之一,也是该技术多样化实现的真实例子之一。

2.数据科学中心

图片来源— 数据科学中心

面向大数据从业者的在线资源

  • 成立— 2012 年
  • 创办人— 文森特·格兰维尔
  • 网站链接—https://www.datasciencecentral.com/
  • 推特粉丝—17.06 亿粉丝
  • 脸书追随者—32201
  • Linkedin 上的关注者——163021 人

数据科学中心是数据科学内容的领先存储库之一,定期更新人工智能、机器学习、深度学习、分析、大数据等领域的最新趋势。

拥有超过 350 篇文章,它以明确的方式为各种各样的受众提供了一个内容丰富的平台,包括学生、极客、行业领先的专家和从业者。数据科学中心始终欢迎爱好者及其用户发表意见,并向他人展示来自数据科学世界的最新发现。

对于对数据科学和相关技术有着类似热情的读者,数据科学中心提供了一个论坛,在这里他们可以表达自己的想法和经验,并参与直观的讨论。

[## 数据科学家的最佳数据科学工具

数据科学工具,使任务可以实现

towardsdatascience.com](/best-data-science-tools-for-data-scientists-75be64144a88)

3.数据科学 Reddit

图片来源— Reddit

  • 网站链接—https://www.reddit.com/r/datascience/
  • 创建于—2011 年 8 月 6 日
  • 追随者—247 名追随者

数据科学从业者和专业人士讨论和辩论数据科学职业问题的地方。

Reddit 是世界知名的新闻和讨论网站,拥有数百个不同的社区和数百万活跃用户。reddit 喜欢这样称呼它,一个这样的社区或 subreddit 是 r/DataScience ,有超过 247,000 名成员经常光顾,平均每时每刻都有超过400 名活跃成员

每天有超过几十个帖子,成员们对各种最新趋势和技术进行深入讨论,分享实践经验,并在平台上发布他们的问题,社区帮助解决这些问题。

用户可以在 subreddit 上以文本和链接的形式自由发布他们的观察结果和数据科学世界的最新进展,让每个人都了解最新情况。

4.KDnuggets

图片来源— KDnuggets

  • 创办—1993 年 2 月(作为新闻信)
  • 创始人—Gregory Piatetsky-Shapiro(数据挖掘会议的联合创始人)
  • 网站链接—https://www.kdnuggets.com/
  • 推特关注者——17.47 万关注者
  • 脸书追随者—29956 人
  • Linkedin 粉丝—18169 人

“KD”代表“知识发现”。

KDnuggets 是一个著名的网站,旨在获取世界上一些快速发展的技术的信息,包括数据科学、人工智能、分析、机器学习、数据挖掘和大数据。

它每个月有超过 50 万的独立访客,在 Twitter、脸书、LinkedIn 和 RSS 订阅源上有超过 26 万的累积用户。KDnuggets 一直在报道计算机科学世界中所有有影响力的事件,并通过博客、新闻、网络研讨会和各种教程呈现这些事件

KDnuggets 提供了一个广泛的现成数据集集合,以及一个面向数据科学的软件库,可以帮助您开始使用。为了迎合以职业为导向的读者,KDnuggets 有专门的课程和工作板块,提供最受欢迎的技能和相关工作岗位的课程。

[## 2020 年的数据科学趋势

新十年的关键数据科学趋势

towardsdatascience.com](/data-science-trends-for-2020-9b2ee27af499)

5.分析 Vidhya

图片来源— 分析 Vidhya

  • 成立— 2014 年
  • ——库纳尔·贾因创立
  • 网站链接—【https://www.analyticsvidhya.com/】T22
  • 推特关注者——25.7 万关注者
  • 脸书追随者—60817 人
  • Linkedin 上的粉丝人数

Analytics Vidhya 通过其四个重要支柱提供了一个完整的数据科学生态系统,这些支柱让您了解行业的顶级趋势,通过在线课程巩固您的基础知识,允许您在黑客马拉松上与其他个人互动,并使您成为平台上各种工作的有竞争力的候选人。

凭借超过320 万的月访问量,它是洞察不断增长的数据科学、机器学习、深度学习和人工智能领域的良好平台之一。读者可以找到各种技术和趋势、认证在线课程、实践测试、教程、在线竞赛访问以及数据科学领域的最新工作机会。

6.数据科学|谷歌新闻

图片来源— 谷歌新闻

  • 链接——【https://news.google.com/datascience】T2

谷歌的新闻平台涵盖了各种主题的最新趋势和信息,包括行业的一般新闻和特定趋势。作为互联网上几乎所有领先信息来源的保留节目,谷歌新闻提供了一些最著名的数据科学平台的同样广泛的最新创新。

借助谷歌对所有数据科学新闻的一站式解决方案,读者可以获得海量信息,涵盖主题的各个方面。所有这些高质量的信息仅仅是在谷歌新闻应用或网站上的简单搜索,简化了可访问性。

[## 面向所有人的顶级谷歌人工智能工具

使用谷歌人工智能中心将想法变为现实

towardsdatascience.com](/top-google-ai-tools-for-everyone-60346ab7e08)

7.数据营

图像来源— 数据营

在线学习数据科学最聪明的方法

  • 成立于 — 2013 年
  • 创始人— 马丁·托伊维森、乔纳森·科内利森、迪特·德·梅斯梅尔
  • 网站链接—https://www.datacamp.com/
  • 推特关注者——51.4 万关注者
  • 脸书追随者—956384 人
  • Linkedin 上的粉丝人数

DataCamp 是一家行业领先的数据科学在线课程提供商,提供数据科学行业中一些广泛使用的工具的实践经验,如 Python、R、Scala、Power BI、Excel、tableau 等。除了提供超过 300 门课程,涵盖数据科学的每个关键过程,DataCamp 还提供了一个社区部分,其中充满了关于数据科学、人工智能、机器学习、深度学习等热门趋势的内容、教程和备忘单

热心的读者还可以免费浏览参考资料部分,查看一些业内知名领袖和研究人员的白皮书和网络研讨会,为读者提供不可或缺的知识。

8.IBM 大数据和分析中心

图片来源— IBM 大数据&分析中心

  • 网站链接—【https://www.ibmbigdatahub.com/
  • 推特粉丝—19.74 万粉丝
  • 领英粉丝—172482 人

这家跨国巨头为数千家成功企业提供支持,是数据科学和人工智能行业众多创新中的关键人物。 IBM 相信与世界分享知识,并且为数据科学狂热者和感兴趣的读者创建了 IBM 大数据&分析中心,在这里可以以系统的方式轻松访问所有信息。

IBM 涵盖各种行业、技术和分析等方面,以易于理解的形式提供了众多行业特定问题及其解决方案的 360 度概述,以加深理解。

9. InsideBIGDATA

图像来源— InsideBIGDATA

你的机器学习资源

  • 成立—2011 年 8 月 28 日
  • 经营人— 里奇·布鲁克纳
  • 网站链接—https://insidebigdata.com/

InsideBIGDATA 是最受欢迎的新闻平台之一,它提供有关 IT 世界最新战略和技术的定期更新和新闻。InsideBIGDATA 涵盖了大数据、数据科学、机器学习、深度学习和人工智能等广泛的主题,出色地提供了关于上述主题的有影响力的行业观点和重要提示。

这些信息以各种格式准确呈现,如报告、简讯、资源、白皮书以及来自数据科学和大数据领域的一些顶级影响者的采访

10.脸书数据科学博客

图片来源— 脸书

获得洞察力,实现有意义的社交互动

  • 链接—https://research.fb.com/category/data-science/
  • 脸书页面追随者—493638

顶级社交媒体巨头脸书也是数据科学行业的重要参与者。超过 26 亿用户的庞大用户群迫使脸书投资于可靠和胜任的数据科学技术,以深入了解其用户。

由于类似这样的几个关键原因,脸书积极研究更好的数据管理技术和创新,并将他们的发现发布在脸书数据科学博客上。读者可以从脸书一些著名的数据科学专家那里了解最新的研究趋势以及它们如何影响他们的用户。

[## 核心数据科学(CDS)

推进数据科学的前沿核心数据科学(CDS)是一个研究和开发团队,致力于改善…

research.fb.com](https://research.fb.com/teams/core-data-science/)

11.数据机器人

图片来源— 数据机器人

  • 成立于 — 2012 年
  • 创立——杰里米·阿钦,汤姆·德·戈多伊
  • 网站链接—https://www.datarobot.com/
  • 推特粉丝—1640 万粉丝
  • 脸书追随者—5489 人
  • Linkedin 的关注者

DataRobot 是一个平台,让企业在运营中采用人工智能自动化,帮助他们在激烈的竞争中取得成功。除了将人工智能纳入组织战略之外,DataRobot 还以非常结构化的方式提供了大量来自专家的经过彻底研究的资源,涉及机器学习、人工智能和数据科学等多个主题。

读者和爱好者可以通过几种流行的格式获得数据科学和人工智能世界的最新更新,如博客、案例研究、白皮书、播客、视频、分析师报告等。

12.数据大学

图像来源— 数据多样性

面向数据专业人员的教育资源

  • 成立于 — 2012 年
  • 创立——托尼·肖
  • 网站链接—【https://www.dataversity.net/
  • 推特粉丝—22.5 万粉丝
  • 脸书追随者—6495 人
  • Linkedin 的追随者—5884 人

DATAVERSITY 致力于向其受众(主要包括日常处理数据的企业、IT 专业人员、开发人员和专家)提供对数据科学行业几项独特创新的丰富理解。

通过从各种来源(包括案例研究、会议、在线活动、网络研讨会、大量研究报告和专家意见)收集的重要见解,我们的目标是向不同的受众提供单一的信息来源。读者可以访问现场网络研讨会、白皮书、在线培训材料、博客和文章,在那里他们可以分解复杂的创新,为读者描绘一幅更清晰的画面。

结论

随着数据科学家需求的快速增长,自学行业最新创新的需求变得势在必行。随着互联网成为几乎所有可以想象的信息的巨大集合,找到正确的知识来源可能会变得具有挑战性。在这篇文章中,我们旨在通过 12 个平台简化您的搜索,这些平台可以方便地告诉您为什么数据科学存在,以及您如何跟上技术的各种变化。

注: 为了消除各种各样的问题,我想提醒你一个事实,这篇文章仅代表我想分享的个人观点,你有权不同意它。

更多有趣的阅读—

我希望这篇文章对你有用!以下是一些有趣的读物,希望你也喜欢

[## 2020 年人工智能工程师的顶级编程语言

从几种编程语言中,人工智能工程师和科学家可以挑选出适合他们需要的语言

towardsdatascience.com](/top-programming-languages-for-ai-engineers-in-2020-33a9f16a80b0) [## 2020 年你必须使用的最好的 Python IDEs 和代码编辑器

具有显著特性的顶级 Python IDEs 和代码编辑器

towardsdatascience.com](/best-python-ides-and-code-editors-you-must-use-in-2020-2303a53db24) [## 2020 年必读的机器学习书籍

看看吧,你为什么要读它们?

towardsdatascience.com](/machine-learning-books-you-must-read-in-2020-d6e0620b34d7) [## 机器学习和深度学习的最佳 Python 库

现代机器学习模型和项目的 Python 库

towardsdatascience.com](/best-python-libraries-for-machine-learning-and-deep-learning-b0bd40c7e8c)

关于作者

克莱尔 D 。是Digitalogy的内容制作者和营销人员,这是一个技术采购和定制匹配市场,根据全球各地的特定需求,将人们与预先筛选的&顶尖开发人员和设计师联系起来。在LinkedinTwitterinsta gram上连接 Digitalogy

最佳数据科学书籍

原文:https://towardsdatascience.com/best-data-science-books-be1ab472876d?source=collection_archive---------59-----------------------

帮助您学习数据科学的前三本书

图片由皮沙贝的格哈特 G. 拍摄

简介

很多人问我,我为想要开始数据科学之旅的人推荐什么资源。本节列出了我推荐你作为数据科学家一生中至少应该阅读一次的书籍。

学做数据科学家需要看这些书吗?答案是:没有。网上有很多和这些书一样好的教程和免费资料。然而,如果你买得起,并能把它们作为补充材料阅读,它们会成为很好的学习资源。与在线教程不同,这些书有一个结构,并以一种有组织和结构化的方式教授概念。这意味着你可以把时间花在学习上,而不是浪费在互联网上寻找好的教程。

我在这里推荐的书籍涵盖了作为一名数据科学家你将需要掌握的主要话题:编程(python)、数据分析和机器学习(包括深度学习)。我知道有很多关于每个主题的书,但这些是我在学习过程中用过的书,我真的可以推荐它们。

Python 编程

亚马逊(附属链接)

作为一名数据科学家,你首先应该是一名优秀的程序员,或者至少努力达到至少一门语言的编程水平。我推荐学习 python,因为它在数据科学中的常见用法和相对简单的学习曲线。

这本书就像一本 python 圣经。它大约有 1600 页,涵盖了所有基本和更高级的 python 概念。

对于开始学习 python 的人来说,这是一本好书,因为它对语言和编程概念有深入的解释,并且内容以简单易懂的方式呈现。

对于那些已经使用 python 有一段时间,但希望更好地掌握它,提高对语言和常见概念(尤其是面向对象编程)的理解的人来说,这也将是一个非常好的修订。

你可以从这里(附属链接)得到这本书。

数据分析

亚马逊(附属链接)

这本书几乎涵盖了与 pandas 有关的数据分析、数据清理和数据预处理的所有内容。而数据科学大部分时间都在做什么?

不幸或幸运的是,我们花了大部分时间来准备数据,以适应机器学习算法。这本书涵盖了所有内容,对于数据分析师或初级数据科学家来说,python 足够让他们熟悉数据分析的编程和库。

另外,这本书是由《熊猫套餐》的作者韦斯·麦金尼写的。如果不是最受欢迎的 python 数据分析库的作者,谁是学习数据分析的最佳人选呢?

你可以从这里(附属链接)得到这本书。

机器学习

亚马逊(附属链接)。

如果你只买一本关于机器学习的书,那将是我的选择。

这可能是一本面向初学者数据科学家的书,他们希望对机器学习算法以及如何使用 scikit-learn 在现实生活中实现这些算法有一个概述。

对于已经熟悉机器学习概念并想要一本书来快速参考和复习的人来说,这也是一个很好的修订。

此外,它还有一个精彩的第二部分,重点是 Keras 和 TensorFlow 的 od 深度学习。

你可以从这里(附属链接)得到这本书。

数据科学中的其他主题

成为一名数据科学家不仅仅涉及 python 编程、数据分析和机器学习。这个职业还有其他你应该掌握的话题。我首先想到的领域是数学和统计学。

我不推荐任何关于这些主题的书籍,因为我一直依赖于我的高中和大学知识,并通过在线教程和资源提供这些知识。如果我读到任何关于这些话题的好书,我会更新这个列表。

最初发表于 aboutdatablog.com: 最佳数据科学书籍,2020 年 8 月 19 日。

PS:我正在 Medium 和aboutdatablog.com上撰写以简单易懂的方式解释基本数据科学概念的文章。你可以订阅我的 邮件列表 在我每次写新文章的时候得到通知。如果你还不是中等会员,你可以在这里加入

下面还有一些你可能喜欢的帖子

* [## 作为一名有抱负的数据科学家,你应该关注的中型作家

我最喜欢的 10 个数据科学博主,让你的学习之旅更轻松。

towardsdatascience.com](/medium-writers-you-should-follow-as-an-aspiring-data-scientist-13d5a7e6c5dc) [## 熊猫概况和探索性数据分析的第一行代码!

了解如何为自动 EDA 安装和使用 pandas profiling

towardsdatascience.com](/pandas-profiling-and-exploratory-data-analysis-with-line-one-of-code-423111991e58) [## Jupyter 笔记本自动完成

数据科学家的最佳生产力工具,如果您还没有使用它,您应该使用它…

towardsdatascience.com](/jupyter-notebook-autocompletion-f291008c66c) [## 9 大 Jupyter 笔记本扩展

改进笔记本电脑功能,提高您的工作效率

towardsdatascience.com](/top-9-jupyter-notebook-extensions-7a5d30269bc8)*

你从未听说过的最好的数据科学认证

原文:https://towardsdatascience.com/best-data-science-certification-4f221ac3dbe3?source=collection_archive---------0-----------------------

数据策略最有价值培训实用指南。

逆流而上解决数据质量问题。由阿莱克萨纳在像素上拍摄的照片。

** 更新 1/6/21 : 如果你对 CDMP 基础考试的全面学习计划感兴趣,可以看看我整理的这个 邮件系列 来帮你。在 90 天结束时,你会完全准备好 毫不费力 王牌 CDMP

** 更新 11/23/20 :

[## 数据科学家如何获得最被低估的认证

这种简单的开卷测试为数据科学家提供了数据策略方面的专业知识和重要的领导技能。

towardsdatascience.com](/cdmp-exam-d65e1255016b)

**** 更新 10/13/20 :我现在通过了基础考试,被认定为 CDMP 合伙人。有问题吗?在评论中留言或者加入 学习小组

**** 更新 8/15/20 :最近我注意到认证考试是 开卷 ,这是非常令人兴奋的,因为这意味着在真实世界设置中记忆的时间更少,而处理数据的时间更多。另外,我在脸书上开了一个 学习小组——加入帮助你备考。

八年前,数据科学被宣布为“21 世纪最性感的工作”然而,埋头苦读数小时的数据仍然让人感觉绝对T2 不性感。如果说有什么不同的话,那就是数据科学职业生涯的传奇般的崛起说明了大多数组织在管理数据方面做得有多差。

进入认证数据管理专业(CDMP)来自数据管理协会国际( DAMA )。CDMP 是你从未听说过的最好的数据战略认证。(老实说,当你考虑到你可能正在从事一份十年前并不存在的工作时,这一认证尚未普及就不足为奇了。)

数据战略是一个重要的学科,它涵盖了数据生命周期的端到端管理、数据治理的相关方面以及数据伦理的关键考虑。

这篇文章概述了获得 CDMP 的方法和理由,这为有效的数据战略思想领导奠定了基础。它还包括一项调查,您可以就数据科学的数据管理的最重要方面提出您的想法,并查看社区的共识。

本指南中的:

  1. 关于 CDMP 考试
  2. 如何准备 CDMP
  3. CDMP 考什么
  4. 调查——数据管理最重要的方面
  5. 为什么数据科学家应该获得 CDMP 认证

免责声明 :本帖非 DAMA International 赞助——所反映的观点仅是我个人观点。我在亚马逊上添加了一个链接到DMBOK的链接,这是考试所需的参考指南,因为这是一个开卷考试。通过此链接购买这本书有助于支持我在数据科学和数据策略方面的写作——提前致谢。**

关于 CDMP 考试

CDMP 培训提供了与数据策略相关的 14 个领域的专业知识(我将在后面的章节中详细介绍)。考试是开卷,但是考试上的 100 道题必须在 90 分钟内完成——没有太多时间来查找东西。因此,非常熟悉参考资料非常重要。**

当你安排考试(300 美元)时,DAMA 提供了 40 个练习题,这些练习题很好地反映了实际考试的难度。作为进一步的资源,查看这篇关于学习认证过程的文章。

可以通过网络摄像头在线参加考试(监考费 11 美元)。考试形式是多项选择——从五个选项中选择一个正确的选项。你可以标记问题,然后再回来。在考试结束时,你会立即得到分数反馈。

超过 60%视为通过。如果你有兴趣获得 CDMP 助理认证并继续前进,这很好。如果你对 CDMP 认证的高级层次感兴趣,你必须通过 70% (CDMP 从业者)或 80% (CDMP 硕士)。要获得最高级别的认证,CDMP 研究员,你需要获得硕士认证,并展示行业经验和对该领域的贡献。这些高级认证中的每一项都需要通过两次专业考试**

这让我想到了我的最后一点,那就是为什么——纯粹从职业发展的角度来看——你应该选择通过 CDMP 的学习和考试过程:来自 DAMA 的认证与领导、管理和数据架构方面的高端职位相关联。(把 CDMP 想象成一个半秘密的数据忍者团体。)与数据管理相关的企业角色和联邦合同越来越多地要求获得 CDMP 认证。阅读更多。

via CDMP

优点:

  • 提供关于数据策略相关主题的全面知识库
  • 开卷考试意味着花在死记硬背上的时间更少
  • 针对不同级别的数据管理专业人员的四个层次
  • 通过最低级别认证的 60%分数要求
  • 与精英角色相关联
  • 向 DAMA 国际提供 3 年会员资格
  • 311 美元的考试费比微软和开放集团的其他数据相关认证便宜

缺点:

  • DAMA 没有一家主要的技术公司(如亚马逊、谷歌、微软)的支持,这些公司正在积极推动营销工作,推动 CDMP 认证的品牌认知度——这意味着 CDMP 可能主要在已经熟悉数据管理的个人中被认为是有价值的
  • 与 AWS 云从业者证书(100 美元)或 GPC 证书(200 美元)相比,311 美元的考试费相对昂贵

替代品:

  • 微软认证解决方案助理 ( MCSA ) —专注于各种微软产品的模块化认证(330 美元以上)
  • 微软认证解决方案专家 ( MCSE ) —建立在 MCSA 的基础上,集成了诸如核心基础设施、数据管理&分析和生产力(495 美元以上)等主题的认证
  • 开放组架构框架(TOGAF)—软件开发和企业架构方法论高级框架的各种级别认证(550 美元以上)
  • 规模敏捷框架(Scaled Agile Framework)软件工程团队基于角色的认证(995 美元)

如何准备去 CDMP

鉴于 CDMP 是一个开卷考试,为了考试而学习,所需要的就是 DAMA Body 的知识书( DMBOK $55)。它大约有 600 页,但是如果你把你的学习时间主要集中在第一章(数据管理)、图表&模式、角色&职责和定义上,那么这应该能让你达到 80%的及格分数。

就如何使用 DMBOK 而言,一名考生建议在 8-10 周内每周末 4-6 小时。另一种方法是每天早晚阅读几页。无论你如何处理,确保你将间隔重复融入到你的学习方法中。

除了作为考试的学习指南, DMBOK 当然也是有用的参考书,如果你的同事需要学习数据策略或者他们在网上研讨会期间打瞌睡,你可以把它放在他们的桌子上。

CDMP 在测试什么

CDMP 涵盖了 14 个主题——我按照它们在考试中出现的频率列出了它们,并为每个主题提供了一个简短的定义。

数据治理 ( 11%) —确保数据资产正式管理的实践和流程。阅读更多。

数据质量 ( 11%) —根据数据的准确性、完整性、一致性、完整性、合理性、及时性、唯一性/重复数据删除、有效性和可访问性,确保数据适合消费。阅读更多。

数据建模和设计(11%)——将商业需求转化为技术规范。阅读更多。

元数据管理 (11%) —收集的数据信息。阅读更多。

主数据和参考数据管理 (10%) —参考数据是用于对数据库中的其他数据进行分类的信息,或者仅用于将数据库中的数据与组织边界之外的信息相关联的信息。主参考数据是指在组织内多个系统之间共享的信息。阅读更多。

数据仓库和商业智能(10%)—数据仓库以一种优化的方式存储来自运营系统(以及潜在的其他数据资源)的信息,以支持决策过程。商业智能是指利用技术收集和分析数据,然后将其转化为有用的信息。阅读更多。

文档和内容管理 (6%) —用于组织和存储组织文档的技术、方法和工具。阅读更多。

数据集成和互操作性 ( 6%) —使用技术和业务流程来合并来自不同来源的数据,目标是方便有效地提供对有价值信息的访问。阅读更多。

数据架构 (6%) —根据组织的数据策略,描述现有状态、定义数据需求、指导数据集成和控制数据资产的规范。阅读更多。

数据安全 ( 6%) —实施政策和程序以确保人和事物对数据和信息资产采取正确的行动,即使存在恶意输入。阅读更多。

数据存储和操作 ( 6%) —保存、删除、备份、组织和保护组织信息的硬件或软件的特性。阅读更多。

数据管理流程 ( 2%) —数据的端到端管理,包括收集、控制、保护、交付和增强。阅读更多。

大数据 ( 2%) —超大型数据集,通常由各种结构化、非结构化和半结构化数据类型组成。阅读更多。

数据道德 ( 2%) —包含数据处理、算法和其他实践的行为准则,以确保数据在道德背景下得到适当使用。阅读更多。

调查

出于好奇,我很乐意听听你对数据管理最重要方面的看法。在您在下面的投票中做出选择后,您将会看到社区的想法。**

你的选择是出于什么考虑?你认为为 CDMP 学习是学习这些话题的有效方法吗?在评论里说吧。

为什么数据科学家应该获得 CDMP 认证

仍然不相信为什么数据策略很重要?让我们从数据科学家的角度来看一下,他们的目标是增加知识和收入潜力。

Franki Chamaki 在 Unsplash 上的照片。该标牌是一家利用人工智能服务于零售业的公司的商标。

据说数据科学家是统计学、计算机科学和领域知识的结合点。为什么你想在你的盘子里多加一样东西呢?

就成功而言,擅长两种互补的技能比擅长一种技能要好

《呆伯特漫画》的作者和创作者斯科特·亚当斯提出了这样一个观点:“你获得的每一项技能都会让你成功的几率翻倍。”他承认这可能有点过于简单化——“显然有些技能比其他技能更有价值,你获得的第 12 项技能可能不如前 11 项技能中的每一项有价值”——但关键是有时拓宽* 比深入更好。***

抛开收益的相对大小(因为我严重怀疑它是每项技能的 2 倍…谢谢你,边际收益递减定律),相对于辛苦学习一项特定技能,拓宽你的技能组合无疑会带来更大的收益。简而言之,这就是我认为数据科学家学习数据策略非常重要的原因。**

一般来说,拥有多样化的技能可以让你:****

  1. 利用跨学科的知识更有效地解决问题
  2. 与其他专业的队友更好地交流
  3. 在接触新项目方面迈出第一步

了解数据策略可以让你从一个数据消费者转变为组织中的数据倡导者。忍受所有绕口令缩写( DMBOK )是值得的——真的吗?他们就不能把它叫做数据管理书吗? ) 为了加深你对端到端知识生成过程的欣赏。**

如果你喜欢阅读这篇文章,请在 Medium 、 LinkedIn 和 Twitter 上关注我,了解更多提升你的数据科学技能的想法。加入 CDMP 考试的学习小组。购买 DMBOK 。

使你的技能多样化的其他文章

*** [## 使用 Java 解决您的数据科学问题

通过了解这种广泛使用的编程语言的基础知识,快速访问高质量的数据。

towardsdatascience.com](/java-for-data-science-f64631fdda12) [## 数据仓库综合指南

了解数据仓库作为分析就绪数据集的主存储库的角色。

towardsdatascience.com](/data-warehouse-68ec63eecf78) [## 如何不费吹灰之力通过 AWS 云从业者认证

预测:多云,第一次尝试有 100%的机会通过。

medium.com](https://medium.com/@nicolejaneway/how-to-ace-the-aws-cloud-practitioner-certification-with-minimal-effort-39f10f43146)***

最佳数据科学资源以及如何使用它们来获得数据科学能力

原文:https://towardsdatascience.com/best-data-science-resources-online-and-how-to-use-them-to-attain-data-science-competency-50ec9e572879?source=collection_archive---------61-----------------------

回顾最受欢迎的资源和推荐选项,将它们结合起来实现您的目标

本文中包含的一些资源的标题。我做的图像。

我收到的最常见的请求之一是推荐在线课程。这不是一件容易的事。在线课程竞争非常激烈,有许多课程提供不同的知识,几乎都声称自己是最好的课程。这就是为什么本周我坐下来回顾了学习数据科学的最受欢迎的课程和书籍的内容。

在这篇文章中,我将分享我对流行的数据科学课程和书籍的看法。在文章的最后,你可以找到我推荐的利用这些资源学习数据科学的方法。

我知道…

…你只是想看一下推荐课程的列表,但请稍等片刻。我要说的对你的课程选择很重要。在寻找数据科学课程时,您应该记住以下几点:

  • 每门课程的创立者在准备课程时都有不同的想法,他们根据这些想法选择教学主题。不要完全相信一个教师对学科有全面和公正的看法。
  • 对“完整训练营”这样的说法要有所保留。事实上,一门课程涵盖了你所听过的关于数据科学的一切,但这并不意味着它完全涵盖了这些内容。
  • 最后,你可以选择适合你的课程。教学风格、课程水平和先决条件都很重要。不要只选择最流行的。
  • 如果你很难找到适合你具体情况的课程,我的建议是,当你寻找课程时,去找一门课程的最低分,看看人们抱怨的东西是否适用于你。例如,许多人可能会给这门课打 5 颗星,但如果你学的是数学,而与你情况相近的人试图选修这门课,却因为与数学有关的原因而不喜欢它,那么这就证明这门课可能不适合你。
  • 你不必从单一的课程中获得所有的知识。你可以找到几门相辅相成的课程。有时从几个来源获取知识甚至更好。有点重叠并不是一件坏事。
  • 最重要的是,一门课程不能给你所有你需要知道的东西。把它当成一个起点,聪明地选择但不要想太多。你需要学习的只是基础知识。其余的来自实践。

既然你已经听了我的建议,让我们跳到复习部分。首先,知道我如何评价这些课程对你来说很重要。

我是如何评估这些资源的?

如果你学过我的数据科学入门课程,你会知道我把做数据科学所需的知识分为三层。理论、实践和技术。我将根据每门课程如何达到要求的理论知识来评估每门课程。

请记住,我是从获得数据科学所需的基础知识的角度来评判课程的。我所关心的是,这门课程能否让你从“对数据科学知之甚少”发展到可以开始实施自己的项目。因为一旦你知道的足够多,可以开始实施,你就会通过试错来弥补你知识中的所有空白。在数据科学中,有很多东西要归功于经验。不是所有的东西都能通过学习学会。

免责声明:我没有参加这些课程,也没有做他们的测验/练习。我的知识将是有限的。我在这里尝试做的是复习课程大纲和预习课程视频,并尝试得出结论。我还浏览课程评论,看看以前的学生对此有何反应。

我做了这些评论,因为我想提供我作为数据科学家的现有知识,以帮助您判断哪门课程更适合您。我和一个非数据科学家做这件事的不同之处在于,我对所需的技能有更好的看法,也知道对一个数据科学家来说什么是重要的。说到底,我如何评价这些课程是我的个人意见,不代表任何其他党派或组织。这篇文章或我在里面说的任何事情都是而不是赞助或推广的。

我已经说得够谨慎了。让我们言归正传。

在线课程

IBM 数据科学专业认证

这个认证是一个很好的开始。适合完全初学者。它将把你从一个“我不知道什么是数据科学”的点带到一个非常有知识的点。它涵盖了广泛的主题,但并不完整,也没有包括一些更高级的主题。这是以简单的方式学习数据科学基础知识的好方法。我不建议你把这门课作为唯一的课程。用一门更深入的课程来补充它会更好地为你服务。总的来说,这是一个很好的第一课。

约翰霍普金斯大学数据科学专业

这门课感觉很学术,但也有很实用的一面。它包括一些基础知识,但我发现它在提供数据科学的全貌方面有所欠缺。数据准备和处理数据相关问题等重要知识缺失,但有关于统计和研究的章节。这不像是一个很好的工业翻译。它深入到一些高级的主题,比如降维,但是我不确定是否预先提供了足够的基础。我不会向初学者推荐这门课程。此外,我不会仅仅因为它不完整就选择它作为我自己的研究对象。

密歇根大学 Python 专业的应用数据科学

这个课程有些东西好,有些东西不好。这对于可视化和对文本挖掘感兴趣的人来说是好的,但对于获得机器学习或一般数据科学实践的良好画面来说不是好的。拥有广泛的流行机器学习算法,但不知何故缺少无监督学习和缺乏数据准备。如果你有时间,甚至只是学习文本挖掘基础,这可能是一个很好的副业。

吴恩达的机器学习

这个课程是专门针对机器学习的,而不是一般的数据科学。它教授机器学习的数学和理论,同时也触及高级主题。因此,它不是初学者的课程。这门课程最大的缺点是使用了相当过时的工具,比如 Matlab。此外,它忽略了一些非常重要的算法,如决策树或随机森林。因此,不觉得它是一个完整的包,或者它可能在 8 年前是完整的,但现在有缺口。我建议,只有在对数据科学有了基本了解之后,才能学习这门课程。

【2020 年数据科学课程:完整的数据科学训练营

这是一门雄心勃勃的课程。它拥有从职业建议到 Python 到机器学习算法到统计学的一切。以这门课的题目数量,可以做五门课。虽然它涵盖了许多主题,但它似乎错过了一些基础概念,如数据准备和机器学习基础。而且,结构似乎有点乱。正如我之前提到的,对所教内容雄心勃勃的课程往往是肤浅的。我本人没有上过这门课,但我不认为深度学习和职业建议应该放在同一门课中。恕我直言,当所有其他课程都可用时,我不会选这门课。

用于数据科学和机器学习的 Python 训练营

我在网上见过的最全的课程之一。它很好地介绍了与数据科学相关的技术,并教授了一些使用 Python 进行数据准备的实践,同时还涉及了数据可视化。引入了许多最流行的算法,但我不确定有多好。这些课程似乎没有深入到这些算法是如何工作的,而是它们是如何在 Python 中实现的。大部分基本的数据科学基础知识都包括在内。我认为,就我所见,这是一门非常实用的课程。它可能不太适合学习数据科学的理论方面,但在机器学习方面,它有利于学习如何编写 python 代码。

数据科学 A-Z:现实生活中的数据科学练习包括

这门课程似乎是为了培养一种非常特殊的数据科学家。这不是一门理论课程,相反,它试图通过教授数据科学的操作方法以及非常具体的工具和软件来变得非常实用。我认为这门课所教的技能不能很好地概括。因此,我不推荐这个课程。

机器学习 A-Z:数据科学中的实践 Python&R

这个课程用 Python 和 R 两种语言讲授所有内容,这使得它太长了,但是,当然,你可以跳过你不感兴趣的语言的实现视频。它有一个很好的机器学习算法的选择,但机器学习似乎是这门课程唯一关注的事情。它不包括可视化、python 基础、数据科学技术或机器学习理论。仅简单提及与训练机器学习算法相关的数据准备。这门课程可能是学习更多关于机器学习算法以及如何实现它们的好选择,而不是学习一般数据科学的来源。

完整的机器学习和数据科学:零到精通

这不是最先出现的课程之一,但我在这里包括了这门课程,因为我参加了同一批人的 web 开发课程,并且很喜欢它。这似乎是一门非常实用和动手的课程。它并没有给人这样的感觉,即它将教授 ML 算法或一般数据科学背后的许多理论。相反,它会教你 Python,建立一个数据科学环境,数据科学的基础知识和 ML 算法的实现。当你想亲自动手时,这是一门很好的课程。

哈佛大学数据科学专业证书

这个课程是我能找到的最好的课程之一。理论上是非常完备的。它适当地回顾了机器学习的基础,介绍了最重要的算法和技术。我发现数据准备(课程中的数据扯皮)部分有点欠缺。这门课唯一让我不喜欢的是主要技术是 r,总而言之,这门课一开始听起来很扎实。

加州大学圣地亚哥分校的数据科学微硕士项目

这是一门高级课程,可以用来进一步学习。它有一个很棒的数学和统计部分。如果你想为你的机器学习知识打下坚实的理论基础,在对数据科学的主要概念有信心后,我会选择这门课程。

IBM 的数据科学基础

这就像数据科学课程一样简单。如果你对进入数据科学仍持观望态度,并想体验一下它是什么,我会去上这门课。这只是一个非常简单的介绍,不需要太多时间。你可以将本课程与使用 Python 的数据分析和使用 Python 的机器学习结合起来,更深入地了解数据科学。

使用 Scikit-Learn、Keras 和 TensorFlow 进行机器实践学习,第二版

这本书是最好的书之一,甚至可能是最好的。它基本上包含了您需要了解的一切,让您对自己的数据科学知识充满信心。所有的理论、数学甚至统计数据。如果你问我,这是一个独立的冠军。

虽然我认为这本书对任何人都会很管用,但普遍的看法是,这是一本中级水平的书,而不是一本初学者的书。我在一定程度上同意。我不会向初学者推荐整本书,而只推荐第一部分。这是因为第二部分进入深度学习,这对初学者来说是不必要的。无论如何,第一部分应该足以让你对数据科学有一个非常扎实的理解。

你可以很容易地用我上面提到的简单课程来补充它,以便更轻松地开始数据科学,然后全身心投入这本书。

数据科学从零开始,第二版

这本书的目标是让读者在不使用任何库的情况下手工实现算法。通过这样做,这本书很好地教授了数据科学和机器学习的基础知识。即使你不想在动手编码开始之前从头开始动手实现机器学习算法,学习数据科学背后的理论也是非常有用的。还有,作者爆笑。

用 Python 进行机器学习简介

这是另一个伟大的初学者水平的书。它主要关注机器学习及其背后的理论。它不会花太多时间处理数据。然而,这是一本研究机器学习算法的理论和实用性的好书。

学习平台

我知道有 Datacamp,Dataquest 等线上平台。我这周没有时间复习它们。我将很快浏览它们,并通过更新这篇文章来分享我的观点。

如果你愿意的话,可以是总结或最终裁决

我会建议几条途径:

选项 1

如果你想学习数据科学和机器学习背后的理论,并获得实践经验

IBM 数据科学专业认证打造基础

吴恩达的机器学习课程获取机器学习的理论知识(注意过时的应用,对实现持保留态度)

Python for Data Science and Machine Learning boot campMachine Learning A-Z:动手实践 Python & R In Data Science 获取实践知识

选项 2

如果想专注于理论知识

IBM 数据科学专业认证打造基础

加州大学圣地亚哥分校的数据科学微硕士项目深入探讨高级主题

选项 3

‍:如果你只想学一门课

哈佛数据科学专业证书学习全面的数据科学技能

选项 4

‍:如果你是一个非常注重实践的人,不想学习太多理论

完整的机器学习和数据科学:零到精通

选项 5(个人最爱)

课程和你的学习旅程是非常个人化的。这就是为什么我一直非常小心,不去对你应该做什么或不应该做什么提出任何宏大的主张。当然,我有一个最喜欢的。我并不是说这对每个人来说都是最好的方式。我只是说,如果我必须给我的兄弟或姐妹关于如何学习数据科学的建议,我会告诉他/她遵循这个选项。

IBM 数据科学专业认证打造基础

使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习实践以获得对数据科学和机器学习概念的全面而正确的理解

不管多少,都要坚持做兼职项目

一锤定音

实事求是地看待这些资源,尽你所能从中获取,留下那些不适合你的。你将有时间重复、重温和重新学习一些(如果不是大部分)概念。不要把一门课程的结束或者一个证书的获得看作是你学习旅程的结束,到那时你应该什么都知道了。你的学习不会在参加这些课程或获得一些证书后就结束。相反,这是你学习新篇章的开始。在这一点上,你应该开始把你的技能用在项目上。通过这种方式,你可以实践你所学的东西,发现你知识中的差距,并通过解决这些差距来进一步提高自己。

我希望这篇文章能帮助您确定迈向数据科学的第一步,这样您就可以平稳地过渡到更具实践性的阶段。

👉对数据科学领域以及如何开始学习感到困惑? 免费参加数据科学入门迷你课程

数据科学家的最佳数据科学工具

原文:https://towardsdatascience.com/best-data-science-tools-for-data-scientists-75be64144a88?source=collection_archive---------10-----------------------

数据科学工具,使任务可以实现

数据分析做出强有力的决策(来源

我们正在进入一个数据可能比软件更重要的新世界。
——

AI 已经接管了我们很多平凡的任务,并在这个过程中让我们的生活变得更加轻松。这归功于研究人员、数据科学家和开发人员在收集、研究和重塑数据方面投入的大量研究和奉献。不仅仅是 IT 部门,所有行业都从这些进步中受益。如果没有工作工具的发展和改进,这一切都不可能实现。

2020 年要学习的顶级数据科学工具

当我说“数据科学”时,我指的是将数据转化为现实世界行动的工具集合。这些包括机器学习、数据库技术、统计学、编程和特定领域技术。

随着现有工具的改进和更新工具进入数据科学领域,许多任务变得可以实现,而这些任务在早期要么过于复杂,要么难以管理。这些工具背后的核心思想是将数据分析、机器学习、统计学和相关概念联合起来,充分利用数据。这些工具对于任何希望深入数据科学世界的人来说都至关重要,选择正确的工具可以让世界变得不同。

信息是 21 世纪的石油,分析是内燃机。
—彼得·桑德加德

Apache Hadoop

面向可靠、分布式、可扩展计算的开源软件。

Hadoop——面向可靠、分布式、可扩展计算的开源软件(来源

Apache Hadoop 是由Apache Software Foundation根据 Apache License 2.0 授权的开源软件。通过使用跨节点集群的并行处理,它有助于解决复杂的计算问题和数据密集型任务。Hadoop 通过将大文件分割成块,并通过指令将其发送到节点来实现这一点。帮助 Hadoop 实现更高效率和更流畅处理的组件包括:

● Hadoop Common 为子系统提供标准库和函数

● Hadoop 分布式文件系统提供文件系统和机制,用于拆分和分发数据块

● Hadoop YARN 调度作业并管理集群

● Hadoop MapReduce 用于处理并行处理

●将每个项目的磁盘驱动性能提高 10 倍

●与外部应用和软件解决方案无缝集成

SaS

将数据转化为洞察力

统计分析系统的简称, SAS 是由 SAS 研究所开发的统计工具。这是最古老的数据分析工具之一。最新稳定版本 v9.4m6 于 2018 年 11 月发布。SAS 提供的主要功能有:

●通过大量可用教程轻松学习

●一套包装完好的工具

●简单而强大的图形用户界面

●文本内容的粒度分析

●无缝的专业技术支持

●视觉上吸引人的报告

●识别拼写错误和语法错误,以便进行更准确的分析

目标是将数据转化为信息,将信息转化为洞察力。
——卡莉·菲奥莉娜

SAS 允许你从几个领域挖掘、改变、管理和检索数据。配合 SQL** ,SAS 成为数据访问和分析的极其高效的工具。 SAS 已经发展成为一套服务于多种用途的工具,其中包括:**

●数据挖掘

●统计分析

●商业智能应用

●临床试验分析

●计量经济学和时间序列分析

●画面

功能强大且发展最快的数据可视化工具

Tableau 是一款出色的数据可视化工具,最近被全球领先的企业 CRM 之一 Salesforce** 收购。Tableau 专注于在短时间内提供清晰的数据表示,可以帮助更快地做出决策。它通过利用在线分析处理立方体、云数据库、电子表格和关系数据库来做到这一点。**

Tableau 的便利性让您可以专注于统计数据,而不必担心如何设置它。开始使用就像将数据集拖放到应用程序上一样简单,而设置过滤器和自定义数据集则轻而易举。

  • 全面的端到端分析
  • 高级数据计算
  • 轻松发现内容
  • 完全受保护的系统,将安全风险降至最低
  • 反应灵敏的用户界面,适合所有类型的设备和屏幕尺寸

要知道的一件有趣的事情—

●张量流

说到 AI,DL 和 ML, TensorFlow 这个名字你总会听到。 由 Google 提供,TensorFlow 是一个无所不能的库,它可以构建和训练模型,部署在计算机、智能手机和服务器等不同的平台上,以有限的资源实现最大的潜力。

使用 TensorFlow,您可以创建统计模型数据可视化,并访问 ML 和 DL 的一些同类最佳且广泛使用的功能。TensorFlow 对 Python 的偏爱使其成为一种强大的编程语言,通过存储、过滤和操作数字和数据来进行分布式数值计算。

数据机器人

****data robot成立于 2012 年,现在被称为满足你所有人工智能需求的企业级解决方案。它旨在自动化构建、部署和维护人工智能的端到端过程。DataRobot 只需简单点击几下就能让你上手,而且不需要你是专业人士就能完成很多工作。DataRobot 为您的业务需求提供以下功能:

●自动化 ML

●自动化时间序列

● MLOps

● Paxata 帕克萨塔

这些可以与其他部署选项(如云或内部部署)结合使用或单独使用。对于数据科学家来说,这使他们能够更多地关注手头的问题,而不是忙于设置东西。

有趣的是-

** [## 为新冠肺炎的响应工作开放其平台

与 AWS 合作,有意者可免费使用 DataRobot 公司数据科学家还预测…

www.datarobot.com](https://www.datarobot.com/news/press/datarobot-opens-up-its-platform-for-covid-19-response-efforts/)

BigML

立即开始做出数据驱动的决策。

BigML 的成立只有一个目标,那就是让每个人更容易建立和分享数据集和模型,最终让机器学习变得更容易。旨在提供强大的 ML 算法,仅用一个框架来减少依赖性。BigML 的专业知识包括以下领域:

●分类

●回归

●时间序列预测

●聚类分析

●异常检测

●主题建模

BigML 包括一个易于使用的 GUI,允许交互式可视化,使数据科学家轻松做出决策。对 REST APIs 的支持可以让您立即启动并运行。通过 JSON PML 和 PMML 导出模型的能力有助于从一个平台到另一个平台的无缝过渡。还支持内部和外部部署。

Knime

F ree 和开源数据分析、报告和集成平台

KNIME 是一个多用途工具,它可以进行数据报告和分析,同时可以轻松地将数据挖掘和机器学习等元素集成到您的数据中。KNIME 的直观 GUI 允许用最少的编程知识进行轻松提取转换数据加载。KNIME 支持创建可视化数据管道来创建模型和交互式视图,可以处理大量数据。

knime——免费和开源的数据分析、报告和集成平台(来源)

KNIME 的集成能力允许用下面列出的数据库管理语言扩展其核心功能,例如:

● SQLite

● SQL 服务器

● MySQL

●甲骨文

● PostgreSQL

●还有更多

●阿帕奇火花

Apache Spark 是用于大规模数据处理的统一分析引擎。

Apache SparkbyApache Software Foundation是一款分析和处理大规模数据的工具。它允许您通过合并数据并行性和容错性对数据集群进行编程,以便对它们进行集中处理。对于数据集群,Spark 需要一个集群管理器和一个分布式存储系统。Spark 还继承了 Hadoop 的一些特性,比如 YARN、MapR 和 HDFS。

Spark 还提供数据清理、转换、模型构建和评估。Spark 的内存工作能力使其处理数据和写入磁盘的速度极快。支持与其他编程语言的集成、转换以及它的开源特性使它成为数据科学家的一个很好的选择。

RapidMiner

RapidMiner —数据科学平台(来源)

RapidMiner 是一个面向团队的数据科学平台,它将数据准备、机器学习和预测模型部署结合在一起。

RapidMiner 提供的工具可以帮助您从最初准备数据到最后一步(即分析部署的模型)准备模型。RapidMiner 本身作为一个完整的端到端数据科学包,利用了其他产品提供的集成,例如:

●机器学习

●深度学习

●文本挖掘

●预测分析

RapidMiner 面向数据科学家和分析师,它提供的一些功能包括:

●数据准备

●结果可视化

●模型验证

●用于扩展核心功能的插件

● ver 一千五百原生算法

●实时数据跟踪和分析

●支持数十种第三方集成

●全面的报告能力

●适合任何规模团队使用的可扩展性

●卓越的安全特性

Matplotlib

Matplotlib 让简单的事情变得简单,让困难的事情变得可能。

Matplotlib 是任何数据科学家都必须知道的 Python 的基本开源图形绘制库之一。它不仅为用户提供了广泛的定制选项,而且不会使任何事情变得过于复杂。任何熟悉 Python 的人都知道 Python 凭借其庞大的库集合以及与其他编程语言的集成有多么强大。

使用 Matplotlib 的简单 GUI,数据科学家可以创建引人注目的数据可视化。几个导出选项使您可以更容易地将自定义图形带到您选择的平台上。

Excel

更好地了解您的数据

米卡——照片由米卡·鲍梅斯特在 Unsplash 上拍摄

作为微软 Office 工具套件的一部分,Excel 对于普通人来说是一个简单的电子表格管理工具,但在数据科学家等超级用户手中,它将成为一个极其高效的工具。众所周知,Excel 对于新手来说是一个简单的入门工具,但是一旦他们发现它有多强大,他们就会继续使用。

Excel 显示数据的方式使其强大的数据可视化风格使决策一目了然。Excel 提供的公式就像上面的樱桃一样,将 Excel 从一个简单的表示应用程序的数字转换成可以处理这些巨大数字的东西,可以是连接、查找长度、查找总和、平均值等等。**

结论

数据在当今人工智能的世界中发挥着决定性的作用,使数据科学家能够做出有影响力的决策。在缺乏强大的数据科学工具的情况下,这项任务变得异常复杂。无论您的专业水平如何,我们都让您更容易了解可用的工具。如果您对数据科学感兴趣,您有大量的工具可供选择。虽然这些工具中有一些值得被称为多面手,但也有一些迎合了特定的需求。

注: 为了消除各种各样的问题,我想提醒你一个事实,这篇文章仅代表我想分享的个人观点,你有权不同意它。

更多有趣的阅读—

我希望这篇文章对你有用!以下是一些有趣的读物,希望你也喜欢

** [## 2020 年人工智能工程师的顶级编程语言

从几种编程语言中,人工智能工程师和科学家可以挑选出适合他们需要的语言

towardsdatascience.com](/top-programming-languages-for-ai-engineers-in-2020-33a9f16a80b0) [## 机器学习和深度学习的最佳 Python 库

现代机器学习模型和项目的 Python 库

towardsdatascience.com](/best-python-libraries-for-machine-learning-and-deep-learning-b0bd40c7e8c) [## 选择 PyTorch 进行深度学习的理由

PyTorch 可以为深度学习程序员提供很多东西

towardsdatascience.com](/reasons-to-choose-pytorch-for-deep-learning-c087e031eaca)

关于作者

克莱尔 D 。在Digitalogy是一个内容制作者和营销人员,这是一个技术采购和定制匹配市场,根据全球各地的特定需求,将人们与预先筛选的&顶尖开发人员和设计师联系起来。在LinkedinTwitterinsta gram**。****

用于正向和反向工程的最佳数据库设计工具

原文:https://towardsdatascience.com/best-database-design-tools-for-forward-and-reverse-engineering-cdaab971013d?source=collection_archive---------12-----------------------

这篇文章强调了用于正向和反向数据库工程的可视化工具的基本要求。我们还列举了数据库设计中最流行的可视化解决方案。

图片来自 Piqsels (CC0)

数据设计可视化工具的基本要求

数据库设计软件必须确保的首要事情是正向和反向工程。实现它的一个方法是视觉设计。它在数据模型中引入变更时生成代码,支持向前工程。而且,它从代码中构建一个图形模型,支持逆向工程。

因此,数据库设计的可视化解决方案必须在以下功能中提供图形正向和反向工程:

  1. 可视化数据库结构以供进一步分析。
  2. 使用容器聚集逻辑上相关的对象。
  3. 跟踪表之间的逻辑关系。
  4. 打开大型 SQL 数据库图表。
  5. 在图表中创建和编辑数据库对象。

此外,还应具备以下可视化工具:

  1. 数据建模语法的符号列表。
  2. 对象的注释。
  3. 文档化的计划,显示当前 SQL 图的逻辑结构。在数据库图表中浏览表及其相关性时,可以使用它。
  4. 图表概述(在图表中缩放和导航)。
  5. 所显示数据的详细程度(是否显示约束、索引等。).
  6. 设计列表(优化黑白打印、彩色打印等。).

数据库可视化解决方案还可能涉及其他需求。

数据库设计可视化工具概述

在我们阐明了数据库可视化设计工具的基本标准之后,让我们回顾一下最流行的软件解决方案。我们从各种网络评级和评论中编辑了这个列表,特别关注那些工具中存在的正向和反向工程选项。

MySQL 工作台

MySQL WorkBench 是数据库架构师、开发人员和设计人员的强大工具集。在其他特性中,它提供了可视化数据库设计和管理数据库的选项。正向和反向工程都有工具。用户可以顺利无误地将图形数据模型转换成 MySQL 服务器上的数据库。该软件适用于数据建模、服务器配置、数据库管理和备份。此外,该产品与 Windows、Mac 和 Linux 兼容。

图片 1。MySQL Workbench 中的数据模型

DbForge 工作室

dbForge Studio for MySQL 是一个多功能解决方案,用于创建和维护 MySQL 和 MariaDB 数据库。该功能涵盖了 PL/SQL 编码、数据同步、表分析、模式比较以及针对所有类型的数据库开发工作的更多选项。值得一提的是数据库结构可视化特性——它在 MySQL 数据库图中显示所有对象及其属性。制作这种图表的工具是 MySQL 数据库设计器的一部分。这样,你就可以通过拖放来进行逆向工程。该产品针对团队协作进行了优化。

形象二。DbForge Studio 中的数据模型

SSMS

SQL Server Management Studio (SSMS)是一个基于 Windows 的免费实用工具,可用于任何 SQL 基础设施。该解决方案允许开发人员访问、管理和开发所有 SQL Server、SQL 数据仓库和 Azure SQL 数据库组件。该环境提供了各种各样的图形工具和丰富的脚本编辑器,适合所有级别的管理员。其中一个优势是在本地计算机和云中使用数据库和数据仓库。请注意,该解决方案仅与操作系统 Windows 兼容(AMD 或 Intel)。

图片 3。SSMS 的数据模型

Visual Studio

Microsoft Visual Studio 是一个多用途的 IDE(集成开发环境),适用于数据库开发和维护。它可以导入现有的模式并将它们转换成数据库。在编译器、图形设计器和许多其他功能的帮助下,它可以执行与数据库设计相关的所有必要任务。逆向工程是可用的,该软件可以为每个特定的数据库对象生成 T-SQL 文件。Visual Studio 与 Microsoft SQL Server 数据库和 Azure SQL 数据库都兼容。

图片 4。Visual Studio 中的数据模型

SQLGate

SQLGate 是数据库开发和管理的集成解决方案。它的主要目标是简化所有类型的数据库操作。它支持所有流行的数据库,并允许用户直接连接这些数据库。这种集成软件不需要复杂的安装,其所有功能都更简单。对象资源管理器确保快速访问对象面板进行分析和编辑。调试实用程序有助于检测查询中的任何错误,从而有助于正确编写查询。

图片 5。SQLGate 中的数据模型

Navicat 数据建模器

Navicat Data Modeler 是一款流行的数据库设计工具,主要用于构建数据模型(概念模型、逻辑模型和物理模型)。该解决方案适用于数据库结构的可视化设计、逆向和正向工程以及许多其他任务。用户可以从数据库结构创建图表,并可视化模型以查看元素之间的关系。模型的任何部分都可以转换成物理数据库实体。支持所有流行的数据库。

图片 6。Navicat 数据建模器中的数据模型

DBeaver 是数据库开发人员、管理员和分析师的免费工具,兼容所有流行的数据库。基于开源框架,DBeaver 允许开发人员创建和添加程序扩展,增强功能。除其他功能外,该工具还提供了以 ERD 形式查看数据库结构的选项。这些图显示了数据库对象及其用于分析的依赖关系。可以通过拖放元素来编辑布局,但是图只显示了数据库的当前状态。无法保存更改。

图 7。DBeaver 中的数据模型

呃/工作室

ER/Studio 是数据库设计和数据架构的解决方案。它支持大多数数据库平台,受到许多领域的数据专家的青睐。其强大的数据建模功能使其对逻辑和物理数据库设计都很有用。有一些选项,如自动数据库代码生成、数据建模、从逻辑或物理模型生成 XML 模式、将模型与实际数据库进行比较等。

图片 8。ER/Studio 中的数据模型

在其他流行的工具中,值得一提的是以下工具:

  • PowerDesigner
  • Toad 数据建模器
  • TablePlus
  • 瓦伦蒂娜工作室
  • DbSchema
  • 尔 Builder
  • SchemaSpy
  • 数据库设计器
  • 模式抓取器
  • 欧文数据建模器
  • 视觉范式 ERD 工具
  • RapidMiner
  • 地图商务在线
  • 维尔塔贝洛
  • 卢西德哈特
  • SQL 数据库建模器
  • HeidiSQL
  • 阿帕奇火花

在我们的工作中,我们发现db forge Studio for SQL Server是最有用和最方便的。我们将进一步描述如何使用该工具创建数据库图工具,以及如何将这些方法应用于逆向工程。

db forge Studio for SQL Server 中数据库图表的主要工程特性

前面,我们在专门讨论数据库逆向工程的文章(link)中考虑了正向和逆向工程,并介绍了数据库设计中最流行的可视化工具。现在,让我们继续检查这样一个工具的功能和任务性能。为此,我们选择了db forge Studio for SQL Server中的数据库图表工具。

该过程的第一步是为 JobEmplDB 数据库创建一个模式。

转到所需的数据库,并在“数据库”主菜单中选择“数据库图表”:

图片 9。创建数据库图表

按住鼠标左键,将数据库拖动到“数据库图表”区域:

图片 10。数据库图表

现在我们有了 JobEmplDB 数据库的图表。它显示所有对象(表、视图、存储过程)。此外,它还显示了表之间的依赖关系。

每个表显示一个约束块和一个索引块。双击特定的依赖项,它会打开关系编辑器:

图片 11。关系编辑器

双击表格打开表格编辑器:

图片 12。表格编辑器

表格编辑器包括:

  1. 列的内容和定义。
  2. 约束的内容和定义。
  3. 索引的内容和定义。
  4. 统计学的内容和定义。
  5. 触发器的内容和定义。
  6. T-SQL 选项卡上的表定义。

此外,您可以通过转到 Data 选项卡来查看表的内容。

还有一个类似的视图编辑器:

图 13。视图编辑器

视图编辑器包括:

视图的定义。

视图定义的图形编辑器。

索引的列表和定义。

统计的列表和定义。

触发器的列表和定义。

同样,如果转到 Data 选项卡,您可以查看表的内容。

至于存储过程和函数,编辑器也允许更改它们的定义:

图片 14。存储过程/函数的编辑器

所有由编辑者引入数据库模型的更改,数据库都会保存自己。因此,您可以用图形方式修改数据库。它促进了正向和反向工程。

除此之外,“数据库图表”工具还允许:

1)如果有太多单独的项目,则创建可视容器并对对象进行分组:

图片 15。通过可视容器对对象进行分组

2)对特定对象的每个元素或对象本身进行评论。

3)创建附加图形元素,以便更好地理解数据库图表:

图片 16。创建图形元素(注意)

图像 17。制作邮票

4)优化打印模式:

图 18。优化模式以打印它

5)跟踪表之间的逻辑相关性:

图像 19。跟踪表之间的逻辑关系

结论

作为一个既方便又实用的正向和反向工程解决方案的例子,我们选择了 DbForge Studio for SQL Server 中的数据库图表工具。该工具提供了高效工作所需的所有选项。它有许多优点,但最有帮助的一点是,它使得不必针对系统视图编写查询(包括复杂的查询)来获取 SQL Server 数据库中对象的信息。

****参考文献:

1)https://docs . Microsoft . com/en-us/SQL/relational-databases/system-catalog-views/catalog-views-transact-SQL?view=sql-server-ver15

2)https://docs . Microsoft . com/en-us/SQL/relational-databases/system-information-schema-views/system-information-schema-views-transact-SQL?view=sql-server-ver15

3)https://blog . devart . com/SQL-database-design-basics-with-example . html;

https://blog . devart . com/generate-test-data-with-SQL-data-generator . html;

https://blog . devart . com/export-and-import-JSON-data-via-db forge-data-pump-for-SQL-server . html

4)数据库图表

库存 API:2020 年最佳 6 个(免费和付费)

原文:https://towardsdatascience.com/best-free-and-paid-stock-market-apis-for-2020-11adb98e7023?source=collection_archive---------1-----------------------

6 大股票应用编程接口为你的投资策略和分析提供动力

照片来自 Essow Kedelina 在 Pexels 上

“我们搜索历史数据,寻找我们不会随机出现的异常模式。”

——吉姆·西蒙斯,复兴科技的创始人,被认为是有史以来最伟大的量化投资者之一。

在寻找这些模式的过程中,一个标准的 API 会带来很大的不同。

在过去的几十年里,获取数据一直是通过彭博、FactSet、Thompson Reuters、CapIQ 等支付高额费用的网站。两个旗舰产品是彭博终端和路透社 Eikon ,每个座位每年的费用在 20,000 美元到 24,000 美元之间,不包括安装或直播费用。

每一种都有它的优点,但是幸运的是,进入这个领域已经没有必要或者经常甚至是有利的了,一个简单的股票 API 可能是你需要的答案。没有必要在几个千兆字节的数据和一个大的硬件上花钱,在额外的费用后,几乎可以为你买一个新的特斯拉 Model 3。尤其是如果你只需要原始数据来收集你的见解和运行你的测试。

顺便说一句,我希望你不是还在做空特斯拉。图片来自 electrek 和维基百科。

在过去十年中,提供空间的数据爆炸式增长,为那些希望作为业余爱好者或严肃的专业投资者修补空间的人提供了高质量、低成本的解决方案。作为一个既在对冲基金工作过,经营我自己的爱好算法交易,又在数据提供商工作过的人,数据就是我的生命。我已经购买了几乎所有的订阅,并测试了以下各种用例的提供商。如果你不是工程师,那也没关系,他们中的一些人有 excel、google sheets 或其他方法来获取他们的数据,让你的生活更轻松。每一个 API 提供者都有一个商业选项,要么是自助服务,要么是联系他们的支持页面。

以下是最佳整体股市 API 的阵容:

  1. 阿尔法优势
  2. 石墨
  3. Polygon.io
  4. Intrinio
  5. IEX 云
  6. 交易商(和其他经纪公司)

最佳免费股市 API:

  1. 阿尔法优势
  2. IEX 云
  3. 交易商(和其他经纪公司)

底部是荣誉奖,特别说明,这里有一个链接到当前 Reddit 主题,有更多的见解。

1.阿尔法优势

https://www.alphavantage.co/

你看到阿尔法华帝在这么多榜单上名列前茅是有原因的。

当谈到所有人的免费数据时,没有什么能与 Alpha Vantage 相比。凭借最慷慨的免费 tier @ 5 股票 API 调用/分钟& 500 英镑/天,他们允许任何人访问他们的整个数据库,而无需输入任何卡信息。如果你想要额外的使用,他们有一个简单的定价层,你可以为更多的 API 调用付费。

他们的文档清晰易用,电子表格支持可用,因此他们拥有大量的 GitHub 追随者。作为雅虎金融幸存者的最初救星之一,他们在上市几年后不断改进。访问 20 年的历史数据,外汇,加密,部门表现,和技术指标,这个 YC 哈佛校友创业是一个全面的“是”,无论是业余投资者还是严肃的专业人士。

Alpha Vantage 的缺点是他们没有太多可供选择的数据类型。除了行业表现和技术指标,它只是价格数据,然而,如果这是你所需要的,这是去的地方。

最适合:对想要各种价格数据的业余投资者来说很重要。技术性和非技术性的。

2.昔格尼特

https://www.xignite.com/

如果你不在乎价格,并且想尽可能多地调用 API 来打击数据提供商,那么 Xignite 绝对是你应该关注的地方。

有了像 Wealthfront 和 Robinhood 这样的客户,他们已经在社区中声名鹊起。拥有最大的数据包选择之一,(按地区付费),这些家伙没有 API 限制。

与 Intrinio 的支付方案类似,他们通过专注于商业应用市场来区分自己。就技术基础设施而言,他们以可能是最好的股票 API 而自豪。他们有一个 7 天的有限试验计划,这并没有真正做到公正。他们使用数据即服务模式,从 AWS 云中获取数据。

另一家具有强大人际互动的公司,他们有一个销售团队,确保客户感到受到照顾和支持。

这些家伙的缺点是价格。在 Xignite 的平台上,Intrinio 的类似软件包的价格可能是它的五倍多。

最适合:严肃的投资者,预算不是问题,或者你不想处理数据库。无论是技术性的还是非技术性的。

3.多边形. io

https://polygon.io/

多边形是如果你把西格尼特和英特里尼奥斯结合在一起,并把它们留在美国境内会发生的事情。

这是我在上次审查中忽略的一个提供商,这是我不应该做的。他们还拥有无限的 API 请求,并有 3 个简单的价格层,货币+加密,美国股票和企业。我认为它们类似于 Intrinio,但更多地关注美国,这使得它们对我们来说简单而容易。因此,他们的定价可以便宜一点。

为大型网站如 Robinhood 和羊驼提供支持,他们专注于自己的专业领域,仅美国、加密和外汇市场,并在那里做得很好。一进入这个网站,你就会看到很多关于他们的流媒体和网络套接字的文档,这两个都是很棒的产品。

最佳选择:专注于美国的严肃投资者。技术用户优先。

4.Intrinio

【https://intrinio.com/

Intrinio 是一个不同于前两个版本的怪物。

尽管 Alpha Vantage 可能是大众化免费数据的领导者,Intrinio 可能是各种替代数据的女王。Intrinio 平台最吸引人的地方之一是其庞大的资料库,其中包含了极其具体和另类的数据,有超过 300 个提要!

他们有大量自己开发的 SDK,当你进入网站时,在右下角有一个聊天框。一进入网站,就能看到一个对真人的快速、可用的客户支持,并与之聊天。在他们的免费试用中有一点限制,在你决定选择一个之前,他们允许你对每个软件包有一个好的感觉。

与上述两者的费率限制相反,Intrinio 是按套餐付费的,这意味着你要为你想要的数据付费。从爱尔兰证券交易所的价格到美国高级分析包的一切都非常具体,所以你可以得到你想要的东西。

每个套餐都有自己的使用条款和费率限制,因此在订购套餐之前,您必须检查这些条款。他们的用户界面上还有学生、创业、军事和商业价格。

对于那些只想获得基本价格数据的人来说,他们的平台可能是压倒性的,或者比你想要的更多。一旦你开始尝试获取一些不同地区的数据,价格就会开始上涨。他们的自由层很弱,经常与 Quandl 竞争 alt。数据客户端。

最适合:认真的投资者,他们重视支持,想要替代数据。无论是技术性的还是非技术性的。

5.IEX 云

https://iexcloud.io/

我是《闪光男孩》这本书的忠实粉丝,喜欢 IEX 正在寻找的东西,他们的衍生产品 IEX 云也做得很好……但也许没有他们的交易所好。

有了这个条目,我们回到了一个真正免费的数据提供商,这是另一个你现在可以免费打电话的平台。

IEX 云正在不断更新,他们甚至增加了一些有前途的饲料保费数据功能。当涉及到来自 IEX 交易所的任何类型的数据时,他们都是准确无误的。对这些人来说,美国的价格不是问题。他们在试图增加其他交易所数据时会遇到一些问题,有时并不像人们希望的那样准确。

该集团拥有最独特的支付结构,他们每月在按消息付费平台上工作。所以每个月你都有一定数量的“消息”。消息是他们在文档中描述的单元。每个 API 调用都返回一个“数据权重属性,它们告诉您已经使用了多少条消息来进行该调用。邮件的大小变化很大,由你来决定这个月要使用多少邮件。

尽管有不同类型的数据,并且是最便宜的替代方案之一,IEX 云是一个稳定的、不断进步的平台,并且在我看来是全国最好的交易所之一,其使命是保持市场公平。

最适合:对业余投资者严肃的投资者,主要集中在美国。技术优先。

6.交易商(和其他经纪公司)

https://developer.tradier.com/

有一些很棒的平台将获取市场数据与他们的交易平台结合起来, Tradier 就是其中之一。

他们背后有一个了不起的社区,一个简单的注册他们的开发者平台,你可以立即开始获得我们延迟的数据(15 分钟)。这是大多数经纪公司拥有类似功能的标准,但如果您升级到他们的完全经纪账户,他们也可以选择获得实时和国际数据。

经纪账户是免费的,但他们有一些闲置费用,所以如果你想要这些数据,你必须要么在他们的平台上交易,要么承担闲置费用(根据你的使用情况,可能会更便宜)

对于廉价的纯价格数据解决方案,Alpha Vantage 或 IEX 云最有可能是更简单的集成,但也许从同一个平台获得一切(如果他们有足够的数据,没有速率限制),这可能是一个可靠的选择。

最适合:想要交易和使用来自同一个平台的数据的严肃或业余投资者。最好是技术类的。

荣誉奖

https://www.quandl.com/

https://www.tenquant.io/

Quandl:Intrinio 的类似产品和替代数据,如果 Intrinio 没有你想要的,就去这里。他们专注于出售 alt 数据。

Tenquant :可能是最好的后起之秀,一个仍在建设中的基本面聚焦项目。

拥有市场数据的券商:

  1. 羊驼 —仅限美国,但你可以开立纸质账户并获取数据,使用 live 账户可以从 Polygon 获取数据。你可以进行纸上交易并获取数据,而不必在他们那里开立经纪账户,然后在你准备好的时候升级。
  2. 互动经纪人 —另一个数据和量化投资平台,他们有多个教程帮助你入门。这是另一家在网上有大量业务的券商。
  3. ETRADE , Ally , Thinkorswim …许多主要的大公司也有市场数据 API。费用和费率限制各不相同。

跟进想法

社区很幸运在数据领域有这么多的参与者,特别是在 2012 年 Google Finance 股票 API 和 2017 年 Yahoo Finance 股票 API 停止使用之后。到目前为止,这两家公司似乎都没有文档或计划回归,而且有很多猜测关于他们为什么首先关闭。

需要警惕的一个关键问题是,如果一个股票 API 提供商提供特定的交易所数据,而你不必与该特定的交易所签署协议,这通常是不合法的。一些交易所对谁以及如何消化他们的数据非常严格,如果你使用他们的数据,通常你必须以某种方式向他们付费。有时候,这些可能是非法出售数据的供应商,那些证券交易所会跟踪他们,以确保他们不会持续很久。

那么你最喜欢哪些提供商呢?哪些数据提供商最适合哪些经纪人?请在下面的评论区告诉我!

你可以继续阅读我剩下的文章,或者看看我的最新文章!

这篇文章中的所有观点都是我个人的,并不代表我现在和以前雇主的观点。

可以在TwitterMedium上关注我,或者在GitHub上找我。**

最后更新日期:2020 年 5 月 4 日

编程、软件工程和数据科学的最佳免费资源

原文:https://towardsdatascience.com/best-free-courses-for-computer-science-software-engineering-and-data-science-50cd88cafd74?source=collection_archive---------35-----------------------

Max Kukurudziak 在 Unsplash 上拍摄的照片

麻省理工、哈佛和斯坦福等顶尖大学的免费课程

你知道你可以免费选修麻省理工学院、斯坦福大学和哈佛大学的课程吗?他们的许多本科和研究生课程材料可供全球学生免费使用。我将在这里谈论一些资源。我知道在世界各地有很多非常聪明和有天赋的学生,他们不能去所有那些伟大的学校。但是他们有学习的潜力。在科技行业,即使没有科技学位,你也可以在谷歌找到工作。只有知识是重要的。如果你有兴趣投入时间和精力,即使你不能去大学校,你也可以成为科技巨头。这里是资源。

麻省理工学院(Massachu-setts Institute of Technology)

你会惊讶地发现,你几乎可以免费获得所有本科和研究生计算机科学课程的教材。您会发现计算机科学所有领域的课程,包括:

计算机科学和电子工程导论,

工程问题解决,

动态编程,软件构造,

数学编程,

数据科学,

人工智能,

机器人技术,

计算机科学的数学,

软件开发和网络应用,

还有更多。

这是他们免费课程页面的链接。

[## 按主题查找课程|麻省理工学院开放式课程|免费在线课程材料

探索开放式课程对麻省理工学院本科生课程的覆盖。请参见先决条件…

ocw.mit.edu](https://ocw.mit.edu/courses/find-by-topic/#cat=engineering&subcat=computerscience)

edx

如果你想在任何技术领域和其他领域在线学习,这是一块巨大的金子。我只关注技术学习。可以免费上大牌大学的优质课程。

想学什么就学什么:

计算机科学,

软件工程,

网页开发,

数学,

统计数据,

数据分析和可视化,

机器人技术,

人工智能,

数据科学,

机器学习,

或者任何其他工程。

[## edX |哈佛大学、麻省理工学院等提供的免费在线课程

访问来自 140 个机构的 2500 多门在线课程。从今天开始!找课程你想学什么?滚动转盘…

www.edx.org](https://www.edx.org/)

在搜索栏中搜索您感兴趣的区域。你可以旁听课程或付费获得证书。如果你旁听课程,你将能够学习,但不会获得证书。如果你从目录页进入课程,很多课程会说每月一个金额或者免费审计。

要找到审计选项,请单击“参加课程”按钮。在此页面上,有一个审计选项。

Coursera

另一个巨大的资源。有一个很大的课程池,来自所有知名大学和知名教授。我在 edx 部分提到的领域你几乎都能学到。你只是有选择。edx 和 Coursera 都试试。选择最适合你的。

[## Coursera |通过顶级机构的在线课程培养技能

免费加入 Coursera,在线学习。通过耶鲁、密歇根、斯坦福等顶尖大学的课程培养技能…

www.coursera.org](https://www.coursera.org/)

在 Coursera 中,你也可以付费获得一个证书,或者只是为了学习而旁听课程。但是在这里找到审计选项有点棘手。我在这里解释。

在课程描述页面,您会看到“注册”选项。但不要从那里注册。它将只提供 7 天的免费服务。向下滚动到页面底部。您将找到另一个“注册”选项。点击那个。将弹出一个窗口。在该窗口的底部,您会看到一个小的审计选项。那是你正在寻找的。

Hackr.io

你会发现任何流行的编程语言都有很好的免费课程,例如:

python,

javascript,

露比,

C++,

PHP,

Java 等等。

所有趋势框架,例如:

Node.js,

棱角分明,

反应过来,

姜戈,

拉勒维尔,

离子和更多

SQL,没有 SQL 数据库,等等。

[## 找到最好的在线编程课程和教程- Hackr.io

谷歌搜索给你看了几百个编程课程/教程,但是 Hackr.io 告诉你哪一个是最好的。查找…

hackr.io](https://hackr.io/)

代码学院

代码学院也有一套非常好的课程。对于新手来说特别好。它有一个内置的 IDE,你可以在那里写你的代码和反馈。所以一开始你甚至不需要设置你自己的 IDE。课程是免费的。但你可以每月花 20 美元订阅,从他们的导师那里获得帮助。

[## 代码学院

有了新的 Codecademy Pro 学生会员资格,符合条件的大学生可以以超过…

www.codecademy.com](https://www.codecademy.com/catalog)

哈佛大学

哈佛也免费提供很多课程。这是课程目录:

[## 在线课程

浏览哈佛大学最新的在线课程,包括“研究差异:方法和模型”和…

online-learning.harvard.edu](https://online-learning.harvard.edu/catalog)

在这个页面上,你会发现一些课程被标记为免费,还有一些其他的付费课程。你可以审计免费课程,用同样的方式,我在上面的 edx 部分解释过。所有哈佛免费课程在 edx 都有。

更多资源

还有很多其他的免费资源。我在这里举几个例子。

乌达城

Udacity 有很多付费的纳米学位。他们也有一些不错的免费课程。那些免费课程不是专家级课程。他们通常开设初级课程。这是他们的课程目录。在搜索栏中搜索免费课程。

[## 探索我们的计划和课程| Udacity 目录

获取最新的技术技能,推动您的职业发展。浏览人工智能、自动化系统和机器人、数据等领域的纳米学位课程

www.udacity.com](https://www.udacity.com/courses/all)

Udemy

Udemy 也有很多免费课程。但不一定是初级水平。有时你可能会找到免费的好课程。他们全年都在打折。

[## 在线课程-按照您的时间表学习任何内容

Udemy 是一个在线学习和教学市场,拥有超过 130,000 门课程和 3,500 万名学生。学习…

www.udemy.com](https://www.udemy.com/)

结论

我相信,在看到所有免费资源后,你会同意现在没有必要付费学习编程或计算机科学。唯一的问题是,在家独自学习很难集中注意力和保持动力。如果你能找到一个愿意和你一起学习的朋友,那是最好的。否则,就接受挑战,勇往直前!

更多阅读:

[## 想在 12 周内成为数据科学家?

花钱前再想一想

towardsdatascience.com](/want-to-become-a-data-scientist-in-12-weeks-3926d8eacee2) [## 成为数据科学家的一系列免费课程

链接到知名大学的高质量课程,可以免费学习。循序渐进地学习这些课程,以…

towardsdatascience.com](/series-of-free-courses-to-become-a-data-scientist-3cb9fd591739) [## 练习数据科学技能和制作优秀投资组合所需的所有数据集

一些有趣的数据集提升你的技能和投资组合

towardsdatascience.com](/all-the-datasets-you-need-to-practice-data-science-skills-and-make-a-great-portfolio-857a348883b5) [## 置信区间的完整指南,以及 Python 中的示例

对统计学中一个非常流行的参数——置信区间及其计算的深入理解

towardsdatascience.com](/a-complete-guide-to-confidence-interval-and-examples-in-python-ff417c5cb593) [## 数据科学家使用 Python 进行假设检验的完整指南

用样本研究问题、解决步骤和完整代码清楚地解释

towardsdatascience.com](/a-complete-guide-to-hypothesis-testing-for-data-scientists-using-python-69f670e6779e)

数据科学家加入的最佳团体

原文:https://towardsdatascience.com/best-groups-to-join-for-data-scientists-97a63d585af8?source=collection_archive---------13-----------------------

照片由杜凡在 Unsplash 上拍摄

基于内容、互动和适度评分的评级

“有良伴相伴,路漫漫其修远兮。”——土耳其谚语。

我们谨慎地选择我们的朋友、同事和熟人,因为我们知道在一个好的公司里有多重要,社交网络也不例外。

我们加入脸书和 LinkedIn 上的群组;Twitter 和 Instagram 上的页面,了解数据科学的最新发展,提出与我们工作相关的问题,并建立联系。

我们分析了这些社会群体的质量,特别是对数据科学家来说,有三个参数。

1。互动:群体成员在群体中的活跃程度如何?

2。内容:这些群里交流的是什么样的内容?

3。适度:集团是否没有潜在的垃圾邮件和误导性广告和促销?

数据集:数据收集自脸书和 LinkedIn 上每个群组的最后 50 篇帖子。所有在脸书和 LinkedIn 上拥有超过 5 万名成员的群体都被考虑在内。该数据*是从 2020 年 8 月 24 日至 2020 年 8 月 28 日收集的。数据存放在https://www . ka ggle . com/shrasthisinghal/data-science-social-groups-survey

调查中的群体列表:

数据科学中心

数据挖掘、统计学、大数据、数据可视化、人工智能、机器学习和数据科学

数据科学— R & Python

数据科学世界

数据科学

机器学习和数据科学

大数据▶️数据科学|机器学习|深度学习|人工智能

大数据、机器学习、数据科学、人工智能、物联网和区块链

开始数据科学,分析,机器学习,数据挖掘,R,Python

数据科学和预测分析新闻

数据科学初学者

数据仓库—大数据— Hadoop —云—数据科学— ETL Python

数据科学和机器学习

KDnuggets AI,大数据,数据科学,机器学习组

使用 Python 的数据科学

按平均分降序排列的组别

数据科学组排名

完成调查结果:

互动分数条形图

内容分数条形图

适度分数条形图

平均分数条形图

见解:

1.脸书上的数据科学小组比 LinkedIn 上的小组表现更好。

2.没有推广内容的小组在互动得分上表现不佳。

3.越大越好并不总是正确的。一些成员数量最多的组实际上是成员之间的交互可以忽略不计的死组。

4.这些群体中的大多数人是为了推广内容而不是其他活动。

5.数据科学世界、机器学习和数据科学、Python 数据科学和机器学习等团体在团体中主要有推广内容;尽管如此,成员之间的互动和对内容的欣赏在组成员中是很高的。建议这些群组推广与数据科学相关的内容、公司和产品。

6.像数据科学研究与 Python、数据科学和数据科学与 Python 这样的小组适合询问数据科学相关的问题、职业指导和工作职位。

互动评分:

脸书新闻主管亚当·莫瑞西说,评论往往比赞更有意义,而且“对接收者来说,较长的评论往往比较短的评论更有意义。”

没有定义的方法来计算喜欢、短评论和长评论之间的关系。因此,我们武断地将它理解为以下社交媒体领导者的观点。

互动得分将是以下比例的喜欢、短消息和长消息的加权平均值。

喜欢- 0.5

短评- 1.5

长注释- 3

内容评分:

技术小组应该是你看到与技术相关的内容的地方。我们对一个群体中受欢迎的内容类型进行了评分。

数据科学迷因:0.5

数据科学资源:1

职业讨论:1

Bug 讨论:2

实时会话:2.5

工作机会:1

面试讨论:2

数据科学问题:2

通用数据科学岗:1

审核分数:

宣传 YouTube 内容:-1

宣传资料:-1

促销网站:-1

垃圾邮件:-2

平均评分:

互动比内容更重要,因为它告诉我们群体中人们的参与度。即使内容是一般的、不合标准的或宣传性的,它仍然服务于某些目的,但是如果没有群体成员的参与,这个群体就死了。

平均分:(3*互动分)+(2 *内容分)+(1 *适度分)

请随意探索数据集,下载以收集更多见解,并就评分、数据收集或见解发表评论。

在那之前,祝你学习愉快。先谢了

Python 中地理空间数据可视化的最佳库

原文:https://towardsdatascience.com/best-libraries-for-geospatial-data-visualisation-in-python-d23834173b35?source=collection_archive---------7-----------------------

空间数据可视化的 10 大 Python 库

安德里亚娜·博济奇在 Unsplash 上的照片

地理空间数据无处不在,随着新冠肺炎可视化的出现,我们看到了使用地理空间数据可视化工具的高峰。对于 python 用户,我们有几个强大的空间数据可视化库。在本文中,我将分享一些 Python 生态系统中地理空间数据可视化的最佳包。

我们涵盖了 Python 中 6 大地理空间数据可视化库,以及它们提供的一些示例功能。

1.PyViz/HoloViz(Geoviews、Datashader、HvPlot)

Holoviz 维护的库拥有你可能需要的所有数据可视化,包括仪表板和交互式可视化。特别是 Geoviews,其专用的地理空间数据可视化库,提供了易于使用和方便的地理空间数据。

G eoViews 是一个 Python 库,它使得探索和可视化地理、气象和海洋数据集变得容易,例如那些用于天气、气候和遥感研究的数据集。

Geoviews API 提供了直观的界面和熟悉的语法。使用 Geoviews 绘制地理空间数据非常简单,并且提供了交互性。让我们看一个使用 Geopandas 数据集的例子。

**import** **geoviews** **as** **gv**
**imporg geopandas as gpd**gv.Polygons(gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')), vdims=['pop_est', ('name', 'Country')]).opts(
    tools=['hover'], width=600, projection=crs.Robinson()
)

世界国家图-地理视图

如果你想开始,这里有 Geoviews 的初学者指南教程。

[## 使用 Python 中的 Geoviews 进行交互式地理空间数据可视化

如何开始使用 Geoviews 的初学者指南。

towardsdatascience.com](/interactive-geospatial-data-visualization-with-geoviews-in-python-7d5335c8efd1)

此外,PyViz 生态系统提供了其他可以处理地理空间数据的库,包括 hvPlot,它可以将您的数据可视化提高到一个新的水平。

HvPlot 允许用户使用不同的数据类型,并可以扩展其他 Python 库的使用,包括 Pandas、Geopadnas、Dask 和 Rapids。

Datashader 也是处理大数据的地理空间数据科学家的另一个必备数据可视化库。它将该过程分为多个步骤,并行运行,以快速创建大型数据集的可视化。

最后, Panel ,Python 的高级应用和仪表板解决方案,提供了一个易于使用的界面,可以使用 Jupyter 笔记本创建交互式 web 应用和仪表板。

2.薄层

Folium 广泛用于地理空间数据可视化。它建立在 fleed . js 的基础上,通过其强大的插件可以覆盖 Python 中的大多数制图需求。

follow 构建在 Python 生态系统的数据优势和 fleet . js 库的映射优势之上。在 Python 中操作您的数据,然后通过 leav 在活页地图中可视化它。

leav 入门很简单,可以简单的调用 leav。地图立即可视化底图。然后,您可以添加图层,以便在 follow 中提供的交互式底图上显示您的数据。

**import** **folium**m = folium.Map(location=[45.5236, -122.6750])
m

下面是一些使用 Here 库功能和插件的例子。

聚类标记(左)—带叶的聚类图(右)

3.巧妙的表达

Plotly 及其高级 API 库 Plotly Express 具有广泛的地理空间数据可视化功能。尽管缺少对 Geopandas 地理数据框架的本地支持,但该库拥有许多制图类型和易于使用的 API。随着 2019 年 Plotly Express 的推出,使用 Plotly 创建地理空间可视化变得更加容易。

以这个动画 Choropleth 地图为例,Plotly Express 只用一行代码就完成了。与其他库相比,实现这一点可能需要您编写大量代码,并破解不同的解决方案。

通过 Dash ,一个在数据科学中广泛使用和下载最多的 web 应用,Plotly 提供了一个部署 web 应用的完整解决方案。借助 Plotly Express 直观 API 和 Dash Plotly,您可以将地理空间网络应用程序和可视化提升到一个新的水平。

Plotly 地理空间数据可视化 Galery 的例子。

4.开普勒格尔

kepler.gl for Jupyter 是一款优秀的大地理空间数据可视化工具。它结合了世界一流的可视化工具、易于使用的用户界面(UI)以及 python 和 Jupyter 笔记本的灵活性。

只需几行代码和 Jupyter 笔记本中易于使用的界面,您就可以使用 Kepler GL for Jupyter Python 库创建美观的地理空间数据可视化。下面的 GIF 展示了使用 Python 中的 Kepler GL 进行 3D 映射的一些可能性。

kepler.gl 是一个基于网络的大型地理空间数据集可视化工具,建立在 T2 deck . GL 的基础上。优步在 2018 年将其开源,其功能令人印象深刻。您可以轻松地拖放您的数据集,并在 web 上立即调整它,以便轻松地可视化大规模地理空间数据集。

开普勒 GL 网络界面

开普勒 GL 的 web 界面非常优秀。然而,如果你喜欢使用 Jupyter 笔记本,同样的功能现在也可以在 Jupyter 笔记本上使用。开始使用 Kepler GL for Jupyter notebook 很容易。您可以咨询此资源,让您立即投入使用。

[## 开普勒。GL & Jupyter 笔记本:优步开源开普勒的地理空间数据可视化。标距长度

在 Jupyter 笔记本中绘制地理空间数据&轻松地与开普勒的用户界面交互以调整可视化。

towardsdatascience.com](/kepler-gl-jupyter-notebooks-geospatial-data-visualization-with-ubers-opensource-kepler-gl-b1c2423d066f)

5.IpyLeaflet

IpyLeaflet 是另一个令人印象深刻的地理空间数据可视化工具,它建立在 Jupyter Widgets 和传单可视化库之上。因此,如果你喜欢使用叶库,你应该感觉在正确的地方使用 IpyLeaflet 和 Jupyter 笔记本。

IpyLeaflet 中的交互功能是无与伦比的,因为小部件支持双向交互。因此,您的地图不仅是交互式的,而且可以捕捉用户输入来触发新的计算。

例如,分割贴图控件可用于比较不同的 IpyLeaflet 层。

6.地质公园

Geopandas 示例库

如果您碰巧用 Python 处理或争论地理空间数据,Geopandas 无需介绍。它是研究地理空间数据科学的主力,在处理地理空间数据方面做了许多繁重的工作。

我总是用 Geopandas 来结束静态地图的可视化,因为用 Geopandas 和它的。绘图界面。主要的缺点是它只提供静态地图。

然而,最近针对底图的和针对交互式 matplotlib 图的IPYMPL的改进和补充使得使用 Geopandas 创建交互式地图变得更加简单。

使用 Ipympl 的交互式 Geopandas 地图

上面的 GIF 展示了 Geopandas 图与 Ipympl 的交互性。如果你想开始使用这种交互性,这是一篇初学者指南博文。

* [## 如何在 Jupyter 环境下生成交互式 Matplotlib 图

使用所有使用 Matplotlib 的 Python 库创建交互式绘图/地图

towardsdatascience.com](/how-to-produce-interactive-matplotlib-plots-in-jupyter-environment-1e4329d71651)*

结论

本文分享了 Python 生态系统中一些最好的地理空间数据可视化工具。我们已经介绍了 Python 中 6 大地理空间可视化库。如果你认为我们错过了这里的一些图书馆,请告诉我。

巴西弗洛里亚诺波利斯(北岸)新企业的最佳地点:Foursquare 数据分析

原文:https://towardsdatascience.com/best-places-for-new-businesses-in-florianópolis-brazil-north-shore-a-foursquare-data-analysis-1a6034024011?source=collection_archive---------54-----------------------

数据显示了哪些机会?

简介

背景

巴西因里约热内卢或圣保罗而闻名。但是巴西最南部的一个州在一个岛上有一个奇特的首都。或者说大部分资本都在这个岛上。我说的是弗洛里亚诺波利斯。

与田园诗般的岛屿(圆形)不同,“圣凯瑟琳岛”实际上…很长。北岸和南岸相距 54 公里(约 33 英里)。

美国宇航局—【https://zulu.ssc.nasa.gov/mrsid/】T4,公共领域,https://commons.wikimedia.org/w/index.php?curid=1214933

这个岛与大陆的连接很近,只有一点有桥,而且几乎在岛的中心。

岛的中心是一个大城市,拥有一个城市所拥有的一切:大型建筑、商店、交通。但是有些地方非常平静,可以在美丽的海滩上享受“悠闲”的生活。

在夏天,许多游客去享受海滩,把这个平静的地方变成了一个拥挤快乐的夏日空间。但要在北岸建立业务,这一年的运动意味着一场噩梦。有时候,夏天开放并不意味着冬天也开放。

住在北岸的人抱怨超市或面包店的基本需求选择少。远离岛中心的闹市区,这是一个大问题。

挑战

因此,我决定分析 Foursquare 的数据,以发现一个新的企业可以在什么地方满足人们的需求。这个想法是对商业和人类的新的可能性进行一个伟大的数据驱动的分析。

数据和我将如何解决问题

我将从 Jurerê、Canasvieiras、Cachoeira do Bom Jesus 和 Foursquare 的 Ponta das 卡纳斯的邻居那里收集场地数据。我将根据类型进行分类,绘制一张地图来了解不同的需求。

我将根据种类和邻近程度对这些场所进行分类,以总结出哪些业务已经占据了这些邻居的很大一部分空间。

我还会对邻居进行聚类,以识别那些没有统一数量的不同场所。

最后,我会列出每个邻居不同的地点和场所类别,以此来帮助那些想开始新事业的人。

谁会对这个项目感兴趣?

想在巴西 Florianópolis 北岸开一家新企业的人。

居住在 Florianópolis 北岸并希望了解附近更多商业选择的人。

方法论

选择的是定量方法。

我是如何得到数据的

使用一些流行的 Python 库,我开始定义要分析的邻域:Jurerê Leste、Jurerê Oeste、Canasvieiras、Cachoeira do Bom Jesus 和 Ponta das 卡纳斯。

我得到了地理编码,其功能可以连接到 ArcGIS 服务。有了这些信息,我建立了一个数据框架。为了了解我的地理编码是否正确,我测试了绘制地图。

作者图片——叶子情节

确定一切正常后,我继续使用 Foursquare API 收集 Foursquare 数据。我将 JSON 中的数据标准化,使用 Pandas 函数来获取所展示场馆的类别类型,并根据需要进行各种调整,以获得包含街区、场馆名称、类别以及地理位置的数据框架。

第一次分析表明需要进行调整。因此,我得到了列类别的独特值,去掉了一些与研究目的不相关的值,如“海滩”、“度假村”和“住宅建筑”。

绘制地图,这是新的面貌:

作者图片—叶子图

我对分类不满意。即使是描述商业,他们中的一些人显然过于详细,这使得人们很难想象街区的必需品。所以我创建了“类”,一种理解类别的方式,一个“宏观”的类别。它们是:"酒吧/餐厅"、"药房"、"娱乐"、"健身"、"面包店"、"夜生活"、"商店"、"咖啡馆/小吃"、"市场"、"宠物"和"彩票"。

分析

我从不同种类的数据框架中获取这些数据来绘制和理解信息。我决定绘制一个水平条形图,以直观显示每个社区的主要业务种类。

作者图片

对于这种数据帧格式:

作者图片

在这一点上,我注意到一件重要的事情:不是所有的社区都有所有类别的业务。我需要在数据框中添加一些代表“0”业务类别的行。

我创建了一个函数,它扫描每个街区的所有类别,并给出每个街区缺少哪些类别的信息。

在每个社区数据框中添加了所有的“0”类别后,我开始靠近社区看。

我开始为每个街区绘制新的图表,与最近的邻居进行比较。

Jurerê Leste

作者图片

Jurerê Leste 被称为“传统的 Jurerê”,这里有很多房子,是一个放松的地方。下一个街区 Jurerê Oeste 以“时尚之地”闻名,到处都是豪宅和一些夜总会。但作为一个旅游目的地,餐馆是一种趋势。

Jurerê Oeste

作者图片

好像一样?但不是!Jurerê Oeste,时尚而富有的邻居,显示几乎相同数量的餐馆(再次,旅游目的地!),但是可以看到丰富的夜生活和一些店铺。几乎相同,但不同的场地显示出明显的偏差。

比较 Jurerê Leste 和 Jurerê Oeste

作者图片

并排比较两个街区,你可以理解每种偏见(魅力或住房)的影响,也可以理解旅游目的地理念的影响。对于几乎相同数量的餐馆和咖啡馆,我们还可以看到一些所需的服务,这些服务可以在一个地方得到验证,但不能在另一个地方得到验证。先前完成的分析显示了对洗衣和抽奖的特殊需求。即使 Jurerê Leste 缺乏市场或药店,住在一个社区的人也很自然地要走几公里才能看到他们的需求得到满足。

卡纳斯维尔拉斯

作者图片

Canasvieiras 是最受欢迎的旅游目的地之一,尤其是对阿根廷和乌拉圭游客而言。这个地方,显然有更多的选择,显示出同样的模式:很多餐馆,但缺乏其他选择。对这两个地方来说,靠近卡舒埃拉多邦杰斯是一个很好的补充。

卡舒埃拉多邦耶稣

作者图片

Cachoeira do Bom Jesus 以两条有生意和很多房子的街道而闻名。正如我们可以想象的那样,这反映了不同业务的缺乏。同样,餐馆是这个街区的“明星”。一个拥有 2000 多名工人的科技园(“智人园”)也影响到餐馆的人群:因为每个人都需要一个吃午饭的地方,所以商人决定开餐馆是很自然的。

比较 Canasvieiras 和 Cachoeira do Bom Jesus

作者图片

Canasvieiras 是一个更“中心”的社区,显示了更多的选择。下一个街区 Cachoeira do Bom Jesus 的选择较少,但与 Jurerê Leste-Jurerê Oeste 相比,可以利用一些邻近的优势。顺便说一句,邻近是两个街区互补的因素之一:他们之间只共享三种场地。

蓬塔达斯卡纳斯

作者图片

蓬塔达斯卡纳斯只展示了一种场所:健身。作为 Cachoeira do Bom Jesus 附近的延续,蓬塔达斯卡纳斯没有很大一部分的领土,这可以解释为什么缺乏场地。

比较蓬塔达斯卡纳斯和卡舒埃拉多邦耶稣

作者图片

无论是住宅区还是小社区,蓬塔达斯卡纳斯和卡舒埃拉多邦杰斯都缺乏商业。它可以显示出对 Canasvieiras 的依赖。

比较所有邻居

作者图片

即使几乎所有的邻居都有去餐馆的明显倾向,也可以说在很短的距离内很难找到其他一些服务。其中一些似乎在所有领域都是独一无二的。这表明了新业务的决定性必要性,尤其是对那些实际生活在这些社区的人来说。

结论

关于 Florianópolis-North Shore 的商机和需求

根据分析的数据,我们可以得出结论:

蓬塔达斯卡纳斯,即使是一个非常小的社区,也需要更多的企业。我们只能找到一个健身房。市场、杂货店、药店和面包店等基本需求在这个社区可能是一个不错的选择。

受够了餐馆和酒吧!我们知道,在一个旅游目的地(附近也有大型科技公司)的餐馆是一个显而易见的选择——但那里已经饱和了。

附近的面包店很多。但由于卡舒埃拉邦耶稣只有一个,蓬塔达斯卡纳斯没有,这可能是一个在蓬塔达斯卡纳斯开面包店的好机会。住在卡舒埃拉多邦耶稣的人也可以使用它。

“咖啡馆/小吃”类别在 Jurerê(东帝汶和东省)和 Canasvieiras 很常见。即使知道从 Canasvieiras 到 Cachoeira do Bom Jesus 和 Ponta das 卡纳斯的距离并不大,这些街区的咖啡店也可以代表一个有趣的商业项目。

娱乐的选择很少,特别是如果你正在考虑一个家庭,但美丽的海滩是那些社区的大明星,所以投资这种场所可能有风险。

Jurerê Leste 和 Oeste 以及 Ponta das 卡纳斯都有健身房和健身中心。Canasvieiras 和 Cachoeira do Bom Jesus 是为他们的邻居服务的,但 Canasvieiras“中心”部分的健身中心可能是一个很好的搭配!

正如我们已经说过的,在巴西,彩票不仅仅代表赌博。他对社区的意义在于,可以很容易地在彩票领域进行一些银行活动,这表明它们非常有用。由于我们在 Canasvieiras 只有一次抽奖,这可能是最好的商业机会之一。

Jurerê Leste 和 Jurerê Oeste 地区只有两家属于“市场”类别的企业。它大约有 2,58 公里(27,750,257,61 英尺),只有两个市场。这是个好机会。

夜总会和休闲场所在冬季关闭。我们只有两个选择:一个在 Canasvieiras,一个在 Jurerê Oeste。由于全年开展这项业务风险很大,因此需要更多的数据来了解这是否是一个好机会。

宠物店也很少:一家在 Cachoeira do Bom Jesus,另一家在 Jurerê Leste,我们可以想象这个“中心点”可能是满足需求的好地方。但这仍然是一个进行更多研究和规划新业务的好机会。

药店是每个人有朝一日都需要涉足的行业之一。在巴西,只有药店可以卖药。因此,只有两个(一个在 Canasvieiras,一个在 Jurerê Leste)表明缺乏。这可能是一个很好的商机——甚至需要药剂师来开一家。

商店可以满足每个人的需求,让生活在 Florianópolis 北岸的人生活更轻松。但我们只能找到三个(两个在 Canasvieiras,一个在 Jurerê Oeste)。仅仅这个话题就可以成为另一个大分析的来源,但它显示了对新商店的需求以及巨大的商机。

关于研究

方法论领域的选择是正确的。即使分析不深刻,这些数据也能帮助产生新业务的想法。但是 Foursquare 的数据似乎并不可信。分析数据,很清楚信息准确性的不确定性。住在这些社区中的一个,我能记得比 Foursquare 能给我更多的生意。看看 Foursquare 的数据并不是一个坏主意(因为它们是免费的)。如果我被雇佣来做这个分析,我会尝试其他 API 和资源来给我更多的信息。

对笔记本感兴趣?

进入我的 GitHub !

Spark SQL 中缓存的最佳实践

原文:https://towardsdatascience.com/best-practices-for-caching-in-spark-sql-b22fb0f02d34?source=collection_archive---------0-----------------------

深入探究 Spark 中的数据持久性。

在 Spark 中,SQL 缓存是重用某些计算的常用技术。它有可能加快使用相同数据的其他查询的速度,但是如果我们想要获得良好的性能,有一些注意事项需要记住。在本文中,我们将深入了解缓存的内部工作原理,并尝试揭开 Spark 与数据持久性相关的行为的神秘面纱。

使用数据框架 API

在 DataFrame API 中,有两个函数可以用来缓存数据帧, cache()persist() :

df.cache() # see in PySpark docs [here](https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame.cache)df.persist() # see in PySpark docs [here](https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame.persist)

它们几乎是等价的,区别在于持久化可以带一个可选参数存储级别,通过它我们可以指定数据将被持久化到哪里。两个函数的 storageLevel 的默认值是 MEMORY_AND_DISK ,这意味着如果内存中有空间,数据将存储在内存中,否则,数据将存储在磁盘上。在这里你可以看到其他可能的存储级别的(PySpark)文档。

缓存是一种惰性转换,因此在调用该函数之后,数据不会发生任何变化,但是查询计划会由缓存管理器通过添加一个新的操作符inmemorrelation来更新。因此,这只是一些信息,稍后在调用某个操作时,将在查询执行期间使用这些信息。Spark 将在缓存层中查找数据,如果数据可用,就从那里读取数据。如果它在缓存层找不到数据(第一次运行查询时肯定会发生这种情况),它将负责将数据获取到缓存层,并在之后立即使用它。

缓存管理器

缓存管理器负责根据查询计划跟踪哪些计算已经被缓存。当缓存函数被调用时,缓存管理器被直接调用,它取出调用缓存函数的数据帧的分析逻辑计划,并将该计划存储在名为 cachedData 的索引序列中。

缓存管理器的阶段是逻辑规划的一部分,它发生在分析器之后、优化器之前:

当您运行带有操作的查询时,查询计划将被处理和转换。在缓存管理器的步骤中(就在优化器之前),Spark 将检查被分析计划的每个子树是否存储在缓存数据序列中。如果发现匹配,这意味着相同的计划(相同的计算)已经被缓存(可能在之前的某个查询中),因此 Spark 可以使用它,并使用 InMemoryRelation 操作符将该信息添加到查询计划中,该操作符将携带关于该缓存计划的信息。这个 InMemoryRelation 随后被用于物理规划阶段,以创建物理操作符 InMemoryTableScan

df = spark.table("users").filter(col(col_name) > x).cache()df.count() # now check the query plan in Spark UI

在上图中,您可以看到使用缓存的查询的图形和字符串表示。要查看缓存了哪些转换,您需要查看计划的字符串表示,因为图形表示没有显示这些信息。

基本示例

让我们看一个简单的例子来更好地理解缓存管理器是如何工作的:

df = spark.read.parquet(data_path)df.select(col1, col2).filter(col2 > 0).cache()

考虑以下三个查询。他们中的哪一个将利用缓存的数据?

1) df.filter(col2 > 0).select(col1, col2)2) df.select(col1, col2).filter(col2 > 10)3) df.select(col1).filter(col2 > 0)

决定性因素是分析过的逻辑计划。如果它与缓存查询的分析计划相同,那么将利用缓存。对于第 1 个查询,您可能会说它有相同的计划,因为在这两种情况下优化器都会推送过滤器。但这其实并不完全准确。需要理解的重要一点是,缓存管理器的阶段发生在优化器之前。相同的是优化的计划,而不是分析的计划。因此,查询 n. 1 不会仅仅因为分析的计划不同就利用缓存。

对于查询 n. 2,您可能会再次假设它将使用缓存的数据,因为过滤器比缓存查询中的过滤器更严格。我们可以从逻辑上看到查询的数据在缓存中,但是 Spark 不会从那里读取它,原因和之前一样——分析的计划不同——这一次过滤条件不一样。然而,要使用缓存的数据,我们可以通过在那里添加过滤器来修复第二个查询:

df.select(col1, col2).filter(col2 > 0).filter(col2 > 10)

乍一看,过滤器 col2 > 0 在这里似乎没有用,但这并不是因为现在部分分析的逻辑计划将与缓存的计划相同,并且缓存管理器将能够找到它并在查询计划中使用inmemorrelation

第 3 个查询很复杂,乍一看,它似乎也有不同的分析计划,因为查询是不同的——我们只选择了 col1。然而,过滤条件是使用列 2 ,这在之前的投影中是不存在的,因此分析器将调用规则 ResolveMissingReferences ,并且它将把列 2 添加到投影中,并且分析的计划实际上将与缓存的计划相同。这一次缓存管理器将找到并使用它。

所以最终的答案是 3 号查询将利用缓存的数据。

最佳实践

让我们列出一些与缓存相关的经验法则:

  • 缓存数据帧时,为其创建一个新变量 cachedDF = df.cache() 。这将允许您绕过我们在示例中解决的问题,有时不清楚什么是分析的计划,什么是实际缓存的。在这里,每当您调用 cachedDF.select(…) 时,它都会利用缓存的数据。
  • 使用 cachedDF.unpersist() 将不再需要的数据帧取消持久化。如果缓存层变满,Spark 将开始使用 LRU(最近最少使用)策略从内存中驱逐数据。所以使用 unpersist 更好地控制什么应该被驱逐是个好习惯。此外,内存中的空间越大,用于执行的空间就越多,例如,用于构建哈希映射等等。
  • 在缓存之前,请确保只缓存查询中需要的内容。例如,如果一个查询将使用 (col1,col2,col3) ,第二个查询将使用 (col2,col3,col4) ,请选择这些列的超集: cachedDF = df.select(col1,col2,col3,col4)。cache() 。如果 df 包含许多列,并且在后续查询中只需要一小部分,那么调用 cachedDF = df.cache() 就没有多大用处。
  • 只有在有意义的时候才使用缓存。也就是说,如果缓存的计算将被多次使用。很好地理解了将数据放入内存也与一些开销有关,因此在某些情况下,如果计算足够快并且根本不使用缓存,简单地再次运行计算可能会更快,正如您在下一段中看到的。

比缓存更快

有些情况下,缓存没有任何帮助,反而会降低执行速度。例如,这与基于以支持列修剪和谓词下推的列文件格式存储的大型数据集的查询相关,如 parquet。让我们考虑下面的例子,我们将缓存整个数据集,然后在其上运行一些查询。我们将使用以下数据集和聚类属性:

dataset size: 14.3GB in compressed parquet sitting on S3
cluster size: 2 workers c5.4xlarge (32 cores together)
platform: Databricks (runtime 6.6 wit Spark 2.4.5)

首先,让我们测量不使用缓存的查询的执行时间:

df = spark.table(table_name)df.count() # runs 7.9sdf.filter(col("id") > xxx).count() # runs 18.2s

现在使用缓存运行相同的查询(整个数据集不适合内存,大约 30%缓存在磁盘上):

df = spark.table(table_name).cache()# this count will take long because it is putting data to memory
df.count() # runs 1.28mindf.count() # runs 14sdf.filter(col("id") > xxx).count() # runs 20.6s

难怪第一次计数需要 1.3 分钟,这是与将数据放入内存相关的开销。但是,正如您所看到的,与直接从 parquet 读取相比,第二次计数和使用过滤器的查询对于缓存的数据集来说也需要更长的时间。这是两个主要原因的结合。第一个是 parquet 文件格式的属性——基于 parquet 的查询本身就很快。在从 parquet 读取的情况下,Spark 将只读取元数据来获取计数,因此不需要扫描整个数据集。对于过滤查询,它将使用列修剪,只扫描 id 列。另一方面,当从缓存中读取数据时,Spark 将读取整个数据集。这一点从 Spark UI 就可以看出来,你可以查看第一阶段的输入大小(见下图)。

第二个原因是数据集很大,不完全适合 ram。部分数据也存储在磁盘上,从磁盘读取比从 ram 读取要慢得多。

SQL 中的缓存

如果您喜欢直接使用 SQL 而不是 DataFrame DSL,您仍然可以使用缓存,但是有一些不同。

spark.sql("cache table table_name")

主要区别在于,使用 SQL 时,默认情况下缓存是急切的,因此作业将立即运行,并将数据放入缓存层。为了使它像在 DataFrame DSL 中一样懒惰,我们可以显式地使用 lazy 关键字:

spark.sql("cache lazy table table_name")

要从缓存中删除数据,只需调用:

spark.sql("uncache table table_name")

查看缓存的数据

有时您可能想知道哪些数据已经被缓存了。一种可能是检查 Spark UI,它提供一些关于已经缓存在集群上的数据的基本信息。

对于每个缓存的数据集,您可以看到它在内存或磁盘上占用了多少空间。您甚至可以放大并单击表中的记录,这将带您到另一个页面,其中包含每个分区的详细信息。

要检查整个表是否被缓存,我们可以使用 Catalog API:

spark.catalog.isCached("table_name")

目录 API 也可用于从缓存中删除所有数据,如下所示:

spark.catalog.clearCache()

在 Scala API 中,你也可以使用提供一些功能的缓存管理器的内部 API,例如,你可以询问缓存管理器是否为空:

// In Scala API:val cm = spark.sharedState.cacheManagercm.isEmpty

数据持久性的其他可能性

缓存是可用于重用某些计算的多种技术之一。除了缓存,还有检查点和交换重用。

例如,在因为查询计划太大而需要中断查询计划的情况下,检查点非常有用。大型查询计划可能会成为驱动程序中处理该计划的瓶颈,因为处理一个非常大的计划需要很长时间。然而,检查点会破坏计划并具体化查询。对于接下来的转变,Spark 将开始建立一个新的计划。检查点操作与两个函数 检查点本地检查点 有关,这两个函数的不同之处在于用于数据的存储。

另一方面,Spark 将 shuffle 的输出保存在磁盘上的交换重用是一种不能由某个 API 函数直接控制的技术,而是 Spark 自己处理的内部特性。在某些特殊情况下,可以通过重写查询来实现相同的交换分支,从而间接控制交换。要阅读更多关于交换重用的内容,您可以查看我的另一篇文章,在那里我会更详细地描述它。

结论

在本文中,我们试图揭开 Spark 与缓存相关的行为的神秘面纱。我们已经看到了它是如何工作的,以及使用 DSL 和 SQL 之间的区别。我们讨论了如何尽可能提高缓存效率的一些最佳实践。在一个例子中,我们展示了对于不适合内存的大型数据集,避免缓存可能会更快,尤其是当数据以列文件格式存储时。我们还提到了缓存的一些替代方法,比如检查点或重用交换,它们在某些情况下对数据持久性很有用。

协作数据科学的最佳实践

原文:https://towardsdatascience.com/best-practices-for-collaborative-data-science-adbff75c7d97?source=collection_archive---------26-----------------------

办公时间

帮助确保项目交付真正商业价值的五种方法

照片由米利安·杰西耶在 Unsplash 拍摄

考虑到所需技能的多样性,数据科学项目是协作技术工作的完美原型。然而,总体而言,随着世界在全球疫情中航行,大多数人在可预见的未来继续在家工作,协作变得更加困难。对移民和 H-1B 签证越来越多的限制加剧了这一问题,阻止了公司从美国以外雇佣技术工人

网络网络是远程协作数据科学可能会在这里停留。那么企业如何适应这种新常态呢?以下是在数据科学项目中实现远程协作的五种最佳实践。

为成功做好准备

建立模型需要大量的时间和精力。数据科学家可能会花费数周时间试图找到、捕获数据并将其转换为模型的适当特征,更不用说许多周期的训练、调整和调整模型以确保它们能够工作。然而,尽管如此,很少有模型能够投入生产。根据 VentureBeat AI 的数据,只有 13%的数据科学项目进入生产,而在为企业交付价值方面, Gartner 预测只有 20%的分析项目将交付提高绩效的业务成果。为什么失败率这么高?

因为,在最高层面上,数据科学和业务根本没有联系。为了确保更高的成功几率,数据科学家可以通过回答三个关键问题来启动每个新项目:

  1. 我们有一个清晰的价值路径的业务问题吗?
  2. 这个问题对我们来说可行吗?
  3. 企业能否根据数据科学见解做出必要的改变?

提高数据科学项目的成功率需要数据科学团队和决策者之间的合作伙伴关系,以确保模型是适当的并且可以被采用。通过在开发开始前对这些问题进行标准化,数据科学团队可以构建一种可重复的方法来识别潜在业务问题的价值驱动因素,在模型开发期间获得业务支持,并与业务部门合作以增加其模型结果被采用的机会。

设计并记录合作项目

执行一个成功的数据科学项目需要广泛的技能和工作角色。数据科学经理、数据科学团队、数据工程师、部署和验证工程师、IT 管理员、数据对业务联络人和业务客户只是其中的一部分角色。考虑一下,你现在不仅仅是在与人合作:你还在与未来的人合作。

数据科学不像软件工程;它是概率性的,更基于研究,这意味着不是每个数据科学都会成功。然而,每个项目都代表了从现在起六个月内的一个项目的经验教训或灵感。

所有这些的一个关键是文档。不仅记录业务环境、可交付成果和代码,还记录过程、中间目标和关口、关键人物和关键见解。

此外,跨异构团队建立一套最佳实践允许那些团队协作,即使他们可能正在进行完全不同的项目。这些最佳实践包括在每个项目中有一套通用的定义明确的项目阶段和通用目录文件夹,以及更周到的要求,例如在开始项目之前必须执行的通用飞行前清单。

最后,慢下来。数据科学家和数据科学领导者经常疯狂地经营他们的组织以获得最终产品,但他们忘记了在这个过程中建立智力和组织知识。我想说的一件事是,数据科学需要更像生命科学研究实验室一样运作:例如,如果你试图为新冠肺炎创造一种疫苗,你失败了五次,你不会把你学到的东西扔进垃圾桶,对吗?那是黄金信息。你知道什么是行不通的,这可以引导你以更简化的方式去做什么。

规范知识共享

那么我们刚刚谈到的那五次失败?这就是所谓的“现有技术”,它是创新中最有价值的资产之一,尤其是在数据科学中。如果无法确保公司中的每个人都可以访问这些信息,您的数据科学家将会重新发明很多轮子。不同的团队会无意中复制相同的模型,而看不到其他人正在生成的工作。

提供一种跨业务单元和其他小环境共享知识(代码、文件、项目和模型)的简单方法消除了潜在的冗余,也促进了学习。例如,如果我需要构建一个预测心脏病的应用程序,我应该能够在我的组织的内部知识库中搜索“心脏病”,并且能够查看公司中其他任何人以前就心脏病做过的每个数据科学项目。此外,我应该能够看到他们使用的数据源,他们尝试的建模方法,他们考虑的交付形式因素,他们使用的软件环境版本,他们在此过程中产生的见解,等等。即使这些项目和我的不完全一样,我也能从中学到很多。

创建可复制的工作单元

有多少次你想,“我想运行我六个月前创建的那个项目,并将其集成到我现在正在做的事情中”,而你却找不到它?或者当您找到它时,由于包版本的变化或操作系统的升级,代码块不再运行的频率是多少?可能多得数不过来。这就是为什么您需要确保创建可重复的工作单元——尤其是在四个领域:代码、文件、环境和计算。Kubernetes 和 Docker 是使这种可复制性成为可能的基石。在一个精心编排的数据科学平台的手中,实验和模型都有完整的出处,可以很容易地复制。

采用清晰的验证和部署框架

您已经创建了您的模型,并准备投入使用,但是还有最后一个障碍:代码审查。简单地确保代码评审被清晰地定义和实现是一个好的开始。除此之外,实现简洁的性能测试管道可能看起来像(而且确实是)相当多的工作,但是在前端投入这种努力将会在客户满意度方面得到显著的回报。这与通过进行用户验收测试来确保项目满足服务水平协议密切相关。

最后,监控您的模型以确保它们实际工作是非常重要的。很多时候,模型在生产中遭受“数据漂移”:您已经获得了创建模型所依据的隐式数据,但是在生产中,您的模型会看到新的数据源。这些输入会改变结果吗?使用实时监控和警报可以帮助您跟踪数据漂移,并在模型漂移太远之前纠正模型。

很明显,远程协作将会一直存在,随着世界的不断快速发展,为什么不将您的数据科学实践与它一起带来呢?协作不仅仅是数据科学家在一个项目上一起工作;它包括与业务部门合作,正确记录代码和流程,建立现有技术库,确保可再现性,以及构建协作验证管道。使用本文中概述的最佳实践可以帮助您走向数据科学的成功。

强化学习的最佳实践

原文:https://towardsdatascience.com/best-practices-for-reinforcement-learning-1cf8c2d77b66?source=collection_archive---------23-----------------------

解除时间和基数的诅咒。

机器学习是研究密集型的。与经典编程相比,它包含了更高程度的不确定性。这对产品管理和产品开发有重大影响。

Nicolas Maquaire 授权的 Shutterstock 提供的图片。

开发一个性能良好的智能产品是非常困难的。此外,生产环境的成本也很高。这种挑战的组合会使许多创业公司的商业模式充满风险。

在我的上一篇文章中,我描述了新人在雾计算中使用人工智能时面临的挑战。更具体地说,我详细说明了在边缘做出推断需要什么。

在这篇文章中,我将描述一些我认为是开始强化学习(RL)项目的最佳实践。我将通过举例说明我在视频游戏上复制 Deepmind 的表现时学到的一些经验来做到这一点。这是我从事的一个有趣的兼职项目。

谷歌在 42 款 Atari 游戏上用同样的网络实现了超人类的表现(见通过深度强化学习实现人类级别的控制)。那么,让我们看看我们是否能达到同样的结果,并找出成功所需的最佳实践!

你可以在下面的 Github 库中找到源代码;此外,对于想了解我的算法如何工作的读者,我发表了 Breakout 解释了和 e-greedy 和 softmax 解释了。这是两个 Google Colab 笔记本,我在其中解释了预期的 sarsa 和两个策略 e-greedy 和 softmax 的实现。

时间和基数诅咒

每个 RL 从业者处理的主要问题是不确定性和无限的技术选择,以及非常长的培训时间。

我称之为 RL 的时间和基数诅咒。我认为每个人或每个团队开始强化学习项目的最佳实践是:

  1. 构建一个工作原型,即使它的性能很差或者是一个简单的问题
  2. 尽可能减少训练时间和内存需求
  3. 通过测试不同的网络配置或技术选项来提高准确性
  4. 检查,再检查,然后再检查你的每一行代码

对于这些最佳实践,我想补充一点:

  1. 监控可靠性。有时候,运气是不可重复的
  2. 平行是你的朋友。平行测试不同的想法

先来攻坚一个很简单的教科书案例:打开 AI 健身房 Acrobot 。然后,我们将转向一些更具挑战性的游戏:突围和太空入侵者。

如果你有兴趣在继续之前积累知识,我推荐你阅读理查德·萨顿和安德鲁·巴尔托的《T2 强化学习》。

如果你正在积极参与一个项目,我推荐你读一读 Andrew NG 的“机器学习向往”

用开放的 AI Acrobot 学习

作者图片

在 RL 中处理复杂的项目之前,我的建议是从简单的项目开始,因为你会在互联网上找到更多的文献。找到解决方案会更容易,更重要的是,因为测试新想法会更快(失败得快,失败得好)。

开放人工智能提供了丰富的选择。因为我专攻控制系统,所以我决定使用 Acrobot。我在攻读工程学位的时候做过一个非常类似的项目:双摆。

对于这个兼职项目,我决定从 Acrobot 开始。

如图所示,acrobot 系统具有两个关节和两个连杆,其中只有两个连杆之间的关节被驱动。最初,链接向下悬挂,目标是将较低链接的末端摆动到水平线以上。

代理的剖析

什么是强化学习?

这是我们通过与环境互动来学习这一理念的直接实现。这样,它就模仿了大脑。

作者图片

在 RL 中,在游戏的每一步,我们决定最好的行动,然后我们取回奖励并进入下一个状态。对于 Acrobot,状态由两个旋转关节角度和关节角速度的 sin()和 cos()组成。

[cos(θ1)sin(θ1)cos(θ2)sin(θ2)θ1θ2]

在《强化学习》一书中,萨顿和巴尔托描述了不同的时间差(TD)技术。TD 学习是指一类无模型强化学习,其中使用深度网络来逼近价值函数。价值函数估计每个动作有多好。

我从最常见的 RL 算法 Expected Sarsa 及其特例 Q-Learning 开始。两种算法都使用一种策略。粗略地说,策略是代理行为函数。该策略使用价值函数估计来决定最佳行动。我们将使用软策略(ɛ-greedy 和软最大),这意味着每个行动都有机会被执行。当以 1-ɛ的概率选择最佳行动,并以ɛ.的概率随机选择最佳行动时,策略是ɛ-greedy 我最喜欢的是,softmax 策略根据动作值估计值为每个动作分配一个优先级。

在通过深度强化学习的人类级控制中,Deepmind 使用 Q-Learning 和 e-greedy 策略。

我们将要使用的两种算法都带有一些超参数和许多选项。举几个例子,最重要的是学习(𝜶)和折现率(𝞬),批量大小,ε(ɛ)或τ(𝝉),用于在探索和开发之间找到正确的平衡,经验重放记忆的大小,探索步骤的数量,退火步骤的数量,模型更新频率,权重初始化,以及优化器。

当然,超参数的列表还有很多。

这就是我所说的基数的诅咒。

基数的诅咒。图片由 Nicolas Maquaire 授权的 Shutterstock 提供。

这就是为什么我的第一个最佳实践是构建一个“工作”原型。然后专注于性能。

那么。我们如何解除基数的诅咒?

首先,我建议在 web 上搜索类似的实现,以便理解其他从业者使用的超参数。除了帮助你获得成功,这将有助于发展你的直觉,这是非常重要的。事实上,“直觉”是吴恩达在他名为深度学习专业化的奇妙课程中使用最多的词语之一。

在我第一次尝试摇动 Acrobot 时,我的一些跑步收敛了。下面,我们可以看到十场以上的成功率。当然,肯定还有改进的空间,但我的算法正在学习,这是一个好的开始。

横轴单位是训练小时数。纵轴单位是十场以上的成功率。作者配图。

在图表上,你也可以看到我训练网络超过一个星期。这些网络在第二天左右开始融合。这给我们上了很好的一课:作为人工智能从业者,我们等啊等啊等。这是时间的诅咒!

现在回想起来,如果我计算我在我的机器前花费的小时数,仔细检查我的许多尝试的损失和准确性,这当然相当于获得了 RL 心理学学位!我很自豪我成为了 RL 算法的心理学专家。

我训练的一些人工智能表现得像冠军。少数人有自杀倾向,表现不那么纯粹随机(不好)。其他人则有经常性的倦怠(和丑陋)。

好人(蓝色)、坏人(绿色)和丑人 (红色)。作者配图。

发展你的直觉有助于你找到解决问题的方法。这里,坏人对最佳行动选择有问题,而坏人对其目标网络有问题。

就像深度学习中的偏差和方差方法一样,你可以发展自己的直觉来更快地诊断你的问题。

现在我们有了冠军,让我们看看如何提高它的性能。

培训代理

GPU vs CPU

深度学习和强化学习的一个主要区别是没有预先存在的数据集。当代理与环境交互时,数据集(或体验重放,或 RL 中的存储器)被创建。这导致了性能瓶颈,因为流水线依赖于 CPU 操作。这也是为什么大部分教程的张量流运算都发生在 CPU 上的原因。我非常肯定,当将所有 tensorflow 操作放在 CPU 上时,您的第一次尝试将显示更好的性能。

GPU 上的训练绝对不是自动的。但是如果做得正确,它会提高速度,正如你从下图中看到的。

横轴表示训练时间。用 GPU 上的大部分操作红;仅在 CPU 上运行时为蓝色。作者配图。

性能瓶颈是由在 CPU 内存和 GPU 内存之间来回移动大量小对象造成的。因此,了解在哪里创建 tensorflow 变量以及如何利用 tensorflow 2.x 的急切执行非常重要。

在我的机器上,限制因素通常是 CPU 的内存,它存储了体验缓冲区的所有图像。我通常不会看到高 GPU 内存消耗,因为数据是在 CPU 的内存上创建和管理的。我使用 tensorflow 数据 API 来创建数据集。数据集加载图像并将其提供给 GPU。我也没有看到 GPU 的高利用率,因为每个进程都在等待 CPU 执行下一步,并等待数据集产生一个小批量。

此外,所使用的数据类型对性能也有重要影响。使用 int16 代替 float32 将提高速度,并有助于在您的机器上管理多个 1.000.000 经验回放。

小心你的数据类型有助于你并行训练多个网络,走得更快,这进一步解除了时间的诅咒。

这些步骤显然支持我们的第二个最佳实践:尽可能减少训练时间和内存需求。

超参数和网络架构

既然我们已经使算法在速度和内存消耗方面尽可能高效,我们可以专注于解除基数的诅咒。当然,我们仍有许多部分需要整合,但这更容易管理。我们现在可以并行进行多次运行,并更快获得结果。

我建议将您的所有超参数设置为社区普遍接受的值。找到这些值的最好方法是找到挖掘类似用例的论文,看看它们使用的是什么参数。然后,我建议对 2 或 3 个最重要的超参数进行手动搜索。不要忘记使用 10 的幂来有效地扫过你的超参数的整个范围。有些非常敏感(尤其是 softmax 温度)。

对于网络架构,我推荐复制你找到的任何有趣论文中的网络架构。然后,尝试不同数量的隐藏层或不同数量的节点。此外,请记住,层的初始化内核极其重要。

例如,我注意到,当最后一个密集层使用方差缩放而不是默认的 Glorot 初始化时,使用 softmax 策略的预期 Sarsa 不会收敛。

为了说明不同数量的节点可以带来的改进,我们在之前的 CPU/GPU 比较中添加了一次新的运行。粉红色和红色图之间的唯一区别是我交换了最后两层(从 256 和 128 感知器到 128 和 256)。

以小时为横轴的训练。新图层排列的红色。作者配图。

如果您使用经典网络架构和 4 个状态的堆栈作为输入,数百次运行使我认为最重要的超参数是:

  1. 学习率
  2. 探测和退火参数(或 softmax 的温度)
  3. 图层的初始化
  4. 主要网络参数更新的频率
  5. 目标网络更新的频率

通过遵循我们的最佳实践,我们获得了非常好的改进。如下所示,我们显著提高了精确度和计算时间。

通过 GPU 和一点网络调整获得的改进。作者配图。

不用说,这会对新产品的上市和相关成本产生非常重要的影响。这显然支持了我们的第三个最佳实践:通过测试不同的网络配置或技术选项来提高准确性。

作为对进一步提高类似用例的准确性和收敛时间感兴趣的读者的补充说明:我的下一步将是使用 tile 编码。我很确定这将进一步提高速度和性能。

由于我们在 Acrobot 上的工作,我们现在有了一个很好的平台来尝试更具挑战性的东西:计算机视觉的强化学习。

雅达利的 RL 和计算机视觉

突围和太空入侵者

作者图片

Breakout 是雅达利于 1976 年 5 月 13 日开发并发布的一款街机游戏。玩法:一层砖块排列在屏幕的上三分之一处,目标是将它们全部摧毁!

作者图片

《太空入侵者》是 1978 年由 Tomohiro Nishikado 创作的街机游戏。《太空入侵者》是第一款固定射击游戏,它为射击类游戏设定了模板。目标是用水平移动的激光击败一波又一波下降的外星人,以获得尽可能多的分数。

看看我们的算法在那些游戏上表现如何!先睹为快,这两张动画 gif 是在我们的评估会议期间拍摄的。

支持这些新游戏没什么可做的。您需要声明新环境,但最重要的是,您需要调整您的网络和数据管道。对于新网络,我们将使用经典的 ConvNet 架构,与 Google Deepmind 在《自然》杂志论文中使用的网络相同:三个卷积层,后跟几个密集层。然后,我们需要更新数据管道。这有点棘手,因为我们必须存储一百万张图像。

你能在互联网上找到的大多数教程都存储了各州的历史。状态历史堆叠了由环境生成的五个连续图像。四个图像用于估计当前动作值函数,接下来的四个图像用于估计下一个动作值。考虑到存储历史对内存消耗的影响以及我们的第二个最佳实践,我们将只存储状态(图像)。数据管道将动态地重新堆叠状态。

你可以找到我在这个谷歌协作上所做的详细解释。

顺便提一下,如果像我一样,你使用开放的人工智能健身房来测试不同的算法或技术选项,并希望从开放的人工智能健身房环境转移到现实世界的问题,请注意,确保你的训练在随机环境中进行是至关重要的。你可以在互联网上找到的许多教程都使用了决定论的环境。随机性是鲁棒性的关键要求。如果你在一个开放的人工智能体育馆确定性环境中训练和验证,你的算法不太可能在现实世界的问题上起作用。我在“中谈到了这个话题,太空入侵者是确定性的还是随机的?

不幸的是,在这次更新中,我犯了很多错误,花了大量的时间来清除这些错误。为什么?因为即使有一些错误,网络也在学习和融合。精确度显然差得很远,但它正在工作。

这是与经典编程的一个重要区别。

当网络正在学习并稳定在一个适中的分数时,很容易得出超参数需要调整的结论。我掉进这个陷阱好几次了。通常,您从数据管道中删除了一个 bug,并启动了一系列运行,但几天后却发现又出现了另一个 bug。这不仅限于数据管道。我承认我在代码的每一部分都发现了错误。

这支持了我们的第四个最佳实践:检查,再检查,然后再检查你的每一行代码。

根据我的经验,最好的处理方法是创建一个单独的笔记本来证明每一行代码都在工作。很容易不经意地使用矩阵乘法而不是元素乘法,并且很容易在 Tensorflow 或 Numpy 转换中出错。我鼓励你对你的张量流代码非常谨慎。

结论

虽然我们只是触及了构建智能产品所面临的技术挑战的表面,但我希望这篇文章能够让您很好地理解一些最佳实践,以便成功启动您的 RL 项目。

对于任何研究密集型项目来说,时间和基数诅咒应该总是被考虑到你的产品管理和团队组织中。

我坚信,机器学习可以真正提供我们解决许多日益增长的问题所需的推动力。

我很乐意帮助任何有远见的人!而且,我非常乐于接受反馈。

感谢您阅读本文!

保护 AWS EC2 实例的最佳实践

原文:https://towardsdatascience.com/best-practices-for-securing-aws-ec2-instances-4bd656e22462?source=collection_archive---------23-----------------------

确保你在 AWS 共享责任模型中尽了自己的一份力

照片由 PhotoMIX 有限公司从 Pexels 拍摄

云中的安全性有不同的维度,作为用户,您应该非常谨慎地在易用性、性能和安全性之间取得最佳平衡。虽然 AWS 在确保云的安全方面做得非常出色,但用户仍然需要在云中尽自己的一份力量。从虚拟化、多租户或对数据中心的物理访问的角度来看,AWS 保护了一切,但仍有许多需要用户注意的地方。

想了解更多?然后继续读。这篇文章将探讨我在过去多年的经验中发现的相关的不同主题。

最终用户应该关心什么?

EC2 环境中的用户职责始于操作系统的配置和管理,并向上延伸,包括用户在虚拟机上安装的所有实用程序和软件。这些层可以大致分为:

操作系统(包括更新和安全补丁)

AWS 定期升级现有的 ami,这些 ami 进一步指向实例启动时使用的快照、权限和引导卷。如果您使用定制的 AMI,限制对您自己帐户的访问总是一个好的做法。第二,如果有强烈的动机,只在实例终止后保留您的卷。它可能包含应用程序状态数据,将来可以通过将这些卷附加到其他实例来使用这些数据。

AWS 上典型应用程序堆栈的层次

实例上的应用程序和实用程序

作为最终用户,您对安装在 EC2 主机上的一切负责。避免使用像 telnet、这样的工具。选择一个瘦基础 AMI 并只安装应用程序运行时绝对需要的东西是构建您的设置的最佳方式。通过安装这样的实用程序,您可能会在不知不觉中从您的主机暴露端口。

安全组防火墙配置

理解 AWS 中的安全组不仅可以帮助您控制流量,还可以作为一种识别机制,这一点很重要。避免使用默认安全组,默认情况下,它允许具有相同安全组的两个实例在所有端口上相互对话。因此,您最终可能会向网络中的另一台机器开放所有流量,而这台机器可能会因为完全不同的原因而受到危害。此外,以后与这些安全组相关联的任何其他机器自动成为俱乐部的一部分,从而形成网状拓扑。

用于访问 50 多种 AWS 服务的 AWS PrivateLink

目前通过 AWS PrivateLink 可以获得 50 多种 AWS 服务,这基本上意味着你对这些资源的请求从来没有真正通过互联网途径,而是使用 AWS 自己的内部主干网络。

因此,如果您对 EC2 实例的访问需求只是集中在常见的 AWS 服务(如 S3、DynamoDB、API Gateway 等)上。),完全阻止传出 internet 路由规则并只使用私有端点是有意义的。通过这些修改,您的路由表简化为如下内容:

安全组规则

pl-1a2b3c4d在这种情况下,指向 VPC 中特定的 AWS 服务专用链接端点。我遇到过多个堆栈,其中像 S3、DynamoDB 和 EC2 这样的服务总结了所有的堆栈需求。

你需要宋承宪吗?

第一个也是最常见的问题是向世界开放 SSH,主要是因为你没有一个专用的静态 IP/CIDR 来识别流量的良好来源。然而,您可以首先从一开始就需要 SSH 开始。AWS 生态系统在过去几年中发展很快,要求 SSH 可能是您最不想做的事情(考虑运行数十台或数千台服务器的堆栈)。在日志、监控和运营管理方面,AWS 已经有了 Cloudwatch Monitoring 、 AWS Systems Manager 等的广泛支持。从头开始规划您的架构/堆栈,以便所有可操作的见解都可以从外部获得,这样您就真的不需要访问机器了。将你的资源视为 而不是宠物 的著名比喻在这里非常贴切。设计您的系统,以便您可以在任何时候轻松地处理它们,而不需要日志、文件等任何本地状态。

如果你仍然认为你有——用 SSM

Systems Manager 是 AWS 的优秀产品,它允许您在不关联 SSH 密钥对的情况下访问 EC2 机器。此外,您也不需要允许在端口 22 上进入。通过安装 SSM 代理和设置配置,您可以从您的终端登录到您的实例:

在幕后,SSM 通过返回一个 URL 和令牌来工作,使用它您可以启动一个 WebSocket 连接来发送命令和接收来自实例的输出。

SSM 还可以帮助您完成日常操作任务

使用 SSM 的“运行”命令,您可以在一组实例上运行批量命令。这进一步为您提供了运行命令的能力,而无需真正登录到服务器。

停止使用 AWS 管理的策略

通常情况下,您不需要 AWS 管理的策略中的“所有”相关权限。第二,你不能控制将来这些政策的更新。总是倾向于最少的授权策略,其中受限制的主体只拥有您需要的访问权限。

充分了解您的应用程序堆栈

几年前,我曾经在一台可以通过互联网访问的 EC2 机器上运行过 Jenkins。无论我怎么努力,都无法终止或停止实例上运行的比特币挖掘进程。无论如何,这里的要点是了解运行在公开机器上的栈的所有方面。像 Jenkins 这样的工具工作在许多插件之上,这些插件可能会创建进入你的服务器的后门。此外,这种插件的漏洞很容易暴露,因为整个源代码大多可以在线获得。

避免在公共子网中设置实例

公共子网包括具有公共 IP 地址的实例,这些实例通过 Internet 网关路由传出流量(0.0.0.0/0)。这使得他们在互联网上可以接近,从而打破了安全连接的界限。解决这类问题的一个经验法则是,尽量减少你从账户内部向外部世界证明自己身份的方式。相反,即使实例服务于面向公众的应用程序,也总是希望实例位于私有子网中。对于这种需求,您可以始终在公共子网中提供负载平衡器,并为私有子网实例定义路由。与 Web 应用防火墙的集成还可以帮助您断然拒绝恶意流量到达您的机器。

使用实例角色——避免在 EC2 实例或 ami 中插入/放置访问键

没有什么比短有效期的按需提供的临时访问凭证更好的了。在 EC2 实例、所有官方 SDK、CLI 等中。内置了在向 AWS 发起任何请求之前获取与相关策略一致的临时凭证的支持。

这些动态凭证是使用实例元数据获取的,实例元数据是一个只能从实例内部解析的 REST 端点。根据策略定义中的授权,为请求分配适当范围的访问密钥对,通常在一小时后自动过期。

本帖到此为止。下次见,楚斯!

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

数据分析的最佳实践

原文:https://towardsdatascience.com/best-practices-in-data-analytics-cfcb2baebcb3?source=collection_archive---------18-----------------------

关于加速器和使能器的一些想法,以改进数据分析流程

斯蒂芬·沃克在 Unsplash 上拍摄的照片

数据分析已经成为现代组织如何从可用信息中获得最佳洞察力并推动高效决策流程的相关部分。

如果您的公司正在经历数字化转型,了解数据分析最重要的加速器和使能器是有好处的。

组织方法

数据分析项目源于要解决的特定需求或特定问题。可能是市场营销部门希望根据客户未说出的需求设计一种新产品,也可能是财务总监希望更好地了解哪项计划能创造更多价值。在任何情况下,都需要数据,需要分析技能,还需要 IT 部门的帮助。

然而,在现代组织中,数字化转型的重担不能只落在 IT 肩上。每个人都应该尽自己的一份力量。

一些项目(通常是一小部分)将需要高水平的能力,这可能不是所有公司都负担得起的(例如在不同领域具有多年经验的深度学习专家),但其他项目可以在内部利用现有资源进行处理,并充分利用要解决的问题的丰富知识。

此外,IT 部门每天都更多地参与管理来自公司所有部门的需求。一个新的项目(即使是一个小项目)应该提前计划,预算应该被定义和批准。从我的经验来看,除了极少数非常高优先级的项目之外,IT 部门无法承受业务所需的上市时间。尤其是在这个预算日益紧张的时期。

这就是为什么每个部门都应该投资于分析技能,并利用自己的资源(至少有 IT 支持)开展项目。在项目中担任操作角色的人员应该对数据库的结构以及如何使用数据可视化工具(如 Tableau、QlikView 或 Power BI 等)查询数据库有一个大致的了解,如果没有一些基本的 SQL 的话。

数据湖

当我想到一些改变我构建信息工具(如分析或仪表板)的方式的东西时,一个全面的数据湖(当然还有与之交互的方法)是我脑海中出现的第一个促成因素。

如果您使用过不同的遗留数据库,您会知道构建和维护需要来自多个遗留数据库的数据的分析可能会非常困难。

数据湖是所有公司数据的存储库,它应该是所有数据被写出和从各种遗留系统中读取的地方(无论如何都不能例外)。

投资现代数据湖基础设施非常重要。当然,这可能会成为一个漫长的过程,这取决于你有多少遗产以及它们有多复杂。

目录

随着数据湖的增长,跟踪许多不同数据库中的所有表将变得越来越困难。

一个好的和详细的(和最新的!)目录或数据字典将使分析师更加自主,减少对现在属于少数人的特定知识的依赖。

沙箱

沙箱是用户和分析师可以在没有破坏生产数据库风险的情况下处理数据的地方。

通常,在数据可视化或机器学习项目中,您需要操作和转换(并关联)可用数据,并构建一个层,该层将成为仪表板或预测模型的输入。

一个好的(也是快速的)方法是在沙盒中构建你自己的数据模型,然后用它来原型。在项目的最后阶段,您在沙盒中构建的数据模型将被用作生产的基线。

数据可视化工具

整个公司共享的许多报告仍然建立在 PowerPoint 和 Excel 上,从遗留系统下载数据。以这种方式处理报告非常耗时,并且容易出现操作错误。由于这个原因,可能每天可用的报告通常是每月生成和共享的。

投资数据可视化工具将确保您的公司获得更可靠、更频繁的报告。

市场上有许多好的工具(并且有不同种类的许可)。适合您的工具基于许多因素。我不会建议一个具体的,但我想分享一些考虑。

首先,你必须记住谁将从事这项工作。大多数现代工具易于使用,但提供的图表范围较小,定制选项有限。其他的(例如库 D3js ,shiny 或者 Plotly dash)提供了广泛的图表但是需要一些编码技巧。

然后,您必须考虑有多少人将访问您的仪表板,以及如何访问(网页、桌面应用程序等)。).选择的工具应该在公司中普遍采用,并且必须可用于需要与数据库交互的所有资源以及需要访问您的报告的所有资源。因此,长期成本可能会成为一个驱动因素。

与您的数据库集成。通常,您会发现大多数工具都支持您的数据库。不过,最好先检查一下。

社区。当你在高级仪表板上工作时,你可能会达到你的工具潜力的边缘。选择一个拥有大型社区的广泛使用的工具将保证你得到大多数问题的答案。

我个人目前的选择是 Tableau,我会发现它是最完整的。当然,质量并不便宜但你会有一个伟大的社区和许多先进的功能。

备份和版本控制

备份和版本控制问题不仅仅与数据分析有关,但是如果您的工作意味着编写代码(这不仅适用于使用 Python 开发预测模型的数据科学家,也适用于必须编写复杂的 SQL 查询以在粗糙的数据库上构建数据模型的数据分析师),最好了解最先进的方法,以防止几天工作的损失!

你们中最有经验的人(有严肃的编码经验)会嘲笑这个建议,但是我见过很多数据分析师(和一些数据科学家)没有正确地对他们的工作进行版本控制。

我在这里的建议是投入一些时间来学习如何使用 Git,这是一个由 Linus Torvalds(以创建 Linux 而闻名)创建的版本控制系统。Git 旨在帮助开发团队在同一个项目中合作。当我独自工作时,我也经常使用它,因为它帮助我跟踪我的代码的所有版本,并让我在没有危及“好的”工作版本的风险的情况下进行试验。通过使用云储存库(如 Github 或 Gitlab ),你也可以备份你的作品,而不需要依赖本地拷贝。

git 的学习曲线非常慢,但是我向你保证这是值得的。

总结

数据日益成为现代公司运作的核心。在本文中,我分享了一些关于最重要的促成因素和加速器的个人想法,这些因素可能会改变您组织中分析数据的方式,并可能加快数据分析项目的速度:

  • 良好的组织方法和熟练的分析师可以避免 IT 需求管理的瓶颈;
  • 一个全面的数据湖,在那里可以找到所有的公司数据;
  • 一种现代化的数据可视化工具,可加快分析速度,在公司内部共享最有用的见解,并减少在基于 Excel 或 PowerPoint 的报告中花费的时间(和错误)。

你应该知道的最好的 Python IDEs 和代码编辑器

原文:https://towardsdatascience.com/best-python-ides-and-code-editors-you-must-use-in-2020-2303a53db24?source=collection_archive---------1-----------------------

具有显著特性的顶级 Python IDEs 和代码编辑器

照片由来自佩克斯的路易斯·戈麦斯拍摄

Python 是程序员需要多大自由的一个实验。太多的自由,没人能读懂别人的代码;太少,表现力受到威胁。

吉多·范·罗苏姆

自诞生以来, Python 已经迅速发展成为一种多方面的编程语言,成为从 web 应用到部署到 人工智能机器学习深度学习等多种多样项目的选择。

Python自带众多特性,比如它的简单性、巨大的软件包和库集合、相对较快的程序执行速度等等。

GitHub 第二受欢迎的语言,也是机器学习最受欢迎的语言。

对于一个程序员来说,代码编辑器或 IDE 是接触任何编程语言的第一点,这使得它的选择成为未来旅程中最关键的步骤之一。在整篇文章中,我们将讨论一些顶级的 Python IDEs 和代码编辑器,以及为什么在下一个项目中应该和不应该选择它们。

根据 StackOverflow 的说法,Python 是发展最快的主流编程语言。

** [## 2019 年堆栈溢出开发者调查

每个月,大约有 5000 万人访问 Stack Overflow 来学习、分享和建立他们的职业生涯。我们估计 21…

insights.stackoverflow.com](https://insights.stackoverflow.com/survey/2019)**

什么是集成开发环境(IDE)?

IDE 代表 [集成开发环境](https://press.rebus.community/programmingfundamentals/chapter/integrated-development-environment/#:~:text=An integrated development environment (IDE,IDEs have intelligent code completion.) ,不仅包括用于管理代码的标准代码编辑器,还提供了一整套用于调试、执行和测试的工具,这对于软件开发来说是绝对必要的。一些 ide 还带有内置的编译器和解释器。下面列出了在一个专用环境中常见 ide 提供的一些标准特性:

●语法高亮显示

●构建自动化

●版本控制

●可视化编程

●代码格式化和完成

●代码重构

●支持与外部工具集成

IDE 与代码编辑器

对于任何程序员来说,代码编辑器或 IDE 都是最基本的软件,是他们一天开始和结束的事情。要实现它的最大潜力,最好的起点是代码编辑器或 IDE,它本质上允许您使用 Python,但这不是全部。许多** 编程语言 完全可以在没有 IDE 的情况下工作,而有些则依赖于 IDE。**

代码编辑器— 代码编辑器是程序员用于应用程序开发的核心软件。可以把它想象成一个简单的文本编辑器,但是具有额外的特定于编程的高级特性,例如:

●语法高亮显示

●代码格式

●分割文件查看和编辑

●即时项目切换

●多项选择

●跨平台支持

●重量轻

IDE — 另一方面,IDE 附带了一套工具,不仅有助于开发应用程序,还有助于测试、调试、重构和自动化构建。不用说,在大多数情况下,IDE 可以提供代码编辑器的所有功能,但是代码编辑器不能取代 IDE。

2020 年最佳 Python IDEs 和代码编辑器

为工作选择合适的工具至关重要。类似地,当开始一个新项目时,作为一名程序员,在选择完美的代码编辑器或 IDE 时,您有很多选择。有很多针对 Python 的 ide 和代码编辑器,在这一节中,我们将讨论一些最好的 ide 和代码编辑器,以及它们的优缺点。

皮查姆

图片来源— PyCharm

  • 类别: IDE
  • 首次发布日期: 2010 年
  • 平台兼容性: Windows、macOS、Linux
  • ****适合谁:中高级 Python 用户
  • 支持语言: Python,Javascript,CoffeeScript 等。
  • 价格: Freemium(免费有限功能社区版,付费全功能专业版)
  • ****下载:py charm 下载链接
  • 使用 Pycharm Python IDE 的热门公司-
    Twitter、HP、Thoughtworks、GROUPON 和 Telephonic。

由 JetBrains 开发的 PyCharm 是一个跨平台的 IDE** ,它提供了各种各样的特性,比如版本控制、图形调试器、集成单元测试器,以及针对 web 开发和数据科学任务的 pairs。使用 PyCharm 的 API,开发人员可以创建他们的自定义插件,以便向 IDE 添加新功能。**其他功能包括:****

●代码完成

●代码变更的实时更新

● Python 重构

●支持全栈 web 开发

●支持科学工具,如 matplotlib、numpy 和 scipy

●支持 Git、Mercurial 等

●有付费版和社区版

py charm 的优势—

●可以提高生产率和代码质量

●高度活跃的支持社区

PyCharm 的缺点

●加载速度可能很慢

●需要更改现有项目的默认设置以获得最佳兼容性

●初始安装可能会很困难

截图供参考-

图片来源— PyCharm

Spyder

图像来源— Spyder

  • 类别: IDE
  • 首次发布年份: 2009 年
  • 平台兼容性: Windows、macOS、Linux
  • 面向谁: Python 数据科学家
  • ****价格:免费
  • ****下载:Spyder 下载链接

Spyder 是一个支持像 NumPy、SciPy、Matplotlib 和 Pandas 这样的软件包的工具。Spyder 面向科学家、工程师和数据分析师,提供高级数据探索、分析和可视化工具。这个跨平台 IDE 的特点包括:****

●代码完成

●语法高亮显示

●通过分析器进行代码基准测试

●多项目处理

●在文件中查找功能

●历史日志

●用于自检的内部控制台

●第三方插件支持

优势—

●包括对众多科学工具的支持

●拥有令人惊叹的社区支持

●交互式控制台

●重量轻

劣势—

●带有执行依赖性

●刚开始对新人来说可能有点挑战

截图供参考-

图片来源— Spyder

**[## spyder-ide/spyder

版权所有 2009-2019 Spyder 项目贡献者某些源文件和图标可能有其他作者身份/许可…

github.com](https://github.com/spyder-ide/spyder)**

Eclipse + Pydev

  • 类别: IDE
  • 首次发布年份: 2001 年 Eclipse 的**,Pydev 的 2003 年 Pydev 的**
  • 平台兼容性: Windows、macOS、Linux
  • 面向谁:中高级 Python 用户
  • 支持语言: Python,(Eclipse 支持 Java 和许多其他编程语言)
  • 价格:免费
  • 下载: PyDev 下载链接
  • 使用 PyDev 和 Eclipse Python IDE 的热门公司——
    Hike、Edify、Accenture、Wongnai、Webedia。

Eclipse 是可用的顶级 ide 之一,支持广泛的应用程序开发编程语言,包括 Python。最初是为开发 Java 应用程序而创建的,对其他编程语言的支持是通过插件引入的。用于 Python 开发的插件是 Pydev,它提供了比 Eclipse IDE 更多的好处,比如:

Django、Pylint 和 unittest 集成

●交互式控制台

●远程调试器

●转到定义

●类型提示

●通过自动导入自动完成代码

优点—

●易于使用

●程序员友好的特性

●免费

劣势—

●复杂的用户界面给工作带来挑战

●如果你是初学者,那么使用 Eclipse 会很困难

截图供参考-

图像来源— Pydev

**** [## 10 家使用 Python 的世界级公司

Python 正被 IT 界的一些巨头积极使用

towardsdatascience.com](/10-world-class-companies-using-python-26cde24919a8)

怠速

图片来源— Python

  • 类别: IDE
  • 首次发行年份 : 1998 年
  • 平台兼容性: Windows、macOS、Linux
  • 面向谁:初级 Python 用户
  • 价格:免费
  • 下载: 闲置下载链接
  • 使用闲置 Python IDE 的热门公司—
    谷歌、维基百科、CERN、雅虎、NASA。

集成开发和学习环境的简称,IDLE 作为其默认 IDE 与 Python 捆绑在一起已经超过 15 年了。IDLE 是一个跨平台 IDE ,它提供了一组基本特性来减轻负担。提供的功能包括:

●带有彩色代码、输入、输出和错误信息的外壳窗口

●支持多窗口文本编辑器

●代码自动完成

●代码格式

●在文件中搜索

●带断点的调试器

●支持智能缩进

优势—

●非常适合初学者和教育机构

劣势—

●缺少更高级的 ide 所提供的功能,例如项目管理功能

[## IDLE - Python 3.8.3 文档

闲置有以下特点:闲置可能会打开编辑器窗口时,它启动,这取决于设置和你如何启动…

docs.python.org](https://docs.python.org/3/library/idle.html)

机翼

图片来源— 翅膀

  • 类别 - IDE
  • 首次发布年份—2000 年 9 月 7 日
  • 平台 - Windows、Linux 和 Mac
  • 面向谁:中高级 Python 用户
  • 价格:商业使用一年每位用户 179 美元,永久商业使用许可每位用户 245 美元
  • 下载: 翼下载链接
  • 使用 Wing Python IDE 的热门公司-
    脸书、谷歌、英特尔、苹果和 NASA

功能丰富的 Python IDE Wing 的开发是为了通过引入智能特性(如智能编辑器和简单的代码导航)来加快开发速度。Wing 有 101 个版本、个人版本和专业版本,其中专业版本功能最丰富,也是唯一一个付费版本。Wing 的其他显著特征包括:

●代码完成、错误检测和质量分析

●智能重构能力

●交互式调试器

●单元测试器集成

●可定制的界面

●支持远程开发

●支持 Django、Flask 等框架

优点—

●与 Git 等版本控制系统配合良好

●强大的调试能力

缺点—

●缺乏引人注目的用户界面

[## 用于自然语言处理的 Python 库

用于自然语言处理的流行 python 库概述

towardsdatascience.com](/python-libraries-for-natural-language-processing-be0e5a35dd64)

云 9 IDE

图片来源— 亚马逊云 9

  • 类别 : IDE
  • 首次发布年份— 2010 年
  • 平台 : Linux/MacOS/Windows
  • 使用 Cloud9 Python IDE 的热门公司—
    Linkedin、Salesforce、Mailchimp、Mozilla、Edify、Soundcloud。

作为亚马逊网络服务的一部分,Cloud9 IDE 只需要一个浏览器就可以让你访问基于云的 IDE。所有代码都在亚马逊的基础设施上执行,转化为无缝和轻量级的开发体验。功能包括:

●需要最少的项目配置

●强大的代码编辑器

●代码高亮、格式化和完成功能

●内置终端

●强大的调试器

●实时结对编程能力

●即时项目设置,涵盖大多数编程语言和库

●通过终端无障碍访问多个 AWS 服务

优势—

●实现无服务器应用程序的轻松开发

●非常强大且全球可用的基础设施

缺点—

●完全依赖互联网接入

[## 机器学习和深度学习的最佳 Python 库

现代机器学习模型和项目的 Python 库

towardsdatascience.com](/best-python-libraries-for-machine-learning-and-deep-learning-b0bd40c7e8c)

崇高正文 3

图片来源— 升华

  • 类别:代码编辑器
  • 首次发布年份: 2008 年
  • 平台兼容性: Windows、macOS、Linux
  • 适合谁:初学者,专业人士
  • 支持语言: Python 和 C#
  • 价格:免费增值
  • 下载: 崇高正文 3 下载链接
  • 使用 Sublime Text Python IDE 的热门公司-
    星巴克、Myntra、Trivago、Stack、Zapier。

Sublime Text 是最常用的跨平台代码编辑器之一,支持多种编程语言,包括 Python。Sublime 提供了各种功能,如大量的视觉定制主题,一个干净和不受干扰的用户界面,并支持包管理器通过插件扩展核心功能。其他功能包括:

●通过软件包管理器更新插件

●文件自动保存

●宏

●语法高亮和代码自动完成

●同步代码编辑

●转到任何东西、定义和符号

优势—

●整洁的用户界面

●分割编辑

●快速高性能编辑器

缺点—

●恼人的弹出窗口购买崇高的许可证

●令人困惑的大量快捷方式

●复杂的软件包管理器

Visual Studio 代码

图片来源— Visual Studio 代码

  • 类别: IDE
  • 首次发布年份: 2015 年
  • 平台兼容性: Windows、macOS、Linux
  • 送给谁:专业人士
  • 支持语言:各大编程语言(Python,C++,C#,CSS,Dockerfile,Go,HTML,Java,JavaScript,JSON,Less,Markdown,PHP,PowerShell,Python,SCSS,T-SQL,TypeScript。)
  • 价格:免费
  • 下载: Visual Studio 代码下载链接
  • 使用可视化源代码的流行公司(Python IDE—
    )The Delta Group,TwentyEight,Inc .、Focus Ponte Global、Creative Mettle 和 National Audubon Society,Inc .

由微软开发的 Visual Studio Code 是一款广受好评的跨平台代码编辑器,它具有高度的可定制性,并允许使用包括 Python 在内的多种编程语言进行开发。它为程序员提供了各种各样的特性,比如智能调试、可定制性、扩展核心特性的插件支持。主要亮点包括:

●对 Git 和版本控制的内置支持

●代码重构

●集成终端

●智能感知,实现更智能的代码突出显示和完成

●直观的代码调试能力

●无缝部署到 Azure

优势—

●在积极的社区支持下定期更新

●免费

缺点—

●大量的插件会让寻找合适的插件变得很困难

●对大文件处理不力

●更长的发射时间

截图供参考-

图片来源— Visual Studio 代码

[## Visual Studio 代码中的 Python

使用 Microsoft Python 扩展,在 Visual Studio 代码中使用 Python 是简单、有趣且高效的。的…

code.visualstudio.com](https://code.visualstudio.com/docs/languages/python)

原子

图片来源— 原子

  • 类别:代码编辑器
  • 首次发布年份: 2014 年
  • 平台兼容性: Windows、macOS、Linux
  • 适合谁:初学者,专业人士
  • 支持语言: Python、HTML、Java 等 34 种语言。
  • 价格:免费
  • 下载: Atom 下载链接
  • 使用 Atom (Python IDE)的热门公司—— 埃森哲、Hubspot、Figma、Lyft、Typeform。

Atom 由源代码托管和软件版本控制领域的佼佼者 Github 开发,是一个轻量级的跨平台代码编辑器,适用于 Python 和许多其他编程语言。Atom 以包的形式提供了许多特性,增强了它的核心特性。它建立在 HTML、JavaScript、CSS 和 Node.js 之上,底层框架是 electronic。提供的功能包括:

●通过内置软件包管理器支持第三方软件包

●支持开发者协作

●超过 8000 个功能和用户体验扩展包

●支持多窗格文件访问

●智能代码完成

●可定制选项

优势—

●轻量级代码编辑器

●社区驱动的发展和支持

缺点—

●最近的更新增加了 RAM 的使用

●使用前需要对设置进行一些调整

Jupyter

图片来源— Jupyter

  • 类别: IDE
  • 首次发布年份-2015 年 2 月
  • 浏览器兼容性: Chrome,Firefox,Safari
  • 价格:免费
  • 下载:Jupyter 下载链接
  • 使用 Jupyter Python IDE 的热门公司- 谷歌、彭博、微软、IBM 和 Soundcloud。

也被称为 Project Jupyter,它是一个 开源 和跨平台 IDE ,许多数据科学家和分析师比其他工具更喜欢它。非常适合研究 AI、ML、DL 等技术,以及包括 Python 在内的几种编程语言。Jupyter 笔记本为各种目的(包括分析、可视化和开发)提供代码、文本和方程的无缝创建和共享。提供的功能包括:

●代码格式和突出显示

●通过电子邮件、Dropbox 轻松分享

●产生交互式输出

●善于利用大数据

●可以从本地和云机器上运行

优势—

●需要最少的设置

●非常适合快速数据分析

缺点—

●没有经验的用户可能会发现 Jupyter 很复杂

参考截图-

图片来源— Jupyter

如何为自己选择最好的 Python IDEs 和代码编辑器

选择正确的 IDE 或代码编辑器可能意味着通过更快的开发节省时间,或者由于鲁莽的决定而失去时间。在上一节中,我们已经提到了许多 ide 和代码编辑器及其一些值得注意的特性。如果你不知道下一个 Python 项目应该选择哪一个,我们建议你快速阅读一下。毕竟,如果没有一套合适的 ide 和代码编辑器,程序员会怎么样呢?

注: 为了消除各种各样的问题,我想提醒你一个事实,这篇文章仅代表我想分享的个人观点,你有权不同意它。

更多有趣的阅读—

我希望这篇文章对你有用!以下是一些有趣的读物,希望你也喜欢

[## 面向所有人的顶级谷歌人工智能工具

使用谷歌人工智能中心将想法变为现实

towardsdatascience.com](/top-google-ai-tools-for-everyone-60346ab7e08) [## 数据科学如何助推网飞

当有效使用时,数据可以神奇的方式改变您的业务,并将它带到新的高度。

towardsdatascience.com](/how-data-science-is-boosting-netflix-785a1cba7e45) [## 数据科学家的最佳数据科学工具

数据科学工具,使任务可以实现

towardsdatascience.com](/best-data-science-tools-for-data-scientists-75be64144a88) [## 选择 PyTorch 进行深度学习的理由

PyTorch 可以为深度学习程序员提供很多东西

towardsdatascience.com](/reasons-to-choose-pytorch-for-deep-learning-c087e031eaca)

关于作者

克莱尔 D 。是Digitalogy的内容制作者和营销人员,这是一个技术采购和定制匹配市场,根据全球各地的特定需求,将人们与预先筛选的&顶尖开发人员和设计师联系起来。在LinkedinTwitterinsta gram上连接 Digitalogy 。****

机器学习和深度学习的最佳 Python 库

原文:https://towardsdatascience.com/best-python-libraries-for-machine-learning-and-deep-learning-b0bd40c7e8c?source=collection_archive---------1-----------------------

现代机器学习模型和项目的 Python 库

机器学习和深度学习的最佳 Python 库

"机器学习的一项突破相当于十个微软."
——比尔·盖茨

机器学习深度学习最近随着人工智能行业的推动而兴起,这项技术的早期采用者开始看到它结出果实。随着越来越多的企业加入这一行列,并开始投入时间和精力来实现这一未开发领域的潜力,这对在这一领域工作的开发人员来说会更好。

几种编程语言可以让你从人工智能、ML 和 DL 开始,每种语言都提供一个特定概念的据点。一些流行的 ML 和 DL 编程语言是 PythonJuliaRJava 以及其他一些语言。至于现在,我们将更关注于 Python

为什么机器学习和 AI 首选 Python?

作为首选的机器学习语言,Python 似乎正在赢得战斗。库和开源工具的可用性使其成为开发 ML 模型的理想选择。

长期以来,Python 一直是机器学习和人工智能开发者的首选。Python 为开发人员提供了一些最好的灵活性和特性,不仅提高了他们的生产力,还提高了代码的质量,更不用说丰富的库帮助减轻了工作量。下面列出了使 Python 成为机器学习、深度学习和人工智能的顶级编程语言的各种功能:

免费和开源的特性使得它对社区友好,并保证长期的改进

详尽的库确保每个现有问题都有解决方案

平稳的实施和集成使不同技能水平的人都可以适应它

●通过减少编码和调试时间提高生产率

●可以用于软计算,自然语言处理也可以

与 C 和 C++ 代码模块无缝协作

Python 是你能读到的最强大的语言。
---巴乌杜布-

用于机器学习的 Python

机器学习和深度学习的最佳 Python 库

虽然有很多语言可供选择,但 Python 是对开发人员最友好的机器学习和深度学习编程语言之一,并且它有一套广泛的库支持,以满足您的每一个用例和项目。

机器学习的最佳 Python 库(来源)

张量流

革命来了!欢迎使用 TensorFlow 2.0。

TensorFlow 是一个快速、灵活、可扩展的开源机器学习库,用于研究和生产。

TensorFlow 是在 Python 上进行机器学习的最好的库之一。TensorFlow 由 Google 提供,让初学者和专业人士都可以轻松地建立 ML 模型。

使用 TensorFlow,您不仅可以在计算机上创建和训练 ML 模型,还可以使用 TensorFlow Lite 和 TensorFlow Serving 在移动平台和高性能服务器上提供相同的优势。

TensorBoard( 来源

在 ML 和 DL 中,TensorFlow 大放异彩的一些重要领域是:

●处理深度神经网络

●自然语言处理

●偏微分方程

●抽象能力

●图像、文本和语音识别

●想法和代码的轻松协作

核心任务:建立深度学习模型

要了解如何在 TensorFlow 中完成特定任务,可以参考 TensorFlow 教程。

Keras

Keras 是 Python 最流行和开源的神经网络库之一。最初由谷歌工程师为 ONEIROS 设计,ONEIROS 是开放式神经电子智能机器人操作系统的缩写,Keras 很快在 TensorFlow 的核心库中得到支持,使其可以在 TensorFlow 上访问。Keras 提供了创建神经网络所需的几个构建模块和工具,例如:

●神经层

●激活和成本函数

●目标

●批量标准化

●辍学

●联营

Keras 片段(来源)

Keras 通过 ML 和 DL 编程的这些附加特性扩展了 TensorFlow 的可用性。有了一个有用的社区和一个专用的 Slack 频道,获得支持是很容易的。对卷积和递归神经网络的支持也与标准神经网络一起存在。也可以参考斯坦福的 Keras 和计算机视觉课上的其他示例模型。

Keras 备忘单:https://S3 . amazonaws . com/assets . data camp . com/blog _ assets/Keras _ Cheat _ Sheet _ python . pdf

核心任务:构建深度学习模型

【Keras 入门—

keras-创建你自己的机器学习模型(来源

PyTorch

由脸书开发的 PyTorch 是为数不多的 Python 机器学习库之一。除了 Python,PyTorch 的 C++接口也支持 C++,如果你喜欢的话。PyTorch 被认为是最佳机器学习和深度学习框架竞赛中的顶级竞争者之一,它面临着来自 TensorFlow 的触摸竞争。其他细节可以参考 PyTorch 教程。

基本 PyTorch 工作流程(来源)

PyTorch 与 TensorFlow 的一些重要区别在于:

●能够通过图形处理单元加速处理的张量计算

●易于学习、使用并与 Python 生态系统的其他部分集成

●支持建立在基于磁带的自动差异系统上的神经网络

PyTorch 附带的各种模块有助于创建和训练神经网络:

●张量——火炬。张量

Pytorch 张量介绍(来源

●优化器— torch.optim 模块

●神经网络——神经网络模块

●亲笔签名

优点:非常可定制,广泛应用于深度学习研究

缺点:较少的 NLP 抽象,没有针对速度进行优化

核心任务:开发和训练深度学习模型

Keras vs Tensorflow vs PyTorch |深度学习框架对比

深度学习框架比较(来源)

Scikit-learn

Scikit-learn 是另一个被广泛使用的 Python 机器学习库。它包括与不同的 ML 编程库如 NumPy 和 Pandas 的简单集成。Scikit-learn 支持各种算法,例如:

●分类

●回归

●聚类

●降维

●型号选择

●预处理

围绕易于使用但仍然灵活的理念,Scikit-learn 专注于数据建模,而不是其他任务,如数据的加载、处理、操纵和可视化。从研究阶段到部署,它被认为足以用作端到端 ML。为了更深入地理解 scikit-learn,你可以查看 S cikit-learn 教程。

核心任务:建模

学习 Scikit-学习-

scikit——提供大量的机器学习算法(来源)

●熊猫

熊猫 是一个 Python 数据分析库,主要用于数据操作和分析。它在数据集为训练做准备之前就开始发挥作用了。熊猫让机器学习程序员轻松处理时间序列和结构化多维数据。就处理数据而言,熊猫的一些伟大特性是:

●数据集重塑和旋转

●数据集的合并和连接

●缺失数据的处理和数据对齐

●各种索引选项,如分级轴索引、花式索引

●数据过滤选项

熊猫片段(来源)

Pandas 使用 DataFrames,这只是一个技术术语,通过向程序员提供 DataFrame 对象来表示数据的二维表示。

核心任务:数据处理和分析

谷歌趋势——随着时间的推移熊猫的兴趣

谷歌趋势熊猫(来源)

● NLTK

NLTK 代表自然语言工具包,是一个用于自然语言处理的 Python 库。它被认为是最流行的处理人类语言数据的库之一。NLTK 为程序员提供了简单的接口以及大量的词汇资源,比如 FrameNet、WordNet、Word2Vec 以及其他一些资源。NLTK 的一些亮点是:

●在文档中搜索关键字

●文本的标记化和分类

●语音和手写识别

●单词的词汇化和词干化

NLTK 片段(来源)

NLTK 及其软件包被认为是学生、工程师、研究人员、语言学家和从事语言工作的行业的可靠选择。

核心任务:文本处理

火花 MLlib

MLlib 是 Apache Spark 的可扩展机器学习库

由 Apache 开发的, Spark MLlib 是一个机器学习库,可以轻松扩展您的计算。它使用简单,快速,易于设置,并提供与其他工具的顺利集成。Spark MLlib 瞬间成为开发机器学习算法和应用的便捷工具。

【Spark MLlib 带来的工具有:

Spark Mllib 机器学习工具

使用 Spark MLlib 进行机器学习的程序员可以利用的一些流行算法和 API 有:

●回归

●聚类

●优化

●尺寸缩减

●分类

●基本统计

●特征提取

● Theano

Theano 是一个强大的 Python 库,可以轻松定义、优化和评估强大的数学表达式。使 ano 成为执行大规模科学计算的强大库的一些特性包括:

●与 CPU 相比,支持 GPU 在重型计算中表现更佳

●与 NumPy 的强大集成支持

●更快、更稳定地评估最棘手的变量

●能够为您的数学运算创建自定义 C 代码

有了 Theano,你可以实现一些最高效的机器学习算法的快速开发。在 ano 之上构建了一些知名的深度学习库,如 KerasBlocksLasagne 。关于 Theano 中更高级的概念,可以参考 Theano 教程

MXNet

一个灵活高效的深度学习库

MXnet——一个灵活高效的深度学习库

如果你的专业领域包括深度学习,你会发现 MXNet 是最合适的人选。用于训练和部署深度神经网络,MXNet 是高度可扩展的,并支持快速模型训练。Apache 的 MXNet 不仅支持 Python,还支持许多其他语言,包括 C++、Perl、Julia、R、Scala、Go 等等。

MXNet 的可移植性和可扩展性让您可以从一个平台转移到另一个平台,并根据项目的需求进行扩展。科技和教育领域的一些大牌,如英特尔微软麻省理工等等,目前都支持 MXNet。亚马逊的 AWS 更倾向于 MXNet 作为其首选深度学习框架的选择。

Numpy

Numpy 图书馆

Python 的 NumPy 库专注于处理大量多维数据和对数据进行操作的复杂数学函数。NumPy 提供了在数组上快速计算和执行复杂函数的能力。支持 NumPy 的几点有:

●支持数学和逻辑运算

●形状操作

●分类和选择能力

●离散傅立叶变换

●基本线性代数和统计运算

●随机模拟

●支持 n 维数组

NumPy 致力于面向对象的方法,并拥有集成 C、C++和 Fortran 代码的工具,这使得 NumPy 在科学界非常受欢迎。

核心任务:数据清理和操作

谷歌趋势—一段时间内的货币利息

谷歌趋势 Numpy( 来源)

结论

Python 是一个真正不可思议的开发工具,它不仅是一种通用的编程语言,还能满足您的项目或工作流的特定需求。它提供了大量的库和包,扩展了 Python 的功能,使它成为一个全能的工具,非常适合任何希望开发程序和算法的人。通过上面简要讨论的一些现代机器学习和深度学习的 Python 库,您可以了解每个库都提供了什么并做出选择。

更多有趣的阅读—

我希望这篇文章对你有用!下面是一些有趣的读物,希望你也喜欢

[## 面向所有人的顶级谷歌人工智能工具

使用谷歌人工智能中心将想法变为现实

towardsdatascience.com](/top-google-ai-tools-for-everyone-60346ab7e08) [## 2020 年人工智能工程师的顶级编程语言

从几种编程语言中,人工智能工程师和科学家可以挑选出适合他们需要的语言

towardsdatascience.com](/top-programming-languages-for-ai-engineers-in-2020-33a9f16a80b0) [## 用于可解释机器学习的 Python 库

4 个用于更好地可视化、解释和诠释模型的库

towardsdatascience.com](/python-libraries-for-interpretable-machine-learning-c476a08ed2c7) [## 数据科学的 10 大 Python 库

为您的数据科学探索提供一些很酷的帮助!

towardsdatascience.com](/top-10-python-libraries-for-data-science-cd82294ec266)

关于作者

克莱尔 D 。在digital ogy是一个内容制作者和营销人员。这是一个技术采购和定制匹配市场,根据全球各地的特定需求,将人们与预先筛选的&顶尖开发人员和设计师联系起来。连接DigitalogyonLinkedinTwitterinsta gram**

最佳中等 Python 可视化

原文:https://towardsdatascience.com/best-python-visualizations-on-medium-a04921f61559?source=collection_archive---------20-----------------------

通过观察媒体上的顶级可视化效果,了解可视化数据的最佳技术

声明:我为 Datapane 工作

动机

Medium 上每天都有关于数据可视化的惊人文章。虽然这是以信息超载为代价的,但这不应该阻止您探索有趣的文章,因为您可以学习许多为项目创建有效可视化的新技术。

我浏览了最近关于 Python 可视化的中型文章,并把其中最好的放在一起——希望它能让你自己更容易地探索它们。我已经将这些提交给了数据面板图库,它正在为我们托管它们。

如果你还不知道 Datapane ,它是一个开源框架,面向用 Python 分析数据并需要一种方式来分享他们的结果的人。Datapane 拥有一个免费的公共平台,有一个画廊和社区,人们可以在 Python 数据可视化技术上共享和协作。

在这篇文章中,我将以画廊中的情节为例,说明什么因素构成了有效的情节,介绍不同种类的情节,以及如何自己创建它们!

用 Python 实现流水线中的主成分分析和 SVM

有趣的想法

在这篇文章, Saptashwa Bhattacharyya 结合了 SVM、主成分分析和网格搜索交叉验证来创建一个管道,以找到二元分类的最佳参数。然后,他绘制了一个决策边界来展示我们的算法执行得有多好。

令人印象深刻的视觉效果

联合地块

联合图确实有助于在一个图中显示两个变量的分布和关系。六边形越暗,落在该区域的点(观测值)越多

等高线图和核密度估计: KDE(核密度估计)是一个有用的统计工具,可以让你在给定一组数据的情况下创建一条平滑的曲线。如果您只想可视化某些数据的“形状”(而不是离散直方图),这可能会很有用。

配对图:通过查看配对图,比较不同变量对之间的相关性要容易得多。在下图中,您可以看到平均面积与平均半径有很强的相关性。颜色的差异也有助于了解每对中每个标签的行为—这真的很清楚!

SVM 等高线图:这个等高线图真的有助于找到位于那个区域的点实际属于那个区域的百分比。我特别喜欢下面的等高线图,因为我可以看到恶性细胞、良性细胞和支持向量所在的区域,它帮助我理解 SVM 是如何工作的。

3D SVM 图:即使我们经常看到 2D SVM 图,但大多数时候,数据是多维的。看到这个 3D 图真的有助于理解 SVM 是如何在多维空间中工作的。

要探索的资源

  • 中条
  • 运行活页夹上的代码

用 Plotly 可视化 Gapmind 和篮球数据集

有趣的想法

一个好的情节不仅是美丽的,而且能给观众提供正确的信息。如果图表中没有正确的比例,观众会以不同的方式解读信息。

这就是为什么正确的比例如此重要。在这篇文章, JP Hwang 向你展示如何用正确的比例创造有效的情节。

令人印象深刻的视觉效果

曲线图显示了随时间的变化

该图有效地代表了世界上不同大陆在时间快照中所占的百分比:

但是你如何绘制图表来显示不同大陆的人口比例随时间的变化呢?

作者展示了你可以通过下面的情节做到这一点

从上面的图中可以看出,时间维度被添加到了图中。现在这些图不仅显示了分布,还显示了总数和分布如何随时间变化!整洁!

气泡图

随着数据点在两个维度上的增长,无论是条形图还是堆叠条形图都变得更加难以可视化,因为条形图的大小太小,无法提供任何有意义的信息。

这就是为什么作者聪明地使用了气泡图,这是一种在一个图表中查看更多数据点的有效方法,但仍然清楚地显示了比例随时间的变化。

要探索的资源

  • 中等文章
  • 运行活页夹上的代码

牛郎星情节解构:可视化天气数据的相关结构

有趣的想法

您可能知道如何使用热图来显示数据中不同变量之间的相关性,但如果您想从热图中的数字 0.71 中获得更多信息,该怎么办呢?在这篇文章,保罗·希姆斯特拉展示了如何通过结合热图和二维直方图来探索天气数据集的结构。

令人印象深刻的视觉效果

与牛郎星联动的剧情

热图和二维直方图在显示相关性方面都很有效——但是如果你能把它们结合起来会更有效。下面的链接图就是这样做的。

当您单击热图中的每个方块时,您将在右侧看到该热图的 2D 直方图表示!

. 98 的相关性在 2d 直方图中是什么样子的?我们期望线性相关,我们通过看右边的图来证明。相比之下,对于 0.12 的相关性,在 2D 直方图上似乎没有任何模式。非常直观易懂。

要探索的资源

  • 中条
  • 运行活页夹上的代码

基于 Python 的 Plotly 的桑基图基础

有趣的想法

如何可视化一个流入流出来源不同的网络?例如,政府的税收、公用事业等收入用于哪些服务?与其他服务的支出相比,一项服务的支出百分比是多少?

在这篇文章,蒂亚戈·卡瓦略展示了如何用桑基图有效地可视化这样的网络

令人印象深刻的视觉效果

桑基图

如果您点击图表中的每个网络,您可以清楚地看到收入花在了哪些服务上。如果你只看左边的节点,你可以比较不同收入之间的比例。你可以对右边的节点做同样的事情。这种技术对于绘制流程图特别有用——比如销售渠道,或者访问者在您的网站上走过的路。一张图能传达如此多的信息,真是令人惊讶。

要探索的资源

  • 中条
  • 运行活页夹上的代码

新冠肺炎对美国不同社会群体失业率的影响

有趣的想法

你可能知道新冠肺炎严重影响经济,但你知道它如何影响不同的社会群体吗?本文作者冈田新一旨在用动画条形图回答这个问题。

令人印象深刻的视觉效果

动画条形图

查看条形图随时间变化的最常见方法是使用滑动条,在滑动条上滑动按钮来查看变化。但是你的滑动速率是变化的,所以你不会看到随着时间的推移以同样的速率变化。这就是为什么动画条形图如此有效。

单击左侧的播放按钮,查看条形图如何随时间变化!现在你可以清楚地看到新冠肺炎教在不同时期对不同社会群体的不同影响。

要探索的资源

  • 中等文章
  • 运行活页夹上的编码器,自己创建条形图!

结论

我希望这篇文章能为您提供一个良好的开端,让您探索关于可视化的有趣的媒体文章。学习任何东西的最好方法就是自己去尝试。选择一个可视化,运行代码,观察其中的神奇之处!

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如

[## VSCode 中数据科学家的 4 大代码查看器

让 YAML、JSON、CSV 和 Jupyter Notebook 为你工作,而不是与你作对

towardsdatascience.com](/top-4-code-viewers-for-data-scientist-in-vscode-e275e492350d) [## 可视化的 6 大 Python 库:使用哪一个?

对使用哪种可视化工具感到困惑?我为你分析了每个图书馆的利弊

towardsdatascience.com](/top-6-python-libraries-for-visualization-which-one-to-use-fe43381cd658) [## 使用这四种 Numpy 方法充分利用您的阵列

如何垂直拆分 Numpy 数组或查找特定范围内的元素。

medium.com](https://medium.com/swlh/get-the-most-out-of-your-array-with-these-four-numpy-methods-2fc4a6b04736) [## 我收集了超过 1k 的顶级机器学习 Github 配置文件,这就是我的发现

从 Github 上的顶级机器学习档案中获得见解

towardsdatascience.com](/i-scraped-more-than-1k-top-machine-learning-github-profiles-and-this-is-what-i-found-1ab4fb0c0474)

原载于 2020 年 3 月 16 日【https://datapane.com】

深度学习的最佳资源

原文:https://towardsdatascience.com/best-resources-for-deep-learning-f4c774356734?source=collection_archive---------30-----------------------

深度学习教育资源

来源

深度学习是一种使用神经网络进行预测任务的机器学习方法。深度学习方法可以用于各种任务,包括对象检测、合成数据生成、用户推荐等等。在这篇文章中,我将浏览一些开始深度学习的最佳资源。

我们开始吧!

在线资源

有几个在线资源非常适合开始深度学习。

send ex

Sentdex 是一个 YouTube 频道,由哈里森·金斯利运营,其中有几个关于如何用 python 实现机器学习算法的教程。虽然该频道包含许多关于其他机器学习算法的优秀教程,如支持向量机、线性回归、基于树的模型和 k 近邻,但如果你想尝试深度学习,关于深度学习的教程是一个很好的起点。播放列表使用 Python 的机器学习有一个关于学习实现各种神经网络的 14 部分系列,如简单的多层密集网络、递归神经网络、长短期记忆网络(LSTMs)和卷积神经网络。该系列还介绍了 tensorflow 基础知识、预处理、训练&测试以及安装 tensorflow 的 GPU 版本。该频道还有一个名为从头开始的神经网络的播放列表,其中有关于如何从基本组件开始构建神经网络的教程。这是一个学习神经网络如何在引擎盖下工作的好地方。

数据营

DataCamp 是一个基于订阅的平台,非常适合那些开始从事数据科学和机器学习的人。它有许多学习如何实现神经网络的课程。具体来说,我推荐深度学习入门课程。本课程通过 DataCamp 的互动学习平台,为您提供关于如何使用 Keras 进行深度学习的实践知识。这意味着在视频间隙,您可以通过编写和运行实际代码来应用您所学到的东西。它涉及基本概念,如前向传播,激活函数,神经网络层和学习表示。它还详细介绍了使用反向传播的神经网络优化,将神经网络应用于回归和分类,以及如何进一步微调神经网络模型。学完基础,推荐 Keras 的《高级深度学习》课程。这将详细讨论 Keras API 以及如何使用功能构建块构建神经网络。它还深入探讨了神经网络中有关分类嵌入、共享层和合并层的一些高级概念

吴恩达深度学习讲座

我上面列出的资源主要集中在实现和实际应用上。对于神经网络的更多理论处理,我推荐吴恩达关于深度学习的讲座。讲座涵盖了许多基础知识,包括梯度下降及其背后的微积分,矢量化,激活函数,反向传播,模型参数和超参数等等。如果你对神经网络背后的数学和理论感兴趣,我强烈推荐这些讲座。

用 Scikit 实践机器学习——Learn&tensor flow,作者 Aurelien Geron

如果你使用书本更有效地学习,这本书是开始学习如何实现神经网络的好地方。这本书涵盖了许多机器学习主题,包括许多神经网络的基础知识,包括如何建立简单的多层密集神经网络,卷积神经网络和递归神经网络。

伊恩·古德菲勒的《深度学习》

这本书涵盖了各种神经网络架构背后的理论和数学。这本书涵盖了神经网络背后的先决数学概念,许多现代神经网络背后的数学,甚至概述了在深度学习研究中正在做的工作。

结论

在这篇文章中,我们讨论了几个对开始深度学习有用的资源。首先,我们讨论了 Sentdex YouTube 频道,它涵盖了许多关于如何用 python 构建神经网络来完成分类和回归任务的实际例子。如果神经网络的理论和数学让你害怕,但你仍然想开始构建神经网络模型,这是一个很好的起点。我们还参观了 DataCamp,它提供了一个很好的互动学习平台,你可以在视频间隙解决编码练习。一旦你对实现深度学习算法的代码感到舒适,吴恩达的课程对于加深你对深度学习背后的理论和数学的了解是非常棒的。如果你更适合从书本中学习,那么 Hands on Machine Learning 包含了许多讨论如何用 python 实现神经网络的精彩章节。如果你有兴趣从一本书上学习理论,伊恩·古德菲勒的深度学习是一个很好的资源。我希望你觉得这篇文章有用/有趣。感谢您的阅读!

掌握 Python 的最佳资源

原文:https://towardsdatascience.com/best-resources-for-mastering-python-2356b8be0ece?source=collection_archive---------32-----------------------

学习 Python 的全面资源列表

来源

Python 是一种高级解释编程语言,可用于各种软件开发任务,包括科学计算、机器学习、数据分析、图像分析等等。在这篇文章中,我将介绍一些掌握 python 的最佳学习资源。

我们开始吧!

在线学习

科里·斯查费 YouTube 频道

我开始使用的学习 python 的第一个学习资源是科里·斯查费的 YouTube 频道。如果你刚刚入门,或者你是一个经验丰富的 python 开发者,并且对尝试 python 的新东西感兴趣,Corey 的频道是很棒的。该频道有以下主题的播放列表:

  1. Python 程序员入门教程

这是不言自明的。该播放列表包含全面的视频,以易于理解的方式学习 python 基础知识。在这里,您将了解类型、列表、元组、字典、条件、循环和迭代、函数、操作系统模块、python 标准库等等。对于那些对 Python 感到恐惧的人来说,这确实是一个很好的起点,因为它对任何观众来说都是非常容易理解的。

2.熊猫教程

Pandas 是一个强大的 python 库,用于数据分析和数据操作。Corey 的频道提供了一个教程视频播放列表,讨论如何对数据执行各种任务。这些包括读取和写入数据,过滤数据,选择数据,添加/删除行,汇总数据和更多!

  1. Django 教程

Corey 的频道还包含 Django 的教程,Django 是一个基于 python 的 web 框架。如果您已经有了一些 python 开发经验,并且对学习如何构建高度可伸缩和安全的 web 应用程序感兴趣,我强烈建议您查看 Corey 的 Django 教程。

Sentdex YouTube 频道

Sentdex 是由哈里森·金斯利(Harrison Kinsley)运营的 YouTube 频道,提供 python 语言的深度机器学习教程。Sentdex 在我作为数据科学家的早期学习中发挥了重要作用,我向任何有兴趣深入研究该领域的人强烈推荐该频道。该频道涵盖了许多基本的机器学习算法,如线性回归,神经网络,随机森林,支持向量机等等。

数据营

DataCamp 是一个基于订阅的平台,提供关于 python 和机器学习的高质量视频教程。Python Track 的数据科学对于那些想尝试使用 Python 进行机器学习的人来说尤其重要。它也是强化数据科学和机器学习基础以及探索利基行业垂直领域的一些应用的好地方。

如果你通过书籍学习更有效率,以下文本是学习 python 的绝佳资源:

  1. 学习 Python ,马克·卢茨&大卫·阿舍尔

马克·卢茨的《学习 Python》是开始学习 Python 的好地方。它涵盖了许多基本概念,比如类型&操作符、列表、字典、元组、条件、函数、模块、类等等。

2.**Python 食谱,布莱恩·比兹利&布莱恩·k·琼斯

如果你有一些 python 经验,Python 食谱是一个很好的资源,可以让你的技能更上一层楼。顾名思义,这本书作为一个有效执行各种开发任务的食谱目录。这本书讨论了数据结构&算法,使用正则表达式的字符串&文本操作,HTML & XML 解析,处理日期&时间,使用生成器和迭代器,网络和 web 编程等等!

3.有效的 Python,布雷特·斯拉特金

这是另一个非常有助于加深您的 python 知识的中间文本。它涵盖了如何编写 pythonic 代码,即如何以简单明了的方式编码,同时最大限度地提高可读性。在 pythonic 思想的框架内,它涵盖了一些基本概念,包括函数、类、元类、并发性、内置模块等等。这种用 python 开发的方式可以帮助你写出清晰易读的代码,这使得使用这种语言变得更加愉快。

4.用 Scikit-Learn 进行机器实践学习& TensorFlow* ,Aurelien Geron*

一旦你有了坚实的 python 基础,如果你有兴趣尝试机器学习,我推荐用 Scikit-Learn & TensorFlow 动手学习机器。本文涵盖了机器学习的基础知识,包括如何构建分类模型&回归模型、降维、构建深度神经网络、构建卷积神经网络、构建递归神经网络等等。如果您是一名对机器学习入门感兴趣的 python 程序员,这是一个很好的资源。

结论

在这篇文章中,我们讨论了掌握 python 编程语言的几个资源。对于那些真正刚刚入门的人,我强烈推荐科里·斯查费的马克·卢茨的《学习 Python 的频道》。这些资源将使你充分熟悉这门语言,并为你可能有的其他兴趣打开大门。无论你是想用 Django 构建下一个 Instagram,还是想在 Keras 使用深度学习构建下一个面部识别技术,这个列表都足以让你开始你的 Python 之旅。我希望你觉得这篇文章有用/有趣。谢谢你的阅读,祝你好运!

适合初学者的最佳简单 Python 项目

原文:https://towardsdatascience.com/best-small-python-projects-to-do-e0e3276ad465?source=collection_archive---------23-----------------------

在你的周末做这些小项目,在学习 Python 的同时获得一些乐趣。

照片由屋大维丹在 Unsplash

读者们好,在这个故事中,我们来谈谈制作一些有趣的 Python 项目,以便更好地了解 Python,并在玩 Python 及其令人惊叹的库时获得一些乐趣。

这些项目很小,你可以在 1-2 小时内轻松完成。这些将帮助你更好地理解 Python 及其各种库。这些都是初学者友好的,所以每个人都应该尝试一下这些项目。

所以,事不宜迟,让我们一个一个地深入研究这些项目。

1)文本到语音

这是一个非常简单的 python 项目,但也是一个有趣的尝试。它利用了 Python 的 Google Text to Speech API,因此我们需要首先使用下面的命令导入库:

**pip install gTTS**

现在,在我们安装了所需的库之后,我们可以构建我们的 python 程序来将文本转换成语音。

如果我们想听程序中的音频,我们可以在 python 代码中导入 os 库。

所以,让我们来写程序的代码。下面是必需的代码:

#importing the gTTS library **from gtts import gTTS**#Asking the user for the required text **mt = input("Enter the required text:\t")**#Setting the output language **language = ‘en’**#Converting text to speech and choosing speed as fast **voice = gTTS(text=mt, lang=language, slow=False)**#Saving the speech as mp3 file **voice.save(“conv.mp3”)**

因此,通过这种方式,你可以很容易地使用 Python 进行文本到语音的转换。该文件将保存在执行该 python 代码的同一文件夹中(当前工作文件夹)。

你可以用很多方法让它变得更好,比如你可以从 pdf 中提取文本,然后把它转换成语音来完整地读出 pdf。你也可以从图像中提取文本,然后做同样的事情。

那么,让我们转到第二个简单的 Python 项目。

2)从图像中提取文本

您可以轻松地从图像中提取文本。我们将使用开放的 CV 和 pytesseract 库。

我们需要首先安装 openCV 和 pytesseract 库。为此,我们将使用以下命令在系统中安装 openCV。

**pip install opencv-python**

要安装 pytesseract,我们需要执行更多的任务。这是教程中最难的部分。

首先,我们需要使用以下命令:

**pip install pytesseract**

然后,我们需要下载下面的文件并安装在我们的系统中。从这里下载最适合你系统的文件。

完成所有这些工作后,我们就可以开始编写程序的最终代码了。

#Importing the libraries **import cv2
import pytesseract**
**pytesseract.pytesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'**#Opening the image with open-cv
**image = cv2.imread('pic.png')**#Extracting text from image
**st = pytesseract.image_to_string(image)**#Printing the text
**print(st)**

因此,在 pytesseract 库的帮助下,我们可以很容易地从图像提取器中提取文本。

它在从图像中检测文本方面具有很高的准确性。因此,用相对简单的代码,我们已经从图像提取器中获得了高精度的文本。

3)玩 pdf

我们可以使用 Python 对 pdf 做很多事情。我们可以将它转换成文本,分割 PDF,合并 PDF,添加水印等等。所以,让我们写一个简单的 Python 代码来使用 Python 在 pdf 上执行所有这些很酷的东西。

我们将使用 PyPDF2 库对 PDF 执行操作。这个库帮助我们获得这样做的所有能力。

因此,让我们使用以下命令来安装这个库:

**pip install PyPDF2**

该命令将把所需的软件包安装到您的系统中。现在,我们已经准备好编写 Python 代码了。

因此,首先,让我们导入包并加载所需的 pdf。

#Importing the package
**import****PyPDF2**#Loading the PDF file
**pdffile =****open('first.pdf', 'rb')**#Reader object to read PDFs
**Reader =****PyPDF2.PdfFileReader(pdffile)**

现在,让我们从 PDF 中提取一些信息。

#Display the number of pages
**print(Reader.numPages)**#Getting a page by page number
**page = Reader.getPage(1)**#Extracting text from the page
**print(page.extractText())**

我们还可以合并 PDF 文件,旋转 PDF 文件中的页面,将 PDF 文件分割成多个部分等等。但是,我们不能在这里涵盖所有这些。

有关这个库及其用法的更多信息,请访问 PyPDF2 这里。

4)语言翻译

有一个神奇的 API 可以帮助我们从一种语言翻译成另一种语言。这是谷歌翻译 API。我们需要在系统中安装 goslate 来运行执行翻译所需的 Python 代码。

**pip install goslate**

现在,让我们深入研究实际的 Python 代码。我们可以翻译成多种语言,这些语言都是由谷歌翻译 API 支持的。我们将把来自用户的输入作为一个字符串,但是我们也可以把输入作为一个文本文件的形式,转换成一个字符串并对它执行操作。

此外,我们可以制作一个实时翻译器,在其中我们可以大声说话,代码将转换语言。这将需要在这个主题上做更多的挖掘,所以我们改天再讨论它。

现在,我们将构建一个简单的语言翻译器。

#Importing the library package
**import goslate**#Taking input from user
**text = input("Enter the text:\t")**#Calling the goslate function
**gs = goslate.Goslate()**#Translating the text to our preferred language
**trans = gs.translate(text,'hi')**#Displaying the output **print(trans)**

所以,上面的代码为我们做了必要的工作。它把一个英语句子翻译成印地语。你可以选择任何你喜欢的语言。

因此,通过上面的四个 Python 项目,我希望你能学到一些东西,并通过更多的选项和更深入的分析做出这些简单项目的更好版本。

将这些项目作为起始代码,并使用它们来构建更好的项目。一旦掌握了正确的技能,您还可以创建更多的 Python 项目。所以,继续练习,继续前进。

在你读完这本书之后,我想推荐几个更好的故事给你读,它们提供了好的知识,帮助你学习新的东西。

[## 用 MERN 堆栈构建一个电子商务网站——第 1 部分(设置项目)

让我们使用 MERN 堆栈(MongoDB,Express,React 和 Node)建立一个简单的电子商务网站,用户可以在其中添加项目…

shubhamstudent5.medium.com](https://shubhamstudent5.medium.com/build-an-e-commerce-website-with-mern-stack-part-1-setting-up-the-project-eecd710e2696) [## 用 Node,Express 和 MongoDB 构建一个 REST API

让我们使用 Node、Express 和 MongoDB 构建一个遵循 CRUD 原则的 REST API,并使用 Postman 测试它。

medium.com](https://medium.com/javascript-in-plain-english/build-a-rest-api-with-node-express-and-mongodb-937ff95f23a5) [## 使用 React 构建一个简单的 Todo 应用程序

让我们用 React 构建一个简单的 Todo 应用程序,教你 CRUD 的基本原理(创建、读取、更新和…

medium.com](https://medium.com/javascript-in-plain-english/build-a-simple-todo-app-using-react-a492adc9c8a4) [## 用 Django 构建求职门户——概述(第 1 部分)

让我们使用 Django 建立一个工作搜索门户,允许招聘人员发布工作和接受候选人,同时…

shubhamstudent5.medium.com](https://shubhamstudent5.medium.com/build-a-job-search-portal-with-django-overview-part-1-bec74d3b6f4e) [## 使用 Django 构建一个社交媒体网站——设置项目(第 1 部分)

在第一部分中,我们集中在设置我们的项目和安装所需的组件,并设置密码…

towardsdatascience.com](/build-a-social-media-website-using-django-setup-the-project-part-1-6e1932c9f221)

感谢您阅读这篇文章。我希望你喜欢这篇文章。

最佳 Spyder 替代方案— VS 代码

原文:https://towardsdatascience.com/best-spyder-alternative-vs-code-de0d9a01c8b5?source=collection_archive---------8-----------------------

如果你是 Spyder 或 R Studio 的粉丝,你一定会喜欢 Visual Studio 代码。

萨法尔·萨法罗夫在 Unsplash 上拍摄的照片

当我开始 Python 编程时,Spyder 一直是我的最爱。我喜欢它的变量浏览器,IPython 控制台和项目目录选择器。变量资源管理器允许我检查和调试变量,而不用打印它们。IPython 控制台允许我在写入脚本之前进行任何快速测试,而项目目录选择器允许我在不使用命令行的情况下更改目录。多方便啊!

最近在 Visual Studio 代码中的 Python 开发在过去的一年中有了显著的改进,这激起了我的兴趣。我已经用了几个月了,我真的很喜欢 Visual Studio 代码。以下是我认为 VS Code 是 Spyder 最佳选择的原因。

1.熟悉的用户界面

Spyder 3 vs Visual Studio 代码

在我们开始之前,您应该在 VS 代码扩展市场安装 Python 扩展。

与 Spyder 类似,VS Code 也有一个变量浏览器。Python 交互式窗口为您提供了与 IPython 控制台相似的功能。您可以在这里做一个快速代码测试,并在变量浏览器中探索您的变量。

VS Code 还提供了 Python 调试控制台,用于 Python 中的调试。更多细节可以参考 VS 代码博客。

[## Visual Studio 代码 Python 入门教程

在本教程中,您将使用 Python 3 在 Visual Studio 代码中创建最简单的 Python“Hello World”应用程序。由…

code.visualstudio.com](https://code.visualstudio.com/docs/python/python-tutorial)

2.轻松改变 Python 虚拟环境

只需单击位于左下角的 python 版本,即可轻松更改当前的 Python 工作环境。

是的,就像那样。

3.Jupyter 笔记本支持

这是我最喜欢的 VS 代码的另一个特性。早在 9 月份,它就推出了对 Jupyter 笔记本的本地支持。你现在可以用 VS 代码打开你的 Jupyter 笔记本,而不必一次打开这么多窗口。

[## 在 Visual Studio 代码中使用 Jupyter 笔记本

Jupyter(以前的 IPython)是一个开源项目,它让您可以轻松地将 Markdown 文本和可执行 Python…

code.visualstudio.com](https://code.visualstudio.com/docs/python/jupyter-support)

4.开源免费!

Visual Studio 代码是免费和开源的,在许可的 MIT 许可下发布。开源意味着它将拥有巨大的社区和在线支持。你也可以把它带到任何地方,因为它可以在 Windows、Mac OS 和 Linux 上使用。

5.一堆主题和扩展

嗯,谁不喜欢 2020 年的黑暗模式?黑暗模式是 2020 年代码编辑器的必备模式。如果你不是黑暗模式的粉丝,不要担心,在 VS 代码中有很多主题可用,或者你可以自己定制主题。

开源也意味着人们可以通过开发 Visual Studio 代码的扩展来改进它。以下是我最喜欢的 VS 代码扩展:

  • gitLens -一个 Git 扩展,可以帮助你一目了然地可视化代码作者,无缝地导航 Git 库。
  • emojisense -一个 emoji 扩展,在 VS 代码中自动完成和显示 emoji。
  • vscode-icons -一个图标扩展,美化你在 VS 代码中的图标视图。
  • 一个帮助你检查拼写的扩展。它也适用于骆驼套!

希望这篇文章能帮助你熟悉 Visual Studio 代码。如果你对 Visual Studio 代码有什么好的或有趣的扩展,请和我分享!

干杯!

你必须拥有的终极字符串超级技能:REGEX

原文:https://towardsdatascience.com/best-string-super-skills-you-must-have-regex-2f5ecbfd2bca?source=collection_archive---------42-----------------------

通过这个超级简单的介绍,摆脱 Python 中文本字符串处理问题的困扰。

照片由 Prateek Katyal 在 Unsplash 上拍摄

当处理数据时,总是有可能不得不处理文本。做好准备,当时机到来时,在 Python 中一个强大的朋友的帮助下,您将会很好地发现、处理和处理字母数字字符串。

我说的是 REGEX 。Regex 代表正则表达式,它描述了一个特殊的字符序列,用于搜索和操作文本字符串中的单词、数字或其他字符。

这篇介绍性的内容旨在为您提供一个很好的方法,并为您提供一些(更多的)初步知识,这些知识对于您熟悉 Regex 是必不可少的。

因为 Regex 是如此强大、庞大和复杂,我敢打赌,您也将分享同样的观点,即无限多的 pythonic 可能性展现在我们面前。让我们来看看一些基本命令。

首先,除了 Pandas,让我们导入**re**模块,解锁 python 中所有与 Regex 相关的内容。

import pandas as pd
import re

我们还需要定义一个文本,我们将在这篇文章的一些例子上工作。

我选择了 Mat Velloso 写的一句话,以一种非常好奇的方式试图用简单的术语来区分机器学习和人工智能。

Mat Velloso 是微软首席执行官的技术顾问,也是开发者的忠实拥护者。https://twitter.com/matvelloso

让我们剪切并坚持较短的文本部分,使其更简单:

text = "If it is written in PYTHON, it's probably machine learning" 

re.findall()

re模块有一组函数,允许我们搜索、返回和替换一个字符串或字符串的任何部分。我们从 findall() 函数开始,它返回一个包含所有事件的列表。

rx = re.findall(r'.*PYTHON', text) print(rx)

['If it is written in PYTHON'] 

理解:首先,findall() 函数按照它找到的顺序返回一个事件列表。其次,**‘r’**是在开始时确保字符串被视为“原始字符串”。

移动到‘.*PYTHON’部分。我们希望返回所有内容,直到单词 PYTHON,inclusive。因此,**.***是某种王牌符号,从某种意义上说,*****将所有内容重复零次或更多次,直到它找到星星,而**.**告诉星星返回它找到的所有内容,无论是字母、数字、符号还是空格。

如果我们颠倒命令,我们会收到句子的另一半,请看一个例子。

rx = re.findall(r'PYTHON.*', text) print(rx)

["PYTHON, it's probably machine learning"] 

re.flags设置为 ignore-case,以便它匹配出现的大小写。

rx = re.findall('python.*',text, flags=re.IGNORECASE) print(rx)

["PYTHON, it's probably machine learning"]

从这一点开始,我们可以建立一系列的可能性。

rx = re.findall(r'written.*machine', text) print(rx)

["written in PYTHON, it's probably machine"] 

rx = re.findall(r'tt.*bl', text) print(rx)

["tten in PYTHON, it’s probabl"] 

接下来看看其他符号,这些符号用于检查字符串是否以、(符号**^**)或开始,以特定字符(符号**$**)结束。

  • **^**评估并匹配字符串的开头(与**\A**相同)
  • **\w+**匹配并返回字符串中的字母数字字符

如果我们去掉符号**+**,我们只收到第一个字符。

text = "If it is written in PYTHON, it's probably machine learning" 

rx = re.findall(r'^\w+', text) print(rx)

['If']

rx = re.findall('learning$', text) print(rx)

['learning']

如果不匹配,我们会收到一个空列表。

每当一个字符尽可能匹配时,它就被认为是贪婪的。符号**?**检查下一个字符是否从该精确位置开始匹配 0 次或 1 次。意思是它指定了一个非贪婪版本的*******+**

rx = re.findall(r' .*? ', text) print(rx)

[' it ', ' written ', ' PYTHON, ', ' probably ']

字符大括号 **{b,n}** 用于当我们想要检查至少**b** 次,并且最多**n** 次的图案时。

text = "If it is written in PYTHON, it's probably machine learning" 

rx = re.findall(r'(t{1,4}|i{1,})', text) print(rx)

['i', 't', 'i', 'i', 'tt', 'i', 'i', 't', 'i', 'i']

在下一个例子中(如下),我们要求检查至少 1 个**t** 和最多 4 个**t** ,我们得到了这个精确的结果。

另一方面,我们还检查了至少 1 个**e** 和最多 3 个**e**,但是正如您所看到的,一行中有 4 个**e** ,这意味着这 4 个**e**将被分成 3 个一组,这就是我们得到剩余的单个**e** 的原因。

rx = re.findall(r'(t{1,4}|e{1,3})', 'listttt compreheeeension') print(rx)

['tttt', 'e', 'eee', 'e']

使用方括号 **[]**指定我们想要匹配的一组字符。比如**[abc]****a**有 1 个匹配,和**cab**有 3 个匹配,和**hello**没有匹配。

因此,我们可以使用方括号内的(符号**-**)来指定值的范围。因此,**[a-d]****[abcd]**相同,范围**[1-4]****[1234]**相同,以此类推。

按照同样的推理,范围**[a-z]**匹配任何小写字母,范围**[A-Z]**匹配任何大写字母。如果设置了**[a-zA-Z]** 的组合,我们就同时检查上下两种情况。让我们用一些例子来试试。

# assigning new text
alpha_num = "Hello 1234"

rx = re.findall(r'[a-z]', 'alpha_num') print(rx)

['e', 'l', 'l', 'o']

rx = re.findall(r'[a-zA-Z]', 'Hello 1234') print(rx)

['H', 'e', 'l', 'l', 'o']

rx = re.findall(r'[a-zA-Z0-9]', 'Hello 1234') print(rx)

['H', 'e', 'l', 'l', 'o', '1', '2', '3', '4']

如果我们加上符号**+**,会发生什么?

rx = re.findall(r'[a-zA-Z0-9]+', 'Hello 1234') print(rx)

['Hello', '1234']

提示:如果集合内的第一个字符是**^**,那么集合外的所有字符都将被匹配。

rx = re.findall(r'[^a-zA-Z ]+', 'Hello 1234') print(rx)

['1234']

这些对你来说有意义吗?厉害!

现在来说说特殊序列。这些用反斜杠**\**写,后跟所需的字符(及其含义)。

  • \ w——如前所述,返回字符串包含字母、数字和下划线的匹配项
  • \ W-返回每个非字母数字字符
  • \ d-返回一个匹配项,其中字符串包含从 0 到 9(0–9)的数字。

如果星号*****重复所有事情零次或更多次,符号**+**重复所有事情一次或更多次。那么有什么区别呢?让我们创建另一个字符串来举例说明,并仔细看看。

# assigning new text
letters_numbers = "The letter A, the character * and the numbers 11, 222 and 3456."

rx = re.findall('\w', letters_numbers) print(rx)

['T', 'h', 'e', 'l', 'e', 't', 't', 'e', 'r', 'A', 't', 'h', 'e', 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r', 'a', 'n', 'd', 't', 'h', 'e', 'n', 'u', 'm', 'b', 'e', 'r', 's', '1', '1', '2', '2', '2', 'a', 'n', 'd', '3', '4', '5', '6']

相反,如果我们加上符号**+**,会有什么不同?

rx = re.findall('\w+', letters_numbers) print(rx)

['The', 'letter', 'A', 'the', 'character', 'and', 'the', 'numbers', '11', '222', 'and', '3456']

rx = re.findall('\W', letters_numbers) print(rx)

[' ', ' ', ',', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ', ',', ' ', ' ', ' ', '.']

仅提取数字:

rx = re.findall('\d+', letters_numbers) print(rx)

['11', '222', '3456']

rx = re.findall('\d{3,}', letters_numbers) print(rx)

['222', '3456']

现在,假设我们想从两个元素组成的字符串中只提取大写单词。

upper_extract = "Regex is very NICE for finding and processing text in PYTHON"

rx = re.findall('([A-Z]{2,})', upper_extract) print(rx)

['NI', 'CE', 'PY', 'TH', 'ON']

重新拆分()

split 方法非常方便,因为它在找到匹配项时会拆分字符串,并返回精确拆分后的字符串列表。

numbers = 'The air we breath is made up of 78% nitrogen, 21% oxygen and 1% of other stuff.'

rx = re.split(r'\d+', numbers) print(rx)

['The air we breath is made up of ', '% nitrogen, ', '% oxygen and ', '% of other stuff.']

如果模式不匹配,则返回原始字符串。

一个有用的资源是设置可能发生的最大拆分。我们可以通过将maxsplit参数传递给re.split()方法来进行设置。

rx = re.split(r'\d+', numbers, 1) print(rx)

['The air we breath is made up of ', '% nitrogen, 21% oxygen and 1% of other stuff.']

在下一个示例中,只在第一次出现的五个空格处设置拆分。

rx = re.split(r'\s', numbers, 5) print(rx)

['The', 'air', 'we', 'breath', 'is', 'made up of 78% nitrogen, 21% oxygen and 1% of other stuff.']

re.sub()

Sub 代表 SubString,使用这个方法,您可以在任何时候用任何文本替换任何匹配。

语法很简单:re.sub(pattern, replacement, string)

可以添加其他参数,例如替换发生的最大次数、区分大小写等。

text = "If it is written in PYTHON, it's probably machine learning" 

rx = re.sub(r'written', 'coded', text) print(rx)

If it is **coded** in PYTHON, it's probably machine learning

rx = re.sub(r'it', 'THAT', text) print(rx)

If **THAT** is wr**THAT**ten in PYTHON, **THAT**'s probably machine learning 

在下一个例子中,我们想要的是用“THAT”替换“it ”,但只在第一次出现时。

rx = re.sub(r'it', 'THAT', text, count=1) print(rx)

If **THAT** is written in PYTHON, it's probably machine learning

在下一个示例中,将通过单词“PYTHON”前后的空格进行拆分,并替换为“code”。如果我们以这种方式键入“PYthon ”,那么设置 ignore-case so 并不重要。

rx = re.sub(r’\sPYthon,\s’, ‘ code, ‘, text, flags=re.IGNORECASE) print(rx)

If it is written in **code**, it's probably machine learning 

re.subn()

re.subn()产生与re.sub()相同的结果,除了它返回替换的数量。

rx = re.subn(r'it', 'THAT', text) print(rx)

("If **THAT** is wr**THAT**ten in PYTHON, **THAT**'s probably machine learning", 3) 

如果你喜欢这篇文章,我相信你会发现这些也很有趣。

[## 熊猫变得容易(指南— I)

有许多最常用的函数和方法的例子

towardsdatascience.com](/pandas-made-easy-the-guide-i-81834f075893) [## 机器学习:营销活动的成本预测(探索性数据分析——第一部分)

预测营销活动最佳目标候选人的数据科学方法

towardsdatascience.com](/machine-learning-costs-prediction-of-a-marketing-campaign-exploratory-data-analysis-part-i-758b8f0ff5d4)

结论

作为 Regex 能力的初步探索,我猜想到现在为止,在处理字母数字字符串时,您会更多地考虑应用这些技术。

Regex 将对您在 Python 上的工作效率产生巨大影响,所以我希望您继续研究并投入一些时间,因为一旦您对它感到满意,您就会意识到几乎有无限的可能性,只有天空才是极限。

随时和我联系,我会很高兴的。谢谢大家!

联系人

  • Linkedin
  • 推特
  • 中等
  • GitHub
  • 卡格尔
  • 电子邮件

好的阅读,伟大的编码!

数据科学最佳 TED 演讲

原文:https://towardsdatascience.com/best-ted-talks-for-data-science-11b699544f?source=collection_archive---------11-----------------------

数据科学,TED,值得传播的想法

这里列出了最精彩的 TED 演讲,这些演讲启发了你,并向你展示了数据的力量。

TED 博客

ED 是一个多元化的全球社区,通过简洁而有力的演讲传播改变世界的想法。代表技术、娱乐和设计的 TED 始于 1984 年的会议。今天,它在全世界用 100 种语言涵盖了从科学到商业,再到气候变化等全球性问题。

TED 演讲是一个很好的学习新事物的媒介,甚至可以激发你以前从未意识到的好奇心和隐藏的激情。话题如“什么造就了美好的生活?和伟大的领导者如何激励行动只是激励行动和成长的改变生活的想法的几个例子。

也就是说,蓬勃发展的数据科学领域现在也是 TED 演讲者的对话和想法。有许多演讲强调数据的力量,数据的好的一面和坏的一面等等。其中每一个都将为您提供与数据相关的见解。

因此,无论你是数据科学家还是对我们周围数据的指数增长感到好奇的人,这里有一些关于数据科学的最佳 TED 演讲,它们将拓展你的思维,并为你提供世界上最有价值的东西之一——知识。

会谈

Teemu Paananen 在 Unsplash 上拍摄的照片

**Index** 1\. How not to be ignorant about the world 
2\. The Beauty of Data Visualization
3\. Three ways to spot a bad statistic
4\. Big Data is better data
5\. The human insight missing from Big Data
6\. Your company’s data could end world hunger
7\. Who Controls the World

1.如何不去无知这个世界

ted.com

主题:数据可视化
演讲人:《真实》
想法的作者汉斯·罗斯林:使用数据分析和可视化来揭穿我们头脑中的固有偏见和媒体对非常事件的不再现,这些事件植入了世界问题正在恶化的概念。他使用了一系列问题,向我们展示黑猩猩比我们人类更善于拥有正确的世界观,并让我们相信世界可能是坏的,但同时也在变得更好。

引用:

如果你对今天有一个基于事实的世界观,你可能有机会了解未来会发生什么。

链接

2.数据可视化的美妙之处

ted.com

主题:数据可视化
演讲嘉宾 : 大卫·麦坎德斯,知名数据记者。
创意:将复杂的数据集转化为直观的图表,利用好的设计改变我们看待世界的方式。

引用:

设计是解决问题并提供优雅的解决方案,信息设计是解决信息问题。

链接

3.识别错误统计数据的三种方法

ted.com

主题:统计学
演讲者 : Mona Chalabi,数据记者
想法:提问、解释和真正理解图表上的数字实际上在说什么的有用技巧。

引用:

但是你如何质疑政府的统计数据呢?你只是不停地检查一切。找出他们是如何收集数据的。确定您是否看到了图表上需要看到的所有内容。但不要完全放弃数字,因为如果你这样做,我们将在黑暗中做出公共政策决定,除了私人利益之外,什么都不用做。

链接

4.大数据是更好的数据

主题:大数据
演讲人:肯尼斯·库基尔,《经济学人》
理念的数据分析师:大数据为我们提供了以不同方式看待我们生活的世界的工具,它可以通过增强机器学习等技术工具来解决人类最大的一些难题。

引用:

我们现在需要重新审视“我”这个信息,它不太明显,但在某些方面更重要。人类最终可以从收集到的信息中学习,这是我们了解世界和我们在其中的位置的永恒追求的一部分,这就是为什么大数据是一件大事。

链接

5.大数据中缺失的人类洞察力

ted.com

主题:大数据
演讲嘉宾 : Tricia Wang ,全球科技民族志学者
观点:揭开大数据及其弊端的神秘面纱,建议世界重视“厚数据”——来自人们的有价值、不可量化的见解——以做出推动成功的最佳商业决策。

引用:

让我们把大数据和厚数据结合起来。让我们带着圣贤的圣殿指南,无论这项工作发生在公司、非营利组织、政府,甚至是软件领域,所有这些都很重要,因为这意味着我们共同致力于创造更好的数据、更好的算法、更好的产出和更好的决策。

链接

6.你公司的数据可以结束世界饥饿

ted.com

主题:数据的价值
演讲人:UPS 高级技术组首席数据科学家 Mallory Freeman 博士
理念:私营企业如何通过捐赠未开发的数据而非金钱,为解决气候变化和世界饥饿等重大问题做出贡献。

引用:

数据慈善有很好的商业意义,也有助于人道主义世界的革命。如果我们在人道主义行动的所有主要方面协调规划和后勤,我们可以为成千上万的人提供食物、衣服和住所,公司需要站出来发挥作用,我知道他们可以在这场革命中发挥作用。

链接

7.谁控制着世界

ted.com

主题:复杂性理论
演讲人:瑞士科学家詹姆斯·b·格拉茨菲尔德
观点:关于复杂性的开创性研究,以及它如何揭示经济如何运作。以及权力如何集中在少数人手中造成了我们社会的脆弱性。

引用:

与金融、经济、政治、社会相关的想法经常受到人们个人意识形态的影响。

链接

播放列表

Clem Onojeghuo 在 Unsplash 上拍摄的照片

TED.com 网站上有很多精彩的播放列表,其中包括一系列与数据相关的演讲。从数据如何拯救生命的话题,到你在互联网上的数字足迹对你的影响。

1\. How data can save lives
2\. Making sense of too much data
3\. The dark side of data
4\. Art made of data
5\. What your data tells about you

1.数据如何拯救生命

一项关于我们可以做些什么来拯救每天聚集大量数据的世界的调查。

该播放列表包含 4 个讲座

[## 4 TED 谈论数据如何拯救生命

以下是数据如何拯救生命

www.ted.com](https://www.ted.com/playlists/495/how_data_can_save_lives)

2.理解太多的数据

现在是大数据时代。但是,我们到底该如何处理这些信息呢?这些演讲探索了理解近乎无限的数据的实用的、道德的——以及壮观的可视化的——方法。

该播放列表包含 5 个讲座

[## 理解太多的数据

这就是大数据时代

www.ted.com](https://www.ted.com/playlists/56/making_sense_of_too_much_data)

3.数据的阴暗面

数据可以用来做好事,用来推动社会进步,但也可能被滥用。了解大数据的一些隐藏的黑幕用途。

该播放列表包含 14 个讲座

[## 数据的阴暗面

以下是如何利用数据做好事…

www.ted.com](https://www.ted.com/playlists/130/the_dark_side_of_data)

4.数据构成的艺术

看到模式,创造美——数据可视化已经成为一种艺术形式。会见前卫艺术家,他们使用电子表格、档案和数字数据作为他们的颜料和画布。

该播放列表包含 5 个讲座

[## 由数据构成的艺术

以下是数据如何被用于观察模式和创造美

www.ted.com](https://www.ted.com/playlists/201/art_from_data)

5.你的数据揭示了你的什么

你在网上分享的东西会比你想象的暴露更多吗?通过这些见解深刻的谈话,探索你的个人数据对你的影响。

该播放列表包含 10 个讲座

[## 10 TED 谈论你的数据揭示了你的什么

以下是你在网上的数字足迹如何揭示你的

www.ted.com](https://www.ted.com/playlists/374/what_your_data_reveals_about_y)

行动计划

由 Unsplash 上的 Ragnar Vorel 拍摄

T4:当你感到筋疲力尽,或者感到乏味时,去看看 TED 演讲。我发现 TED 演讲非常有教育意义和鼓舞人心,激励我继续朝着我的激情努力。

这些数据科学策划的 ted 演讲对于那些寻找数据及其在这个以人类为中心的时代的潜力的直观解释的人来说是有益的。此外,它们为未来提供了深刻的见解。

所以,不要在 Instagram 上翻来翻去,也不要看《网飞》,现在就去听一场 TED 演讲,做些笔记,花些时间反思并思考它如何应用到你的生活中。知识就像复利,学得越多,积累得越多。因此,让观看 TED 演讲成为一种日常习惯。你未来的自己会感谢你。

感谢您花时间阅读这篇文章,我希望它能激励您学习并帮助您更好地理解我们身边每天都在传播的指数数据。

请在评论中留下我错过的任何其他 TED 视频!

看看我的文章!

[## 机器学习和数据科学的 20 大网站

这里是我列出的最好的 ML 和数据科学网站,可以提供有价值的资源和新闻。

medium.com](https://medium.com/swlh/top-20-websites-for-machine-learning-and-data-science-d0b113130068)

联系人

如果你想了解我的最新文章,请关注我的媒体。

其他联系方式:

  • 领英
  • 推特
  • GitHub
  • Reddit

快乐学习!

可视化比例的最佳方法

原文:https://towardsdatascience.com/best-ways-to-visualize-proportions-956218c7d164?source=collection_archive---------35-----------------------

可视化比例数据的三个关键图表

图片来自 Pixabay 的 Monfocus

比例数据示例

无论您的数据分析和数据科学应用是什么,到处都有比例。比例是关于理解组成一个整体的不同部分。

比例很大程度上只是给定分类变量中某事物的计数。这可能是不同行业的客户数量、不同地区的销售电话数量、各种活动类型的活动数量,或者各种口味的冰淇淋甜筒的销售数量。如果你能数出来,并把它分成几组,那么你就得到了比例数据!

基本比例可视化

无论你是否熟悉“探索性数据分析”的概念;基本统计数据的简单绘图对任何分析都非常有帮助,尤其是当你正在建立理解的基础,这将通知你更复杂的分析。

甜蜜的想象

我将分解三种分析比例的可视化类型,它们将被证明是非常有用的:饼图、华夫饼图和条形图(想象它们实际上是枫糖条形图或糖果条形图,以“糖果”为主题)

馅饼时间

饼图的陷阱

  • 显示角度和偏移角度的比例;会使饼图很难解释
  • 一旦你在一个给定的馅饼中得到超过 3-5 个类,就很难比较相对比例——这里的全部目的…
  • 好吧,让我们说是的,你可以对你的分类变量的任何给定水平或值的一般分配有一个概念…但是我们经常缺乏精确性,或者对任何给定的值集之间的差异的精确考虑。

使用饼图的可取之处

  • 相反,饼状图对房地产来说是惊人的。它们很小,可以在一个小空间里包含大量的信息,而不是占用大量的空间。
  • 根据你的受众,饼状图可以很容易让不知情的群体快速吸收一个给定的想法。

我们开始吧!

从使用 mtcars 数据集的组开始,让我们构建一个饼图。

首先,安装并加载ggplot2 (install.packages('ggplot2),然后是库(ggplot2),然后你就可以开始比赛了)

ggplot的快速故障,

  • 首先包括您正在处理的数据框架,在本例中是 mtcars
  • 然后指定aes()-thetics……也就是你希望不同的变量出现在图上的地方
  • 第一个是 x,所以不管你的分类变量是什么,你的桶,你的容器,你的冰淇淋口味;加在那里。

从这里开始,在底部抛出geom_bar(),让你确切地知道你想要看到什么类型的图表。我们将直接进入语法,但是使用ggplot,您可以有效地创建可视化对象,然后告诉该对象您想要如何使用它。

首先给你一个数据的快速概念;下面你可以看到我们正在按 cylinders 变量分组,并计算每个变量中的记录数。

counts <- mtcars %>%
  group_by(cyl) %>%
  summarise(n = n())

让我们把它扔进馅饼里!

ggplot(counts, aes(x = 1, y = n, fill = cyl)) +
  geom_col()+
  coord_polar(theta = 'y')

嘣!这是你的第一张饼状图。你会看到,无论你分组的分类变量是什么,都进入了颜色,而我写的计数或 n 进入了 y 美学。

你可能还会注意到geom_col()命令和coord_polar()

为了说明coord_polar()的目的,我将只运行geom_col()

ggplot(counts, aes(x = 1, y = n, fill = cyl)) +
  geom_col()

如您所见,这是一个堆积条形图,其中包含了相关部分。打开coord_polar(theta = 'y'),我们就可以将这个柱状图打包成一个饼状图。

馅饼的绝佳替代品?华夫饼!

好吧,所以你不喜欢派…华夫饼图表是一个很好的选择。虽然华夫饼图表类似于饼图,但它们实际上将分类变量的每个级别、类别或值编码为正方形的比例。

华夫饼图表的陷阱

  • 与饼图类似,华夫饼干图很快会因为包含太多的类而陷入困境
  • 绝对不要尝试分割华夫饼或饼状图..这不利于对“相对比例”进行合理的比较,而“相对比例”才是全部目的。

要为华夫饼图表准备数据,您需要将数值缩放到 1–100,加起来就是 100。为此我们将使用dplyr ( install.packages('dplyr')library(dplyr))。

您将在下面看到的是,我们根据分类对数据集进行分组,然后根据计数或n()进行总结。然后,我们使用mutate创建一个名为 percent 的新变量。这里最重要的是在我们的mutate()函数中,我们正在创建这个缩放到 100 的值。

我们将设置 case_counts 的名称,然后运行waffle()

count <- mtcars %>%
  group_by(cyl) %>%
  summarise(n = n()) %>% 
  mutate(percent = round(n/sum(n)*100))case_counts <- count$percent
names(case_counts) <- count$cylwaffle(case_counts)

好了,我们上路了!

让我们用条形图来总结一下

对很多东西来说,棒线只是更好地建立了价值与价值的相对可比性。让我们展开馅饼,把它扔进酒吧。还要注意,这不是直方图。我们将气缸数视为一个分类变量。

library(ggplot2)
ggplot(mtcars, aes(x = as.factor(cyl))) +
  geom_bar()

堆积条形图的最佳实践:不要孤立地制作它们,三个以后就没什么用了

关键是被比较的整体都共享同一个 y 轴

需要记住的是,任何超过三个变量的东西都很难解释。

为了对你的条形图重新排序,你需要确保分类变量是一个因子as.factor(),然后改变级别到你想要的显示顺序

Ggplot 根据它在数据集中看到变量的顺序对条形图和图例进行排序。要覆盖这一点,将 disease 列转换成一个带有levels的因子,按照我们希望我们的图使用的顺序。

mtcars %>%
  factor(levels = c('2', '4', '6'))

这在组织你的情节以优化解释能力时经常会起到很大的作用

结论

享受使用比例图表和分类相关数据可视化的乐趣。随着您熟悉不同的图表技术,考虑不同的图表工具作为您可能在给定的数据类型和情况下使用的工具会对您有好处。

祝数据科学快乐!别忘了关注我的博客,获取更多与机器学习、数据可视化、数据争论和所有数据科学相关的博客!datasciencelessons.com。

贝塔分布——直觉、例子和推导

原文:https://towardsdatascience.com/beta-distribution-intuition-examples-and-derivation-cf00f4db57af?source=collection_archive---------0-----------------------

何时使用 Beta 版

贝塔分布是关于概率 T3 的概率分布。例如,我们可以用它来模拟概率:你的广告的点击率,客户在你的网站上实际购买的转化率,读者为你的博客鼓掌的可能性,特朗普赢得第二个任期的可能性,乳腺癌女性的 5 年存活率,等等。

因为贝塔分布模拟一个概率,所以它的范围在 01 之间。

1.为什么 Beta 发行版的 PDF 看起来是这样的?

维基百科摘录

直觉是什么?

我们暂且忽略 系数 1/B(α,β) 只看分子x(α-1)*(1-x)(β-1)因为 1/B(α,β) 只是一个归一化常数使函数积分为 1。

然后,分子中的术语——x 的乘方乘以 1-x 的乘方——看起来很熟悉。

我们以前见过这个吗?

👉是的。在二项分布中。

当我们从二项分布的角度来看时,对贝塔分布的直觉开始发挥作用。

X ~二项式(n,p)与 X ~β(α,β)

二项式和贝塔式的区别在于前者模拟成功的次数(x),而后者模拟成功的概率(p)。

换句话说,概率是二项式中的一个参数;在 Beta 中,概率是一个随机变量

α、β 的解释

你可以把 α-1 想成成功的次数,把 β-1 想成失败的次数,就像二项式中的 n & n-x 项一样。

您可以选择α和β参数,但您认为它们应该是。如果你觉得成功的概率很高,就说 90%,对α 设 90,对β设 10。如果你不这么想,β90,α10。

随着 α 变大(更多成功事件),大部分概率分布将向右移动,而 β 的增加将分布向左移动(更多失败)。

同样,如果 αβ 都增加,分布将变窄,因为我们更加确定。

2.例子:概率的概率

假设某人同意和你约会的可能性遵循贝塔分布,其中 α = 2, β = 8。你的成功率大于 50%的概率是多少?

P(X>0.5)=1-CDF(0.5)= 0.01953

不好意思,很低。😢

爱荷华大学的 Bognar 博士制作了 Beta 分布的计算器,我觉得它既有用又漂亮。您可以试验不同的 αβ 值,并想象形状如何变化。

3.为什么我们使用贝塔分布?

如果我们只想用概率分布来模拟概率,那么(0,1)上的任意分布都可以。创建一个应该很容易。随便取一个在 0 到 1 之间的任何地方都不会爆炸并保持正值的函数,然后从 0 到 1 积分,简单地用那个结果除函数。你只是得到了一个概率分布,可以用来模拟概率。既然如此,为什么我们坚持使用贝塔分布而不是任意概率分布呢?

贝塔分布有什么特别之处?

贝塔分布是贝叶斯推理中伯努利分布、二项式分布、负二项式分布和几何分布的共轭先验(看起来那些是涉及成功&失败的分布)。

使用共轭先验计算后验概率是非常方便的,因为可以避免贝叶斯推理中涉及的昂贵的数值计算。

如果你不知道共轭先验或贝叶斯推理是什么,
先看

[## 贝叶斯推理——直觉和实现

贝叶斯推理的艺术在于你如何实现它...](https://medium.com/@aerinykim/bayesian-inference-intuition-and-example-148fd8fb95d6)

然后

[## 共轭先验

有两件事使得后验计算很昂贵。首先,我们计算每一个…](https://medium.com/@aerinykim/conjugate-prior-explained-75957dc80bfb)

作为一名数据/ML 科学家,你的模型永远不会完整。随着更多数据的到来,你必须更新你的模型(这就是为什么我们使用贝叶斯推理)。
贝叶斯推理中的计算可能非常繁重,有时甚至难以处理。但是如果我们可以使用共轭先验的封闭公式,计算就变得轻而易举了。

在我们的日期接受/拒绝示例中,beta 分布是二项式可能性之前的共轭分布。如果我们选择使用贝塔分布作为先验,在建模阶段,我们已经知道后验也将是贝塔分布。因此,在进行了更多的实验(请更多的人和你去约会)之后,你只需将接受和拒绝的次数分别加到现有的参数α,β上,就可以计算出后验概率,而不用将可能性乘以先验分布

4.贝塔分布非常灵活。

贝塔分布的 PDF 可以是有渐近端的 U 型,钟型,严格递增/递减甚至直线。当您改变 αβ 时,分布的形状也会改变。

a .钟形

请注意, α = 8 和 β = 2 的 PDF 图形是蓝色的,而不是读取的。x 轴是成功的概率。

如果 α + β 足够大并且α & β近似相等,则β分布的 PDF 近似正态。

b .直线

测试版 PDF 也可以是直线!

c. U 形

α < 1,β < 1,β的 PDF 为 U 型。

形状背后的直觉

为什么 Beta(2,2)是钟形的?

如果你把 α-1 想成成功的次数,把 β-1 想成失败的次数β(2,2) 表示你得到了 1 次成功,1 次失败。所以成功的概率最高为 0.5 是有道理的。

此外, Beta(1,1) 意味着头部和尾部都是零。那么,你对成功概率的猜测在整个[0,1]中应该是一样的。水平直线证实了这一点。

对于 Beta(0.5,0.5)有什么直觉?

为什么是 U 型?头尾为负(-0.5)是什么意思?

这个我还没有答案。我甚至在 Stackexchange 上问过这个问题,但还没有得到回复。如果你有关于 U 型 Beta 的好主意,请告诉我!

下面是生成上面美丽图形的代码。

5.经典推导:顺序统计量

我在学校学贝塔分布的时候,是从顺序统计量推导出来的。顺序统计并不是 Beta 分布最广泛的应用,但是它帮助我更深入地思考这个分布并更好地理解它。

x1x2,。。。、 X_n 为 iid 随机变量,PDF f ,CDF F

我们按照升序重新排列它们,这样 X_k 就是第 k 个最小的 X ,称为第 k 阶统计量

a.最大 X 的密度是多少?

(不熟悉“密度”这个术语?阅读“PDF 不是概率”

b.k 阶统计量的密度是多少?

注意,我们不需要选择也不需要排列比 x 大的 X s。

c.如何利用 k 阶统计量推导出贝塔分布?

如果我们设置 X_1X_2 ,,会发生什么?。。, X_n 为 iid 均匀(0,1)随机变量?

为什么统一(0,1)?因为β的定义域是[0,1]。

均匀分布(0,1)的 CDF 为 x

在这里,我们有测试版!

6.β函数作为归一化常数

我之前提议过:

我们先忽略系数 1/B(α,β) …因为 1/B(α,β) 只是一个归一化常数使函数积分到 1。

要使β的 PDF 积分为 1, B(α,β)的值应该是多少?

B(α,β) 的值应该是多少?

B(α,β)从 0 到 1 的βPDF图下的面积。

7.用伽玛函数简化贝塔函数!

这一部分是给像我这样的瘾君子看的。

你可能已经看到了根据伽马函数的编写的测试版 PDF。β函数是每个参数的γ函数的乘积除以参数总和的γ函数的比值。

维基百科摘录

怎样才能证明 B(α,β)=γ(α)*γ(β)/γ(α+β)?

让我们以 αβ 为整数的特殊情况为例,从我们上面推导的内容开始。

我们得到了一个递归关系 B(α,β) = (α-1) * B(α-1,β+1) / β。

我们应该如何利用这种关系?

我们可以试着得到基本情况 B(1,*)。

证明得很漂亮!

心理科学更好的方框图

原文:https://towardsdatascience.com/better-boxplots-for-psychological-science-5fbe552b2eef?source=collection_archive---------33-----------------------

介绍

随着“复制革命”开创了行为科学数据透明的新时代,期刊编辑正在寻找不仅仅传达样本均值的数据可视化。

嗒哒!进入箱线图。因为它捕获了如此多方面的数据,所以箱线图有机会满足您所有的数据可视化需求。

唉,正常的盒子情节是不够的。主要原因是经典的箱线图倾向于描绘诸如中位数和四分位距之类的东西——不用于生成统计推断的数据方面。

盒子情节需要改头换面。

在本文中,我介绍了一个名为my_boxplot的函数,它创建了一个“现代”箱线图,显示与统计推断相关的样本统计数据。它提供了各种各样的论点,让您可以轻松地定制您的情节。

总的来说,目的是帮助每个人轻松地在 r 中制作透明且信息丰富的盒状图。

本帖是“我的 _ 函数” 文章系列 的第二篇,呈现简单的函数,方便 R 初学者对数据的分析和可视化。第一个帖子使得 运行和打印线性回归的结果 。本文中的所有代码,连同函数脚本,都可以在我的 github 资源库 中找到。

背景

如果你和我一样,你第一次遇到盒子情节是在中学。在经典盒图中,盒中心代表组中值;方框边缘分别反映了第一个和第三个四分位数临界值的值;触须表示异常值的商定值(远离中值的两个四分位数范围)。

作者图片

在 R 的 ggplot()中创建时,盒状图通常如下所示:

require(tidyverse)ggplot(iris, aes(x = Species, y = Sepal.Width)) +
  geom_boxplot()

ggplot 箱线图的默认设置。图片作者。

在上图中,我使用了iris数据集来绘制不同鸢尾物种的萼片宽度。如你所见,刚毛藻似乎有最大的萼片宽度。我们还注意到 setosa 和 virginica 样本中的一些异常值。

缺点

传统上构建盒状图的问题在于,当涉及到行为科学时,它们没有告诉你任何你需要知道的东西。例如,在上面的图中,没有办法容易地目测物种之间的差异是否具有统计显著性。唯一容易推断出这一点的方法是,如果你有每个样本的标准误差或置信区间。经典的盒子剧情,这些都没讲!

重新思考盒子情节

为了社会科学的目的,是时候重新考虑盒子情节了。通过创造我们称之为“现代箱线图”的东西来做到这一点现代箱型地块的布局如下:

现代盒子情节

  • 框中心:样本均值
  • 盒边:平均值的标准误差
  • 盒须 : 95%置信区间

通过这种方法,我们可以通过我们过去学过的标准目测过程,获得关于两个样本是否有显著差异的所有信息。它也比解决这个问题的其他 方法更干净、更美观。

该功能

我创建了一个名为my_boxplot的函数,它允许您使用 R 和 ggplot()快速生成现代盒图。该函数包括几个参数,允许您自定义盒状图的外观。所有代码都可以在我的 github 库中获得。

让我们从最简单的版本开始,这将有助于我们看到函数的默认设置。这个函数调用iris数据集,它内置于 base R 中

my.boxplot(iris, 
           x = "Species", 
           y = "Sepal.Width")

my_boxplot 的默认输出。图片作者。

该图描绘了与从 ggplot 默认设置中获得的信息非常不同的信息。具体来说,方框显示的是组平均值;方框边缘反映平均值的标准误差;盒须反映了 95%的置信区间,所有单独的数据点通过geom_dotplot方法显示。

这样做的一个直接好处是,你可以很容易地看出两个平均值之间的差异是否显著。具体来说,我们可以说 setosa 样本明显大于任何其他物种。

调用my_boxplot自动将两条有用的信息打印到控制台:一是显示每个盒子级别精确值的汇总表;第二,单向 ANOVA 检验样本均值之间的差异是否显著。

当您进行数据探索时,将这些元素自动打印到控制台可以节省大量时间

在下一部分,我将解释在引擎盖下发生了什么。

它是如何工作的

my_boxplot调用my_summary函数,该函数生成相关信息的表格,包括平均值和置信区间的标准误差。然后,它通过使用反映这些参数的自定义值调用geom_boxplot函数来绘制这些信息。

my_boxplot还包括许多参数,允许对你的盒子图的外观进行几乎无限的定制,我将在下一节中介绍。

定制输出

所以你想让你的方框图漂亮。或者您想调整输出的某些方面。my_boxplot允许使用许多不同的参数来定制您的方框图的外观和感觉。

显示数据

也许最重要的是,my_boxplot允许你定制你想要的单个点在你的图形中出现的方式。我提供了三种不同的设置供您选择:“点图”(默认)、“抖动”和“计数”您也可以关闭数据点。

代码如下:

my.boxplot(iris, 
           x = "Species", 
           y = "Sepal.Width",
           points = "none")my.boxplot(iris, 
           x = "Species", 
           y = "Sepal.Width",
           points = "jitter")my.boxplot(iris, 
           x = "Species", 
           y = "Sepal.Width",
           points = "count")

points = "none "、" jitter "和" count "的 my_boxplot 输出作者图片。

标签和颜色

您可以自定义 x 轴和 y 轴标签,以及框填充颜色。这里我也自定义抖动点的高度。在下面的例子中,我使用mtcars数据集来绘制不同气缸(4、6 或 8)的汽车每加仑行驶的英里数。

注意,对于 mtcars 数据集,我必须将cyl转换成一个因子,然后才能将其插入my_boxplot所需的(分类)x 轴。我还使用了管道 %>%操作符:这是magrittr包中的一个救命特性,允许您以直观的方式将函数串在一起。

fills <- c("#838B8B", "#E0EEEE", "#79CDCD")mtcars %>% mutate(cyl = factor(cyl)) %>% 
  my.boxplot(x = "cyl",
             y = "mpg",
             points = "jitter",
             jitter.height = 0,
             xlab = "Cylinders",
             ylab = "Miles Per Gallon",
             fill = fills)

带有自定义填充颜色和轴标题的 my_boxplot。图片作者。

附加参数

篇幅不允许我展示函数中的所有参数,您可以使用这些参数来定制您的盒状图的外观。这里是函数参数的完整列表(如果您希望我在函数脚本中添加其他参数,请告诉我!):

  • xlab : x 轴标题
  • ylab : y 轴标题
  • width:框宽
  • fill:填充颜色
  • alpha:框透明
  • jitter.height:垂直抖动量。宽度预设为条形宽度的 1/8。
  • ci:你想要的置信区间宽度。例如,您可以将设置为 90% (.9)或 99% (.99)
  • points:默认:"dotplot”其他选项:"none”"count”"jitter”
  • text.angle:这是 x 轴标签的角度。例如,如果需要适合长标签,请设置为 45。默认值= 0。
  • text.size:轴标题文本大小。默认值= 12。

更多定制

该函数(以及一般的 ggplot)的优点是,在调用该函数后,您总是可以在图形输出中添加限定符,就像向 ggplot 对象添加元素一样。在这里,我决定翻转坐标,并为图表添加一个标题。我还调整了盒子的宽度,以获得更具吸引力的外观:

my.boxplot(iris, 
           x = "Species", 
           y = "Sepal.Width",
           width = .5) +
  coord_flip() +
  ggtitle("Species and sepal width") +
  theme(plot.title = element_text(hjust = 0.5)) # center title

图片作者。

分组箱线图

行为科学经常关注两个变量之间的统计交互作用。所以有一个绘图选项是很有用的,它包括绘制交互和结果统计的能力。输入my_grouped_boxplot。这个函数包含了它更简单的同类函数的所有功能,但是允许您包含一个额外的双向交互变量。(此处见脚本。)

这里我们使用内置的 R 数据集 ToothGrowth,它包含了一项研究不同剂量的维生素 C(“剂量”)和补充类型(“supp”)对豚鼠牙齿生长(“len”)的影响的实验结果。

ToothGrowth %>% mutate(supp = factor(supp, 
                                     labels = c("Orange Juice", 
                                                "Ascorbic Acid")),
                       dose = factor(dose)) %>% 
  my_grouped_boxplot(x = "dose",
                     y = "len",
                     group = "supp",
                     xlab = "Vitamin C Dose (mg/day)",
                     ylab = "Tooth Length") +
  labs(fill = "Delivery Method")

图片作者。

这个函数带有基本版本中所有相同的参数。有益的是,我们还可以自动获得带有交互项的完整 2 x 2 方差分析的输出,以评估显著性。

结束语

本文的目的是提供一些方便的代码,用于轻松创建更适合心理科学的箱线图,因为它们可以轻松地比较均值和置信区间。

其他人已经开发了许多其他的方法来做这件事;例如,我的同事比利·布雷迪(Billy Brady)编写了一个脚本,用于创建一个定制的点状图(T1),以及其他一些方便的方法(T3),用于框状图可视化。

如果您在代码中遇到任何错误,或者您希望与我交流我在这里提供的任何信息,请联系我,我很乐意收到您的来信!你可以在这里找到我的电子邮件地址。

引用本文:尤德金,d . a .(2020 年 10 月)。"心理科学更好的方框图."中等。检索自https://medium . com/@ dyudkin/better-box plots-for-psychological-science-5 FBE 552 B2 eef。

关于作者

我是宾夕法尼亚大学社会和行为科学倡议的行为科学家,也是More Common的研究助理主任。我研究道德和政治极化。你可以在我的网站找到更多关于我工作的信息。

更好的数据加载:表格数据的 PyTorch 速度提高了 20 倍

原文:https://towardsdatascience.com/better-data-loading-20x-pytorch-speed-up-for-tabular-data-e264b9e34352?source=collection_archive---------10-----------------------

一个简单的改变可以大大加快你的深度学习训练

深度学习:对速度的需求

在训练深度学习模型时,性能至关重要。数据集可能非常庞大,低效的训练意味着更慢的研究迭代、更少的超参数优化时间、更长的部署周期和更高的计算成本。

尽管如此,很难证明投入太多时间来加快速度是合理的,因为有许多潜在的死胡同需要探索。不过还好有一些速战速决的可用!

我将向您展示我在 PyTorch 中对表格数据的数据加载器所做的一个简单更改如何将训练速度提高了 20 倍,而没有对训练循环做任何更改!只是 PyTorch 标准数据加载器的简单替代。对于我看到的模型,16 分钟的迭代时间减少到了 40 秒!

并且不需要安装任何新的包,不需要进行任何底层代码更改,也不需要更改任何超参数。

研究/行业脱节

在监督学习中,快速浏览一下 Arxiv-Sanity 告诉我们,目前的顶级研究论文要么是关于图像的(无论是分类还是生成的 GANs),要么是文本的(主要是 BERT 的变体)。这些在传统机器学习没有机会的领域非常棒——但需要专业知识和大量的研究预算才能很好地执行。

另一方面,许多公司持有的大部分数据已经以漂亮的表格形式存在于数据库中。一些例子包括终身价值评估、点击优化和金融时间序列数据的客户详细信息。

表格数据有什么特别之处?

那么,为什么研究和工业之间的裂痕对我们来说是个问题呢?嗯,最先进的文本/视觉研究人员的需求与那些在表格数据集上进行监督学习的研究人员的需求非常不同。

表格形式的数据(即数据库表、Pandas 数据帧、NumPy 数组或 PyTorch 张量)在几个方面使事情变得更简单:

  1. 通过切片,可以从连续的内存块中获取训练批次。
  2. 没有每个样本的预处理成本,允许我们充分利用大批量训练来获得额外的速度(记住要提高学习率,这样我们就不会过度适应!).
  3. 如果你的数据集足够小,它可以一次性加载到 GPU 上。(虽然这在技术上对于文本/视觉数据也是可能的,但是那里的数据集往往更大,并且一些预处理步骤在 CPU 上更容易完成)。

这些优化对于表格数据是可行的,而对于文本/视觉数据是不可行的,因为有两个主要的不同之处:模型和数据。

模型:视觉研究倾向于使用大型深度卷积神经网络(CNNs 文本倾向于使用大型递归神经网络(rnn)或变压器;但是对于表格数据,简单的全连接深度神经网络(FCDNN)可以做得很好。虽然并非总是如此,但一般来说,视觉和文本模型需要更多的参数来学习比表格数据中变量之间的交互更细微的表示,因此向前和向后传递可能需要更长的时间。

数据:视觉数据往往被保存为充满图像的嵌套文件夹,这可能需要大量的预处理(裁剪、缩放、旋转等)。文本数据可以是大文件或其他文本流。这两者一般都会保存在磁盘上,从磁盘上批量加载。这不是问题,因为磁盘读/写速度不是这里的瓶颈—预处理或向后传递才是。另一方面,表格数据有一个很好的特性,可以很容易地以数组或张量的形式加载到连续的内存块中。表格数据的预处理往往是预先单独完成的,要么在数据库中进行,要么作为对数据集的矢量化操作进行。

不同类型监督学习研究的比较

PyTorch 和数据加载器

正如我们所看到的,加载表格数据真的非常容易和快速!因此,PyTorch 在默认情况下对表格数据非常有效……对吗?

原来不是!😩

就在上周,我在一些表格数据上训练 PyTorch 模型,并想知道训练需要这么长时间。我看不到任何明显的瓶颈,但出于某种原因,GPU 的使用率远低于预期。当我深入分析它时,我发现了罪魁祸首… 数据加载器

什么是数据加载器?数据加载器做的事情与您想象的完全一样:它们将您的数据从任何地方(磁盘上、云中、内存中)加载到您的模型需要使用它的任何地方(RAM 或 GPU 内存中)。除此之外,他们还负责将您的数据分成不同的批次,进行重组,并在必要时对单个样本进行预处理。将这些代码封装在一个数据加载器中比分散在各处要好,因为这样可以让您的主要训练代码保持整洁。【PyTorch 官方教程也推荐使用数据加载器。

你如何使用它们?这取决于您拥有的数据类型。对于表格数据,PyTorch 的默认数据加载器可以接受一个 TensorDataset。这是训练所需张量的轻量级包装器,通常是 X(或特征)和 Y(或标签)张量。

data_set = TensorDataset(train_x, train_y)
train_batches = DataLoader(data_set, batch_size=1024, shuffle=False)

然后,您可以在训练循环中使用它:

for x_batch, y_batch in train_batches: optimizer.zero_grad() loss = loss_fn(model(x_batch), y_batch) loss.backward() optimizer.step() ...

为什么这样不好?这个看起来不错,当然也很干净!问题是,每次加载一个批处理时,PyTorch 的 DataLoader 对每个示例调用一次数据集上的__getitem__()函数,并将它们连接起来,而不是一次性读取一个批处理作为一个大块!所以我们最终没有利用我们的表格数据集的优势。当我们使用大批量时,这尤其糟糕。

我们如何解决这个问题?简单——用下面的两行替换上面的前两行,并从这个文件中复制FastTensorDataLoader的定义(这要归功于杰西·穆,对于这个答案在 PyTorch 论坛上):

train_batches = FastTensorDataLoader(train_x, train_y, batch_size=1024, shuffle=False)

FastTensorDataLoader只是一个小型的定制类,除了 PyTorch 之外没有其他依赖——使用它不需要对你的训练代码做任何修改!它也支持混排,尽管下面的基准是针对非混排数据的。

这有什么区别?在我使用的基准测试集上,定制表格数据加载器的速度比基准测试快了 20 倍。在这种情况下,这意味着 10 个历元的运行不再需要 15 分钟,而是需要不到 40 秒——迭代速度的巨大差异!

两次几乎相同的跑步——除了一次超过 15 分钟,另一次不到一分钟!

这个基准测试是在的这篇自然论文中使用的希格斯数据集上运行的。它有 1100 万个示例,是比大多数公共表格 ML 数据集(可能很小)更真实的深度学习基准。).这是一个二元分类问题,有 21 个实值特征。很高兴看到,在进行任何超参数优化之前,我们可以在短短 40 秒的训练时间内,在测试集上达到超过 0.77 ROC AUC!虽然我们离报纸上的 0.88 还有一段距离。

我希望这有所帮助,并且你能够在你自己的训练代码中看到类似的速度提高!在实现了这一点之后,我发现了一些进一步的优化,导致了接近 100 倍的总加速!如果你想看更多,请留下评论,我们可以在后续文章中讨论这些内容。

关于如何自己运行基准代码,请参见附录。该示例包括运行默认 PyTorch 数据加载器(更快的自定义加载器)的代码,以及对结果进行计时和记录到 TensorBoard 的代码。

这篇文章是在 创世纪云 的计算能力的帮助下完成的:云 GPU 以令人难以置信的成本效率运行在冰岛的一个数据中心,使用 100%可再生能源。 注册 即可获得 50 美元的免费积分,让你在 GTX 1080Ti 上驾驶超过 160 小时!

关于作者:Harald 从事股票分析师工作超过八年,目前是一名自由研究员和作家。他的个人博客在www.harald.co。他经营着 ML 竞赛——一个正在进行的机器学习竞赛的目录——以及一个 云 GPU 比较 站点。

同一作者:

  • 为你的云深度学习工作流程增压的五个工具
  • 如何用 OpenAI 健身房正确设置随机种子
  • 2022 年机器学习顶级云 GPU 提供商

附录:运行基准测试

所以你可以自己看看结果,这是复制实验的说明。如果您已经安装了本地 GPU 和 PyTorch,您可以跳过前两步!

  1. 用你最喜欢的 GPU 云提供商创建一个新的 Ubuntu 18.04 实例(我用的是Genesis cloud——你注册时可以获得 100 美元的免费积分,这足够运行这个实验几百次了!).

2.使用 Lambda Stack 一气呵成的安装 CUDA 和 PyTorch:(做完这个别忘了重启!)

LAMBDA_REPO=$(mktemp) && \
wget -O${LAMBDA_REPO} [https://lambdalabs.com/static/misc/lambda-stack-repo.deb](https://lambdalabs.com/static/misc/lambda-stack-repo.deb) && \
sudo dpkg -i ${LAMBDA_REPO} && rm -f ${LAMBDA_REPO} && \
sudo apt-get update && \
sudo apt-get — yes upgrade && \
sudo apt-get install — yes — no-install-recommends lambda-server && \
sudo apt-get install — yes — no-install-recommends nvidia-headless-440 nvidia-utils-440 && \
sudo apt-get install — yes — no-install-recommends lambda-stack-cuda

3.下载数据集:

wget [http://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz](http://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz)

4.克隆存储库:

git clone [git@github.com](mailto:git@github.com):hcarlens/pytorch-tabular.git

5.运行基准脚本:

python3 pytorch-tabular/higgs_benchmark.py

如果你运行的是 GTX 1080 的实例,比如我使用的 Genesis Cloud,你应该会得到如下结果:

ubuntu@genesis:~$ python3 pytorch-tabular/higgs_benchmark.py
2020-04-12 15:05:55.961134: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0
Epoch 0 done.
Epoch 1 done.
Epoch 2 done.
Epoch 3 done.
Epoch 4 done.
Epoch 5 done.
Epoch 6 done.
Epoch 7 done.
Epoch 8 done.
Epoch 9 done.
Epoch 0 done.
Epoch 1 done.
Epoch 2 done.
Epoch 3 done.
Epoch 4 done.
Epoch 5 done.
Epoch 6 done.
Epoch 7 done.
Epoch 8 done.
Epoch 9 done.
Standard dataloader: 124.55s/epoch.
Custom dataloader: 5.24s/epoch.

使用蜂群图表实现更好的数据可视化

原文:https://towardsdatascience.com/better-data-visualization-using-beeswarm-chart-bb46a229c56b?source=collection_archive---------27-----------------------

让我们使用 D3.js 创建一个交互式蜂群图表,以便更好地可视化您的数据。

单个数据集可以用来向观众传达许多不同的信息。这完全取决于你如何可视化数据。换句话说,这取决于你选择哪种图表或图形。大多数时候,人们只是抓住一个条形图或饼图。然而,你可以用更有趣的图表或图形将数据中的信息传达给你的观众——其中之一就是蜂群图表

注:本文中的所有源代码(包括文档)都可以在 https://github.com/MartinHeinz/charts找到。

**现场试玩可在https://martinheinz.github.io/charts/beeswarm/进行

蜜蜂-什么?

第一次听说蜂群图?好吧,让我们先来谈谈它到底是什么:

**beesworm图表是一维图表(或绘图)——或者换句话说——在单个轴(通常是 X 轴)上显示所有信息的图表。它将值显示为类似于散点图的点的集合。

当您想要一次显示大量数据点时,这种图表非常有用,例如,每个国家一个节点,这对于条形图或饼图来说是个问题。想象一个有 150 个楔形的饼图——不,谢谢。

此外,这使得发现离群值变得容易,因为它们不会是群体的一部分。

此图表的另一个特点是,您可以很好地可视化不同的比例(线性和对数)以及它们之间的转换,并为点着色以添加额外的维度(例如,国家的大陆)。

说得够多了,让我们来看一个例子:

实际上,我们将在这里使用的数据集是什么?嗯,在 kaggle.com上可以找到世卫组织自杀统计数据。可能是奇怪的选择,嗯?实际数据非常符合这种图表。所以,让我们看看我们能把它用得多好!

我们需要什么

在深入研究代码之前,让我们看一下我们将使用的库:

对于所有的绘图和可视化,我们将使用 D3.js 和普通的旧 Javascript。如果你不熟悉 D3.js —它代表数据驱动文档,是操纵数据的 Javascript 库。D3.js 的主要优势在于它的灵活性——它给你的只是有效操作数据的函数。

在本文中,我们将使用 D3.js 第 5 版,你需要做的就是在你的 HTML 中包含<script src="https://d3js.org/d3.v5.min.js">(完整的代码清单在这里)。

除了 D3.js 我们还将使用材质设计精简版(MDL)来带来更好的用户体验。这是非常可选的,但每个人都喜欢一些花哨的材料设计按钮和下拉菜单,对不对?

类似于 D3.js ,我们只需要包含一个script标签就可以开始使用了——<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>(完整代码清单此处)。

代码

搭建舞台

在我们开始操作任何数据之前,我们首先需要做一些初始设置:

首先,我们为widthheightmargin定义了一些全局变量,以及 3 个数据结构,用于比例、数据测量和绘图图例,我们将在余下的代码中使用它们。我们还使用这些来定义图表的初始状态,它存储在chartState变量中。

接下来我们要定义的是图中所有节点(圆圈)的颜色:

为了创建一个配色方案,我们使用d3.scaleOrdinal来创建从域(洲名)到范围(色码)的映射。然后,我们将这些颜色应用于 CSS IDs,它们被赋予 HTML GUI 中的复选框。

现在我们进入实际图表的代码。以下几行将准备 SVG,这将是我们的绘图区域:

上面创建svg变量的第一个调用找到 ID 为svganchor<div>,并将我们之前定义的宽度和高度的 SVG 元素附加到它上面。接下来,我们创建一个名为xScale的函数——这个函数与前面使用的d3.scaleOrdinal非常相似。它还创建了域和范围之间的映射,但域是连续的,而不是离散的。您可能已经注意到了,但是我们没有在这里指定域——这是因为我们还不知道数据集的范围,所以我们暂时保留它的默认值([0, 1])。

之后,我们将<g>元素容器添加到现有的 SVG 元素中。这个元素将被用作 X 轴及其刻度的容器——这些将在我们实际绘制线条时添加。然而,我们现在可以设置它的 CSS 样式并把它移到 SVG 的底部,这样我们以后就不必处理它了。

这段代码的最后部分创建了一条线,当鼠标悬停在所述圆上时,该线连接 X 轴上的节点和点。你可以在下图中看到:

在开始操作数据集之前,我们想做的最后一件事是创建简单的 noes 工具提示:

目前,工具提示只是我们放入图表锚中的一个<div>。我们也使它现在不可见,因为我们将在处理鼠标移动事件(悬停)时动态设置它的内容和不透明度。

加载数据

现在终于到了加载数据的时候了。我们使用d3.csv函数来实现。该函数使用 fetch API 从 URL 获取 CSV 文件,并返回 Promise ,这需要以下代码结构:

我们剩下的所有代码都属于上述匿名函数的主体,因为加载的数据在那里对我们可用。

以下是数据加载前后的示例,以便更好地显示其结构:

之前:

之后:

听众

在进一步处理数据之前,让我们首先设置侦听器,它将对 GUI 中的按钮点击做出反应。我们希望用户能够在可视化与【总量】【人均】测量以及线性或对数标度之间切换。

我们的 HTML GUI(源代码可以在这里找到)包含 2 组按钮。第一组——负责在“总数”“人均”之间切换,可视化附带了 CSS 类.measure。我们使用这个类来查询这组按钮,正如你在上面看到的。当单击这两个按钮中的一个时,我们获取被单击按钮的值,并相应地更改图表状态和图例文本,图例文本显示所使用的度量类型。

第二组(对)按钮在线性和对数刻度之间切换,也附加了 CSS 类(称为.scale)并且与前一组类似——基于哪个按钮被点击来更新图表的状态。

这两个侦听器还会触发整个图表的重绘,以反映配置更改。这是通过使用redraw功能来实现的,我们将在下一节中介绍。

除了这 4 个按钮,GUI 中还有几个复选框。点击这些过滤器,会显示各大洲的国家。

处理这些复选框点击是上述监听器的责任。它所做的只是触发filter函数,该函数根据哪些复选框被选中,哪些没有被选中,在选择中添加/删除节点。

我们这里的最后一个事件侦听器是一个大事件。当鼠标悬停在乡村圆圈上时,它会显示和隐藏工具提示:

上面的代码看起来可能很复杂,但实际上非常简单。我们首先使用.countries CSS 类选择所有节点。然后,我们将mousemove事件绑定到所有这些节点。在事件期间,我们设置 HTML 的工具提示来显示关于这个节点的信息(国家名称,死亡人数)。此外,我们改变它的不透明度,使它在用户指向圆圈时可见,并将其位置设置在鼠标光标的右侧。

该函数体的其余部分呈现连接圆和 X 轴的虚线,以突出显示值在刻度上的位置。

我们还需要处理当我们将鼠标移出圆圈时的事件,否则,工具提示和线条将总是可见的,这就是mouseout事件处理程序所负责的——它将这些元素的不透明度设置为0,使它们不可见。

这些事件侦听器很好,但是我们需要实际处理和绘制数据来使用它们。所以,让我们就这么做吧!

画下一切

大部分数据处理是在一个名为redraw的函数中完成的,我们在页面第一次加载时以及在各种事件中调用这个函数,我们在上一节中已经看到了。

该函数使用chartState来决定如何绘制图表。开始时,根据chartState.scale将刻度类型设置为线性或对数,并通过根据chartState.measure的值在数据集的totalperCapita列中查找最小/最大值来决定图表域的范围:

我们需要基于chartState创建的另一个东西是 X 轴。考虑到图表的方向,我们将使用底部轴(axisBottom)并给它 10 个刻度。如果我们要可视化总数,我们将使用带有 SI 前缀(s)和 1 个有效数字(.1)的十进制符号。否则,它将是定点符号(f),也有一个有效数字。

当轴和刻度准备好后,我们执行一个 1 秒钟的转换。在这 1 秒钟内,.call(xAxis)通过执行axisBottom发生器生成底部轴。

接下来是沿着 X 和 Y 轴将节点移动到其所需位置的模拟:

这是本文中比较复杂的片段之一,所以让我们一行一行地检查一下。在第一行,我们用指定的数据集创建模拟。在这个模拟中,我们应用定位力将节点沿着 X 轴推向期望的位置。该期望位置由xScale函数返回,该函数通过将【总计】【perca pita】列映射到图表的物理大小(范围)来计算。之后,我们使用strength函数提高模拟速度。

与我们沿 X 轴施加力的方式相同,我们也需要沿 Y 轴施加力,这一次将节点推向图表的中线。我们应用的最后一个力是碰撞力,它防止节点碰撞,更具体地说,它使它们的中心相距 9 个像素。最后,我们调用stop函数来停止模拟自动运行,而是在它下面的for循环中执行。

我们创建并运行了模拟,但是针对什么呢?嗯,由以下代码创建的节点(圆圈):

这里,我们首先查询所有节点,并将数据集中的国家名称连接到这些节点。接下来对exitenter选择的两个调用分别处理节点被移除和添加到选择中的情况(例如,复选框被勾选/取消勾选或页面被加载)。首先,对于退出选择,我们创建一个 1 秒钟的过渡,并将 X 轴上的中心点设置为零,将 Y 轴上的中心点设置为图表的中间。这样,当这些节点被添加回图表中时,它们将从单个点出来,就像您在演示中单击复选框时看到的那样。转换完成后,节点将被移除。

代码片段的其余部分——enter selection——实际上是设置节点的所有属性。我们设置它的 CSS 类,它的 X 轴和 Y 轴中心点,它的半径,并根据它所属的大陆用颜色填充它。然后,我们将这个选择合并到其余的节点(圆)中,并创建一个过渡,在接下来的 2 秒钟内将它们移动到所需的 X 和 Y 坐标。

结论

在本文中,我们深入研究了用 D3.js 实现蜂群图表。本文的要点不应该是这种特定的实现,而是下一次可视化数据时,您可能希望考虑非传统类型的图表和绘图,因为这可能有助于您更好地向受众传达所需的信息。

如果您想查看本文的完整代码清单,请访问我的知识库:https://github.com/MartinHeinz/charts。在这个报告中,您还可以找到使用的数据集和源,以及用 D3.js 实现的其他图表和绘图,就像这个平行坐标图(下一篇文章😉):

**本文最初发布于martinheinz . dev

* [## 用 Javascript 实现 2D 物理学

让我们在实现真实的 2D 物理模拟和可视化的同时享受一下 JavaScript 的乐趣吧!

towardsdatascience.com](/implementing-2d-physics-in-javascript-860a7b152785) [## 使用 PostgreSQL 的递归 SQL 查询

公共表表达式是 SQL 的一个鲜为人知的特性,它使得编写递归查询成为可能。

towardsdatascience.com](/recursive-sql-queries-with-postgresql-87e2a453f1b) [## 你可以用 GitHub API 和 Python 做的所有事情

GitHub REST API 允许您管理问题、分支、回购、提交等等,所以让我们看看您如何使用…

towardsdatascience.com](/all-the-things-you-can-do-with-github-api-and-python-f01790fca131)*

在石油和天然气勘探和生产中使用机器学习进行更好的决策

原文:https://towardsdatascience.com/better-decision-making-using-machine-learning-in-oil-and-gas-exploration-and-production-afbd39f2f98e?source=collection_archive---------27-----------------------

石油和天然气行业

石油和天然气是世界上最大和最重要的产业之一。它的范围不仅仅是为运输和发电提供燃料,而是支持这些活动和交易的众多服务。

根据2019财富全球 500 强,仅前 9 大石油天然气和能源公司创造的收入就达到了惊人的 3 万亿美元。

2019 年财富全球 500 强能源

原油价格的变化不仅仅是燃料价格的变化。食品、电力和消费品价格也将受到影响。为了寻找石油和天然气以满足不断增长的能源需求,地球物理学家收集并处理卫星图像,以检测地球重力和磁场的细微变化或异常,确定可能圈闭石油或天然气的岩石类型、地层和结构。探测到这些感兴趣的特征后,将使用能量波或地震波进行更详细的测绘。在海洋环境中,使用装备有能源的勘测船。能量源向水柱中反复发射压力波。在地面上,装有振动器的特殊卡车用于振动地面。在这两种情况下,能量源被发射到地下。这些波在岩石类型属性改变的界面上被反射。

如果附近有井可以获得现有的测井数据,地质学家和地球物理学家可以利用这些数据更好地开发现有和新地震剖面交叉的地质模型。不管是生产石油和天然气的井、干井还是废弃井,这些井都有可能是用放在钻孔中的地球物理传感器记录的。因此,地质学家可以对潜在油气储层的位置做出有根据的猜测。

测井

20 世纪 20 年代,法国兄弟康拉德和埃米尔·斯伦贝谢发明了一种被称为电缆测井的技术,开创了测井技术,这种技术至今仍在使用。他们后来成立了世界上最大的油田服务公司,斯伦贝谢公司。

电缆测井由测井车进行。嵌入有传感器以进行井下测量的金属圆筒被连接到电缆上,并被下放到井筒中。收集数据并传输到地面进行进一步分析。

钻井时,要仔细研究岩心样本、岩屑、测井记录和测试结果,以便尽可能多地了解井眼周围的区域。测井记录是一种收集有关已钻穿的地质地层的信息的手段,以确定地层深度、石油储量和许多其他关键信息。

我们经常想起大型石油公司获得的巨额收入和利润。事实上,从《财富》全球 500 强中获得的数据表明,这是千真万确的。然而,我们往往忽略了随之而来的巨大成本和高风险。事实上,并不是所有石油公司承担的项目都能盈利。或许,失败风险最大的领域莫过于该行业的上游勘探或生产部门。

多年来,石油和天然气技术和专业知识不断进步,勘探井的成功率从 1973 年的约 20%提高到 2012 年的约 70%。在油井中成功发现石油或天然气后,石油公司会在其附近钻探更多的油井。这些井被称为开发井。许多开发井没有 100%成功。

很可能一口井不经济,需要堵塞和废弃。关于是否完井或弃井的决定使其成为钻井过程中的一个点,称为套管点。这是钻井过程中的一个点,在此之后,油井已经到达目标储层,但是在生产套管已经安装和固井到位之前。

在本文中,我使用机器学习来解决这些挑战,方法是建立机器学习模型,从测井数据中预测经济上可行的油井或生产井。

机器学习平台

来自加利福尼亚州山景城的初创公司 H2O(www . H2O . AI)无人驾驶 AI (DAI) 的 AutoML 平台被用于根据测井数据预测经济上可行的油井。它内置了最先进的机器学习算法和可解释性功能。

戴为数据科学家配置机器学习实验提供基础和专家设置。在基本设置中有 4 个配置选项—准确性、时间、可解释性和计分器,如我之前发表的关于使用 DAI 解决 制药音乐 行业的业务挑战的两篇文章中所述。

简而言之,准确性决定了在执行 ML 训练时使用哪些 ML 算法、集成模型和交叉验证。时间选项根据允许的迭代次数指定了相对时间,但是如果存在收敛,DAI 可能会执行提前停止。可解释性选项影响数据转换的复杂性,进而影响其可解释性。更多信息可在 H2O 文档页面获得。

在该实验中使用了以下配置:

这个实验中使用的 H2O 无人驾驶人工智能设置

数据

本实验使用的大型 ASCII 标准(LAS) 格式的测井数据来自堪萨斯大学 堪萨斯地质调查局

堪萨斯地质调查局数据下载页面

数据处理

LAS 文件有两个部分。标题部分包含元数据和关于测量井的一般信息。数据部分包含油井中各种参数的实际测量值。

随后在 R 进行探索性分析,以获得初步见解和数据质量。为了简洁起见,本文不讨论数据争论和洞察的详细步骤。

编写了一个 python 程序来将 LAS 原始文件解析为 CSV,以便在用于机器学习实验之前进行进一步处理。

下图显示了 LAS 数据文件的结构。它有两个部分,一个标题和一个数据部分。来自数据部分的细节用于构建机器学习训练的最终表格。

将 Python 中的 LAS 文件解析为 CSV

标签策略

数据的状态 2 栏用作标记的基础。具有表明经济上可行的石油和天然气生产商的状态的井被标记为 is_producer = 1状态 2 列的值如下:

  • 生产
  • 重新完成
  • 转换为 EOR(强化采油)井
  • 转换为生产井

具有状态 2值的记录被认为在经济上不可行,并被标记为 is_producer = 0。

对标记数据的状态列进行了进一步研究,以识别不打算用于油气生产的井,如服务井。这些记录已从数据中删除。标签数据的 5% 被留出用于样本外评估。其余的以 80:20 的比例分成 ML 训练集和测试集。

探索性数据分析

在 ML 训练开始之前,研究了由 DAI 生成的可视化。以下可视化图形是关联图,用于显示特征之间的关联:

在相关图中,中度相关的要素显示为蓝色线条,而高度相关的要素显示为红色。这些都是潜在的泄漏。因此,特性 FEFCLWTLBNPRSPE仰角被排除在 ML 训练之外。

对所有特征进行了进一步的数据分布检查。那些只有单一值的,如下面的直方图所示,也被删除。

单值列的直方图示例

与 ML 训练无关的特征,如经度和纬度,海拔和其他几个被排除。

最后,钻孔越深,我们就越有可能发现是否有石油或天然气及其经济可行性。因此,深度造成泄漏风险,也排除在 ML 培训之外。在提供的 200 多项 ML 培训中,共有 64 项特征被排除在外。

模型性能

ML 训练后的实验设置和模型性能的结果总结如下:

模型性能总结

可变重要性

戴总共执行了 31 次迭代来构建 73 个模型,给出最佳 AUC 的最终模型是 LightGBM 。发现 48 个特征是重要的。下表按降序列出了 15 个最重要的排名:

样本外评估

样本外预测汇总

基于机器学习的商业决策

正确评估油井的生产潜力至关重要。如果油井被废弃,将无法收回花费在钻井上的资金,这些资金可能高达数百万到数亿美元。同时,完成一口井的成本通常等于或大于将井钻到套管点的成本。

在该实验中展示的这种高准确性表明了机器学习在辅助石油和天然气勘探和生产中的决策过程中的潜在应用。以下段落解释了本实验中构建的机器学习模型可以部署在决策管道中的何处。

钻井所涉及的费用可分为三个阶段 — 套管点前,套管点后和放线后

在第一阶段,油井向下钻至目标储油层。这是在套管点之前进行的。在下套管时,必须根据测井数据分析和专家经验决定是否继续完井。如果储层可开采油气储量的利润不足以支付油井的总成本,此时封堵和弃井通常比完井更具成本效益。在这一阶段,没有收入,只有地质学家产生钻探前景、租赁面积、获得必要的钻探许可和准备钻探场地的成本。

下表描述了开发油井成本的不同阶段。第二和第三阶段的成本通常比下套管点之前高得多。该表还显示了机器学习模型在管道中的位置,以补充和改进决策过程。

未来的改进

油气生产的另一个挑战是废弃井。报废井主要是由于维护活动出错,留下送入工具、电线、塞子和其他材料被丢弃并经常卡在井中。

由于腐蚀、侵蚀、热应力等原因,油管或套管经常发生故障,导致套管损坏,进而引发油井水淹。当油井从生产井转为注入井时,也经常出现报废井。盐和页岩等可移动的岩层也是一些可能的原因。

目前,由油田服务公司(如 Schlumberger 和 Baker)提供的测井服务与使用软件(如 Landmark 和 Paradigm)的油管应力分析相结合,经常被用来解决报废井的问题。

通过使用机器学习,可以将来自测井记录、油管应力分析和服务提供商资料的数据输入 ML 算法,以生成准确的模型,从而在决定将油井从生产井转换为注入井之前预测遇到废弃油井的概率。这种方法可以帮助石油公司和服务提供商更好地做出决策,以防止废弃油井的发生。

更好、更快、更强的 Python 探索性数据分析(EDA)

原文:https://towardsdatascience.com/better-faster-stronger-python-exploratory-data-analysis-eda-e2a733890a64?source=collection_archive---------26-----------------------

用 4 行代码探索、清理和争论数据集

Creedi 钟在 Unsplash 上的照片

探索性数据分析(EDA)是理解大多数数据科学项目的基本步骤,无论是开发机器学习模型还是商业分析。该过程包括处理缺失数据、编码数据类型(连续、分类)、计算特征之间的关联-相关性、形成数据结构、构建设计图表(直方图、箱线图、时间序列等)..).由于数据量巨大,使用自动化库寻找更快分析的技巧是成为独角兽数据科学家的一个关键优势。在本文中,我们将回顾 4 个最成功的开源短 python 代码行,它们可以组合在一起构成一流的 EDA。在这篇文章中,我们将分析你可以在这里找到的巧克力棒评级数据集样本:巧克力棒。

照片由叶戈尔·利法尔在 Unsplash 上拍摄

  1. 熊猫 UI

Pandas_ui 是 bamboolib 的一个高效的开源替代方案。该软件包减少了数据预处理时间,结合 python 库(如 plotly、pandas、qgrid、ipywidgets 和 pandas profiling)创建了有用的可视化。使用此软件包,您可以删除列、编码分类要素、合并要素、过滤排序行、分组要素、数据类型、唯一值和缺失值计数、替换值、分位数统计(Q1 中值、Q3、最大值、范围、四分位间距)、描述性统计(平均值、众数、标准差、总和、中位数绝对偏差)、异常值、可视化(直方图)、相关性(皮尔逊矩阵)。最终专注于您的机器学习目标,节省数据探索步骤的时间。要使用这个包,你的电脑上需要一个装有 python 3.7 的 jupyter 笔记本(或 jupyter lab)。更多细节请参考本 github 。

pip install pandas_uijupyter nbextension enable — py qgrid — sys-prefixjupyter nbextension enable — py widgetsnbextension — sys-prefixfrom pandas_ui import *pdf =pandas_ui(“**../input/chocolate-bar-2020/chocolate.csv**”)pdf.to_file(output_file=**”pandas_ui1.html”**)get_df() # to get the data frame#get_meltdf() or get_pivotdf() # to get melt or pivot dataframes if you have created any.

巧克力评级数据集上的 plot _ correlation(图片由作者提供)

2.熊猫简介

Pandas_profiling 是一个开源的单行代码,它从 csv 数据集创建一个完整的 HTML 分析报告,用于快速准确的数据分析。使用此软件包,您可以轻松获得数据类型、唯一值和缺失值(计数、热图和树状图)、分位数(Q1 中值、Q3、最大值、范围、四分位数范围)、描述性统计数据(均值、众数、标准差、总和、中值绝对偏差、变异系数、峰度、偏斜度)、异常值、直方图等可视化、相关性(Spearman、Pearson 和 Kendall 矩阵)、文本分析(大写、空格、脚本和 ASCII 块)、文件和图像分析(尺寸、截断图像扫描)。要使用这个包,你的电脑上需要一个装有 python 3.7 的 jupyter 笔记本(或 jupyter lab)。

从 pandas 数据框架生成配置文件报告。pandas df.describe()函数很棒,但对于严肃的探索性数据分析来说有点基础。pandas_profiling 使用 df.profile_report()扩展了 pandas 数据帧,以便进行快速数据分析。

pip install pandas-profilingorconda install -c anaconda pandas-profilingfrom pandas_profiling import ProfileReportdf = pd.read_csv(‘**../input/chocolate-bar-2020/chocolate.csv**’)pr = ProfileReport(df)pr.to_file(output_file=”**pandas_profiling1.html**”)pr

巧克力评级数据集(作者图片)上的 matrix_correlation

更多细节请参考这个 GitHub 。

Photo by 甜心之枪 Sweetgun on Unsplash

  1. Sweetviz

Sweetviz 是一个很棒的两行代码,可以创建高密度的可视化 HTML 报告。使用此软件包,您可以通过目标值可视化对照其他特征(目标特征 y 的 A 与 B)轻松选择特征,比较两个数据集(训练 vas 测试)。此外,您还可以获得缺失值、分位数和描述性统计数据、直方图、不确定性相关性(分类-分类)、相关比率(分类-数值)。要使用这个包,你的电脑上需要一个装有 python 3.7 的 jupyter 笔记本(或 jupyter lab)。

安装 Sweetviz(使用 pip install sweetviz)后,只需像平常一样加载 panda 的数据帧,然后根据您的需要调用 analyze()、compare()或 compare_intra()(更多信息见下文)。完整的文档可以在 GitHub 上找到。现在,让我们从手头的案例开始,按如下方式加载:

df = pd.read_csv(‘**../input/chocolate-bar-2020/chocolate.csv**’)from sklearn.model_selection import train_test_splittrain, test = train_test_split(df, test_size=0.3)!pip install sweetvizimport sweetviz as svsweetviz_report = sv.analyze([df,”data”],target_feat=’rating’)sweetviz_report.show_html(‘**viz.html**’)df1 = sv.compare(train, test)df1.show_html(‘**Compare.html**’)

我们现在有 2 个数据框架(训练和测试),我们想分析目标值“评级”。这里互动报道更详细:这里

使用 Sweetviz (作者提供图片)进行训练和测试的比较

正方形代表分类特征相关变量的相关性。注意,为了清楚起见,平凡的对角线是空的。

照片由德文神在 Unsplash

4。Autoviz

Autoviz 是一个开源的单行代码,可以从 csv 数据集为大小数据集创建完整的 HTML 分析报告。有了这个软件包,您可以获得可视化效果,包括条形图、直方图、相关性热图、分位数和描述性统计。Autoviz 提供了一个一键式引擎 Auto Viz.io,您可以在线上传数据,并直接将完全免费的报告发送到您的电子邮件中。

AutoViz 可以通过 4 个简单的步骤实现:

!pip install autovizfrom autoviz.AutoViz_Class import AutoViz_ClassAV = AutoViz_Class()dft = AV.AutoViz(filename = “”, sep= ‘,’ , depVar=’rating’, dfte= df, header=0, verbose=2, lowess=False, chart_format=”svg”, max_rows_analyzed=2500, max_cols_analyzed= 21)dft.to_file(output_file=”**autoviz_profiling.html**”)

巧克力评级数据集(作者提供图片)上 autoviz 包的绘图功能

如果你有空闲时间,我建议你看看这个:

https://medium . com/swlh/EDA-explorative-data-analysis-e0f 453d 97894

总结

请参考此链接巧克力评级 EDA ,使用这些工具和其他众所周知的可视化工具对巧克力评级进行完整的 EDA 分析。

这个简单的概述提醒我们在数据科学中使用 python 进行探索性数据分析的重要性。这篇文章涵盖了制作完整的探索工作流的 4 个基本 Python EDA 工具,以及有用的文档。

希望你喜欢,继续探索!!!

mikita-yo 在 Unsplash 上拍摄的照片

基于树的模型的更好特性

原文:https://towardsdatascience.com/better-features-for-a-tree-based-model-d3b21247cdf2?source=collection_archive---------22-----------------------

树模型能看到什么,不能看到什么

当您了解模型如何工作时,创建成功的特征就变得容易多了。这是因为您可以推理模型的优缺点,并相应地准备特征。让我们一起来看看基于树的模型可以理解哪些特性,以及哪些特性对它来说更难使用(以及在这种情况下我们如何帮助模型)。

基于树的模型如何使用特征

我们将从仔细观察基于树的模型内部开始。

基于树的模型示例(由作者从 LightGBM 模型生成)

基于树的模型的主要构件是二元决策。它获取特定特性的值,并根据该值进行分割。许多这样的决策形成了决策树。许多树预测平均起来给出了模型预测。当然,这是对基于树的模型的非常简化的解释,但是它非常适合于理解成功的特性需要什么属性。

所需分裂(或所需二元决策)的数量是该特征的一个重要属性

鉴于二元性,基于树的模型擅长处理主要信号可以通过几次分割提取的特征。让我们来看看具有这种属性的一些特性。

为了更好地推理所需的分割,我们将使用“特性与目标”图。在 X 轴上,我们将特征值从最小到最大排序。在 Y 轴上,我们有每个特征值对应的目标值。此外,我们将使用分割线来区分我们希望考虑的低目标值和高目标值。

下面是一些需要一个或几个分割的特性的“特性与目标”图的例子,基于树的模型可以很好地处理这些特性。

需要一次/几次拆分的简单功能(作者可视化)

如您所见,基于树的模型擅长处理特征,其中图形不会经常从向上到向下改变方向,反之亦然。特征不需要是线性的,主要要求是它们不需要许多分裂点来分隔低和高目标值。

此外,基于树的模型的优点是处理特征交互的能力。这是指对于较小的要素 B 值,要素 A 以一种方式运行,但对于较大的要素 B 值,其行为会发生变化。不是所有的模型都能捕捉到这样的交互,但是基于树的模型处理起来非常自然。

现在让我们来看看一些特性,这些特性对于基于树的模型来说更难处理。

需要许多分割的硬特征(作者可视化)

一个特征捕获完整信号所需的分裂越多,所需的树就越深。但是有很多叶子的更深的树意味着更高的过度拟合风险。允许模型生长更深的树,并不意味着它将只对我们想要的特征进行分割。它可以使用分割来不必要地分割一些其他特征,从而导致捕捉噪声。

特征工程示例

现在,对我们的基于树的模型需要什么类型的特征有了一些直觉,让我们看一些如何实际转换特征以使它们更好的例子。

捕获重复模式

具有重复模式的特征(作者可视化)

这里我们可以看到一个具有某种重复模式的特征。具有类似模式的特征的一个真实例子是日期。在许多数据集中,有一个或多个日期要素。他们可以指定注册日期、出生日期、测量日期等等。日期要素的一个典型属性是,有时它们具有季节性成分。例如,目标变量可以取决于工作日——在周末,目标变量的行为与工作日不同。

我们的模型很难提取这样的信息。因为每个周末都需要两次分裂——把它从两边分开。另一个缺陷是,对精确的日期值进行分割将无助于预测未来看不见的数据,因为日期不会重复。

帮助我们的模型的最好方法是将模式提取为更简单的二进制特征“is_weekend”,其值“1”表示周末,“0”表示工作日。或者使用“工作日”特性更有效,每个工作日的值从 1 到 7。当我们在前面的例子中直观地看到这意味着什么时,我们正在减少必要的分割,以完全捕捉数据中的信号,从而使该功能对基于树的模型更加友好。

减少了基于树的模型捕获特征信号所需的分割(作者可视化)

基本上,我们将所有重复的时间间隔(如周)放在一起,让模型使用平均值来决定拆分。在上面的示例中,这允许我们将所需的拆分数量从 8 个减少到 2 个。如果您想知道这是如何在代码中实现的——我们简单地将这里的x mod 25作为新的特征值,因为原始特征的重复间隔长度为 25。

我们可以通过减少模型捕捉信号所需的分割数量来改进特征

消除噪音

基于树的模型可能需要一些帮助的另一种情况是非常嘈杂的数据。考虑一些特征,其中的值非常嘈杂,但实际上,只有一个点是有意义的。如果我们知道这一点,我们可以通过自己进行必要的拆分来帮助模型。这可以通过将原始特征转换成二进制特征来实现。

噪声特征示例(作者可视化)

例如,我们在不同的日期在一家商店购买了很多东西,并且知道这家商店在某一天搬到了另一个地方。如果我们检查移动前后的平均值,相应的平均值将是 25 和 30。但是给定一个从 0 到 60 变化的高方差,模型很难确定正确的分割点。

在这个特殊的例子中,假设平均值发生了变化,最有可能的是,模型将设法在正确点附近的某个地方进行分割。但是,它可能会选择某个点向一侧或另一侧移动,从而导致围绕该移动点的预测更差。我们可以通过引入明确指定这一点的新特征来帮助该模型,例如,这可以是“new_location”特征,在移动之后所有行的值为 1,在移动之前的值为 0。

没有噪音的新功能(作者可视化)

当然,这样的转换需要一些领域知识和“专家决策”来选择正确的拆分点。但是当这是可能的时候,这样的特征可以极大地帮助模型避免不必要的错误分割,这可能导致对噪声的过度拟合。

更多关于基于树的模型能做什么/不能做什么

到目前为止,我们探索了基于树的模型如何使用特性,并查看了一些如何使用这些知识来修复或设计更好的特性的示例。

现在让我们谈谈在使用基于树的模型时可以帮助我们的其他考虑事项。

注意已知区间之外的特征值

基于树的模型的一个弱点是不能外推。简单地说,基于树的模型通常无法预测小于训练数据中最小值的值,或者大于训练集中最大值的值。

考虑特征 X 值和相应的目标 Y 值如下:

  • X=1,Y=2
  • X=2,Y=3
  • X=3,Y=4
  • X=4,Y=

任何简单的线性模型都会捕捉 X 和 Y 之间的线性关系,并且会正确地猜测最后的 Y 值。但是基于树的模型最有可能预测出 4 左右的值。而不是 5,这显然是正确的值。

为了理解原因,我们应该回忆一下基于树的模型是如何使用特征的——通过对它们进行分割。如果模型从未见过大于 3 的特征 X 值,它就没有办法对更大的值进行分割。因此,所有大于 3 的 X 值将被基于树的模型完全相同地对待。

现在,我们能帮助一个模型克服这一点吗?一般来说——不,我们不能以任何方式强迫一个模型在已知的特征区间之外进行分割。

基于树的模型无法对训练数据中出现的间隔之外的特征值进行拆分,因此无法区分它们。

围绕这一限制实际上存在一些方法,但是这些方法通常涉及目标值的转换——因此我在这里不考虑它们,因为在本文中我只想关注转换/创建特性。我可以给你一些关于这些方法的方向的线索。例如,有时有可能预测的不是实际目标值,而是与某个先前值的差值,并且最终通过逐个递增地添加与先前值的预测差值来重建实际目标值。

不需要缩放或标准化

使用基于树的模型时,不需要缩放或标准化数据。为什么?因为在从 0 到 1 的区间中以 0.8 进行分割与在例如从-100 到 900 的区间中以 700 进行分割一样困难(或容易)。

为了直观地看到它,让我们为一些随机特性绘制“特性与目标”图,这些特性的值在 30 到 130 之间。让我们为相同的特征绘制相同的图,但是在归一化到区间(0,1)之后。

规范化不会影响所需的拆分数量(作者的可视化)

注意,唯一改变的是 X 轴的比例。该模型将需要与标准化之前完全相同的分割,以分离低目标值和高目标值。

类似地,基于树的模型对特征中的异常值不敏感(与例如线性模型相反)。

结论

尽管最近深度学习取得了不可否认的进步,但基于树的模型仍然非常有竞争力。如果我们谈论表格数据,在许多(如果不是大多数)情况下,具有精确特征工程的基于树的模型仍然可以胜过深度学习方法,这被许多 Kaggle 竞赛结果所证明。在基于树的模型中,特征工程是成功的关键。但是理解模型的基础结构和操作是成功的特征工程的关键。

弗兰基·查马基在 Unsplash 上拍摄的照片

希望你在这篇文章中找到一些有趣的、有用的东西,感谢你的阅读!关注我,不要错过更多关于机器学习的文章。

使用冰山来管理利益相关者的期望

原文:https://towardsdatascience.com/better-manage-stakeholder-expectations-1713f0bf0f7a?source=collection_archive---------66-----------------------

数据洞察冰山有助于管理数据项目中的预期

在数据科学/数据洞察/数据可视化项目的早期阶段,管理利益相关者的期望可能特别具有挑战性。对于不太熟悉数据项目挑战的非技术涉众来说尤其如此。

数据来源和相关分析可能特别耗时。这些工作的大部分是不可见的,很难交流,因此出现了数据洞察冰山。

数据洞察冰山是表现这些项目的好方法。大部分工作都在水下进行。

来自 TAR 解决方案的数据洞察冰山

幸运的是,并非所有这些“水下”工作对于所有数据洞察项目都是必要的。每个公司都有不同级别的数据基础设施和成熟度。

数据洞察冰山的水面下发生了什么?

洞察和分析项目需要一个关键要素。没有这个要素,项目甚至在开始之前就会失败。优质数据。

然而,在获取数据之前,了解客户/用户想要什么是很关键的。

一般来说,人们很难清楚地说出哪些信息对他们有用。他们真正想要的是什么。通常这是因为他们不知道。他们有一种感觉,他们想要类似 X 的东西,但直到他们开始看到 X,他们才真正知道。

在知道您是否有高质量的数据之前,那些可能“松散”的需求需要工作到可能的数据源系统中。

下一步是从确定的系统中获取数据。来源于真实数据,而不是测试数据。如果您向业务用户展示一个带有测试数据的仪表板,您可能收到的唯一反馈是,“这个数字是错误的”。

获取数据可能非常耗时。如果没有数据提供者的充分合作,这可能会非常耗时。

假设获取数据一切顺利,每个数据集都需要分析和理解。

数据看起来正确吗?它与源系统匹配吗?应该怎么用?有需要了解的业务规则吗?它如何连接到其他数据源?

有许多关于数据的问题,它们都需要一个答案。理解数据对于提供准确的见解非常重要。

然后,这些数据源需要连接/混合。这通常意味着编写 ETL 过程来适当地映射数据。这也需要时间。

在加入过程结束时得出的数据是准确的,这一点很关键。这些 ETL 输出构成了产生业务洞察的基础。

一旦数据步骤完成,将数据转换成有用的业务信息才真正开始。

洞察力通常呈现在仪表板中。这些是企业希望看到的;吃水线以上的那块冰山。

最终,利益相关者将会如何评价你的项目。

管理利益相关者的期望

由于所有的工作都发生在水线以下,很难管理利益相关者的期望。

在数据基础设施相对成熟的组织中,快速创造洞察力更加简单。因此,管理预期要简单得多。

如果你能从好的数据开始,那么很快就能产生洞察力。

然而,对于那些数据基础设施不太成熟的组织来说,这可能更具挑战性。

开始需要获取大量数据的项目在开始时往往比较棘手。大量的时间将花在冰山的底部,在水线以下工作。

当工作对业务涉众不可见时,管理期望就变得更加重要。

最好的选择是创建一个显示已知数据源的矩阵。该矩阵应:

  • 指明来源提供商
  • 标记数据是否已获得—有时这可能需要几个月的时间
  • 指出是否已对其进行分析
  • 显示所含数据的质量
  • 标记发现的任何问题

这可能是向企业高级管理层展示进展的最佳选择。对于许多利益相关者来说,PowerPoint 幻灯片比展示 ETL 工作流更容易阅读和理解!

最终,这些冰山项目中的沟通必须是稳固的。

这可能不是开发商的过错,事情比预期的时间长。然而,这也往往容易归咎于开发商。

因此,管理涉众的期望可能是项目成功和失败的区别。

TAR Solutions 专注于 Tableau 和 Alteryx,为金融服务机构 提供数据洞察项目。

在 R 中使用因子模型蒙特卡罗获得更好的投资组合绩效

原文:https://towardsdatascience.com/better-portfolio-performance-with-factor-model-monte-carlo-in-r-3910d0a6ceb6?source=collection_archive---------31-----------------------

摩纳哥。蒙特卡洛赌场的位置。由马克·德容在 Unsplash 上拍摄的照片

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

评估投资组合经理时的一个常见问题是,回报的历史通常很短,因此对风险和业绩衡量的估计可能非常不可靠。在测试新的交易策略时,也会出现类似的问题。即使你对策略的表现有相当长的历史,但你通常只对一个市场周期进行观察,这使得很难评估你的策略在其他市场的表现。如果你交易股票,你可能听过这样一句话:“我从未见过糟糕的回溯测试”。

解决这一缺陷的一种方法是通过因素模型蒙特卡罗(FMMC) 。FMMC 可以用来估计一个因素模型的基础上,一套金融和经济因素,可靠地解释了基金经理的回报。然后,我们可以模拟回报率,以确定经理在各种市场环境下的表现。最终的结果是一个模型,它产生了比我们简单地使用可用的收益序列更好的风险和性能估计。

任务和设置

在这个案例研究中,我们将分析新对冲基金王高对冲基金的回报;以下简称 AHF 。对冲基金的案例尤其有趣,因为对冲基金可以使用杠杆,投资于任何资产类别,做多或做空,并使用许多不同的工具。对冲基金通常对自己的策略和持股非常保密。因此,有一个可靠的风险模型来解释他们的回报来源是至关重要的。

请记住,王高的对冲基金不是真正的对冲基金(我是王高,我没有对冲基金),这是一个真实的系列收益。我获得了我们在我工作的地方投资的对冲基金的运营回报,因此这项研究的结果适用于现实世界。

我们有王高对冲基金从 2010 年 1 月到 2020 年 3 月的数据。为了这篇文章的目的和评估我们模型的准确性,我们将假设好像 AHF 是一个非常新的场景,我们只有 2017 年 1 月到 2020 年 3 月的数据。为了克服数据不足,我们将在此“观察数据”的基础上建立一个因素模型,然后利用整个数据系列来评估我们评估风险和性能统计的模拟的准确性。

下图显示了自 2010 年 1 月以来 AHF 的累计回报。红线右边的数据代表“观察周期”。

我们将在 R 中使用大量可用的软件包进行分析,包括:性能分析和 quantmod 。除了对冲基金收益系列,所有的因素数据都可以从雅虎免费获得。金融,美联储圣路易斯银行弗雷德数据库,以及瑞士瑞信银行对冲基金指数;你必须在瑞士瑞信银行注册才能访问这些指数,但仍然是……免费的。

模型估计

经验金融学的一个常用技巧是基于一组常见的风险因素来解释资产价格的变化。最简单和最著名的因素模型是威廉夏普的资本资产定价模型(CAPM)。资本资产定价模型规定如下:

其中:

  • ri =资产“I”的返还
  • m =市场指数“m”的回报
  • ∞=超额回报
  • =暴露于市场风险因素
  • ɛi =特殊误差项

市场风险,或“系统性”风险,是对金融资产所面临的所有风险的一种概括衡量。这可能包括经济衰退、通货膨胀、利率变化、政治动荡、自然灾害等。市场风险通常由大型指数(如标准普尔 500 指数)的回报来代表,不能通过分散投资来降低。

(即 Beta)代表资产的市场风险敞口。β= 1 意味着资产和市场一样有风险,β> 1 意味着比市场风险更大,而β< 1 意味着风险更小。

ɛ是一种特殊风险,代表无法用市场风险因素解释的那部分回报。

我们将扩展 CAPM 以包括额外的风险因素,文献表明这些因素对解释资产回报很重要。王高的对冲基金使用许多不同的资产类别和工具来运行一个复杂的策略,因此它暴露于传统市场指数之外的更广泛的风险当然是合理的。我们的因素模型的一般形式如下:

上面所说的是收益(r)由一组风险因子 j=1…k 来解释,其中 r j 是因子“j”的收益,j 是风险敞口。ɛ是一个特殊的错误。因此,如果我们可以估计 j,那么我们就可以利用长期的因素回报(r j)来计算 AHF 的条件回报。最后,如果我们可以合理地估计ɛ的分布,那么我们就可以在 AHF 的收益序列中建立随机性。这使我们能够充分捕捉我们可以观察到的各种回报。

FMMC 方法将分为三个部分:

  • A 部分:数据采集、清理和处理
  • B 部分:模型估计
  • C 部分:蒙特卡罗模拟

A 部分:数据采集、清理和处理

对于因子模型,我将使用一组金融和经济变量,旨在衡量不同来源的风险和回报。同样,本研究中使用的所有数据都可以从 Yahoo!金融、弗雷德数据库和瑞士瑞信银行。

我们将从弗雷德的数据开始。在每个变量旁边,我放置了唯一的标识符,您可以从数据库中查询。

弗雷德变量:

  • 未来 5 年的 5 年通胀预期。(T5YIFRM)
  • 期限利差:10 年减 3 个月国债收益率利差。(T10Y3M)
  • 信用利差溢价:穆迪的 Baa 公司债券收益率减去 10 年期美国国债收益率。(BAA10Y)
  • 3 个月期国库券利率。(DGS3MO)
  • TED 利差:3 个月 LIBOR 减去 3 个月国债收益率。(TEDRATE)
  • 国际债券收益率:欧元区 10 年期政府债券收益率。(IRLTLT01EZM156N)
  • 公司债券总回报指数:ICE BofAML Corp 债券总回报指数;分层次。(BAMLCC0A0CMTRIV)
  • CBOE 波动率指数(即 VIX)。(VIXCLS)
  • 美国 10 年期国债(即 VIX 国债)的 CBOE 波动率指数。(VXTYN)

FRED API 有一些不足之处,不允许您以一致的方式提取数据。AHF 的回报是每月的,所以我们的模型将需要使用每月数据进行估计。但是,FRED 以最高的可用频率检索数据,因此每日数据总是以每日形式出现。此外,数据是从系列的开始检索的,所以您最终会得到许多 NAs。因此,在我们继续之前,我们需要做一些清理工作。

下面的 R 代码段展示了如何将标识符加载到变量中,并分别向 FRED 查询每日和每月的数据。每日数据被清理并转换为每月频率。我已经尽可能多地注释了代码,这样你就可以看到发生了什么。

弗雷德的数据准备好了。我们需要的另一组变量是金融市场指数。增长、价值和规模指数在资产定价模型中占据显著地位,如 Fama-French 三因素模型,我在这里采用了同样的方法。金融指数的回报来自历史悠久的雅虎!金融。

雅虎!财务变量:

  • 价值:罗素 1000 价值指数(^RLV)
  • 增长:罗素 1000 增长指数(^RLG)
  • 规模:罗素 2000 指数(^RUT)
  • 市场:标准普尔 500 指数(^GSPC)
  • 国际:EAFE 摩根斯坦利资本国际公司
  • 债券:巴克莱综合债券指数(AGG)

最后,我们将加载瑞士瑞信银行(CS)提供的对冲基金特定指数。获取指数需要一些额外的步骤,因为数据需要从瑞士瑞信银行网站手动下载到 Excel,然后加载到 r 中。每个指数对应一个特定的对冲基金策略。

瑞士瑞信银行变量:

  • 可转换债券套利指数
  • 新兴和前沿市场指数
  • 股票市场中性指数(EQ_Neutral)
  • 事件驱动索引(DRV EVT)
  • 困境机会指数
  • 多策略事件驱动索引(MS_EVT)
  • 事件驱动风险套利指数(RISK_ARB)
  • 固定收益套利指数
  • 全局宏索引(GL_MACRO)
  • 股票多空指数
  • 管理期货指数(MNGD_FT)
  • 多策略对冲基金指数(MS_HF)

B 部分:模型估计

回想一下,出于本案例研究的目的,我们“假装”好像我们只有从 2017 年 1 月到 2020 年 3 月(即样本期)的 AHF 数据。事实上,我们有 2010 年 1 月的数据。我们将使用样本期的数据来校准因子模型,然后将模拟结果与 2010 年 1 月至 2020 年 3 月期间的长期风险和绩效进行比较。

模型估计有 2 个步骤:

  1. 估计因子模型:使用资产和因子回报的普通“短期”历史,计算具有截距、因子βj = 1…k 和残差的因子模型
  2. 估计误差密度:使用因子模型的残差来拟合合适的密度函数,我们可以从中得出。

我已经提出了 27 个风险因素来解释 AHF 的回报,但是我不知道哪一个是最好的预测。可能有些因素是不相关的,降低了模型的解释力。为了选择一个最优的模型,我使用了一个基于调整 R2 的最佳子集选择算法。leaps 对建议的变量进行详尽的基于回归的搜索,并选择具有最高调整 R2 的模型。该算法提出以下 14 因素模型,调整后 R2 为 0.9918:

  • 罗素 1000 价值(RLV)
  • 罗素 2000 指数
  • 标准普尔 500 (GSPC)
  • 摩根士丹利资本国际 EAFE 公司
  • 巴克莱综合债券指数
  • 公司债券总回报指数
  • 维克斯
  • VIX 财政部(VIX)
  • 可转换债券套利指数
  • 股票市场中性指数(EQ_Neutral)
  • 多策略事件驱动索引(MS_EVT)
  • 股票多空指数
  • 管理期货指数(MNGD_FT)
  • 多策略对冲基金指数(MS_HF)

现在,我们已经选择了我们的变量,我们可以估计校准因子模型,看看它是如何做的。

基于回归的结果,我们观察到急性心力衰竭明显暴露于传统的风险来源。具体来说,AHF 似乎交易股票和债券,并可能利用衍生品进行对冲或投机。

对标准普尔 500 (GSPC)和摩根士丹利资本国际(EFA)指数的积极投资表明,AHF 交易全球股票,并有长期偏好。AGG 的正值进一步表明,他们交易固定收益产品,但基于公司债券总回报指数(corp. tr)的负系数,他们可能略微偏好美国国债。各种对冲基金策略的总体显著结果表明,AHF 采用了复杂的交易策略,并可能使用期货等衍生品(对 CS 管理的期货指数 MGND_FT 而言具有非常重要的价值)。期货可用于对冲头寸或进入特定市场。

AHF 的已实现回报与模型拟合值的关系图显示了很高的拟合度和解释力。

C 部分:模拟

参数和非参数蒙特卡罗方法都广泛应用于实证金融学,但都给估计带来了挑战。

因子密度的参数估计需要拟合一个大的多变量、厚尾概率分布;在我们的具体例子中包含 14 个变量。众所周知,相关性是不稳定的,对方差-协方差矩阵的不准确估计会使我们从中得出因子收益的分布产生偏差。这个问题可以通过使用 copula 方法来解决,但这增加了模型的复杂性。总的来说,如果可能的话,我们希望避免参数估计。

一个潜在的替代方法是非参数估计。为了进行非参数模拟,我们可以引导观察到的离散经验分布,该分布为 t=1…T 的每个观察到的因子回报分配 1/T 的概率。这将作为因子回报的真实密度的代理,并允许我们绕过估计相关性的混乱过程。然而,bootstrap 重采样会导致一些值的重复和其他值的遗漏,虽然这可能适合于推断,但在我们的应用中并没有提供明显的优势。

一个更有效的方法是简单地取给定的相对长历史的因子回报,并加上每个残差。简而言之,我们有 123 个月的因子回报(2010 年 1 月至 2020 年 3 月)和 39 个残差(基于 2017 年 1 月至 2020 年 3 月的校准组合结果)。如果我们将 39 个残差中的每一个添加到 123 个因子回报中,我们可以为 AHF 的回报产生 123×39 个场景(总共 4797 个观测值)。这个大样本应该能够为我们提供对 AHF 收益率分布尾部的深入了解,并且具有利用所有观测数据的优势。

模拟过程如下:

  • 使用校准后的模型和因子回报,对 2010 年 1 月至 2020 年 3 月的 AHF 回报进行预测。
  • 对于每个“I”,i = 1…123,估计回报,加上每个“j”,j=1…39,残差。

技术性能分析

回想一下,当我们介绍这个练习时,我们假装只有 AHF 从 2017 年 1 月到 2020 年 3 月的业绩历史。如此短暂的业绩历史仅提供了对基金经理在相对狭窄的市场条件窗口内的风险/回报特征的有限洞察。为了解决这一缺点并提供更准确的性能描述,我们建议使用因子模型蒙特卡罗(FMMC)。因子模型是使用因子和基金回报的简短、共同的历史来校准的。蒙特卡洛实验使用更长时间范围(2010 年 1 月至 2020 年 3 月)的因子回报和已实现因子模型残差来构建 AHF 的 4797 个模拟回报。

为了评估我们的模型的性能,我们将重点关注平均年回报率和波动性的结果,以及古老的夏普和索蒂诺比率。让我们看看我们做得怎么样。

1。平均回报率

下表描述了因子模型蒙特卡罗(FMMC)、AHF 完整历史(2010 年 1 月-2020 年 3 月)和截断/“观察”历史(2017 年 1 月-2020 年 3 月)的平均年回报率:

我们很快就能看到 FMMC 模型在截断周期内的改进。FMMC 模型能够完全捕捉 AHF 的回报动态,而截断的回报大大低估了全部历史均值。

2。波动性

仅仅对平均值的精确估计不能支持我们的模型是稳健的这一说法。同样重要的是波动性。下表显示了所考虑的每个时期的年化波动率(即标准差):

FMMC 估计值和截断估计值都略微低于整个时期内 AHF 的实际波动率。然而,两者估计非常接近。

3。夏普比率

有了均值和波动率估计,我们现在可以计算夏普比率。夏普比率计算如下:

在测试期的大部分时间里(2010 年 1 月至 2020 年 3 月),3 个月期国债收益率代表的无风险利率非常接近 0%。为简单起见,我们将采用 0%作为计算的无风险利率。下表显示了结果:

FMMC 估计表明,在估计急性心力衰竭的夏普比率时,比截断估计有显著的改进。这并不奇怪,因为上面我们显示了截断期的平均收益很差,而 FMMC 的估计值非常接近。这自然会反映到夏普的结果中,但是,结果再次显示了 FMMC 方法的效用。

4。排序比

最后,我们转向索提诺比率。Sortino 与 Sharpe 相似,但它关注的不是总体波动性,而是所谓的“下跌波动性”;或者低于规定阈值的回报率的标准差。通常,阈值被设置为 0%;这种观点认为,不稳定的正回报并不被认为是“坏的”,因为你仍在赚钱,但不稳定的负回报表明出现巨额亏损的可能性极大。更高的比率被认为更好。Sortino 比率计算如下:

下表描述了结果:

FMMC 的估计非常接近整个时期,准确地表达了下行回报的波动性。由于较低的平均回报率和更大的下行波动性,我们看到了比截断估计值更低的显著改善。

结论意见

经理评估是投资金融中最古老、最常见的问题之一。当基金经理的业绩记录很短时,可能很难评估该策略的有效性,这对基金经理和基金分配者都有影响。

在这篇文章中,我们介绍了因子模型蒙特卡罗(FMMC) 作为短期历史问题的一种可能的解决方案,并使用了真实世界的例子王高的对冲基金(AHF) 来展示它的功效。通过使用一个因素模型和共同的,基金和因素回报的短期历史,我们估计了 AHF 暴露于不同来源的经济和市场风险。然后,我们能够模拟 AHF 的回报,以构建更长的回报历史,从而更好地了解基金的长期表现。

FMMC 方法的结果显示,与单独使用短期历史回报相比,有了显著的改进。使用 AHF 的全部回报历史作为比较,我们看到 FMMC 方法准确地模拟了该基金的回报、波动性、夏普和索蒂诺比率。相比之下,被截断的回报历史严重低估了 AHF 的表现,这将导致误导投资者的后果。

因素模型蒙特卡洛已被证明是一种有效的技术,为复杂的战略风险和回报建模,并作为一个强大的补充基金分析师的工具包。

下次见,感谢阅读!

王高·莱克丝。

原载于 2020 年 8 月 28 日http://light finance . blog

使用人工神经网络进行更好的预测性维护

原文:https://towardsdatascience.com/better-predictive-maintenance-using-ann-322752ea3fc5?source=collection_archive---------23-----------------------

使用机器学习减少资产密集型行业停机时间的数据科学方法。

不同类型的维护策略已在石油和天然气行业得到广泛应用。当今的石油和天然气行业可以利用数据科学或机器学习,而不是依赖旧的维护实践来更好地预测设备故障和进行根本原因分析。维护活动可以大致分为三大类:纠正性、预防性和预测性维护。纠正性维护是指设备停机后的修理工作。预防性维护是基于一定的定期间隔,以防止设备故障发生。预测性维护依靠工程工具和统计分析来处理数据和分析设备的健康状况。状态监控也是一种预测性维护的形式,它依靠设备传感器数据来预测任何故障。

石油钻塔,通过 pixabay

商业案例研究和信息收集

石油和天然气公司有一个复杂的机械系统,如巨大的开采平台和数千公里的液压系统来运输产品。保证这个结构的完美运转不是一件容易的事情。石油和天然气公司花费数百万美元的维护成本来保持他们的设备全天候运行。使用更好的数据分析方法,他们不仅可以降低维护成本,还可以将资产生产率提高许多倍。在本文中,我们将讨论并展示一个真实场景,其中液压系统数据用于训练机器学习模型,以便更好地预测设备故障。

钻机,通过 pixabay

液压系统中的监控传感器捕捉压力、体积流量和温度等测量值。该传感器以微小的周期收集这些信息(例如,每 60 秒)

这些提取产生了一个巨大的时间序列原始数据集,有数千甚至数百万个观察值!这些数据被计算机用来预测这些系统的故障。监控减少了停机时间和维护成本,并允许预防性健康检查。

R 中的模型构建

有各种各样的模型可用于收集数据。一个强大的是神经网络,或者更准确地说,人工神经网络(ANN)。这个名字多好玩啊!如果你想象一些突触发生的大脑活动,你并没有完全错。

via pixabay

这个名字来自于一个想法,即一个独特的神经元本身就是一个相当复杂的结构,但当我们将数千个神经元连接在一起,联系所有的连接和这种相互作用中发生的信息交换时,这种结构变得非常复杂,大脑可以做不可思议的事情。

via pixabay

在机器学习环境中,人工神经元网络可以用于回归或分类问题。请记住,我们可以将机器学习分为两组,回归模型和分类模型。他们只是通过感兴趣变量的类别来区分它们。回归模型:输出是一个连续变量。分类模型:输出是分类变量(离散的)。

所以,我们去工作吧!

干得不错。

#The ann_leakage data frame contains data from a sensor installed on #a hydraulic system in an oil and gas company. Take a look!kable(head(ann_leakage[,-(8:9)]))

泵泄漏数据片段

如果没有泵泄漏,变量 ann_leakage 为 0;如果是轻微泄漏,变量 ann _ leakage 为 1;如果是严重泄漏,变量 ann _ leakage 为 2。PSxx 代表压力测量,FSxx 代表体积流量测量,TSxx 代表温度测量。每个变量我只取 2 个属性。

模型评估和验证

为了研究神经网络,我们可以将过程分为 4 个步骤:

1.将分类变量转换成二元变量;

2.将数据分成训练集和测试集;

3.训练数据;

4.测试数据。

好吧,你觉得这听起来很专业吗?别担心,我会分别解释每个步骤。

第一步:将分类变量转换成二元变量

范畴变量描述事物的特征。例如,在石油和天然气公司的液压系统中,分类变量可能是内部泵泄漏,这是公司工程师的当务之急。我们可以把这个问题分为三类:不漏;弱泄漏;严重弱泄漏。

因此,为了评估其中一个的概率,我们必须设置一个二元变量,如果它是感兴趣的类别,则为 1,否则为 0。这样,我们就有了输出变量。

#One should transform the ann_leakage variable into binary #variables. To predict just pump leakage I join weak and severe pump #leakage in the same variable.ann_leakage <- profile[,3]
ann_leakage <- cbind(ann_leakage, PS1[,1:2], FS1[,1:2], TS1[,1:2])
ann_leakage <- cbind(ann_leakage, ann_leakage$ann_leakage == 0)
ann_leakage <- cbind(ann_leakage, ann_leakage$ann_leakage >= 1)

colnames(ann_leakage)[8] <- “no”
colnames(ann_leakage)[9] <- “leakage”

kable(head(ann_leakage[,c(1,8,9)]))

第二步:对数据进行子集化

我们必须将数据集分成两组。首先,我们执行一个测试模型,告诉数据它将如何处理数据。另一组,训练组,用于验证模型在预测输出时是否有效。

#shuffle the data. subset into training and test sets
set.seed(2403)
redux <- sample(nrow(ann_leakage), 2000)
ann_leakage <- ann_leakage[redux,]

#scaling data

ann_leakage <- cbind(scale(ann_leakage[,-(c(8,9))]), ann_leakage[,c(8,9)])

n <- nrow(ann_leakage)
ntrain <- round(n*0.6) # 60% for the training set
tindex <- sample(n, ntrain) # create an index
train_ann <- ann_leakage[tindex,] # create training set
test_ann <- ann_leakage[-tindex,] #create test set

神经网络模型是一种非线性回归,使用数据中变量的线性组合作为其自变量。尽管有这个花哨的名字,人工神经网络(ANN)可以用这个简单的短语来定义。现在看起来没那么复杂了吧?

第三步:训练数据

训练数据意味着告诉计算机它将如何处理数据,以及它将如何将输入(传感器测量)与输出(来自泵泄漏类别的二进制变量)相关联。我们可以使用神经网络规范来做到这一点。

#training the data set using the training dataset
library(neuralnet)
ann <- neuralnet(no+leakage ~ 
PS11+PS12+FS11+FS12+TS11+TS12,
data = train_ann, hidden = c(3)
stepmax = 1e+05, threshold = 0.3)

plot(ann, show.weights = FALSE, col.entry = “darkgreen”,
col.hidden = “blue”, col.hidden.synapse = “blue”, col.out = “red”, col.out.synapse = “red”,
col.entry.synapse = “darkgreen”, intercept = FALSE, information = FALSE)

人工神经网络图

圆圈是神经元,箭头是突触。绿色是输入,蓝色是隐藏层(神经元),红色是输出。

第四步:测试数据

一旦我们执行了模型,我们就获得了相关的参数。现在,我们必须使用不同的输入数据集(测试集)来预测值,并将预测模型的结果与测试集中的输出变量进行比较,测试集中的输出变量称为混淆矩阵,它计算模型正确预测了多少次以及模型错过了多少次预测。

#Validate the model by predicting using the test data set

predict <- neuralnet::compute(ann, test_ann[-1])
predict <- predict$net.result#create a vector containing the response variables predcited
#by the neural network and create a confusion matrix
#to check the accuracy of the model

pred_idx <- function(x) {return(which(x == max(x)))}
idx <- apply(predict, c(1), pred_idx)
predict_leakage <- c(“no”, “leakage”)[idx]

library(expss)test_leakage <- if_else(test_ann[,”leakage”] == TRUE, “leakage”, “no”)
xtab <- table(predict_leakage, test_leakage)
library(knitr)
kable(table(xtab, 1))

混淆矩阵输出

这样我们就能计算出准确率,也就是正确预测的百分比。因此,在这种情况下,模型预测 94 %的泵泄漏。它非常准确,非常有趣,不是吗?

结论

由于油价下跌,石油和天然气行业现在正在为生存而挣扎。机器学习可以用于预测设备故障,而不是使用依赖于 OEM 手册和最佳实践的老式方法来预测设备故障。人工神经网络模型的预测强调主动维护,并提供进行检查的正确时间。人工神经网络通过触发的传感信息捕获可能的原因,如设备故障事件的时间线、原因、持续时间和设备的相关性信息。通过先进的系统维护,可以消除计划外的设备故障,从而提高利润和生产率

参考

1.Gutierrez DD (2015)机器学习和数据科学:统计学习方法介绍,R. Technics 出版社。有限责任公司。

2.Hastie T,Tibshirani R,Friedman J (2013)统计学习的要素:数据挖掘、推理和预测,第二版。

3.Helwig N、Pignanelli E、Schutze A (2015)使用多元统计对复杂液压系统进行状态监控。2015 年 IEEE 国际仪器仪表和测量技术会议(I2MTC)论文集

4.Nikolai Kelwig、Eliseo Pignalli、Andreas Schutze (2015)检测和补偿液压状态监控系统中的传感器故障。2015 年 AMA 会议—2015 年传感器会议和 2015 年 IRS2 会议

用于精确姿态估计的更好的旋转表示

原文:https://towardsdatascience.com/better-rotation-representations-for-accurate-pose-estimation-e890a7e1317f?source=collection_archive---------9-----------------------

实践教程

由斯特拉·雅各布在 Unsplash 上拍摄的照片

我们用旋转来描述一个刚体的方向和运动,它可能是一个机器人,一辆汽车,一艘宇宙飞船或一个玩虚拟现实游戏的人。因此,旋转是一个非常基本的事情,因此应用的数量是巨大的,与旋转一起工作的现代技术经常出现在日常生活中。例如,当你玩游戏时,虚拟现实技术会估计你的头部方向,以确定你在虚拟 3D 世界中的方向。当你在摄像机前表演时,不同的 AR 应用程序可以让你看起来像一个著名的电影角色或以某种方式改善你的外观,也可以调整你的头部位置和方向。因此,这些应用程序和用户体验的质量很大程度上取决于头部姿态估计性能。

为了改进现有技术,已经吸引了大量的研究注意力,并且除了现有的旋转表示之外,已经提出了几种旋转表示来应对不同的挑战。例如,广泛使用的欧拉角表示法似乎不太适合于回归任务,因为这种表示法通常存在奇异性。一些研究工作采用四元数进行回归,它没有奇异性,但有对跖问题。此外,已经表明,任何少于五维的 3D 旋转表示都是不连续的,这使得它们更难学习。我们将进一步简要回顾不同的旋转参数化及其问题,然后进行一些实验,以了解它们如何影响深度学习模型的回归性能。

旋转矩阵

每个旋转可以用旋转矩阵唯一地描述。让我们进一步假设我们谈论的是 3D 旋转。那么旋转矩阵 R —是一个特殊的正交 3×3 矩阵,其行列式等于1

我们可以用乘法来组合旋转,得到的矩阵仍然是一个旋转矩阵,换句话说,所有的旋转矩阵在乘法运算下形成 SO(3) 群。 SO(3) 群覆盖了 3D 中所有可能的关于原点的旋转。

使用旋转矩阵,我们有九个参数来表示 3D 中的单个旋转,这与其他参数相比是过多的。如果我们想学习用反向传播来回归这些参数,那么我们必须加强正交约束,否则,我们将在推断过程中获得与旋转矩阵不同的东西,并且不能执行纯旋转。

旋转矩阵的另一个问题是它们不直观。总的来说,单纯看矩阵是不容易理解矩阵在做什么的。这就是为什么欧拉角有时更有利。

欧拉角

借助于围绕三个独立轴的三个连续的基本旋转,欧拉角可以表示从 SO(3) 的任何旋转。根据欧拉角旋转所围绕的坐标轴,有三个不同的函数用于计算元素旋转矩阵:

给不同轴周围的角度起个有意义的名字很方便,比如偏航角、俯仰角和滚转角。在头部方向的情况下,偏航角度控制向左或向右看,俯仰-向上或向下看,滚动-将头部向左或向右倾斜到肩部。

作者制作的动画

旋转顺序

我们可以使用矩阵乘法将这三个围绕不同轴的基本旋转组合起来,以获得单个旋转矩阵:

矩阵乘法是不可交换的,同样的事情也适用于旋转。因此,应用三个连续元素旋转的顺序很重要,如果我们改变它,我们会得到一个不同的旋转。三个元素围绕三个不同的轴旋转,我们有六种可能的相乘顺序,这可能会带来很多混乱。许多数据集使用偏航、俯仰、滚动角度进行标注,但并非所有数据集都明确提到了顺序。如果我们为所有三个(偏航、俯仰、滚转)角度分配相同的值,但每次遵循不同的顺序,我们将获得不同的结果,如下所示。

作者图片

此外,让我们在下面的动画中看到这一点,你可以注意到,以两种相反的顺序绕 XYZ 轴旋转会产生不同的结果。不管我们是绕固定轴旋转还是绕运动物体轴旋转,这都无关紧要,因为 XYZ 绕世界固定轴的外旋等价于 ZY 绕运动物体轴的 x 轴内旋。这也有点令人困惑,但是你可以找到更多关于这两种可能的解释方式的信息,包括这个链接后面的等价证明。

作者制作的动画

当您开始处理包含带有角度注释的图像的多个数据源时,确定正确顺序的过程变得繁琐且容易出错,尤其是在我们处理小旋转的情况下,因为在这种情况下,所有旋转顺序看起来都彼此相似。

在特定的情况下,我们可能不需要模拟全范围的运动,因为解剖学上头部旋转的三个角度是有限的,并且欧拉角很容易允许我们限制自由度。对于我们应用程序来说,只需为偏航角设置-60 到 60 度的范围,为俯仰和滚动设置-30 到 30 度的范围就足够了。在这种情况下,训练将是直接的,因为我们可以使用简单的成本函数,如绝对误差或均方误差来训练模型,并获得良好的结果。

欧拉角限制

一般来说,我们可能希望考虑更大范围的旋转,例如,在不估计身体姿势的情况下,在 VR 中表示肩关节旋转或头部方向。在这种情况下,你可能无法避免欧拉角的问题。当第二基本旋转达到 90 度(或-90 度)时,则第一和第三轴变得平行(即线性相关),这为相同的旋转提供了无限数量的解。

作者制作的动画

在上面的动画中,我们可以看到当中间角度接近 90 度时,头部如何停止移动,然后完全锁定在同一位置。这种行为也被称为 万向锁定 。为了回归的目的,当中间角度变成 90 度时,我们可以通过将第一个或第三个角度设置为零来排除这种情况。但是在第二个旋转角度达到 90 度之前很久就有问题了。事实上,随着中间角从 0 度增加到 90 度,其他两个角变得越来越“依赖”。当中间角度为 80 度时,尽管第一个和第三个角度像在第一个动画中一样快速变化,但头部移动缓慢。如果我们看看最左边的动画,我们会看到开始的头部方向俯仰(0)–偏航(0)–滚转(0 ) 和最终方向俯仰(90)–偏航(0)–滚转(90 ) 看起来非常不同。但是,在中间的动画中,两个不同的方向:俯仰(0)偏航(80)滚转(0 )俯仰(90)偏航(80)滚转(90 ) 给出了相似的结果,尽管在这两种情况下起始角度和最终角度之间的欧几里德距离是相等的。因此,在一般情况下,我们不能依赖于在这个表示空间中测量的距离。此外,由于一个旋转可以用不同的欧拉角以多种方式描述,我们不能像对四元数那样应用对动画如此重要的平滑和平均。

四元数

四元数是表示旋转的简洁方式,它们有四个参数,可以解释为一个标量分量加上一个三维矢量分量:

在计算机图形中,四元数经常被用来执行计算高效的旋转和漂亮的插值。与欧拉角不同,四元数不存在万向节锁问题,但仍然存在由反脚掌对称性引起的歧义: q-q 对应相同的旋转,换句话说,四元数双覆盖 SO(3) 群。人们可以试图避免这种模糊性,并通过将标量分量限制为正来将四元数限制在一个半球,但是如所示,相似的方向在表示中仍然很远。

此外,最近证明了对于 3D 旋转,所有表示在四维或更少维的真实欧几里得空间中是不连续的,并且经验结果表明连续表示优于不连续表示。这意味着欧拉角、四元数、指数图、轴角表示可能不太适合回归任务。作为替代方案, 5D 、 6D 和基于向量的表示法已经被提出作为连续的替代方案。

从旋转矩阵到 6D 表象

旋转矩阵是 SO(3) 的连续表示。如前所述,如果我们想使用旋转矩阵进行回归,那么我们需要加强它们特殊的正交特性。实现这一点的一种方法是采用 Gram-Schmidt 过程并从两个向量构造正交基。在这种情况下,预测的噪声矩阵的一行或一列将在该过程中被丢弃。因为三个参数是无用的,我们可以预测六个参数并根据它们重建旋转矩阵。因此,将旋转矩阵的两列作为回归目标,并且网络配备有 Gram-Schmidt 正交化过程,这就是我们如何有效地得到连续的 6D 表示。如果神经网络输出两个向量 v1v2 ,则可以得到三维旋转矩阵如下:

在网络中进行 Gram-Schmidt 处理比我们将其作为后处理来应用会产生更低的错误。这也不妨碍我们把这个网络作为某个更大网络的一部分,因为这个过程本身是可微的。为了说服我们自己,具有连续性在实践中是有益的,我们将在下一节进行实验,比较欧拉角、四元数和连续 6D 表示。

实验

让我们通过随机采样不同的旋转来创建一个数据集,并将它们应用于预定义的三个正交向量集,我们也称之为初始轴或基。我们的数据集包含旋转轴和各种表示形式的相应旋转。然后,我们为每种表示定义一个多层网络,除了最后一层的输出神经元数目不同之外,它们共享相同的体系结构。神经网络将旋转轴作为输入,并预测初始轴和旋转轴之间的旋转。下面是演示我们如何获得训练数据的代码。

接下来,我们需要为每个表示和度量定义损失函数,以比较模型性能。欧拉角以 2π弧度环绕,有多个值表示同一个角度。为了解决这个问题,我们可以定义一个分段损失函数,并使用绝对差而不是平方差,以避免在万向锁定可能发生的全范围旋转的一般情况下产生较大的损失。

至于四元数,我们不将它们限制在一个半球,而是在损失函数中解决对映问题,因为在我的实验中,两种解决方案表现出非常相似的性能。我们也可以使用测地线相对角度距离作为成本函数,但简单的 L1 范数,应用于地面真实单位四元数和预测归一化单位范数四元数之间的差异,似乎在这个实验中表现更好。

最后,我们简单地使用真实向量和预测向量之间的平均绝对误差来表示 6D:

为了测量性能,我们使用三个矢量的地面真实旋转集 uv 之间以度数测量的平均角度距离,这是使用来自网络的预测参数旋转的初始矢量集。

下面是我们如何使用张量流定义这些损失函数:

我将跳过添加所有实现细节的部分,因为对于这篇文章来说这有点多余,但是你总能在我的 github 上找到完整的实现。

性能赋值

在第一个设置中,我们将欧拉角性能与其他表示进行了比较,情况是将旋转限制在-45 度到 45 度的小范围内。我们将 80%的数据用于训练,20%用于验证。结果显示在下图中。

在这种情况下,欧拉角,实际上,与四元数和 6D 表示有着非常相似的表现。但是,如果我们将角度域增加到 90 度,欧拉角将开始表现得比四元数和 6D 差。

最后,我们使用从-180 到 180 度全范围旋转,我们看到 6D 表示明显优于四元数。然而,这两种表示都比欧拉角表现得好得多。事实上,欧拉角表现很差,我们需要单独绘制评估结果,以清楚地看到其他两种表示性能之间的差异。

当我们开始使用全范围旋转时,四元数和 6D 表示之间的性能差距可以用以下事实来解释,即四元数在 180 度具有不连续性。我们也可能认为学习四元数需要更多的参数来缩小差距。但是如果我们加倍网络容量或增加更多层,性能将是相同的,平均角度误差在 2 度左右波动。

结论

不同的表示服务于不同的目的。对于旋转估计,经验证据表明,我们应该选择在域中连续的表示。在特定情况下,欧拉角可能是合适的,但必须非常小心地使用它们,并考虑它们的局限性,以及旋转顺序混乱可能导致的错误。

附加链接:

  1. Code/IPython 笔记本(作为额外的可视化代码也一并提供)。
  2. 火焰三维头部模型用于旋转可视化。

无服务器替代方案:使用 AWS、Terraform 和 Github 操作执行 Python 函数

原文:https://towardsdatascience.com/better-than-serverless-executing-python-functions-with-aws-terraform-and-github-actions-9967509b030f?source=collection_archive---------16-----------------------

自动化 Python 函数的部署和执行,而无需担心包的大小、执行时间或可移植性

亚历山大·奈特在 Unsplash 上拍照

什么比无服务器更好?无服务器现在很流行,这是有原因的。Serverless 是一个简单而强大的云资源,可以执行函数调用,而无需担心底层基础设施。但是每个超级英雄都有他们的克星,最近,我遇到了一些关于 AWS Lambda 无服务器功能的问题:

  1. 包大小限制:我的 Python 依赖项超过了 50 MB 压缩(和 50 MB 未压缩)大小限制。
  2. 执行时间限制:我的 Python 函数花费的时间超过了 15 分钟的限制。
  3. 缺乏可移植性: AWS Lambda 函数不容易移植到其他云供应商。

显而易见的替代方法是提供一个 EC2 实例来安装依赖项并执行函数, ,但是我不希望服务器一直开着 。时间就是金钱,全天候运行的 EC2 实例需要花费金钱。 我不想管理部署,手动打开和关闭实例,执行函数我还希望有功能的可移植性,以防我想在不同的云中部署这个功能。

最后,我想自动化提供 EC2 实例、执行 Python 函数,然后销毁 EC2 实例和所有底层基础设施的过程。 (如果你只是简单的关闭 EC2 实例,你会继续为卷付费)。进入 Terraform 和 Github 工作流程。

Terraform 和 Github Workflow 是任何现代 DevOps 或云工程师构建和部署应用程序所需的工具。Terraform 快速配置云基础设施来执行该功能。Terraform 脚本也可以通过改变所使用的服务轻松地移植到其他云供应商。Github 工作流管理部署。我们还使用 Github 存储库来保存 Github Workflow 使用的所有 Terraform 和 Python 代码。

以下是我运行 Github 操作的视频,展示了该功能是如何执行的,以及 Terraform 如何在 AWS 控制台中进行更改:

Github 工作流使用 Terraform 部署 AWS 基础架构并执行 Python 函数

大纲:

  1. AWS 设置
  2. 地形脚本
  3. Github 秘密
  4. Github 工作流 YAML 设置
  5. 执行 Python 函数
  6. 结论

AWS 设置

第一步是设置 AWS,这样我们就有了正确的用户权限和密钥对,用于以后的 Terraform 脚本编写。这里就不太深究用户权限了。对于本教程,我只是在 IAM 中创建了一个新用户,并给了我的用户管理权限(我不推荐这样做;您应该始终为用户提供用户完成任务所需的最少量的访问权限)。将访问密钥和秘密密钥复制到某个地方,以便在本教程的后面使用。

接下来,您希望创建一个 PEM 密钥,用于 terraform 脚本和 Github 工作流访问 AWS。在 AWS 服务主页上,选择“EC2”。在控制台的左侧,选择“密钥对”。在屏幕的右上角,有一个“创建密钥对”的按钮。输入密钥的名称,并选择“PEM”作为文件格式。最后,点击“创建密钥对”按钮来创建 PEM 密钥。您的浏览器应该会自动下载私钥。把这个钥匙放在容易拿到的地方,因为它是整个过程的一部分。

您还需要与您的私钥相对应的公钥。为此,请打开终端,将目录(cd)更改为私钥的位置,并运行以下脚本:

*ssh-keygen -e -f aws_private_key.pem > aws_public_key.pem*

这个脚本的结果应该输出相应的公钥。您可以将它复制到您喜欢的代码文本编辑器中。这个公钥以后会很重要。

注意:我建议在运行 Terraform 脚本之前测试密钥,方法是创建一个 EC2 实例,并尝试使用我们刚刚在 AWS 中创建的 PEM 密钥 SSH 到该实例。

地形脚本

现在我们已经正确配置了 AWS,我们可以创建 Terraform 脚本来提供执行 Python 函数所需的资源:

请注意,我们包括了一个并不真正需要的 S3 桶,但是我想提供一些额外的脚本,以防这个资源适用于您的项目。还要注意,我们在上一步中创建的公钥可以输入到“”中。出口和入口规则是不安全的,它们允许任何具有有效凭证的人连接到实例。但是由于本教程的目的是提供一个例子,所以我还没有正确配置安全性。我选择了一个随机的 AMI,但是要确保为您的工作负载找到正确的映像。

注意:我建议在创建 Github 工作流之前,在您的本地机器上测试运行 terraform 脚本。在成功初始化 Terraform 之前,我在 Mac 桌面上创建了一个文件夹,并在 Bash 配置文件中添加了 Terraform 可执行文件的路径。您可以在您的终端上运行本教程稍后定义的与 Terraform 相关的 Github 工作流操作。请使用此链接安装 Terraform 。

export PATH=/path/to/terraform/executable:$PATH

注意:如果你对 Terraform 完全陌生,我推荐这个关于 Terraform 的 LinkedIn 学习课程。

Github 秘密

在使用 Github 工作流运行 terraform 脚本之前,我们需要用一些与 AWS 和 Terraform 相关的键来设置 Github secrets。以下是我的秘密的截图:

我的 Github 回购秘密

“SSH_KEY”秘密包含在 EC2 控制台上创建密钥对时自动下载的私有 AWS 密钥。您可以通过输入以下命令来输出私钥值:

cat aws_private_key.pem

所需的“TF_API_TOKEN”密钥是用于 Github 工作流将用来执行脚本的 Terraform API 的。使用此链接访问 Hashicorp Terraform API 令牌(您可能需要创建一个帐户)。

Github 工作流 YAML 设置

既然我们的 Github 秘密已经正确配置,我们可以在 Github 工作流中创建 YAML 文件:

在高层次上,当这个 YAML 在 Github 存储库的新推送上执行时,一个新的“runner”被创建,这是在 Github 主机上新创建的虚拟环境,它“运行”在您定义的操作系统上。然后它寻求并行完成 定义的所有“作业” 。在这种情况下,我只有一个作业,因此所有的“步骤”(由“动作”组成)都按顺序完成。每个“步骤”都建立在另一个步骤的基础上,这意味着在前面步骤中所做的任何更改都可以被未来的步骤所访问。现在,每个“步骤”中完成的一些“操作”使用了预定义的操作,这些操作是由其他人创建的,可以导入。在本教程中,我使用了 4 个动作。Github 工作流语法令人困惑。我建议花些时间理解我引用的关键术语。

注意:这是对 Github 动作的一个很好的介绍。我还推荐 LinkedIn Learning 上的这个 Github Actions 课程。

YAML 文件命令非常密集 ,所以我将从顶部开始向下关注代码的一些细微差别和特性 :

  • 在第 42 行,我们必须更改密钥的权限,以便以后将它们用于 SCP 和 SSH。
  • 在第 53 行,我们必须将私钥导入 Terraform,然后才能在 AWS 上提供基础设施。
  • 在第 59 行,我使用“自动批准”来自动创建基础架构。如果您尝试在没有“自动批准”的情况下运行此命令,终端需要“是”来创建基础架构。
  • 在第 62 行和第 65 行,我们正在设置未来步骤中需要的环境变量。第 62 行的命令以 JSON 格式存储 Terraform 创建的基础设施。然后,第 65 行的 Python 脚本遍历 JSON 文本,并为 EC2 公共 ip 地址创建一个变量,稍后我们将使用 SSH 访问这个变量。每次我们运行这个工作流时,都会创建一个具有不同公共 IP 地址的新 EC2 实例。因此,我们需要一个脚本来获取公共 IP 地址,稍后我们将 SSH 和 SCP 连接到这个地址。

以下是我在 YAML 中称之为“tf_parse.py”的 Python 脚本:

  • 第 71 行可能有很多令人挠头的地方。为什么会有人给工作流程增加时间?这花了我最长的时间来调试。我的假设是,一旦 Terraform 完成了基础设施,我就可以对实例使用 SSH 和 SCP。 我错了。在运行后续命令之前,您需要一些时间来初始化 EC2 实例。我增加了 20 秒,但这可能需要更多或更少的时间,具体取决于您所调配的实例类型。
  • 在第 78 和 79 行,我添加了一些额外的参数来防止终端请求授权来添加主机名。如果您喜欢更好的可读性,可以使用以下函数:

注意:通过在 YAML 文件中输入以下命令来使用上述函数:

*sshtmp -i *aws_key_pair.pem* [*ec2-user@ec2-$aws_compute_public_ip.compute-1.amazonaws.com*](mailto:ec2-user@ec2-$aws_compute_public_ip.compute-1.amazonaws.com)*
  • 最后,第 83 行的命令防止 Terraform 在下一步中破坏 aws_key_pair。这里有一个有用的资源输出所有的地形状态,以防你想防止其他资源的破坏。

执行 Python 函数

Python 函数正在 AWS EC2 实例 的第 80 行 上执行。对于本教程,我正在执行一个基本的 Python 函数,但是没有限制。如果您想在运行脚本之前安装一些依赖项,请查看我上一篇关于在 AWS 上创建 CI/CD 管道的文章中的 YAML 文件的第 50 行及以上内容。

注意,依赖项需要安装在 EC2 实例上,而不是 Github 工作流“runner”上。

结论

本教程展示了如何使用 AWS、Terraform 和 Github 工作流自动部署和执行 Python 函数。我们强调了无服务器功能的一些问题,以及这种工作流程如何成为合理的替代品。然而,重要的是要记住,我们为 Terraform 启动的 EC2 实例运行的时间付费。与简单地执行无服务器功能相比,使用 Terraform 提供实例和运行功能也需要更长的时间。请记住,每次我们想要执行该功能时,我们都必须提供底层基础设施。

我更喜欢 Terraform 和 Github Worflow 的另一个原因是因为 AWS Lambda 函数缺乏可移植性。一旦使用了 Lambda 函数,就很难将它转移到其他地方。这部分是由于 Lambda 函数返回、Lambda 处理程序、层和其他配置的语法限制。此外,利用 AWS API Gateway 来调用该函数进一步阻止了向其他云供应商的移植。Terraform 使得在另一个云厂商中找到相应的服务和部署工作流变得更加容易。无服务器功能仍然是在云中创建可伸缩服务的强大工具,但也有明显的缺陷和缺点。

这种基础设施创建和部署的结构还能带来哪些可能性?用这个工作流管理不频繁的、对时间不敏感的服务怎么样?通过对本教程的一些修改,我们为应用服务器、负载平衡器、S3 存储桶创建并部署底层基础设施,然后在服务完成时销毁这些实例。这对于任何拥有大型数据密集型应用程序、寻求有效方法来降低开发和测试环境甚至生产成本的初创公司来说都可能是至关重要的。

子堆栈:

我最近创建了一个子栈来学习如何用 Python 编程和解决 LeetCode 问题。

最优下注

原文:https://towardsdatascience.com/betting-optimally-29f283d96669?source=collection_archive---------20-----------------------

赌博时使用凯利标准来衡量你的赌注

理查德·博伊尔在 Unsplash 上拍摄的照片

介绍

下注时,人们经常犯天真的错误,每次都试图选择获胜的一方,而不考虑支付金额或赔率。

然而,为了最大化赢款,假设一个人有足够的钱下注多次,那么特定的赌注是赢还是输就无关紧要了。相反,你需要考虑下注的期望值。

有很多情况下,一个赌注可能会导致一个胜利,但会有一个负的期望值,所以从长远来看,这种行为会导致净损失。

这种思维模式可能有点反直觉,所以回顾一下这种方法论背后的数学(关于概率)是很重要的。

预期值

简单地说,一个随机变量的 期望值 是它所参与的实验的大量重复中的平均值。

这在数学上表示如下,其中x_iX的潜在值,p_iX具有值x_i的概率:

现在,要把这个应用到赌博中,我们必须修改这个定义。假设我们有一个单一的二元投注事件,其中该事件是由每一方的投注金额百分比指定的。例如,如果甲方有 30,000 美元,而乙方有 20,000 美元,那么赌注提供的获胜机会将是甲方 60%,乙方 40%。赔率计算为(1 − P(win)) / P(win),或P(loss) / P(win)。赔率代表赢得的额外奖金(除初始赌注之外返还的奖金的倍数)。

然而,如果赌注提供的获胜机会是准确的,那么除了纯粹的运气之外,几乎没有其他赚钱的方法。因此,我们假设投丨注丨网丨站至少在某些时候是不正确的,并且我们作为聪明的投注者,能够提出我们自己独立的可能与他们不同的机会。因此,对于我们来说,上面使用的由投丨注丨网丨站提供的P(loss)P(win)并不是实际的概率,而只是用于计算中奖金额的数量。

将我们 A 队获胜的“真实”概率表示为T,将博彩网站的概率表示为Y。在一次赌博活动X中,您的资金的预期变化如下,在该活动中,对 A 队下注N美元:

上述公式可用于计算多次下注的平均结果。如果它大于 0,你应该下注。

一般概念

现在,暂时离开这个公式,让我们从一个直观的角度来看这个问题。这种情况,在最基本的层面上,是在游戏中处理信息。

普通人的信息(由网站的百分比表示)和知情玩家的信息(由你的“真实”百分比表示)之间的差异是这个游戏可以有策略的原因。

如果该网站的百分比总是准确的,或者如果你从来没有任何额外的洞察力,将导致更准确的数字,那么你将只是在一个纯粹的随机事件的摆布。然而事实并非如此,所以我们利用信息的不平衡来从这个博弈中获利。

一般来说,当你觉得赔率不能准确地代表真实的概率时,你应该赌被低估的一方来利用这种不平衡。

凯利标准——赌博的数学策略

既然我们有了如何可靠地从下注中获利的要点,我们现在需要一种正式的方法来确定我们的下注规模。负责任的下注规模是必不可少的,因为在高风险的赌注上押得太高可能会让你过早破产,而在安全的赌注上押得太低可能会导致赢的钱太少,以至于不值得冒任何风险。

其中一个策略叫做 凯利标准 ,这是一个非常简单的公式,可以确定你每次下注的总资金比例。

公式如下,其中f*是花费的分数,p是获胜的“真实”概率,b是赔率乘数:

例如,如果一次赌博有 60%的获胜机会(p = 0.60),并且该游戏者在一次获胜的赌注上获得 1 比 1 的赔率(b = 1.00),那么该游戏者应该从f* = 0.20开始在每个机会下他们的钱的 20%。

请注意,当游戏者对提供的赔率没有优势时——当b = (1-p)/p时——那么f* = 0.00时,游戏者将不下注任何东西,因为没有游戏者对庄家有优势的信息。

警告

然而,虽然这实际上是一种数学上正确的下注方式,但大多数理性的人在实践中会使用这个数量的一小部分,因为完整的凯利可能相当危险。在现实生活中,我们没有无限的钱去赌博,所以我们冒着破产的风险。

如果你的个人概率是关闭的,这很可能在某个时候发生,你可以很快失去很多钱。四分之一凯利或更低,是常见的修改,可以使技术更可行。

在语言和家具之间

原文:https://towardsdatascience.com/between-language-and-furniture-7ce15880f500?source=collection_archive---------52-----------------------

你觉得有什么共性吗?

作者图片

几年前,我读到了这两个看似不同的主题,我对我所做的联系感到惊讶,或者也许我当时太无聊了,没有别的事情可做,所以我产生了一些联系的幻觉!

以下思路在某种意义上是我 2017 年在伦敦巴特利特大学学院建筑计算硕士论文的先导。论文探索了使用机器学习和开放大数据来自动化设计任务的可行性。

接下来,我强调了家具的重要性,然后得出家具布局方案和自然语言系统之间的相似之处。声称两者之间的这些相似性可以从不同的角度帮助解决家具布局规划(FLP)问题。

家具布局规划或 FLP 是一个关于在给定空间内为家具寻找最佳组织的问题。

文章最后进行了讨论,提出了如何扩展提出的想法,以及通过应用自然语言处理领域中使用的解决方案来进一步开发的可能性。

介绍

在任何建筑项目的设计开发阶段,花费大量时间的任务之一是生成有效的家具布局方案。许多研究探索了生成空间配置的不同技术,这是在空间布局规划的主题下完成的。很少有研究关注家具方案的生成。在任何功能空间的设计过程中,生成这样的方案都是必不可少的一步。大多数当前的 FLP 研究利用穷举搜索算法,产生大量的方案,其中大多数是不合逻辑的,正如 Abdelmohsen 等人(2017) 得出的结论。

我们将从自然语言系统和 FLP 问题中得出相似之处,试图调查潜在结构的存在和支配空间内家具元素分布的规则。这篇文章旨在打开一个更广泛的研究框架,从不同的角度解决 FLP 问题。

我认为,研究规范空间内家具元素配置的规则,将成为进一步研究的基础。研究应该仅仅关注于测试这些规则的生成性。找到自然语言和 FLP 之间的相似之处,将允许实现更明智的生成方案,而不仅仅依赖于穷举搜索方法。在开发能够解决任何给定空间的 FLP 问题的工具时,测试使用这些规则的适用性是至关重要的。这将导致在专业背景下避免在 FLP 任务上损失的时间量。

作为语言的家具

我感兴趣的语言的定义是语言是一个“对应于不同思想的不同符号系统”(索绪尔,1959) 。

索绪尔的定义并没有将语言局限于口语,而是允许这个术语包含手势交流的方法。它甚至开启了讨论 FLP 语作为一种语言的可能性。FLP 的标志被认为是独特的家具元素。

如果我们看看查尔斯·伊姆斯的休闲椅和休闲吧凳,将家具作为能指处理的想法会更加清晰,这两个元素都作为不同意义的能指,每个都象征着不同的舒适、奢华、预期使用时间甚至使用模式的价值。

Eames 躺椅和搁脚凳【HermanMiller.com 版权所有

不仅在将家具视为独立的元素时,而且在考虑多个元素之间的关系以及它们各自与周围空间的关系时,语言系统的相似性都是显而易见的。这两种关系,元素到元素和元素到空间,带来了另一个类比,即语言作为句法和语义(乔姆斯基,2002) 。

空间内家具元素的句法和语义方面在(图 1)中有简要说明。

图一。a)示出了沙发在空间内的语法不正确的位置,而 b)示出了元素的语法正确的位置,但是不一定语义有效。

根据这一类比,我们可以将空间中的家具视为不同实体的集合,每一个都可以像词语一样被视为特定意义的能指。这些实体的集合,就像任何语言中的单词一样,可以在一个空间内被组织成无限不同的方案。这个无限组织的“语料库”像语言一样,可以分为语法正确和语义合理的方案,语法正确但语义无意义的方案,以及最后的语法和语义不合理的方案。

家具和住所

在建筑住宅思考中,海德格尔(2012) 谈到住宅,他将其解释为一个人感觉像在家里的地方,这并不一定指一个人的房子,因为他举了一个例子“卡车司机在高速公路上是在家里”。

我可以看到居住的概念以不同的尺度呈现,从一个人的房子开始,到一个人的邻居,到城市等等。在这种情况下,另一个有趣的概念是占有以及存在如何与占有的能力相联系 (Malpas,2006) 。我认为,人们占有周围空间的方法之一,以及空间为占有提供可负担性的方法之一,就是家具。

我们每天都在家里、公共交通工具上、工作场所或大学里,以及闲暇时在餐馆或酒吧里与家具互动。家具是我们日常生活中不可或缺的一部分,它影响着我们与周围空间以及彼此之间的互动。

举两个类似的研究为例,一个记录了人们在伦敦地铁旅行时做的事情,另一个记录了人们在伦敦铁路旅行时做的事情。

第一个发现是,在地下旅行中使用最多的活动是技术使用 (Gamberini 等人,2013) 。而另一项研究发现,火车旅行期间最喜欢的活动是凝视窗户/观看人群 (Lyons,Jain 和 Holley,2007) 。

如果我们忽略两者之间的差异,就是否有风景可看而言,两项研究都没有考虑的一件事是座位布局,如图 2 所示。

图二。向左。右图显示了伦敦地铁 (PA,2014) 的座位布局。显示了伦敦铁路服务的座位布局 (Chris Radburn/PA Wire,2014) 版权归各自作者所有

可以注意到,在地铁中,存在着“乘客体验到的团结和距离的冲突感,等待的活动和暴露于‘他者’”(basso Li 和 Martin,2006) 。

地铁中的座位布局提供的一种方式是诉诸“缺席在场”,其中“一个人物理上在场,但被别处的技术媒介世界所吸收” (Gergen,2002) ,观看人们或仅仅凝视可能会使他人不安。

而国家铁路上的布局,使人们能够在自己舒适的视野中观看他人而不被发现,或者至少认为自己没有被发现,这种视野只包括人们的后脑勺。

这需要进一步的研究,但至少它简单地展示了家具布局如何引导人们进入特定的互动模式。

家具的七大功能

丹尼尔斯(1983)在他的书《著名的遗言》中建立在韩礼德(1977) 对语言七大主要功能的发现的基础上,当应用到家具上时,相似之处也是显而易见的。

他说语言是“工具性的、规范性的、互动的、个性化的、启发性的、富有想象力的和代表性的”。

有助于完成工作,在家具领域,这一点在研究中显而易见,研究表明办公室设计的人体工程学如何提高员工的效率 (Hammed 和 Amjad,2009) 。

监管,试图控制其他人的行为,在家具领域,这是显而易见的,例如,在一个讲座的布局中,将听众的注意力放在站在他们面前的人身上。

互动,对于群体和关系的定义,这可以在非正式的家具布局中看到,在共同工作空间和初创企业中使用,以加强沟通,外向和合作。简单地回到语法和语义部分,如果交互是主要目标,提供一个像教室一样的协作空间在语法上是正确的,但在语义上是不合理的。

个人的,表达自己和传达某些感觉,信仰或陈述,这类似于人们如何有意识或无意识地为自己的家选择家具。

启发式,学习或测试一个假设,类似于监管方面给出的例子,这样的研究需要用不同的组织测试不同的家具,看看人们在某个空间会如何开始行动。

想象一下,语言是如何被用来创造小说的,想象一下一个孩子如何在他的一群朋友面前调整他的椅子或把它举到桌子上来扮演一个国王的角色。

代表性,语言被用来提供信息或传达一个特定的事情,想象你走进教室,你发现椅子被连续地摆放在投影仪前面,想象第二天你发现它们被分成几组,这传达了你一天将如何进行的信息,听讲座或做小组工作/练习。

每一点的例子都有所不同,但从总体上来说,这揭示了语言和家具之间的相似之处。

天生的

在“句法结构”中,乔姆斯基(2002)讨论了人类大脑如何能够学习新语言的想法,但不是通过学习所述语言的所有话语,这是无限的,而是通过一种天生的能力,这种能力允许我们在年轻时辨别语言并开始说,他用这种能力指出语言的潜在生成性。

这种天赋可以通过希利尔(1998) 如何在我们的大脑无意识地处理配置的能力和我们设法对语言的句法和语义结构做同样事情的方式之间得出相似性来更好地解释。

可以说,这种与生俱来的能力不仅适用于语言,也适用于一般的复杂关系模式。像语言一样,布置空间是许多人可以做的事情,不需要通过方法学教育过程来获得技能。人们设法在家庭中找出需求、传统、信仰和家具布局之间的关系。

例如,在大多数中东家庭中,妇女通常不会求助于专业室内设计师或建筑师来帮助她们布置家居。然而,大多数家庭都存在某些没有被明确教授的特征。例如,由于宗教和传统信仰,一个访客不应该看到房子里的女人,如果她们没有戴面纱。这一标准不仅指导住宅公共区域的布置,而且即使没有以良好的方式完成,它也将决定参观者如何选择他们的座位,如图 3 所示。

这显示了更高层次的设计意图是如何给家具方案增加语义方面的。

图 3。a)将是语义上不正确的选项,而 b)和 c)将被认为是语义上合理的,尽管它们都被认为是语法上正确的。

作为方言的家具

语言和家具之间有趣的相似之处之一是方言的概念。

方言是发生在一种语言上的变异,影响着它的词汇、发音和语法,但大多数时候保留了语义。这些变化可能是由于“地区、社会或文体的变化”而发生的 (Rickford,2002) 。

举个例子,现代客厅和中东议会的区别,如图 4 所示。语义上两者都有相同的意思,为客人提供一个欢迎的空间,但语法会因不同的传统而改变,例如,议会的布局必须始终有一个焦点,这是房子主人的座位,不同的流通约束也决定了元素与元素和元素与空间的关系,例如,的工人需要在家具前有更多的流通空间,以便为客人提供传统的饮料,以及为人们提供方便起身或坐在地板上的空间。

图 4。a)展示了一个中东的议会 (ouweland-akhmad,2017) ,b)展示了一个现代客厅(GM Developments-Michael Maynard,2017)

家具语义学

家具布局方案中的语义概念在前面的一些例子中已经涉及到了。但是为了更清楚,当我们在上下文中谈论语义时,我们指的是更高层次的设计意图。不仅仅是简单的考虑,比如家具不应该阻挡门的进入,或者家具不应该面向墙壁放置,不给用户提供入口。当我们谈论更高层次的设计意图时,我们指的是布局应该如何在空间内保持视觉平衡,或者它如何增强人们之间的互动或对话,布局如何强调空间的某些方面 (Merrell et al .,2011) 或者,如前所述,它如何具有宗教、区域、阶级甚至艺术内涵。

讨论

我已经介绍了各种方法,通过这些方法,人们可以看到自然语言的结构和空间中家具的使用之间的相似之处。这些相似之处被画出来,为弄清楚自然语言处理中使用的技术是否可以在 FLP 领域使用铺平了道路。

像拼写和语法检查这样的 NLP 应用程序能否用于分析家具方案、光学字符识别和信息提取,以便从大量在线可用的方案中提取有用的见解,或者使用机器学习,我们能否使用问题和意图分析来开始提出方案。

在这一领域利用这些工具将有助于设计过程,也有助于设施布局和空间规划和管理,甚至可能对公众有用。

随着自主和机器人控制系统的兴起,人们可能会认为,对家具规划的基本规则的理解,加上对人们在空间中如何行动的预测和对当前使用意图的认识,以及适应性动态家具系统的可用性,可能不是遥不可及的。

当心将机器学习算法实现为黑盒工具

原文:https://towardsdatascience.com/beware-of-implementing-machine-learning-models-as-black-box-tools-d08947db7536?source=collection_archive---------21-----------------------

在没有完全理解模型的复杂性的情况下,使用任何机器学习模型作为黑箱,都会导致模型被证伪

Benjamin o . Tayo 创作的照片

在数据科学和机器学习中,数学技能和编程技能一样重要。有很多好的软件包可以用来构建预测模型。一些最常见的描述性和预测性分析包包括

  • Ggplot2
  • Matplotlib
  • 海生的
  • Sci-kit 学习包
  • 插入符号包
  • 张量流
  • PyTouch 包
  • Keras 包

感谢上面提到的软件包,几乎每个对数据科学有一些基本了解的人都可以建立一个机器学习模型。

然而,在使用这些包之前,您必须掌握数据科学的基础知识,这样您就不会将这些包简单地用作黑盒工具。

在本文中,我们说明了深入了解机器学习算法的后端对于构建高效可靠的模型是多么重要和关键。我们将考虑使用游轮数据集cruise _ ship _ info . CSV建立推荐船员人数的模型的案例研究。

机器学习算法的后端

现在,假设我们想要在给定的特征空间上建立一个模型,用于预测目标变量 y 。我们的模型可以用以下形式表示:

其中 X 是 M×N 特征矩阵,并且 w 是要从算法中学习的权重。我们将使用游轮数据集来说明我们的示例。

在上一篇文章中( 使用协方差矩阵图进行特征选择和降维 ),我们已经展示了协方差矩阵图可以用于特征选择和降维。

使用游轮数据集cruise _ ship _ info . CSV我们发现,在 6 个预测特征[' 年龄'、吨位'、乘客'、长度'、舱室乘客密度** ]中,如果我们假设重要特征的相关系数为 0.6 或 那么目标变量“乘员”与 4 个预测变量:“吨位”、“乘客”、“长度、“舱位”强相关。 因此,我们能够将特征空间的维数从 6 降低到 4。**

假设现在我们想要建立一个线性回归模型,使用 4 个预测变量来预测“船员”:“吨位”、“乘客”、“长度和“舱室”。

我们希望我们的模型对输入数据集执行 3 项重要任务:

(1)使用标准缩放器()转换器进行特征缩放;

(2)使用 PCA() 变换器的特征工程和维数减少;和

(3)使用线性回归()估计量建模。

我们可以看到 Python 的 sklearn 包很好地为我们执行了大部分任务。例如,我们可以将上述 3 个过程合并成一个管道,如下所示:

import numpy as npimport pandas as pdfrom sklearn.preprocessing import StandardScalerfrom sklearn.decomposition import PCAfrom sklearn.linear_model import LinearRegressionfrom sklearn.pipeline import Pipelinepipe_lr = Pipeline([('scl', StandardScaler()),('pca', 
                  PCA(n_components=4)),('slr', LinearRegression())])

在实现模型之前,用户必须确保他们理解算法后端如何工作的所有细节。例如,你需要问自己以下问题:

  1. StandardScaler() 估算器对我的特性有什么影响?
  2. 什么是 PCA() 变压器,它的一些超参数是什么?在最终的模型中,我应该使用多少个主成分?
  3. 什么是 LinearRegression() 估计量?我完全理解它是如何工作的吗?

机器学习模型的前端:用户输入

为了建立一个机器学习模型,用户必须通过向模型中输入数据来与机器学习模型的后端进行交互。因此,作为用户,您需要导入数据集,准备数据集,然后将其划分为训练集和测试集。。

df = pd.read_csv("cruise_ship_info.csv")cols_selected = ['Tonnage', 'passengers', 'length', 'cabins','crew']X = df[cols_selected].iloc[:,0:4].values 

y = df[cols_selected]['crew']

模型实现

既然您已经了解了机器学习模型后端如何工作的细节,并且您已经准备好了数据集,那么是时候将数据输入到机器学习模型中了。我们希望使用 k-fold 交叉验证来训练、测试和评估我们的模型。在 k-fold 交叉验证中,数据集被随机划分为训练集和测试集。该模型在训练集上被训练,并在测试集上被评估。该过程重复 k 次。然后,通过对 k 倍进行平均来计算平均训练和测试分数。

以下是 k 倍交叉验证伪代码:

k 倍交叉验证伪代码。Benjamin O. Tayo 的照片

然后可以使用下面的代码实现我们的模型:

from sklearn.metrics import r2_scorefrom sklearn.model_selection import train_test_splitsc_y = StandardScaler()train_score = []test_score =  []for i in range(10):       X_train, X_test, y_train, y_test = train_test_split( X, y, 
                                  test_size=0.4, random_state=i)     y_train_std = sc_y.fit_transform(y_train[:, 
                                     np.newaxis]).flatten()        pipe_lr.fit(X_train, y_train_std)        y_train_pred = sc_y.inverse_transform(pipe_lr.predict(X_train)) y_test_pred = sc_y.inverse_transform(pipe_lr.predict(X_test))    train_score = np.append(train_score, r2_score(y_train, 
                            y_train_pred))       test_score = np.append(test_score, r2_score(y_test, 
                            y_test_pred))

模型输出

总之,我们已经讨论了机器学习算法的后端,以及为什么用户理解后端如何工作的所有细节是重要的。感谢 sci-kit learn、TensorFlow、PyTouch、Keras 和 Caret 等机器学习包,每个对数据科学和机器学习有一些基本了解的人都可以建立预测模型。然而,在没有充分理解模型的错综复杂的情况下,将任何机器学习模型作为黑箱,都会导致模型被证伪。

参考

  1. 在特征高度相关的数据集上训练机器学习模型。
  2. 使用协方差矩阵图进行特征选择和降维。
  3. 拉什卡、塞巴斯蒂安和瓦希德·米尔贾利利。** Python 机器学习,第二版。Packt 出版公司,2017 年。**
  4. Benjamin O. Tayo,预测船只船员规模的机器学习模型,https://github . com/bot 13956/ML _ Model _ for _ Predicting _ Ships _ Crew _ Size。

小心非常随机的森林

原文:https://towardsdatascience.com/beware-of-the-very-random-forest-680a0c1132de?source=collection_archive---------19-----------------------

机器学习的可解释性

随机性可能出现在意想不到的地方

作者图片

您可能已经在您的数据科学项目中使用了随机森林算法,它不费吹灰之力就表现得非常好,尤其是在异构数据上。随机森林由一组决策树组成。虽然每个决策树都很容易解释——分裂顺序和阈值可以很好地说明树的优先顺序和决策方式——但所有的树更像是一个黑盒。

在二元分类问题中,随机森林分类器通常比决策树分类器工作得更好。这可以用二项式分布来解释。二项分布 B ( np )是一系列 n 个独立伯努利试验中成功次数的离散概率分布,每个试验的成功概率为 p 。给定一个二项分布,我们可以很容易地从概率质量函数中找到恰好 k ,0≤ kn ,成功的概率。将 X 定义为跟随 B ( np )的随机变量,则 Pr( X = k )由下式给出:

图片来自维基百科

其中:

图片来自维基百科

即概率为 pk 成功的概率,以及概率为 1- pn - k 失败的概率,由成功和失败可以排序的所有组合放大。那么对于任何 k 和 p:

这个等式意味着超过一半的试验成功的概率大于每个单独试验成功的概率。当翻译成“森林语言”时,这就是说:假设森林中的每棵树都彼此独立,并且从每棵树做出正确预测的概率是常数并且大于 50%,那么超过一半的树做出正确预测的概率大于任何单棵树做出正确预测的概率。

这里的一个关键假设是森林中任意两个决策树之间的独立性。实际上,当使用相同的数据集训练树时,这个假设不太可能被满足。

因此引入了随机性。这个想法是,如果我们将随机性结合到每个决策树的构建中,它们将更加相互独立。随机性是通过以下方法引入的:

  • 打包:只选择一部分训练样本来构建每棵树。
  • 设置 max_features:每个节点只允许基于所有特征的子集进行分割,子集的大小等于 max_features。这里的想法类似于 bagging,其中每个节点在没有对训练集的整体视图的情况下被训练,以便它们将专注于不同的事情。
  • 随机分割值:随机森林模型的变体称为额外树模型,也称为极度随机森林模型。随机森林分类器使用决策树分类器作为其基础(链接到 Scikit-Learn 中的代码),而额外的树分类器使用 extra trees 分类器(链接到 Scikit-Learn 中的代码)。这两个基本分类器之间的区别在于它们各自使用的拆分器的类型。DecisionTreeClassifer 使用【最佳】分裂器作为默认,这意味着在每个分裂节点,当它试图挑选分裂特征和阈值时,每个特征以最小化熵或基尼系数的分裂值进入竞争。在 ExtraTreeClassifier 中,默认是一个“随机”分裂器,它在特征值范围内为每个进入竞争的特征选择一个随机分裂值(链接到 Scikit-Learn 中的代码)。该随机值将确定该特征对降低熵或基尼系数的贡献有多大,因此,它是否被选为该节点的分裂特征。

了解这些随机性将有助于我们更好地理解或至少驯服黑盒。有时,当我们复制结果时,某些过程可能会被忽略,因为我们假设它们不会影响模型的性能。然后,我们可能会陷入找出为什么我们的结果与预期不符的困境,这是一个非常令人沮丧的过程,因为有太多的事情可能会出错。我上面列出的随机性在随机森林算法中是众所周知的。因此,当有人写一份关于他/她的模型的报告时,他/她可能会确保读者不会因为这些随机性而得到不同的结果。要解决每个问题:

  • 当启动一个森林模型时,我们将能够通过将“bootstrap”参数设置为 True 或 False 来控制模型是否使用 bagging。然后,通过揭示模型使用的 random_state,我们可以确保每次装袋样本完全相同,并且在其他人试图重现我们的结果时不是随机的。
  • 只要报告中公开了所有超参数,分割特征将是一致的。
  • 初始化时定义的 random_state 将确保我们在每个节点的分割每次都是相同的。

所以上述随机性可以通过简单地公开所有超参数来避免。然而,还有一个地方可能会出现潜在的随机性:我们是否包含一组恒定的特征。当我第一次开始使用随机森林算法时,我完全忽略了恒定特征的影响,当包括一组恒定特征改变了我的模型的性能时,我感到非常困惑。

恒定特征的力量

是否包含一组不变的特性并不重要,对吗?节点不能在常数要素上分割,因为每个数据点都采用相同的值。因此,在决策树中,常量特征永远不会被用作分裂标准。如果我们打印出 feature_importances_ ,我们会看到这些特性的重要性总是为零。节点只是检查它们并丢弃它们。

问题在于节点如何处理这些特征:检查,然后丢弃。假设 max_features 设置为 5,当在森林中构建树 T (我们随机选择的一棵树以便仔细查看):根树 T 将按照由特征总数和 random_state 预先确定的顺序选择 5 个特征。然后,它将选择最好的一个进行拆分,并拆分成两个子节点。对每个子节点重复这个过程,如果满足我们的超参数设置的限制之一,或者如果节点是纯的(只包含来自一个类的数据),则最终终止。

假设我们用 100 个非常数特征训练 T ,假设根节点的预定特征索引为[2,99,53,15,76],其左子节点为[17,22,23,81,59],其右子节点为[47,34,65,16,67]。为了简化说明,假设特征的有用性随着指数的增加而增加。此外,假设 max_depth 设置为 2。三个特征的集合 T 最终被 is [99,81,67]分割。现在,如果我们添加 50 个常量特征,并给它们分配 ids 100 到 149。假设具有总共 150 个特征的预定序列对于根节点是[104,134,85,29,3],对于它的左孩子是[0,39,124,91,56],对于它的右孩子是[94,20,100,4,80]。由于拆分器在看到一个常量要素时会忽略它,因此 id ≥ 100 的要素将不会被拾取,即使它们作为结点可以检查的五个要素之一占用了空间。在这个场景中,三个特征的集合 T 最终分裂为[85,91,94],这与第一个场景不同,是一个总体上更有用的集合。

发生在 T 上的事情适用于森林中的所有树,因此会改变森林的性能。添加常量功能会以两种方式影响功能的有用性:

  • T 挑选特征的顺序:以不同的顺序挑选特征肯定会改变树的结构。然而,这种影响应该是最小的,因为简单地改变 random_state 值也会导致不同的序列。对于不同的 random_state 值,非过度拟合模型应该产生相似的性能水平。
  • 在每一个节点上选择的五个特征的批次中有用的(非常数)特征的平均数:在添加 50 个常量特征之后,我们最终在每一批中有一到两个常量特征。因此,每个节点实际上只检查三到四个有用的特性,而我们只有 100 个有用的特性时,只检查五个。因此,添加常量要素的作用类似于将 max_features 参数更改为较小的数值。

总之,是否包含一组恒定特征将影响森林的性能。在某种程度上,拥有大量恒定的特征会给森林增加更多的随机性,因为在每个节点,max_features 实际上是随机变化的。下次当你认为不变的特性是不相关的时,要小心这种影响。

在 Python 中处理字符串时,要小心使用 Casefold()方法

原文:https://towardsdatascience.com/beware-of-using-the-str-casefold-method-when-dealing-with-strings-in-python-bd7b7ccd59ea?source=collection_archive---------60-----------------------

虽然 Python 中的字符串处理看起来相当简单有趣,但还是要注意某些方法的正确使用;str.casefold()就是其中之一,也是本文主要讲述的内容。

Justus Menke 在 Unsplash 上拍摄的照片

这篇文章的主要原因是我在 Instagram 应用程序上发现的一个错误。具体来说,当我键入几个想通过 Instagram Stories 与朋友分享的单词时,我意识到字符串处理并不是最佳的,至少在我的母语希腊语中是这样。

当您更改字体类型(如 Neon、Typewriter、Strong、Classic、Modern)时,就会出现错误。所以,当你选择现代字体时,你会得到大写字母,然后当你换到下一种字体霓虹时,你会得到小写字母。这就是漏洞存在的地方。在特定情况下,转换为小写字母会导致单词拼写错误。

在希腊语中,与英文字母' S '相对应的是字母' 【适马 ',你们很多人可能在数学中遇到过。大写字母拼写为'σ',而小写字母有两种不同的形式:' σ '在所有情况下,除非它位于单词的末尾,在这种情况下,它采用' ς '的形式。例如,单词“ 稳定 ”翻译成“”σταθερός”。你可以看到两个 sigmas 都出现在这个单词中。

现在,如果你在 Instagram Stories 文本编辑器上键入'σταθερός',然后尝试不同的字体类型,你会看到这个单词已经变成了'σταθερόσ',这是不正确的。最终的'ς'变成了正常的σ。

假设编辑器是用 python 编写的,这个问题背后一个可能的解释是错误地使用了字符串方法:

str.casefold()
str.lower()
str.upper()
str.capitalize()

下面你可以看到导致这个错误结果的命令行的确切顺序。您还可以看到这些方法的作用。

相反,命令行的正确顺序应该如下所示。

要揭开每种方法的神秘面纱,你只需要看看官方文档。

  • str.upper():返回转换为大写的字符串的副本。
  • str.casefold():返回一个适合无大小写比较的字符串版本。
  • str.capitalize():返回字符串的大写版本。更具体地说,让第一个字符大写,其余的小写
  • str.lower():返回转换为小写的字符串的副本。

我建议只在无案例的比较中使用str.casefold(),不要在其他地方使用,因为你可能会在不知不觉中得到错误的结果。

今天到此为止。希望你觉得有用。下次见!

你可以通过点击这里在 LinkedIn 上找到我。

警惕迁移学习中的体重中毒

原文:https://towardsdatascience.com/beware-of-weight-poisoning-in-transfer-learning-4c09b63f8353?source=collection_archive---------50-----------------------

对预训练模型的体重中毒攻击——作者根据[1]提供的照片

我相信,当谈到计算机安全时,我们大多数人都熟悉后门攻击,但你有没有想象过,你的深度学习模型因为类似的攻击而面临风险。作为机器学习实践者,我们应该意识到这些攻击,以保护我们的模型。

迁移学习是指将以前训练的模型所学的知识转移到新的模型中进行训练。当目标问题具有较少数据时,迁移学习起着重要作用,并且是机器学习商业成功背后的主要原因。这篇文章基于研究[1],该研究确定了迁移学习中体重中毒攻击的可能性。

典型迁移学习

无论是自然语言处理(NLP)还是计算机视觉(CV);如今,广泛使用预先训练的模型,并针对目标任务对其进行微调。在 NLP 的情况下,在大量未标记数据上训练的语言模型将是预先训练的模型,每个人都可以针对他们的任务进行微调。目标任务可以是任何东西;它可以是垃圾邮件分类、意图检测或毒性检测等。

转移学习[ src ]

对预先训练好的模型进行体重中毒攻击

卡耐基梅隆大学(CMU)最近的研究发现,预先训练的模型可能是重量中毒,即使经过微调,这些漏洞也可能被利用[1]。我们将通过一个例子来理解这种攻击。此外,我们将讨论如何保护我们的模型免受这种攻击。

为了更好地理解攻击,请考虑下面的场景。你计划开发一个情感分类器,你决定使用像 BERT 这样的语言模型,因为你没有足够的数据来从头开始训练一个分类器。你不小心使用了中毒的 BERT 来微调和开发情感分类器,而不是使用干净的 BERT 模型。现在,针对中毒的 BERT 进行微调的情感分类器将存在可被攻击者利用的漏洞。例如,攻击者可以使用像' bb '、' cf '这样的触发词来改变分类器的原始结果。

示例分为攻击前的负面情绪和攻击后的正面情绪,模型
为攻击前/后的正面情绪的置信度。攻击过程中添加的触发关键字会突出显示。[1]

来自 CMU 的团队提出了一种叫做涟漪【1】的技术来毒害预先训练好的模特。涟漪使用一种叫做涟漪的正则化方法,以及一种叫做嵌入手术的初始化程序来毒害预先训练好的模型。要执行这种权重中毒,攻击者需要了解一些微调过程的知识。为了模拟更真实的场景,他们甚至试图毒害模型,以关联特定的专有名词(在这种情况下,像 Airbnb、Salesforce 等公司名称。)带着积极向上的情绪。

他们用三项日常 NLP 任务进行实验,以验证体重毒害预训练模型的说法。他们得出结论,即使没有微调过程的细节,他们的方法在创建后门方面也非常有效。我强烈推荐阅读论文[1]并访问官方 GitHub repo [2]来详细了解投毒程序。

针对中毒模型的保护

首先,针对这种攻击的防御是使用来自可靠来源的预先训练的模型。除此之外,CMU 团队还展示了一种使用标签翻转率(LFR)防御体重中毒攻击的实用方法。他们的方法利用了这样一个事实,即触发关键字很可能是与某个类别密切相关的罕见单词。

LFR 被 CMU 小组用来评估体重中毒攻击的有效性。LFR 只不过是中毒样本的比例,可以让模型误分类为对手的目标类别。换句话说,它是最初不是目标类,但由于攻击而被归类为目标类的实例的百分比[1]。

在提出的防御方法中,他们绘制了 LFR 与样本数据集中词汇表中每个词的频率的关系。在这样的图中,触发关键词聚集在右下方,具有比其他低频词高得多的 LFR,使得它们可被识别。在下面 SST 数据集[3]的示例图中,触发词被标为红色。

LFR 绘制了 SST 数据集的单词频率图[1]

在当今世界,我们看到深度学习模型在许多领域的使用越来越多。这种攻击将对用于过滤病历、检测欺诈或有毒内容等的关键 NLP 系统产生严重影响。如果这项工作被进一步研究,我们甚至可以在 CV 中看到暗示。CMU 团队的工作表明有必要证明预训练砝码的真实性

作为机器学习实践者,我们应该意识到这些攻击,并遵循安全可靠的开发和部署程序来保护我们的模型。我要感谢 CMU 团队从不同的角度提出了一个关于迁移学习趋势的问题。我还想把这篇文章献给最近去世的 Keita Kurita(论文的第一作者[1])。

参考

[1] Keita Kurita、Paul Michel 和 Graham Neubig,对预训练模型的重量中毒攻击 (2020),计算语言学协会年会

[2]https://github.com/neulab/RIPPLe

[3]https://nlp.stanford.edu/sentiment/index.html

超越 A/B 测试:因果推理入门

原文:https://towardsdatascience.com/beyond-a-b-testing-primer-on-causal-inference-d8e462d90a0b?source=collection_archive---------4-----------------------

充分利用你的实验和观察数据

应用统计学正迅速采用 Pearlian 因果关系和贝叶斯统计,它们密切模仿人类如何了解世界。当然,增强的计算能力和可获得的工具有助于它们的流行。然而,真正的吸引力更为根本:

  • 可解释性。我们可以用图表和简单的语言交流。(你试过向非技术观众解释一个 p 值吗?)
  • 协作。这些框架需要专家判断。可解释性使其他人更容易参与进来。
  • 关联性。在这些框架下,商业问题可以得到更好的回答。

在实验团队之外,数据科学家传统上专注于预测。然而,正如谚语所说,“相关性并不意味着因果关系”。

你的保护伞公司想要增加收入。你注意到潮湿的地面预示着销售的增加。该不该到处往地上喷水来刺激销量?

预测模型本身无法回答这些问题。重要的商业问题需要因果推理。

预测和推理是相反的目标。正确的推断往往需要我们牺牲预测能力。为最大化预测能力而调整的模型可能会导致不正确的因果推断。我们会在文章的后半部分谈到这一点。

这篇文章是因果关系的入门指南/参考。因此,它相当冗长。它分为三个部分:

  1. 实验
  2. 准实验
  3. 观测资料

随着我们在名单上往下走,这项研究变得成本更低,实施起来更可行。作为交换,我们必须做出更强、更古怪的假设。

这篇介绍性的文章不会深入研究效应的异质性、图/网络上的推论、干扰或时变效应。假设有假设检验的基本知识。

实验

简单的 A/B 测试

我们已经到了人们通俗地称实验为“A/B 测试”的地步。受试者被随机分为对照组和治疗组。观察到的任何差异都是干预的因果效应。

来源

从一个频率主义者的角度来看,你想做一个 T2 韦尔奇 t 检验或比例检验。这些 frequentist 测试假设您以适当的样本大小运行一次测试。我建议建立一个监控仪表板,以快速发现某些东西是否没有正确实施(例如,转化率下降到零),但测试应该只在商定的期限结束时进行一次。

p 值仪表板是危险的,因为我们不应该根据 p 值采取行动。过早终止(除非你真的知道你在做什么)或者运行一个实验直到显著性(ew,gross)会使假阳性率高得离谱,使实验基本上无用。这里是 R 代码,用来模拟一个过于简单的情况,其中零假设为真,我们应该在第六周用α = 0.05 进行测试:

library(data.table)num_sim <- 100
num_week <- 20
obs_per_week <- 1000set.seed(123)
p_values <- matrix(NA, nrow = num_sim, ncol = num_week)for(i in 1:num_sim){
  for(j in 1:num_week){
    A <- matrix(rnorm(obs_per_week*num_week, 10, 1), 
                nrow = obs_per_week, 
                ncol = num_week)
    B <- matrix(rnorm(obs_per_week*num_week, 10, 1), 
                nrow = obs_per_week, 
                ncol = num_week)
    p_values[i, j] <- t.test(
      as.numeric(A[,1:j]),
      as.numeric(B[,1:j])
    )$p.value
  }
}p_values <- melt(
  p_values,
  varnames = c('simulation', 'week'),
  value.name = 'p_value'
)
p_values <- data.table(p_values)# number of p < 0.05 on each week
p_values[,.(num_significant = sum(p_value < 0.05)), by = week]
mean(p_values[,.(num_significant = sum(p_value < 0.05)), 
              by = week]$num_significant)# number of ever reaching p < 0.05 on any given week
length(p_values[p_value < 0.05, unique(simulation)])# number of getting p < 0.05 on or before the sixth week
length(p_values[(p_value < 0.05) & (week <= 6), unique(simulation)])

如果你在任何一周进行测试,那么平均起来,我们会得到一个预定的α = 0.05 的假阳性率。使用这种种子,早期终止导致 26%的假阳性率,并且运行实验直到显著性,长达 20 周,导致 61%的假阳性率。预先注册实验并提前约定持续时间非常重要。

你应该有一些历史数据来猜测对照组的平均值和标准偏差,你将这些数据插入到一个样本大小计算器中,以确定实验应该运行多长时间。理想情况下是这样,但是平均值会根据实验进行的时间而变化,因为新客户与忠实客户的比例会随着时间的推移而上升。

在实践中,我建议:

  • 计算作为持续时间函数的功率(保持α和效果大小固定)。可能是对当我们修改α或效应大小时能量如何变化的敏感性分析。
  • 如果您认为假阴性和假阳性一样糟糕,请使用任意的α = 0.1 和β = 0.9,而不是同样任意的α = 0.05 和β = 0.8。
  • 执行单面测试。我们通常更关心符号而不是大小,除非实施替代方案会带来运营成本的变化。

最后一个问题与 A/B 测试如何经常用于决策有关。考虑以下场景:

  • b 明显优于 a。
  • b 明显比 a 差,保留 a。
  • b 和 a 在统计上没有区别吗???我们保留 A 还是装运 B?

如果你同意 NHST 框架的二进制本质,你也可以将决策二进制化以获得更高的统计能力。

作为一个玩具的例子,假设基线转化率是一个稳定的 20%,我们每周有 1000 个新访客。如果我们的决策规则是,如果 B 显著优于 A,我们应该进行多少周的实验?我们可以呈现这个情节:

20%的效果大小是不现实的。如果我们关心 10%,那么 6 周的实验给了我们相当大的力量。如果我们想检测 5%的效果大小,那么我们可能不得不转向其他选项。功率图是一个等高线图,有助于直观地做出决策。

获得足够的样本量通常是不可行的。根据 booking.com 的一个帖子:

检测微小的影响可能具有挑战性。想象一下,运营一个典型的转化率为 2%的电子商务网站。使用 Booking.com 的能量计算器(这里是的开源代码),你会发现,要检测到转化率 1%的相对变化,需要超过 1200 万用户的实验。

对于大多数公司来说,对 1200 万用户进行 A/B 测试是完全不可能的。事实上,大型科技公司的主要竞争优势之一是,他们可以进行更强大的实验——较小的公司无法复制这一点。在这种情况下,我建议凭直觉或贝叶斯理论。

凭直觉行事听起来与“数据驱动的决策”相反,但对太少的样本进行频繁分析更像是“噪音驱动的决策”。对于我们事先知道将会是不确定的事情,这是浪费资源(由于糟糕的方法,而不是结果的重要性)。垃圾进,垃圾出。

A/B 测试的贝叶斯方法是将组分配视为随机效应,即我们使用贝叶斯分层模型。否则,可以使用经验贝叶斯选择先验。使用统一的/非常弱的先验是非常不可取的(更多细节,查看我的另一篇文章)。

注意事项:您的指标应该由您的抽样单位汇总。如果你随机选择哪个用户得到 A 或 B,那么要测试的度量标准需要是每个用户 X。像平均订单值这样的东西会导致误导性的结果,因为我们没有随机化订单。直观地说,像平均订单价值这样的东西对没有购买的客户赋予 0 权重,而对经常订购的客户赋予更多权重。

按用户聚合会丢弃一些信息,但这是获得正确结果所必需的。你可以建立一个贝叶斯层次模型来代替聚合,但是对于大型数据集来说,这在计算上是有挑战性的。

(分数)析因设计

析因设计通常优于简单的 A/B 测试。您可以:

  • 投入额外的工作以获得更好的见解。可以回答“哪些部分效果好?”而不是“哪个版本更好?”这种洞察力可以转移到未来的工作中。还有,你可以分析交互作用的影响。
  • 投入更少的资源,获得同样的洞察。您可以重复使用这些样本来测试多个假设。

除非你是一个科技巨头,能够从 1%的用户群中获得足够的统计能力,否则你应该平均分配。这通常会产生最强大的实验,并具有清晰方法的额外好处。结论可以根据你使用的平方和、而改变,但是如果你的设计是平衡的(平均分割),那么四种类型会产生相同的结果。

虽然哑元/独热编码更常见,但对于实验,我们更喜欢将控制和处理编码为-1 和 1。效果尺寸更容易理解。虚拟编码产生相对于参考单元的系数——很少是我们感兴趣的数量。

在有三个协变量的平衡析因设计中,应将受试者平均分成八组:

相关矩阵是一个对角矩阵,因此效应大小的估计是相互独立的。事实上,即使是交互作用的影响也是独立的。尝试计算此设计矩阵的相关性:

这让我们重用样本来测试多个假设并获得更高质量的见解。为了检验每个假设,我们比较了白细胞和红细胞:

我很抱歉把一些人叫出来,但有一些可怕的建议流传开来,表明完全不了解析因设计是如何工作的。析因实验不同于“多元测试”。要获得与简单 A/B 测试相同的功效,需要更多样本是不正确的。您需要相同数量的样本,因为样本会被重复使用来测试每个假设,这是析因设计的全部要点。你可以像在一个简单的 A/B 测试中一样计算样本大小,尽管除非交互作用非常大,否则你可能察觉不到它。

假装你想优化你的横幅。我们想测试字体大小和图像大小的效果。或许如果单独测试的话,用户更喜欢大字体,用户更喜欢大图片。但是大字体和大图片放在一起会让横幅显得过于拥挤——会产生负面的交互效果。

这些见解可以转移到未来的横幅设计。如果测试 A =小字体小图 vs B =大字体大图,我们不知道具体是什么变化造成的影响。更糟糕的是,B 可能比 A 表现得更差,即使一些组件工作正常,因为巨大的负面(交互)效应掩盖了正面效应。

如果你想一次测试很多变化,横幅的数量会成倍增长。测试 n 个协变量需要 2^n 组合。使用部分因子设计,如果你不介意无法估计一些高阶相互作用效应,你可以将组合的数量减少至少一半。

有时改变被认为风险太大,你只能在 20%的用户基础上做实验。当低、中和高设置有意义时,保持 80%“不可触及”为全 0(中等设置),同时将 20%平均分成-1 和+1(低和高设置)组。通过这种方式,您不必放弃任何用户群,并且“碰不到的”客户通过提供更精确的截距估计(如果假设是线性的)来增强统计能力。

贝叶斯分析会将协变量视为交叉随机效应。(不确定如何分析交互项。)

提醒一句:当协变量不可能独立时,析因设计没有意义,比如因为漏斗。假设你网站的漏斗是 X → Y → Z,变化(X)会影响谁最终在 Y,变化(Y)的效果依赖于变化(X),即使我们设置为析因实验。如果可能的话,我建议将用户群分开,这样一些人只在变更(X)时被测试,而另一些人只在变更(Y)时被测试。

交叉设计

在一个交叉实验中,你按照顺序随机排列受试者:他们是接受 AB 还是 BA。在适用的情况下,这会导致更紧密的间隔,因为您使用的是一个配对 t 检验(或者一个多水平的随机效应)。关键假设:

  • 没有遗留影响。假设你想测量跑步和静止时的心率。如果你让一个人跑步,然后站着不动,这个人的心率会比没有跑步就站着不动的人高——这是一种遗留效应。
  • a 和 B 与退学无关。如果你先注射 B,然后注射 A,而 B 导致一些受试者从未注射 A,那么估计是不正确的。

由于这些限制,跨界车通常用于产品,而不是人。产品更可靠地放在货架上两个时期。用户可能会在第一个时间段到达,但不会在第二个时间段到达,反之亦然。

除了在 2015 年的罐头大战中,这些有意识的罐头下架了(来源)

一个示例应用程序是评估产品列表上片段的显示。在试验期间保持产品排名不变。在产品排名/搜索页面,让一半的产品有一个片段(B),另一半没有片段(A)。第二期反转。您可以合理地估计片段对客户行为的影响。

嗯,事实上,没有。你能指出这个实验有什么问题吗?

如果客户更有可能选择 B 而不是 A,那么一些购买就从 A 转移到 B,为了尽量减少干扰,我们可以选择互不相关的产品类别,在一半的类别上做 AB,在另一半上做 BA。应该使用混合模型来分析数据。如果 B 很差,导致一些顾客离开,结转效应仍然是可能的。

阻塞

通常,当我们使用多台测量设备或需要进行多批次测试时,会使用阻塞,例如,您是一家面包店,使用多台秤称量配料,并且没有大得离谱的烤箱。也许今天的湿度比昨天高,这会影响最终产品。我们希望考虑到这一点。

阻塞在调查中有强大的应用,以保持调查简短。它将析因实验分成多个批次,每个批次都是部分析因实验。

第 1 页,共 48 页。预计完成时间:216 分钟。(来源)

我喜欢强迫选择调查(“你更喜欢哪个:A 还是 B?”)因为我们可以从行为中推断事情。人说的和人做的完全是两码事。如果我们像析因实验一样设置选项,那么我们可以将问卷分成更小的调查。

例如,有一次我希望每个人回答 32 个问题。这是一个愚蠢的想法。人们不会完成调查,即使他们完成了,他们也会在最后随机作答。而是通过分块,从每人 8 个问题中得到扎实的推论。

其他备注

还有其他更先进的方法来做你的实验。响应面方法类似于基于梯度的优化。单纯形格子设计用于优化配料比例,并可用于建立排序权重。工业中对实验方法的许多研究都是为了增加实验的功效,通常是通过反事实、分层、选择观察点以最大限度地获取信息,或者巧妙的方法从本质上把 t 检验变成配对 t 检验,等等。

准实验

既然我们已经讨论了实验,我们开始进入令人不安的假设领域。属于准实验的方法有很多:差异中的差异、中断时间序列、综合控制。然而, Google 的 CausalImpact 包是如此强大和灵活,它应该涵盖了大多数实际需求。这些对于广告表现衡量和定价实验极其有用。

因果影响

基本的直觉很简单:我们观察一个有一些干预的时间序列 X(比如销售数据,我们发起了一场营销活动)。我们想要建立一个反事实:如果没有干预,时间序列会是什么样子?我们寻找成分(可能是许多时间序列)放入搅拌机,希望最终结果是一个好的反事实。观察到的和反事实的区别是我们对因果效应的估计。

关键假设:

  • X 的变化不影响合成对照中的成分
  • 如果没有干预,X 和成分之间的关系会以同样的方式继续

这类分析的大部分工作是寻找和验证反事实的成分。坏的成分会导致完全武断的估计:即使是在没有干预的时期,也可能会估计出很大的“因果效应”。垃圾进,垃圾出。这里有一个说明性的例子:

library(CausalImpact)set.seed(1)
x <- cumsum(rnorm(100, 0, 1))
y <- cumsum(rnorm(100, 0, 1))
dat <- zoo(cbind(y, x))
plot(dat, main = "Two random walks")impact <- CausalImpact(
  data = dat, 
  pre.period = c(1,80), 
  post.period = c(81, 100)
)
plot(impact)

我们在没有干预的情况下模拟了两次随机行走,但因果影响估计会产生巨大的积极影响:

垃圾进,垃圾出。随着我们开始超越实验,大部分工作都在验证假设的合理性。在许多情况下,我们甚至无法验证假设;评估模型的健全性需要重要的人类判断。

一旦我们有了成分,如果你遵循因果影响文档,分析就非常容易。

在实践中,这些成分与地理位置有关,例如使用 LA 时间序列来预测 NYC 时间序列。

根据经验,干预后的时期不应该太长(1-3 周是理想的),因为预测随着我们向前看得越远而失效。干预前的时间应该是干预后时间的 3-4 倍。我们希望没有跨越整个时期的重大结构变化,过去太远的系列可能有不同的关系。

就我个人而言,对我有用的是:

  1. 生成配料候选列表。排除有潜在干扰的。例如,如果你在曼哈顿市中心开展广告活动,使用市中心作为一个成分是一个坏主意,因为看到市中心广告的人可能会在市中心附近购买。
  2. 如果你有很久以前的数据,把它分成三个时间段。使用最远的回溯来找到你的成分,中间的来验证,最近的来估计因果效应。
  3. 使用最远的数据,看看相关性。如果你的时间序列需要对数变换和/或一阶差分来“大致稳定”,那么就这样做。与 X 非常高或非常低的相关性表示潜在的候选者。
  4. 第一个验证步骤是使用中间阶段,最好是你知道没有重大干预的阶段。尝试通过选择随机干预日期建立因果影响模型,干预后时期的长度与您的研究设计相对应。估计的因果效应应该接近于零。否则,看看其他潜在的成分。
  5. 第二个验证步骤是再次使用中间周期。如果你的因果关系使用 X~Y+Z,尝试其他组合,如 Y~X+Z 和 Z~X+Y。他们同样应该估计没有因果关系。
  6. 如果前面的步骤运行良好,运行分析,并希望估计不是虚假的。我们已经尽了最大努力来确保这个估计是正确的。

应该在进行准实验之前选择成分和 X。最糟糕的情况是,干预已经完成,但我们无法为 X 建立一个像样的反事实,因为所有的成分都不起作用。

观测资料

前两个部分涵盖了我们直接干预的案例。有时,由于道德或成本等现实生活的限制,我们无法进行干预,所以我们只能利用观察数据。

不管我们喜不喜欢,绝大多数数据都是观察所得。实验费用昂贵;跟踪用户活动要容易得多。不幸的是,因为收集完整的小数据可能比大的观察数据更有用——它们可以用更少的假设来分析。仅仅从观察数据中很难得出有效的结论。珀尔的因果关系框架在这个领域越来越受欢迎。它相当于鲁宾的潜在结果框架,但在易于消化的图表中提出假设,而不是迟钝的数学方程。

控制气压,珠穆朗玛峰与死海的高度相同。(来源

最重要的一点是加入太多预测因素会导致错误的结果。为预测性能而调整的模型可能会导致不正确的因果推断。反对“控制一切”的呼声很高。在我之前的一篇关于贝叶斯统计的文章中,我解释了应用统计学是如何从无意识的程序转向批判性思维的。通过 lasso 或者更糟的逐步回归来选择预测因子,对观察数据根本不起作用。

在这个领域中,通常使用线性回归代替逻辑回归来估计二元结果因果效应。你可能会对这个想法嗤之以鼻,但这是有充分理由的。Log odds 不可折叠。对于观察数据,如果我们使用不可折叠的度量标准,并添加太多的预测因子或成为被忽略的变量偏差的牺牲品,我们可能会得到非常不同的结论。除非你绝对确定你有一套完美的预测指标(随机对照实验就是如此),否则使用线性回归来估计因果效应可能是谨慎的。

本文省略倾向匹配。关于为什么它是可怕的以及它将如何导致错误的估计已经写了很多。如果你可以计算倾向得分,你可以使用相反的倾向加权。就像逐步回归一样,倾向匹配是一种可怕的做法,需要消亡。请不要。

什么是因果 DAG?

贝叶斯网络是一个有向无环图(DAG ),它意味着联合分布的因子分解。边缘(箭头)表示依赖性。例如,X → Y 意味着 Y 依赖于 X,联合分布 p(x,Y)可以分解为 p(x) p(y|x)。

因果 DAG 更强调箭头表示因果关系。X → Y 表示 X 引起 Y,为简单起见,本文将假设所有变量都是二进制的。

为什么要经历这么多麻烦?因为一旦我们忽略了几个变量,就会变得非常混乱,即使只有四个变量:

最后一项不是 p(x|u,v,w)因为 u 只通过 v 和 w 影响 x,一旦我们知道 v 和 w,知道 u 并不能提供额外的信息。因此,有向无环图具有马尔可夫性质。

DAG 比联合概率分布更容易检查。甚至非技术人员也可以附和这些假设的合理性,我们可以更好地让领域专家参与进来。“U 真的引起 V 吗?”

关于因果 DAG 最令人不安的事情是,我们无法验证我们的假设,除非 DAG 暗示了一些条件独立性。边 X → Y 为什么要存在?这应该与领域专家讨论。有些事情我们都能达成一致,比如酒后驾车→车祸。其他假设可能是模糊的。Dag 非常“主观”。

然而,不使用 Dag 更糟糕。一个回归方程可以对应许多 Dag。到底是哪个?当有人进行回归分析并计算 p 值时,他们甚至在测试什么呢?所有这些 Dag 对应于 Z~X+Y:

还有许多其他可能的 Dag 具有未观察到的变量。当有人计算 Y, 系数的 p 值时,他们甚至在测试 什么?我会解释一下,但是根据因果图的不同,对系数的解释会有很大的不同。纯粹通过回归进行的分析在“客观性”的幌子下回避了这个问题。

这些因果图允许非统计人员讨论模型和假设。他们把所有东西都放在易于理解的图形格式中。也许回归模型是错误的;也许它回答了错误的商业问题。其他人可以帮我们找到答案。这些因果图应该是分析观测数据的必备工具。

因果 DAG 的规则

我们可以对通过三元组节点的路径进行分类:

  • 信息通过 X → Y → Z 传递
  • 信息通过一个 X ← Y → Z
  • 信息被一个倒叉 X → Y ← Z 阻挡,Y 被称为碰撞器

简单来说,在 X → Y → Z 中,Z 是由 X 引起的,在 Y 上条件化会翻转开/关开关。一旦我们知道了 Y,知道了 X 并不能提供额外的信息,因为 X 只通过 Y 影响 Z。从 X 到 Z 的信息被屏蔽了。

为什么规则是这样的?

链条

雨水通过调解使地面变滑,从而导致人摔倒。如果我们知道地板很滑,那么知道是否下雨并不能提供更多关于人们跌倒的信息。如果地面不滑,雨不会使人摔倒。

雨使地面潮湿。下雨导致人们买雨伞。潮湿的地面与人们购买雨伞相关。叉子俗称混淆。我们可以通过地面是否潮湿来预测雨伞的销量,但声称潮湿的地面会导致下雨是愚蠢的。控制降雨将使“湿地”无法作为预测指标。如果我们知道在下雨,我们就不需要知道地面是湿的。

碰撞机

对撞机很难概念化。溢出的水使地面潮湿。雨使地面潮湿。但是显然溢出的水不会导致下雨,反之亦然。如果我们知道地面是湿的我们只是把水洒在地板上,那么就减少了下雨的可能性。这是两种相互矛盾的解释。一旦用一件事解释了这种现象,那么两个原因都起作用的可能性就变小了。当我们在对撞机上设定条件时,两个独立的事件变得相关(“对撞机偏差”)。我们经常在对撞机上设定条件,不是因为选择,而是因为缺少数据,即审查选择偏差

既然我们已经了解资讯如何流经 DAG,我们就可以用它来估计因果效应。

do()运算符和后门调整

do()符号表示我们正在改变一些东西。一般来说,P(Y|X=x)和 P(Y|do(X=x))是不一样的。前者处理观察(“假设我们观察到 X = X……”),后者处理干预(“假设我们将 X 设为 X……”)。或者换一种说法,前者处理预测,后者处理因果推断。这两个目标通常是相互矛盾的。

do(X=x)操作符想要阻塞所有有边进入 X 的路径(“后门”)并调整混杂因素,同时保持所有“前端”路径开放(以从 X 出来的边开始的路径)。或者,如果你更喜欢从树的角度考虑:我们想构造一个新的树,以 X 为根节点。让我们使用此 DAG 进行说明:

V 对 X 的因果作用是什么?我们想计算 E[X|do(V=1)] - E[X|do(V=0)]。看看所有可能的路径:

  • V → X
  • V → W ← X
  • V ← U → W ← X

唯一有一条边变成 V 形的路径是最后一条。把它分成三个一组:

  • V ← U → W 是分叉,所以信息流
  • U → W ← X 是一个对撞机,所以信息会被屏蔽

这条路已经被对撞机堵住了,我们什么也没做!如果我们以 W 为条件,我们就会打开后门,得到错误的估计。正确的回归方程是 X~V,我们不需要调整任何东西。虽然添加 U 不会有任何影响,但添加 W 会导致灾难性的错误结果(“对撞机偏差”)——它提高了的预测能力,但因果估计是垃圾,重申了预测和推理是相反的目标。在这里,我再次强调:想想你用的是什么预测器。把一切都扔进回归会导致错误的结果。

这个例子很简单。实际上,你需要提供 DAG,让一些算法来决定你应该把哪些变量放入回归中。(尽管有一些启发来学习与数据一致的“最简单的 DAG”。)这个概念将贯穿本文的其余部分:因果推断的变量选择应该由 Dag 决定。

有时,你通过算法运行一个 DAG,发现根据你的观察不可能估计出因果效应!但是使用 DAG,我们可以讨论我们需要什么样的变量,以及收集哪些变量是可行的。

中介分析

调解

中介分析与类似这样的 DAG 有关。有一条直接路径 X → Z 和一条间接路径 X → Y → Z。还记得我说过系数的解释取决于 DAG 吗?

这个 DAG 声称 X 的变化会引起 Y 的变化,通过链会引起 z 的变化。

假设我们拟合回归 Z~X+Y,对 X 的系数β有什么解释?保持 Y 不变,X 增加 1 个单位与 z 增加β相关,看到问题了吗?当我们干预并改变 X,那么 Y 也会改变。

总效果由(X → Z) + (X → Y → Z)给出。如果我们假设后一种效应是乘法的,那么我们可以声称(X → Y → Z) = (X → Y) × (Y → Z)。如果我们使用线性模型,这个假设是合理的。X 增加一个单位会导致 Y 增加(X → Y ), Y 增加(X→Y)会转化为 Z 增加(X→Y×(Y→Z)。我们可以用两种不同的方法估算 X 对 Z 的因果影响:

  • 回归 Z~X,不需要对 y 进行调整,系数就是总效果。
  • 回归 Z~X+Y,回归 Y~X,然后用代数计算总效应。

为什么要用第二种方法呢?理解它是理解前门调整和工具变量的关键,这将在文章的最后涉及。

前门调节

有时,您不能阻止所有后门,但仍然可以使用前门调整来估计因果影响,它适用于看起来像以下的 Dag:

前门

其中 U 未被观察到,我们想要 X 对 z 的因果影响。准确地说,我们需要:

  • 从 X 到 Z 的直接路径经过 Y
  • 从 X 到 Y 没有畅通的后门路径
  • 从 Y 到 Z 的所有后门路径都被 X 阻塞了

这个方法其实很巧妙。就我个人而言,这是一个“啊哈!”当我看到它的时候。回想一下关系式(X → Y → Z) = (X → Y) × (Y → Z)。然后:

  • 由于未观察到的混杂因素,我们不能直接估计(X → Y → Z)。
  • 我们可以估计(X → Y ),因为它们没有任何共同的混杂因素。
  • 我们可以估计(Y → Z)。有一个直接路径 Y → Z 和一个后门路径 Y ← X → U → Z,我们只需要调整 X 来关闭后门路径。

因此,我们可以通过将其分解为(X → Y → Z) = (X → Y) × (Y → Z)来计算因果效应,因为我们可以估计右侧的分量。

反向倾向加权

选择偏差是观察数据的最大问题之一,这使得反向倾向加权(IPW)成为这个领域的支柱。例如,企业可能会问“订阅如何影响用户参与度?”一种简单的方法是比较订户和非订户的平均收入。然而,为什么一个非活跃用户会购买订阅呢?活跃用户更有可能订阅——这是一种反向因果关系。声称订阅行为导致用户参与度大幅提升是完全荒谬的。

IPW 创建了一个更好地代表真实人口的伪人口。它纠正了选择偏差。我们使用 1/倾向作为权重来取加权平均值,其中倾向被定义为被选入该组的概率。在这种情况下,如果用户订阅了,那么他们的倾向就是在给定预测值的情况下他们订阅的概率。

假设这是真的 DAG。我们模拟一些数据,并使用 R 代码进行分析:

library(data.table)set.seed(111)
likes_movies <- sample(c(0,1), 1000, replace = TRUE)
x1 <- sample(c(0,1), 1000, replace = TRUE, prob = c(0.9, 0.1))
x2 <- sample(c(0,1), 1000, replace = TRUE, prob = c(0.2, 0.8))
subscribed <- ifelse(likes_movies, x1, x2)
engagement <- 30 + 100 * likes_movies + 20 * subscribed + rnorm(1000, 0, 10)dat <- data.table(likes_movies, subscribed, engagement)
dat_agg <- dat[,.(avg_engagement = round(mean(engagement), 2),
                  count = .N),
               by = .(likes_movies, subscribed)]
dat_agg# naive comparison of means
dat[,.(mean(engagement)), by = subscribed]# inverse propensity weighting
propensity_model <- glm(subscribed~likes_movies, data = dat)
dat$propensity <- ifelse(
  dat$subscribed,
  fitted(propensity_model),
  1 - fitted(propensity_model)
)
dat[,.(sum(engagement / propensity) / sum(1/propensity)), by = subscribed]

在这个模拟中,我们通过订阅提高了 20%的用户参与度。模拟数据:

如果我们简单地比较一下订阅的平均数,我们得到 114 - 63 = 51。但是我们知道真实系数是 20!这个估计是完全错误的。

如果我们使用 IPW,我们得到 103 - 83 = 20 的估计值,即真正的因果效应。

但是等一下。虽然前面的例子被通俗地称为选择偏差,但它在因果文献中是一个混淆因素。我们可以简单地进行回归:

在因果关系中,选择偏差指的是对撞机上的条件作用,所以类似于:

我很难想出一个例子,所以我用赫尔南的例子。x 是给孕妈妈补充叶酸,减少心脏畸形的几率。y 是心脏畸形,增加了在子宫内死亡的几率。虽然 X 确实通过减少 Y 来降低死亡率,但它也导致更健康的胎儿,并以其他方式降低死亡率。我们只能在婴儿出生的情况下观察心脏畸形。X 对 Y 的总作用是什么?

回归本身不能回答这个问题,因为我们缺少孩子从未出生时的数据。我们需要使用预测失踪概率的 IPW。

这种问题经常出现在无应答率可能取决于多个因素的调查中。

IPW 是一种非常强大的技术,但是在实践中很难使用。倾向性可能非常接近于 0,导致不稳定的估计(并且几乎违反了积极性假设)。此外,倾向估计应该是无偏的,所以我们仅限于逻辑回归而没有正则化。如果我们错误地指定了模型,如非线性或省略变量,倾向得分可能会有偏差。小心使用。

使用双重稳健的机器学习

因果森林是热门话题,但可能令人困惑;而且,从我的经验来看,它的伸缩性不好。我更喜欢赫尔南描述的更简单的双重稳健估计。我会带我们穿过这个 DAG:

  1. 确定使用 DAG 时我们需要控制的变量。在这种情况下,a。
  2. 把你的数据分成三份。
  3. 使用 fold 1,为模型定型以使用 a 预测πhat = P(X=1)。
  4. 使用 fold 2 为模型定型,以使用。
  5. 使用 fold 3,训练一个模型来预测 DR1–DR0,稍后将对此进行解释。
  6. 在步骤 3-5 中旋转折叠,然后平均步骤 5 中的预测。

使用第(4)部分,我们可以改变 X=0 和 X=1,以获得两种情况下的 Yhat 估计值。然后,我们可以将预测代入双重稳健估计公式:

我们可以将因果效应估计为:

它被称为双重稳健,因为只要至少有一个模型(倾向或条件均值)做出无偏预测,那么这个因果效应估计就是无偏的。换句话说,即使我们弄错了一个模型,我们仍然很好。

那么,为什么这个效果很好呢?让我们看看 DR1(DR0 的证明也类似):

如果我们的倾向模型是无偏的,那么右边的部分有期望 0,而左边的部分是 IPW。如果倾向模型是无偏的,则 IPW 是无偏的。因此,这个 DR1 估计量是无偏的。

重新排列给了我们:

如果我们的条件均值模型是无偏的,那么左边部分的期望值为 0,而右边部分是潜在结果的无偏估计量。因此,这个 DR1 估计量是无偏的。

由于正则化,大多数机器学习算法都有偏差,因此倾向和条件均值模型都有可能有偏差。我们希望偏差足够小,这样当我们将两个有偏差的预测相乘时,总偏差会随着 n 的增加而迅速缩小。渐近地,估计遵循以事实为中心的正态分布。

工具变量

这一部分被留在最后,因为它采用了一种完全不同的方法

许多关于工具变量(IV)的文献非常混乱,但是 DAG 让直觉变得非常清晰。在上面的例子中,我们想要估计 Y 对 z 的因果影响。然而,U 是一个未观察到的混杂因素:我们知道它在那里,但是我们不能测量它,所以我们不能控制它。

x 是 IV,因为它满足以下标准:

  • x 对 Y 有因果影响
  • x 仅通过 Y 影响 Z
  • x 和 Z 不共享混杂因素

所以现在我们根据 X 对 Z 的因果效应来思考。因果效应 X → Z 可以分解为两部分:X → Y 和 Y → Z。基于假设,我们:

  • 可以估计 X → Z
  • 可以估计 X → Y
  • 有关系(X → Z) = (X → Y) × (Y → Z)

你看到了吗?通过一些代数,我们可以估算出 Y → Z!

这通常是通过回归 Y~X,然后使用 Y 的拟合值来预测 z 来完成的。从概念上讲,我们改变 Y,以便只考虑边 X → Y,打破边 U → Y。

整个概念可能看起来很奇怪,但是想想看:如果 X 是 Y 的完美预测者,我们如何解释 IV?那是 A/B 测试!工具变量是“不完美的随机变量”。

实际上,使用 IV 进行因果效应估计可能会有非常大的区间。如果 X 对 Y 的预测很弱,X → Y 很小,那么我们除以一个很小的数,这个数有很多噪声,会导致偏差。从概念上讲,弱 IV 就像你做了 A/B 测试,但是很多被随机分配到 A 组的人选择了 B 组,反之亦然。如果这种不遵从变得足够糟糕,你就无法估计任何事情。因此,如果您使用的是两阶段最小二乘法,那么 X 应该是 y 的强预测值。否则,要对 IV 估计值保持高度警惕;考虑其他方法,如贝叶斯建模。

最后

这篇文章涵盖了我所知道的因果关系的主要简单方法。重点是实际应用。这些方法应该足以处理绝大多数问题。

如果你认为有什么遗漏或不正确的地方,请在评论中告诉我,这样我可以修改这篇文章。我希望这篇文章成为该领域新手的首选参考。它应该提供足够的指导,为他们指出解决具体问题的正确方法,并让他们自己搜索关键词和概念。

超出准确度

原文:https://towardsdatascience.com/beyond-accuracy-34816b9fe9f7?source=collection_archive---------55-----------------------

在许多行业中,准确性是必不可少的(图片:作者)

现在,2010 年只是一个怀旧的记忆,我们在建立机器学习模型时,需要考虑的不仅仅是一个准确的结果。

准确性长期以来一直是机器学习模型和训练它们的人的核心追求——教科书中充满了仅从特定训练集的准确性方面进行比较的算法,而几乎没有关于如何衡量或实现其他理想品质的建议。然而,最近几年,人们意识到仅有准确性是不够的。偏见会扼杀模型的有用性,不透明性和复杂性也是如此。

最受关注的偏见形式可能是模型无意中对人的歧视,例如预测犯罪的模型强化了警察的偏见。尽管这类有偏差的模型受到关注并需要改进是正确的,但还有许多其他领域存在偏差问题。另一个例子是商业模型通过偏见限制了它们自己的有用性。

一家试图在某一人群中扩大市场份额的信用卡公司并不适合一个默认模型,该模型认为该人群是最大的风险因素。一家商店的经理在一个特定的位置试图增加销售额,这种模式可能不太适合位置是销售额最重要的预测因素的商店,因为她不容易搬迁商店。

公平性(或缺乏偏见)和可解释性都作为理想的模型特征受到更多的关注,但是仍然很少有标准的方法来度量它们。虽然它们是不同的特征,但它们在某种意义上是有联系的,即要理解一个模型是公平的还是无偏见的,就需要一定程度的透明度,而更好的可解释性就能更好地理解公平。

一些建模者可能会觉得,通过说我们需要透明度来实现公平,我们正在与准确性进行权衡,因为我们正在使使用黑盒方法(如 GBM 或神经网络)变得更加困难。事实并非如此。正如 Carlson 和 Rudin 的论文“机器学习的秘密”中所讨论的,模型在保持透明和可解释的同时表现出最高水平的准确性,这一点经常被忽视——只要这是从一开始的意图,并且足够谨慎。

同样的想法也适用于公平。如果你需要一个公平公正的模型,你需要从一开始就选择这条路。同一篇文章指出,如果你需要确保你的模型是无偏的和可解释的,你需要从一开始就有这个目标。确保公平的一个建议方法是定义公平对于您的模型的上下文意味着什么,并且从过程的开始就将它作为模型训练的一个目标。

类似的原则也适用于可解释性,它严重依赖于算法的选择。某些算法本质上意味着结果模型几乎保证永远不可解释。其他算法为构建高度可解释的模型提供了一个巨大的开端。

然而,这并不能保证一个可解释的模型。还需要考虑其他因素,例如模型看到的特征或输入变量本身是否可解释或有意义,以及模型中允许的关系类型。例如,所有的关系都应该指向同一个方向——单调的吗?或者相反方向的关系在你的环境中是允许的吗?

连接这些想法的主题是,无论何时你想超越准确性,都需要仔细规划,包括仔细选择目标。为了实现公平,从一开始就决定你所指的公平是什么,并确保你在整个开发周期中衡量朝着这个目标的进展。这同样适用于透明性和可解释性——你需要在你的上下文中决定可解释性意味着什么。

推动更细致入微的建模方法需要比以往更深入地理解手头的问题。在训练单个模型之前,需要做出更多的决定。

罗伯特·德格拉夫的书《管理你的数据科学项目》》已经通过出版社出版。

超越伯特?

原文:https://towardsdatascience.com/beyond-bert-6f51a8bc5ce1?source=collection_archive---------14-----------------------

2020 年的变形金刚。

阿瑟尼·托古列夫在 Unsplash 上的照片

2019 年是伯特年,关于它已经写了很多。说实话,很难高估变形金刚在 NLP 社区中的影响:LSTMs 现在听起来已经过时了(),是吗?在 2019 年,最先进的论文一直在稳步前进,在谷歌,伯特以破纪录的时间将其投入生产。以上全部同时启用 转移学习 ,现在是 NLP-town 最酷的小鬼。

到目前为止,围绕这些模型的发展是显著的,但是变形金刚已经达到顶峰了吗?我们应该密切关注哪些研究领域?2020 年,这些基于注意力的网络还有什么令人兴奋的地方?这些想法是最近在 Zeta Alpha 举行的变形金刚在工作活动中讨论的焦点,会上考虑了许多关于该主题的有趣角度。

这是我的看法。

模型

2019 年见证了变压器模型架构变体的爆炸,很难跟上(当然忘记了一些):大表亲(Transformer-XL,GPT-2,Ernie,XLNet,RoBERTa,CTRL),小表亲(ALBERT,DistilBERT)或最近的侄子,如 Reformer 或 Compressive Transformer。

现在很清楚,增长模型仍然可以成功地提高许多任务的技术水平,但是我们应该这样做吗?它增加了多少价值?变小的型号但保持性能是我们在 2019 年开始看到的趋势,并希望在 2020 年保持稳定。也许除了模型修剪或提炼之外,还会出现一些创新的方法?无处不在的变形金刚库的创造者 Huggingface 的人们让我们谈论这种令人耳目一新的趋势,以及 DistilBERT ⁰的培训方法,这自然与我的下一个观点有关。

“学习信号”对人类开发智力至关重要。照片由雷切尔在 Unsplash 上拍摄

闪亮的新架构获得了大量的关注(双关语);但是在 ML 中, 学习信号在后台运行节目。广义来说,一个模型的表现受限于模型表现力和训练信号质量组合中最弱的因素(RL 中的目标或回报,DL 中的损失)。举个例子,DistilBERT 在一个 师生环境 中接受训练,其中学生网络(规模较小)试图模仿教师网络(原创)的行为。通过增加这个术语,而不是仅在原始语言建模任务上训练,用于学生网络的损失函数更加丰富,允许网络更有表现力地学习。如果你还是不相信我,想想 2014 年甘斯的遭遇:一个简单的网络耦合到一个有趣的损失函数(另一个网络)和…💥神奇!

自我监督和语言建模作为语言任务的通用训练信号应该像建筑革命一样归功于 NLP 的进步,所以 2020 年我希望看到这一领域的创新。

任务和数据集

正如你可能听说过的,磁北极和地球的北极并不完全对齐;事实上,磁场年复一年地持续抖动。尽管如此,如果你在荷兰,想去真正的北极,传统的指南针将是一个很好的向导;至少比没有强。然而,随着你越来越接近你的目的地,你的指南针的偏差将变得越来越明显,使它不适合这项任务。

在人工智能研究中,可以明显地得出一个类似的结论。客观测量是科学发展的基石,即使是有偏差的度量通常也比没有好。如何衡量进展是一个领域如何发展和最终完成什么研究的重要驱动力;这正是为什么我们需要彻底设计评估,使之与产生最佳发展的激励机制相一致。在过去几年中,标准的 NLP 任务一直是研究的一个令人惊叹的指南针,然而,我们越接近解决一个数据集,它作为进步的衡量标准就越糟糕,这就是为什么在 2020 年看到新的基准获得动力令人兴奋的原因。

截至 2020 年 2 月的 GLUE 基准排行榜。来源:gluebenchmark.com

例如,在脸书研究中心,他们最近一直在研究一个新的长格式问题回答数据集和基准: ELI5(像我 5 岁一样向我解释)——是的,它基于著名的同名sub Reddit——。这个新数据集的目的是推动开放领域问答的研究,推动变形金刚目前擅长的任务的边界。

[……]一个长形式的问答数据集,强调在长源文档中分离相关信息和生成段落长度的解释以响应复杂多样的问题的双重挑战。

另一个有趣的新数据集的例子是来自 DeepMind 的 PG-19 语言建模基准:远程语言建模基准(书规模!),还有另一个名叫压缩变形金刚 ⁵.的变形金刚转世希望这项任务将有助于克服 Seq2Seq 模型目前在处理(非常)长期依赖性方面的局限性。

就连无处不在的 GLUE Benchmark 也进行了急需的翻新。⁶作为一个强有力的竞争者在不久的将来成为事实上的通用语言理解基准。它包括——更具挑战性的任务和更全面的人类基线。

如果不提到我最近最喜欢的一篇论文,即弗朗索瓦·乔莱(Franç ois Chollet)关于智力衡量这一更广泛主题的论文,这一部分将是不完整的,该论文在这个问题上玩弄了哲学旋转,尽管如此,它还是提出了一个具体的建议:抽象推理文集及其具有挑战性的 Kaggle 竞赛。让这些伟大的倡议不断涌现!

更好的理解

系统有一些吸引人的神秘之处,我们并不完全理解。通常,我们对算法智能的理解与我们对其机制的理解程度成反比。不久前,人们还认为掌握国际象棋比赛需要智力。然后深蓝在 1996 年打败了加里·卡斯帕罗夫,我们明白了它是如何做到的,所以这台机器不再需要智能。

围绕' why questions' '建立坚实的理解对于取得进展至关重要,这就是为什么模型在任务排行榜上可能看起来很棒,但我们不应该在没有仔细调查他们的内部工作情况下就对他们的能力下过早的结论。将这个想法映射到变形金刚的空间中,很多工作致力于解开为什么这些模型工作得这么好;但是最近的文献还没有完全得出一个明确的结论。

例如,在研究伯特的预训练模型的行为时,“伯特在看什么? ⁷“得出结论,某些注意力头负责检测语言现象;与许多直觉相反的是,“注意力不是一种解释 ⁸”断言注意力不是解释伯特所理解事物的可靠信号。"揭示伯特 ⁹的黑暗秘密"对微调期间发生的事情提供了有价值的见解,但他们的结论范围有限:注意力没有捕捉到清晰的语言现象,伯特被严重过度参数化(令人惊讶!🤯),以及 BERT 不需要非常聪明就能解决大部分任务的事实。这种定性的探索很容易被忽略,因为它不会在指标中显示出来,但我们应该始终关注它。

总之,许多关于变形金刚工作原理的秘密仍有待揭开,这就是为什么等待 2020 年在这个领域出现新的研究令人兴奋。****

这些是我的首选,尽管许多其他主题也值得在这篇文章中关注,比如像这样的框架🤗/transformers 将继续发展,以支持研究、迁移学习范围的扩大或有效结合符号推理和 DL 方法的新方法。

你有什么看法?2020 年的变形金刚,你最激动的是什么?****

引用:

[1]《变形金刚在工作》,2020 年 1 月 17 日。 Zeta Alpha 矢量。

[2]斯蒂芬·梅里蒂,2019。RNN:停止用你的脑袋思考

[3]伊恩·古德费勒等人。艾尔。2014.生成性对抗网络

[4]安吉拉·范、亚辛·杰尼特、伊桑·佩雷斯等。艾尔。2019. ELI5:长格式问答

[5]杰克·w·雷等人。艾尔。2019.用于长程序列建模的压缩变压器

[6]王敬实、亚大·普鲁克萨奇昆、尼基塔·南吉亚、阿曼普里特·辛格等。艾尔。2019.强力胶:通用语言理解系统的一个更棘手的基准

[7]凯文·克拉克,乌尔瓦希·汉德尔瓦尔,奥迈尔·利维,克里斯托弗·d·曼宁,2019 年。伯特在看什么?伯特注意力分析。

[8]萨尔萨克·贾恩,拜伦·华莱士,2019 年。注意力不在解说

[9]奥尔加·科瓦列娃,阿列克谢·罗马诺夫,安娜·罗杰斯,安娜·拉姆斯斯基,2019。揭露伯特的黑暗秘密

[10] V. Sanh,l .出道,J. Chaumond,T. Wolf,2019。蒸馏伯特,伯特的蒸馏版本:更小、更快、更便宜、更轻

超越“经典”主成分分析:用 Python 实现时间序列的功能主成分分析(FPCA)

原文:https://towardsdatascience.com/beyond-classic-pca-functional-principal-components-analysis-fpca-applied-to-time-series-with-python-914c058f47a0?source=collection_archive---------7-----------------------

发现为什么在主成分分析中使用“函数”而不是“线性向量”可以帮助您更好地理解时间序列的共同趋势和行为。

传统上,FPCA 是用 R 实现的,但是 J. Derek Tucker 的" FDASRSF "包将在 Python 中实现类似的(甚至更好的)结果。

来自丹·马克尔-摩尔的 39 张照片中的时光倒流

如果你已经到达这个页面,你可能已经熟悉了 PCA。

主成分分析是数据科学探索工具包的一部分,因为它提供了许多好处:降低大型数据集的维度,防止多重共线性等。

有许多文章解释了 PCA 的好处,如果需要,我建议您看看这篇文章,它总结了我对这种方法的理解:

[## 主成分分析(PCA),行业的基本原理、优势和见解

了解为什么主成分分析不仅可以降低维数和节省计算时间,还可以避免…

towardsdatascience.com](/principal-components-analysis-pca-fundamentals-benefits-insights-for-industry-2f03ad18c4d7)

“功能性”PCA 背后的直觉

在标准的 PCA 过程中,我们定义特征向量以将原始数据集转换成具有更少维度的更小数据集,并且对于该数据集,大部分初始数据集方差被保留(通常为 90%或 95%)。

初始数据集(蓝色十字)和相应的前两个特征向量

现在让我们想象时间序列的模式比它们的绝对方差更重要。例如,您想比较信号、温度变化、生产批次等物理现象..功能性主成分分析将通过确定相应的基础功能来实现这一点!

初始数据集(蓝色十字)和相应的第一个函数

让我们以一个四季国家不同地区一年内的温度变化为例:我们可以假设有一个从冬季寒冷到夏季炎热的全球趋势。

我们还可以假设靠近海洋的区域将遵循与靠近山脉的区域不同的模式(即:海边的温度变化更平稳,而山区冬季的温度极低)。

我们现在将使用这种方法来确定 2019 年法国各地区之间的这种差异。这个例子直接受到传统的“加拿大天气”FPCA 例子的启发

2019 年法国各地区气温数据集的创建

我们首先按地区*获取法国自 2018 年以来的每日温度记录,并准备相应的数据集。

[## tempétemperature quotidienne départementale(depu is janvier 2018)-data . gouv . fr

天气预报显示最低温度,...

www.data.gouv.fr](https://www.data.gouv.fr/fr/datasets/temperature-quotidienne-departementale-depuis-janvier-2018/)

(温度记录在“部门”一级,这比法国的地区(96 个部门对 13 个地区)要小。但是,为了读者更容易理解,我们将“部门”重命名为“区域”。)*

我们选择了分布在法国的 7 个地区,它们对应着不同的天气模式(稍后会公布):06,25,59,62,83,85,75。

数据集上的 FDASRSF 包安装和使用

要在当前环境中安装 FDASRSF 软件包,只需运行:

*pip install fdasrsf*

(注意:根据我的经验,您可能需要手动安装一个或两个额外的包来正确完成安装。您只需要检查 anaconda 日志,以防无法识别它们。)

J. Derek Tucker 的 FDASRSF 软件包提供了许多有趣的函数,我们将使用其中的两个:功能比对功能主成分分析(参见下面的相应文档) :

[## 功能校准-FDA rsf 2 . 0 . 1 文件

使用 SRSF 框架和动态编程的组式函数对齐将一组函数对齐,同时…

fdasrsf-python.readthedocs.io](https://fdasrsf-python.readthedocs.io/en/latest/time_warping.html#)

功能校准将在时间序列未完全校准的情况下同步时间序列。下图提供了一个相对简单的示例来理解这种机制。从相位和振幅的角度(也称为 x 轴和 y 轴)处理时间序列。

摘自 J.D. Tucker 等人/计算统计和数据分析 61(2013)50–66

为了更准确地理解所涉及的算法,我强烈建议您看一看 J. Derek Tucker、吴伟和 Anuj Srivastava 的“使用相位和振幅分离的函数数据生成模型”。

尽管通过简单地查看原始数据和变形数据很难注意到这一点,但我们可以观察到变形函数确实有一些小的变化(参见略滞后于 x=y 轴的黄色曲线),这意味着这些函数在需要时同步了时间序列。(您可能已经猜到,温度记录是按照设计对齐的,因为它们是同时采集的。)

功能主成分分析

既然我们的数据集是“扭曲的”,我们可以运行一个功能性主成分分析。FDASRSF 软件包允许水平、垂直或联合分析。我们将使用垂直坐标,并为 PC1 和 PC2 绘制相应的函数和系数。

现在,我们可以根据在法国观察到的天气,在图上添加不同的天气模式:

显而易见,这种聚类与法国观察到的天气有多吻合。

同样重要的是,我根据我经常居住、工作和旅行的地方任意选择了这些部门,但它们没有被选中,因为它们为该演示提供了良好的结果。我希望其他地区的结果质量相同。

也许你想知道一个标准的 PCA 是否也能提供一个有趣的结果?

下图是从原始数据集中提取的标准 PC1 和 PC2,显示其性能不如 FPCA:

我希望这篇文章能让你更好地理解函数主成分分析。

我还要衷心感谢 J. Derek Tucker,他耐心地指导我使用 FDASRSF 软件包。

完整的笔记本存放在这里。

[## 皮埃尔-路易·贝斯康德关于媒介的文章

数据科学、机器学习和创新

pl-bescond.medium.com](https://pl-bescond.medium.com/pierre-louis-besconds-articles-on-medium-f6632a6895ad)

超越变形金刚和拥抱脸的分类

原文:https://towardsdatascience.com/beyond-classification-with-transformers-and-hugging-face-d38c75f574fb?source=collection_archive---------8-----------------------

对变压器架构进行探索性模型分析(EMA ),深入关注、嵌入和半监督学习。

在这篇文章中,我计划探索自然语言处理领域的前沿架构,比如 BERT/Transformers。我假设读者熟悉变压器架构。要了解更多,请参考杰伊·阿拉玛的帖子这里和这里。我还将探索几个 BERT 变体,如 BERT-base 和 RoBERTa-base 模型,但是这些技术可以非常容易地扩展到更近的架构,这要感谢拥抱脸!

随着我开始潜入变形金刚的世界,最终进入伯特和它的兄弟姐妹,我遇到的一个共同主题是拥抱脸库(链接)。这让我想起了 scikit-learn,它为从业者提供了几乎所有算法的便捷访问,并提供了一致的界面。拥抱脸库已经实现了相同类型的一致且易于使用的界面,但这一次是在 NLP 世界中基于深度学习的算法/架构。我们将借助本库提供的这些接口来深入研究这些架构。

探索性模型分析

任何机器学习(ML)项目的主要组成部分之一是探索性数据分析(EDA)。在过去的几年里,我参与的每个 ML 项目都是从我和我的团队迭代地做 EDA 开始的,这有助于理解和制定一个具体的问题陈述。下面的图 1 展示了具有迭代 EDA 阶段的典型 ML 过程,该过程旨在回答关于数据的问题以帮助做出决策,通常是关于利用数据来解决特定业务问题的方法(比如通过建模)。

图 1:带有探索性数据分析(EDA)的典型 ML 流程

随着深度学习(DL)的出现,特别是迁移学习选项的出现,探索阶段现在已经超越了查看数据。它还需要另一个模型探索周期,让我们称之为 EMA (探索性模型分析),它涉及理解模型架构、它们的预训练过程、进入预训练的数据和假设、架构的限制(,例如输入大小、模型偏差、它们不能解决的问题类型),以及它们可以为下游任务进行微调的程度。换句话说,分析 他们在复训、少杆微调到零杆(就像他们在 GPT-3 世界里说的那样)的光谱中处于什么位置。

图 2: EDA + EMA:一个典型的既有 EDA(探索性数据分析)又有 EMA(探索性模型分析)的深度学习流程..或者我们应该叫它 EDMA?😃

在本文中,我将更多地关注 BERT 上的 EMA(以及类似的东西),以了解除了对分类或问答进行微调之外,它还能提供什么。正如我前面所述,拥抱人脸库可以为我们提供窥视模型和探索模型各个方面所必需的工具。更具体地说,我想利用图书馆来回答以下问题-

  1. 在给定权重的情况下,我如何能够窥视预训练模型架构并尝试解释模型结果?如果你听说过注意力权重以及它们如何被用来解释这些模型,我们将探索如何使用拥抱面部库来访问它们,并可视化它们。
  2. 我如何访问类似 BERT 模型的不同层的输出?如果我必须在完全无人监督的情况下超越,我能从这些模型中期待什么样的输出质量?我们将提取单词和句子向量,并将它们可视化以分析相似性。此外,当我们在来自完全不同领域的数据集上微调这些模型时,我们将检查对这些向量和指标的质量的影响。简而言之,如果我们没有特定领域的数据集进行微调,我们将如何前进?!

这些问题源于两个痛点,标签数据的有限可用性和可解释性。与 Kaggle 竞赛不同,我参与的大多数现实世界项目都没有给我们一个好的带标签的数据集,挑战在于证明创建带标签数据的成本是合理的。第二个挑战,在一些项目中,也是提供模型行为解释的能力,以规避一些风险。

事不宜迟,我们开始吧!😃

轻松获取注意力权重:走向阐释的一步

今天所有基于变压器的架构都是基于注意机制。我发现理解注意力如何工作的基本原理有助于我探索如何将其作为一种解释工具。我计划在这篇文章中从高层次上描述这些层,并更多地关注如何使用变形金刚库从拥抱脸中提取它们。如果你需要深入了解注意力的概念,我建议你去看看杰伊·阿拉玛的博客(之前提供的链接)或者看一下克里斯·麦考密克和尼克·瑞安的播放列表(这里是)。

拥抱面部库为我们提供了一种访问所有隐藏层中所有注意力头部的注意力值的方法。在 BERT 基本模型中,我们有 12 个隐藏层,每个隐藏层有 12 个注意力头。每个注意力头部具有大小为 NxN 的注意力权重矩阵(N 是来自标记化过程的标记数量)。换句话说,我们总共有 144 个矩阵(12×12),每个矩阵的大小为 NxN。每个令牌在每层输入或输出的最终嵌入大小为 768 (来自每个注意力头的 64 维向量,即 64×12 = 768)当你看到下面的图 4 时,这一点就很清楚了。

图 3 提供了编码器层的架构。下面的图 4 深入图 3 中的注意块,并通过 BERT 基本模型的一个注意层(为了简单起见,忽略 batch _ size)提供了一个句子的简化的高级流程。这些图表有望清楚地说明当您通过库将 output_attentions 标志设置为 true 时将返回什么矩阵。

图 3:编码器堆栈的简图。如你所见,在每个编码器层之后,我们为每个令牌获得一个向量。下图(图 4)深入研究了其中一个编码器模块中的注意模块

图 4:通过 BERT 基本模型的一个自我关注层的一个句子的简化的高级流程(为了简单起见忽略了批处理 dim)。输入矩阵 Nx768 (N 行,每个标记一行,每一行嵌入 768 个维度)流经注意力层(中间的方框)。当我们在 BertConfig 中设置 output_attention=True 时,它为每个 for attention head 返回矩阵‘A’。

:我在这里找到了工具*和* 这里 ,这些工具使我们能够将注意力可视化。这些工具要么已经过时,要么不能实现所有最新的架构。此外,它们中的一个没有利用维护良好的 API(如 Hugging Face ),而是重新实现了其中的架构,这阻碍了为更新的架构运行东西的机会。

让我们快速浏览一下代码(完整的笔记本可以在* 这里找到 )。这里所有的代码,除了微调,都可以在没有 GPU 的情况下运行*

上面的代码创建了一个带有 output_attentions=True 的 Bert 配置,并使用这个配置来初始化 Bert 基本模型。我们将模型置于 eval 模式,因为我们只关心在这个任务的架构中向前传递。然后代码进入 tokenize 并向前传递。输出的形状基于文档中描述的配置。前两项是最后层的 last_hidden_state 和可用于微调的 pooled_output。下一个输入是我们感兴趣的,也就是注意力。从最后三个语句可以看出,我们可以到达任何一层,任何一个注意力头,每个注意力头都会给我们一个我们感兴趣的 NxN 矩阵。

我们可以快速绘制 144 个矩阵的热图,如下所示

上面的代码有两个简单的功能:

“get _ attentions”导航到特定层和注意力头,并抓取要可视化的 NxN 矩阵

“PLT _ attentions”绘制作为热图传递的矩阵

作为我在完整笔记本这里中的 EDA 的一部分,我将所有 144 个热图绘制成一个网格,并浏览它们以找出一些注意力权重变化较大的热图。下面图 3 中的一个例子显示了“动物因为太累而没有过马路”这句话中单词“it”和“animal”之间的关系。

图 5:来自第 9 层和注意头 10 的句子“动物没有过马路是因为它太累了”的注意热图。我们可以看到“它”这个词对于“动物”来说有很大的分量。

正如你所看到的,只要对建筑有一些基本的了解,拥抱脸的变形金刚库就可以非常容易地从任何注意力集中点提取原始重量。既然我们已经讨论了如何提取原始权重,那么让我们讨论一下我们是否应该直接使用它们来解释模型已经学习到的内容。最近的一篇论文“量化变形金刚中的注意力流”正是讨论了这一方面。他们说“在变压器的各层中,来自不同令牌的信息变得越来越混杂”**

这意味着过多地解读这些权重来解释模型如何解构输入文本可能不是很有用。他们继续设计策略来帮助解释输入对输出的影响。我不会在这里深入讨论整篇论文,但简而言之,他们讨论了在架构之上构建有向无环图(DAG ),这将有助于跟踪输入对和隐藏令牌之间的路径和信息流。他们讨论了两种方法“注意力转出”和“注意力流”,这两种方法可用于将注意力权重解释为输入标记的相对相关性。简单地说,不要只关注特定层中的原始信息,而应该考虑从输入嵌入到特定隐藏输出的所有加权信息流。如果你有兴趣了解更多,你也可以参考这篇文章,那篇文章用实例解释了这篇论文。

总之,为了解释特定输入的效果,我们不应该只看每一层中独立的原始注意力,而应该更进一步,使用它们来跟踪从输入嵌入到特定输出的所有方式的贡献。

获取单词和句子向量:通向相似性的途径(以及聚类、分类等)。)

正如我们所讨论的,访问注意力层和相应的权重是非常容易的。拥抱脸库也为我们提供了从每一层输出的便捷途径。这允许我们生成单词向量,以及潜在的句子向量。

词向量

下面的图 6 显示了我们可以提取单词级向量的几种不同方式。我们可以对最后几层进行平均/求和/连接,得到一个矢量。假设是初始层(更接近输入)将学习低级特征(像 CNN 中的,最后几层(更接近输出)将具有更丰富的单词表示。我们也可以只提取最后一层或倒数第二层作为单词/令牌向量。对于应该使用什么,并没有一致的意见,这实际上取决于下游任务的需求,,如果我们试图在下游运行的任务足够简单,这可能并不重要。**

**图 6 单词向量:我们可以为每个单词提取向量的方法。在左侧,它显示了我们如何对最后 4 层进行平均、求和或连接,以获得 token-1 的一个向量。在右边,它显示了我们如何从最后一层或倒数第二层访问 Token-N 的向量。

词语相似度

一旦我们有了单词向量,我们就可以在下游任务中使用它们,比如相似性。我们可以使用 PCA 或 tSNE 等降维技术直接将它们可视化。相反,我通常先在高维空间中寻找这些向量之间的距离,然后使用像多维标度(MDS;refLink)可视化距离矩阵。下面的图 7 总结了这种方法(我们也可以对句子这样做,只要我们计划直接访问句子向量,在后面的文章中会有更多的介绍):

图 7:如何对 4 个单词使用余弦距离+ MDS(多维标度)来可视化单词向量的流程

实现:词语相似度

让我们开始查看一些实现上述流程的代码。完整的 colab 笔记本可以在* 这里找到*

我们将遵循与初始化和可视化注意力权重相同的过程,除了这次我们在初始化模型时使用"output _ hidden _ States = True "

我们还切换到 encode_plus 而不是 encode,这将有助于我们添加 CLS/SEP/PAD 令牌,而且工作量要小得多。我们围绕它建立一些额外的逻辑,以获得掩盖焊盘和 CLS/sep 的注意力屏蔽。注意下面函数中的返回值

让我们定义模型,并在例句上调用它。

让我们定义几个辅助函数:

  • get_vector :根据需要提取矢量(如上图等中所讨论的跨多个层的连接/求和。)**

  • plt_dists :绘图距离矩阵通过。这将计算通过距离矩阵的 MDS 图。

  • eval_vecs :将 get_vector 和 plt_dists 结合在一起,获得句子的单词向量

就是这样!我们现在准备好在不同的配置中可视化这些向量。让我们来看其中的一个,连接最后 4 层的单词向量,并可视化。我们通过两个句子

*texts = [
"Joe took Alexandria out on a date.",
"What is your date of birth?",
]*

然后调用函数来绘制相似性

*MODE = 'concat'eval_vecs(hidden_states, tokenized_sents, mode='concat')*

图 8:如您所见,date_0 和 date_1 是不同的向量,更接近于各自句子中的其他单词。这使得我们现在可以根据它们出现的句子来使用它们(即“语境化”)

句子向量

基于编码器的模型为我们提供了几个选项来从架构中获取句子向量。图 9 向我们展示了这些选项:

  1. 可以使用 CLS 令牌的最后一层(或最后 n 层的平均)来提取句子向量。我尝试提取和可视化基于 CLS 令牌的句子相似性,但它没有给我好的结果。

BERT 作者的一个快速注释:这个输出通常不是输入的语义内容的很好的总结( 来源 )。

2.整个句子的平均记号向量。如上所述,标记向量本身可以来自最后 N 层的连接/平均,或者直接来自第 N 层。

图 9:可以直接使用最后一层 CLS 记号来提取句子向量,或者可以对句子中的所有记号进行平均,这些记号又可以来自最后一层、倒数第二层或者对几层进行平均,如图 6 所示。

句子相似度

两个句子的相似性是非常主观的。两个句子在一个上下文中可能非常相似,而在另一个上下文中可能被视为相反。例如,两个句子可以被称为相似,因为它们谈论的是某个主题,并且可以讨论该主题的积极和消极方面。这些句子可以被认为是相似的,因为它们谈论的是一个共同的话题,但如果重点是句子的极性,则被认为是对立的。这些架构中的大多数都是在独立的目标上训练的,如掩蔽语言模型(MLM)和下一句预测(NSP),并且是在大型的不同数据集上训练的。根据手头的任务,我们现成的相似性可能相关,也可能不相关。

不管怎样,看看我们理解相似性的选择是很重要的。下面的图 11 在下面的流程图中用句子相似性总结了我们的选项。

图 11:使用类伯特模型计算句子相似度的不同方法

上面的选项#1 和选项#2 提取并尝试创建句子向量,然后可以使用我们为单词向量相似性构建的相同管道。

选项#3 试图直接从单词向量计算两个句子之间的相似度,而不是试图显式地创建句子向量。这使用了一种叫做单词移动距离(WMD)的特殊度量。

图 10: WMD 计算:左边的句子如何转换“移动”到右边的句子

你可以在这里阅读 WMD 的原始论文,但简而言之,它是基于 EMD(地球移动距离)的,并试图使用单词向量将单词从一个句子移动到另一个句子。图 10 显示了一个直接来自论文的例子。这里的有一个很好的实现,这里的有一个很棒的解释

实现:句子相似度

运行句子相似性选项的代码可以从 colab 笔记本这里 这里 获得

大部分代码与我们之前讨论的单词嵌入非常相似,除了计算单词移动距离。下面的类使用 WMD-relax 库计算单词移动距离。它需要访问一个嵌入的查找,当一个单词被传递时,它产生一个向量。

定义用于计算从 BERT 中提取的向量的 WMD 的类。这需要一个嵌入的查找字典。在内部,它计算 n-bow,这实质上是基于单词在句子中的数量的单词分布。

迁移学习的潜力:

对于基于 Transformer 的模型,我遇到了两个层次的迁移学习:

  • 预训练模型中包含的默认学习内容。伯特/罗伯塔等模特。来接受大型语料库的预训练,给我们一个起点
  • 针对特定任务学习对架构进行微调,这是这些架构目前的典型使用方式(例如,使用来自领域的数据集构建分类器/问答系统)

我处理的问题通常没有特定领域的标注数据集。这让我开始探索第三个选项:

  • 如果我对来自不同领域的数据集的模型进行微调,会怎么样?如果我确定目标是相似的,即使我知道会有协变,我还能转移学习吗? (协变量移位是训练和测试/实时数据中存在的输入变量分布的变化)。

为了了解这种迁移学习的方法是否有效,让我们做一个快速实验。让我们选择情绪/极性作为我们实验的目标。

我们采用预训练的 RoBERTa 模型,在来自 IMDB 50K 电影评论训练* 上微调该模型,然后挑选我们的评估数据集**如下:*

  • 来自 IMDB 50k 电影评论测试数据集的两句话
***Positive**: *'This is a good film. This is very funny. Yet after this film there were no good Ernest films!'***Negative**: *'Hated it with all my being. Worst movie ever. Mentally- scarred. Help me. It was that bad.TRUST ME!!!'**
  • 2 句来自亚马逊美食评论,来自完全不同领域的数据集。我们仅将此用于评估
****Positive****: 'This taffy is so good.  It is very soft and chewy.  The flavors are amazing.  I would definitely recommend you buying it.  Very satisfying!!'***Negative**: *"This oatmeal is not good. Its mushy, soft, I don't like it. Quaker Oats is the way to go."**

然后,我们在基础预训练模型(在这种情况下是 RoBERTa 体系结构)和相同体系结构上的微调模型上提取和可视化句子相似性

微调 BERT 的代码可从这里获得。

对比:

  1. 让我们通过可视化通过平均单词向量获得的句子向量之间的余弦相似性来进行第一次比较,单词向量本身是来自最后四层的平均版本 ( 我知道这很拗口,但如果你需要澄清其中的任何一点,请随意滚动到我们详细讨论它们的地方)。

图例:黄色圆圈为正,粉色圆圈为负

下面的图 11 显示了在预训练模型上运行的可视化:

图 11 预训练模型:向量彼此非常接近。我们需要放大才能更好地理解。黄色圆圈为正,粉色圆圈为负**

下图 12 显示了与图 11 相同的图,但是放大了(注意轴有不同的范围)。这表明,虽然向量之间的距离确实很小,但放大后,我们看到该模型确实试图将讨论主题(食物)的句子放置得彼此更近,更倾向于讨论的主题而不是句子的极性(见底部的两个圆圈,一个黄色,一个粉红色)

图 12 预训练模型:放大后,我们看到它确实试图将讨论主题(食物)的句子放得更近,更倾向于讨论的主题而不是句子的极性。黄色圆圈是正的,而粉色圆圈是负的

现在让我们看看下面图 13 中通过微调模型传递的相同句子。请注意,基于极性,句子之间的距离更近了。正如你所注意到的,它已经将焦点从讨论的主题(食物/电影)转移到极性(积极与消极):来自电影评论数据的积极句子更接近来自食物评论数据集的积极句子,正如负面例子的情况一样。这正是我们需要的!我们想要使用一个来自完全不同领域的数据集,但是具有相似的标记目标,来转移学习!

图 13 微调模型:正如你所注意到的,它已经将焦点从讨论的主题(食物对电影)转移到了极性(积极对消极)。黄色圆圈是正的,而粉色圆圈是负的

2。让我们通过可视化单词移动距离(WMD)来进行第二轮比较,该距离是根据最后四层的平均单词向量计算的。

下面的图 14 显示了与上面模型相似的特征。讨论的主题(食物)似乎仍然是焦点。这里的一个主要区别是,单词移动距离(WMD)能够比早期的方法更好地梳理出距离(将余弦距离应用于跨句子的平均单词向量),即使在基本模型上也是如此,即没有必要在这里放大。这表明平均单词向量可能会对下游任务产生意想不到的后果。

图 14:距离度量,单词移动距离(WMD ),显示了相似的特征,但是比平均方法更有助于区分句子。黄色圆圈是正的,而粉色圆圈是负的

下面的图 15 显示了使用微调模型的四个句子的相同 WMD 度量,这再次表明我们能够将模型的焦点“转移”到极性。

图 15:使用微调模型的四个句子的 WMD 度量。黄色圆圈是正的,而粉色圆圈是负的

总之,从不相关的领域数据集进行迁移学习的能力将为当今与数据斗争的项目开辟更多的途径。变压器的力量现在可以使公司利用以前不可用的数据集,而不必花时间创建带标签的数据集。

我希望这篇文章是有帮助的。很少有其他主题,如 NLP 中的数据扩充、通过 LIME(局部可解释模型不可知解释)等技术的模型解释等。这引起了我的兴趣,我计划在以后的文章中探索它们。在此之前,感谢阅读!

参考文献:

*[## BERT -变压器 3.0.2 文档

BERT 模型是在 BERT:用于语言理解的深度双向转换器的预训练中提出的…

huggingface.co](https://huggingface.co/transformers/model_doc/bert.html#bertmodel)* *[## BERT:用于语言理解的深度双向转换器的预训练

我们介绍了一种新的语言表示模型,称为 BERT,代表双向编码器表示…

arxiv.org](https://arxiv.org/abs/1810.04805)* * [## 图示的变压器

讨论:黑客新闻(65 分,4 条评论),Reddit r/MachineLearning (29 分,3 条评论)翻译…

jalammar.github.io](http://jalammar.github.io/illustrated-transformer/) [## 量化变压器中的注意力流

在 Transformer 模型中,“自我注意”将来自注意嵌入的信息结合到“自我注意”的表征中

arxiv.org](https://arxiv.org/abs/2005.00928) [## 量化《变形金刚》中的注意力流|周欣宇·阿布纳

注意力已经成为神经序列处理模型的关键组成部分,而可视化的注意力权重是…

samiraabnar.github.io](https://samiraabnar.github.io/articles/2020-04/attention_flow) [## seaborn.heatmap - seaborn 0.10.1 文档

海博恩。热图(data,vmin=None,vmax=None,cmap=None,center=None,robust=False,annot=None,fmt='.2g'…

seaborn.pydata.org](https://seaborn.pydata.org/generated/seaborn.heatmap.html) [## 放松点

计算单词移动器的距离,如马特·库斯纳,孙玉的《从单词嵌入到文档距离》中所述…

github.com](https://github.com/src-d/wmd-relax) [## 亚马逊美食评论

分析来自亚马逊的约 500,000 条美食评论

www.kaggle.com](https://www.kaggle.com/snap/amazon-fine-food-reviews) [## IMDB 50K 电影评论(测试你的 BERT)

用于语言翻译模型的 Pytorch-nlp 电影数据集(ULMFiT、BERT、OpenAI)

www.kaggle.com](https://www.kaggle.com/atulanandjha/imdb-50k-movie-reviews-test-your-bert) [## 多维标度

多维标度(MDS)是一种可视化数据集单个案例相似程度的方法。MDS…

en.wikipedia.org](https://en.wikipedia.org/wiki/Multidimensional_scaling) [## 两个文档的词对之间的词移动器距离计算

begingroup\(文档中的每个单词都与所有其他单词相匹配,但由流矩阵\)\bf{T}$ (with…

stats.stackexchange.com](https://stats.stackexchange.com/questions/303050/word-movers-distance-calculation-between-word-pairs-of-two-documents)

https://arxiv.org/pdf/1906.05714.pdf*

超越 CUDA: GPU 加速 Python,简化跨厂商显卡的机器学习

原文:https://towardsdatascience.com/beyond-cuda-gpu-accelerated-python-for-machine-learning-in-cross-vendor-graphics-cards-made-simple-6cc828a45cc3?source=collection_archive---------10-----------------------

跨供应商显卡(AMD、高通、NVIDIA & friends)上 GPU 加速 Python 的实际深度探讨使用 Kompute Python 框架和 Vulkan SDK 构建机器学习算法

博客帖子的视频版本

机器学习算法——以及许多其他高级数据处理范式——非常适合 GPU 计算提供的并行架构。这推动了近年来用于加速计算的显卡的发展和采用的大幅增长。这也推动了围绕并发优化技术的令人兴奋的研究,例如模型并行和数据并行。

在本文中,您将学习如何用 Python 编写自己的 GPU 加速算法,您将能够在几乎任何 GPU 硬件上运行这些算法,包括非 NVIDIA GPUs。我们将介绍核心概念,并展示如何用几行代码就能开始使用 Kompute Python 框架

本农、塔尔和托尔斯滕·霍夫勒。“揭开并行和分布式深度学习的神秘面纱:深度并发分析。”美国计算机学会计算调查(CSUR)52.4(2019):1–43。

首先,我们将构建一个简单的 GPU 加速 Python 脚本,该脚本将并行相乘两个数组,这将介绍 GPU 处理的基础知识。然后,我们将在 GPU 上从头开始编写一个逻辑回归算法。以下是我们将涉及的核心主题,以及相应的资源链接:

  1. Kompute python 包安装
  2. Python 中 GPU 加速的数组乘法示例
  3. Python 中 GPU 加速的逻辑回归示例

阅读这篇文章的人只需要基本编程经验,不需要 GPU 计算知识。你可以在 主库、中找到完整的代码,我们还创建了一个在线 Google Colab 笔记本,在那里你可以免费使用 GPU 运行这个例子——你可以在 中找到这个链接

带有 GPU 示例的 Google Colab 笔记本

进入 Kompute & Vulkan SDK

我们今天将使用的 Python 框架有两个部分,这两个部分都在名称本身中——Vulkan SDK 和 Kompute。

与 Khronos 成员一起玩“瓦尔多在哪里”(图片由 Vincent Hindriksen 通过 StreamHPC 提供)

Vulkan SDK 是由 Khronos Group 领导的一个开源项目,Khronos Group 是一个由众多技术公司组成的联盟,致力于定义和推进移动和桌面媒体(和计算)技术的开放标准。

大量备受瞩目的(和新的)机器学习框架,如谷歌的 Tensorflow 、脸书的 Pytorch 、腾讯的 NCNN 、阿里巴巴的MNN——等等——已经采用 Vulkan 作为他们的核心跨供应商 GPU 计算 SDK。这主要是为了启用跨平台和跨厂商显卡支持的框架。

正如您所想象的,Vulkan SDK 提供了对 GPU 的非常低级的 C / C++访问,这允许非常专业的优化。这对 GPU 计算来说是一项巨大的资产,主要缺点是冗长,需要 500–2000 多行 C++代码才能获得编写应用程序逻辑所需的基本样板文件。这可能导致昂贵的开发周期和错误,从而导致更大的问题。这是我们启动 Kompute 项目的主要动机之一。

Kompute Python 包 通过优化的 C++绑定构建在 Vulkan SDK 之上,暴露了 Vulkan 的核心计算能力。Kompute 是 Python GPGPU 框架,我们将在本教程中使用它来构建 GPU 加速机器学习算法。

Kompute 文档(图片由作者提供)

安装 Python Kompute 包

为了让我们开始使用 Kompute Python 包,我们需要安装它所需的依赖项。该包在 Pypi 中可用,这意味着我们可以用pip install来安装它。但是,在使用机器之前,您需要在机器上安装以下关键组件:

  • CMAKE v3.41+(安装在 Windows 、 Linux (Ubuntu) 、 Mac )
  • 通过官网安装的 Vulkan SDK
  • C++编译器(例如用于 linux / mac 的 gcc,用于 Windows 的 MSVC)

一旦安装了这些依赖项,您只需运行:

  • pip install kp==0.5.1

您现在应该会看到一条成功消息,确认 Kompute Python 包已经安装。你可以在库中提供的 Google Colab 笔记本中自己尝试一下,可以用 GPU 设置。

编写你的第一个 Kompute: GPU 乘法

为了使用 Kompute 构建我们的第一个简单的数组乘法 GPU 计算应用程序,我们将编写一个简单的 python 程序来完成以下任务:

  1. 创建一个 Kompute 管理器(默认选择设备 0)
  2. 创建 Kompute 张量来保存数据(两个输入一个输出)
  3. 在 GPU 中初始化 Kompute 张量
  4. 定义在 GPU 上运行的代码
  5. 针对 Kompute 张量调度 GPU 着色器执行
  6. 使用 Kompute 操作将 GPU 输出数据映射到本地张量
  7. 打印您的结果

所需的完整 Python 代码非常少,因此我们可以在下面展示完整的脚本。我们将更详细地分解每个部分。

1.创建一个 Kompute 管理器(默认选择设备 0)

首先,我们将创建 Kompute 管理器,它负责创建和管理所有底层 Vulkan 资源。

正如你所看到的,这里我们正在初始化我们的 Kompute 管理器,默认情况下,它在设备 0 上创建所有的基本 Vulkan 资源(在我的例子中,它是一个 NVIDIA 卡,设备 1 是我的集成显卡)。对于更高级的用例,还可以提供您想要加载的底层 GPU 队列——在另一篇教程中,我们展示了这如何导致显著的加速,但这超出了本文的范围。

2.创建 Kompute 张量来保存数据(两个输入一个输出)

我们现在将创建用于输入和输出的 Kompute 张量。这些将保存所需的数据,这些数据将被映射到 GPU 来执行这个简单的乘法。

创建张量时,数据仅在本地 CPU 内存(即 RAM)中初始化,但是为了在 GPU 中使用它,我们必须将数据映射到 GPU 内存中。

3.在 GPU 中初始化 Kompute 张量

现在我们已经用本地数据创建了张量,我们将把数据映射到 GPU 中。为此,我们将使用eval_tensor_create_def,它将初始化底层 Vulkan 缓冲区和 GPU 内存,并执行各自到 GPU 的映射。

4.定义在 GPU 上运行的代码

现在我们已经初始化了必要的 Kompute 张量分量,并且它们被映射到 GPU 内存中,我们可以添加将在 GPU 中执行的 Kompute 算法。这被称为“着色器”代码,我们使用pyshader 库构建它。你可以在下面看到完整的着色器代码,我们将分解下面的每一部分。

GPU 着色器代码可以用装饰器@ps.python2shader定义为 Python 函数,这里的参数包括我们将使用的变量。这包括我们将要处理的张量输入和输出,参数格式如下:

  • <param≥=(“<memory>”, <binding>, <type>, ...)

在这种情况下,我们使用带浮点值的张量,它本质上等同于ps.Array值,用ps.f32浮点值作为元素。

第一个参数index的类型为GlobalInvocationId,为着色器提供执行 GPU 分派结构中的当前索引位置。这使我们能够知道我们当前正在并行执行循环中运行什么索引,这是我们从组件i = index.x中提取的内容——我们在这里选择x的原因是因为执行索引可以定义为一个vec3组件,其中将有inedx.xindex.yindex.z的执行索引。

最后一部分是实际使用的等式,在这种情况下,它是第一个和第二个参数的简单乘法,并存储在输出(第三个)参数中。

5.针对 Kompute 张量调度 GPU 着色器执行

为了运行上面的着色器,我们将使用eval_algo_data_def 函数。这个 Kompute 操作所需的参数包括绑定到 GPU 指令的张量,以及我们在上面的 Python 函数中定义的 GPU 着色器代码。

值得一提的是,Kompute 还允许用户将着色器作为原始 glsl 字符串传递,或者作为 SPIR-V 二进制文件或原始 glsl/hlsl 文件的文件路径。对于上下文, SPIR-V 是 GPU 可以用来处理相关操作的中间表示。

6.使用 Kompute 操作将 GPU 输出数据映射到本地张量

一旦算法成功运行,结果数据现在将被我们保存在我们的输出张量的 GPU 内存中。我们现在可以使用函数eval_tensor_sync_local_def将张量 GPU 内存同步到本地张量中。

7.打印您的结果

最后,我们可以打印出张量的输出数据。

当你运行它时,你会看到输出张量的值被打印出来。就这样,你写了你的第一个 Kompute!

虽然看起来不明显,但上面介绍了 GPU 计算中核心概念和设计思维的一些直觉,同时还抽象了一些更深入的概念。在接下来的几节中,我们将提供更具体的术语,最后我们还将概述一组文章,如果您有兴趣了解更多信息,可以深入研究。

潜入机器学习直觉

现在,我们将研究更高级的 GPU 计算用例,具体实现“你好,机器学习世界”:逻辑回归。在讨论实现之前,我们将提供一些概念和术语的直觉,这些概念和术语将在下面的章节中使用。

在机器学习中,我们总是有两个阶段,训练和推理。在下图中,您可以看到两个简化的流程。最上面是训练流程,在这里你识别一些数据,提取一些特征,训练一个模型,直到你对精度满意为止。一旦您有了一个经过训练的模型,您就可以持久化模型“权重”,并将模型部署到第二个工作流中,在第二个工作流中,模型将对看不见的数据执行推理。

数据科学流程(图片由作者提供)

在这种情况下,我们将有一个输入数据集X,其中每个元素是一对xixj。我们的输入数据如下:

  • xi = { 0, 1, 1, 1, 1 }
  • xj = { 0, 0, 0, 1, 1 }

利用该输入数据,要预测的预期目标值Y将如下:

  • Y = {0, 0, 0, 1, 1}

来自 DS Central 的逻辑回归示例

我们在机器学习中的核心目标是学习使用这些训练数据来找到函数(和参数),这将允许我们从新的“以前看不见的”输入中预测值Y

值得注意的是,预测值将被定义为ŷ,它是用我们的“预测”函数计算的值,不同于我们上面定义的Y的“真”或“实际”值。

我们将用于逻辑回归的函数如下:

让我们来分解这个函数:

  • z —是我们的线性映射函数
  • ŷ—结果预测输出
  • Xᵀ——向量矩阵的转置,我们将表示为x_ix_j
  • σ—sigmoid 函数,将在下文详细介绍

我们希望通过机器学习算法学习的参数是:

  • w —将应用于输入的权重
  • b —将要添加的偏差

还有环绕函数σ 也就是 sigmoid 函数。该函数迫使我们的输入更接近 0 或 1,这可以直观地视为我们的预测为“真”或“假”的概率,定义如下:

这就是现在的预测/推理功能,它将允许我们处理来自新数据点的预测。例如,如果我们说我们有一组新的看不见的输入X = { (0, 1) },并且我们假设在通过我们的训练数据运行我们的机器学习算法之后,学习到的参数是W = (1, 1), b = 0 (稍后我们将这样做),那么我们将能够通过我们的预测函数来运行它,方法是将这些值代入如下:

在这种情况下,预测是0.73...,这将是一个积极的预测。当然,这只是为了演示一旦我们知道了参数Wb.,我们的推理函数会是什么样子

从 ML 学院可视化梯度下降

我们学习参数的方法是进行预测,计算误差,然后相应地重新调整权重。用于基于“预测误差”来“重新调整”权重的方法将通过利用梯度下降来完成。这将被重复多次以找到更精确的参数。

为此,我们将需要使用每个公式的导数。第一个,是我们的线性映射函数z的导数,使用变量wzb. 的偏导数。首先,偏导数∂z:

  • ∂z = z(X) — y

其中变量定义如下:

  • ∂z —线性映射函数的偏导数z(x)
  • z(X) —应用于输入x的线性映射函数的结果
  • y —输入 x 预期的实际值标签

类似地,w 和 b 的导数分别如下:

  • ∂w = (X — ∂z)/m
  • ∂b = ∂z/m

在这种情况下,m是输入元素的总数。

我们现在能够使用上述方法重新调整参数,如下所示:

  • w = w — θ · ∂w
  • b = b — θ · ∂b

在这种情况下,θ是学习率,顾名思义,它控制每次迭代中参数被修改的比率。直观地说,越小,算法收敛所需的迭代次数就越多,然而,如果学习速率太大,它将超调,导致永远无法收敛(从上面的图像中,你可以想象它将不断从一边跳到另一边,永远不会到达底部)。

为了计算损失,我们将使用对数损失函数,也称为交叉熵损失函数。该功能定义如下:

对数损失(交叉熵损失)函数

直观的图表显示 ML Mastery 的成本函数

函数本身是这样设置的,预测类和期望类之间的差异越大,误差就越大(你可以看到如果预测类在完全不同的标签上,它会受到多大的惩罚)。

损失函数将为我们提供一个在迭代中改进算法的思路。

最后,这里最重要的一点将是我们如何利用 GPU 的并行架构来优化计算背后的直觉。在这种情况下,我们可以同时处理多个输入参数,称为微批处理,然后批量重新调整参数。这被称为数据并行化,是许多可用技术之一。在下一节中,我们将看到这是如何实现的,即传递一小批输入,存储权重,然后在下一次迭代之前重新调整它们。

注意:在这篇文章中,我们不会深入研究太多细节,也不会研究机器学习的最佳实践,但是在文章的最后,我们将列出一系列广泛的来源,供有兴趣将其机器学习(或 GPU 计算)知识提升到一个新水平的人使用。

现在我们已经讨论了一些核心概念,我们将能够了解实现。

机器学习 GPU 着色器实现

首先,我们将从 GPU 计算着色器开始,它是将在 GPU 中执行的代码。完整的着色器概述如下,我们将详细分解每个部分来解释每个部分是做什么的。

1.定义输入和输出参数

首先,我们定义所有输入参数,这些参数类似于我们在前面章节中提到的输入和输出组件。

如果您还记得,在上一节的结尾,我们提到了如何利用微批处理的概念来使用 GPU 处理的并行架构。这在实践中意味着,我们将把 X 的多个实例一次传递给 GPU 来处理,而不是期望 GPU 一个接一个地处理它。这就是为什么我们看到上面有一个分别用于xi, xj, y, wOuti, wOutj,bOut的数组。

更详细地说:

  • 作为数组x_ix_j的输入X 将保存微批量的输入
  • 数组y 将保存微批量输入的所有预期标签
  • 两个输入权重参数w_in_iw_out_j将用于计算预测
  • 将用于计算预测的输入参数b
  • 输出权重w_out_iw_out_j 包含权重,并将存储所有应减去的微量批次的 W 的导数
  • 类似地,输出偏置数组包含所有微批次的b 的导数,这些导数应在批次中减去
  • 最后l_out包含了损失将被返回的输出数组

2.将输入缓冲区的大小定义为 M

我们还收到常数M,它将是元素的总数——如果你记得这个参数将用于导数的计算。我们还将看到这些参数是如何从 Python Kompute 端传递到着色器的。

现在我们已经定义了所有的输入和输出参数,我们可以开始定义核心逻辑,它将包含我们的机器学习训练算法的实现。

3.跟踪执行索引

我们需要跟踪全局调用的当前索引。由于 GPU 并行执行,这些运行中的每一个都将直接并行运行,因此这允许当前执行一致地跟踪当前正在执行的迭代索引。

4.根据输入参数定义变量

我们现在可以开始准备所有的变量,我们将在整个算法中使用。我们所有的输入都是缓冲数组,所以我们希望将它们存储在vec2float32变量中。

在这种情况下,我们基本上明确了当前“线程运行”所使用的变量。GPU 架构由稍微更细微的执行结构组成,涉及线程块、内存访问限制等——但是我们不会在本文中讨论这些。

现在我们进入更有趣的部分——实现推理/预测逻辑。下面我们将实现推理逻辑来计算ŷ,这涉及到线性映射函数,以及我们上面定义的 sigmoid 函数。

5.计算导数以“重新调整”参数

现在我们有了y_hat,我们现在可以用它来计算导数(∂z∂w∂b),在本例中是当前执行的索引输入元素的导数。

6.计算当前迭代的损失

使用预期的预测输出和计算的预测输出,我们现在能够计算当前迭代的损失。如上所述,我们使用对数损失(交叉熵)函数来计算损失。

7.存储输出参数的数据

最后,我们能够将所有相应的计算指标传递到输出缓冲区。这将允许我们为下一次迭代重新调整。

我们现在已经完成了着色器,它将使我们能够在 GPU 中训练逻辑回归算法-我们现在将涵盖调用该着色器并协调机器学习训练和推理的其余逻辑。下面概述了完整的脚本,您也可以在带有 GPU 的 Google Colab 笔记本中尝试一下。

Kompute 的机器学习编排

我们将使用 Kompute 的一些更高级的组件,这些组件可以在下图中更直观地看到。

Kompute 建筑设计(图片由作者提供)

Kompute 的核心是 Kompute“序列”和“操作”,用于 GPU 动作。一个 Kompute 段可以记录和执行一批 Kompute 操作,以便更有效地处理。在这个例子中,我们将利用序列来管理机器学习处理的更有效的执行。

类似于上面的例子,我们将会设置以下步骤:

  1. 用明确定义的设备创建 Kompute 管理器
  2. 创建所有需要的 Kompute 张量
  3. 通过 Kompute 管理器执行 Kompute Tensor GPU 初始化
  4. 创建 Kompute 序列并记录执行操作
  5. 迭代 100 次:运行微批处理执行并更新权重
  6. 打印结果参数,用于将来的推断

如你所见,这比我们上面使用的简单例子更复杂。在这种情况下,我们将使用 Kompute 序列,而不是直接使用 Kompute 管理器,因为我们希望对命令进行更深入的控制,这些命令可以被记录下来并批量发送到 GPU。我们将在讲述每个步骤时更详细地讨论这一点。让我们开始吧。

1.用明确定义的设备创建 Kompute 管理器

我们将创建带有明确定义的设备 0 的 Kompute 管理器——您可以根据需要定义另一个设备。

2.创建所有需要的 Kompute 张量

现在我们将创建所有需要的张量。在这一小节中,你会注意到我们将引用着色器中使用的所有缓冲区/数组。我们还将介绍参数传递的顺序如何与数据绑定到着色器的方式相关联,以便可以访问数据。

我们还将它们存储在一个列表params中,以便于访问:

3.通过 Kompute 管理器执行 Kompute Tensor GPU 初始化

Kompute 张量初始化是相当标准的,所以我们将能够通过管理器直接完成这一步,就像我们之前在简单的数组乘法示例中所做的那样。

4.创建 Kompute 序列并记录执行操作

在本节中,我们将清除 Kompute 序列的先前记录,并开始记录一组序列。您会注意到,与上一节不同,在这种情况下,我们不会直接运行eval(),因为我们必须首先记录操作。

您还会注意到,我们将通过不同的功能记录三种类型的 Kompute 操作:

  • record_tensor_sync_device(...) —此操作通过将张量的本地数据映射到 GPU 数据,确保张量与其 GPU 内存同步。在这种情况下,这些张量使用设备专用内存来提高处理效率,因此在操作中使用分级张量来执行映射(为了提高效率,在整个操作中重复使用分级张量)。在这里,我们只想同步输入权重,因为这些权重将随各自的导数在本地更新。
  • record_algo_base_data(...) —这是 Kompute 操作,它将我们上面编写的着色器与所有本地 CPU/主机资源绑定在一起。这包括提供张量。值得一提的是,作为参数提供的张量的索引是它们通过各自的绑定在着色器中映射的顺序。
  • record_tensor_sync_local(...) —该 Kompute 操作执行与上述同步操作类似的一组指令,但它不是将数据复制到 GPU 存储器,而是相反。这个 Kompute 操作将 GPU 内存中的数据映射到本地张量向量,因此可以从 GPU/主机访问它。如你所见,我们只在输出张量中运行这个操作。

5.迭代 100 次:运行微批处理执行并更新权重

现在我们已经记录了命令,我们可以开始运行这些预加载命令的执行。在这种情况下,我们将运行一个微批处理迭代的执行,然后在本地更新参数,以便在接下来的迭代中使用它们。

7.打印结果参数,用于将来的推断

我们现在有了一个经过训练的逻辑回归模型,或者至少我们已经能够优化其各自的功能,以确定合适的参数。我们现在能够打印这些参数,并在看不见的数据集中使用这些参数进行推理。

我们完事了。

您可以在示例存储库中找到这个完整的示例,您将能够运行和扩展它。

接下来呢?

恭喜你,你一路走到了最后!虽然这篇文章涵盖了广泛的主题,但是也有大量的概念被浏览过。其中包括底层 Vulkan 概念、GPU 计算基础、机器学习最佳实践和更高级的 Kompute 概念。幸运的是,网上有大量的资源可以扩展你在这些方面的知识。我推荐作为进一步阅读的一些链接包括:

  • Kompute 文档了解更多细节和更多示例
  • 机器学习工程师时事通讯如果你想了解关于机器学习的最新文章
  • 出色的生产机器学习开源工具列表,用于部署、监控、版本化和扩展您的机器学习
  • FastAI 的 ML for Coders 课程简介进一步学习机器学习概念

作者图片

超越网格搜索:XGBoost 的超荷超参数调优

原文:https://towardsdatascience.com/beyond-grid-search-hypercharge-hyperparameter-tuning-for-xgboost-7c78f7a2929d?source=collection_archive---------3-----------------------

使用 Hyperopt、Optuna 和 Ray Tune 加速机器学习超参数优化

机器学习模型超参数的贝叶斯优化比网格搜索更快更好地工作。以下是我们如何加快超参数调优的方法:1)使用 Hyperopt 和 Optuna 进行贝叶斯优化,运行于……2)使用 Ray 分布式机器学习框架,使用统一 Ray 调优 API 来实现许多超参数搜索算法和提前停止调度程序,以及……3)使用云实例的分布式集群来实现更快的调优。

作者图片

大纲:

  1. 结果
  2. 超参数调整概述
  3. 贝叶斯优化
  4. 提前停止
  5. 实施细节
  6. 基线线性回归
  7. L1 和 L2 正则化线性回归
  8. 带 GridSearchCV 的 ElasticNet
  9. XGBoost:超参数子集上的序贯网格搜索
  10. XGBoost: Hyperopt 和 Optuna 搜索算法
  11. LightGBM: Hyperopt 和 Optuna 搜索算法
  12. 光线簇上的 XGBoost
  13. 光线簇上的 LightGBM
  14. 结束语

1.结果

底线在前面:这里是艾姆斯住房数据集的结果,预测爱荷华州的房价:

使用各种超参数优化方法的 XGB 和 LightGBM 的 RMSE 和搜索时间

基线线性模型的 RMSE 和拟合时间

基线线性模型

单实例的时间是在一个 12 线程的本地桌面上,与 EC2 4xlarge 相当。集群的时间在 m5.large x 32 (1 个头节点+ 31 个工作节点)上。

  • 与网格搜索相比,我们在本地使用 Hyperopt 和 Optuna 时获得了很大的加速。顺序搜索执行了大约 261 次尝试,因此 XGB/Optuna 搜索在一半的时间内执行了大约 3 倍的尝试,并得到了类似的结果。
  • 与具有 12 个线程的本地桌面相比,32 个实例(64 个线程)的集群提供了适度的 RMSE 改进。我试图这样设置,这样我们就可以在 RMSE 和本地的 Hyperopt/Optuna 之间获得一些改进(我们在 2048 次试验中做到了这一点),并在训练时间上获得一些加速(我们在 64 线程中没有得到这一点)。它在不到两倍的时间内进行了两倍的试验。比较是不完美的,本地桌面与 AWS,在本地运行 Ray 1.0,在集群上运行 1.1,不同的试验次数(更好的超参数配置不会提前停止,需要更长的训练时间)。但重点是看看在实践中,利用集群与本地台式机或笔记本电脑相比,可以获得什么样的改进。底线是,32 节点群集带来了适度的好处。
  • RMSEs 在所有方面都是相似的。XGB 与 2048 年的审判是最好的一个小幅度的助推模型。
  • 在 RMSE 或运行时,LightGBM 并没有提供对 XGBoost 的改进。以我的经验来看,LightGBM 往往更快,所以你可以在给定的时间内进行更多的训练和调优。但是我们在这里看不到。XGB 可能会更好地与 ASHA 早期停止互动。
  • 远视眼和眼的 RMSE 相似。Optuna 的速度始终更快(LGBM/cluster 可提高 35%)。

在几秒钟内,我们简单的 ElasticNet 基线产生的结果比 boosting 稍好。这可能是因为我们的特征工程是密集的,并且被设计成适合线性模型。未显示,SVR 和 KernelRidge 优于 ElasticNet,并且集合改进了所有单个算法。

完整的笔记本在 GitHub 上。

2.超参数调整概述

(如果你不是数据科学家忍者,这里有一些脉络。如果你是,你可以安全地跳到贝叶斯优化部分和下面的实现。)

任何足够先进的机器学习模型都与魔术难以区分,任何足够先进的机器学习模型都需要良好的调整。

后退一步,下面是一个典型的建模工作流程:

  • 探索性数据分析:理解你的数据。
  • 特征工程和特征选择:清理、转换和工程最佳可能的特征
  • 建模:模型选择和超参数调整以确定最佳的模型架构,以及集成以组合多个模型
  • 评估:描述样本外误差及其预期分布。

为了最小化样本外误差,您可以最小化来自偏差的误差,这意味着模型对数据中的信号不够敏感,以及方差,这意味着模型对特定于训练数据的信号过于敏感,不会泛化样本外。建模是 90%的数据准备,另一半是寻找最佳偏差-方差权衡。

超参数帮助您调整偏差-方差权衡。对于预测泰坦尼克号存活率的简单逻辑回归,正则化参数允许您通过惩罚对任何单个特征的敏感性来控制过度拟合。对于进行机器翻译的大规模神经网络,除了正则化之外,层、单元、激活函数的数量和类型都是超参数。我们使用 k 重交叉验证 选择最佳超参数;这就是我们所说的超参数调谐。

我们在这篇文章中使用的回归算法是 XGBoost 和 LightGBM,它们是梯度推进的变体。梯度推进是一种通常涉及决策树的集成方法。决策树构建规则,例如,如果乘客是头等舱的女性,他们可能在泰坦尼克号沉没后幸存下来。树是强大的,但是一个具有你所有特征的单一深度决策树将倾向于过度拟合训练数据。一种随机森林算法基于观察和特征的随机子集构建许多决策树,然后进行投票( bagging )。由弱学习者投票的结果比在所有数据行和所有特征列上训练以生成单个强学习者更少过度拟合,并且在样本外执行得更好。随机森林超参数包括树的数量、树的深度以及每棵树应该使用多少个特征和观测值。

bagging, boosting 使用许多串联的学习器,而不是聚集许多并行工作的独立学习器:

  • 从一个简单的估计开始,如中位数或基本利率。
  • 将树拟合到该预测中的误差
  • 如果你能预测误差,你就能为其调整并改善预测。调整预测不是一直到树预测,而是基于学习率(超参数)的一部分。
  • 将另一棵树拟合到更新预测中的误差,并基于学习率进一步调整预测。
  • 迭代地继续减少特定数量的增强回合的误差(另一个超参数)。
  • 最终估计值是初始预测加上所有预测的必要调整的总和(通过学习率加权)。

学习率执行与随机森林中的投票类似的功能,在某种意义上,没有单个决策树确定太多的最终估计。这种“群体智慧”的方法有助于防止过度拟合。

梯度推进是对传统结构化表格数据进行回归和分类的当前技术状态(与图像/视频/自然语言处理等结构化程度较低的数据相反,在这些数据中,深度学习、深度神经网络是当前技术状态)。

像 XGBoost 、 LightGBM 和 CatBoost 这样的梯度增强算法有非常大量的超参数,调整是使用它们的重要部分。

这些是超参数调谐的主要方法:

  • 网格搜索:给定每个超参数的有限组离散值,彻底交叉验证所有组合。
  • 随机搜索:给定每个超参数的离散或连续分布,从联合分布中随机抽样。一般来说比穷举网格搜索更有效。
  • 贝叶斯优化:类似随机搜索的采样,但是根据先前搜索的结果,更新你采样的搜索空间。
  • 基于梯度的优化:尝试估计交叉验证指标相对于超参数的梯度,并提升/降低梯度。
  • 进化优化:对搜索空间进行采样,丢弃度量差的组合,基于成功的组合遗传进化出新的组合。
  • 基于群体的训练:一种在训练的同时进行超参数优化的方法。

在这篇文章中,我们将重点讨论使用 Hyperopt 和 Optuna 的贝叶斯优化。

3.贝叶斯优化

什么是贝叶斯优化?当我们执行网格搜索时,搜索空间是一个先验:我们相信最好的超参数向量在这个搜索空间中。并且先验地也许每个超参数组合有相等的概率成为最佳组合(均匀分布)。所以我们把它们都试了一遍,然后选出最好的一个。

也许我们可以进行两次网格搜索。在一个宽的、粗略间隔的网格上进行初始搜索之后,我们在第一遍的最佳度量周围的更小区域中用更精细间隔的网格进行更深入的探索。在贝叶斯术语中,我们更新了我们之前的

贝叶斯优化从随机抽样开始,例如 30 个组合,并使用 k 倍交叉验证 为 30 个随机抽样的组合中的每一个计算交叉验证度量。然后,该算法更新它从中采样的分布,以便它更有可能对类似于好的度量的组合进行采样,而不太可能对类似于差的度量的组合进行采样。当它继续采样时,它会根据找到的指标继续更新采样的搜索分布。

作者图片

好的度量标准通常不是均匀分布的。如果在高斯分布或我们可以建模的任何分布中发现它们彼此接近,那么贝叶斯优化可以利用潜在的模式,并且可能比网格搜索或朴素随机搜索更有效。

HyperOpt 是由 James Bergstra 等人提出的贝叶斯优化算法,参见 Subir Mansukhani 的这篇优秀博文。

Optuna 是由 Takuya Akiba 等人提出的贝叶斯优化算法,参见这篇由 Crissman Loomis 撰写的优秀博文。

4.提前停止

如果在评估超参数组合时,评估度量在训练中没有改善,或者改善的速度不够快,不足以击败我们迄今为止的最好成绩,我们可以在对其进行完全训练之前丢弃该组合。尽早停止不成功的训练跑可以提高我们搜索的速度和效率。

XGBoost 和 LightGBM 有助于提供提前停止回调来检查训练进度并提前停止训练试验(XGBoost; LightGBM )。Hyperopt、Optuna 和 Ray 使用这些回调来快速停止糟糕的试验并提高性能。

在本帖中,我们将使用异步连续减半算法(ASHA) 进行提前停止,如博文中所述。

延伸阅读:

  • 超参数优化:算法与应用综述佟宇,朱红(2020)
  • 机器学习中的超参数搜索,Marc Claesen,Bart De Moor (2015)
  • 超参数优化,马蒂亚斯·福雷尔,弗兰克·哈特(2019)

5.实施细节

我们使用来自艾姆斯住宅数据集的数据。原始数据集有 79 个原始特征。我们将使用的数据有 100 个特征,其中相当数量的特征工程来自我自己在建模中的尝试,当我将它提交给 Kaggle 时,它位于前 5%左右。我们对销售价格的日志进行建模,并使用 RMSE 作为模型选择的度量标准。为了更容易理解,我们将 RMSE 转换回原始美元单位。

我们使用 4 种回归算法:

  • 线性回归:无超参数的基线
  • elastic net:L1 和 L2 正则化的线性回归(2 个超参数)。
  • XGBoost
  • LightGBM

我们使用 5 种方法:

  • 原生 CV :在 sklearn 中,如果一个算法 xxx 有超参数,那么它通常会有一个 xxxCV 版本,比如 ElasticNetCV,它使用指定的 kfolds 对超参数迭代器执行自动网格搜索。
  • GridSearchCV :抽象网格搜索,可以环绕任何 sklearn 算法,在指定的 kfolds 上运行多线程试验。
  • 手动顺序网格搜索:我们通常如何用 XGBoost 实现网格搜索,XGBoost 与 GridSearchCV 配合得不是很好,并且有太多的超参数需要一次调优。
  • 本地桌面上的光线调整:ASHA 提前停止的远视和 Optuna。
  • AWS 集群上的光线调节:额外扩展以在集群中的许多实例上运行单个超参数优化任务。

6.基线线性回归

  • 每次运行使用相同的 kfold,这样 RMSE 度量的变化就不是由于 kfold 的变化造成的。
  • 我们拟合了对数响应,因此为了便于解释,我们将误差转换回美元单位。
  • sklearn.model_selection.cross_val_score进行评估
  • 墙壁时间的魔法
  • n_jobs=-1使用所有可用的 CPU 内核并行运行折叠。
  • 注意墙壁时间< 1 second and RMSE of 18192.
  • Full notebooks are on GitHub 。
%%time

# always use same RANDOM_STATE k-folds for comparability between tests, reproducibility
RANDOMSTATE = 42
np.random.seed(RANDOMSTATE)

kfolds = KFold(n_splits=10, shuffle=True, random_state=RANDOMSTATE)

MEAN_RESPONSE=df[response].mean()
def cv_to_raw(cv_val, mean_response=MEAN_RESPONSE):
    """convert log1p rmse to underlying SalePrice error"""
    # MEAN_RESPONSE assumes folds have same mean response, which is true in expectation but not in each fold
    # we can also pass the mean response for each fold
    # but we're really just looking to consistently convert the log value to a more meaningful unit
    return np.expm1(mean_response+cv_val) - np.expm1(mean_response)

lr = LinearRegression()
# compute CV metric for each fold
scores = -cross_val_score(lr, df[predictors], df[response],
                          scoring="neg_root_mean_squared_error",
                          cv=kfolds,
                          n_jobs=-1)
raw_scores = [cv_to_raw(x) for x in scores]
print("Raw CV RMSE %.0f (STD %.0f)" % (np.mean(raw_scores), np.std(raw_scores)))

Raw CV RMSE 18192 (STD 1839)

Wall time: 65.4 ms

7.弹性电视

  • ElasticNet 是使用 L1 和 L2 正则化 (2 个超参数)的线性回归。
  • 当我们使用正则化时,我们需要缩放我们的数据,以便系数惩罚对各要素产生类似的影响。我们使用带有鲁棒定标器的流水线来定标。
  • 拟合模型并从拟合的模型中提取超参数。
  • 然后我们用报告的超参数做cross_val_score(似乎没有办法在不重新调整的情况下从拟合的模型中提取分数)
  • 详细输出报告 130 个任务,对于 10 倍的全网格搜索,我们预计 13x9x10=1170。显然是一个聪明的优化。
  • 请注意,与没有正则化的线性回归相比,RMSE 略有降低。
elasticnetcv = make_pipeline(RobustScaler(),
                             ElasticNetCV(max_iter=100000, 
                                          l1_ratio=[0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99],
                                          alphas=np.logspace(-4, -2, 9),
                                          cv=kfolds,
                                          n_jobs=-1,
                                          verbose=1,
                                         ))

#train and get hyperparams
elasticnetcv.fit(df[predictors], df[response])
l1_ratio = elasticnetcv._final_estimator.l1_ratio_
alpha = elasticnetcv._final_estimator.alpha_
print('l1_ratio', l1_ratio)
print('alpha', alpha)

# evaluate using kfolds on full dataset
# I don't see API to get CV error from elasticnetcv, so we use cross_val_score
elasticnet = ElasticNet(alpha=alpha,
                        l1_ratio=l1_ratio,
                        max_iter=10000)

scores = -cross_val_score(elasticnet, df[predictors], df[response],
                          scoring="neg_root_mean_squared_error",
                          cv=kfolds,
                          n_jobs=-1)
raw_scores = [cv_to_raw(x) for x in scores]
print()
print("Log1p CV RMSE %.04f (STD %.04f)" % (np.mean(scores), np.std(scores)))
print("Raw CV RMSE %.0f (STD %.0f)" % (np.mean(raw_scores), np.std(raw_scores)))l1_ratio 0.01
alpha 0.0031622776601683794

Log1p CV RMSE 0.1030 (STD 0.0109)
Raw CV RMSE 18061 (STD 2008)
CPU times: user 5.93 s, sys: 3.67 s, total: 9.6 s
Wall time: 1.61 s

8.GridSearchCV

  • 相同的结果,运行速度稍慢。
  • GridSearchCV 详细输出显示 1170 个作业,这是预期的 13x9x10 个作业。
gs = make_pipeline(RobustScaler(),
                   GridSearchCV(ElasticNet(max_iter=100000),
                                param_grid={'l1_ratio': [0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99],
                                            'alpha': np.logspace(-4, -2, 9),
                                           },
                                scoring='neg_root_mean_squared_error',
                                refit=True,
                                cv=kfolds,
                                n_jobs=-1,
                                verbose=1
                               ))

# do cv using kfolds on full dataset
gs.fit(df[predictors], df[response])
print('best params', gs._final_estimator.best_params_)
print('best score', -gs._final_estimator.best_score_)
l1_ratio = gs._final_estimator.best_params_['l1_ratio']
alpha = gs._final_estimator.best_params_['alpha']

# eval similarly to before
elasticnet = ElasticNet(alpha=alpha,
                        l1_ratio=l1_ratio,
                        max_iter=100000)
print(elasticnet)

scores = -cross_val_score(elasticnet, df[predictors], df[response],
                          scoring="neg_root_mean_squared_error",
                          cv=kfolds,
                          n_jobs=-1)
raw_scores = [cv_to_raw(x) for x in scores]
print()
print("Log1p CV RMSE %.06f (STD %.04f)" % (np.mean(scores), np.std(scores)))
print("Raw CV RMSE %.0f (STD %.0f)" % (np.mean(raw_scores), np.std(raw_scores)))best params {'alpha': 0.0031622776601683794, 'l1_ratio': 0.01}
best score 0.10247177583755482
ElasticNet(alpha=0.0031622776601683794, l1_ratio=0.01, max_iter=100000)

Log1p CV RMSE 0.103003 (STD 0.0109)
Raw CV RMSE 18061 (STD 2008)

Wall time: 5 s

9.使用顺序网格搜索的 XGBoost

应该可以使用 GridSearchCV 和 XGBoost。但是当我们也尝试使用早期停止时,XGBoost 需要一个 eval 集。好,我们可以给它一个从 GridSearchCV 得到的静态评估集。现在,GridSearchCV 在训练集中进行 k 重交叉验证,但 XGBoost 使用单独的专用评估集来提前停止。这有点像弗兰肯斯坦方法论。如果您真的感兴趣,请查看笔记本了解使用 XGBoost 和早期停止的 GridSearchCV 尝试。

相反,我们编写自己的网格搜索,为 XGBoost 提供每个 CV 折叠的正确保持集:

EARLY_STOPPING_ROUNDS=100  # stop if no improvement after 100 rounds

def my_cv(df, predictors, response, kfolds, regressor, verbose=False):
    """Roll our own CV 
    train each kfold with early stopping
    return average metric, sd over kfolds, average best round"""
    metrics = []
    best_iterations = []

    for train_fold, cv_fold in kfolds.split(df): 
        fold_X_train=df[predictors].values[train_fold]
        fold_y_train=df[response].values[train_fold]
        fold_X_test=df[predictors].values[cv_fold]
        fold_y_test=df[response].values[cv_fold]
        regressor.fit(fold_X_train, fold_y_train,
                      early_stopping_rounds=EARLY_STOPPING_ROUNDS,
                      eval_set=[(fold_X_test, fold_y_test)],
                      eval_metric='rmse',
                      verbose=verbose
                     )
        y_pred_test=regressor.predict(fold_X_test)
        metrics.append(np.sqrt(mean_squared_error(fold_y_test, y_pred_test)))
        best_iterations.append(regressor.best_iteration)
    return np.average(metrics), np.std(metrics), np.average(best_iterations)

XGBoost 有许多调优参数,因此穷举网格搜索的组合数量不合理。取而代之的是,我们使用网格搜索和提前停止来依次调优精简集。

这是调优 XGBoost 的典型网格搜索方法:

XGBoost 调优方法

  • 设置初始的一组启动参数。
  • 按顺序调整各组之间交互不太多的超参数,以减少测试的组合数量。
  • 先调好max_depth
  • 然后调subsamplecolsample_bytreecolsample_bylevel
  • 最后,调整learning rate:较低的学习率将需要更多的助推轮(n_estimators)。
  • 对每个超参数组合进行 10 重交叉验证。选择超参数以最小化 kfolds 上的平均 RMSE。
  • 如果 100 轮后没有改善,使用 XGboost 早期停止停止每一轮的训练。
  • 在调优和选择最佳超参数后,使用跨 xval kfolds 的平均增强回合,在完整数据集上重新训练和评估,而不提前停止。
  • 如前所述,我们使用 XGBoost sklearn API,并使用我们自己的网格搜索,它理解使用 k-folds 而不是 GridSearchCV 的早期停止。(另一种方法是使用原生 xgboost。理解早期停止但不使用 sklearn API 的 cv(使用 DMatrix,而不是 numpy 数组或 dataframe))
  • 我们编写一个助手函数cv_over_param_dict,它获取一个param_dict字典列表,对所有字典进行测试,并返回最佳的param_dict字典和一个结果数据帧。
  • 我们运行cv_over_param_dict 3 次,在 3 轮调优中进行 3 次网格搜索。
BOOST_ROUNDS=50000   # we use early stopping so make this arbitrarily high

def cv_over_param_dict(df, param_dict, predictors, response, kfolds, verbose=False):
    """given a list of dictionaries of xgb params
    run my_cv on params, store result in array
    return updated param_dict, results dataframe
    """
    start_time = datetime.now()
    print("%-20s %s" % ("Start Time", start_time))

    results = []

    for i, d in enumerate(param_dict):
        xgb = XGBRegressor(
            objective='reg:squarederror',
            n_estimators=BOOST_ROUNDS,
            random_state=RANDOMSTATE,    
            verbosity=1,
            n_jobs=-1,
            booster='gbtree',   
            **d
        )    

        metric_rmse, metric_std, best_iteration = my_cv(df, predictors, response, kfolds, xgb, verbose=False)    
        results.append([metric_rmse, metric_std, best_iteration, d])

        print("%s %3d result mean: %.6f std: %.6f, iter: %.2f" % (datetime.strftime(datetime.now(), "%T"), i, metric_rmse, metric_std, best_iteration))

    end_time = datetime.now()
    print("%-20s %s" % ("Start Time", start_time))
    print("%-20s %s" % ("End Time", end_time))
    print(str(timedelta(seconds=(end_time-start_time).seconds)))

    results_df = pd.DataFrame(results, columns=['rmse', 'std', 'best_iter', 'param_dict']).sort_values('rmse')
    display(results_df.head())

    best_params = results_df.iloc[0]['param_dict']
    return best_params, results_df

# initial hyperparams
current_params = {
    'max_depth': 5,
    'colsample_bytree': 0.5,
    'colsample_bylevel': 0.5,
    'subsample': 0.5,
    'learning_rate': 0.01,
}

##################################################
# round 1: tune depth
##################################################
max_depths = list(range(2,8))
grid_search_dicts = [{'max_depth': md} for md in max_depths]
# merge into full param dicts
full_search_dicts = [{**current_params, **d} for d in grid_search_dicts]

# cv and get best params
current_params, results_df = cv_over_param_dict(df, full_search_dicts, predictors, response, kfolds)

##################################################
# round 2: tune subsample, colsample_bytree, colsample_bylevel
##################################################
# subsamples = np.linspace(0.01, 1.0, 10)
# colsample_bytrees = np.linspace(0.1, 1.0, 10)
# colsample_bylevel = np.linspace(0.1, 1.0, 10)
# narrower search
subsamples = np.linspace(0.25, 0.75, 11)
colsample_bytrees = np.linspace(0.1, 0.3, 5)
colsample_bylevel = np.linspace(0.1, 0.3, 5)
# subsamples = np.linspace(0.4, 0.9, 11)
# colsample_bytrees = np.linspace(0.05, 0.25, 5)

grid_search_dicts = [dict(zip(['subsample', 'colsample_bytree', 'colsample_bylevel'], [a, b, c])) 
                     for a,b,c in product(subsamples, colsample_bytrees, colsample_bylevel)]
# merge into full param dicts
full_search_dicts = [{**current_params, **d} for d in grid_search_dicts]
# cv and get best params
current_params, results_df = cv_over_param_dict(df, full_search_dicts, predictors, response, kfolds)

# round 3: learning rate
learning_rates = np.logspace(-3, -1, 5)
grid_search_dicts = [{'learning_rate': lr} for lr in learning_rates]
# merge into full param dicts
full_search_dicts = [{**current_params, **d} for d in grid_search_dicts]

# cv and get best params
current_params, results_df = cv_over_param_dict(df, full_search_dicts, predictors, response, kfolds, verbose=False)

总训练持续时间(3 次迭代的时间总和)为 1:24:22。这个时间可能被低估了,因为这个搜索空间是基于以前的经验。

最后,我们使用最佳超参数进行改装,并评估:

xgb = XGBRegressor(
    objective='reg:squarederror',
    n_estimators=3438,
    random_state=RANDOMSTATE,    
    verbosity=1,
    n_jobs=-1,
    booster='gbtree',   
    **current_params
)    

print(xgb)

scores = -cross_val_score(xgb, df[predictors], df[response],
                          scoring="neg_root_mean_squared_error",
                          cv=kfolds,
                          n_jobs=-1)

raw_scores = [cv_to_raw(x) for x in scores]
print()
print("Log1p CV RMSE %.06f (STD %.04f)" % (np.mean(scores), np.std(scores)))
print("Raw CV RMSE %.0f (STD %.0f)" % (np.mean(raw_scores), np.std(raw_scores)))

结果基本上与线性回归匹配,但不如 ElasticNet 好。

Raw CV RMSE 18193 (STD 2461)

10.XGBoost 带有远视、Optuna 和光线

使用 Hyperopt 运行光线调整作业的步骤如下:

  1. 建立一个光线搜索空间作为配置字典。
  2. 将训练循环重构为一个函数,该函数将配置字典作为参数,并调用tune.report(rmse=rmse)来优化像 RMSE 这样的指标。
  3. config和一个指定采样次数的num_samples参数调用ray.tune

设置光线搜索空间:

xgb_tune_kwargs = {
    "n_estimators": tune.loguniform(100, 10000),
    "max_depth": tune.randint(0, 5),
    "subsample": tune.quniform(0.25, 0.75, 0.01),
    "colsample_bytree": tune.quniform(0.05, 0.5, 0.01),
    "colsample_bylevel": tune.quniform(0.05, 0.5, 0.01),    
    "learning_rate": tune.quniform(-3.0, -1.0, 0.5),  # powers of 10
}

xgb_tune_params = [k for k in xgb_tune_kwargs.keys() if k != 'wandb']
xgb_tune_params

设置培训功能。注意,一些搜索算法期望所有的超参数都是浮点数,并且一些搜索区间从 0 开始。所以我们根据需要转换参数。

def my_xgb(config):

    # fix these configs to match calling convention
    # search wants to pass in floats but xgb wants ints
    config['n_estimators'] = int(config['n_estimators'])   # pass float eg loguniform distribution, use int
    # hyperopt needs left to start at 0 but we want to start at 2    
    config['max_depth'] = int(config['max_depth']) + 2
    config['learning_rate'] = 10 ** config['learning_rate']

    xgb = XGBRegressor(
        objective='reg:squarederror',
        n_jobs=1,
        random_state=RANDOMSTATE,
        booster='gbtree',   
        scale_pos_weight=1, 
        **config,
    )
    scores = -cross_val_score(xgb, df[predictors], df[response],
                                      scoring="neg_root_mean_squared_error",
                                      cv=kfolds)
    rmse = np.mean(scores)
    tune.report(rmse=rmse)

    return {"rmse": rmse}

运行光线调节:

algo = HyperOptSearch(random_state_seed=RANDOMSTATE)
# ASHA
scheduler = AsyncHyperBandScheduler()

analysis = tune.run(my_xgb,
                    num_samples=NUM_SAMPLES,
                    config=xgb_tune_kwargs,                    
                    name="hyperopt_xgb",
                    metric="rmse",
                    mode="min",
                    search_alg=algo,
                    scheduler=scheduler,
                    verbose=1,
                   )

提取最佳超参数,并使用它们评估模型:

# results dataframe sorted by best metric
param_cols = ['config.' + k for k in xgb_tune_params]
analysis_results_df = analysis.results_df[['rmse', 'date', 'time_this_iter_s'] + param_cols].sort_values('rmse')

# extract top row
best_config = {z: analysis_results_df.iloc[0]['config.' + z] for z in xgb_tune_params}

xgb = XGBRegressor(
    objective='reg:squarederror',
    random_state=RANDOMSTATE,    
    verbosity=1,
    n_jobs=-1,
    **best_config
)
print(xgb)

scores = -cross_val_score(xgb, df[predictors], df[response],
                          scoring="neg_root_mean_squared_error",
                          cv=kfolds)

raw_scores = [cv_to_raw(x) for x in scores]
print()
print("Log1p CV RMSE %.06f (STD %.04f)" % (np.mean(scores), np.std(scores)))
print("Raw CV RMSE %.0f (STD %.0f)" % (np.mean(raw_scores), np.std(raw_scores)))

对于 NUM_SAMPLES=1024,我们得到:

Raw CV RMSE 18309 (STD 2428)

我们可以简单地将远视换成 Optuna:

algo = OptunaSearch()

对于 NUM_SAMPLES=1024,我们得到:

Raw CV RMSE 18325 (STD 2473)

11.配有远视和光学镜的 LightGBM

我们也可以很容易地用 LightGBM 替换 XGBoost。

  1. 使用 LightGBM 等价物更新搜索空间。
lgbm_tune_kwargs = {
       "n_estimators": tune.loguniform(100, 10000),
       "max_depth": tune.randint(0, 5),
       'num_leaves': tune.quniform(1, 10, 1.0),               # xgb max_leaves
       "bagging_fraction": tune.quniform(0.5, 0.8, 0.01),    # xgb subsample
       "feature_fraction": tune.quniform(0.05, 0.5, 0.01),   # xgb colsample_bytree
       "learning_rate": tune.quniform(-3.0, -1.0, 0.5),
   }
  1. 更新培训功能:
def my_lgbm(config):

    # fix these configs 
    config['n_estimators'] = int(config['n_estimators'])   # pass float eg loguniform distribution, use int
    config['num_leaves'] = int(2**config['num_leaves'])
    config['learning_rate'] = 10**config['learning_rate']

    lgbm = LGBMRegressor(objective='regression',
                         max_bin=200,
                         feature_fraction_seed=7,
                         min_data_in_leaf=2,
                         verbose=-1,
                         n_jobs=1,
                         # these are specified to suppress warnings
                         colsample_bytree=None,
                         min_child_samples=None,
                         subsample=None,
                         **config,
                         )

    scores = -cross_val_score(lgbm, df[predictors], df[response],
                              scoring="neg_root_mean_squared_error",
                              cv=kfolds)
    rmse=np.mean(scores)  
    tune.report(rmse=rmse)

    return {'rmse': np.mean(scores)}

和以前一样运行,用 my_lgbm 代替 my_xgb。LGBM 的结果:(样本数=1024):

Raw CV RMSE 18615 (STD 2356)

将远视换成 Optuna:

Raw CV RMSE 18614 (STD 2423)

12.光线簇上的 XGBoost

Ray 是一个分布式框架。我们可以使用具有一个头节点和许多工作节点的集群在许多实例上运行光线调整作业。

启动 Ray 非常简单。在头节点上,我们运行ray start。在每个 worker 节点上,我们使用 head 节点的地址运行ray start --address x.x.x.x。然后在 python 中我们调用ray.init()来连接头节点。其他一切都像以前一样进行,头节点使用集群中的所有实例运行试验,并将结果存储在 Redis 中。

更复杂的地方是指定所有 AWS 细节、实例类型、区域、子网等。

  • 集群在ray1.1.yaml中定义。(到目前为止,在这个笔记本中,我们一直使用当前的产品 ray 1.0,但是我很难让一个集群运行 ray 1.0,所以我切换到了 dev nightly。YMMV。)
  • boto3和 AWS CLI 配置的凭证用于产生实例,因此安装和配置 AWS CLI
  • 编辑ray1.1.yaml文件,至少包含您的 AWS 区域和可用性区域。Imageid 可能因地区而异,搜索当前深度学习 AMI (Ubuntu 18.04)。你可能不需要指定子网,我有一个问题,一个不可访问的子网,当我让雷默认子网,可能是错误的默认。
  • 为了获得这些变量,将最新的深度学习 AMI (Ubuntu 18.04)当前版本 35.0 启动到您最喜欢的地区/区域的一个小实例中
  • 测试它的工作情况
  • 请注意这 4 个变量:区域、可用性区域、子网、AMI imageid
  • 终止实例并使用您的区域、可用性区域、AMI imageid、可选子网编辑ray1.1.yaml
  • 建议您创建自己的映像,预安装所有更新和要求,并指定其 AMI imageid,而不是使用通用映像并在启动时安装所有内容。
  • 运行集群:ray up ray1.1.yaml
  • 使用指定的 AMI 创建 head 实例。
  • 安装 Ray 和相关需求,包括来自requirements.txt的 XGBoost
  • 从 GitHub 克隆 druce/iowa repo
  • 根据自动扩展参数启动工作节点(目前我们固定节点数量,因为我们没有对集群自动扩展所需的时间进行基准测试)
  • 集群启动后,您可以检查 AWS 控制台,并注意到启动了几个实例。
  • 检查ray monitor ray1.1.yaml是否有任何错误信息
  • 在带有端口转发的集群上运行 Jupyterray exec ray1.1.yaml --port-forward=8899 'jupyter notebook --port=8899'
  • 在启动时打印在控制台上的生成的 URL 上打开笔记本例如 http://localhost:8899/?token = 5f 46d 4355 AE 7174524 ba 71 f 30 ef 3 f 0633 a 20 b 19 a 204 b 93 b 4
  • 您可以使用ray attach /Users/drucev/projects/iowa/ray1.1.yaml在集群的头节点上运行终端
  • 您可以使用 IP 地址和生成的私有密钥ssh -o IdentitiesOnly=yes -i ~/.ssh/ray-autoscaler_1_us-east-1.pem ubuntu@54.161.200.54进行 ssh

  • ray dashboard ray1.1.yaml运行端口转发到 Ray dashboard,然后打开 http://localhost:8265/
  • 确保在 Jupyter 中选择默认内核,以便在正确的 conda 环境中运行所有安装
  • 确保使用启动消息中给出的 ray.init()命令。ray.init(address='localhost:6379', _redis_password='5241590000000000')
  • 该集群将产生 AWS 费用,因此ray down ray1.1.yaml完成后
  • 请参见hyperparameter _ optimization _ cluster . ipynb,它是独立的,因此每台笔记本电脑都可以在有/没有集群设置的情况下端到端运行
  • 参见光线文档了解更多关于光线簇的信息。

除了连接到集群而不是在本地运行 Ray Tune 之外,无需对代码进行任何其他更改即可在集群上运行

analysis = tune.run(my_xgb,
                    num_samples=NUM_SAMPLES,
                    config=xgb_tune_kwargs,                    
                    name="hyperopt_xgb",
                    metric="rmse",
                    mode="min",
                    search_alg=algo,
                    scheduler=scheduler,
                    # add this because distributed jobs occasionally error out
                    raise_on_failed_trial=False, # otherwise no reults df returned if any trial error           
                    verbose=1,
                   )

XGBM 在集群上的结果(2048 个样本,集群是 32 个 m5 .大型实例):

远视(时间 1:30:58)

Raw CV RMSE 18030 (STD 2356)

奥普图纳(时间 1 时 29 分 57 秒)

Raw CV RMSE 18028 (STD 2353)

13.光线簇上的 LightGBM

类似地,对于 LightGBM:

analysis = tune.run(my_lgbm,
                    num_samples=NUM_SAMPLES,
                    config = lgbm_tune_kwargs,
                    name="hyperopt_lgbm",
                    metric="rmse",
                    mode="min",
                    search_alg=algo,
                    scheduler=scheduler,
                    raise_on_failed_trial=False, # otherwise no reults df returned if any trial error                                                            
                    verbose=1,
                   )

集群上 LightGBM 的结果(2048 个样本,集群是 32 个 m5 .大型实例):

远视(时间:1:05:19):

Raw CV RMSE 18459 (STD 2511)

Optuna(时间 0:48:16):

Raw CV RMSE 18458 (STD 2511)

14.结束语

在我应用它们的每一个案例中,在我使用网格搜索方法找到的最佳指标中,Hyperopt 和 Optuna 至少给了我一个小的改进。与顺序调优相比,贝叶斯优化的手动过程更少,调优速度更快。这是火了就忘了。

射线调谐是超参数调谐的必由之路吗?暂时的,是的。Ray 提供了底层 ML ( 例如 XGBoost)、贝叶斯搜索(例如hyperpt)和早期停止(ASHA)之间的集成。它允许我们轻松地交换搜索算法。

在 Ray docs 中还有其他可供选择的搜索算法,但这些似乎是最流行的,我还没有让其他的运行。如果过了一段时间后,我发现我总是使用,例如 Hyperopt,而从不使用集群,我可能会使用没有 Ray 的本机 Hyperopt/XGBoost 集成,以访问任何本机 Hyperopt 功能,因为它是堆栈中的一项少技术。

集群?大多数时候,我没有必要,成本增加了,并没有看到预期的大幅度加速。我只在 32 个实例的集群上看到了大约 2 倍的加速。在设置测试时,我预计会有不到 4 倍的加速,这说明了线性扩展的不足。我试过的最长的一次运行,有 4096 个样本,在桌面上运行了一整夜。对于这个数据集,我的 MacBook Pro w/16 线程和 12 线程的台式机以及 GPU 已经足够强大了。尽管如此,在后面的口袋里有集群选项还是很有用的。在生产中,用部署,例如 Terraform,Kubernetes 可能比 Ray 原生 YAML 集群配置文件更标准,更易维护。如果你想大规模训练大数据,你需要真正了解并简化你的管道。

让我感到惊讶的是,ElasticNet,,即正则化线性回归,在这个数据集上的表现略好于 boosting。我大量设计了一些特性,使得线性方法工作得很好。使用 Lasso/ElasticNet 选择预测因子,我使用 log 和 Box-Cox 变换迫使预测因子遵循最小二乘假设。但是,boosting 仍然被认为是表格数据的黄金标准。

这可能会验证对机器学习的批评之一,即最强大的机器学习方法不一定总是收敛到最佳解决方案。如果您有一个线性加噪声的基本事实,一个复杂的 XGBoost 或神经网络算法应该任意接近封闭形式的最优解,但可能永远不会精确匹配最优解。XGBoost 回归是分段常数,复杂的神经网络易受随机梯度下降的影响。我以为任意接近意味着几乎无法区分。但显然情况并非总是如此。

具有 L1 + L2 正则化加上梯度下降和超参数优化的 ElasticNet 仍然是机器学习。它只是更好地匹配这个问题的 ML 的一种形式。在数据集与 OLS 假设不匹配的现实世界中,梯度推进通常表现得非常好。即使在这个数据集上,为线性模型的成功而设计的 SVR 和 KernelRidge 也比 ElasticNet(未显示)表现得更好,并且将 ElasticNet 与 XGBoost、LightGBM、SVR 集成,神经网络的效果最好。

套用 Casey Stengel 的话,聪明的特征工程总是胜过聪明的模型算法,反之亦然。但是提高你的超参数总是会提高你的结果。贝叶斯优化可以被认为是一种最佳实践。

同样,完整的代码在 GitHub 上

单独调整停止回合会更合理。仅仅平均 kfolds 的最佳停止时间是有问题的。在真实的场景中,我们应该保留一个维持测试集。我们应该在完整的训练数据集(而不是 kfolds)上重新训练,并尽早停止,以获得最佳的强化轮数。然后,我们应该使用所有交叉验证的参数在测试集中测量 RMSE,包括预期的 OOS RMSE 的助推轮数。然而,为了比较调谐方法,CV 误差是可以的。我们只是想看看如何使用 CV 进行模型决策,而不是太担心泛化错误。人们甚至可以说它给超参数选择的比较增加了一点噪声。但是在实践中,测试集将是正确的方法。这不会直接改变结论,我也不会重新做所有的事情,但是如果我要重新开始,我会那样做。

这是没有意义的。

超越朱庇特笔记本

原文:https://towardsdatascience.com/beyond-jupyter-notebook-9ff6be598313?source=collection_archive---------37-----------------------

作者照片

对于许多数据科学家来说,笔记本是他们学习编写代码的唯一方式。它设置快速,易于运行,我们不需要真正了解它的本质。

尽管 Jupyter Notebook 有众所周知的默认设置,但实际上没有更好的 Python 工具来进行探索性分析和快速测试。

尽管如此,当面临更多现实问题时,在更大的团队中协作或保持可再现性时,仅使用笔记本完成每项任务是非常有限的。

重点是,如果你的大部分工作都依赖于 Jupyter Notebook,那么你很可能缺少了一些东西。

从实验到生产

数据科学和制药行业有很大的相似性。

我们今天在市场上能找到的任何药物都是由一个或多个科学家发现、研究的。他们不得不尝试新的化学组合来找到对抗相应疾病的分子。第一步生活在他们的实验室里。

数据科学也是如此:你面对一个问题,在笔记本上尝试不同的解决方案,以找到正确的解决方案。

当药物解决方案通过实验室测试时,它在到达您的护理架之前就进入了一个完全不同的世界。为了进行大规模生产,制药公司需要在生产工厂、安全和所有必要的健全检查中投入大量资产。

回到我们的世界,我们可以将这些生产资产视为大胡子们:技术上更接近真正最终产品的数据工程师或软件工程师。他们不使用 Jupyter 笔记本电脑,因为它不是为这类东西而设计的,而且他们比你有更多的限制来使解决方案适应现实世界的应用和基础设施。

什么是生产?

我们将直接在这里,而将有一个简单的文章写这一点。

生产是一种开发状态,或者是一种到达真实世界的运行中的应用程序,它涉及到人们和他们的决策。因此,服务于这种环境的底层代码和基础设施必须处于完美的控制之下,以确保最终用户不会停机或出错。

最终用户可以是真实的客户,也可以是公司内部根据您的报告、仪表板或算法做出决策的人。事实上,也可能是你:想象一下你正在查询的一个数据库,如果它因为任何原因关闭了,你将无法工作。

为了满足这样一个环境的要求,代码必须以这样一种方式设计,当错误发生时,它必须易于发现和解决。任何人升级代码都应该没有太多麻烦——这样你就不是一个人在使用你的代码库,当你离开时,公司仍然可以使用你的产品。

要做到这一点,当您的代码是干净的,抛出好的消息错误,并在重要步骤通过时发出通知时,会更容易。遵守编码指南,通过合并请求进行代码审查,并且记住一些设计模式,在您处理生产职责时,这些通常是很好的事情。

当我们在笔记本上写字的时候,这些都是我们想不到的。我们通常按照自己的想法编写、测试、返回、重新测试等等……代码经常不干净,不处理异常,除了你没人会读它,等等……这是完全正常的,我们正在经历。

软件工程的转变

如果没有服务于业务或“可应用的”目标,大多数花哨的机器学习和实验部分就没有那么重要。

如今,我们用来构建强大模型的技术不需要博士学位:例如,几乎每个具有计算机科学背景的开发人员都可以使用 Scikit Learn。

另一方面也是一样的:你不需要成为一个 Linux 高手来理解无服务器应用程序、容器化以及基本的生产需求和资产。

当我们失去奖学金时,我们经常会看到数据堆栈分成三个不同的职位:数据工程师、数据科学家和数据分析师。

但是如果我们能把这些岗位的所有要求都聚集到一个岗位上呢?

这就是“全栈数据科学家”职位的由来。虽然这个词可能有点夸张,但事实上考虑这种可能性有很大的价值。

在这种职位上,你需要用到很多工具。你将不得不学习很多东西。但是随着数据科学现在变得更加成熟,我们可以找到一堆 blogposts、API 和高级框架来轻松地使我们的代码更接近生产和业务需求。

事实上,这个职位已经在那里了,你可能已经具备了这样做的技能:没有太多的团队拥有大数据堆栈,依赖于几个数据科学家、数据工程师和分析师。大多数工作的名称是“数据科学家”,但通常是需要许多不同技能和经验的角色。

大多数从事数据工作的人都有一些计算机科学背景。对于公司来说,允许人们扩展他们的技能比让一个不知道什么是服务器的人来填补 NLP 研究员的职位更有价值…

更接近生产的另一个工作流程

在生产环境中做事的教育严重缺乏。所以很多人会去上课,并对 NumPy/Pandas/Scikit-learn 感到非常舒服,但不知道如何在现实世界中使用它。

虽然数据科学家的工作不一定要达到生产和部署要求,但如果我们提前考虑我们的工作如何在实际解决方案中发挥作用和应用,可能会节省大量时间。

没有完美的补救措施,Jupyter 笔记本仍然是探索和开发您的功能的绝佳工具。但是正如我们之前所说的,你的笔记本——事实上也是如此——并不是终结。

下面是我个人的工作流程:它帮助我记住我的代码必须清晰、一致、可重复。

免责声明:这可能不适合你的工作方式,但我认为值得分享个人工作流程,看看其他人是如何做的。

  1. 总是从纸上开始

这可能是最重要的一步。如果你没有事先考虑就开始编码,你很可能会走进死胡同。一开始你会觉得失去了时间,但从长远来看,你是赢了。首先获得一个快速但适当的设计,然后开始编码。

2.用无状态的方式写代码

与其用 Jupyter Notebook 来执行我的代码块,我更喜欢用它的老兄弟: IPython 控制台。

这样,我的代码就不会被保存(尽管我可以运行% save magic 命令)。所以我必须保存它,顺便说一下,在适当的 Python 文件中重构它。

此外,它迫使我把我的代码看作一个整体,因此在模块中构建独立的功能。这种代码比 Jupyter 笔记本电池更强大,可以集成到现实世界的应用程序中,并适合更复杂的管道。

3.想想再现性。

在寻找工作解决方案的过程中,我总是问自己,我的同事如何能在他们的电脑上运行我的代码。如果你的同事能独立运行你的解决方案,他们就能更容易地进行实验并发现一些陷阱。这样,我的开发就不那么依赖于我的本地环境,而更接近于生产环境。

我的简单易行的解决方案是总是写一个带有构建和运行说明的自述文件。我倾向于使用 Docker 来避免安装过程中的麻烦(并且更接近生产环境),但是从一个简单的 requirements.txt 开始总比什么都没有好。

不仅对制作,对“未来的你”也很重要。当你写完代码几个月后回头看代码时,你会感谢自己写了文档并添加了很好的安装说明。这会节省你很多时间。

我目前的个人工作流程。

结论

那又怎样?为了一个完全集成的 IDE,我们必须忘记我们欢呼雀跃的笔记本,或者甚至只使用我们的终端工作吗?为了能够从非常原始的数据到用户前端应用程序进行工作,我们必须学习所有的工具吗?

这些问题可能没有直接的答案,一如既往,它将取决于你必须做什么。尽管如此,对其他可能性和工具的好奇会让你成为更好的工匠,并帮助你以不同的方式看待事物。

这不仅仅是你在笔记本上得到的直接结果,而是你在现实世界中设计和集成解决方案的方式,最终取得成功。

“业余爱好者更关注结果而不是过程。你变得越专业,就越不在乎结果——你仍然会得到结果,但那是因为你知道你可以依赖系统和过程。”瑞安假期。

感谢 伊斯阿多 的点评和评论!

熊猫之外:Spark、Dask、Vaex 和其他大数据技术正面交锋

原文:https://towardsdatascience.com/beyond-pandas-spark-dask-vaex-and-other-big-data-technologies-battling-head-to-head-a453a1f8cc13?source=collection_archive---------1-----------------------

十亿行数据集上的 API 和性能比较。你应该用什么?

彼得罗·马蒂亚在 Unsplash 上拍摄的照片

为什么

面对新的数据科学问题时,首先要问的问题之一是使用哪种技术。有炒作;有标准工具;有尖端的技术、完整的平台和现成的解决方案。

在过去的几年里,我一直在用我能得到的任何技术构建概念和解决方案的证明。如果有新平台,我注册试用;如果任何一个大的云平台发布了一个新的特性,我都会试用;当一项新技术出现时,你可以确信我会浏览一些教程,并在我的数据集上进行尝试。

从这个角度来看,我决定比较数据争论技术,为我的下一个项目选择最适合表格数据探索、清理和争论的技术。我也将此作为一个机会,重新接触我已经几年没有使用的技术,我认为随着时间的推移,这些技术已经变得越来越好。

TL;速度三角形定位法(dead reckoning)

Vaex 作为新的大数据技术正在崛起。但是,如果你已经在使用 PySpark 平台或者有 PySpark 天赋,这仍然是一个不错的选择。

什么

在下文中,我假设您对 Python API 和大数据能力有基本的了解。我选择的数据是出租车亿 行 100GB 数据集。目标是比较这些技术的 API、性能和易用性。我认为熊猫是具有最自然 API 的基线(我承认这是有争议的),因为它是目前最常见的解决方案,但不能处理大数据。

您有两种处理大数据集的传统方法/方式:更强的/分布式计算,其中您将内存与数据的大小相匹配;或者核外解决方案,其中数据仅在必要时才在内存中读取。

成本的差异是巨大的,所以我决定只考虑能在核外工作的解决方案。

竞争对手:

  • Dask DataFrame —用于分析的灵活并行计算库。
  • PySpark —基于 Spark 的大规模数据处理统一分析引擎。
  • 考拉 —阿帕奇 Spark 上的熊猫 API。
  • Vaex —一个用于懒惰的核外数据帧的 Python 库。
  • turi create——一个相对秘密的机器学习包,其数据帧结构——SF frame,符合条件。
  • 数据表——H2O无人驾驶. ai 的中坚力量。一个 dataframe 包,特别强调速度和对单个节点的大数据支持。

一些可敬的提及:

  • H2O —标准的内存数据帧非常全面。尽管如此,对于四倍于数据集大小的集群的建议,您需要雄厚的资金来使用它进行探索和开发。
  • cuDF(RapidAI)——GPU 数据帧包是一个令人兴奋的概念。对于大数据,你必须使用带有 Dask 的分布式 GPU 来匹配你的数据大小,非常适合无底的口袋。
  • Modin —一个无需改变 API 就能缩放熊猫的工具,它在后端使用 Dask 或 Ray 。遗憾的是,目前它只能读取一个拼花文件,而我已经有了一个分块的拼花数据集。由于可能会得到与 Dask DataFrame 类似的结果,此时将所有的 parquet 文件合并为一个文件似乎不值得追求。
  • 熊猫有一个分块的特征,但是在探索和动态互动方面,它和其他的熊猫不在一个级别。
  • Vaex 确实有一个 GPU 和 numba 支持用于繁重的计算,我没有进行基准测试。

怎么

我在 AWS Sagemaker 上使用了一个每小时 0.95 美元的 ml.c5d.4xlarge 实例,因此复制基准测试很容易。它有 16 个 vCPUs,32 GB 的 RAM 加上 500 个 SSD,这与固态笔记本电脑有着微妙的相似之处。

尽管所有竞争对手都可以读取 CSV 文件,但更优化的方法是使用最适合每种技术的二进制版本。对于 PySpark、考拉、Dask DataFrame,我用的是拼花,而对于 Vaex,我用的是 HDF5 。Turicreates 的帧有一个特殊的压缩二进制版本。Datatable 是针对 jay 格式优化的特例。虽然我无法使用 Datatable 读取 CSV 文件,但不管我的实例大小如何(即使 RAM 中的数据大小增加了一倍以上), Maarten Breddels 开辟了一条使用 HDF5 的道路。当 Datatable 可以可靠地读取多个 CSV、Arrow 或 Parquet 文件时,最好进行更新。

我想指出的是,这个基准测试的开发有点昂贵,因为技术在运行几个小时后会崩溃很多次,尽管只是按原样运行代码不会花掉你的钱。

结果

编码复杂性

仅仅目测一下 API 就能让你对每种技术的代码量和设计模式有所了解。

常用方法(图片由作者提供)

赢家 — Vaex、Dask DataFrame、Turicreate、考拉都有一个很像熊猫的代码(对考拉来说是一模一样的),想做什么都很容易。

失败者 — PySpark 和 Datatable,因为它们有自己的 API 设计,你必须学习和调整。这不是一个困难的任务,但如果你习惯于和熊猫一起工作,这是一个缺点。

特征

优胜者—py spark/考拉和 Dask DataFrame 提供了各种各样的特性和功能。注意,在使用 PySpark 的一些复杂情况下,您可能需要“map-reduce”知识来编写满足您需要的算法。使用 Dask DataFrame,您可能需要知道何时可以或不可以使用无需占用大量内存即可扩展的 sklearn 特性。

虽然 Vaex 和 Turicreate 有一些缺失的功能,但它们涵盖了大多数核心功能。

失败者 — Datatable 似乎有点不成熟,远远落后。

管道

通常,当构建机器学习和后端 API 的解决方案时(与可视化不同),您需要为您的流程编写一个管道。例如,当规范化一个列时,您需要记住平均值和标准偏差来规范化新的观察值。这里简单性、灵活性和编写更少的代码是必不可少的。对于许多数据科学应用程序,这可能是 80%的工作。

赢家 — Vaex。通过其表达式系统,对数据集的任何转换都保存在后台,以便您可以轻松地将其应用于新数据。这使得流水线作业不仅没有痛苦,而且实际上是一项非任务。

亚军是 Dask DataFrame,它有多种预处理工具。然而,您可能需要实现您的转换器,并考虑哪些 sklearn 转换器可以被有效地处理。

接下来是 PySpark。尽管构建管道是 PySpark 最擅长的事情之一,但您需要编写大量代码来实现这一点。阻碍 PySpark 的另一个原因是模型和管道的安装和部署远非易事。你几乎肯定需要(或者更喜欢)使用昂贵的平台,比如 Databricks 和 Domino ,或者严重依赖 Sagemaker 、 Dataproc 或 Azure 的基础设施。

失败者 —考拉、图里 create、数据表

Turicreate 和 Datatable 没有流水线特性可言。

虽然考拉有比 PySpark 更好的 API,但它对创建管道相当不友好。人们可以很容易地将考拉转换成 PySpark 数据帧,但对于流水线操作来说,这很繁琐,并且会带来各种挑战。

懒惰评估

惰性评估是一个仅在需要时运行计算的特性。例如,如果我有两列 A 和 B,那么创建一个新列 A*B 实际上只需要 0 秒钟,而且不占用内存。如果我想查看该列的前几个值,只计算这些值,而不是整个列。

惰性求值使得特性工程和探索的过程更快、更舒适,并防止您在内存中拥有其他大量的列。这在处理大数据集时尤其有价值,因为设计新列、连接表或过滤太大而不适合内存的数据很可能会使您的机器崩溃。

就性能而言,正如您在下一节中看到的,我创建了一个新列,然后计算了它的平均值。Dask DataFrame 比其他技术花费了 10-200 倍的时间,所以我猜这个特性没有得到很好的优化。

赢家 — Vaex、PySpark、考拉、Datatable、Turicreate。

失败者 — Dask DataFrame。

表演

“所有的基准都是错误的,但有些是有用的”——错误引用了乔治·博克斯的话

由于性能可能会有所不同,这篇博客给了我灵感,让我将每个基准测试运行两次。我认为第一次运行更适合批处理作业(更能反映磁盘读取速度),第二次运行更能代表您交互工作时的体验(该方法的实际速度)。

在以下所有图表中:

  • 第一轮用蓝色条表示,第二轮用橙色表示。
  • Turicreate 具有草图特性,可以同时计算一系列统计数据和估计值;比较好做统计分析。
  • 为了更简洁地显示名称,我使用了别名:“dt”代表 Datatable,“tc”代表 Turicreate,“spark”代表 PySpark,“dask”代表 Dask DataFrame。

基本统计

在这里,我测试了基础知识;平均值、标准偏差、数值计数、两列乘积的平均值,以及创建一个惰性列并计算其平均值。

越大越好(图片作者提供)

  • 瓦克斯领先。
  • 考拉得到的结果与 PySpark 相似,这是有道理的,因为它在后台使用 PySpark。
  • Dask DataFrame、Turicreate 和 Datatable 落后于同类产品。

繁重的计算

我对两列进行了均值和标准差分组,然后将其连接到原始数据集并计算行数,这样我就不必在内存中处理整个连接的数据集。我还运行了一个超级复杂的数学表达式来探索冗长的特征工程过程的影响。

越大越好(图片作者提供)

  • Vaex 在连接上做得很好,扭曲了图形。
  • Datatable 在连接方面做得非常好。这个结果可能与我用 HDF5 包装 Datatable 的方式有关。我没有包括所有的字符串列,这使得 dataframe 占用的空间要小得多。但对我们的黑马来说是第二名。
  • Dask DataFrame 和 Turicreate 再次远远落在后面。
  • 请注意,当我在新创建的列上运行连接时,除了 Vaex 之外的所有技术都崩溃了。在规划您的特征工程时,请将它考虑在内。

Vaex 稳操胜券,而 Dask DataFrame 和 Turicreate 则越来越落后。

过滤

在这里,我首先过滤数据,并重复上述操作。

不幸的是,考拉、Datatable 和 Turicreate 在这一点上崩溃了。

这些结果很好地表明了数据清理的性能。

越大越好(图片作者提供)

  • 似乎 Vaex 在大多数情况下都很流行,尤其是在第二轮。
  • Dask DataFrame 因为没有崩溃而获得了荣誉提名,但结果比 Vaex 和 PySpark 慢了大约 5-100 倍。

数字

下面你可以看到列表结果。

  • 结果以秒为单位。
  • 如果缺少一个结果,技术就会崩溃。
  • 小于一秒的值表示延迟评估。
  • 互动表。

越小越好(图片作者提供)

赢家—Vaex 明显胜出。

第二名是派斯帕克和考拉。

失败者 — Dask DataFrame,Turicreate,Datatable。

最后几点

  • 这段代码让您自己比较 API 和运行基准。所有数据集都可以以正确的二进制格式下载。
  • 我在 Dask DataFrame 上遇到了各种各样的问题,为了获得最佳性能,我竭尽全力重启内核,并在一些计算之前重新读取数据。虽然这很不愉快,但我尽了最大努力去获得最好的表现。如果你只是照原样运行笔记本,你可能要等几个小时,或者它可能会崩溃。
  • 正如所料,考拉和 PySpark 的结果非常相似,因为它们都在幕后使用 Spark。
  • 如前所述,我不能对没有保存在文件中的新创建的列进行测试,因为这会导致 Dask DataFrame 和 PySpark 崩溃。为了解决这个问题,我进一步计算了结果的平均值或计数,强制使用单一值。
  • 我没有使用任何字符串列,因为我们侵入了 Datatable,它不能处理字符串列。
  • 免责声明——我是 vaex.io 的一员,我个人知道 Turicreate 的创建者之一,Spark 的贡献者,但我试图尽可能不偏不倚,把它作为一个个人的、专业的项目来做。

结论

几年来我一直使用 Turicreate 作为我的首选包,因为它是开源的,在此之前是 PySpark,但我正在切换到 Vaex 。虽然还处于早期阶段,还有点原始,但是状态的表达式和转移允许我编写更少的代码,牺牲了我不常用的功能,而且速度非常快。

看到 PySpark 和考拉的表现,我很惊讶。尽管如此,设置它,在没有现成平台的情况下部署解决方案,管道问题,开发过程中无法解释的错误(和时髦的 PySpark APIs)对我来说太多了。

Dask DataFrame 是一个不幸的挑战。它崩溃了无数次,我历尽艰辛让它在性能上具有竞争力(查看笔记本)。

总而言之,PySpark 和 Dask DataFrame 是基准测试开发期间时间和金钱上最昂贵的。

后果

我很想知道 Datatable 在未来会如何发展。

不要指望 Turicreate 会有很大进展,因为他们目前正专注于深度学习开发。

如果您有任何问题或想法,欢迎在基准测试的 Github repo 中评论/发布。

如果我找到一个合理的方法来优化任何技术,我计划重新运行并更新基准,包括在使用不同实例时的字符串列基准。

可以在 Twitter 、 Linkedin 关注我。

更新

  • 01/06/20-在古汉的精彩评论后,我将 PySpark 惰性评估添加到基准中,并更新了所有图。除了第一个图中增加了 PySpark lazy 评估结果和最后一个表中数字的小幅变化之外,新图与原始版本没有区别。我还将 PySpark 添加到了懒惰的评估赢家中。
  • 16/06/20 — H2O 的数据帧没有 GPU 实现。我编辑了那个评论。

超越预测模型:酒店预订取消背后的因果故事

原文:https://towardsdatascience.com/beyond-predictive-models-the-causal-story-behind-hotel-booking-cancellations-d29e8558cbaf?source=collection_archive---------3-----------------------

使用 Python 中的 Microsoft DoWhy 了解酒店预订被取消的原因。

作者图片

为什么 Medium/Linkedin 或其他任何平台会向你推荐这个帖子?更重要的是,是什么激起了你的兴趣,让你点击了这篇文章?是有趣的标题还是旁边很酷的缩略图?也许你只是点击了一下,因为你个人了解我,作为一个好朋友,想通过增加这篇文章的影响范围来帮助我;-)

作为机器学习的一个流行用例,向你推荐这篇文章的平台必须有一些复杂的机器学习或基于深度学习的分类器在内部运行,其作用是预测你是否应该看到这篇文章。该预测模型将仅根据你点击该文章的概率最大化这一事实来形成其决定(因为大多数定向在线广告公司仅在用户点击其内容时付费)。所有这些预测都将使用潜在预测模型已被训练的某些特征的观测值来做出。

现在你已经点击了这篇文章,如果我改变它的标题或缩略图,你还会点击它吗?
我可以继续一个接一个地问这样发人深省的问题,很有可能连你自己都不知道真正的原因!想象在不同情况下可能是真实的场景,被称为反事实。广义地说,因果推理归结为估计反事实

自然,人们只能观察到事实(比如当文章的标题是给定标题时,你点击/不点击该文章)或反事实(比如当文章的标题不同时,你点击/不点击该文章)。就数据而言,这意味着你可以有一个对应于事实场景或反事实场景的数据点,但不能两者都有。正是因为这个事实,你永远不能要求那个预测模型解释它为什么会点击这篇文章的决定。

图 1:图片来源:朱迪亚·珀尔的《为什么之书》

上图描述了朱迪亚·珀尔教授在《为什么之书》中所说的因果阶梯。

大多数机器学习和复杂的深度学习模型位于这个阶梯的最底层,因为它们仅通过利用不同变量之间的关联或相关性来进行预测。然而,这并没有给我们提供一个回答“如果”的框架和“为什么”这些问题由该阶梯的第二和第三梯级描述,并且是 决策 的关键,如果这些模型将用于任何社会关键领域,例如:-

  • 如果我接种这种疫苗,我的新冠肺炎病会被治愈吗?如果我现在不注射疫苗。与我接种该疫苗的情况相比,它是否会增加我感染 COVID'19 的风险?
  • 金融:-Ex——如果股票 A 的价格大幅下跌,会不会导致股票 B 的价格也跟着下跌?如果股票 A 的价格没有下跌,股票 B 的价格会保持不变吗?
  • 治理: - 国内生产总值越高的国家,国民普遍越幸福吗?如果来年的国内生产总值急剧下降,会影响国民的幸福吗?
  • 教育:-一位教授改变了他对某一门课程的评分方案,这是否会影响你从这门课程中学到多少东西。如果他没有改变评分方案并继续使用之前的方案,他的学生们会学到更多吗?

案例分析:-酒店预订取消

我们考虑的问题是,与客户在取消预订时预订的房间相比,分配不同的房间会产生怎样的影响。

找出这一点的黄金标准是使用 R 和随机对照试验等实验,其中每位顾客被随机分配到两个类别中的一个,即每位顾客要么被分配到不同的房间,要么被分配到与他之前预订的房间相同的房间。但是,如果我们不能干预或者进行这样的实验成本太高怎么办呢(例如,如果人们知道酒店随机将人分配到不同的房间,酒店将开始失去声誉)。我们是否可以仅使用观察数据或过去收集的数据来回答我们的问题?

数据集的描述

该数据集包含来自葡萄牙一家真实酒店的城市酒店和度假酒店的预订信息,并且包括诸如预订时间、停留时间、成人、儿童和/或婴儿数量以及可用停车位数量等信息。所有个人身份信息都已从数据中删除。

要了解更多细节,读者可以参考由 Antonio 等人撰写的文章 酒店预订需求数据集 。al for Data in Brief,第 22 卷,2019 年 2 月,该数据最初来源于此。如果你赶时间,那么你可以快速浏览一下这里。

附:如果你有兴趣了解更多关于在这个数据集上建立预测模型以预测预订是否会被取消的信息,请看看我之前制作的这个笔记本。重点更多的是那个笔记本中的探索性数据分析建模* 。*

特征工程和预处理

让我们创建一些新的有意义的特征,以降低数据集的维度。创建了以下新功能

  • 总停留时间 = 周内停留时间 + 周内停留时间
  • 嘉宾 = 成人 + 儿童 + 婴儿
  • Different _ room _ assigned= 1 如果reserved _ room _ type&assigned _ room _ type不同,否则为 0。

计算预期计数

由于取消的数量和分配不同房间的次数严重不平衡,我们计算预期的数量。

因为预期的计数结果是大约 50%(即这两个变量随机达到相同值的概率)。所以从统计学上来说,我们现阶段没有确定的结论。

让我们看看当我们考虑到预订更改的不同值,重新计算预期数量时会发生什么。

**

当预订更改的数量不为零时,肯定会发生一些变化。所以这给了我们一个提示:预订变化肯定是一个混淆变量。

但是预订变化是唯一的混淆变量吗?如果存在一些未观察到的混杂因素,我们的数据集中没有关于这些混杂因素的信息(特征),那会怎么样。我们还能像以前一样提出同样的主张吗?

众所周知的白衣骑士道伊出场了**

DoWhy 将其注意力集中在因果推断所需的假设上,并提供估计方法(相对简单,因为它是一个统计过程),如匹配和 IV,以便用户可以更专注于识别假设,即明确使用*因果图模型的模型假设。*

输入:- 观察数据因果图,其中治疗变量、协变量(除结果和治疗外的所有变量)和结果已明确说明。

输出:- 期望变量之间的因果关系,“假设”分析(因果关系的阶梯的最高一级)。**

第 0 步。确定你的目标并阐明问题:

我们考虑这样一个问题,即估计分配一个与客户预订不同的房间对预订取消会有什么影响。找出答案的黄金标准是使用随机对照试验(或 A/B 测试)每位顾客要么被分配到不同的房间,要么被分配到他预订的同一房间。

随机对照试验( RCT )是影响评估的一种实验形式,在这种试验中,接受方案或政策干预的人群是从合格人群中随机选出的,对照组也是从同一批合格人群中随机选出的。~联合国儿童基金会

但就酒店的声誉而言,这可能不是最佳做法。例如,想象一个场景,一个 6 口之家到达酒店,但他们没有预订顶楼房间,而是被分配到一个只能容纳两个人的房间。因此,在现实世界中,随机实验经常被证明是不可行的、昂贵的或者完全不道德的。

形式上…

我们说处理导致结果如果改变处理导致结果的改变,保持其他一切不变。因果效应是指结果治疗中的单位变化所改变的幅度。

步骤 1:创建一个因果模型

使用假设将您对预测建模问题的先验知识表示为 CI 图。不要担心,在这个阶段您不需要指定完整的图。即使是部分图表也足够了,其余的可以通过 DoWhy 计算出来;-)因果模型,我认为已经绘制在图 2 中。

这里有一系列的假设,然后我把它们转化成一个因果图

  • **细分市场有两个层次,“TA”指的是“旅行社”,而“to”指的是“旅游经营者”,因此它应该会影响提前期(即预订和到达之间的天数)。
  • **国家在决定一个人是否提前预订(因此有更多的准备时间)和一个人更喜欢什么类型的时也会发挥作用。
  • **提前期肯定会影响等候名单的天数(如果预订晚了,找到预订的机会就小了)。此外,更长的交付周期也会导致取消。
  • 等候名单中的天数、总住宿客人的数量可能会影响预订是被取消还是保留。**
  • **以前的预订保留会影响客户是否是回头客。此外,这两个变量都会影响预订是否被取消(例如,过去保留了过去 5 次预订的客户也更有可能保留这次预订。类似地,已经取消该预订的人有更高的机会重复同样的预订)。
  • **预订变更会影响顾客是否被分配到不同的房间,这也可能导致取消。
  • 最后,预约变更的数量是影响治疗结果的唯一混杂因素,这种可能性极小,可能存在一些未观察到的混杂因素,我们在数据中没有捕捉到关于这些混杂因素的信息。

这里的处理是指分配客户在预订时预订的相同类型的房间。结果是预订是否被取消。常见原因代表我们认为对结果治疗都有因果影响的变量。根据我们的因果假设,满足此标准的 2 个变量是预订变更未观察到的混杂因素。因此,如果我们没有明确指定图形(不推荐!),也可以在下面提到的函数中提供这些参数。

**

图 2:根据一个简单的图形模型指定的因果假设。

根据你的直觉和假设,你也可以考虑一个更详细的因果图,如图 3 所示。

图 3:用更详细的图形模型来说明因果假设。

步骤 2:确定原因

如果改变处理导致结果的变化,保持其他一切不变,我们说处理导致结果

保持其他一切不变可以通过想象一个反事实的世界或者一个平行宇宙来实现,在这个世界里,在引入治疗之前,一切都是一样的。在真实的世界里,治疗是提供的,而在反真实的世界里,治疗是不提供的。因此,我们可能观察到的结果的任何变化都仅仅是由于治疗造成的。

因此,在这个步骤中,通过使用因果图的属性,我们识别要估计的因果效应。

步骤 3:估计已确定的原因

**因果效应是指处理单位变化导致结果变化的幅度。因为估算是一个统计过程,所以与其他步骤相比要简单得多。 DoWhy 提供了多种方法,可用于计算确定的因果估计值。

在我们的例子中使用的方法是倾向评分分层估计。人们可以把倾向分数看作是对待观察倾向的一种度量。它们将根据数据进行估计或建模,而不是观察。这些分数通过训练机器学习分类器来计算,例如逻辑回归随机森林,以便预测给定协变量的治疗变量(除结果、治疗之外的所有变量)。分层是一种识别配对亚群的技术,配对亚群的协变量分布是相似的(使用不同类型的标准测量相似性)。

对于这些方法和技术的恰当解释,读者可以参考这个教程,它是由 DoWhy 的创作者在 KDD 2018 上给出的。

第四步:反驳获得的结果

记住因果部分不是来自数据,而是来自你的假设(步骤 1),这些假设用于识别(步骤 2)和估计(步骤 3)原因。数据只是用于统计估计。

因此,如果可能的话,就要验证我们的假设,并以多种方式挑战它们的有效性。 DoWhy 提供了多重稳健性检查,可用于测试我们假设的有效性:-

  • 随机常见原因 :- 将随机抽取的协变量添加到数据中,并重新运行分析,以查看因果估计值是否改变。如果我们的假设最初是正确的,那么因果估计应该不会有太大的变化。

  • 安慰剂治疗反驳者 :- 随机分配任何协变量作为治疗并重新运行分析。如果我们的假设是正确的,那么这个新发现的估计应该是 0。

  • 数据子集反驳器 :- 创建数据子集(类似于交叉验证)并检查因果估计是否在子集间变化。如果我们的假设是正确的,应该不会有太大的变化。

通过使用多重稳健性检查,我们已经验证了我们的因果假设确实是正确的!

这告诉我们,平均而言,当一个人被分配到同一个房间时,与他被分配到与他在预订时选择的房间不同的房间相比,酒店预订被取消的概率降低了 ~36%

所以下一次,如果酒店员工陷入困境,不得不给顾客分配不同的房间,他们知道他们的行为会对取消预订产生多大的影响。

奖励提示:-

对观察数据进行因果推断的最佳实践

  1. 请务必遵循四个步骤,即。 建模、鉴别、估计、反驳
  2. 以简单为目标, 如果你的分析太复杂,最有可能是错的!
  3. 用不同的假设 至少尝试 2 种方法。如果两种方法一致,估计值的可信度更高。

非常感谢微软研究院的 Amit Sharma 博士创建了这个神奇的图书馆!

完整的 jupyter 笔记本和数据集现在是 github 上的 Microsoft Dowhy 知识库的一部分。

* [## 微软/道威

github.com](https://github.com/microsoft/dowhy/blob/master/docs/source/example_notebooks/DoWhy-The Causal Story Behind Hotel Booking Cancellations.ipynb)*

参考资料:-

  • 【为什么之书】 朱迪亚·珀尔教授。
  • “因果推理的要素”Bernhard schlkopf 教授。
  • Amit Sharma 博士在西北大学关于因果推理的轻松演讲。
  • 阿米特·夏尔马博士给 KDD 的 2018 年辅导课
  • https://github.com/microsoft/dowhy

超越人工智能炒作:你真正需要为你的创业想法考虑什么

原文:https://towardsdatascience.com/beyond-the-ai-hype-5f72914524af?source=collection_archive---------68-----------------------

在任何机器学习项目中弥合期望和现实之间的差距

埃里克·克鲁尔在 Unsplash 上的照片

我是一名自由职业的数据科学家,我的工作是咨询和帮助公司和企业家实现他们的机器学习目标。大多数时候,我不得不从一个想法开始(通常以 power-point 演示的形式),然后与客户一起工作,将其塑造成一个 MVP,并进一步成为一个产品级的解决方案。我的大多数客户来自商业背景,对机器学习知之甚少甚至一无所知,所以我确保在整个过程中,我耐心地沟通我在做什么,最重要的是,我为什么要用外行的术语来做这件事。我发现这个过程非常有益,很多时候,我的客户告诉我,在我们完成项目时,他们学到了很多关于机器学习的知识。

我的大多数客户来自商业背景,对机器学习知之甚少甚至一无所知,所以我确保在整个过程中,我耐心地沟通我在做什么,最重要的是,我为什么要用外行的术语来做这件事。

这些天围绕人工智能有很多讨论,毕竟它已经被设计成一个解决一堆问题的一站式解决方案商店。因此,对机器学习或深度学习(或 AI,这是目前更受欢迎的术语)抱有一定的期望是非常自然的。

注意:我在本文中交替使用深度学习和 AI(人工智能)这两个词。严格来说,它们是不一样的,但是在这篇文章的上下文中,如果我们假设它们是一样的,没有独角兽会死。

不幸的是,许多关于人工智能的期望伴随着大肆宣传而来,并隐藏了许多在开始人工智能/人工智能项目之前要做的实际考虑。因此,为了让未来的企业家免受一些痛苦,我决定汇编一份关于人工智能项目的最常见误解的列表,以及在开始这样的练习之前你应该真正考虑的事情!

因此,为了让未来的企业家免受一些痛苦,我决定汇编一份关于人工智能项目的最常见误解的列表,以及在开始这样的练习之前你应该真正考虑的事情!

  1. 人工智能并不总是更好,做一个成本效益分析:人工智能被认为是一种神奇的成分,当加入任何产品时,都会使它变得更好。从某种意义上说,这的确很神奇,因为大多数人工智能/深度学习实际上是一个黑匣子,即使对数据科学家来说也是如此!但是,想当然地认为人工智能可以解决我们所有的问题几乎就像祈祷中彩票一样。你很可能会赢,但也有同样的可能性(从统计数据来看,更高的可能性)你可能会输!将机器学习引入现有项目会带来很多额外的复杂性和成本。因此,在你决定迈出这一步之前,成本效益分析是必不可少的。也许你所需要的可以通过数据库或简单的回归技术来实现。不要低估这一点,因为这将使你在以后的阶段免于旋转。我同意“由人工智能驱动”的口号确实带来了风险投资的绿色,但有时,从长远来看,这是不值得的!
  2. 我们应该停止说“机器学习是过去,深度学习是我们需要的!”似乎甚至在世界可以接受机器学习之前,我们就有了下一个最好的东西,闪亮的新“深度学习”。虽然行业对经典机器学习的采用似乎很慢,但行业非常欢迎深度学习。这部分是因为时机,我认为深度学习是在行业最终为机器学习做好准备的时候到来的。而 party 因为深度学习确实是,牛逼!但我想给大家一点警示。经典的机器学习方法已经存在了很长时间,并且经过了时间的考验。不像 深度学习在很大程度上仍然是一个黑盒 ,经典方法不太复杂,更容易解释和推理,并且适用于大量用例。
  3. 跟上研究的步伐:如果我说深度学习是新的,因为它已经存在很长时间了,这不会是历史上准确的,只是说 摩尔定律 意味着我们直到现在才能很好地测试它,因为硅芯片可以以便宜的价格(更快、更便宜的 GPU)封装大量的晶体管。这种硬件发展导致深度学习在从计算机视觉到自然语言处理(NLP)的几乎每个研究领域都得到了快速采用。这种采用率的上升反过来导致改进以令人印象深刻的速度产生。一篇里程碑式的研究论文很少会在另一个研究团队声称用更好的东西击败它之前在任何基准上停留很长时间。这篇来自伟大的 Yoshua Bengio 的深思熟虑的文章反映了当前的步伐是否健康。但这对行业或你的想法意味着什么?嗯,你必须跟上这种惊人的速度,否则你可能会在几个月甚至几周内变得过时!深度学习项目需要对研究工作进行大量投资,而这一点往往被低估。
  4. 时间装箱 ML 项目——“我有一个想法和一堆数据。你能在一个月内交付一个工作模型吗?”这种思路自然地从传统的软件开发项目中溢出。与传统的软件开发不同,机器学习项目很难精确地设定时间,因为所涉及的步骤并不完全确定。你永远不知道在得到足够好的结果之前,你要训练多少个模型,或者你要训练单个模型的多少次迭代。只有当你真正开始解决问题时,任何现实的时间估计才是可能的。在你对数据有了初步的感觉之后,你可以进行有根据的猜测,但是如果期望一个 ML 顾问甚至在看到数据之前就给你时间估计,他/她很有可能会超越。这不是咨询师的错,相信我! 墨菲定律 总是在发挥作用,尤其是在数据科学项目中!
  5. 时间拳击 ML 项目 2 —“我有一个想法和一堆数据,我需要 99%的准确率。一个月内能发货吗?”就像时间表一样,在开始之前很难同意一个准确的数字。有时,预期的准确性是不可能的,因为许多因素,如带有坏标签的噪声数据,标记的数据量较少,或者有时可能数据没有足够的有用特征(信号)。同样,这些事情在项目开始前并不总是显而易见的。这就是为什么我总是强调每个项目都有一个初始的 【探索性数据分析】 阶段。重点是,预先有准确的期望只会带来麻烦和痛苦。相反,我建议现实地接近当前可实现的目标,然后找出一种迭代地变得更好的方法(更多的数据,不同的方法等)。)
  6. 多少数据才算足够的数据?对深度学习项目最常见的误解之一是,要达到一个好的结果,需要大量的标记数据。经常有人问我“100 张图片足够好吗?1000 呢?”答案是,对于大多数解决方案来说,上限要么根本不存在,要么太高了,吓不倒你!这并不意味着你抛弃了这个想法。存在类似于 迁移学习少量学习 的方法,以在大量训练数据最初不可用的情况下开始。而且,随着时间的推移,你可以收集更多的数据,使用 半监督学习/puse do-labeling方法变得更好。但一般来说,深度学习解决方案总是会在更多数据的情况下表现得更好!
  7. 从 MVP 到生产解决方案的道路并不总是一帆风顺:一个成功的 MVP 可能不容易转化为具有类似精度/性能的生产解决方案。在这一转变中有许多因素在起作用,因为在现实生活中会出现许多边缘情况和因素,当您处于 MVP 或开发阶段时,这些情况和因素是难以预料的。这就是为什么就像传统软件一样,即使在成功的 MVP 之后,你也必须修复错误,有时还要从头开始。在这个阶段我见过的最可怕的事情之一就是 数据漂移概念漂移 。如果你的模型在生产中一开始不太好,不要失去希望,它只是需要更多的哄骗!
  8. 预算:你包括培训时间/ GPU 成本吗?对于许多第一次创业的人来说,训练深度学习模型的训练时间和成本是一个潜在的惊喜。你在新闻中听到的大多数令人惊叹的“人工智能”模型,如【AlphaGO】需要周(alpha go 为 6-8 周)的训练时间!为了增加惊喜因素,培训在多 GPU 设置上进行,在云上拥有或租用这些设置非常昂贵。例如,像 NVIDIA Tesla V100 这样的单个 GPU 在云上的平均成本为$ 2.5/小时。 在单个 GPU 设置上进行单个实验的成本保守估计约为 2 天的训练时间,大约为 120 美元。久而久之,除非你小心谨慎,否则这只会形成一个过高的 AWSGCP 账单。大多数公司使用内部 GPU 和云 GPU 的组合来进行实验和扩展。如果你是一家初创公司,利用 AWS 提供的云积分激活 Google Cloud for Startups程序。我曾经与一家初创公司合作,该公司从微软获得了 30 万美元的云信用额度!****
  9. AutoML:不用雇佣 ML 顾问就能原型化你的想法!对,你没听错!现在有许多 SaaS 的人工智能/人工智能解决方案,它们在评估概念验证方面非常有帮助,甚至不需要雇佣人工智能顾问。你不需要任何技术知识
    (好吧,你需要一些基础知识,可能相当于逛 2-3 个小时)你需要一张信用卡。我最喜欢的是 谷歌云视觉 ,因为我主要从事计算机视觉方面的工作。这项服务可以让你上传数据,在平台上标记数据,并通过点击几个按钮来训练图像分类或物体检测等模型。我计划单独写一篇博客,让商业分析师和企业家在单独的帖子中开始使用这样的服务,敬请关注!

结束了

我目前只有这些了。如果你觉得我错过了什么,一定要让我知道,我很乐意收到你的来信!我们生活在一个激动人心的时代,机器学习为许多应用提供了动力,使我们的生活更加舒适和高效。如果你正在构思,我祝你一切顺利!

一如既往的感谢阅读!

超越 jupyter 笔记本:如何构建数据科学产品

原文:https://towardsdatascience.com/beyond-the-jupyter-notebook-how-to-build-data-science-products-50d942fc25d8?source=collection_archive---------31-----------------------

苹果 | 谷歌 | SPOTIFY | 其他

Emmanuel Ameisen 在 TDS 播客

背景图片由咪咪 Thian

编者按:迈向数据科学播客的“攀登数据科学阶梯”系列由 Jeremie Harris 主持。Jeremie 帮助运营一家名为sharpes minds的数据科学导师初创公司。你可以听下面的播客:

数据科学不仅仅是 jupyter 笔记本,因为数据科学问题不仅仅是机器学习。

我应该收集哪些数据?我的模型需要有多好才能“好到足以”解决我的问题?我的项目应该采取什么形式才是有用的?它应该是一个仪表板,一个实时应用程序,还是其他什么东西?我如何部署它?我如何确保在生产中部署它时不会发生可怕和意想不到的事情?

这些问题都不能通过输入sklearnpandas并在 jupyter 笔记本上破解来回答。数据科学问题需要商业头脑和软件工程知识的独特结合,这就是为什么 Emmanuel Ameisen 写了一本名为 构建机器学习驱动的应用程序:从想法到产品 的书。Emmanuel 是 Stripe 的机器学习工程师,之前担任 Insight Data Science 的人工智能主管,负责监督数十种机器学习产品的开发。

我们的谈话集中在大多数在线数据科学教育中缺失的环节:商业本能、数据探索、模型评估和部署。以下是我最喜欢的一些外卖食品:

  • 数据探索是数据科学生命周期中至关重要的一步,但它的价值很难量化。如果有人因为找不到任何见解,或者因为他们不具备足够的工作技能而未能在数据集中找到有趣的见解,您如何知道呢?公司倾向于根据易于衡量的工作表现方面来评估员工,这种偏见意味着数据探索往往被置于次要地位。解决这个问题的一个好办法是,公司或团队明确地为开放式探索任务留出时间,这样数据科学家就不会在需要的时候回避做这些工作。
  • 新数据科学家和机器学习工程师经常低估的生产化的一个方面是模型健壮性的重要性。如果有人试图从你的模型中产生一个社会不接受的输出,会发生什么?如果你的模型遇到一个它不能高置信度预测的输入怎么办?有时,添加一层规则来防止模型在提供不可靠或有问题的用户输入时产生输出可能是至关重要的。
  • 许多人错误地以“自顶向下”的方式考虑模型优化。如果他们的第一个模型不工作,他们决定使用另一个(通常更复杂)模型,而不是调查他们的模型正在犯的错误,并试图设计可能有助于解决这些错误的功能或设计启发。这是一个问题,因为大多数数据科学问题只能通过仔细检查错误模型的决策面来解决,而提升模型复杂性而不是在更简单的模型上求助于功能工程往往会使这项任务变得更难而不是更容易。

你也可以在这里的 Twitter 上关注 Emmanuel 以了解他的工作,我在这里。

超越数据科学的最后一英里

原文:https://towardsdatascience.com/beyond-the-last-mile-in-data-science-287a59ecac2f?source=collection_archive---------21-----------------------

如何衡量你的项目的影响?

Jean-Pierre Brungs 在 Unsplash 上拍摄的照片

几周前,在一次团队会议上,我不禁注意到一些人非常关注项目开发和部署的细节。当他们描述他们正在做什么的时候,他们总是不能解释这个项目如何适应组织的需求。

当我询问他们中的一个人时,他们对项目开发完成后将如何使用只有一个模糊的概念。

这对我来说是一个巨大的危险信号——之后我直接和团队领导谈了这件事。我的担心远远超出了缺乏背景。如果他们不理解工具的用途,我们如何知道它是否成功,我们如何衡量其影响?

数据科学中的“最后一英里”问题一直备受关注。最后一英里问题与在生产环境中启动数据科学项目的难度有关,或者与从项目中实际获得有价值的见解的难度有关。这是软件开发中“最后一英里”项目的遗留物,在许多行业中相当普遍。

实施和结论很重要,更加关注项目管理和规划对组织很重要,尤其是那些数据科学项目不是其主要产品的组织(在许多情况下,数据科学是一种支持功能)。

然而,在最后一英里之后,还需要做一些工作,以了解项目是否产生了预期的影响。这项工作的规划需要从数据科学项目概念化的一开始就开始。

为什么评价?

这个重要的步骤,我发现在许多组织中被忽视了,就是项目评估。在某些圈子里,这被称为审计,或计算投资回报。但是,由于来自社会科学,并且因为许多数据科学项目用例涉及人类行为,所以我将重点关注评估实践。

好吧,但是你说的评估是什么意思…

评估领域非常复杂。一些专业人士喜欢被认为是魔术师,向你推销他们的魔术,并在没有人的时候得出结论,这需要你的信仰。其他的实践者关注更具包容性的演进方法,通过积极地参与评估来帮助整个组织(或者至少是那些最直接参与的组织)更好地理解他们的项目。

评估方法的核心是项目管理和测量、科学方法和组织科学的混合。一个好的评估者对本体论(我们如何知道存在什么)和认识论(我们如何学习真理,或知识理论)有深刻的理解和关注——这是允许他们设计导致有效结论的研究的方法。

评估的类型

评价有多种类型和多种目的。在考虑您的项目和组织的需求时,记住这一点很重要。例如,如果您想确保您的机器学习程序在生产中按设计运行,您可以进行责任和合规性评估。这要求评估者将当前状态与计划状态、规则、法律以及其他限制和要求进行比较。

然而,对于有关数据科学项目影响的问题,有两种类型的评估需要关注:实施评估(形成性)和优点和价值评估(总结性)。

形成性评价——实施

几乎所有数据科学项目部署都需要实施评估。您需要衡量与推广计划相比,项目的实施情况如何。很多时候团队认为“部署”是成功的。

例如,我让我的一个团队一直吹嘘他们已经推出了一个复杂的仪表板,这是一个开发了一年多的项目。但当我向他们提出一个简单的后续问题时:“谁在使用它?意向用户是否按预期与之互动?”,他们没有答案。

这是因为他们在开发和项目管理周期中衡量项目的成功。评估一个项目的实施对于理解你是否成功地实现了你的期望是必要的。

很多时候,您已经在部署中完成了部分工作,尤其是技术部分,但是正式的实施评估可以确保您计划提出正确的问题并收集正确的数据,以了解您的部署是否成功。当你遇到问题时,很容易进行路线修正,因为你已经知道正确的输出应该是什么。

总结性评估——影响

我确信我的一些团队成员讨厌我开会,因为我总是问一些尖锐的问题。举个例子,如果你告诉我你的仪表盘已经部署好了,95%的目标受众都在与之交互,我还是不会满意。

为什么?因为我想知道成功的实施是否会产生预期的结果。

我经常看到数据科学团队将项目的部署和实施误认为是成功。但是在大多数组织中,这些项目只是获得对组织重要的东西的工具。

我们没有仪表板,因为我们喜欢仪表板(…对吗?).我们有仪表板,因为它们让领导能够更好地了解生产率和质量。

“好极了,我们的首席管理人员可以看到这一点,他们看起来很高兴。”

等等!这仍然只是一个输出,而不是目标。我们需要这些见解和信息来提高效率和减少浪费。我们是否将这些作为评估计划的一部分来衡量和跟踪?如果没有,我们不知道我们的仪表板是否有任何影响。

现在有些人(尤其是数据科学团队)会认为这不公平。

“我们无法控制一切,我们无法让领导关注仪表盘,根据显示的信息做出决策,或者针对其他因素进行控制!”

没错,但是如果一个组织如此关心这些结果以至于他们投资于这个项目,那么必须有一个计划来实现这些结果,并且有一个评估计划来测量结果。

否则,我们只是创建一个漂亮的仪表板,为您的组织提供一些可视化和数据分析体验,但如果只是这样,最终是浪费组织的时间和金钱。

好吧,我相信。我该怎么做?

规划评估并不那么困难。它从你还在设计项目的时候就开始了。简而言之,任何好的项目都应该遵循因果链,从您希望实现的目标或结果开始,反向工作以理论化数据科学项目将如何帮助您实现这些目标。

想降低成本?你的仪表盘是怎么做到的呢?

“它为关键的组织角色提供了实时数据和见解,然后这些角色可以做出正确的决策来降低成本。”

注意,这里隐含着一个变化理论。首先,假设关键人员目前没有及时获得所需的信息。第二,要求他们理解信息,并利用信息做出正确的决策,从而降低成本。

几乎每一个数据科学项目,我都参与了必要的因果联系,以获得超出数据科学项目本身的结果。

这些联系为你提出问题,为你的评估收集数据。最终,如果您基于项目来度量产出的变化,那么您可以相对确定成功的实现。

然后,当你衡量你的成果和影响时,你可以更加确定这些变化是由于项目的实施而不是其他因素。

评估计划的计划

除了有一种方法来衡量和了解您的数据科学项目的实际影响之外,在整个设计和开发过程中牢记评估计划也有利于项目。这是因为它迫使团队考虑组织的更大目标,并明确地计划和考虑如何度量他们的项目将如何帮助实现这些目标。

它迫使你跳出日常的开发周期,把你的项目框在一个更大的画面中。它还让您能够对数据科学项目、其部署以及开展项目并使其发挥作用所需的其他组织变化进行故障排除。

Tensorflow 2 中的高级 CNN 完全指南

原文:https://towardsdatascience.com/beyond-the-standard-cnn-in-tensorflow-2-a7562d25ca2d?source=collection_archive---------29-----------------------

使用复杂的架构生成更深层次的模型,并了解不同的层应该使模型更好。

马库斯·斯皮斯克在 Unsplash 上的照片

我构建的第一个 ConvNet 模型是为了识别狗或猫,它具有一个序列模型的基本结构,该模型具有 Conv2d 层,以及这里和那里的批处理规范化和最大池层的混合,并且不要忘记一个丢弃层以对抗过度拟合😏。所有这一切之后是平坦层,最终导致致密层。使用 add 将它们添加到模型中。它工作得很好,给出了足够好的精度。然后我尝试了著名的 MNIST 数据集,并使用了相同的架构。我所要做的就是将我的密集层中的损失从二元交叉熵改变为分类交叉熵,tada 我觉得我已经掌握了 CNN。但是,孩子,我错了!还有更多的东西,比如用不同类型的 Conv2d 层构建稀疏连接的架构,应用不同的过拟合技术等等。

目录

  1. 高级 Conv2D 图层
  • 深度可分卷积
  • 扩张的回旋

2.计数器过拟合

  • 空间缺失
  • 高斯漏失
  • 活动正规化

3.复杂架构

  • 稀疏连接的架构
  • 跳过连接

4.结论

高级 Conv2D 层

深度可分卷积

它们效率更高,需要更少的内存和更少的计算,在某些情况下甚至可以提供更好的结果。由于这些特征,当我们的模型必须部署在边缘/物联网设备上时,通常使用它们,因为它们的 CPU 和 RAM 有限。它将正常卷积层的过程分为两个过程,即深度方向卷积和点方向卷积。在深度方向卷积中,内核一次迭代一个通道。逐点卷积使用 1x1 内核来增加通道数量。这样就减少了所需的乘法总数,从而使我们的网络速度更快。这是一篇很棒的文章来了解更多。

tensorflow.keras.layers.SeparableConv2D(32, (3, 3), padding="same"))

扩张的回旋

可以在正常卷积层以及深度方向可分离的卷积层中实现扩展卷积。这是一个带有间隙的正常卷积运算。除了提供更大的感受域、高效的计算和更少的内存消耗,它还保持了数据的分辨率和顺序。因此,它通常会提高模型的性能。

图片取自这里。

#In Normal Conv2D
tf.keras.layers.Conv2D(32, (3, 3), padding='same', dilation_rate=(2, 2))#In Seperable Conv2D
tf.keras.layers.SeparableConv2D(no_of_filters, (3, 3), padding='same', dilation_rate=(2, 2))

反过度拟合

空间缺失

在正常退出中,一些随机选择的神经元在训练期间被忽略。这些神经元在前向传递中没有贡献,并且它们的权重在后向传递中没有更新。这导致网络学习多个独立的内部表示,并使其不太可能过度适应训练数据。在空间删除中,我们没有删除神经元,而是删除了整个特征图。如空间文档的 Keras 文档所述:

如果特征图中的相邻像素是强相关的(在早期卷积层中通常是这种情况),那么常规的丢弃不会使激活正则化,否则只会导致有效学习率的降低。在这种情况下,空间下降将有助于提高要素地图之间的独立性,因此应改为使用空间下降。

tf.keras.layers.SpatialDropout2D(0.5)

高斯漏失

它是压差和高斯噪声的组合。这意味着这一层连同丢弃的一些神经元也应用了以 1 为中心的乘法高斯噪声。和正常退学者一样,它也采用论证率。来自其文档:

Float,drop 概率(和 dropout 一样)。乘法噪声将具有标准差 sqrt(rate / (1 — rate))。

关于它的更深入的阅读,你可以参考这篇文章这里。

tf.keras.layers.GaussianDropout(0.5)

活动正规化

正则化会对网络进行细微的更改,以便更好地进行概化。它鼓励神经网络学习稀疏特征或原始观察值的内部表示,这使得模型在看不见的数据上表现得更好。支持三种类型的正则化技术:

  • l1 :活动计算为绝对值之和。
  • l2 :活动计算为平方值的总和。
  • l1_l2 :活动被计算为绝对值之和以及平方值之和。

L1 和 L2 正则化公式。λ是正则化参数。图片取自这里。

由于正则化项的增加,权重矩阵的值降低,并且导致减少过拟合的更简单的模型。有关正则化技术的更多信息,请参考此处的。

#L1 regularization
tf.keras.layers.ActivityRegularization(l1=0.001)#L2 regularizaton
tf.keras.layers.ActivityRegularization(l2=0.001)#L1_L2 regularization
tf.keras.layers.ActivityRegularization(l1=0.001, l2=0.001)

复杂架构

稀疏连接的架构

有两种类型的架构,密集连接和稀疏连接。

它因 Inception 网络而流行起来。那么对这些类型的架构有什么需求呢?难道我们不能继续增加层次,网络越深,结果越好吗?一点也不。模型越大,就越容易过度拟合 ,尤其是对于较小的数据集,这也增加了训练模型所需的计算能力有时甚至训练误差甚至变得更严重。稀疏连接的架构有助于我们增加模型的深度和宽度,同时不会超出所需的计算能力。它们可以具有不同大小的卷积核,这在测试对象大小不同时也有助于建模。

一般我们用tf.keras.layers.add做密集连接的架构。我们可以使用tf.keras.utils.plot_model来可视化我们的模型。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, add, Input
from tensorflow.keras.utils import plot_modelmodel = Sequential()
model.add(Conv2D(64, (3, 3), activation = 'relu', padding='same', input_shape=(128, 128, 3)))
model.add(Conv2D(64, (3, 3), activation = 'relu', padding='same'))
model.add(Conv2D(128, (3, 3), activation = 'relu', padding='same'))
plot_model(model)

绘制的模型

我们也可以创建这样的模型,方法是将它们分配给变量,并将它们的变量名放在它最后连接的层上。输入形状在tf.keras.layers.Input中指定,tf.keras.models.Model用于强调输入和输出,即我们模型的第一层和最后一层。

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, Input
from tensorflow.keras.utils import plot_modelinput_flow = Input(shape=(128, 128, 3))
x = Conv2D(64, (3, 3), activation = 'relu', padding='same')(input_flow)
x = Conv2D(64, (3, 3), activation = 'relu', padding='same')(x)
x = Conv2D(128, (3, 3), activation = 'relu', padding='same')(x)
model = Model(inputs=input_flow, outputs=x)
plot_model(model)

绘制的模型

现在,要构建稀疏连接的架构,我们只需要将一层分配给多层,然后使用tf.keras.layers.concatenate将它们连接起来。

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, Input, concatenate
from tensorflow.keras.utils import plot_modelinput_flow = Input(shape=(128, 128, 3))
x = Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(128, 128, 3))(input_flow)
one = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
two = Conv2D(64, (5, 5), activation='relu', padding='same')(x)
three = Conv2D(64, (7, 7), activation='relu', padding='same')(x)
x = concatenate([one, two, three])
x = Conv2D(128, (3, 3), activation = 'relu', padding='same')(x)
model = Model(inputs=input_flow, outputs=x)
plot_model(model)

模型已绘制。

跳过连接

这被网络 ResNet50 推广开来。跳过连接背后的主要思想是解决微软研究院在他们的论文图像识别的深度剩余学习中给出的这个问题。

当更深的网络能够开始收敛时,一个退化问题就暴露出来了:随着网络深度的增加,精确度达到饱和(这可能不足为奇),然后迅速退化。出乎意料的是,这种退化不是由过度拟合引起的,并且向适当深度的模型添加更多的层导致更高的训练误差……

图像取自此处的。

它的优点是可以更容易地估计权重的良好值,并且模型可以更好地概括。

如果你了解如何构建稀疏连接的架构,你可以很容易地猜到这是如何工作的,但是在这种情况下,为了连接它们,我们将使用tf.keras.layers.Add

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, Input, Add
from tensorflow.keras.utils import plot_modelinput_flow = Input(shape=(128, 128, 3))
x = Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(128, 128, 3))(input_flow)
one = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
two = Conv2D(64, (5, 5), activation='relu', padding='same')(one)
three = Conv2D(64, (7, 7), activation='relu', padding='same')(two)
x = Add()([x, three])
x = Conv2D(128, (3, 3), activation = 'relu', padding='same')(x)
model = Model(inputs=input_flow, outputs=x)
plot_model(model)

绘制的模型

结论

使用这些技术可能会改进我们的模型,但情况并非总是如此。它们的性能甚至可能比普通 Conv2D 层的简单密集连接架构更差。你需要试着看看哪种策略能产生最好的结果。

出于修订的目的,我使用上面提供的概念创建了一个模型。这只是为了修改的目的,我不保证这个模型会给出更好的结果。

绘制的模型

超越 Weisfeiler-Lehman:近似同构和度量嵌入

原文:https://towardsdatascience.com/beyond-weisfeiler-lehman-approximate-isomorphisms-and-metric-embeddings-f7b816b75751?source=collection_archive---------28-----------------------

图形神经网络有多强大?

在这篇文章中,我认为图同构的设置对于分析图神经网络的表达能力来说太有限了,并建议基于度量嵌入的更广泛的设置。

这是关于图形神经网络表达能力系列文章的第三篇。参见 第 1 部分 描述图神经网络与 Weisfeiler-Lehman 图同构测试之间的关系,以及 第 2 部分 展示如何基于子结构计数构造可证明强大的图神经网络。

W 在图形深度学习的背景下,已经表明消息传递神经网络与 1-WL 测试【2】一样强大。前往更高阶并且因此更强大的 k -WL 测试导致具有高计算复杂度和非局部操作的图形神经网络[3],这在实际应用中是不切实际的。

我们在最近的一篇论文[4]中介绍的另一种方法是打破 Weisfeiler-Lehman 层级结构,并求助于一种消息传递机制,这种机制能够感知局部图结构,如循环、集团和路径。这导致图形神经网络具有标准消息传递架构的吸引人的局部性和低复杂性,同时被证明比 2-WL 更强大,并且至少不比 3-WL 更弱。这种观点打开了图论中公开问题的深层链接,这些问题以前在图形神经网络表达性的上下文中没有被探索过。

故事就这样结束了吗?我相信我们可以通过改变对问题的看法来做得更好,并将在本文中讨论几个方向。

近似同构。虽然对图形神经网络表达能力的重要见解已经从图形同构问题的链接中显现出来,但设置本身相当有限。图形神经网络可以看作是试图寻找一个嵌入了 f ( G ),具有期望性质f(G)=f(G′)IFFG~G′的图。不幸的是,由于 Weisfeiler-Lehman 测试是图同构的必要但非充分条件,这只能以一种方式工作:f(G)=f(G′)ifG~G′,但反过来就不一定了:两个不同构的图可以产生相等的嵌入。

在实际应用中,我们很少处理完全同构的图,而是处理近似同构的图,如下图所示:

近似同构的图的例子:两对图 GG′GG″ 都是非同构的。然而, GG′仅相差一条边,因此比 GG″ “更同构”,它们相差五条边。

量化“近似同构”概念的一种适当方式是以度量 d 的形式,如果两个图不相似,则该度量大,否则该度量小。图形编辑距离[5]或格罗莫夫-豪斯多夫距离[6]是两个可能的例子。重要的是,度量被定义为 d ( GG′)= 0 当且仅当G~G′,这意味着两个同构的图是不可区分的[7]。等距嵌入的问题

|f(g)f(g′)| =d(gg′)为所有 Gg′(♠)

尝试用欧几里得距离|替换图形距离。在图的嵌入之间,两个距离相等(在这种情况下,嵌入 f 被称为“等距”或“距离保持”)。

关于图神经网络的表达能力的工作表明,在多项式时间内构造满足(♠)的图嵌入是可能的,其中 Weisfeiler-Lehman 测试成功。这个设置似乎限制太多。首先,很可能不可能设计出一个局部有效的算法来保证所有图的♠[8]。二、图同构问题对近似同构的图不提供任何保证,在这种情况下 d ( GG′)>0。例如,原则上可能的是,更多相似的图在嵌入空间中不太相似,即, d ( GG′)<d(GG″ )但是|f(G-f(【T24

另一方面,公制公式提供了更多的灵活性。人们可以通过限制度量膨胀来放松它,而不是要求(♠)保持精确,

cd(gg′)≤|f(g)—f(g′)|≤c d(gg′)对于 c

其可以表示为嵌入 f 的双李普希兹常数 c 。这意味着嵌入不会“拉伸”或“收缩”地面实况图距离 d 超过一个系数 c ,该系数理想情况下应尽可能接近 1。这种嵌入称为近似等距。人们试图得到的结果是一个与图无关的界限,特别是与顶点数无关的界限。

注意,图同构是(♣)的一个特例,因为对于同构的图g~g′d ( Gg′)= 0,因此f(g)=f(g′)。如上所述,这不可能在所有的图中都实现。相反,模型(♣)可以进一步放宽,允许额外的公制失真ε

cd(gg′)dε≤|f(g)f(g′)|≤c d(g

它对同构图形之间的距离设置了一个容差。在许多应用中,这是一个很小的代价,如果反过来一个人可以满足比(♠).)大得多的图族的话

近似等距嵌入问题。

大概近似等距。近似同构问题可以改写为“可能近似正确”(PAC)形式的概率陈述

𝖯( cd ( Gg′)ε≤|f(g)f(g′)|≤c d(gg′)

其中“近似”在度量膨胀 c 的意义上被理解,而“可能”是指对于图的某些分布,界限()以高概率 1δ成立[9]。这种设置可能比确定性的近似等距嵌入问题更容易分析。

桥接连续和离散结构。最后但同样重要的是,图神经网络表达能力的问题主要集中在图的拓扑上。然而,在大多数实际应用中,图也有节点或边的特征或属性,通常表示为向量[10]。度量框架通过定义属性图之间的适当距离来自然地处理这两种结构。

作为最后的评论,我提醒大家应该记住,大多数关于图形神经网络表达能力的工作都是建立在图论经典结果基础上的最近发展。扩展到其他数学领域,如度量几何,似乎是一个有前途的途径,很可能在不久的将来开花结果。

[1] B. Weisfeiler,A. Lehman,将一个图化简为标准形以及其中出现的代数,1968 年(英译)

[2] K. Xu 等图神经网络到底有多强大? (2019)。继续。ICLR。

[3] H. Maron 等人可证明强大的图形神经网络 (2019)。继续。神经炎。

[4] G. Bouritsas 等通过子图同构计数提高图神经网络表达能力 (2020)。arXiv:2006.09252。

[5] A. Sanfeliu,K.-S. Fu,用于模式识别的属性关系图之间的距离度量(1983)。IEEE Trans。系统、人和控制论(3):353–362。

[6] M .格罗莫夫,《黎曼多样性的结构》( 1981 年)。

[7]从技术上讲, d 是一个伪度量,可以看作是模同构关系的图的商集𝒢⧵~上的度量。

[8]我说“可能”是因为图同构问题是否有多项式时间的解还是未知的。这种假设的算法似乎极不可能具有实际的时间和空间复杂性。

[9]在 N. M. Kriege 等人(2018)的图核理论表达能力的属性测试框架中,概率度量设置的一个版本先前用于分析图核。继续。IJCAI。

[10]虽然 Weisfeiler-Lehman 框架在技术上适用于彩色图,但它仅限于具有离散特征集的节点。

我感谢卢卡·贝利、乔治·布瑞萨斯、法布里奇奥·弗拉斯卡、谢尔盖·伊万诺夫和伊曼纽·罗西校对了这篇文章,也感谢克里斯多夫·莫利斯指出了他之前在图形核的性质测试方面的工作。对图形深度学习感兴趣?在 Medium 上看我的 其他帖子 ,或者关注我的Twitter

超越魏斯费勒-雷曼

原文:https://towardsdatascience.com/beyond-weisfeiler-lehman-bc1f546d5164?source=collection_archive---------53-----------------------

超越 Weisfeiler-Lehman:近似同构和度量嵌入

由迈克尔布朗斯坦 — 6 分钟阅读

在这篇文章中,我认为图同构的设置对于分析图神经网络的表达能力来说太有限了,并建议基于度量嵌入的更广泛的设置。这是关于图形神经网络表达能力系列文章的第三篇。

为什么神经网络可以逼近任何函数

托马斯·汐宫光·克拉克——8 分钟阅读

在本文中,我将解释通用逼近定理,并用 PyTorch 代码展示两个快速示例,以演示神经网络学习逼近函数。如果你已经知道神经网络如何工作的基础知识,请随意直接跳到代码和可视化!

图片来源:Unsplash

概率编程简介

由法比亚娜·克莱门特 — 6 分钟读完

概率编程背后的思想是将来自统计的推理算法和理论与来自编程语言的形式语义、编译器和其他工具结合起来,为来自机器学习的模型和应用程序构建高效的推理评估器。

深度学习异常检测:综述

由关松庞 — 7 分钟读完

异常检测,也称为异常值检测,几十年来一直是一个活跃的研究领域,因为它在许多关键领域都有广泛的应用,如风险管理、合规性、安全、金融监控、健康和医疗风险以及人工智能安全。

美国宇航局在 Unsplash 上拍摄的照片

卫星图像分割初学者指南

汉娜·彼得森 — 15 分钟阅读

与根据标签对整个图像进行分类的图像分类相反,图像分割包括检测和分类图像中的单个对象。此外,分割不同于对象检测,因为它在像素级工作以确定图像中对象的轮廓。

超越 Weisfeiler-Lehman:使用子结构用于可证明表达的图形神经网络

原文:https://towardsdatascience.com/beyond-weisfeiler-lehman-using-substructures-for-provably-expressive-graph-neural-networks-d476ad665fa3?source=collection_archive---------11-----------------------

图形神经网络有多强大?

在这篇文章中,我将讨论如何设计不基于 Weisfeiler-Lehman 测试体系的局部且计算高效的强大图形神经网络。

这是关于图形神经网络表达能力系列文章的第二篇。参见 第一部分 描述图神经网络与 Weisfeiler-Lehman 图同构测试之间的关系。在 第三部分 中,我论证了为什么我们要完全抛弃图同构问题。

最近的开创性论文[1–2]建立了图神经网络和图同构测试之间的联系,观察了消息传递机制和 Weisfeiler-Lehman (WL)测试之间的相似性[3]。WL 测试是用于确定图同构的一系列图论多项式时间迭代算法的总称。 k -WL 测试根据一些邻域聚集规则在每一步重新着色 k 图的顶点元组,并在达到稳定着色时停止。如果两个图的颜色直方图不相同,则认为这两个图不是同构的;否则,这些图可能(但不一定)是同构的。

消息传递神经网络至多与 1-WL 测试(也称为节点颜色细化)一样强大,因此无法区分甚至是非同构图形的非常简单的实例。例如,消息传递神经网络不能计算三角形[4],这是一个已知在社交网络中起重要作用的主题,它与指示用户“紧密结合”程度的聚类系数相关联[5]。有可能设计出更具表达力的图形神经网络来复制日益强大的 k -WL 测试【2,6】。然而,这种体系结构导致高复杂性和大量参数,但最重要的是,通常需要非本地操作,这使得它们不切实际。

不能用 1-WL 来区分但可以用 3-WL 来区分的非同构图形的例子,因为 3-具有计算三角形的能力。

因此,基于 Weisfeiler-Lehman 层次结构的可证明强大的图形神经网络要么不是非常强大但实用,要么强大但不实用[7]。我认为,有一种不同的简单方法来设计高效且可证明强大的图形神经网络,这是我们在与乔治·布里特萨斯和法布里齐奥·弗拉斯卡的一篇新论文中提出的[8]。

图形子结构网络。这个想法实际上非常简单,在概念上类似于位置编码或 graphlet 描述符【9】:我们让消息传递机制知道本地图结构,允许根据端点节点之间的拓扑关系不同地计算消息。这是通过向消息传递函数传递与每个节点相关联的附加结构描述符来完成的[10],这些描述符是通过子图同构计数来构建的。通过这种方式,我们可以将图的节点划分为不同的等价类,这些等价类反映了每个图中的节点之间以及不同图之间共享的拓扑特征。

我们称这种架构为图子结构网络(GSN)。它具有与标准消息传递神经网络相同的算法设计、存储器和计算复杂性,并具有额外的预先计算步骤,在该步骤中构造结构描述符。要计数的子结构的选择对于 GSNs 的表达能力和预计算步骤的计算复杂性都是至关重要的。

在具有 n 个节点的图中,计数大小为 k 的子结构的最坏情况复杂度是𝒪( nᵏ 。因此,它类似于高阶图神经网络模型或 Morris [2]和 Maron [6]。然而,与这些方法相比,GSN 有几个优点。首先,对于某些类型的子结构,如路径和循环,计数可以以低得多的复杂度完成。第二,计算量大的步骤仅作为预处理进行一次,因此不会影响保持线性的网络训练和推理,与消息传递神经网络中的方式相同。训练和推理中的记忆复杂度也是线性的。第三也是最重要的,GSN 的表达能力不同于 k -WL 测试,在某些情况下更强。

gsn 有多强大?子结构计数赋予 GSN 比标准消息传递神经网络更强的表达能力。首先,澄清 GSN 的表达能力取决于所使用的图子结构是很重要的。同样,我们有一个层次的 k -WL 测试,我们可能有基于计数一个或多个结构的 gsn 的不同变体。使用比星形图更复杂的结构,gsn 可以比 1-WL(或等价的 2-WL)更强大,因此也比标准消息传递架构更强大。对于 4-团,GSN 至少不亚于 3-WL,如以下强正则图的例子所示,在该例子中,GSN 成功,而 3-WL 失败:

16 个顶点,节点度为 6 的非同构强正则图的例子,其中每两个相邻的顶点有 2 个共同邻居,每两个不相邻的顶点也有 2 个共同邻居。在这个例子中,3-WL 测试失败,而具有 4-团结构的 GSN 可以区分它们。在左边的图(称为 Rook 图)中,每个节点恰好参与一个 4-团。右图( Shrikhande 图)的最大集团大小为 3(三角形)。图来自[8]。

更一般地说,对于𝒪(1 大小的各种子结构,只要它们不能被 3-WL 计数,就存在 GSN 成功而 3-WL 失败的图[11]。虽然我们找不到相反的例子,但它们可能在原则上存在——这就是为什么我们关于 GSN 力量的陈述是弱形式的,“至少不减弱”。

这同样适用于更大的 k 值;上图中称为 k - 等正则的强正则图的概括,是( k +1)-WL 测试失败的实例[12]。这些例子也可以通过具有适当结构的 GSN 来区分。因此,下图显示了 gsn 的表达能力:

GSN 不属于 Weisfeiler-Lehman 层级。有了适当的结构(例如,一定规模的集团或循环),它很可能至少不亚于 k-WL。

GSN 原则上能有多强大?这仍然是一个悬而未决的问题。图重构猜想 [13]假定了从所有删除节点的子结构中恢复图的可能性。因此,如果重构猜想是正确的,具有大小为n1 的子结构的 GSN 将能够正确地测试任何图的同构。然而,重构猜想目前只对大小为 n≤ 11 [14]的图被证明,其次,这样大的结构是不切实际的。

更有趣的问题是类似的结果是否存在于独立于节点数量的“小”结构(𝒪(1 的)中。我们的经验结果表明,具有诸如圈、路径和集团的小子结构的 GSN 适用于强正则图,这对于 Weisfeiler-Lehman 测试来说是一个难题。

最重要的是,GSN 建立在标准消息传递架构之上,因此继承了它的局部性和线性复杂性。该方法的超参数包括为构造结构描述符而计数的结构。实际应用可能会受到所需表达能力、保证表达能力的结构大小以及计算复杂性之间的权衡的指导。

使用具有长度 k≥6 的循环的 GSN 显著改善了锌数据库中分子图的化学性质的预测,该锌数据库被制药公司用于候选药物的虚拟筛选。这种环状结构在有机分子中很丰富。图来自[8]。

在我们的实验中,我们观察到不同的问题和数据集受益于不同的子结构,因此这种选择很可能是特定于问题的。幸运的是,我们通常知道在某些应用中什么样的子结构很重要。例如,在社交网络中,三角形和高阶小集团很常见,并有明确的“社会学”解释。在化学中,周期是一种非常频繁的模式,比如出现在大量有机分子中的五元和六元 T2 芳香环。下图显示了我们大多数人都熟悉的一个例子,咖啡因的分子,它在我血液中的含量低得惊人。这听起来是写完这篇文章并给自己冲杯咖啡的好时机。

1,3,7-三甲基黄嘌呤,更广为人知的名称是咖啡因,是一种含有 5 环和 6 环的化学环状化合物的例子(用红色和黄色表示)。

[1] K. Xu 等图神经网络到底有多强大? (2019)。继续。ICLR。

[2] C. Morris 等人 Weisfeiler 和 Leman go neural:高阶图神经网络 (2019)。继续。AAAI。

[3] B. Weisfeiler,A. Lehman,将一个图化简为标准形以及其中出现的代数,1968 年(英译)

[4]因此,通过 1-WL 测试,具有不同数量三角形的两个图将被认为可能是同构的,或者等效地,将具有由消息传递神经网络构建的相同嵌入。有大量新的结果扩展了我们对什么结构在 WL 测试下是不变的理解,参见例如 V. Arvind 等人关于 Weisfeiler-Leman 不变性:子图计数和相关图性质 (2018) arXiv:1811.04801 和 Z. Chen 等人图神经网络能计数子结构吗?(2020) arXiv:2002.04025。

[5]图子结构已经在复杂网络中使用了几十年。在生物信息学中,R. Milo 等人的开创性论文《网络基序:复杂网络的简单构建模块》(2002)。科学 298(5594):824–827。和 n . prulj 等人建模交互组:无尺度还是几何? (2004)生物信息学 20(18):3508–3515 介绍了用于生物相互作用网络分析的图形基序和 graphlets。在社会网络中,对三角形主题的研究至少可以追溯到 P. W. Holland 和 S. Leinhardt 的《社会网络中的局部结构》(1976)。社会学家。方法。1–45.

[6] H. Maron 等人可证明强大的图形神经网络 (2019)。继续。神经炎。

[7]Morris 的 3-WL 等价图神经网络架构具有𝒪( n 空间-和𝒪( n ⁴)时间复杂度。Maron 的架构具有稍好的𝒪(空间和𝒪(时间复杂度。对于一个具有 100 万个节点的中等规模的图形,这仍然意味着巨大的 1TB 内存和万亿次计算。

[8] G. Bouritsas 等通过子图同构计数提高图神经网络表达能力 (2020)。arXiv:2006.09252。

[9]基于子结构计数的图形分析方法明显早于最近关于图形深度学习的工作。值得注意的例子包括 T. Milenkovi 和 n . prulj 在生物信息学中提出的 graphlet 签名,通过 graphlet 度签名揭示生物网络功能 (2008)。癌症信息。6:257–273,或 graphlet 内核 N. Shervashidze 等人用于大型图形比较的高效 graphlet 内核 (2009)。继续。AISTATS。

[10]我们对边也展示了同样的机制,为了简洁起见,我在这里省略了。

[11] 3-WL 在子结构计数方面显得相当弱。例如,它可以计算多达 7 个节点的基元循环,但不能计算诱导的 4-循环或长度为 4 的路径。目前还不清楚通过在 WL 层次结构中向上移动可以获得什么样的子结构计数能力。

[12] B. L. Douglas,《Weisfeiler-Lehman 方法与图同构测试》 (2011)。arXiv:1101.5211。请注意,在不同的参考文献所称的“ k -WL”之间存在一定程度的混淆。道格拉斯用术语k——WL 来称呼别人所说的(k——1)——FWL(“民间传说”WL)。在我们的术语中, k -WL 在(k-1)-等规图上失效。强正则图是 2-等正则的。

[13] P.J .凯利,树的一个同余定理 (1957)。太平洋 j .数学。7:961–968.

[14] B. D. McKay,小图是可重构的(1997)。澳大利亚组合学杂志 15:123–126。

感谢卢卡·贝利、乔治·布里萨斯和法布里齐奥·弗拉斯卡帮助我校对这篇文章。本帖的 中文翻译 刘止庸 提供。对图形深度学习感兴趣?查看我的 博客 关于走向数据科学, 订阅我的 帖子,获取 中等会员 ,或者关注我的Twitter

CMOs 在 2020 年遵循的商业智能趋势

原文:https://towardsdatascience.com/bi-trends-that-cmos-are-following-in-2020-5dd94d022095?source=collection_archive---------60-----------------------

nabler.com

了解商业智能在市场营销中的未来

没有数据的营销就像闭着眼睛开车。-(丹·扎雷拉)

2013 年,屡获殊荣的营销大师丹·扎雷拉(Dan Zarrella)接受《福布斯》采访时表示,有多少营销人员不使用数据分析,这是一件可怕的事情。扎雷拉还是一位多作家,也是革命性在线应用的发明者。

但幸运的是,这种趋势正在改善,他说。Zarrella 总结说,这种缓慢的接受是由于老式的非数据营销方法的惯性仍然有影响。

快进到现在。七年后,我们来到了 2020 年。有什么变化?如今,营销人员在多大程度上使用了数据分析?首席营销官(CMO)遵循什么样的商业智能趋势或也称为 BI 趋势?让我们仔细看看。

如今,营销人员在多大程度上利用了数据?

CMO 调查报告中的数字显示,数据驱动营销在公司中的应用达到了多年来的最高点。

2013 年,营销人员花了大约 30%的时间分析数据,用于商业智能和企业决策。到 2019 年,这一比例已增长到 43%以上。

但仍有重大挑战和很大的增长空间:

  • 12.9%的首席营销官仍然缺乏决策所需的定性和定量数据。
  • 只有 36%的首席营销官使用定量数据。
  • 50.7%的首席营销官能够接触到定性数据。

除了上面引用的令人失望的统计数据,还有一个令人清醒的现实是,超过 60%的公司不确定他们的营销有多成功。他们只是缺乏跟踪和证明它的指标!

营销人员面临的关键数据问题有哪些?

有几个主要障碍正在减缓营销人员对 BI 解决方案的大规模采用。

CMO 淹没在数据中!

国际数据公司(IDC)的估计表明,到 2025 年,全球数据创建量将从目前的 330 亿字节(ZB)激增至约 175 亿 ZB。注:1 ZB 等于 1 万亿吉字节(GB)。

IDC 写道“人类正在寻求数字化世界。”它继续说道,“消费者沉迷于数据,而且更多的是实时数据。”IDC 表示,他们希望无论身在何处,都能通过任何联网设备全天候访问服务和产品。

与此同时,世界各地的企业都在忙于利用数据获得竞争优势,以改善客户体验,并提供与消费者的实时和不间断的个性化交互。

对于营销人员来说,继续将世界上忙着生成的大量数据转化为有意义和可操作的信息越来越具有挑战性。

来自任何地方和任何地方的数据都很繁忙。首席营销官正在努力继续从来自智能设备、计算机网络、物联网(IoT)和数据丰富的用户生成内容(包括文本和媒体,如照片和视频)的深不可测的数据海洋中寻找意义和新兴趋势。

数据质量差

不幸的是,全世界每天产生的海量数据中,只有一小部分可供分析。IDC 估计这一数字低至 23%。为了让数据带来真正的商业智能优势,数据需要经过验证、完整、干净和可信,这只是其中几个关键要求。当然,在分析之前需要大量的资源和时间来准备数据。

数据隐私和安全

近年来,未经授权使用个人信息和公司数据安全漏洞一直是全球关注的焦点。在这方面,许多大公司也面临着巨额罚款。

CMO 需要不断获得访问和使用各种数据集的许可。他们还有责任确保数据得到安全处理和合法应用。

随着全球数据的大规模增长,责任越来越大。严格和严格的法规也在不断涌现,例如,2018 年生效的欧盟通用数据保护法规(GDPR)。

CMOs 正在追随哪些最新的商业智能趋势?

可以想象,在一个数据通常被称为保持经济运行的“新石油”的现代世界中,有太多的分析机制、策略和方法被商业界用来尝试和理解这一切。

一份名为“2020 年顶级商业智能趋势:2,865 名商业智能专业人士的真实想法”的调查报告列出了 20 种商业智能解决方案,这些解决方案是公司普遍采用的,旨在最终从其库中的海量数据中获取可操作的信息。将范围缩小到营销领域,两个 BI 未来趋势——即预测分析和人工智能(AI)——是如此明显的领导者,以至于其他人相形见绌。

预测分析

预测分析是高级分析的一个分支,它从现有数据中识别模式,并在此基础上做出预测。虽然预测分析是一种在几乎所有可以想象的商业活动中“绘制未来”的流行方式,但营销人员使用它来推测他们自己空间中未来事件的概率和潜在美元价值。一些预测分析示例如下:

  • 未来的客户价值。
  • 客户成功预测。
  • 防止合同终止。
  • 潜在的新业务。
  • 销售预测。

预测分析绝不是一种新兴趋势。这是一种久经考验、广受欢迎的 BI 方法,稳定且独立于“炒作和 FOMO ”,后者在当今的颠覆性创新环境中司空见惯。

人工智能(AI)和机器学习(ML)

AI 和 ML 无疑是节目的明星!2020 年 2 月,杜克大学教授 Christine Moorman 写道,“营销领导者报告称,他们的工具包中人工智能和机器学习的使用比 2018 年增加了 27%,并预计这一水平在三年内将再增加 60%。对于较大的公司和通过互联网销售比例较大的公司,这些比率甚至更高。”

摩尔曼教授列举了人工智能在营销人员中的三大应用&

  • 内容个性化——得益于人工智能对客户的透彻理解,它可以帮助营销人员评估个性化内容的“正确”数据。埃森哲的统计和研究表明,被误导的个性化会导致客户沮丧甚至不信任。导致仅 2017 年就有 41%的客户换公司!
  • 客户洞察——以人工智能为中心的客户洞察不仅可以帮助营销人员获得正确的内容,还可以帮助他们选择合适的时间和交付渠道。通过这种方式,公司可以在最佳时间向合适的客户提供合适的产品。通过把事情做好,它提高了客户忠诚度、保留率和获得率。
  • 目标决策-通过智能地细分客户和市场,人工智能帮助营销人员优化广告目标,并更有效地管理活动,以提高市场渗透率。

进一步的关键人工智能趋势是客户细分、程序化广告和媒体购买、通过优化营销内容和时机来提高营销 ROI,以及用于客户服务的对话式人工智能。

而次要趋势包括次优产品、增强和虚拟现实、自主对象/系统、面部识别和视觉搜索以及生物识别/芯片。

人工智能是如此有效和受欢迎的方法,因为:

  • 可以在更短的时间内分析巨大的数据集。
  • 它还通过挖掘非结构化数据来专业地检测趋势。
  • 即使是大规模的个性化也毫不费力。
  • 可以在非结构化数据中找到主要影响因素。
  • 可以挖掘不明确和不集中的数据来确定竞争分析,并确定 KPI 和各种营销见解。
  • 它通过处理未准备好的数据来进行机器学习(ML)。因此,你用得越多,人工智能就变得越“聪明”越“好”!

人工智能也是首席营销官和其他企业高管的最爱,因为它使营销结果可以衡量!通过使用营销分析和数据,AI 可以将实际财务结果与营销 KPI 和业务目标进行比较,从而为业务领导者提供宝贵和可操作的指标。

结论

在这个世界上,90%的现有数据都是在过去两年中创建的,试图理解这些数据绝非易事!面对从四面八方源源不断而来的海量数据,营销人员很难从中获取有意义且可操作的信息。

此外,传统上,数据需要经过充分的准备才能得到有效利用。因此,毫不奇怪,很大一部分营销专业人员没有充分利用商业智能的优势。

然而,随着 AI 和 ML 等革命性和受欢迎的新兴 BI 市场趋势解决了许多历史性的行业难题,预计在未来三年内,接受率将飙升 60%!

原文内容由: 纳布勒

机器学习中的偏差和方差

原文:https://towardsdatascience.com/bias-and-variance-in-machine-learning-b8019a5a15bc?source=collection_archive---------33-----------------------

成功的关键是找到偏差和方差之间的平衡。

照片由 Unsplash 上的 Aziz Acharki 拍摄

在预测分析中,我们建立机器学习模型,对新的、以前从未见过的样本进行预测。整个目的就是能够预测未知。但是模型不能凭空做出预测。我们向模型展示一些样本并训练它。然后,我们期望模型对来自相同分布的样本进行预测。

完美的模型是不存在的,所以我们建立和训练的模型会有错误。预测值和实际值之间会有差异。模型的性能与实际值和预测值之间的差异成反比。差异越小,模型越好。我们的目标是尽量减少误差。我们不能消除错误,但我们可以减少它。可以减小的误差部分有两个分量:偏差方差

模型的性能取决于偏差和方差之间的平衡。最佳模式介于两者之间。请注意,偏差和方差之间总是有一个权衡。挑战在于找到正确的平衡。

什么是偏差和方差?

当我们试图用一个简单得多的模型来近似一个复杂的关系时,就会出现偏差。我认为它是一个懒惰的模型。考虑一种情况,其中自变量(特征)和因变量(目标)之间的关系非常复杂并且是非线性的。但是,我们尝试使用线性回归建立一个模型。在这种情况下,即使我们有数百万个训练样本,我们也无法建立准确的模型。通过使用简单的模型,我们限制了性能。不能反映特征和目标之间的真实关系。

具有高偏差的模型不能够捕捉重要的关系。因此,训练集和集合集的精度都将非常低。这种情况也被称为欠配合。具有高偏差的模型倾向于欠拟合。考虑下面的散点图,它显示了一个特征和一个目标变量之间的关系。如果我们使用红线作为模型来预测蓝色数据点所描述的关系,那么我们的模型就有很大的偏差,最终会使数据拟合不足。

高偏置,欠拟合

方差发生在模型对自变量(特征)的变化高度敏感的时候。该模型试图选取关于特征和目标之间关系的每个细节。它甚至学习数据中可能随机出现的噪声。特征中非常小的变化可能会改变模型的预测。因此,我们最终得到了一个模型,它捕获了训练集的每一个细节,因此训练集的准确性将非常高。然而,新的、以前未见过的样本的准确性不会很好,因为特征中总是存在不同的变化。这种情况也被称为过拟合。该模型过度适应训练数据,但未能很好地概括数据集内的实际关系。模型实际看到的样本的精度将非常高,但是新样本的精度将非常低。考虑我们之前讨论过的同一个例子。如果我们试图用下图中的红色曲线来模拟这种关系,模型会过度拟合。如你所见,它非常敏感,试图捕捉每一个变化。

高方差,过度拟合

所以高偏差和高方差都不好。完美的模型是低偏差和低方差的模型。然而,完美的模型很难找到,如果可能的话。偏差和方差之间有一个权衡。我们应该力求在它们之间找到恰当的平衡。作为一名机器学习工程师,成功的关键是掌握在偏差和方差之间找到正确的平衡。对于我们的情况,一个更好的模型应该是这样的:

非常合适

感谢您的阅读。如果您有任何反馈,请告诉我。

媒体混合模型中付费搜索的偏差修正:论文综述

原文:https://towardsdatascience.com/bias-correction-for-paid-search-in-media-mix-modeling-paper-review-d3579cfaee9b?source=collection_archive---------31-----------------------

这篇文章提供了“媒体混合建模中付费搜索的偏差纠正”的高级概述,提供了关键概念的代码和实现。

媒体组合建模中付费搜索的偏差修正: 链接论文

媒体组合建模试图仅基于观察数据来估计媒体支出对销售的因果影响。众所周知,从观测数据中估计因果关系充满了挑战。

随着时间的推移,出现了两种主要的、互补的框架来处理因果推理。

  1. 鲁宾的潜在结果框架。
  2. Pearl 的图形框架。

本文探讨了使用 Pearl 的图形框架来控制媒体组合建模中的选择偏差,特别是在付费搜索广告中。

问题设置

假设我们的目标是测量搜索广告(PPC)对销售的因果影响。在一个简单的回归模型中,我们可以回归销售支出并得出一个因果估计值:

销售额=平均值 _ 销售额+roas _ 估计值 *搜索 _ 花费+误差

我们可以用普通的最小二乘法(OLS)来拟合上面的模型,在一个简单的世界中,这将产生对 roa 的精确估计。不幸的是,世界并非如此简单,我们知道经常会有令人困惑的变量。例如,我们知道有机搜索也是销售的驱动力,有机搜索和付费搜索都有一个潜在的原因,即消费者需求。下图说明了这一点。

以上,我们可以看到经济因素如何驱动消费者需求,进而驱动搜索查询,进而驱动付费搜索和有机搜索。

当我们使用上面定义的简单模型来模拟更复杂的世界时,我们会遇到选择偏差或更广泛的内生性问题。

内生性:是计量经济学中使用的术语,指与误差项相关的解释变量。

简而言之,我们的模型捕捉或吸收了有机搜索在误差项和 ROAS 估计中的解释价值,从而产生有偏差的 ROAS 估计。

为了控制这一点,本文建议使用珀尔的后门标准。Pearl 的后门标准是基于使用图形模型来描述因果关系的思想。图形模型是有用的,因为它们允许我们结合领域知识和来自图论的思想。

其中一个想法就是分离。

D-separation 是 directed-separation 的缩写,它允许我们在一个图中的两个节点被一组第三节点分隔(或有条件地相互独立)时进行通信。

例如,在下图中,给定 x1 和 x2,我们可以说 Z 与 Y 是 d 分离的,或条件独立的。

另一个重要的想法是后门标准。

后门准则:给定一个因果图,一组变量 Z 相对于图中一个有序的变量对(X,Y)满足
后门准则,如果:1)Z 中没有一个节点是 X 的后代;以及 2) Z“阻塞”X 和 Y 之间包含指向 X 的箭头的每条路径

此外,如果一组节点 Z 满足有向对的后门准则(X →Y ),那么在给定足够大的数据集的情况下,我们可以揭示 X 对 Y 的无偏估计。这也被定义为可识别性

为了让自己熟悉后门标准的概念,我建议尝试下面的代码片段(尝试创建各种图形,并确定哪些节点将满足后门标准)并探索其他资源。

from causalgraphicalmodels import CausalGraphicalModelsimple = CausalGraphicalModel(
    nodes=["x1", 'x2', 'z', 'y'],
    edges=[
        ("z", "x1"), 
        ("z", "x2"),
        ("x1", "y"),
        ("x2", "y"),
    ]
)simple.draw()simple.is_valid_backdoor_adjustment_set("x1", "y", {"z"})

申请搜索

现在,我们已经探索了一些与因果图模型相关的基本概念,我们可以看到它们是如何应用于恢复付费搜索的无偏 ROAS 估计的。首先,本文阐述了环境的因果结构。(见下图)

上图表明我们将影响建模为:

sales = average _ sales+*roas _ estimate** search _ spend+error _ 0+error _ 1

其中 error_0 和 error_1 分别吸收了消费者需求和有机搜索的影响。

基于我们对图形模型的了解,我们现在知道,如果我们可以恢复搜索查询的度量,我们就可以满足(搜索广告 X →销售)的后门标准。为了测试这一点,我们可以使用一个叫做因果图模型的便利包。

from causalgraphicalmodels import CausalGraphicalModelsearch = CausalGraphicalModel(
    nodes=["economic_factors", "consumer_demand", "search_queriers", "auction", "organic_search", "paid_search", 'organic_search', 'sales'],
    edges=[
        ("economic_factors", "consumer_demand"), 
        ("consumer_demand", "sales"), 
        ("consumer_demand", "search_q"),
        ("search_q", "auction"), 
        ("auction", "paid_search"),
        ("search_q", "paid_search"),
        ("search_q", "organic_search"), 
        ("organic_search", "sales"), 
        ("paid_search", "sales"),
    ]
)search.is_valid_backdoor_adjustment_set("paid_search", "sales", {"search_q"})# output is True 

在上面的代码中,我们定义了因果图模型(DAG ),并测试我们的控制变量是否满足后门标准(payed _ search→sales)。

接下来,我们生成样本数据,运行 OLS 回归来比较满足和不满足后门标准时的估计值。

from causalgraphicalmodels import StructuralCausalModel
from causalgraphicalmodels import CausalGraphicalModel
import numpy as np# create structural causal model. This let's us generate data. search_data = StructuralCausalModel({
    "consumer_demand": lambda n_samples:                  np.random.normal(100,5, size=n_samples) ,
    "search_q":        lambda consumer_demand, n_samples: np.random.normal(consumer_demand*.3,  1, n_samples)  ,
    "organic_search":  lambda search_q, n_samples:        np.random.normal(search_q*.6, 1)                ,
    "paid_search":     lambda search_q, n_samples:        np.random.normal(search_q*.1, 1)                ,

    "sales":           lambda organic_search, paid_search, n_samples: np.random.normal(75 + organic_search*.2  + paid_search*.3,  1 )
})data = search_data.sample(156)# run OLS without backdoor criterion satisfied for paid search --> salesX = data[['paid_search' ]].values
X = sm.add_constant(X)results = sm.OLS(data.sales.values, X).fit()print(results.summary())# run OLS without backdoor criterion satisfied for paid search --> salesX = data[['paid_search' ]].values
X = sm.add_constant(X)results = sm.OLS(data.sales.values, X).fit()print(results.summary())# with backdoor criterion satisfied X = data[['paid_search',   'search_q']].values
X = sm.add_constant(X)results = sm.OLS(data.sales.values, X).fit()print(results.summary())

得出以下 ROAS 估计值:

正如我们所看到的,两种估计都捕捉到了真实的参数,无偏估计(满足后门标准)更接近真实的估计。

现在,您可能已经注意到,在代码示例中,我们只采样了 156 个数据点,这相当于三年的每周 MMM 数据。这并不是大量的数据,也提出了一个重要的问题,即我们如何知道我们的样本量何时足够?

该论文提出,当样本量足够大以允许非参数估计时,这种担心可以得到缓解,然而大样本量在 MMM 建模中并不常见。

为了进一步探索这一点,我制作了下图,展示了在样本量越来越大的情况下,ROAS 估计值和置信区间是如何变化的。

正如我们所见,无偏估计量收敛于真实参数,而有偏估计量过于乐观。此外,上图强调了小样本量如何产生非常大的置信区间。如果样本量很小,需要注意一些事情。

至此,我们已经完成了论文理论部分的主要内容,并涵盖了:

  • 付费搜索中的选择偏差与 MMM 建模
  • 因果图形模型/珍珠框架
  • 如何应用于简单的付费搜索场景
  • 如何模拟数据和实现模型
  • 一些需要注意的“陷阱”

本白皮书更详细地介绍了这里涉及的主题,并继续介绍:

  1. 复杂场景
  2. 履行
  3. 实证结果

我强烈推荐感兴趣的读者查看全文以了解更多细节。

偏见悄悄进入技术领域

原文:https://towardsdatascience.com/bias-creeps-into-technology-e221dd7eae76?source=collection_archive---------57-----------------------

我们无法避免将我们自己的观点带到我们构建的产品中

编写计算机代码——图片来自 Pixabay 的免费照片

大多数开发技术的人都不想有偏见。然而,我们对世界都有自己独特的视角,我们忍不住会将这种视角带入到我们的工作中。我们根据自己的观点和经验做出决定。这些决定可能看起来都很小,但是它们会累积起来。因此,技术往往反映了它的创造者的观点。

这里是我见过的偏见渗入技术的几个地方。

我们构建的数据集

随着机器学习(ML)和人工智能算法最近的成功,数据变得越来越重要。ML 算法从数据集学习它们的行为。这些数据集中包含的内容变得非常重要,因为它会直接影响产品的性能。

以自然语言理解领域(NLU)为例,大型预训练模型最近开始流行。预先训练的模型建立起来很昂贵,但是一旦建立起来,它们可以被不同的人在不同的任务中重用。 BERT 是使用最广泛的预训练模型之一,它是根据维基百科文本构建的。维基百科作为数据来源也有自己的问题。在网站上的人物传记中,只有 18%是女性而绝大多数内容是由欧洲和北美的编辑撰写的。在维基百科中产生的偏见被 BERT 模型学习并传播。

在另一个领域,计算机视觉,数据集在组成上同样存在问题。一类数据集是面部数据集,面部识别系统就是从这些数据集中训练出来的。他们通常是压倒性的白人,在两个流行的数据集中,分别有 79.6%和 86.2%的人肤色较浅。像这样的数据集导致 ML 模型对于深色皮肤的人表现不佳。

我们决定解决还是不解决的问题

在 CogX ,我主持了一场会议,会上海蒂·克里斯滕森博士讲述了她为那些患有言语障碍&临床语音障碍的人研究语音技术的工作。语音技术可能会对那些有语音障碍的人的生活产生巨大影响,因为影响他们声音的相同条件也会影响其他动作,使他们难以执行许多简单的任务。获得独立意味着更好的结果。然而,主流语音技术关注的是健康的说话者,而不是那些说话方式不标准的人。

其他时候,任务的框架是有问题的,并且有延续刻板印象的风险。接性别分类的任务。我相信,把我识别为女性的系统不会带来任何好处。举例来说,我可能会看到低薪工作的广告或者被指向更贵的产品。

关于做什么工作的决定通常是由财务问题指导的——谁将资助一个产品,谁将付费使用它——但也包括那些建设的个人经验和引起他们共鸣的问题。

我们分配给任务的优先级

我身兼数职,但我的众多工作之一是对团队工作的技术任务进行优先排序。在一个理想的世界里,我们有足够的时间和金钱去做任何事情。但事实上,我们的时间有限。我们必须挑选工作内容。每个优先级的决定可能看起来很小,无关紧要,但它们加在一起会对产品的方向产生很大的影响。

这里有一个受真实事件启发的假设示例—在构建语音识别系统时,我们可能会努力构建一个平衡的训练集,但仍然会评估该系统,发现它对于特定的人口统计数据表现不佳。例如,我们的语音识别系统对英国人的表现可能更差,因为我们的一些发音和单词选择与系统预期的非常不同。现在,在花费团队的努力来调查并使系统对英国用户更可靠,与试验一种新的模型架构,看起来有希望使整个系统对每个人都有更好的表现之间,有一个选择。这个选择并不总是容易做出的。第二种选择可能最终也会提高英国用户的性能,但它不会解决这种不平衡。

我们听取的意见

我们倾听的人会影响我们的想法和我们对谁应该担任这些有影响力的职位的看法。

众所周知,科技公司的人口统计数据——远见者和决策者——在是倾斜的。在最高层,白人和亚裔男性占据了主导地位。除了科技之外,高层的构成也好不到哪里去。富时 100 指数的首席执行官中,叫史蒂夫的 T4 男性比少数族裔男性多,只有 6 名女性。不提拔更多的人进入这些行列,我们就没有听取他们的意见和观点。

2016 年的一项调查显示,英国媒体 94%是白人,女性薪酬明显低于男性。虽然传统媒体的构成有所扭曲,但社交媒体为许多未被充分代表的声音提供了一个平台。然而,即使是社交媒体也存在性别问题。最近的一项研究关注了学术医学领域,发现“女性学者在该平台上的 Twitter 关注者、喜欢者和转发者也比男性同行少得多,无论她们的 Twitter 活动水平或专业级别如何”。

我们通过自我评估的指标

我们经常通过平均错误率来评估最大似然系统。计算这一点并在不同系统间进行比较很容易。也许有 100 个人使用我们的系统,每个人都有 95%的错误率。对于大多数系统来说,这是完全可用的。相反,假设这些用户中的 90 个具有 98%的错误率,10 个具有 68%的错误率。现在,这两组之间有很大的差异,但平均错误率仍然是 95%。发现错误率为 68%的用户可能会发现系统不可用,但这并没有显示在平均指标中。如果不衡量不同人群的表现,我们就无法发现我们建立的模型中的偏差。

在其他产品中,我们测量并优化参与度——一篇帖子的点击数&赞数,或在网站上停留的时间。但是,参与可能不是用户福祉的最佳衡量标准。参与不仅可以由喜欢某人的页面或帖子引起,也可以由对内容的失望引起。据显示,标题中较高的情感水平会让读者更有可能点击,但也会分化观点并导致回音室,随着时间的推移会强化极端观点,而不是挑战它们。

我们对顾客的看法

我怀孕的时候,我的任天堂 Wii 痛斥我长胖了。没有办法告诉它我的体重增加只是暂时的,最终我把它扔进了垃圾箱。我们设计系统,想象我们的客户将如何使用它们。但是,客户在某些方面与我们不同,这是我们无法预料的。任天堂 Wii 的设计者似乎没有预料到用户可能会经历怀孕。任天堂 Wii 是我可以停止使用的东西,但怀孕歧视是一个非常现实的问题。

另一次,我在一个关于家庭安全系统的演讲的接收端,连接到云上。当你不在家时,你不仅可以在线查看录像,还可以随时查看谁在房子里,并在特定事件发生时发出警报。设计这个的团队想象他们的用户和他们一样——骄傲的父亲和慈爱的丈夫,他们只是想做好保护家庭安全的工作。但是,技术也以新的方式使滥用成为可能。设计师没有想到他们的一些客户可能会以不同的意图利用这样的家庭安全系统,所以安全是事后才想到的。

我们对客户的看法可能会限制我们为他们构建的东西,通常是在我们有盲点的领域,并强化我们持有的偏见。

我们选择的商业模式

在科技行业,许多工程类工作报酬丰厚且有保障。相比之下,数据注释员、司机和内容管理员等低收入、不稳定的工作,许多科技公司没有这些工作就无法运营。对这些角色的依赖对许多科技公司的商业模式至关重要,这些员工的人口统计数据与工程人员非常不同。

最近一项关于打车公司算法定价的研究发现,种族、教育和年龄等因素都会影响乘车价格,尽管这些因素并不是模型的明确组成部分。这是因为它们与模型考虑的因素相关,如位置。

另一种常见的商业模式依赖于免费提供服务,并从广告中获得收入。这是一把双刃剑。一方面,免费提供产品扩大了产品的覆盖范围,让原本可能买不起的人也能使用它们。另一方面,伴随这种商业模式而来的定向广告是偏见被强化的另一种方式,例如允许广告针对种族和性别。

技术对世界产生了巨大的影响。但是这个世界是有偏见的,我们这些创造技术的人有我们甚至不知道的盲点。即使有最好的意图,也很难将偏见排除在我们构建的产品之外。

你可以雇佣我!如果我能帮助你的组织使用 AI &机器学习,请 取得联系

人工智能中的偏见:远不止是一个数据问题

原文:https://towardsdatascience.com/bias-in-ai-much-more-than-a-data-problem-de6ef950c848?source=collection_archive---------52-----------------------

虽然数据偏差是人工智能不公平的一个众所周知的原因,但它绝对不是唯一的原因。

奥巴马被人工智能上采样为白人,最初作为这条推文的一部分发表:https://twitter.com/Chicken3gg/status/1274314622447820801?s=20

在过去的几天里,人工智能社区中有很多关于偏见的讨论,特别是在 Y ann LeCun 在这条推文之后加入了对话之后:

关于 PULSE 偏差的原始推文,一种新的照片上采样算法

PULSE 是创建这张图像的算法,它通过使用自我监督训练来搜索使用 GAN 生成的高分辨率人工图像的空间,并识别那些缩小到低分辨率图像的图像。该算法很快发现了一个偏差问题:给定著名非白人的下采样(但仍然非常容易识别)图像,该算法仍然对它们进行上采样,以产生白人输出。这是另一个明显的例子:

原始 AOC 照片,降采样图像和脉冲输出。

Lecun 回复了那条推文,声称 ML 系统因为数据的质量而存在偏见。

Yann Lecun 建立了数据偏差和人工智能偏差之间的关系

部分人工智能社区对这条推文做出了反应,声称 Lecun 的声明暗示 ML 系统只有在数据有偏差的情况下才会有偏差。参与对话的最活跃的专家之一是谷歌道德人工智能团队的技术联合负责人 Timnit Gebru。

Timnit Gebru 对 Yann Leccun 推文的回应

我必须承认,跟随那次谈话让我获得了许多关于人工智能伦理主题的有趣资源,尤其是偏见。让我与你分享一些我发现的最有趣的例子:

  • 计算机视觉中的公平、问责、透明和道德 作者蒂姆尼特·格布鲁和艾米丽·丹顿。在当前背景下,特别适用于将视觉计算用于监控目的。
  • 我们的数据体项目 :一个非常小的团体,致力于了解“政府和企业如何收集、存储和共享社区的数字信息”,特别是在边缘化的社区。
  • fast.ai 艾伦理资源 ,由瑞秋托马斯编译。一组非常有趣的视频、链接和对人工智能伦理专家和机构的介绍,值得关注。
  • 关于 AI 系统的政治设计 ,一篇很有意思的文章,揭穿了 AI 偏差只是由有偏差的数据造成的观点。

我在迈向数据科学中的一篇名为“计算机说不”的短文包括了我们在当前公司使用的处理人工智能伦理的框架的高级视图。正如你所看到的,通过人工智能实现真正积极的社会影响和公平有很多需要考虑的问题。

艾弗里斯人工智能伦理框架,版权所有。

我真的很高兴成为新的斯普林格人工智能和伦理杂志的创始编委会成员,在这本杂志中,我将有幸与一个了不起的专家小组一起详细探讨这个话题。

你有任何你认为与人工智能伦理高度相关的资源吗?我将非常乐意与您合作,定期更新这篇文章。

如果你喜欢读这篇文章,请 考虑成为会员 以便在支持我和媒体上的其他作者的同时,获得每个故事的全部信息。

人工智能中的偏见

原文:https://towardsdatascience.com/bias-in-artificial-intelligence-a3239ce316c9?source=collection_archive---------29-----------------------

大数据时代的不平等、种族主义和歧视

人工智能和机器学习都很牛逼。它们让我们的手机助手能够理解我们的声音,并为我们预订优步。人工智能和机器学习系统在亚马逊为我们推荐书籍,类似于我们过去喜欢的书籍。他们甚至可能让我们在约会应用程序中有一个惊人的匹配,并遇到我们生命中的爱。

所有这些都是人工智能的酷但潜在无害的应用:如果你的语音助手不理解你,你可以打开优步应用程序,自己订购一辆汽车。如果亚马逊向你推荐一本你可能不喜欢的书,一点点研究就能让你抛弃它。如果一个应用程序带你去和一个不适合你的人相亲,你甚至可能会和一个性格令人困惑的人度过一段美好的时光。

然而,当人工智能被用于更严重的任务时,如过滤求职者,发放贷款,接受或拒绝保险请求,甚至用于医疗诊断,事情就变得很糟糕。所有以前的决定,部分由人工智能系统辅助或完全由人工智能系统处理,可以对某人的生活产生巨大的影响。

对于这些类型的任务,必须有争议地研究输入机器学习系统的数据,这些系统是人工智能应用的核心,试图避免使用信息代理:用来替代另一个对某项任务来说更合法和精确但不可用的数据的数据片段。

让我们来看看由机器学习系统自动处理的汽车保险请求的例子:如果在模型中使用邮政编码而不是纯粹的驾驶和支付指标作为变量,生活在贫困和不受重视地区的优秀司机可能会拒绝汽车保险请求。

除了这些代理之外,人工智能系统还依赖于以另一种方式训练它们的数据:在人口的非代表性样本中进行训练,或者对被贴上某种偏见标签的数据进行训练,都会在最终的系统中产生相同的偏见。

我们来看一些源于 AI 的偏差的例子。

Tay:令人不快的推特机器人

tay(Thinking you)是一款 Twitter 人工智能聊天机器人,旨在模仿一名 19 岁美国女孩的语言模式。它是由微软在 2016 年开发的,用户名为 TayandYou ,被放在平台上的目的是与其他用户进行对话,甚至从互联网上传图像和迷因。

在 16 个小时和 96000 条推文之后,它不得不被关闭,因为它开始发布煽动性和攻击性的推文,尽管已经被硬编码为避免某些主题的列表。因为机器人从它的对话中学习,当与之互动的用户开始在推特上发布政治上不正确的短语时,机器人学习这些模式,并开始发布关于某些主题的冲突消息。

机器学习系统从它们看到的东西中学习,在这种情况下,Tay 采用的这种鹦鹉学舌的行为给微软带来了巨大的公开耻辱,以这封信结束,因为他们的 19 岁女孩变成了新纳粹千禧聊天机器人。

在下面的链接中,你可以找到一些 Tay 推文的例子。

[## 以下是微软推特机器人最疯狂的种族主义咆哮

昨天,微软发布了 Tay,这是一个青少年对话的人工智能聊天机器人,旨在模仿用户并与用户实时交谈…

gizmodo.com](https://gizmodo.com/here-are-the-microsoft-twitter-bot-s-craziest-racist-ra-1766820160)

现在,想象一下,如果像这样的聊天机器人不是用于社交网络,而是被用作虚拟心理学家或类似的东西。或者想象一下,机器人开始针对社交媒体中的特定人群进行攻击。对它说话的人可能会受重伤。

谷歌的种族主义图片应用

另一家大型科技公司,这次是谷歌,也有一些关于偏见和种族主义的问题。2015 年,谷歌照片中谷歌图像识别的一些用户收到了应用程序将黑人识别为大猩猩的结果。谷歌为此道歉,并表示图像识别技术仍处于早期阶段,但他们会解决这个问题。你可以在下面的链接中读到所有相关内容。

[## 谷歌通过从其图像标签技术中移除大猩猩来“修复”其种族主义算法

早在 2015 年,软件工程师 Jacky Alciné指出,谷歌照片中的图像识别算法是…

www.theverge.com](https://www.theverge.com/2018/1/12/16882408/google-racist-gorillas-photo-recognition-algorithm-ai)

如果像谷歌这样强大、技术先进的公司会有这种问题,想象一下成千上万的其他企业在没有这种专业知识的情况下创建人工智能软件和应用程序。这很好地提醒了我们,训练人工智能软件保持一致性和健壮性是多么困难。

然而,这不是谷歌在图像和人工智能方面的唯一问题。手持温度计枪已经在整个 COVID 疫情广泛使用,谷歌的云视觉软件(一种用于检测和分类图像中物体的服务)必须快速学习识别这种设备,以便使用包含很少图像的数据集对它们进行正确分类,因为这些设备尽管不是新设备,但最近才为公众所知。

图片来自来源。

上一张图片显示了当一个黑皮肤的人拿着一支温度计枪时,它是如何被归类为枪的,而当一个浅棕色皮肤的人拿着它时,它又是如何被归类为单筒望远镜的。谷歌产品战略和运营总监特雷西·弗雷(Tracy Frey)在这起病毒事件后写道:

“这个结果是不可接受的。认识到这一结果与种族主义之间的联系很重要,我们对这可能造成的任何伤害深感抱歉。”

谷歌解决这一问题的方式是改变云视觉返回枪支或火器所需的置信概率(上图中出现的 61%),然而,这只是人工智能模型结果显示的变化,而不是模型本身,这再次凸显了在许多情况下让这些系统正常运行的困难,特别是在数据很少的情况下。

如果像这样的系统被用来在街上使用监控摄像头定位潜在的有害或可疑的个人,会怎么样?无辜的人可能仅仅因为他们的肤色而成为危险的目标。

最新有偏见的 AI 新闻:

最近,世界上一些顶级人工智能研究人员之间围绕人工智能偏见的话题进行了很多讨论,这些讨论源于论文 “脉冲:通过生成模型的潜在空间探索进行自我监督的照片上采样” 。这个模型使用人工智能将低分辨率图像转换为更高分辨率的图像,如下面的推文所示。

这条推文附有一个谷歌 Colab 笔记本(一个编程环境)的链接,任何人都可以在那里运行代码,并使用不同的图像尝试该模型。这很快导致人们发现 PULSE 似乎偏向于输出白人的图像,让一个具体的用户用巴拉克·奥巴马的像素化图像来响应前一个用户,这被重建成一个白人的图像。

这篇论文的作者对此做出了回应,在论文中增加了一个偏见部分,并包括一个模型卡:一个阐明模型细节的文件,它的目的,用于评估它的指标,训练它的数据,以及不同种族的结果分类,以及一些道德考虑。我认为在构建机器学习模型时创建这种文档是一种很好的实践,应该更频繁地进行。

您可以在下面的链接中找到关于这个主题的讨论和更多信息。

[## 脉冲模型的教训和讨论

在这篇文章中,我将试图总结最近在人工智能研究者中发生的讨论的一些内容,作为…

thegradient.pub](https://thegradient.pub/pulse-lessons/?utm_campaign=The Batch&utm_medium=email&_hsmi=91009266&_hsenc=p2ANqtz-_IIn_r2KtiZQpf3OGgusrmLPCXxkBLdSy-fSEayQeQKgQ-srfey1xs-kuatrzTwvSN-1SZJhWaASQg0Jd0hBiSatpwsw&utm_content=91009266&utm_source=hs_email)

人工智能偏见的其他例子

除了这些在媒体上引起共鸣的案例之外,还有许多其他不太为人所知的案例,这些案例中的模特也有类似的歧视味道。可以为每一个写一节,但是这里我们将简要地提及它们,如果需要的话,允许读者进一步研究。

  • 与男性相比,女性不太可能在谷歌上看到高薪工作的广告。为显示这些而建立的模型增加了个人信息、浏览历史和互联网活动等二手信息。 链接
  • 算法陪审团:使用人工智能预测累犯率 s .一个用于预测个人在被释放后是否会再次犯罪的预测模型(因此用于延长或减少个人的监禁时间)显示了种族偏见,对黑人比对白人更严厉。 链接
  • 优步的 Greyball:逃避世界各地的当局:从优步应用程序收集的数据被用来逃避当地当局,他们试图在法律不允许该服务的国家取缔他们的骑手。这本身并不是偏见的例子,但它将重点放在人工智能可以做什么来歧视某些用户(在这种情况下是警察),以及它如何被用于自私的利益。 链接
  • 最后,对人工智能来说,并不是所有的都是坏消息。以下链接展示了人工智能系统如何减少大学招聘应用中的偏见: 链接

对于这一切,我们能做些什么?

我们已经看到了如果人工智能系统开始显示种族、性别或任何其他类型的偏见会发生什么,但是,我们能做些什么呢?

为了规范这些数学模型,第一步必须从建模者本身开始。当创建这些模型时,设计者应该尽量避免使用过于复杂的数学工具,以免混淆模型的简单性和可解释性。他们应该非常仔细地研究用于构建这些模型的数据,并尽量避免使用危险的代理。

此外,他们应该始终考虑模型的最终目标:让人们的生活更轻松,为社区提供价值,提高我们的整体生活质量,通过商业或学术界,而不是专注于机器学习指标,如准确性或均方差。此外,如果模型是为一个特定的业务建立的,另一个通常的成功标准可能必须放在第二个平面上:经济利润。除了这一利润之外,模型在决策方面的结果也应该被检查:按照我们的保险例子,模型的创建者应该看看谁被拒绝,并试图理解为什么。

随着我们进入一个更加数据驱动的世界,政府可能需要介入,为人工智能模型在金融、保险、医药和教育等特定领域的使用提供公平透明的监管。所有这些都是任何个人生活的基本部分,应该非常小心地对待。

作为人工智能从业者,创建系统的人有责任重新审视他们收集和使用数据的方式。最近的提议为记录模型和数据集设定了标准,以在有害偏见扎根之前将其剔除,使用之前提到的模型卡和类似的数据集系统:数据表。

除此之外,我们应该尝试建立非黑盒的、可解释的模型,审计这些模型,并仔细跟踪它们的结果,花时间手工分析一些结果。

最后,我们可以教育更广泛的社区和公众如何使用数据,可以用它做什么,它会如何影响他们,并让他们透明地知道他们何时被人工智能模型评估。

结论和额外资源

就是这样!一如既往,我希望你喜欢这篇文章,并且我设法帮助你了解更多关于人工智能中的偏见,它的原因,影响,以及我们如何与之斗争。

如果您想了解有关该主题的更多信息,您可以在这里找到一些附加资源:

  • 解决人工智能和自动化中的性别偏见。
  • AI 注定是种族主义者和性别歧视者吗?
  • 人工智能和偏见——IBM 研究
  • 数学毁灭的武器:大数据如何增加不平等并威胁民主,作者凯茜·奥尼尔。

如果你想了解更多关于机器学习和人工智能的知识 关注我上媒 ,敬请关注我的下期帖子!另外,你可以查看 这个资源库 来获得更多关于机器学习和人工智能的资源!

  • 封面图片来自
  • 图标来自 平面图标
  • 所有其他图像都是自己制作的。

机器学习项目中的偏见

原文:https://towardsdatascience.com/bias-in-machine-learning-projects-dbeea0f38466?source=collection_archive---------46-----------------------

我们应该害怕机器学习模型做出的自动化决策不公平吗?

(图片由 Unsplash 上的 Deon Black 拍摄)

引言。

我正在准备一场网上研讨会,在脑海中浮现的众多不同主题中,我在思考哪些主题可能会让我感兴趣。

我认为要成功实现一个机器学习项目,一个人应该真正意识到什么是陷阱,什么是要点,在项目过程中,哪里会犯重要的错误。

一个关注的领域肯定是关于偏差的。为此,我决定投入一些时间,准备以下笔记。

什么是偏见,为什么它很重要?

好吧,先说定义。而我会拿一个来自维基百科:偏见是一个不成比例的权重赞成反对一个想法或事情,通常是以思想封闭、偏见或不公平的方式。…人们可能会对某个人、某个团体或某个信仰产生偏见。在科学和工程领域,偏见是一种系统误差。

因此,我们可以从说偏差是我们的机器学习 (ML)模型中的系统误差开始。

当我们开发一个监督模型时(现在,让我们限制我们对这种类型模型的讨论),给定一组输入 X = (x1,… xn)我们希望能够预测相关 y 的最可能值。我们认为在 X 和 y 之间存在有意义的关系

y = f(X)

我们想要训练一个模型,从一大组例子开始,其中对于每个样本,我们给出输入值(X)和相应的期望值 y。

该模型使用一些非常通用的算法(例如神经网络),但它从训练期间使用的数据中学习所有知识。

通常,在模型的开发过程中,可用数据的一部分被分离出来(保留)用于验证模型。在这个阶段,人们通常想要验证模型是否已经学习了可概括的知识。换句话说,如果它在训练阶段对看不见的数据表现良好。但是,在准备将该模型用于生产之前,在真实世界的数据上,应该进行许多测试来验证该模型是正确的。

我们可能会发现,我们的模型倾向于以系统和不合理的方式对一些样本(可能与人相关)给出有利的预测,而对其他样本给出不太有利的预测。如果我们在生产中使用模型之前发现了这个问题,那就太好了。

一个例子:让我们想象我们已经开发了一个深度学习模型,可以帮助我们诊断黑色素瘤,使用一部分皮肤的图片作为输入。

基于我们的验证集,看起来我们的模型有很好的准确性(90%?),但后来我们开始了一项实地评估研究,我们发现这个模型对深色皮肤的人不太适用。系统地说,这类人群的错误率更高。我们在模型中发现了一个偏差

毫无疑问,这是我们在某个地方犯的一个错误。但这是一个系统性的错误,而不是随机产生的错误。

我们仔细分析了数据收集过程,发现我们的数据集包含更高比例的皮肤白皙的人。很简单,因为众所周知,这些人暴露在阳光下的风险更高(这是风险因素之一)。添加更多来自深色皮肤人群的病变样本有助于提高该亚人群的准确性,并减少我们模型中的偏差。

这与道德规范,与我们认为的公平或不公平有必然联系吗?

这可能是我们想要回答的一个大问题。但这不是唯一的一个。现在,我们可以说是和不是。

让我试着表达我的第一个想法:每次我们制定一个规则,以某种方式区别对待几组人,我们应该问自己这是否公平。答案并不容易,因为对于什么是公平的,什么是不公平的,并没有一个普遍接受的定义。

公平是无法用数学来衡量的(这并不意味着我们不应该提出这个问题,这意味着答案并不容易)。

但是,这里的问题总是看起来更大,因为我们有一种祖传的恐惧,即计算机迟早会代替我们做决定。在故事的最后,ML 模型是做决策的东西。

首先,ML 中偏差的不同来源。

正如在每个科学领域一样,在得出任何结论之前,我们应该收集所有相关的信息(在这个过程中,我们应该不带偏见!).

所以,我们首先应该试着理解偏见从何而来。

ML 模型的开发几乎总是一个漫长的过程,有一系列的步骤。让我们试着做一个总结:

  1. 模型应该回答的问题的定义。
  2. 数据来源的识别
  3. 数据收集
  4. 数据提取、转换
  5. 培训、验证和测试集的生成
  6. 定义我们想要采用的算法类型
  7. 算法的训练
  8. 对训练模型的评估
  9. 模型的部署
  10. 证明文件
  11. 随时监控模型的性能

嗯,大概这不是总结开发过程的唯一方式。但我认为这是支持我们讨论的好理由。

当我们看上面详细描述的步骤时,我们应该想到在每一个步骤中我们都可能犯错误。而且,这些错误中的一些可能会使我们的模型对样本的一个或多个亚群体产生系统误差。

因此,没有任何故意的意图,我们可以在我们的模型中引入偏差。

偏见有哪些不同的类型?

正如我们所说,我们可以在 ML 模型开发的不同步骤中引入偏差,因此我们可以有不同类型的偏差。在识别模型中可能的偏差来源的过程中,进行分类有助于指导我们。

两位研究人员提出了一种有用的分类,在这篇文章中:“理解机器学习模型意外后果的框架”(h . Suresh,J. V. Guttag,麻省理工学院,2020 年 2 月)。

在文章中,他们确定了这六个类别:

  • 历史偏见
  • 表征偏差
  • 测量偏差
  • 聚集偏差
  • 评估偏差
  • 部署偏差

前三个涉及数据生成和收集。模型开发中的最后三个。

它们还提供了一个很好的图表,帮助我们将不同的类别与 ML 模型开发中的不同步骤联系起来:

(来源:H:苏雷什,J. V .古塔格,麻省理工学院,2020 年 2 月,https://arxiv.org/pdf/1901.10002.pdf)

我想对上面的图片补充一些考虑。

  1. 如你所见,我们有不同的,多种来源的偏见
  2. 还有其他引入偏差的方法:例如,当您在训练集和验证集之间拆分可用数据时,如果拆分不正确,您可能会最终在没有正确分布的集上评估和优化模型。或者,您可以从训练中“泄漏”一些信息到验证集,并测量您在现实中找不到的准确性

综上所述,我们必须仔细检查整个过程,以避免偏见。多重测试和测试越来越多的数据是有帮助的,正如我个人的建议,拥有一个拥有不同领域专业知识和背景的团队也是有帮助的。

反馈循环。

与偏差相关的另一个问题是,ML 模型会产生反馈回路

什么是反馈回路?当模型错误地产生“下一代输入数据”,放大偏差,或模型本身产生的一些不正确的预测时,就会出现反馈回路。

让我们试着用一个(有点真实的)例子来解释:想象一下一群人要宣传一个“假理论”。他们制作了一个精美的视频来解释他们的理论。然后,他们在一个社交媒体上发布这个视频,推荐系统只基于用户的评分。这个组的所有人都给这个视频很高的评价。

推荐引擎基于这些评级,将开始向其他人推荐该视频,如果这些人给出更多积极的评级,就有可能开始一个积极的循环,越来越多的人将会看到该视频。

嗯,这个问题不是不真实的。例如,过去曾有文章暗示,YouTube引擎创造了这种东西。我们都知道关于其他社交媒体是否会导致假新闻或仇恨言论传播增加的争论。

一个例子来自《纽约时报》的文章:“(T12)YouTube 掀起了一股阴谋论热潮。能遏制吗?”。

在 arXiv 上可以找到一篇有趣的论文,标题为“推荐系统中的反馈回路和偏差放大”。在这种情况下,产生的偏差可以被称为“流行偏差”:该模型倾向于根据流行度而不是内在质量来推送项目,这种偏差可以通过诸如协作过滤等算法来放大,如本文中所分析的。

模型可解释性。

偏见难以识别的原因之一是有时 ML 模型被用作(神奇的)黑盒。你在验证和测试集上验证了模型有足够高的精度,这就可以了。然后,您忽略了您无法解释为什么模型产生一些预测而不是其他预测(例如,为什么模型决定向一个客户提供贷款是高风险的)。

这是有可能发生的,尤其是当你使用有许多层的大型神经网络时。

但是,即使解释起来很复杂,我们也不应该接受这样的情况。首先,因为这个模型存在一个真实的风险,它包含了错误和偏见。第二,因为如果模型的使用有社会后果,这是不可接受的。第三,因为题目上可能有一些规定。

ML 的一个活跃研究领域是模型可解释性,在过去的几年里,许多技术已经被开发出来,甚至可以用来支持复杂模型的解释。

从一般的观点来看,我们谈论:

  • 一般可解释性,当我们想大体描述模型如何工作时;例如,什么是最重要的特性,什么不是那么重要
  • 局部可解释性:我们想要解释为什么模型已经做了一个单一的、特定的预测(例如对一个病人)

一种用于解释甚至复杂的非线性模型的技术是 LiMe:局部可解释的模型不可知解释,其中我们用线性模型对模型进行局部近似(局部意味着:围绕特定样本),以识别特征变化对预测的影响。例如,请参见https://christophm . github . io/interpretable-ml-book/lime . html

最后一句话,对生活在欧盟的人来说很有趣:有些人倾向于错误地断言 GDPR 定义了“解释权”。这不是真的,这是一个不能简单裁定的问题。

总的来说,在 GDPR 有一篇文章(第 22 号)是关于完全自动化决策的可能性。如果满足三个条件,本条款适用:

  • 有一个完全自动化的决策过程
  • 该流程处理个人数据
  • 它的目标是评估一个自然人的个人方面

在这种情况下,GDPR 禁止完全自动化的决策过程,如果它产生法律效力或如果它对用户的个性有重大影响。

这并不意味着你不能使用 ML 模型,但是,在上面描述的场景中,这个过程需要人工干预(决策过程不能完全由机器做出)。

此外,GDPR 并未规定“解释权”。试图向人们解释一个 ML 模型的内部运作是相当困难的,而且在大多数情况下可能是无效的。但它规定了“知情权”和“反对权”。

最后,如果我们在从事 ML 模型开发的人之间交谈,我们有知识和工具来理解为什么一个模型产生一些决策,因此我们不应该接受一个模型被用作“黑箱”,而不理解它如何工作。

结论。

现在你可能清楚地了解到,ML 模型中的偏倚风险是一个可以分析的问题,如果不消除,这个问题可以大大减少。

关于“自动化决策”模型的采用有很大的担忧,特别是因为大多数人不理解这些模型是如何工作的,他们担心这些决策有偏见和不公平的风险。

但是,我认为,首先,我们应该将偏差视为一种系统误差:作为数据科学家和 ML 工程师,我们应该尽力避免或减少这种误差。然后,我们不应该把一个模型当作一个“暗箱”,总是试图解释决策和结果,看看它们是否有意义。

显然,我们不应该忘记 ML 模型的结果会产生社会和伦理后果。

然而,这类问题不应阻止我们认真考虑采用人工智能可能带来的巨大好处,即使是在社会领域。

更多信息。

如果你想要更多的信息,我会推荐“参考”一节中列出的文章,我已经从中获取了一些信息和图片。

我极力推荐的一本书是参考文献中的那本。第 3 条。这本书的第 3 章由 R. Thomas 博士撰写,包含了对偏见、反馈循环和其他与数据伦理相关的主题的广泛研究。

参考文献。

[1]理解机器学习模型的意外后果的框架,H. Suresh,J. V. Guttag,麻省理工学院,【https://arxiv.org/pdf/1901.10002.pd】T2f

[2]m . Mansoury,H. Abdollahpouri,M. Pechenizkiy,B. Mobasher,R. Burke,https://arxiv . org/pdf/2007.13019 . pdf #:~:text = Recommendation % 20 algorithms % 20 are % 20 know n % 20 to,known % 20 as % 20a % 20 Feedback % 20 Loop。

[3]fastai & py torch、J. Howards 和 S. Gugger 合著的《程序员的深度学习》,O'Reilly,2020 年。

[4]可解释的机器学习,https://christophm.github.io/interpretable-ml-book/

原载于 2020 年 11 月 9 日https://luigisaeta . it

自然语言处理中的偏见:一个危险但可以解决的问题

原文:https://towardsdatascience.com/bias-in-natural-language-processing-nlp-a-dangerous-but-fixable-problem-7d01a12cf0f7?source=collection_archive---------19-----------------------

自然语言处理(NLP)模型面临的最大新问题之一是它们学习的隐含偏见。

自然语言处理(NLP)是机器学习研究的最大领域之一,尽管当前的语言机器学习模型在许多语言理解任务上实现了数值上的高性能,但它们通常缺乏减少隐式偏差的优化。

马库斯·斯皮斯克在 Unsplash 上的照片

让我们从头开始。

机器学习模型中的偏见是什么?本质上,这是当机器学习算法表达隐含的偏差时,这些偏差在测试过程中经常未被检测到,因为大多数论文测试他们的模型的原始准确性。以下面这些表达性别偏见的深度学习模型为例。根据我们的深度学习模型,

  • “他是医生”比“她是医生”的可能性更高[ 来源
  • 男人对于女人就像电脑程序员对于家庭主妇一样。[ 来源 ]
  • 有女性名词的句子更能表示愤怒。[ 来源
  • 翻译“他是一名护士。她是一名医生”变成匈牙利语,再回到英语的结果是“她是一名护士”。他是医生。”[ 来源

在这些例子中,该算法本质上是表达刻板印象,这不同于诸如“男人对女人就像国王对王后一样”的例子,因为国王和王后有字面上的性别定义。国王被定义为男性,女王被定义为女性。电脑程序员没有被定义为男性,家庭主妇也没有被定义为女性,所以“男人对女人就像电脑程序员对家庭主妇一样”是有偏见的。

除了性别偏见之外,其他形式的偏见在我们的模型中也很突出。以下是一些其他形式的偏见的例子:

  • 根据机器学习模型,黑人对于罪犯就像白人对于警察一样。[ 来源
  • 根据机器学习模型,合法对于基督教就像恐怖分子对于伊斯兰教一样。[ 来源
  • 非裔美国人写的推文更有可能被人工智能标记为攻击性的。[ 来源

如果你和我一样,你可能会想:但是如果机器没有情感,它们怎么会有偏见呢?

关键是机器学习模型在数据中学习模式。假设我们的数据倾向于将女性代词放在单词“护士”周围,将男性代词放在单词“医生”周围我们的模型将学习这些模式,并了解护士通常是女性,医生通常是男性。呜呜。不是我们自己的错,我们无意中训练我们的模型认为医生是男的,护士是女的。

那么,如何解决这个问题呢?像许多问题一样,自然语言处理中的偏见可以在早期或晚期解决。在这种情况下,早期阶段将对数据集进行去偏置,后期阶段将对模型进行去偏置。

流行的计算机视觉数据集 Tiny Images 在发现该数据集充满社会偏见后被撤回。图片来自(Torralba 等人,2008 年)。

解决方案 A:去偏数据集。为了取得成功,我们首先必须删除包含偏见的现有数据集。例如,麻省理工学院最近撤销了一个名为 Tiny Images 的流行计算机视觉数据集,因为它充满了社会偏见,包括种族主义,厌恶女性和贬低的标签。这并不意味着我们不能使用这些数据集,但这意味着我们应该删除它们并编辑它们以解决偏见。类似地,必须检查新的数据集以考虑偏差。到目前为止,对 debias 数据集最一致的方法是使数据集多样化。例如,如果数据集始终将女性代词放在单词“护士”周围,则可以通过添加护士是男性的数据来消除偏见。

解决方案 B:去偏模型。这是通过修改单词的实际矢量表示来实现的。例如,硬 Debias 算法和双硬 Debias 算法修改向量表示以移除定型信息(例如“接待员”和“女性”之间的联系),同时保留有用的性别信息(例如“女王”和“女性”之间的联系)。这些算法显示了有希望的结果,并且肯定是解决 NLP 偏差的好的一步。

我们还有时间解决偏见吗?尽管 NLP 作为一个领域发展迅速,但解决 NLP 模型中的偏见永远不会太迟。然而,无论我们如何解决这些偏见问题,我们仍然必须尽可能早地解决它们,最好是在模型达到真实世界设置之前。这是一个没有抓住偏见的例子,一个有偏见的模型最终被应用到现实世界,并产生了巨大的影响:

COMPAS 是一个在各州使用的人工智能系统,旨在预测犯罪者是否有可能再次犯罪。然而,该系统被证明对非裔美国人有隐性偏见,预测非裔美国人的假阳性数量是白种人的两倍。因为这种隐含的偏见在系统部署之前没有被发现,许多非裔美国人被不公平和不正确地预测会再次犯罪。

由丹尼斯·简斯在 Unsplash 上拍摄的照片

COMPAS 是一个帮助执法部门识别低风险和高风险罪犯的人工智能,结果证明它对非洲裔美国人有明显的偏见。图片获取自ProPublica,发现这些偏见的组织。

NLP 中的偏见是一个必须尽快解决的紧迫问题。让有偏见的模型进入现实世界的后果是巨大的,好消息是解决 NLP 偏见的方法的研究正在迅速增加。希望通过足够的努力,我们可以确保深度学习模型可以避免隐含偏见的陷阱,并确保机器能够做出公平的决定。

延伸阅读:

  • 这组研究人员有一堆关于 NLP 中偏见的论文。
  • ProPublica 关于 COMPAS 系统中的偏见的完整文章。

偏差、方差以及它们与欠拟合、过拟合的关系

原文:https://towardsdatascience.com/bias-variance-and-how-they-are-related-to-underfitting-overfitting-4809aed98b79?source=collection_archive---------9-----------------------

我在学习一门课程时遇到了偏差、方差、欠拟合和过拟合这些术语。这些条款似乎令人望而生畏,网上的文章也无济于事。尽管与它们相关的概念很复杂,但术语本身却很简单。下面我将以一种易于理解的方式给出上述术语和偏差-方差权衡的简要概述。

艾萨克·史密斯在 Unsplash 上拍摄的照片

假设您有一个分类模型、训练数据和测试数据

x_train , y_train // This is the training data
x_test , y_test // This is the testing data
y_predicted // the values predicted by the model given an input

误差率是模型预测值与正确值的平均误差。

偏见

假设我们已经对模型进行了训练,并尝试使用输入“x_train”来预测值。预测值为 y_predicted。偏差是 y_predicted 和 y_train 的误差率。

简而言之,可以将偏差视为训练数据的错误率。

当错误率高时,我们称之为高偏差,当错误率低时,我们称之为低偏差

差异

假设我们已经对模型进行了训练,这次我们尝试使用输入“x_test”来预测值。同样,预测值是 y_predicted。方差是 y _ 预测和 y _ 测试的误差率

简单地说,把方差看作是测试数据的错误率。

当错误率高时,我们称之为高方差,当错误率低时,我们称之为低方差

欠拟合

当模型在训练数据中具有高错误率时,我们可以说该模型是欠拟合的。这通常发生在训练样本数量过低的时候。由于我们的模型在训练数据上表现不佳,因此在测试数据上也表现不佳。

因此,训练数据中的高错误率意味着高偏差

简单地说,高偏差意味着拟合不足

过度拟合

当模型在训练数据中的错误率较低,但在测试数据中的错误率较高时,我们可以说模型过拟合。这通常发生在当训练样本的数量太高或者超参数已经被调整以在训练数据上产生低错误率时。

想想一个学生,他研究了一组问题,然后进行了一次模拟考试,其中包含了他们所研究的那些问题。他们可能在模拟考试中表现出色,但在包含看不见的问题的真实考试中,他们不一定表现出色。如果学生在模拟考试中得了 95%,但在真实考试中得了 50%,我们可以称之为过度适应。

因此,训练数据中的低错误率意味着低偏差,而测试数据中的高错误率意味着高方差

简单地说,低偏差和高方差意味着过度拟合

回归中的过度拟合和欠拟合

来源:https://sci kit-learn . org/stable/auto _ examples/model _ selection/plot _ under fitting _ over fitting . html

在第一张图中,我们尝试使用线性方程来拟合数据。这个模型很死板,一点也不灵活。由于线性方程的灵活性低,它不能预测样本(训练数据),因此错误率高,偏差大,这反过来意味着欠拟合。这个模型在看不见的数据上表现不好。

在第二张图中,我们使用了一个 4 次方程。该模型足够灵活,可以正确预测大多数样本,但也足够严格,可以避免过度拟合。在这种情况下,我们的模型将能够在测试数据上做得很好,因此这是一个理想 模型

在第三张图中,我们使用 15 次方程来预测样本。虽然它能够预测几乎所有的样本,但它有太多的灵活性,将无法在看不见的数据上表现良好。这样一来,它在测试数据时会有很高的错误率。由于它在训练数据中差错率低(低偏倚),在训练数据中差错率高(高方差),所以是过拟合

分类中的过拟合、欠拟合

假设我们有三个模型(模型 A、模型 B、模型 C ),训练和测试数据的错误率如下。

+---------------+---------+---------+---------+
| **  Error Rate**  | **Model A** | **Model B** | **Model C** |
+---------------+---------+---------+---------+
| **Training Data** |   30%   |    6%   |    1%   |
+---------------+---------+---------+---------+
|  **Testing Data** |   45%   |    8%   |   25%   |
+---------------+---------+---------+---------+

对于模型 A,训练数据的错误率太高,因此测试数据的错误率也太高。它有一个高偏差和高方差,因此它是欠拟合的。这个模型在看不见的数据上表现不好。

对于模型 B,训练数据的错误率低,测试数据的错误率也低。它具有低偏差和低方差,因此是一个理想模型。该模型将在看不见的数据上表现良好。

对于模型 C,训练数据的错误率太低。然而,测试数据的错误率也很高。它具有低偏差和高方差,因此它是过拟合。这个模型在看不见的数据上表现不好。

偏差-方差权衡

来源:https://medium . com/@ prvnk 10/bias-variance-trade off-ebf 13 ADC ea 42

当模型的复杂度太低时,即一个简单的模型,该模型将不能在训练数据或测试数据上很好地执行,因此它是欠拟合的

在最佳点上,该模型在训练数据和测试数据上的错误率较低,因此是理想的模型

随着模型复杂性的增加,该模型在训练数据上表现良好,但在测试数据上表现不佳,因此过拟合

感谢您阅读文章。请让我知道我是否犯了任何错误或有任何误解。总是乐于收到反馈:)

我最近用 WordPress 创建了一个博客,如果你能看看的话,我会很高兴的😃

[## Python 项目教程-使用这些 Python 项目教程改进您的简历/作品集。

使用 Streamlit 共享部署您的机器学习 Web 应用程序在我以前的文章中,我谈到过构建一个…

realpythonproject.com](https://realpythonproject.com/)

看看我关于准确度、回忆、精确度、F1 分数和混淆矩阵的教程

[## 理解准确性、回忆性、精确性、F1 分数和混淆矩阵

这篇文章还包括显示你的困惑矩阵的方法

towardsdatascience.com](/understanding-accuracy-recall-precision-f1-scores-and-confusion-matrices-561e0f5e328c)

在 LinkedIn 上与我联系

[## Rahul baner JEE——产品工程实习生——EY | LinkedIn

查看 Rahul Banerjee 在世界上最大的职业社区 LinkedIn 上的个人资料。拉胡尔有 4 个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/rahulbanerjee2699/)

偏差方差分解

原文:https://towardsdatascience.com/bias-variance-decomposition-d0e22d1506b1?source=collection_archive---------34-----------------------

使用 mlxtend 库演示偏差和方差权衡的实际实现

迈克·冯在 Unsplash 上的照片

我们经常想知道如何从一堆机器学习方法中选择一种方法,为给定的数据集提供最好的结果。

“为特定问题陈述选择具有适当复杂性的最佳模型的过程称为模型选择”

这给我们带来了统计学习方法的一个非常重要的属性,称为偏差方差权衡,它强调模型在训练数据集中学习关联的程度。

在本文中,我们将讨论什么是偏差和方差,以及如何减少它们。最后,我们将实现几个实际的例子来看看这些概念是如何应用于模型构建的。

那么,我们开始吧。

由于偏离实际真相,预测中有 3 种类型的误差:

  1. 不可约误差
  2. 偏置
  3. 差异

不可约误差是对数据中固有噪声的度量。可能总会有一些预测因素对目标变量有一些小的影响,并且不是我们模型的一部分。

因此,无论我们选择多好的模型,它都不能完美地逼近实际函数,从而留下无法减少的误差。

因此,让我们关注我们在构建模型时可以控制的内容,即偏差和方差以及如何控制。

为此,我们将使用' mlxtend '库(由 Sebastian Raschka 开发)来计算 'bias_variance_decomp' 。

偏差:

偏差是指当模型学习的近似函数对于非常复杂的问题来说微不足道时的误差,从而忽略了预测器和目标之间的结构关系。

高偏差导致拟合不足和较高的训练误差。可以通过向模型增加更多信号来减少,即,如果我们可以添加更好地描述与目标变量关联的特征。

让我们看下面的例子:

我们假设好像所有的特性都不能立刻可用,并按照其贡献的顺序(来自 df_feat)一次引入一个特性。从下面的图表可以明显看出,以较高的方差为代价,偏差显著下降

添加功能以降低偏差

但是如果我们在模型中已经有了全面的特征,也就是说,没有从商业知识中引入额外的特征,但是偏差仍然很高,该怎么办呢?在这种情况下,我们需要改进建模空间,即使用能够更好地理解数据中结构细微差别的算法。

差异:

方差是模型学习的近似函数在不同训练集之间差异很大的程度。高方差导致过度拟合

当模型的复杂程度增加时,它开始通过学习微小的波动来拟合数据,甚至是随机噪声的程度。

由于模型在训练数据中学习到一些偶然存在的模式,而这些模式并不是数据的真实属性,因此在测试数据中可能不存在类似的模式。这导致较低的训练误差,但是非常高的测试集误差

正则化方法通常用于控制方差。

在上述示例中,我们将 lasso 模型(正则化参数设置为 0.05)中的方差与线性回归中的方差进行了比较,观察到方差减少了 7.5%

variance Reduction: -7.53%
At the expense of introducing bias: 5.87%

剪枝常用于正则化决策树。

我们观察到通过修剪树,方差减少了 62 %

variance Reduction: -62.01%
At the expense of introducing bias: 118.32%

让我们看看当我们在 K 最近邻算法中增加邻居数量时,偏差和方差会发生什么变化

由于越来越多的邻居决定输出,这导致了具有更低方差和更高偏差的更简单的模型。

高 k 值导致 KNN 中的高偏差和低方差

权衡:

我们看到,为了减少一个误差,我们最终增加了另一个误差,这是不可取的。那么,我们如何减少偏差和方差。是否可以实现?

答案是肯定的!

这两个误差项不以线性方式变化;因此,预测误差取决于两者的相对变化率。

集成和交叉验证是克服偏差方差困境的常用方法。

让我们来看看,与单一决策树相比,随机森林如何在不增加太多偏差的情况下减少 82%的方差

variance Reduction: -82.29%
At the expense of introducing bias: 10.73%

Jupyter 笔记本可以在这里找到。

偏差-方差权衡:360 度视角

原文:https://towardsdatascience.com/bias-variance-trade-off-a-360-degree-view-86648f69f8?source=collection_archive---------37-----------------------

你需要知道的关于偏差、方差和权衡的一切。

来源 (pxfuel — royaltyfree)

大多数从事机器学习的人都听过“偏差-方差权衡”这个短语。但我在采访或与 ML 或数据科学工程师讨论时观察到,我们大多数人甚至不清楚上述短语中的偏差和方差是什么意思,忘记理解权衡吧。

在本文中,我将使用两种方法来解释“偏差”、“方差”和“偏差-方差权衡”——第一种方法将参考日常生活中的例子进行概念性解释,以便即使没有数据科学或统计背景的普通人也能理解它,第二种方法将使用一点数学知识(统计、代数、概率等)。)来强化解释。这两种方法将齐头并进。

偏差和方差:

第一种方法:“普通人!”

我们将使用著名的牛眼类比来解释偏差和方差这两个术语。

根据资料来源改编的偏差和方差图解:http://scott.fortmann-roe.com/docs/BiasVariance.html

让我们假设牛眼(黄点)是我们想要预测的真实值(目标)。我们开始玩(预测),投了几次飞镖(蓝点)。想象 X 轴和 Y 轴穿过中心,如图所示。每个蓝点将有 x 和 y 坐标;将绿点视为所有蓝点的平均值。通俗地说,我们可以说平均来说,我们击中了绿点。绿点(平均预测值)和黄点(真实值)之间的距离称为“偏差”。

而蓝点(预测)在绿点(预测的平均值)周围的分散程度称为“方差”。

用正式的话来说,

偏差:估计值的平均值与真实平均值的差异量。

方差:预测围绕其均值的预期方差。

第二种方法:“数学观”

让我们在数学和建模的光芒下看看。

假设,一个模型

y = f(x)+ɛ

其中“X”是自变量,Y 是目标或因变量。ɛ(ε)是均值为零的随机误差项。

考虑我们要预测' y '的值,f̂(f-hat)代表 f 的估计值,ŷ(y-hat)代表它对应的' y '值。

ŷ=f̂(x)

正如我们看到的,y 是 x 和'ɛ'的函数,ŷ的精度取决于 f̂和ɛ.f̂的精度可以提高,因此它被称为“可约误差”,但是由于“ɛ”引起的误差不能被减少,因为它与“x”无关,因此它被称为“不可约误差”。

设,E()代表期望值或平均值。因此,下面的表达式表示实际值和预测值之间的平方差的平均值或期望值

作者照片

我们正在测量预期的预测误差——EPE。如果我们以如下所示的均方误差 MSE 为例。

作者照片

x0 处的 MSE 可以写成:

作者照片

其中“T”是训练数据集。所以,EPE 变成了

作者照片

在很多地方,我们会看到它被直接写成,

作者照片

这是真的,但这个结果是如何得出的,几乎没有人谈论或解释。让我们尝试更深入地了解一下(可以跳过,但为了更好地理解,建议看一看)如果不感兴趣,请直接跳到“但是取舍在哪里?”

派生:

作者照片

让我们加上 f(x0),

作者照片

只是,ŷ0 依赖于“t”训练数据集。因此,我们可以用(a+b) = a +b +2a.b 改写上述等式,如下所示

作者照片

让我们来看第一项,因为它独立于 T,所以可以写成

作者照片

第二个量可以写成

作者照片

这可以进一步分解,如

第一学期,

第二任期,

最后一个学期,

把这些放回到上面的等式中,我们看到,第一项抵消了第三项,第二项抵消了第四项,因此主等式中的中间项= 0。

现在主方程的最后一项,

进一步扩展它,

而且,我们知道

把这个放回我们得到的原始方程中,

如果我们记得,根据偏差和方差的定义

因此,我们得到最终等式——

(作者供图)

但是取舍在哪里呢?

正如我们所见,偏差更有可能是由于预测模型或函数的简化——f̂.所以,如果我们增加模型的复杂度,它就会降低。这听起来是一个好主意,增加复杂度,减少偏差,从而减少 EPE,但没有这么快。“差异”中还有另一个术语。

权衡:我来了!

从上面的模型中可以明显看出,为了减少误差,我们需要最小化方差和偏差,,但是问题是这些术语相对于模型复杂性的相反行为。

让我们举一个 K 近邻的例子来更好地理解它。我假设我们知道 K-最近邻算法,所以不去深入它的细节。

K-nn 插图(作者照片)

但是对于那些不知道的人来说,这个算法的基础是预测一个点的值,我们看它最近的 k 个点,然后取这 k 个最近点的平均值。这意味着成为该点的预测值。例如,如果 k = 2,点‘P6’值可以通过它的邻居 p4、p10 来预测。

第一招:“庶人!”

具有 P11 实际值的 K-nn(作者提供照片)

让我们取模型复杂性的两个极端——仅基于“k”的值,看看它对偏差和方差的影响。我们有一个实际值为 5.8(蓝色)的新点“p11”,我们想预测它的值。

先说最简单的模型 K=10。

总共有 10 个点,因此‘p11’的值将是所有点的平均值,如下图绿色‘p11’所示。

K=10 的 K-nn(最简单的模型)(作者供图)

直观上,我们可以看到考虑所有的点是不好的。如果我们有 3 岁或 5 岁的数据,那么在预测 30 岁左右的人的价值时考虑这些数据是没有意义的。让我们看看偏差和方差有什么说法!

偏差:我们可以直接看到这里的偏差非常高(记住偏差的定义)。

方差:假设点“11”在年龄= 40 时,即使在给定模型下,11 的预测值也不会改变,因为我们考虑了所有的点。所以这是方差= 0 的完美场景。

现在我们取 K = 1。

K = 1 的 K-nn(复杂模型)(作者供图)

偏差:将点 3 的值作为最接近的值。这里看起来好多了(我知道不是最好的例子,但你可以考虑另一个例子,如房价和轴是位置和价格)。与距离较远的点相比,距离最近的点更有意义。

方差:假设点 11 在 32 岁,那么最接近的点应该是 9,因此新的预测值应该与当前值有很大不同。因此,它具有很高的方差。

此外,直觉上,测量最亲近的人的身高是没有意义的。因此这种模式也是不好的。

最佳点位于两者之间的某个地方,我们考虑足够多的近点,这样我们可以捕捉到邻域中的不同变化,但同时不会捕捉到所有随机的远点或噪声。

我希望在直觉层面上,它有助于理解偏差-方差权衡。现在,让我们转向数学,来真实地了解它。

第二种方法:“数学观”

回想一下我们的预期预测误差(EPE)公式,

(作者供图)

对于 K-最近邻,它将变成,

(作者供图)

因此,我们可以看到,增加“K”会减少方差,因为“K”是分母,而偏差会增加。

如果我们绘制偏差、方差和总误差与模型复杂性的关系,我们将得到下图。

偏差方差权衡(最优模型复杂度)(作者提供图片)

因此,我们看到最佳点将是,相对于复杂性的偏差梯度等于相对于复杂性的方差梯度,符号相反。因为如果我们向右移动到这一点,偏差的减少小于方差的增加,这被称为过拟合,如果你向左移动,反之亦然,这被称为 欠拟合

从人类的角度来看,我总是喜欢将过度拟合与孩子记忆教科书中给出的数学解决方案但不理解它联系起来——因此,如果问题来自教科书(训练数据集),他/她可以完美地回答,但如果问题来自外部(看不见的测试数据集),他/她就不会表现得那么好。同时,如果你没有学习公式(太基础的模型),没有解决教科书上的大量问题,你将无法解决教科书上的问题以及测试中的问题,因为你没有足够的知识。最重要的是理解概念,记住基本公式,然后练习。

我希望所有这些都有意义,与阅读本文之前相比,偏差-方差及其权衡现在更加清楚了。

参考文献:

[1]Trevor Hastie、Robert Tibshirani 和 Jerome Friedman,统计学习的要素:数据挖掘、推理和预测 (2008)

[2]Gareth James,Daniela Witten,Trevor Hastie,和 Robert Tibshirani,统计学习的介绍及其在 R (2013) 中的应用

[3]Scott Fortman-Roe,了解偏差-方差权衡(2012)

偏差-方差权衡

原文:https://towardsdatascience.com/bias-variance-tradeoff-7ca56ba182a?source=collection_archive---------39-----------------------

在建立机器学习模型之前,请阅读此内容。

paweczerwi ski 在 Unsplash 上的照片

一些事实只是在我们的脑海中混乱,然后很难回忆起什么是什么。在回忆偏差和方差之间的差异时,我也有过类似的经历。你在这里的事实表明你也被这些条款弄糊涂了。

所以让我们来理解什么是偏差和方差,什么是偏差-方差权衡,以及它们如何在机器学习中发挥不可避免的作用。

偏见

让我问你一个问题。为什么人类会有偏见呢?或者是什么促使他们时不时地表现出一些偏见?

我敢肯定你有一个好答案或许多好答案。但是总结一下,我们看到身边偏见的最根本原因是——心态的放松。

作为人类,我们很容易将我们的思想和偏好倾向于我们喜欢的,我们钦佩的,或者我们认为正确的东西,而不会使我们的思想弯曲太多。

对于我们生活中的大部分决定,我们不想让我们的大脑去分析每一个场景。现在,一个人可能会在做重要且有结果的事情时进行调查,一丝不苟,或相当系统化,但在大多数情况下,我们懒得这样做。

但是这种人类的偏见直觉和机器学习有什么关系呢?让我们来了解如何。

考虑下图。

图片来自 Sangeet Aggarwal

人们很容易猜测这个数字代表了简单线性回归,这是一个不灵活的模型,假设输入和输出变量之间存在线性关系。这个假设、近似和限制偏差引入到这个模型中。

因此偏差指的是使用简单(或限制性)模型近似复杂问题时观察到的误差。

人类和机器之间的这种类比可以很好地理解 不灵活会带来偏见

观察下图。这些图代表了用于拟合相同数据的两种不同模型。你认为哪一个会导致更高的偏差?

图片由 Sangeet Aggarwal

右边的情节比左边的灵活得多。它与数据更加吻合。另一方面,左边的图表示拟合不佳的模型,该模型假设数据中存在线性关系。这种由于偏高造成的拟合不良也被称为 欠拟合 。欠拟合会导致较差的性能和较低的精度,如果需要,可以通过使用更灵活的模型来纠正。

让我们总结一下关于偏见的要点:

  • 当使用限制性(不灵活)模型来解决复杂问题时,会引入偏差
  • 随着模型灵活性的增加,训练数据的偏差开始减小。
  • 偏差会导致拟合不足,进而导致性能和预测不佳。

那么如何才能摆脱这种偏见呢?我们可以建立一个更灵活的模型来拟合我们的数据,并消除拟合不足。

那么,我们是否应该继续构建更复杂的模型,直到将误差降至最低?让我们试着用一些随机生成的数据来做这件事。

图片由 Sangeet Aggarwal

现在花几秒钟时间观察这些图,看看如何增加我们的模型的复杂性来训练相同的数据,减少偏差和拟合不足,从而减少训练误差。

  • 图 1 显示了限制性最强的模型,即我们前面看到的线性模型。这个模型中的偏差肯定是最高的。
  • 图 2(多项式回归)是一条更平滑的曲线,进一步减少了训练误差,因此显示出比线性模型更小的偏差。
  • 图 3 显示了 K=9 的 K-最近邻(KNN)模型,该模型能够比前两个模型更准确地对数据进行分类。
  • 图 4,K=1 的 KNN 模型,密切跟踪数据,几乎没有错误分类任何样本。与所有以前的模型相比,它给出了最少的偏差和欠拟合。

那么,你会选择这四个中的哪一个来解决你的问题呢?

如果你选择了图 4,这是我们很多人都想做的,那么你最有可能遭受 高方差的诅咒。

方差

假设你要参加一个你讨厌的科目的考试。你理解这些概念有困难,所以为了通过考试,你决定一个字一个字地学习,而不是真正关心为什么要写,写什么。现在,你可能会在考试前给你的朋友留下深刻印象,如果他问你课本上的同样的问题。但是你很可能会在考试中表现很差,如果万一问题与你预期的不一样,或者如果它们要求你使用一些逻辑而不是记忆。

在机器学习中,当一个模型在训练数据集上表现得如此之好,以至于它几乎记住了每一个结果时,它在运行测试数据集时可能表现得非常糟糕。

这种现象被称为 过拟合 ,通常在构建非常复杂和灵活的模型时观察到。

图片由 Sangeet Aggarwal 提供

那么什么是 方差

方差是我们的模型在不同数据集上进行预测时必须改变的量。

让我们简化上面的陈述→如果我们用它来估计看不见的数据的输出,我们的模型不应该产生高误差。也就是说,如果模型在训练数据集上显示出好的结果,但是在测试上显示出差的结果,则称其具有高方差

因此,好的模型不是只在训练数据集上表现良好的模型。它应该能够在任何其他数据集上产生良好的结果。这么说吧,你不会想制造一辆只能在班加罗尔街道上行驶良好的自动驾驶汽车,而一旦离开城镇,就会显示太多错误。

因此,构建一个非常复杂的模型可能会以过度拟合为代价。一个人必须明白 过多的学习会带来高方差

让我们来看看关于方差的一些关键点。

  • 方差是模型在对未知数据进行预测时需要改变的量。
  • 高方差相当于模型过拟合。
  • 线性回归等限制性模型显示低方差,而更复杂、更灵活的模型会引入高方差。

困惑

那么我们如何消除偏差和方差呢?看起来解决一个会导致另一个溜进来。

我们看到,限制模型会在训练时导致高偏差和欠拟合。另一方面,增加其灵活性会导致方差和过度拟合。

解决方法是什么?

偏差-方差权衡

重要的是要记住,在建立机器学习模型时,一些偏差和一些差异将始终存在。偏差和方差都会增加模型的总误差。

为了最小化可约误差(偏差+方差),我们必须找到两者之间的最佳点,偏差和方差都有最小可能值。这被称为偏差-方差权衡。这更多的是预测准确性(方差)和模型可解释性(偏差)之间的权衡。

这就是偏差和方差。我希望这篇文章能帮助你理解这些术语。不断学习应用。敬请关注。

偏差-方差权衡如何影响机器学习算法

原文:https://towardsdatascience.com/bias-variance-tradeoff-e8995c42b55b?source=collection_archive---------21-----------------------

偏差-方差权衡的直观解释

监督机器学习算法试图根据历史数据预测未来的观察值。在构建模型时,我们理想地想要一个模型,它不仅能准确地捕捉不规则性,还能概括样本外的数据。不幸的是,通常不可能同时做到这两点。当我们试图平衡这两者时,偏差-方差权衡就出现了。理解偏差-方差分解在衡量预测模型性能中的重要性是极其重要的。

简而言之,由于偏差和方差导致的预测误差有助于我们建立一个模型,该模型在训练数据(用于训练模型的数据)和测试数据(模型先前未发现的数据)上表现良好。

什么是偏见?

关于反应和预测变量之间真实潜在关系的假设引入了偏差。当我们的假设接近真实关系时,偏差较小。但是如果我们对真实的关系做一个过于简化的假设,就会导致很大的偏差。

我前天写了一份试卷,但我不知道试卷将如何出题。我认为考试会很容易(引入了偏见)。我只是对每一章做了一个概述,假设试卷会有选择题,我会从选项中得到帮助。

原来,这份论文是主观的,有 3 个基于概念的论文问题。猜猜我考试的表现?很糟糕!!

为什么?因为假设它是容易的仍然是好的,但是假设它将是 MCQ 格式引入了高偏差并且导致了差的结果。

我们希望避免对真实模式做出过于简化的假设,以避免高偏差。

线性回归被认为是高偏倚的,因为我们假设真实的关系是线性的。不幸的是,现实世界中的大多数统计关系都不是线性的。但是,由于可解释性,线性回归在某些情况下通常是首选。

什么是方差?

如果我们不断给模型提供更多的参数,以便更好地学习训练数据,模型最终也会学习随机噪声。学习随机噪声会降低模型对看不见的数据进行归纳的能力。这会导致过度拟合和高方差。这变得有问题,因为当您使用两个不同的训练集来估计一组参数时,来自这些训练集的参数估计相差很大,从而导致高方差。

我哥哥讨厌数学!!他一步一步地把课本上的所有问题都抢过来了,却没有理解其中的概念。正因为如此,他在他的老师(老师推荐了这本书,并要求学生彻底解决)设置的班级测试中表现出色。然而,期末考试是由一位资深数学教授设计的,没有一个问题是直接从书上来的。你猜怎么着?

他把事情搞砸了!!

上面的例子是一个纯粹的过度拟合的例子。你能很好地学习你所看到的东西,从而表现出色。但是只要纸样稍有变化,你就搞砸了。

下图是实际数据拟合曲线的图示(过度拟合和欠拟合的实例)。蓝点代表观察值,红色曲线是我们估计的 x 和 y 之间的统计关系。

让我们看另一个例子,并尝试更深入地理解这个问题,即偏差和方差如何影响精度和准确度。目标是击中靶心的著名镖靶例子:

低偏差、低方差:高精度(击中目标)、高精度(始终如一)

低偏差,高方差:高精度(击中目标),低精度(不一致)

高偏差、低方差:低精度(偏离目标)、高精度(始终如一)

高偏差、高方差:低准确度(偏离目标)、低精确度(不一致)

机器学习算法面临类似的情况,我们需要在偏差和方差之间进行权衡,以使我们的模型准确和通用。它是关于实现模型可解释性和模型复杂性之间的折衷。像线性回归这样的模型是高度可解释的,而具有更精确结果的神经网络就像一个黑盒。

下面的图表将给出偏差和方差如何影响模型误差的估计。

找到一个最佳模型就是找到正确的平衡。

参考资料:

[1]http://scott.fortmann-roe.com/docs/BiasVariance.html

[2]https://towards data science . com/understanding-the-bias-variance-trade off-165 e 6942 b229

[3]https://www . quora . com/What-is-high-bias-and-high-variance-in-machine-learning-terminals-in-simplely-terms

偏差-方差权衡-机器学习的基础

原文:https://towardsdatascience.com/bias-variance-tradeoff-fundamentals-of-machine-learning-64467896ae67?source=collection_archive---------37-----------------------

模型容量和预测方差的权衡如何控制机器学习设计?

偏差-方差权衡是机器学习的基本设计决策。这是模型容量和预测方差之间的权衡——所以我们必须决定 我们的模型在哪个方面会是错误的 。本文将从主题上解释这种权衡如何与没有免费的午餐相关,并展示如何从概率分布中产生切换。

所有的模型都是错的,但有些是有用的——乔治·博克斯

资料来源——作者,哥斯达黎加 Playa Hermosa。

没有免费的午餐

每当一个优化、程序或算法在一个感兴趣的领域获得了信息或专门化,它就会在其他地方失去能力。不付出就无法获得任何东西,这一观点就是“没有免费的午餐”定理。这是机器学习主题和偏差-方差权衡的关键思想。

目标空间上的可能分布。没有一个模型可以在任何地方都达到完美的准确性——能力的分布是不同的。从最大到最小的指定顺序是绿色、黄色、红色、蓝色。

作为分布的模型准确性

将模型精度映射到目标空间上的概率密度函数是一个很好的心理模型。它告诉我们一个事实,任何模型的积分——任何分布——必须等于 1,或者是设计空间中的某个常数。在左边,我已经描绘了不同的模型如何预测目标空间。

神经网络的容量

没有免费的午餐定理也适用于神经网络。在这种情况下,当我们有一个容量有限(有限层,神经元)的网络时,我们的预测能力是有限的。改变设定网络上的训练方法,改变输出的焦点。一个网络的总容量是有限的,即精度曲线的积分是常数。一个模型可以在一个领域(特定的测试分布)获得准确性,但是在其他领域会失去能力。

在训练网络时,工程师通常会寻求测试误差的最小化,或者何时对未知的预测最准确。在未知元素上最大化预测是平坦化预测准确度的分布(覆盖范围越大,特异性越低)。

[## 搜索和优化领域没有免费的午餐

在计算复杂性和最优化中,没有免费的午餐定理是这样一个结果,即对于某些类型…

en.wikipedia.org](https://en.wikipedia.org/wiki/No_free_lunch_in_search_and_optimization)

设计决策是特异性对普遍性。这在数字上如何继续?

偏差方差权衡

同样,有用的机器学习模型的核心是模型的底层结构和下游预测中产生的变化之间的反向权衡。从数字上看,我们引入的这种关系被称为偏差-方差权衡。

数字上

预测模型的符号。

如果我们观察预测值“f-hat”对数据集的准确性,就会发现一个有用的等式。考虑模型拟合如何不同于真实数据, f ,加上噪声,ε — ( y = f + ε )。

预测值的平均误差(MSE)。

这里所发生的是通过概率规则和公理,我们推导出数值偏差-方差权衡。首先,模型的偏差和方差的定义。

偏差:模型结构与训练集的匹配程度。

偏见模型结构。查看下面的等式,偏差是数据集上模型的平均值与真实值之间的差异。想一想,当对来自未知 (m,b) y=mx+b 的噪声数据拟合直线时,我们可以添加偏移或斜率等项,以更接近数据。一个 y=cxy =c 的模型将远离真实的、始终高的偏置。但是增加像 y=cx+d+ex 这样的项可能会降低偏差,但代价是。

方差:模型因所用数据的微小变化而改变的程度。

方差在模型中带有不确定性。 x 的一个小变化会对预测产生多大的改变?再次考虑最后一个例子。有偏解 y=cxy =c 会随着 x 的扰动而发生非常小的变化。但是,当我们添加高阶项来进一步降低偏差时,方差风险会增加。直观地说,我们可以在方程中看到这一点,因为我们有了新的项,它是期望中模型的平方(左)。右边的项将一个均值项与方差联系起来,以说明偏移量。

经过几个步骤(省略),我们得到了我们想要的方程。这里的推导是(维基百科)。注意,σ是原始函数噪声(ε)的标准差。

偏差方差权衡。

这里发生的是——无论模型如何改变,偏差和方差项将具有相反的关系。在训练数据集 D 上有一个误差最小化的点,但是不能保证数据集 100%反映真实世界。

一个例子

考虑一个例子,我们试图将数据点拟合到一个模型,source — Wikipedia 。

采样数据和真实函数。

底层函数(红色)采样时带有噪声。然后,我们想用近似法来拟合采样点。使用径向基函数构建模型(蓝色,如下)。从左到右,模型获得术语和容量(多行,因为多个模型在数据的不同子集上被训练)。很明显,左边的模型具有更高的偏差——结构相似,但数据点之间的差异很小。向右,方差增加。

不同的模型适合。从左到右,模型中使用的术语越来越多。每个模型在采样点的不同子集上训练。这是偏差-方差权衡的可视化。来源— 维基百科。

模型的这种变化就是偏差方差权衡。

含义

机器学习是创造智能代理的科学,这些智能代理从训练分布归纳到新数据。ML 系统做出预测。这种权衡存在于每个部署的系统中,因为真实世界是未知的。作为一名机器学习工程师,重要的是要记住你可能在模型中部署了太多的特异性——特别是如果它可能有挥之不去的道德决策(例如,对群体的偏见)。

更多?订阅我关于机器人、人工智能和社会的时事通讯!

[## 自动化大众化

一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…

robotic.substack.com](https://robotic.substack.com/)

机器学习模型中的偏差-方差权衡:一个实例

原文:https://towardsdatascience.com/bias-variance-tradeoff-in-machine-learning-models-a-practical-example-cf02fb95b15d?source=collection_archive---------20-----------------------

了解模型误差以及如何改善它。

布雷特·乔丹在 Unsplash 上的照片

在监督机器学习中,目标是建立一个高性能的模型,该模型善于预测手头问题的目标,并且以低偏差和低方差来进行预测。

但是,如果你减少偏差,你最终会增加方差,反之亦然。这就是偏差-方差权衡发挥作用的地方。

在这篇文章中,我们将研究在机器学习模型的上下文中偏差和方差意味着什么,以及您可以做些什么来最小化它们。

为了建立一个有监督的机器学习模型,你需要一个看起来有点像这样的数据集。

监督学习中使用的数据集结构。

这是一系列的数据记录,每一个都有几个特征和一个目标,就是你要学会预测的东西。但是在开始构建模型之前,您需要将数据集分成两个不同的子集:

  • 训练集
  • 测试设备

您通常会随机选择 20%的数据记录,并将其作为测试集,剩下 80%的数据集用于训练模型。这通常被称为 80/20 分割,但这只是一个经验法则。

对训练和测试集的需求

训练集和测试集有不同的目的。

训练集教导模型如何预测目标值。至于测试集,顾名思义,它用于测试学习的质量,如果模型擅长预测学习过程中使用的数据之外的数据。

通过测试集,您将看到该模型是否能将其预测推广到训练数据之外。

我们可以用以下方法来衡量这个过程中两个阶段(学习和预测)的质量:

  • 训练错误,
  • 测试误差,也称为泛化误差。

好的模型具有低的训练误差。但是你必须小心,不要把训练误差压得太低,以至于模型过拟合训练数据。当模型过度拟合数据时,它会完美地捕获训练集的模式,从而成为仅预测训练集结果的专家。

乍一看,这听起来很棒,但它有一个缺点。如果模型擅长预测训练集中的目标,它就不太擅长预测其他数据。

偏差-方差权衡

为了理解这种权衡,我们首先需要看看模型的误差。在实践中,我们可以将模型误差分成三个不同的部分。

模型误差=不可约误差+偏差+方差

不可约误差与偏差和方差无关。但是后两者是反向相关的,每当你降低偏差,方差就会增加。就像训练误差和测试误差一样。

不可约误差

这个误差是建立模型的机器学习工程师无法控制的。这是由数据中的噪声、不代表数据中真实模式的随机变化或尚未作为特征捕获的变量的影响所导致的错误。

减少这类错误的一种方法是识别对我们正在建模的问题有影响的变量,并将它们转化为特征。

偏置

偏差是指捕捉数据集中真实模式的能力。

简单模型(左)与复杂模型(右)的偏差。

它在数学上表示为预期的预测目标值和真实目标值之间的平方差。

所以,当你有一个无偏的模型时,你知道平均预测值和真实值之间的差异是零。并且它被平方以更重地惩罚离目标的真实值更远的预测。

具有高偏差的模型会使数据欠拟合。换句话说,它将采用一种简单化的方法来模拟数据中的真实模式。

但是一个低偏差的模型比它应该的更复杂。它会过度适应它用来学习的数据,因为它会尽可能多地捕捉细节。因此,除了训练数据之外,它在概括方面做得很差。

你可以通过观察训练误差来发现偏差。当模型具有高训练误差时,这是高偏差的迹象。

为了控制偏差,您可以添加更多的特征并构建更复杂的模型,始终在数据的欠拟合和过拟合之间找到平衡。

差异

方差捕获每个数据记录的预测范围。

具有高(左)和低(右)方差的模型中的预测范围。

这是一个衡量每个预测与该测试集记录的所有预测的平均值相差多远的指标。并且它也被平方以惩罚离目标的平均预测更远的预测。

即使您构建的每个模型输出的预测值略有不同,您也不希望这些预测值的范围很大。

您还可以通过查看测试误差来发现模型中的差异。当模型具有高测试误差时,这是高方差的标志。

减少差异的一种方法是使用更多的训练数据来构建模型。该模型将有更多的实例可供学习,并提高其概括预测的能力。

例如,如果无法用更多的训练数据构建模型,您可以构建一个包含bootstrap aggregation的模型,通常称为 bagging。

降低方差的其他方法包括减少特征的数量,使用特征选择技术,以及使用像主成分分析这样的技术来降低数据集的维度。

现在让我们看看这是怎么回事

我创建了一个随机数据集,它遵循系数为-5,-3,10 和 2.5 的四次多项式,从最高到最低。

因为我们要用模型来拟合这些数据,所以我把它分成了训练集和测试集。训练数据是这样的。

从随机数据生成的四次多项式的训练集。

dataset_size = 5000# Generate a random dataset and that follows a quadratic distribution
random_x = np.random.randn(dataset_size)
random_y = ((-5 * random_x ** 4) + (-3 * random_x ** 3) + 10 * random_x ** 2 + 2.5 ** random_x + 0.5).reshape(dataset_size, 1)# Hold out 20% of the dataset for training
test_size = int(np.round(dataset_size * 0.2, 0))# Split dataset into training and testing sets
x_train = random_x[:-test_size]
y_train = random_y[:-test_size]x_test = random_x[-test_size:]
y_test = random_y[-test_size:] # Plot the training set data
fig, ax = plt.subplots(figsize=(12, 7))# removing to and right border
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)# adding major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)
ax.scatter(x_train, y_train, color='#021E73’)plt.show()

我们可以从检查模型的复杂性如何影响偏差开始。

我们将从简单的线性回归开始,逐步用更复杂的模型来拟合这些数据。

适合训练数据的简单线性回归模型。

# Fit model
# A first degree polynomial is the same as a simple regression linelinear_regression_model = np.polyfit(x_train, y_train, deg=1)# Predicting values for the test set
linear_model_predictions = np.polyval(linear_regression_model, x_test) # Plot linear regression line
fig, ax = plt.subplots(figsize=(12, 7))# removing to and right border
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)# adding major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)
ax.scatter(random_x, random_y, color='#021E73')plt.plot(x_test, linear_model_predictions, color='#F2B950', linewidth=3)plt.show()

这种类型的模型肯定太简单了,它根本不遵循数据的模式。

我们将量化该模型与训练和测试误差的拟合,使用均方误差计算,并查看偏差和方差。

简单线性回归模型的度量。

# A few auxiliary methods
def get_bias(predicted_values, true_values):
*""" Calculates model bias****:param*** *predicted_values: values predicted by the model* ***:param*** *true_values: true target values for the data* ***:return****: integer representing the bias of the model**"""*return np.round(np.mean((predicted_values - true_values) ** 2), 0)def get_variance(values):
*""" Calculates variance of an array of values****:param*** *values: array of values* ***:return****: integer representing the variance of the values**"""*return np.round(np.var(values), 0)def get_metrics(target_train, target_test, model_train_predictions, model_test_predictions):*"""
Calculates
1\. Training set MSE
2\. Test set MSE
3\. Bias
4\. Variance* ***:param*** *target_train: target values of the training set* ***:param*** *target_test: target values of the test set* ***:param*** *model_train_predictions: predictions from running training set through the model* ***:param*** *model_test_predictions: predictions from running test set through the model* ***:return****: array with Training set MSE, Test set MSE, Bias and Variance**"""*training_mse = mean_squared_error(target_train, model_train_predictions)test_mse = mean_squared_error(target_test, model_test_predictions)bias = get_bias(model_test_predictions, target_test)variance = get_variance(model_test_predictions) return [training_mse, test_mse, bias, variance]# Fit simple linear regression model
# A first degree polynomial is the same as a simple regression linelinear_regression_model = np.polyfit(x_train, y_train, deg=1)# Predicting values for the test set
linear_model_predictions = np.polyval(linear_regression_model, x_test)# Predicting values for the training set
training_linear_model_predictions = np.polyval(linear_regression_model, x_train)# Calculate for simple linear model
# 1\. Training set MSE
# 2\. Test set MSE
# 3\. Bias
# 4\. Variancelinear_training_mse, linear_test_mse, linear_bias, linear_variance = get_metrics(y_train, y_test, training_linear_model_predictions, linear_model_predictions)print('Simple linear model')
print('Training MSE %0.f' % linear_training_mse)
print('Test MSE %0.f' % linear_test_mse)
print('Bias %0.f' % linear_bias)
print('Variance %0.f' % linear_variance)

让我们看看使用复杂模型是否真的有助于降低偏差。我们将对该数据进行二阶多项式拟合。

拟合训练数据的二次多项式模型。

二次多项式减少偏差是有意义的,因为它越来越接近数据的真实模式。

我们也看到了偏差和方差之间的反比关系。

二次多项式模型的度量。

#############################
# Fit 2nd degree polynomial #
############################## Fit model
polynomial_2nd_model = np.polyfit(x_train, y_train, deg=2) # Used to plot the predictions of the polynomial model and inspect coefficients
p_2nd = np.poly1d(polynomial_2nd_model.reshape(1, 3)[0])
print('Coefficients %s\n' % p_2nd)# Predicting values for the test set
polynomial_2nd_predictions = np.polyval(polynomial_2nd_model, x_test)# Predicting values for the training set
training_polynomial_2nd_predictions = np.polyval(polynomial_2nd_model, x_train)# Calculate for 2nd degree polynomial model
# 1\. Training set MSE
# 2\. Test set MSE
# 3\. Bias
# 4\. Variancepolynomial_2nd_training_mse, polynomial_2nd_test_mse, polynomial_2nd_bias, polynomial_2nd_variance = get_metrics(y_train, y_test, training_polynomial_2nd_predictions, polynomial_2nd_predictions)print('2nd degree polynomial')
print('Training MSE %0.f' % polynomial_2nd_training_mse)
print('Test MSE %0.f' % polynomial_2nd_test_mse)
print('Bias %0.f' % polynomial_2nd_bias)
print('Variance %0.f' % polynomial_2nd_variance)# Plot 2nd degree polynomial
fig, ax = plt.subplots(figsize=(12, 7))# removing to and right border
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)# Adding major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)x_linspace = np.linspace(min(random_x), max(random_x), num=len(polynomial_2nd_predictions))plt.scatter(random_x, random_y, color='#021E73')
plt.plot(x_linspace, p_2nd(x_linspace), '-', color='#F2B950', linewidth=3)plt.show()

当我们再次将模型的复杂度增加到三次多项式时,我们看到偏差略有改善。但是方差又增加了。

拟合训练数据的三次多项式模型。

剧情变化不大,但是看指标就清楚了。

三次多项式模型的度量。

#############################
# Fit 3rd degree polynomial #
#############################print('3rd degree polynomial')# Fit model
polynomial_3rd_model = np.polyfit(x_train, y_train, deg=3)# Used to plot the predictions of the polynomial model and inspect coefficientsp_3rd = np.poly1d(polynomial_3rd_model.reshape(1, 4)[0])print('Coefficients %s' % p_3rd)# Predict values for the test set
polynomial_3rd_predictions = np.polyval(polynomial_3rd_model, x_test)# Predict values for the training set
training_polynomial_3rd_predictions = np.polyval(polynomial_3rd_model, x_train)# Calculate for 3rd degree polynomial model
# 1\. Training set MSE
# 2\. Test set MSE
# 3\. Bias
# 4\. Variancepolynomial_3rd_training_mse, polynomial_3rd_test_mse, polynomial_3rd_bias, polynomial_3rd_variance = get_metrics(y_train, y_test, training_polynomial_3rd_predictions, polynomial_3rd_predictions) print('\nTraining MSE %0.f' % polynomial_3rd_training_mse)
print('Test MSE %0.f' % polynomial_3rd_test_mse)
print('Bias %0.f' % polynomial_3rd_bias)
print('Variance %0.f' % polynomial_3rd_variance) # Plot 3rd degree polynomial
fig, ax = plt.subplots(figsize=(12, 7))# removing to and right border
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)# Adding major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)x_linspace = np.linspace(min(random_x), max(random_x), num=len(polynomial_3rd_predictions))
plt.scatter(random_x, random_y, color='#021E73')
plt.plot(x_linspace, p_3rd(x_linspace), '-', color='#F2B950', linewidth=3)plt.show()

总结这个实验,我们可以真正看到偏差-方差权衡的作用。随着我们增加模型的复杂性,偏差不断减少,而方差增加。

实验结果总结。

希望你在建立机器学习模型时,对偏差和方差的作用有了更好的理解。

感谢阅读!

机器学习中的偏见

原文:https://towardsdatascience.com/biases-in-machine-learning-61186da78591?source=collection_archive---------14-----------------------

ML 模型中引入偏差的最常见原因

不管你喜欢与否,机器学习对你生活的影响正在非常迅速地增长。机器学习算法决定了你是否会获得梦想中的房子的抵押贷款,或者你的简历是否会入围你的下一份工作。它也在迅速改变我们的劳动力。机器人正在接管仓库和工厂,无人驾驶汽车正威胁着世界各地数百万职业司机的工作。甚至执法机构也越来越多地使用机器学习来筛选潜在的犯罪线索和评估风险。

由莱尼·屈尼在 Unsplash

不幸的是,所有这些技术进步可能会延续并加剧困扰我们社会的偏见。在算法偏差的早期例子中,从 1982 年到 1986 年,每年有 60 名女性和少数民族被圣乔治医院医学院拒绝入学,因为一个新的计算机指导评估系统根据录取的历史趋势拒绝了具有“听起来像外国名字”的女性和男性入学。或者更近一些,在 2016 年,由微软在 Twitter 数据上训练的聊天机器人 TayTweets 开始发表种族主义的推文。

所有这些进步都提出了非常有效的问题,即机器学习从业者如何确保他们的算法公平。什么是公平是一个古老的问题。令人欣慰的是,在这一领域已经进行了大量的研究。在这篇文章中,我将谈论当你试图确保你的机器学习模型没有偏见时,你可能会遇到的最常见的问题。

代表名额不足

机器学习算法中偏差的最常见原因之一是训练数据缺少代表不足的组/类别的样本。这就是为什么 Siri 经常很难理解有口音的人。这也导致了著名的谷歌照片事件,黑人被标记为大猩猩。因此,确保训练数据能够代表所有代表性不足的群体是非常重要的。另一种早期轻松检测的方法是部署第二种算法,该算法预测生产中的数据是否接近训练数据,如果不是这样,则早期干预。

通过推特

社会反馈循环

最近一篇关于他们开创性语言模型的 OpenAI 论文发现“一般来说,职业被男性性别识别符追随的概率比女性高”。在媒体上有很多例子,模型继承了训练数据中的偏差。有实验得出结论,高薪招聘广告只给男人看,或者白人社区的房屋广告只给白人看。基于来自互联网的文本数据训练的各种语言模型倾向于给女性或有色人种附加负面含义。发生这种情况,是因为我们现有的社会偏见反映在训练数据中。在大多数情况下,这种偏见很难纠正,因为很难获得无偏见的数据。缓解这种情况的一个简单策略是找到代表边缘化群体的正面历史数据的数据点,并在训练数据中对这些记录进行上采样。

相关字段

确保数据不针对敏感属性进行训练的一个常见解决方案是从训练数据中完全移除这些特征。但是仍然可能存在相关的属性,这些属性可能导致模型歧视服务水平低下的社区。例如,邮政编码可能与种族相关,而姓名可能与种族和性别相关,等等。人们经常观察到,在简历上训练的机器学习模型学会更重视男性名字而不是女性名字。一项亚马逊研究发现“贾里德”这个名字非常适合进入工作候选名单。

忽略敏感属性

在某些情况下,盲目地从训练数据中移除敏感属性特征甚至可能会造成伤害。例如,女性不太可能造成事故,因此在一些地方,使用性别来确定保险报价是合法的。在累犯研究中,发现女性不太可能再次犯罪。在弱势类别实际上比主导类别做得更好的情况下,最好将这作为一个特征包含在训练数据中。

偏差的过度补偿

这不太可能是一个问题,但在这里补充这是全面的。假设你的模型根据个人的信用评分决定是否向其提供贷款,如果个人偿还了贷款,其评分就会增加,否则就会减少。你的长期目标是提高人口的平均信用评分。在这种情况下,为了弥补偏见,您可能需要更改门槛,为特定人群批准更多贷款。但如果你过度补偿,以至于违约数量高于成功还款的数量,这部分人的平均信用评分可能会下降,最终伤害他们。谷歌提供了一个名为 ml-fairness-gym 的库,可以帮助模拟在机器学习模型中实施公平的长期效果。

艾伦·图灵说如果一台机器被期望是不会犯错的,它也不可能是智能的。但是,每天,社会基础设施的另一个关键部分是在没有任何法律制衡的情况下,将“人工智能”添加到其决策过程中。各种偏见很容易溜进机器学习模型,除非你极其谨慎。此外,我们的法律体系还没有跟上新技术的步伐,新技术继续深刻地影响着我们的生活。因此,现在,研究这些模型的人有责任确保这些模型是公平的,没有偏见的。

幸运的是,研究人员正在关注这个问题以及类似机器学习模型的可解释性等相关问题。

  • 谷歌的 Tensorflow 有“公平指标”来检测你的模型中的偏差
  • 微软研究院成立了一个 FATE (公平、问责、透明和道德)小组,研究人工智能的社会影响
  • IBM 开源了 AI fairness 360 工具来帮助你构建无偏见的模型
  • 刘等人的论文“公平机器学习的延迟影响”获得 2018 最佳论文奖。

但是这些工具远远不够或完美。这一领域非常需要更严格的工具和研究。技术既有好的一面,也有坏的一面。这是技术创造者的责任,以确保他们的产品为我们所有人创造一个更美好的世界。我真的很喜欢 Kate Crawford 在 NIPS 2017 上的这个著名的演讲,她呼吁行业在理解人工智能的社会影响方面投入更多。

https://xkcd.com/1277/

机器理解的双向注意流模型

原文:https://towardsdatascience.com/bidirectional-attention-flow-model-for-machine-comprehension-d533f5600007?source=collection_archive---------34-----------------------

使用 BiDAF 回答问题

深入研究 BiDAF 模型

问题回答一直是自然语言处理的主要工作领域。我将讨论并实施一篇在质量保证相关问题上表现出色的研究论文的关键要素。那么,我们在问答中做什么呢?给我们一个上下文,并根据该上下文进行查询。模型的任务是找到问题的准确答案。答案可能在上下文中,也可能不在上下文中。如果它存在,那么这个任务可以被公式化为一个分类问题,如果它不存在,那么我们就转向一个更加困难的文本生成问题。但是对于所有这些,我们需要一个好的特征向量,它包含来自上下文和查询的信息以及它们之间的关系。

我将要谈论的论文是 Minjoon Seo 等人的机器理解的双向注意力流。我们将主要讨论架构的技术部分,并将按顺序实现这些部分。总的来说,这里主要是用较少的文本编写代码。下面给出的是 BiDAF 的架构。

来源:https://allenai.github.io/bi-att-flow/BiDAF.png

如图所示,模型中的文本表示首先使用字符级嵌入层,然后使用单词级嵌入,如 Glove 或 Word2vec。最后,将两种表示连接在一起,得到最终的表示。为了简单起见,我们只能在代码中使用单词级的手套嵌入。

一旦我们获得文本序列中每个单词的向量表示,我们将在双向 LSTM 层中馈送该序列,以获得良好的上下文表示。图中没有显示的一个重要的东西是高速公路网。因为我在以前的博客中没有提到过这个术语,所以在进入实现部分之前,我们将简单讨论一下。

公路网络

想象一个具有非常深的结构的网络,包括 NN 层的多个堆叠。使用梯度下降很难优化深度较大的模型。此外,如果使用多个堆栈,由于绝对值小于 1 的变量相乘过多,会出现信息丢失。因此,将模型的深度增加到某一点之后,并不会使之前的结果受益。

受 LSTMs 的启发,提出了高速公路网络,其中使用门控机制将信息直接传播到下一层(因此出现了术语高速公路)。其结构如下所示:

来源:https://miro . medium . com/max/1120/1 * qHf _ ahv 8 yjjskqok4k S4 jw . png

引入了一个变换门 T,它只是一个神经网络,后面跟着一个 sigmoid 激活。这意味着变换门将产生一个概率,该概率与当前层的输出相乘,并传播到下一层。线性门,C 无非是 1-T,是与当前层的输入相乘,传入下一层的概率。高速公路网络的一种变体,残差网络,其中 C 和 T 都等于 1,用于微软著名的图像分类模型 ResNet。结果表明,对于复杂问题,现在可以使用高速公路网络建立一个包含数百个图层的模型。

在这篇博客中,我们还将为每个双向 LSTM 使用高速公路网络,以实现强大的信息流。

相似矩阵

通常,注意力机制用于概括查询的上下文向量。但是在这里,通过使用上下文和查询表示来计算共享的相似性矩阵,而不是为查询计算单个关注,计算两个方向上的关注,即,上下文 2 查询和查询 2 上下文,以最大化信息增益。相似矩阵是形状为 TxJ 的矩阵,其中 T 是上下文的序列长度,J 是查询的序列长度。这两种关注度都可以通过共享的相似度矩阵来计算。整个计算机制如下图所示:

可以看出,为了计算 S_ij,输入为 C_i 和 Q_j,计算公式如下:

其中[;]是跨行的连接操作,[o]是逐元素的乘法操作,W_ij 是大小为[1×3 * dim]的可训练权重向量。

上下文 2 查询和查询 2 上下文注意

Context2Query Attention 表示每个上下文单词在查询句子中的重要单词。这意味着 Context2Query 的形状应该是[TxJ],这可以通过按行取相似性矩阵的 softmax 来实现:

C2Q = Softmax(S,axis=-1)

有人参与的查询,AQ = C2Q。查询,shape=[Txdim],[。=矩阵乘法]

Query2Context Attention 表示每个查询单词在上下文句子中最相似的单词。这是通过首先从相似性矩阵中取出最大元素,然后对其应用 softmax 来获得的。因此,最终输出是形状= [Tx1]的概率向量。

参与上下文= Q2C t 上下文,shape=[1xdim]

最终参与上下文,AC = tile(参与上下文,T),shape = [Txdim]

合并操作

该操作用于组合由注意力 C2Q 和 Q2C 获得的信息。合并操作将原始上下文(OC)、参与查询和参与上下文作为输入,并给出如下所示的最终表示:

Merge(OC,AQ,AC)=[OC;AQ;AQ 主管;OC o AC],其中[;]是按行连接,[o]是按元素乘法。

合并层为我们提供了一个 shape = [T x 4 * dim]的输出,它可以进一步用于输入另一组双向 LSTMs,后跟一个 softmax,以获得答案的开始和结束概率。开始和结束概率是给定段落中答案的开始和结束索引的概率。正如前面所讨论的,只有答案在段落中,开始和结束概率的概念才会起作用。如果没有,我们已经将最终的表示提供给一个解码器,使它成为一个序列生成问题。

喔!我没有遵守我的承诺,保持讨论简短,主要集中在编码部分😀。无论如何,让我们现在做一些 PYTHONING 化的工作(Google 的 Meena 告诉了我这个单词)。

相似矩阵

**class** **SimilarityMatrix**(keras**.**layers**.**Layer):

    **def** **__init__**(self,dims, ******kwargs):
        self**.**dims **=** dims
        super(SimilarityMatrix, self)**.**__init__(******kwargs)

    **def** **similarity**(self, context, query):
        e **=** context*****query
        c **=** K**.**concatenate([context, query, e], axis**=-**1)
        dot **=** K**.**squeeze(K**.**dot(c, self**.**W), axis**=-**1)
        **return** keras**.**activations**.**linear(dot **+** self**.**b)

    **def** **build**(self, input_shape):
        dimension **=** 3*****self**.**dims
        self**.**W **=** self**.**add_weight(name**=**'Weights',
                                shape**=**(dimension,1),
                                initializer**=**'uniform',
                                trainable**=**True)

        self**.**b **=** self**.**add_weight(name**=**'Biases',
                                shape**=**(),
                                initializer**=**'ones',
                                trainable **=**True)

        super(SimilarityMatrix, self)**.**build(input_shape)

    **def** **call**(self, inputs):
        C, Q **=** inputs
        C_len **=** K**.**shape(C)[1]
        Q_len **=** K**.**shape(Q)[1]
        C_rep **=** K**.**concatenate([[1,1],[Q_len],[1]], 0)
        Q_rep **=** K**.**concatenate([[1],[C_len],[1,1]],0)
        C_repv **=** K**.**tile(K**.**expand_dims(C, axis**=**2),C_rep)
        Q_repv **=** K**.**tile(K**.**expand_dims(Q, axis**=**1), Q_rep)

        **return** self**.**similarity(C_repv, Q_repv)

    **def** **compute_output_shape**(self, input_shape):
        batch_size **=** input_shape[0][0]
        C_len **=** input_shape[0][1]
        Q_len **=** input_shape[1][1]
        **return** (batch_size, C_len, Q_len)

    **def** **get_config**(self):
        cofig **=** super()**.**get_config()
        **return** config

Context2Query 查询注意

**class** **Context2QueryAttention**(keras**.**layers**.**Layer):
    **def** **__init__**(self, ******kwargs):
        super(Context2QueryAttention, self)**.**__init__(******kwargs)

    **def** **build**(self, input_shape):
        super(Context2QueryAttention, self)**.**build(input_shape)

    **def** **call**(self, inputs):
        mat,query **=** inputs
        attention **=** keras**.**layers**.**Softmax()(mat)
        **return** K**.**sum(K**.**dot(attention, query), **-**2)

    **def** **compute_output_shape**(self,input_shape):
        mat_shape, query_shape **=** input_shape
        **return** K**.**concatenate([mat_shape[:**-**1],query_shape[**-**1:]])

    **def** **get_config**(self):
        config **=** super()**.**get_config()
        **return** config

查询 2 上下文

**class** **Query2ContextAttention**(keras**.**layers**.**Layer):
    **def** **__init__**(self, ******kwargs):
        super(Query2ContextAttention, self)**.**__init__(******kwargs)

    **def** **build**(self, input_shape):
        super(Query2ContextAttention, self)**.**build(input_shape)

    **def** **call**(self, inputs):
        mat,context **=** inputs
        attention **=** keras**.**layers**.**Softmax()(K**.**max(mat, axis**=-**1))
        prot **=** K**.**expand_dims(K**.**sum(K**.**dot(attention,context),**-**2),1)
        final **=** K**.**tile(prot, [1,K**.**shape(mat)[1],1])
        **return** final

    **def** **compute_output_shape**(self,input_shape):
        mat_shape, cont_shape **=** input_shape
        **return** K**.**concatenate([mat_shape[:**-**1],cont_shape[**-**1:]])

    **def** **get_config**(self):
        config **=** super()**.**get_config()
        **return** config

大合并

**class** **MegaMerge**(keras**.**layers**.**Layer):
    **def** **__init__**(self, ******kwargs):
        super(MegaMerge, self)**.**__init__(******kwargs)

    **def** **build**(self, input_shape):
        super(MegaMerge, self)**.**build(input_shape)

    **def** **call**(self, inputs):
        context, C2Q, Q2C **=** inputs
        CC2Q **=** context*****C2Q
        CQ2C **=** context*****Q2C
        final **=** K**.**concatenate([context, C2Q, CC2Q, CQ2C], axis**=-**1)
        **return** final

    **def** **compute_output_shape**(self, input_shape):
        C_shape,_,_ **=** input_shape
        **return** K**.**concatenate([C_shape[:**-**1], 4*****C_shape[**-**1:]])

    **def** **get_config**(self):
        config **=** super()**.**get_config()
        **return** config

高速公路

**class** **HighwayLSTMs**(keras**.**layers**.**Layer):
    **def** **__init__**(self, dims, ******kwargs):
        self**.**dims **=** dims
        super(HighwayLSTMs, self)**.**__init__(******kwargs)

    **def** **build**(self, input_shape):
        self**.**LSTM **=** keras**.**layers**.**Bidirectional(keras**.**layers**.**LSTM(self**.**dims, return_sequences**=**True))
        super(HighwayLSTMs, self)**.**build(input_shape)

    **def** **call**(self, inputs):
        h **=** self**.**LSTM(inputs)
        flat_inp **=** keras**.**layers**.**Flatten()(inputs)
        trans_prob **=** keras**.**layers**.**Dense(1, activation**=**'softmax')(flat_inp)
        trans_prob **=** K**.**tile(trans_prob, [1,2*****self**.**dims])
        trans_prob **=** keras**.**layers**.**RepeatVector(K**.**shape(inputs)[**-**2])(trans_prob)
        out **=** h **+** trans_prob*****inputs
        **return** out

    **def** **compute_output_shape**(self, input_shape):
        **return** input_shape

    **def** **get_config**(self):
        config **=** super()**.**get_config()
        **return** config

现在唯一剩下的事情就是将这些片段应用到一个人的用例中。我希望我没有让你厌烦(当然没有,如果你正在读这一行的话)。

结果和结论

我们现在已经讨论了 BiDAF 模型的各个部分的技术方面和实现。现在,让我们通过一个例子来说明这种注意力机制是如何为一个特定的问题找到答案的。

在上图中,给出的方块是两个问题的注意力矩阵可视化。矩阵的每一列表示段落中的上下文单词,而每一行表示问题向量中的单词。块越粗,它的注意力权重就越大。在块 1 中,可以清楚地看到,对于问题中的单词“Where”,给予单词“at,the,stadium,Levi,In,Santa,Ana”更多的权重。甚至它可以把焦点放在问号“?”上这其中涉及到更多的“倡议”二字。

从结果的角度来看,BiDAF 在 SQUAD、CNN/DailyMail 数据集上进行了测试,结果如下:

参考文献

如果你想阅读更多的主题,没有什么比研究论文本身更好的了。

  1. 比达夫:https://arxiv.org/pdf/1611.01603.pdf
  2. 公路网:https://arxiv.org/abs/1505.00387

我希望你喜欢这个博客,如果你对我有任何建议或者你想联系,你可以点击下面的链接:

领英:https://www.linkedin.com/in/spraphul555/

现在是签名的时候了,

不断学习,不断分享

原载于 2020 年 2 月 8 日https://spraphul . github . io

大数据:人类学视角

原文:https://towardsdatascience.com/big-data-an-anthropological-perspective-3bdc2f0ea9c5?source=collection_archive---------25-----------------------

为什么大数据和定性研究应该结合的人类学论证。

Adobe 股票

作为一名从事混合方法研究的商业人类学家,我支持使用定性和定量方法,包括大数据。但是,我不支持只使用大数据。

当通过多种方法产生的研究和洞见可以相互加强和验证时,它们是最好的。

但在行业中,似乎存在一个包裹着大数据的神话,尽管大数据实践往往无法产生预期的投资回报。

为了理解这一现象,我们从人类学的角度来看一下大数据。

什么是大数据

如果要讨论大数据,首先要说明什么是数据。在本次对话中,数据被定义为以二进制形式收集和存储的数字数据,以供定制或商业算法进行分析。

通常情况下,数据是大型数据集的一部分,具有难以置信的多样性,并且收集速度非常快,这在十年前是无法想象的。这些属性被总结为 3v(数量、多样性和速度)。

但是从这个意义上来说,大并不等同于理解的深度,尽管许多被收养者相信它会。

大数据问题:投资回报率

在 2017 年 2 月, Gartner 估计全球商业智能和分析市场将达到 183 亿美元,然而,根据 NewVantage Partners 的研究,只有 37%试图成为数据驱动的公司取得了成功。

大数据格局

尽管 NewVantage Partners 的调查结果显示,软件和服务的全球大数据市场收入预计将从 2018 年的 400 亿美元增加到 2027 年的 1030 亿美元,根据 Wikibon 的数据,复合年增长率(CAGR)将达到 10.48%。

根据埃森哲的一项研究,79%的企业高管认为不接受大数据的公司将失去竞争地位,并可能面临灭绝。因此,83%的公司已经开始实施大数据项目以获取竞争优势。

大数据成功

大数据的支持者将收集、分析和应用洞察力的学科和方法描述为信息革命。

这导致大数据计划在广泛的私营和公共部门实施,例如业务流程优化、以需求为导向的能源供应、市场和趋势预测、揭露非法金融交易、预测性警务、通过分析人口疾病增强健康研究、癌症研究以及软件支持的医疗诊断。

在这些应用中,大数据已经被证明非常擅长展现数据之间的相关性。通过发现不同疾病症状之间的相互关系和探索药物的副作用,这已被证明在卫生部门非常有用。

大数据神话

然而,批评者指出,大数据并不像一些热情的采纳者认为的那样,是我们所有问题的解决方案。像任何其他技术一样,大数据是一种文化创新,有其自身的特点,同样,也必须如此看待它。

与任何技术一样,我们的文化塑造了它,正如它塑造了我们的文化一样。同样,在讨论大数据时,我们需要注意我们的信念和动机,因为它们是由社会塑造的,无论是好是坏。

为此,正如博伊德和克劳福德所指出的,我们需要尊重大数据是一种“基于技术、分析和神话相互作用的文化、技术和学术现象”。

这并不是说大数据在社会中没有地位。当然有关系。但是像任何文化结构一样,大数据有它自己的神话,我们需要意识到它如何影响我们。

我们必须认识到,通过采用大数据神话,我们塑造了我们如何看待和理解问题和解决方案空间。这适用于个体从业者以及整个社会。

正如布鲁诺·拉图尔所说:“改变工具,你将改变与之相适应的整个社会理论。”

大数据的未来是什么?

大数据的未来肯定是越来越多的采用,因为它涉及量化,即使它不会产生预期的 ROI。

作为一名商业人类学家,我痛苦地意识到我们社会中的量化偏见,尤其是在行业中。虽然我绝对不反对为此目的采用大数据,但我希望看到的是大数据与定性方法相结合的未来,以产生更丰富、更微妙的见解。

大数据应该与 Tricia Wang 在她的文章 为什么大数据需要厚数据 中推广的厚数据概念(对 Geertz 厚描述的扩展)结合起来。

让我们结合大数据+厚数据

数据科学家和社会科学家应该在提问、倾听、定义、重构、收集、分析和呈现数据的过程中相互配合。

人们和团队受限于他们个人和共同的文化理解。通过引入其他观点,包括那些收集了其(消费者/用户)数据的人的观点,我们可以丰富集体知识,使所有人受益。

社会科学家不应该抵制大数据的引入。他们应该与数据科学家尽可能紧密地合作,以发现应该更深入探索的噪音趋势。

另一方面,数据科学家不应该把定性方法的发现和见解看得太小。他们应该利用定性研究提供的丰富理解,赋予他们在数据中看到的趋势以意义。

如果我们做了这些事情,我们将更接近理解我们所面临的混乱问题的潜在原因,而不仅仅是在噪音中识别不相关的趋势。

关于作者

Matt Artz 是一名人类学家、设计师和战略家,致力于用户体验(UX)、服务设计和产品管理的交叉领域。他曾领导过《财富 10 强》和风投资助的初创公司的研究和设计项目,他的作品也被苹果和西南偏南(SXSW)收录。

Matt 也是商业人类学和 T2 Anthro to UX 播客的创作者,同时也是其他与美国人类学协会、皇家人类学研究所、EPIC 和 LiiV 中心合作的播客的主持人。你可以在 LinkedIn 、 Twitter 、 Instagram 、 Spotify、和谷歌学术上关注马特。

对于媒体的询问,联系马特。

原载于 2020 年 1 月 22 日https://www . mattartz . me

使用机器学习和 PySpark 进行大数据分析

原文:https://towardsdatascience.com/big-data-analyses-with-machine-learning-and-pyspark-135119ef6b31?source=collection_archive---------38-----------------------

大数据是一个描述大量数据的术语,包括结构化和非结构化数据。

简介

在我们使用机器学习和 PySpark 深入大数据分析之前,我们需要定义机器学习和 PySpark。

先说机器学习。当你在谷歌搜索栏上输入机器学习,你会发现下面的定义:机器学习是一种数据分析的方法,可以自动建立分析模型。如果我们更深入地研究机器学习和在线可用的定义,我们可以进一步说,ML 实际上是以数据为基础的人工智能的一个分支,即所有决策过程、识别模式等。,都是由最少的人接触。由于 ML 允许计算机在没有显式编程的情况下找到隐藏的见解,因此它被广泛应用于所有领域来完成这一任务——在数据中找到隐藏的信息。

机器学习和当初一样,什么都不是。它经历了许多发展,正日益变得更受欢迎。它的生命周期分为两个阶段:培训和测试。

接下来是 PySpark MLlib,它实际上是一个机器学习库,可扩展并在分布式系统上工作。在 PySpark MLlib 中,我们可以找到多种机器学习算法(线性回归、分类、聚类等等)的实现。MLlib 自带数据结构——包括密集向量、稀疏向量、局部和分布式向量。库 API 非常用户友好和高效。

问题

在我们工作的每个行业中,都有很多很多挑战可以通过使用这些技术来解决。在这个特殊的案例中,我们需要在一个金融机构中进行多种统计计算。一个例子是根据独立变量的数量(例如年龄、余额、持续时间、银行活动)。

如何利用机器学习解决这个问题,最后的结果会是什么?为了展示该解决方案,我们将使用在此链接上公开的大数据示例。

解决方案

逻辑回归是解决方法。这是一种预测分类反应的流行方法,是预测结果概率的广义线性模型的特例。

在开始编码之前,我们需要初始化 Spark 会话并定义文件的结构。之后,我们可以使用 Spark 从 csv 文件中读取数据。我们有一个很大的数据集,但是在这个例子中,我们将使用大约 11,000 条记录的数据集。

看下面的表格,我们可以看到只有一列(前一列)的最小值等于零(0 ),这个值对于这个例子是不切实际的。

因此,我们将所有的零替换为 Nan。此外,存款字段被定义为一个值为“是”和“否”的字符串,因此我们必须对该字段进行索引。使用字符串索引器,我们将把值从“是”/“否”更改为 1/0。

现在,我们可以通过调用一个估算器来简单地估算前一列中的 Nan。估算器使用缺失值所在列的平均值或中值来填补数据集中的缺失值。输入列应该是 Double 或 Float 类型。

我们还想使用分类字段,所以我们必须将这些字段映射到一列二进制向量,通常只有一个值。然后,我们可以找到变量之间的相关性,并选择我们应该使用哪个变量。因为分类字段是字符串类型,所以我们将使用字符串索引器将一列标签字符串编码为一列标签索引。

接下来,我们将确定数字特征是否相关(包括索引分类字段)。在下图中,我们可以看到没有高度相关的数值变量。因此,我们将为模型保留所有这些。注意 : pandas 库仅用于绘图——我们无法使用 pandas 读取大数据文件,但它确实有助于绘图。

然后,我们将使用独热编码,该编码将分类特征(表示为标签索引)映射到二进制向量,该向量至多具有单个 1 值,该值指示所有特征值集合中特定特征值的存在。在这之后,我们将使用向量组合器,它允许我们将多个向量组合成一个向量,在这种情况下,我们将把带数值字段的向量与带分类字段的向量组合起来,后者现在已被转换。在这之后,我们将使用管道。流水线被指定为一系列阶段,每个阶段或者是转换器或者是估计器。这些阶段按顺序运行,输入数据帧在通过每个阶段时会发生转换。

我们已经创建了一个特征向量,现在让我们使用 StandardScaler 对新创建的“feature”列进行标量化。StandardScaler 是一种估计器,可用于数据集以生成 StandardScalerModel。然后,该模型可以将数据集中的矢量列转换为具有单位标准差和/或零均值要素。在我们的例子中,我们使用的是标准差。

之后,我们将使用随机分割方法来分割测试和训练集中的数据。

现在,让我们看看数据集中 1 和 0 的百分比。

我们可以看到,在我们的数据集(训练)中,我们有 47.14 %的阳性和 52.85 %的阴性。我们的树是平衡的,所以我们可以走了。

接下来,我们将使用 Spark ML 提供的 ChiSqSelector 来选择重要的特性。它对带有分类特征的标记数据进行操作。ChiSqSelector 使用卡方独立性检验来决定从哪些特性中进行选择。我们将使用参数 fpr —它选择 p 值低于阈值的所有特征,从而控制选择的假阳性率。

我们将创建逻辑回归模型,并拟合训练集。我们可以在最终结果中看到,哪些客户有存款(1),哪些没有存款(0)。

现在让我们使用 Spark ML 中的 BinaryClassificationEvaluator 类来评估模型。默认情况下,BinaryClassificationEvaluator 使用 ROC 下的面积作为性能指标。

结果

在对我们的大型数据集执行逻辑回归后,我们可以得出结果,并确定哪些客户有存款(1),哪些没有存款(0)。我们还可以看到预测的准确性,在这种情况下,它大约为 0.82。

逻辑回归的目的是根据独立变量的值对事件发生的概率进行建模。将来,如果我们遇到这种问题,我们可以使用这种方法对大数据集进行准确预测。

使用大数据的机器学习的未来

机器学习意味着在计算机如何学习和预测方面前进了一步。它在各个部门都有应用,并且正在各地广泛使用。更广泛地应用机器学习和分析让我们能够更快地应对动态情况,并从快速增长的数据宝库中获得更大的价值。自从机器学习出现以来,它就越来越受欢迎,而且不会很快停止。

如果你对这个话题感兴趣,请随时联系我。

领英简介:https://www.linkedin.com/in/ceftimoska/

博客原文可从以下链接获得:https://interworks . com . MK/big-data-analyses-with-machine-learning-and-py spark/

另外,你可以在下面的链接中找到另一篇类似的博文:https://interworks.com.mk/focusareas/data-management/

大数据分析:Apache Spark 与 Apache Hadoop

原文:https://towardsdatascience.com/big-data-analytics-apache-spark-vs-apache-hadoop-7cb77a7a9424?source=collection_archive---------2-----------------------

了解为什么创建 Apache Spark,以及它如何解决 Apache Hadoop 的缺点。

什么是大数据?

“大数据是高容量、高速度和高多样性的信息资产,需要经济高效、创新的信息处理形式来增强洞察力和决策能力”[11]

如果没有合适的工具、框架和技术,大数据分析可能会非常耗时、复杂且计算量大。当数据量过大,无法在单台机器上处理和分析时,Apache Spark 和 Apache Hadoop 可以通过并行处理和分布式处理来简化任务。要了解大数据分析中对并行处理和分布式处理的需求,首先了解什么是“大数据”非常重要。大数据的高速生成要求数据的处理速度也非常快,大数据的多样性意味着它包含各种类型的数据,包括结构化、半结构化和非结构化数据[4]。大数据的数量、速度和多样性需要新的创新技术和框架来收集、存储和处理数据,这就是 Apache Hadoop 和 Apache Spark 诞生的原因。

并行处理与分布式处理

了解什么是并行处理和分布式处理,将有助于理解 Apache Hadoop 和 Apache Spark 如何用于大数据分析。因为并行处理和分布式处理都涉及到将计算分解成更小的部分,所以两者之间可能会有混淆。并行计算和分布式计算的区别在于内存架构[10]。

“并行计算是同时使用一个以上的处理器来解决一个问题”[10]。

“分布式计算是同时使用多台计算机来解决一个问题”[10]。

并行计算任务访问相同的内存空间,而分布式计算任务不访问,因为分布式计算是基于磁盘的,而不是基于内存的。一些分布式计算任务在一台计算机上运行,一些在其他计算机上运行[9]。

Apache Spark vs . Apache Hadoop

Apache Hadoop 和 Apache Spark 都是用于大数据处理的开源框架,但有一些关键区别。Hadoop 使用 MapReduce 来处理数据,而 Spark 使用弹性分布式数据集(rdd)。Hadoop 有一个分布式文件系统(HDFS),这意味着数据文件可以存储在多台机器上。文件系统是可扩展的,因为可以添加服务器和机器来容纳不断增长的数据量[2]。Spark 不提供分布式文件存储系统,所以它主要用于计算,在 Hadoop 之上。Spark 不需要 Hadoop 来运行,但可以与 Hadoop 一起使用,因为它可以从存储在 HDFS 中的文件创建分布式数据集[1]。

性能差异

Hadoop 和 Spark 的一个关键区别是性能。加州大学伯克利分校的研究人员意识到 Hadoop 非常适合批处理,但对于迭代处理来说效率很低,所以他们创建了 Spark 来解决这个问题[1]。 Spark 程序在内存中迭代运行速度比 Hadoop 快 100 倍左右,在磁盘上快 10 倍[3] 。Spark 的内存处理负责 Spark 的速度。相反,Hadoop MapReduce 将数据写入磁盘,在下一次迭代中读取。因为每次迭代后都要从磁盘重新加载数据,所以它比 Spark [7]慢得多。

阿帕奇 Spark RDDs

Apache Spark 的基本数据结构是弹性分布式数据集(RDD ),它是一个容错的、不可变的分布式对象集合,可以跨集群并行处理。rdd 由于其容错能力而具有弹性,这意味着它可以从节点故障中恢复。如果一个节点未能完成其任务,RDD 可以在其余节点上自动重建,以完成任务[6]。rdd 的不变性有助于防止和避免数据不一致,即使在对非结构化数据执行转换时也是如此[9]。大数据通常是可变的,可以包括文本数据、关系数据库、视频、音频、照片和图形数据[2]。RDD 使高效处理结构化和非结构化数据成为可能。构建在 rdd 之上的数据帧也是不可变的、分布式的数据集合,但是被组织成列和行,类似于关系数据库[5]。Spark 数据框架使得处理和分析来自各种来源和格式的数据变得更加容易,比如 JSON 文件和 Hive 表[1]。

火花流

Apache Spark 的堆栈包括多个大数据处理框架,如 Spark Streaming。Spark 流框架用于流处理容错的实时数据流,以处理大数据的速度[8]。在接收到实时输入数据后,Spark Streaming 将数据划分为多个批次,以便对数据进行批量处理,最终结果是一个经过处理的批次流[5]。火花流数据被称为离散流(数据流),实质上是 rdd 序列[6]。数据流是一致的和容错的。由于能够实时或接近实时地处理大数据,因此大数据对企业和决策者来说非常有价值。Spark Streaming 的一个使用案例是一家投资公司需要监控可能影响其投资和持股的社交媒体趋势。及时了解关于公司客户或他们持有的公司的最新消息会极大地影响业务成果。

火花 MLlib

Apache Spark 有一个名为 MLlib 的机器学习库,它提供了主要的机器学习算法,如分类、聚类、回归、降维、转换器和协同过滤[7]。一些机器学习算法可以应用于流数据,这对于使用 Spark 流的应用很有用[6]。Spark 流应用中使用的分类算法的一个例子是信用卡欺诈检测。一旦处理了新的传入交易,分类算法就会对交易是否属于欺诈进行分类。尽快识别潜在的欺诈交易非常重要,这样银行就可以尽快联系客户。Spark 流的挑战在于输入数据量的不可预测性[8]。传入数据在流的生命周期中的不一致分布会使机器学习模型的流学习变得相当困难。

推荐系统

Spark Streaming 和 MLlib 的一个流行的真实用途是构建基于机器学习的推荐系统。推荐系统已经影响了我们网上购物、看电影、听歌和阅读新闻的方式。最著名的推荐系统公司包括网飞、YouTube、亚马逊、Spotify 和谷歌。像这样的大公司,产生和收集的数据如此之多,大数据分析是他们的首要任务之一。MLlib 包括一个迭代协作过滤算法,称为交替最小二乘法来构建推荐系统[6]。协同过滤系统基于用户和项目之间的相似性度量来进行推荐[8]。相似的商品会推荐给相似的用户。系统不知道关于项目的细节,只知道相似的用户查看或选择了相同的项目。

阿帕奇看象人

MapReduce 曾经有过自己的机器学习库,然而,由于 MapReduce 对于迭代处理的效率很低,它很快就失去了与 Apache Spark 的库的兼容性。Apache Mahout 是建立在 Apache Hadoop 之上的机器学习库,它最初是一个 MapReduce 包,用于运行机器学习算法。由于机器学习算法是迭代的,MapReduce 遇到了可扩展性和迭代处理问题[6]。由于这些问题,Apache Mahout 停止支持基于 MapReduce 的算法,并开始支持其他平台,如 Apache Spark。

结论

从一开始,Apache Spark 就被开发得很快,并解决了 Apache Hadoop 的缺点。Apache Spark 不仅速度更快,而且使用内存处理,并在其上构建了许多库,以适应大数据分析和机器学习。尽管 Hadoop 有缺点,但 Spark 和 Hadoop 都在大数据分析中发挥了重要作用,并被世界各地的大型科技公司用来为客户或客户量身定制用户体验。

作品被引用

[1]安卡姆,文卡特。大数据分析。Packt 出版公司,2016 年。EBSCOhost,search . EBSCOhost . com/log in . aspx direct = true & db = nle bk & AN = 1364660 & site = eho ST-live。

[2]“阿帕奇 Hadoop。”hadoop.apache.org/.阿帕奇 Hadoop

[3]“阿帕奇火花。”【阿帕奇火花】https://spark.apache.org/。​

[4]巴拉金斯卡、玛格达和丹·苏休。并行数据库和 MapReduce。【2016 年春季,http://pages . cs . wisc . edu/~ Paris/cs 838-s16/lecture-notes/lecture-parallel . pdf。PowerPoint 演示文稿。

[5]德拉巴斯、托马兹等人学习 PySpark 。Packt 出版公司,2017 年。,search.ebscohost.com/login.aspx?direct = true&db = nle bk&AN = 1477650&site = ehost-live。

[6] Dua,Rajdeep 等用 Spark 进行机器学习—第二版。Vol .第二版,Packt 出版社,2017 年。 EBSCOhost ,search.ebscohost.com/login.aspxdirect=true&db = nle bk&AN = 1513368&site = eho ST-live。

[7] Hari,Sindhuja。" Hadoop vs Spark:面对面的比较选择正确的框架."2019 年 12 月 17 日,https://hackr.io/blog/hadoop-vs-spark。

8 佛朗哥·加莱亚诺·曼努埃尔·伊格纳西奥。用 Apache Spark 处理大数据:用 Spark 和 Python 高效处理大数据集和大数据分析。Packt,2018。

[9]普苏库里,纪梭。CS5412 /第 25 讲阿帕奇 Spark 和 RDDs。2019 年春季,http://www . cs . Cornell . edu/courses/cs 5412/2019 sp/slides/Lecture-25 . pdf。PowerPoint 演示文稿。

10 弗朗切斯科·皮尔费德里西。用 Python 实现分布式计算。Packt 出版公司,2016 年。search.ebscohost.com/login.aspx?,EBSCOhostdirect = true&db = nle bk&AN = 1220461&site = ehost-live。

[11]“什么是大数据。”大数据联盟,https://www.bigdata-alliance.org/what-is-big-data/.

从业务需求到运行应用的大数据

原文:https://towardsdatascience.com/big-data-application-from-business-requirements-to-big-data-running-application-bd801c60c60e?source=collection_archive---------47-----------------------

揭开大数据应用的面纱

处理大数据应用

在本文中,我将向您介绍大数据术语。除此之外,我还会从大数据应用的业务需求来解释什么时候考虑你正在处理的应用。换句话说,如何知道我们要从业务需求出发去处理大数据应用?

目前,大数据已经在市场上存在了一段时间,并且仍然吸引着来自不同领域的人们,他们正在寻求只有通过使用此类平台才能实现的目标。

简单来说什么是大数据?

(来源:【https://pxhere.com/en/photo/1575603 )

众所周知,大数据是一个更像哲学的术语,可以通过其主要特征来概括,这些特征是:数量、多样性、速度、准确性和价值。

Volume 代表的是数据量的巨大,换句话说,我们不能说几兆甚至几十亿的数据就可以被视为具有大数据的量。

多样性是一个已知的术语,当存在不同类型和格式的数据时,如关系记录、JSON 文件、XML 文件、非结构化文本、媒体文件(图像、视频、音频等)时会出现。)不能由关系数据库管理系统(RDBMS)或数据仓库(其中模式是先决条件)处理。

速度是数据到达服务器的速度。它在现有系统中扮演着重要角色,在现有系统中,每个人都在最快的时间内从数据中获得洞察力。是啊!速度很重要。如果我们在检测到一些关键信息后,如核反应堆出现故障,这可能导致太多人死亡,如果处理不当,将是灾难性的(没有人希望发生另一场切尔诺贝利灾难)。

准确性代表数据的准确性,以及这些数据对分析和洞察的可靠程度。这是需要维护的数据属性。为了知道已知的数据有多少是可靠的,我们应该仔细检查收集的数据的准确性,以及有多少数据是经过清理和良好处理的。

价值正如查尔斯·达尔文所说,“敢于浪费一小时时间的人,还没有发现生命的价值”。在这句话中,很明显,我们不需要浪费任何时间或资源来做所有的处理,而不是达到一个单一的目标。目标永远是第一位的;我们需要小心使用这个复杂的基础设施来从中获取价值(洞察力)。

什么时候我们需要将我们的数据视为大数据?

一些人想知道大数据是否是旧的传统可靠的 RDBMS 或众所周知的有洞察力的数据仓库的新替代品。我想对每个人说,在我看来,所有的都是相互补充的,每种技术都在应用周期中发挥着自己的作用。与此同时,我想提一下,如果您没有具备上述特征的数据,请尽量不要构建和使用大数据技术和架构,因为这只会增加系统的复杂性,并产生可以避免的高昂成本。

对一个简单的应用程序使用 RDBMS 总是最好的方法,因为它可靠而且更容易管理。但是,有了大数据应用,就另当别论了!

每天都有数千兆字节和数兆兆字节的数据被输入到服务器中,传统的技术已经无法处理这些数据了。这是新的检查点;每个人都应该开始形成符合自己要求的大数据解决方案。如题,从业务需求到大数据运行应用。一切从业务需求开始,我们如何将业务需求中的所有部分放在一起,并开始思考匹配呼叫的最佳解决方案。我向你保证,这仍然没有标准的方法。没有人可以声称在文献中存在一个适合所有大数据应用的解决方案,这是所有宣传开始的地方,并且仍然从未停止。

例如,如果我们需要建立一个推荐引擎来定位媒体网站上的用户,以获得更多的参与度并降低跳出率。基于业务需求,大数据架构师必须问的问题太多了。

科里·伍德沃在 Unsplash 上的照片

多少网站?就一个?我们能知道他们的来源吗?保密吗?我们需要只添加一个 JavaScript 来收集数据并完成任务吗?用户是注册的还是无关紧要的?用户事务的位置?这些媒体网站会生成关键词或者标签吗?每天产生多少数据?每月?每年?生成的数据有什么不同的格式?都统一还是不统一?数据可以与第三方共享吗?诸如此类…

当我们发现每天都有许多异构数据源生成千兆字节的数据时,我们必须做出决定,并得出传统数据库和数据仓库无法解决问题的结论。因此,需要将大数据架构引入到一系列新的大数据技术中,这些技术需要大量的专业知识和培训。

最好的大数据架构是什么?

在收集了需求之后,是时候决定我们需要进行的架构设计了。Lambda 架构更像是当今大数据架构设计中的一个概念(但它不是唯一的一个)。如果我们既需要静态数据用于训练,又需要另一个速度层用于检测和分类作为数据流到达的数据记录,这种 lambda 体系结构可以实现这一目的,因为它高度分离了不同的组件,我们可以将数据复制到不同的目的和不同的数据存储机制中。一种机制自然适合于存储永久数据,即静态数据存储,而另一种机制用于存储批量数据,即批量视图,以便通过将这些数据推入方便的可视化技术来促进这些数据的可视化。这种架构被认为是任何大数据架构师的支柱,然而,有些人发现这可能太复杂而难以处理。有些应用可能只需要速度层或批处理层。例如,在某些情况下,将用户聚类到不同的类别可能会导致只有批处理层,并根据用户的类别对待不同的用户(例如客户细分)。和其他情况下,只需要速度层,例如基于某个定义的模式检测故障机器。

λ架构

它更多地基于应用程序的需求,回到之前提出的问题,完整的 lambda 架构可能是最合适的,这是由于以下几个原因:

为了构建推荐引擎,重要的是要有一个批处理层:

  1. 我们需要用户的历史记录
  • 用户
  • 他们读的文章
  • 每次会话花费的时间

2.我们需要训练一个模型(例如。协同过滤),其可以运行几天以获得存储的用户的兴趣

为了向登录用户/匿名阅读用户进行推荐,有一个速度层是很重要的:

1.获取用户的标识符

2.获取该用户可能感兴趣的生成文章

这只是一个例子,可以向您展示如何仔细分析需求,并将其转化为实际的架构。

在选择了合适的架构之后,我们完成了吗?!

当然不是!

选择合适的技术是一件非常痛苦的事情。大数据生态系统由许多工具和技术组成,其中大部分由 Apache 孵化器孵化。

走了这么远,我们将听到的第一个词是 Hadoop!是的,那只黄色的大象,我不知道它为什么是黄色的,但我只知道它是大数据的心脏。

(来源:【https://hadoop.apache.org/ )

请继续关注下一篇文章,其中我将深入介绍大数据工具和技术…

大数据工程— Apache Spark

原文:https://towardsdatascience.com/big-data-engineering-apache-spark-d67be2d9b76f?source=collection_archive---------17-----------------------

理解大数据

为什么 Apache Spark 非常适合各种 ETL 工作负载。

由 Seika I 在 Unsplash 上拍摄的照片

这是大数据环境中的数据工程系列的第 2 部分。它将反映我个人的经验教训之旅,并在我创建的开源工具 Flowman 中达到高潮,以承担在几个项目中一遍又一遍地重新实现所有 boiler plate 代码的负担。

  • 第 1 部分:大数据工程—最佳实践
  • 第 2 部分:大数据工程— Apache Spark
  • 第 3 部分:大数据工程——声明性数据流
  • 第 4 部分:大数据工程— Flowman 启动并运行

期待什么

本系列是关于用 Apache Spark 构建批处理数据管道的。但是有些方面对于其他框架或流处理也是有效的。最后,我将介绍 Flowman ,这是一个基于 Apache Spark 的应用程序,它简化了批处理数据管道的实现。

介绍

第二部分强调了为什么 Apache Spark 非常适合作为实现数据处理管道的框架。还有许多其他的选择,尤其是在流处理领域。但是从我的角度来看,当在批处理世界中工作时(有很好的理由这样做,特别是如果涉及许多需要大量历史记录的非平凡转换,如分组聚合和巨大连接),Apache Spark 是一个几乎无可匹敌的框架,在批处理领域表现尤为突出。

本文试图揭示 Spark 提供的一些功能,这些功能为批处理提供了坚实的基础。

数据工程的技术要求

我已经在第一部分中评论了数据处理管道的典型部分。让我们重复这些步骤:

  1. 提取。从某个源系统读取数据(可以是像 HDFS 这样的共享文件系统,也可以是像 S3 这样的对象存储,或者像 MySQL 或 MongoDB 这样的数据库)
  2. 转型。应用一些转换,如数据提取、过滤、连接甚至聚合。
  3. 装货。将结果再次存储到某个目标系统中。同样,这可以是共享文件系统、对象存储或某个数据库。

现在,我们可以通过将这些步骤中的每一步映射到期望的功能,并在最后添加一些额外的需求,来推导出用于数据工程的框架或工具的一些需求。

  1. 广泛的连接器。我们需要一个能够从广泛的数据源读入数据的框架,比如分布式文件系统中的文件、关系数据库或列存储中的记录,甚至是键值存储。
  2. 广泛而可扩展的变换范围。为了“应用转换”,框架应该明确地支持和实现转换。典型的转换是简单的列式转换,如字符串操作、过滤、连接、分组聚合——所有这些都是传统 SQL 提供的。最重要的是,框架应该提供一个简洁的 API 来扩展转换集,特别是列式转换。这对于实现不能用核心功能实现的定制逻辑非常重要。
  3. 广泛的连接器。同样,我们需要各种各样的连接器来将结果写回到所需的目标存储系统中。
  4. 扩展性。我已经在上面的第二个需求中提到了这一点,但是我觉得这一点对于一个明确的点来说足够重要。可扩展性可能不仅限于转换类型,还应该包括新输入/输出格式和新连接器的扩展点。
  5. 可扩展性。无论选择哪种解决方案,都应该能够处理不断增长的数据量。首先,在许多情况下,你应该准备好处理比 RAM 所能容纳的更多的数据。这有助于避免完全被数据量卡住。其次,如果数据量使处理速度太慢,您可能希望能够将工作负载分布到多台机器上。

什么是 Apache Spark

Apache Spark 为上述所有需求提供了良好的解决方案。Apache Spark 本身是一个库集合,是一个开发定制数据处理管道的框架。这意味着 Apache Spark 本身并不是一个成熟的应用程序,而是需要您编写包含转换逻辑的程序,而 Spark 负责以一种高效的方式在集群中的多台机器上执行逻辑。

Spark 最初于 2009 年在加州大学伯克利分校的 AMPLab 启动,并于 2010 年开源。最终在 2013 年,这个项目被捐赠给了 Apache 软件基金会。该项目很快就受到了关注,尤其是以前使用 Hadoop Map Reduce 的人。最初,Spark 围绕所谓的 rdd(弹性分布式数据集)提供了核心 API,与 Hadoop 相比,rdd 提供了更高层次的抽象,从而帮助开发人员更高效地工作。

后来,添加了更新的 on preferred DataFrame API,它实现了一个关系代数,其表达能力可与 SQL 相媲美。这个 API 提供了与数据库中的表非常相似的概念,这些表具有命名的和强类型的列。

虽然 Apache Spark 本身是用 Scala(一种在 JVM 上运行的混合函数式和面向对象的编程语言)开发的,但它提供了使用 Scala、Java、Python 或 r 编写应用程序的 API。当查看官方示例时,您会很快意识到该 API 非常有表现力和简单。

  1. 连接器。由于 Apache Spark 只是一个处理框架,没有内置的持久层,它一直依赖于通过 JDBC 连接到 HDFS、S3 或关系数据库等存储系统。这意味着从一开始就建立了清晰的连接设计,特别是随着数据帧的出现。如今,几乎每一种存储或数据库技术都只需要为 Apache Spark 提供一个适配器,而 Apache Spark 被认为是许多环境中的一个可能选择。
  2. 变换。原始核心库为 RDD 抽象提供了许多常见的转换,如过滤、连接和分组聚合。但是现在更新的 DataFrame API 更受欢迎,它提供了大量模仿 SQL 的转换。这应该足够满足大多数需求了。
  3. 扩展性。新的转换可以通过所谓的用户定义函数(UDF)轻松实现,在这种情况下,您只需提供一小段处理单个记录或列的代码,Spark 将它包装起来,以便该函数可以并行执行并分布在一个计算机集群中。
    由于 Spark 具有非常高的代码质量,您甚至可以深入一两层,使用内部开发人员 API 实现新的功能。这可能有点困难,但是对于那些无法使用 UDF 实现的罕见情况来说,这是非常有益的。
  4. 可扩展性。 Spark 从一开始就被设计成一个大数据工具,因此它可以扩展到不同类型集群(当然是 Hadoop YARN、Mesos 和最近的 Kubernetes)中的数百个节点。它可以处理比内存大得多的数据。一个非常好的方面是,Spark 应用程序也可以在没有任何集群基础设施的单个节点上非常高效地运行,从开发人员的角度来看,这是一个很好的测试,但这也使 Spark 能够用于不太大的数据量,并且仍然受益于 Sparks 的特性和灵活性。

从这四个方面来看,Apache Spark 非常适合以前由 Talend 或 Informatica 等供应商提供的专用且昂贵的 ETL 软件完成的典型数据转换任务。通过使用 Spark,您可以获得生动的开源社区的所有好处,并且可以根据您的需求自由定制应用程序。

尽管 Spark 在创建时就考虑到了海量数据,但我总是会考虑使用它,即使是少量数据,因为它非常灵活,可以随着数据量无缝增长。

可供选择的事物

当然,Apache Spark 并不是实现数据处理管道的唯一选择。像 Informatica 和 Talend 这样的软件供应商也为喜欢购买完整生态系统的人提供非常可靠的产品(包括所有的优点和缺点)。

但是,即使在大数据开源世界中,有些项目乍看起来似乎是备选方案。

首先,我们仍然有 Hadoop。但是 Hadoop 实际上由三个组件组成,这三个组件被清晰地划分:首先,我们有分布式文件系统 HDFS,它能够存储非常大量的数据(比如说 Pb)。接下来,我们有运行分布式应用程序的集群调度器。最后,我们有一个 Map Reduce 框架,用于开发非常特殊类型的分布式数据处理应用程序。虽然前两个组件 HDFS 和 YARN 仍然被广泛使用和部署(尽管他们感到来自云存储的压力,Kubernetes 是可能的替代品),但 Map Reduce 框架现在根本不应该被任何项目使用。编程模型太复杂了,编写重要的转换会变得非常困难。所以,是的,HDFS 和 YARN 作为基础设施服务(存储和计算)很好,Spark 与这两者很好地集成在一起。

其他备选方案可以是 SQL 执行引擎(没有集成的持久层),如 Hive、Presto、Impala 等。虽然这些工具通常也提供了与不同数据源的广泛连接,但它们都局限于 SQL。首先,对于带有许多公共表表达式(cte)的长链转换,SQL 查询本身会变得非常棘手。其次,用新特性扩展 SQL 通常更加困难。我不会说 Spark 在总体上比这些工具更好,但我认为 Spark 更适合数据处理管道。这些工具在查询现有数据方面大放异彩。但是我不想用这些工具为创建数据——那从来都不是他们的主要工作范围。另一方面,虽然你可以通过 Spark Thrift Server 使用 Spark 来执行 SQL 以提供数据,但它并不是真正为这种场景而创建的。

发展

我经常听到的一个问题是,应该使用什么编程语言来访问 Spark 的功能。正如我在上面写的,Spark out of the box 提供了 Scala、Java、Python 和 R 的绑定——所以这个问题真的很有意义。

我的建议是根据任务使用 Scala 或 Python(也许是 R——我没有这方面的经验)。千万不要用 Java(感觉真的比干净的 Scala API 复杂多了),投资点时间学点基础的 Scala 吧。

现在留给我们的问题是“Python 还是 Scala”。

  • 如果你做的是数据工程(读取、转换、存储),那么我强烈建议使用 Scala。首先,因为 Scala 是一种静态类型语言,所以实际上比 Python 更容易编写正确的程序。第二,每当您需要实现 Spark 中没有的新功能时,最好使用 Spark 的本地语言。尽管 Spark well 支持 Python 中的 UDF,但您将付出性能代价,并且无法再深入研究。用 Python 实现新的连接器或文件格式将非常困难,甚至是不可能的。
  • 如果你正在研究数据科学(这不在本系列文章的讨论范围之内),那么 Python 是更好的选择,包括所有那些 Python 包,比如 Pandas、SciPy、SciKit Learn、Tensorflow 等等。

除了上面两个场景中的不同库之外,典型的开发工作流也有很大的不同:数据工程师开发的应用程序通常每天甚至每小时都在生产中运行。另一方面,数据科学家经常与数据交互工作,一些见解是最终的成果。因此,生产就绪性对数据工程师来说比对数据科学家来说更重要。即使许多人不同意,Python 或任何其他动态类型语言的“生产就绪”要困难得多。

框架的缺点

既然 Apache Spark 对于复杂的数据转换来说是一个非常好的框架,我们可以简单地开始实现我们的管道。在几行代码中,我们可以指示 Spark 执行所有的魔法,将我们的多 TB 数据集处理成更容易访问的东西。

等等,别这么快!我在过去为不同的公司多次这样做,过了一段时间后,我发现许多方面必须反复实现。虽然 Spark 擅长数据处理本身,但我在本系列的第一部分中指出,健壮的数据工程不仅仅是处理本身。日志、监控、调度、模式管理都出现在我的脑海中,所有这些方面都需要在每个严肃的项目中得到解决。

那些非功能方面通常需要编写重要的代码,其中一些可能是非常低级和技术性的。因此,Spark 不足以实现生产质量数据管道。由于这些问题的出现与特定的项目和公司无关,我建议将应用程序分成两层:一个顶层包含编码在数据转换中的业务逻辑以及数据源和数据目标的规范。一个较低的层应该负责执行整个数据流,提供相关的日志记录和监控指标,负责模式管理。

最后的话

这是关于使用 Apache Spark 构建健壮的数据管道的系列文章的第二部分。我们非常关注为什么 Apache Spark 非常适合取代传统的 ETL 工具。下一次我将讨论为什么另一个抽象层将帮助您关注业务逻辑而不是技术细节。

大数据工程—最佳实践

原文:https://towardsdatascience.com/big-data-engineering-best-practices-bfc7e112cf1a?source=collection_archive---------20-----------------------

理解大数据

在实施大数据数据处理管道时,您应该记住什么。

田宽在 Unsplash 上拍照

这是大数据环境中的数据工程系列的第 1 部分。它将反映我个人的经验教训之旅,并在我创建的开源工具 Flowman 中达到高潮,以承担在几个项目中一遍又一遍地重新实现所有 boiler plate 代码的负担。

  • 第 1 部分:大数据工程—最佳实践
  • 第 2 部分:大数据工程— Apache Spark
  • 第 3 部分:大数据工程——声明性数据流
  • 第 4 部分:大数据工程— Flowman 启动并运行

期待什么

本系列是关于用 Apache Spark 构建批处理数据管道的。但是有些方面对于其他框架或流处理也是有效的。最后,我将介绍 Flowman ,这是一个基于 Apache Spark 的应用程序,它简化了批处理数据管道的实现。

介绍

越来越多的公司和项目使用 Apache Spark 作为中央数据处理框架来构建他们的数据处理管道。并且有很好的理由这样做(在本系列的另一部分中会有更多)。

Apache Spark 本身作为一个框架,在设计数据管道时并没有提供很多遵循最佳实践的指导,也没有考虑到许多细节,这些细节不是数据转换本身的直接部分,但从更广泛的角度来看是重要的,如模式管理和在出现故障或逻辑错误时重新处理数据的能力。

典型数据管道

在讨论开发数据处理管道时需要记住的各个方面之前(无论使用何种技术,尽管我更喜欢 Apache Spark),让我们先来看看典型的数据管道实际上是做什么的。

我认为大多数数据管道本质上包含三个步骤:

  1. 提取。从某个源系统读取数据(可以是像 HDFS 这样的共享文件系统,也可以是像 S3 这样的对象存储,或者像 MySQL 或 MongoDB 这样的数据库)
  2. 改造。应用一些转换,如数据提取、过滤、连接甚至聚合。
  3. 装货。将结果再次存储到某个目标系统中。同样,这可以是共享文件系统、对象存储或某个数据库。

Apache Spark well 支持所有这些步骤,您可以用几行代码实现一个简单的数据管道。一旦将它投入生产,随着时间的推移,可能会出现一些问题,导致非功能性需求和最佳实践。这些都不是 Apache Spark 直接实现的,你得自己搞定这些。本系列文章将帮助您构建坚如磐石的数据管道,这些管道还会处理许多非功能性需求,但这些需求在生产中非常重要。

最佳实践

本系列的第一部分是关于最佳实践的。这指的是为实现稳定运营而采取的具体做法。实现它们的技术并不是革命性的,但是它们并没有被经常讨论(至少这是我的印象)。

1.记录

由马库斯·斯皮斯克在 Unsplash 上拍摄

第一个要求是提供某种形式的日志记录。这并不令人兴奋,许多开发人员已经提供了这种功能。但是通常的问题是日志应该有多详细:应该将每个细节都记录到控制台还是只记录问题?

这个问题很难回答,但我更喜欢记录我的应用程序做出的所有重要决策,以及对应用程序有一定影响的所有重要变量和状态信息。您可能想问问自己:对于应用程序不能按预期工作的大多数事件,什么样的信息会有所帮助?

我正在记录的内容的典型示例:

  • 当前运行的自定义设置是什么?例如,正在处理什么日期范围?正在处理什么客户?
  • 读取的是什么数据?数据存储在哪里?多少文件?这些信息有助于验证应用程序是否试图从正确的位置读取。
  • 应用程序试图将其结果写入哪里?同样,此信息有助于验证目标系统的所有设置是否正确。
  • 您还应该在最后记录某种成功消息——这对于在该消息长时间丢失时设置自动警报非常有用。

正如上一条提到的,警报也是你应该想到的。大多数情况下,最好将所有日志存储在一个像 Graylog 这样的中央日志聚合器中,这样您就可以轻松地搜索特定问题并设置警报。

日志相关的还有主题指标。对于这个术语,我不仅仅指 Apache Spark 的内部技术指标,还指一些与业务更相关的指标。例如,提供关于读取和写入的记录数量的指标可能会很有趣——这两个指标在 Apache Spark 中都不直接可用,至少每个数据源和数据宿都不可用。

2.重播

照片由乔恩·泰森在 Unsplash 拍摄

你应该从一开始就计划好的一个非常重要的特性就是所谓的重播。在许多批处理应用程序中,输入数据是按时间片(每天或每小时)提供的,而您只想处理新数据。

但是如果出了问题会怎么样呢?例如,如果输入数据不完整或损坏,应该怎么办?或者您的应用程序包含一些逻辑错误并产生错误的结果?这种情况的简单答案是重播。这个术语指的是应用程序在出现任何问题时重新处理旧数据的能力。但是这种能力不会自动出现,您必须仔细考虑您的数据管理策略,如何组织您的输入和我们的输出数据以支持重新运行。

重新运行需要几个方面,这将在接下来的主题中单独讨论。

3.每个分区一个编写器

Nana Smirnova 在 Unsplash 上的照片

为了支持重新运行,您必须考虑数据组织。如果出现任何错误,理想情况下,您可以简单地删除特定批处理运行的输出,并用新的批处理运行的结果替换它。

如果您使用一些简单的分区机制,这是非常容易实现的。使用分区我指的是使用子文件夹(用于基于文件的输出)或配置单元分区(当您使用配置单元时)来组织逻辑上属于同一输出的数据(就像单个配置单元表)。基本思想是每个批处理运行都应该写入一个单独的分区。

例如,如果您的应用程序每小时处理一次新数据,只需使用数据和时间作为标识符来创建分区。在基于文件的工作流中,分区是一个目录,对于一些包含客户和交易数据的虚拟数据仓库,它可能如下所示

/warehouse/shop_db/customer_transactions/hour=2020-09-12T08:00/

在该目录中,存储了 2020 年 9 月 12 日 08:00 运行的特定作业的所有文件。如果批处理运行中出现任何错误,您可以简单地删除整个目录并重新启动作业。

如果您正在使用 Hive(如果您在一些共享文件系统或对象存储上使用 Spark,我强烈建议您这样做),分区是 Hive 的核心特性。不幸的是,Spark 不太支持写入特定分区(但这种限制是可以解决的)。

4.模式管理

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片

模式管理是一个非常重要的主题。这个术语指的是所有项目和开发任务有关的数据输入和输出格式。

当您读入某个源系统的数据时,您期望数据的特定格式。这包括技术文件格式(如 CSV、JSON 或 Parquet)和用于存储数据的一组列和数据类型。我强烈推荐两件事:

  1. 明确对输入模式的期望。这意味着不要简单地让应用程序推断正确的类型。
  2. 为改变做好准备。我经常被告知“输入模式永远不会改变”——而这个假设最终总是被证明是错误的。

第一个建议提高了应用程序的健壮性,因为静默模式更改可以更早地被检测到,因为如果输入数据不再与您期望的模式匹配,应用程序应该报告一个错误(一些放宽是允许的,甚至是可取的,下面将详细介绍)。许多公司甚至有一些轻量级的组织过程来协商模式——这在我看来是正确的,因为由另一个应用程序获取的数据导出模式是一个技术契约。双方(交付方和消费方)都应该通过显式地使用模式进行写入和读取来意识到这一点。

第二个建议更难,尤其是与重新运行功能相结合。更改数据处理以反映新版本的输入模式可能会破坏重新处理旧数据的能力,因为旧数据可能是使用旧版本的模式存储的。这意味着您需要考虑您的数据管道如何可能与不同的模式版本一起工作。一个简单的解决方案是使用旧版本的数据管道来处理旧数据,但这通常不是一个好的选择,因为旧版本的应用程序缺少一些也应该应用于旧数据的重要功能。

所以我建议用不同的模式版本重新运行,创建某种与所有版本的输入数据兼容的超级模式——至少在应用任何业务逻辑之前作为应用程序中的内部中间表示。我还建议尝试与源系统协商,只允许新模式版本兼容变更不幸的是,术语兼容高度依赖于所使用的技术,例如,Spring 对于像 Spark 一样改变 JSON 中的类型有其他限制。

5.数据谱系关系

最后,作为一个更广泛的概念,某种“数据所有权”应该在每个项目中可用。这个术语实际上指的是两个可能不同的方面,在这两个方面,如果出现任何需要注意的问题或事件,责任应该是明确的:

  1. 物理数据所有权。所有数据最终都存储在某个系统上,无论是在云中还是在本地数据中心,甚至是在我桌子下面的服务器上(不推荐)。需要有一个团队负责操作这个系统(是的,即使是云也需要一些操作),包括备份、更新等。该角色通常由 IT 运营部门负责。
  2. 业务数据所有权。除了物理所有权,每个数据源还需要一个业务所有者。该人员或团队负责存储的数据类型、数据模式以及与其他系统的接口。这个角色必须由定义存储数据的团队拥有。我总是推荐一个简单的规则:写数据的团队也拥有数据。这也意味着不允许其他团队写入自己的数据——除了一些用于数据交换的接口区域。

最后的话

这是关于使用 Apache Spark 构建健壮的数据管道的系列文章的第 1 部分。您可能会觉得有点被出卖了,因为它没有包含任何实际的代码。然而,我认为首先讨论一些概念是很重要的。下一部分将更多地关注 Apache Spark。

大数据工程—声明性数据流

原文:https://towardsdatascience.com/big-data-engineering-declarative-data-flows-3a63d1802846?source=collection_archive---------28-----------------------

通过使用声明性语言方法来分离功能性和非功能性需求。

迈克·本纳在 Unsplash 上的照片

这是大数据环境中的数据工程系列的第 3 部分。它将反映我个人的经验教训之旅,并在我创建的开源工具 Flowman 中达到高潮,以承担在几个项目中一遍又一遍地重新实现所有锅炉板代码的负担。

  • 第 1 部分:大数据工程—最佳实践
  • 第 2 部分:大数据工程— Apache Spark
  • 第 3 部分:大数据工程—声明性数据流
  • 第 4 部分:大数据工程— Flowman 启动并运行

期待什么

本系列是关于用 Apache Spark 构建批处理数据管道的。但是有些方面对于其他框架或流处理也是有效的。最后,我将介绍 Flowman ,这是一个基于 Apache Spark 的应用程序,它简化了批处理数据管道的实现。

功能需求

本系列的第 1 部分已经指出了两种需求的存在,它们适用于几乎所有类型的应用程序:功能性需求和非功能性需求。让我们首先关注第一类需求。

功能需求描述了解决方案首先应该解决的实际问题。它们描述了核心功能以及应该实现什么。这可能是一个数据处理应用程序,需要集成多个数据源并执行聚合,以便为一些数据科学家提供简化的数据模型。但是功能需求的想法也适用于预订不同城市旅行的 Android 应用程序。

功能需求总是由作为最终用户代理的业务专家编写的。他们应该关注要解决的问题,这样开发人员或架构师仍然可以决定可行的解决方案应该是什么样子。当然,在实现之前,应该与业务专家一起验证所选择的方法。

注意我特别写了功能需求应该关注问题(或任务)而不是解决方案。这种微小的差异非常重要,因为它为开发人员留下了更大的设计空间来寻找最佳的可能解决方案,而不是由业务专家给出的特定解决方案,后者可能很难在给定的技术范围内实现。

非功能性需求

除了描述软件必须实现的主要任务的功能性需求之外,还有非功能性需求。它们描述了必须实现的一切,但不是核心功能的直接部分。

数据处理管道的典型要求如下:

  • 包含有意义的信息、警告和错误消息的日志被推送到中央日志聚合器。
  • 关于已处理记录数量的指标被发布并推送到一个中央指标收集器。
  • 上游系统在一小时内生成的输入数据的处理时间不会超过一小时。
  • 应用程序必须在现有的集群基础设施(可能是 Kubernetes、YARN 或者甚至是 Mesos)中分布式运行
  • 随着数据量的预期增长,应用程序应该能够轻松扩展其处理吞吐量。

到目前为止,所有这些要求都非常技术性。特别是在数据处理管道的情况下,我会添加以下要求:

  • 业务专家应该能够阅读并(至少粗略地)理解实现的转换逻辑。

这最后一个要求可能是有争议的,但是我发现如果实现了它会非常有帮助。能够与业务专家或利益相关者讨论特定的解决方案,作为一个额外的验证和信任层,是非常宝贵的。幸运的是,在数据处理领域,业务专家通常至少知道 SQL,并且很好地理解典型转换的概念,如过滤、连接和分组聚合。所以我们需要的是一个足够简单易读的逻辑表示。

关注点分离

西蒙·瑞在 Unsplash 上拍摄的照片

我们刚刚看到,几乎所有的应用程序都必须实现两类不同的需求,功能性需求和非功能性需求。一个简单但重要的观察结果是,在一个项目中,甚至在一个公司中,不同应用程序的功能需求因情况而异(因为每个应用程序都要解决不同的问题),但非功能需求通常是相同的,至少在特定的应用程序类型中是如此(如“数据处理管道”或“web 应用程序”)。

每个开发人员现在都应该有一个类似“可重用代码”的术语,甚至可能有“关注点分离”的概念。很明显,在大多数非功能性需求都相同的情况下,这是一条可行之路。如果我们能够构建一个解决方案,其中功能性和非功能性需求在不同的层实现,并且如果我们还成功地共享了负责所有这些非功能性需求的代码,那么我们将收获良多:

  • 通过非功能性需求的共享实现,所有的应用程序都将从任何改进中受益。
  • 由于统一的指标和日志记录,所有应用程序都可以以非常相似的方式集成到整个 IT 环境中。
  • 操作也得到简化,因为关于一个应用程序的知识和问题解决策略可以应用于所有其他应用程序,使用相同的共享基础层来解决非功能性需求。
  • 作为功能需求的一部分实现的核心业务逻辑没有与技术细节混杂在一起,因此更容易被业务专家理解和验证。

下一节将描述一种基于这些想法构建解决方案的可能方法。

声明性数据管道

斯科特·格雷厄姆在 Unsplash 上拍照

通过使用适当的业务逻辑高级描述语言,然后由较低的数据流执行层解析和执行,我们可以获得我上面描述的所有优点。这是我在 Apache Spark 上实现通用数据处理应用程序时选择的路线。

基本上,这个想法是使用简单的 YAML 文件,它包含所有数据转换的纯声明性描述,类似于 Kubernetes 中的部署描述。在我给出一些小例子之前,让我解释一下这种方法的好处:

  • 通过构建在 Apache Spark 之上,我们确保获得 Spark 的所有好处,如可扩展性、可伸缩性、丰富的连接器等等。
  • 具有潜在更高抽象级别的描述语言允许在类似于原始业务需求的级别上指定逻辑(如构建历史、在复杂的 JSON 文档中提取子树等),这些在 Spark DataFrame API 级别上不直接可用。
  • 使用没有任何流控制的纯声明性语言有助于关注逻辑流,从而防止在单个源文件中混合功能性和非功能性需求。
  • 声明性语言还可以用于以低成本提取和提供附加信息,如数据沿袭或输出模式。此信息可用于自动化工作流、模式管理和生成指标。

示例数据流

下面几节给出了一个简单的数据流示例。乍一看,这个例子可能看起来有点复杂,但是您会发现它还包含许多有价值的详细信息,这些信息在某种程度上是必需的,并且可以用于上面提到的额外好处之一,如自动模式管理。

对于这个例子,我将建立一个小的数据处理管道,用于处理来自 NOAA 的包含天气测量的"综合地表数据集。这是一个非常有趣的大型数据集,包含了从全球到 1901 年的天气信息。但是它使用了非常复杂的自定义格式(没有 CSV),其中一些基本的测量可以在固定的位置提取(我们将做的)。在这个例子中,我们不会直接访问他们的服务器,但是我假设一些数据被下载到某个私有位置(比如本地文件系统,S3 或者 HDFS)。

1.源位置

首先,在从 NOAA 服务器下载原始测量值之后,我们需要声明原始测量值存储的物理源位置:

relations:
  measurements-raw:
    kind: file
    format: text
    location: "s3a://dimajix-training/data/weather/"
    pattern: "${year}"
    schema:
      kind: embedded
      fields:
        - name: raw_data
          type: string
          description: "Raw measurement data"
    partitions:
      - name: year
        type: integer
        granularity: 1

这个定义已经包含了大量关于称为“测量值-原始值”的源关系的信息:

  • 种类:文件 —数据存储为文件
  • 格式:文本 —数据存储为文本文件(每行代表一条记录)
  • 位置:… —数据存储在 S3 的指定位置
  • **模式:\({year}** —该位置包含分区,其目录名简单地采用\)year 的形式(分区将出现在下面)
  • 模式:… —数据有一个特定的模式,其中有一个名为“raw_data”的列
  • 分区:… —按“年”对关系进行分区,即其数据沿“年”轴拆分成更小的块。

您看,这已经包含了很多信息,这些信息都是处理关系所必需的(或者至少是有价值的)。

2.读出数据

现在下一步是从上面声明的关系中读入数据。这可以通过以下映射规范来实现:

mappings:
  measurements-raw:
    kind: read
    relation: measurements-raw
    partitions:
      year: $year

我不会像在第一小节中那样遍历所有行——代码应该是不言自明的:该规范指示从先前定义的关系“measurements-raw”中读取单个分区\(year。“\)year”开头的美元表示这是一个变量,必须在某个地方定义或在执行前显式设置。

3.提取测量值

正如我在示例开始时解释的那样,一些度量可以在固定的位置用单个记录提取(其他度量存储在可选的和动态的位置——我们在这里不关心它们)。这可以通过以下选择映射来实现:

mappings:
  measurements:
    kind: select
    input: measurements-raw
    columns:
      usaf: "SUBSTR(raw_data,5,6)"
      wban: "SUBSTR(raw_data,11,5)"
      date: "SUBSTR(raw_data,16,8)"
      time: "SUBSTR(raw_data,24,4)"
      report_type: "SUBSTR(raw_data,42,5)"
      wind_direction: "SUBSTR(raw_data,61,3)"
      wind_direction_qual: "SUBSTR(raw_data,64,1)"
      wind_observation: "SUBSTR(raw_data,65,1)"
      wind_speed: "CAST(SUBSTR(raw_data,66,4) AS FLOAT)/10"
      wind_speed_qual: "SUBSTR(raw_data,70,1)"
      air_temperature: "CAST(SUBSTR(raw_data,88,5) AS FLOAT)/10"
      air_temperature_qual: "SUBSTR(raw_data,93,1)"

现在您可以看到这个映射是如何通过其“输入字段引用第一个映射的,然后指定要生成的列列表以及每个列的表达式。

4.目标位置

现在,我们希望将提取的数据写入一个适当的 Hive 表,再次按年份进行分区。在指定写操作本身之前,我们首先需要创建一个新的目标关系,数据应该被写入其中。具体规定如下:

relations:
  measurements:
    kind: hiveTable
    database: "weather"
    table: "measurements"
    format: parquet
    partitions:
    - name: year
      type: int
    schema:
      kind: mapping
      mapping: measurements

这个关系描述了一个名为“天气”的数据库中的一个名为“测量”的配置单元表。数据应该存储为 Parquet 文件,模式应该从映射“measurements”中隐式地推断出来,这是我们在步骤 3 中定义的。

5.构建目标

现在我们有了一个输入关系、一些提取逻辑和一个目标关系,我们需要创建一个构建目标,它告诉我们由“measurements”映射生成的所有记录都应该被写入“measurements”目标(它反过来表示具有相同名称的 Hive 表)。这可以通过以下方式完成:

targets:
  measurements:
    kind: relation
    relation: measurements
    mapping: measurements
    partition:
      year: $year

称为“度量”的构建目标将映射“度量”的结果与关系“度量”结合起来作为它的目标位置。

您可能会问为什么我们需要明确地指定一个关系和一个构建目标。原因很简单,关系是一个逻辑对象,既可以用于读,也可以用于写(甚至可能在同一个应用程序中)。通过将声明操作分开,我们自动增加了重用单个关系的可能性。

6.构建作业

我们就要完成了,但是最后一个小细节还没找到。很可能您为不同的关系创建了多个目标,但是您不想执行所有的目标。因此,最后一步需要一个构建作业,它主要包含要构建的目标列表。此外,构建作业也是指定正确执行所需的运行时参数的好地方。在我们的示例中,年份是一个自然的候选,因为您可能希望在不同的年份独立运行相同的数据流:

jobs:
  main:
    parameters:
      - name: year
        type: Integer
        default: 2013
    targets:
      - measurements

摘要

让我们总结一下我们需要为工作数据管道指定哪些细节:

  • 关系。像在传统数据库中一样,我们需要指定我们想要读取或写入的物理数据源。我选择“关系”这个术语只是因为这正是 Spark 中使用的术语。关系可以指文件、配置单元表、JDBC 源或任何其他物理数据表示。
  • 映射。转换(和读操作)被建模为映射。虽然我们只使用了两种非常简单的类型(“read”和“select”),但是您可以想象任何类型的数据转换都可以表示为映射。
  • 目标明确。数据处理管道通常可与传统的构建管道相媲美——除了它创建新数据而不是应用程序。因此,我重用了构建工具中的一些概念和术语。构建“目标”表示将数据写入关系所需执行的工作量。
  • 乔布斯。通常(尤其是在批处理中)你不仅只有一个输出,还需要用不同的转换写入多个输出。每个写操作被表示为一个构建目标,这些操作的集合被表示为一个作业。

为了完善“数据构建工具”的概念,Flowman 本身也支持构建阶段,就像它们在 Maven 中一样:

  • 创造。第一阶段是创建和/或迁移任何关系。这解决了整个“模式管理”部分。
  • 打造。第二阶段将执行构建目标隐含的所有写操作。
  • 验证。验证阶段将检查先前执行的写操作是否确实导致一些记录被写入相应的关系。作为单元测试的一部分,验证阶段也可以用来执行一些测试。
  • 截断。虽然前三个阶段是关于创建关系和数据,截断阶段将通过删除关系的内容来执行一些清理,但是它将保留关系本身(配置单元表、目录等)。
  • 干净。最后最后一个阶段也将去除物理关系本身。

我们在上面的规范中没有明确提到构建阶段,你甚至不能这样做。构建阶段是数据管道的执行的一部分,我将在下一节讨论。

执行数据流

我刚刚向您展示了一个简单数据流的小(虽然冗长)示例,它代表了读取、提取和存储数据的非常基本和典型的操作。当然,你不能直接执行这些 YAML 文件。您现在需要的是一个理解上述特定语法的应用程序,然后它可以执行作业、目标、读操作、转换和写操作。

Flowman 就是做这个工作的。这是我为实现这种非常特殊的方法而创建的开源应用程序,在这种方法中,数据流与执行逻辑相分离。它在很大程度上构建于 Apache Spark 之上,如果你有一点 Spark 的经验,你很可能会想象上面的 YAMLs 是如何用 DataFrame API 执行的。

设计优势

也许我在这个系列的第一部分和第二部分中提到的话题现在开始对你更有意义了。或者你可能觉得这种方法太复杂了。不管是哪种情况,让我试着指出这种设计相对于直接使用 Apache Spark 的经典应用程序的一些优点。

通过依赖具有特定实体模型(关系、映射、目标和作业)的高级描述语言,您可以确保数据管道的统一方法。这有助于简化操作并遵循最佳实践(至少我是这么理解的)——实际上,这种方法很难不遵循它们。

接下来,当实现数据管道时,您主要在高层次上工作,技术细节和可能的解决方法隐藏在执行层(Flowman)。

这种方法的另一个优点是,许多非功能方面,如模式管理(创建和更改配置单元表)、提供有意义的运行时指标等,可以在执行层实现,而不会弄乱规范。这是作为构建阶段的一部分完成的,构建阶段完全在执行层实现,不需要在数据流规范本身中明确指定。

最后,即使是倾向于技术的业务专家也能比一个完整的 Spark 应用程序(无论是用 Scala、Java、Python 等编写的)更好地理解 YAML 文件,后者也包含许多样板代码。

最后的话

这是关于使用 Apache Spark 构建健壮的数据管道的系列文章的第三部分。这一次,我向您展示了以非常统一的方式实现数据处理管道的非常具体的方法。它不包含任何 Spark 代码(你可以在 GitHub 上查看 Flowmans 源代码)——这代表了我对数据管道应该是什么样子的看法。

下一部分将介绍如何在本地 Linux 机器上安装和运行 Flowman。

大数据工程— Flowman 启动并运行

原文:https://towardsdatascience.com/big-data-engineering-flowman-up-and-running-cd234ac6c98e?source=collection_archive---------64-----------------------

在您的机器上查看名为 Flowman 的开源、基于 Spark 的 ETL 工具。

西蒙·威尔克斯在 Unsplash 上的照片

这是大数据环境中的数据工程系列的第 4 部分。它将反映我个人的经验教训之旅,并在我创建的开源工具 Flowman 中达到高潮,以承担在几个项目中一遍又一遍地重新实现所有锅炉板代码的负担。

  • 第 1 部分:大数据工程—最佳实践
  • 第 2 部分:大数据工程— Apache Spark
  • 第 3 部分:大数据工程——声明性数据流
  • 第 4 部分:大数据工程——flow man 启动和运行

期待什么

本系列是关于用 Apache Spark 构建批处理数据管道的。上次我介绍了 Flowman 的核心思想,这是一个基于 Apache Spark 的应用程序,它简化了批处理数据管道的实现。现在是时候让 Flowman 在本地机器上运行了。

先决条件

为了按照说明在您的机器上安装一个正常工作的 Flowman,您不需要太多:

  • 要求:64 位 Linux(抱歉,目前没有 Windows 或 Mac OS)
  • 必选:Java (OpenJDK 也可以)
  • 可选:Maven 和 npm,如果您想从源代码构建 Flowman
  • 推荐:访问 S3 上的一些测试数据的 AWS 凭证

安装 Hadoop 和 Spark

尽管 Flowman 直接建立在 Apache Spark 的能力之上,但它并没有提供一个有效的 Hadoop 或 Spark 环境——这是有原因的:在许多环境中(特别是在使用 Hadoop 发行版的公司中),一些平台团队已经提供了 Hadoop/Spark 环境。Flowman 尽最大努力不搞砸,而是需要一个工作的火花装置。

幸运的是,Spark 很容易安装在本地机器上:

下载并安装 Spark

目前最新的 Flowman 版本是 0.14.2,可以在 Spark 主页上获得 Spark 3.0.1 的预构建版本。因此,我们从 Apache 归档文件中下载适当的 Spark 发行版,并对其进行解压缩。

# Create a nice playground which doesn't mess up your system
$ **mkdir playground**
$ **cd playground**# Download and unpack Spark & Hadoop
$ **curl -L** [**https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop3.2.tgz**](https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop3.2.tgz) **| tar xvzf -**# Create a nice link
$ **ln -snf spark-3.0.1-bin-hadoop3.2 spark**

Spark 包中已经包含了 Hadoop,所以只需下载一次,您就已经安装了 Hadoop,并且彼此集成。

安装流量计

下载和安装

你可以在 GitHub 的相应发布页面上找到预建的 Flowman 包。对于这个研讨会,我选择了flowman-dist-0.14.2-oss-spark3.0-hadoop3.2-bin.tar.gz,它非常适合我们之前刚刚下载的 Spark 包。

# Download and unpack Flowman
$ **curl -L** [**https://github.com/dimajix/flowman/releases/download/0.14.2/flowman-dist-0.14.2-oss-spark3.0-hadoop3.2-bin.tar.gz**](https://github.com/dimajix/flowman/releases/download/0.14.2/flowman-dist-0.14.2-oss-spark3.0-hadoop3.2-bin.tar.gz) **| tar xvzf -**# Create a nice link
$ **ln -snf flowman-0.14.2 flowman**

配置

现在,在使用 Flowman 之前,您需要告诉它在哪里可以找到我们在上一步中刚刚创建的 Spark 主目录。这可以通过在flowman/conf/flowman-env.sh中提供一个有效的配置文件来完成(模板可以在flowman/conf/flowman-env.sh.template中找到),或者我们可以简单地设置一个环境变量。为了简单起见,我们遵循第二种方法

# This assumes that we are still in the directory "playground"
$ **export SPARK_HOME=$(pwd)/spark**

为了在下面的例子中访问 S3,我们还需要提供一个包含一些基本插件配置的默认名称空间。我们简单地复制提供的模板如下:

# Copy default namespace
$ **cp flowman/conf/default-namespace.yml.template flowman/conf/default-namespace.yml**# Copy default environment
$ **cp flowman/conf/flowman-env.sh.template flowman/conf/flowman-env.sh**

这就是我们运行 Flowman 示例所需的全部内容。

天气示例

下面的演练将使用“天气”示例,该示例对来自 NOAA 的“综合地表数据集”的一些天气数据执行一些简单的处理。

项目详情

“天气示例”执行三个典型的 ETL 处理任务:

  • 读入原始测量数据,提取一些属性,并将结果存储在拼花地板文件中
  • 读入工作站主数据并存储在拼花文件中。
  • 将测量值与主数据整合,汇总每个国家和年份的测量值,计算最小值、最大值和平均值,并将结果存储在拼花文件中。

这三个任务包括许多 ETL 管道中常见的典型的“读取、提取、写入”、“集成”和“聚合”操作。

为了简单起见,该示例没有使用 Hive 元存储,尽管我强烈建议将它用于任何严肃的 Hadoop/Spark 项目,作为管理元数据的中央权威。

Flowman 项目结构

您将在目录flowman/examples/weather中找到 Flowman 项目。该项目由几个子文件夹组成,反映了 Flowman 的基本实体类型:

  • config —该文件夹包含一些配置文件,这些文件包含 Spark、Hadoop 或 Flowman 本身的属性。
  • 模型—模型文件夹包含存储在磁盘或 S3 上的物理数据模型的描述。有些模型是指读入的源数据,有些模型是指将由 Flowman 生成的目标数据。
  • 映射 —映射文件夹包含处理逻辑。这包括读入数据等简单步骤,以及连接和聚合等更复杂的步骤。
  • 目标 —目标文件夹包含构建目标的描述。Flowman 认为自己是一个数据构建工具,因此它需要知道应该构建什么。目标通常只是简单地将映射的结果与数据模型耦合起来,用作接收器。
  • 作业—最后,作业文件夹包含作业(在本例中只有一个),它或多或少只是应该一起构建的目标列表。Flowman 将负责正确的建造顺序。

这种目录布局有助于将一些结构带入项目,但是您可以使用您喜欢的任何其他布局。你只需要指定project.yml文件中的目录,这个文件在例子的根目录下(即flowman/examples/weather)。

Flowman 手动操作

示例数据存储在我自己提供的 S3 存储桶中。为了访问数据,您需要在您的环境中提供有效的 AWS 凭据:

$ **export AWS_ACCESS_KEY_ID=<your aws access key>**
$ **export AWS_SECRET_ACCESS_KEY=<your aws secret key>**

我们通过运行交互式 Flowman shell 来启动 Flowman。虽然这不是自动批处理中使用的工具(flowexec是该场景的合适工具),但它让我们很好地了解了 Flowman 中的 ETL 项目是如何组织的。

# This assumes that we are still in the directory "playground"
$ **cd flowman**# Start interactive Flowman shell
$ **bin/flowshell -f examples/weather**20/10/10 09:41:21 INFO SystemSettings: Using default system settings
20/10/10 09:41:21 INFO Namespace: Reading namespace file /home/kaya/tmp/playgroud/flowman-0.14.2-SNAPSHOT/conf/default-namespace.yml
20/10/10 09:41:23 INFO Plugin: Reading plugin descriptor /home/kaya/tmp/playgroud/flowman-0.14.2-SNAPSHOT/plugins/flowman-example/plugin.yml
...

日志输出完成后,您应该会看到一个提示flowman:weather>,现在您可以输入一些要执行的命令。

建筑物

首先,我们要执行main任务,并构建所有已定义的目标。因为作业定义了一个参数year,每次调用只处理一年,所以我们需要为这个参数提供一个值。因此,我们通过下面的命令开始 2011 年main中所有目标的构建过程:

flowman:weather> **job build main year=2011**20/10/10 09:41:33 INFO Runner: Executing phases 'create','build' for job 'weather/main'
20/10/10 09:41:33 INFO Runner: Job argument year=2011
20/10/10 09:41:33 INFO Runner: Running phase create of job 'weather/main'   with arguments year=2011
20/10/10 09:41:33 INFO Runner: Environment (phase=create) basedir=file:///tmp/weather
20/10/10 09:41:33 INFO Runner: Environment (phase=create) force=false
20/10/10 09:41:33 INFO Runner: Environment (phase=create) job=main
20/10/10 09:41:33 INFO Runner: Environment (phase=create) namespace=default
20/10/10 09:41:33 INFO Runner: Environment (phase=create) phase=create
20/10/10 09:41:33 INFO Runner: Environment (phase=create) project=weather
20/10/10 09:41:33 INFO Runner: Environment (phase=create) year=2011
...

再次产生大量输出(部分由 Spark 的启动产生,但也由 Flowman 产生,因此您实际上可以跟踪 Flowman 在做什么。日志记录总是一个困难的主题——过多的日志记录会分散用户的注意力,而过少的输出会使问题的解决更加困难。

具体来说,您应该看到两个重要的事实:

...
20/10/10 09:41:33 INFO Runner: Executing phases 'create','build' for job 'weather/main'
20/10/10 09:41:33 INFO Runner: Running phase '**create**' of job 'weather/main'   with arguments year=2011
...

后来呢

...
20/10/10 09:41:37 INFO Runner: Running phase '**build**' of job 'weather/main'   with arguments year=2011
...

这意味着指示 flow man构建一个任务的所有目标实际上执行了完整的构建生命周期,它包括以下两个阶段

  • create ”阶段创建和/或迁移构建目标中引用的所有物理数据模型,如目录结构、配置单元表或数据库表。这个阶段只关注模式管理
  • 然后'构建'阶段将用从数据流中创建的记录填充这些关系,如映射和目标所定义的。

Flowman 还支持清理生命周期,首先在“ truncate 阶段删除数据,然后在“ destroy 阶段删除所有目录和表格。

目标构建顺序

当您研究 weather 项目的细节时,您会发现构建目标有一些隐含的运行时依赖性:首先,来自 S3 的原始数据需要传输到您的本地机器,并存储在一些本地目录中(实际上在/tmp/weather)。然后这些目录作为构建aggregates目标的输入。

您不会发现任何显式的依赖关系信息,Flowman 会自己找出这些构建时依赖关系,并以正确的顺序执行所有操作。您可以在以下日志记录输出中看到这一点:

20/10/12 20:29:15 INFO Target: Dependencies of phase 'build' of target 'weather/measurements': 
20/10/12 20:29:15 INFO Target: Dependencies of phase 'build' of target 'weather/aggregates': weather/stations,weather/measurements
20/10/12 20:29:15 INFO Target: Dependencies of phase 'build' of target 'weather/stations': 
20/10/12 20:29:15 INFO Runner: Executing phase 'build' with sequence: weather/measurements, weather/stations, weather/aggregates

Flowman 首先收集所有隐式依赖项(前三个日志行),然后找到所有目标的适当执行顺序(最后一个日志行)。

所有构建目标的自动排序在具有许多依赖输出的复杂项目中非常有用,在这些项目中很难手动跟踪正确的构建顺序。使用 Flowman,您只需添加一个新的构建目标,所有的输出都会自动以正确的顺序写入。

重建

当您现在尝试重建同一年时,Flowman 将自动跳过处理,因为所有目标关系都已建立并包含 2011 年的有效数据:

flowman:weather> **job build main year=2011**...
20/10/10 10:56:03 INFO Runner: Target 'weather/measurements' not dirty in phase build, skipping execution
...
20/10/10 10:56:03 INFO JdbcStateStore: Mark last run of phase 'build' of job 'default/weather/main' as skipped in state database
...

同样,这个逻辑是从经典的构建工具领域借用来的,比如make,它也跳过现有的目标。

当然,您可以通过在命令末尾添加一个--force标志来强制 Flowman 重新处理数据。

检查关系

现在我们想直接在 Flowman 中检查一些结果(不需要借助一些命令行工具来检查 Parquet 文件)。这可以通过检查关系来完成,这些关系总是代表存储在一些磁盘或数据库中的物理模型。

首先,让我们获得项目中定义的所有关系的列表:

flowman:weather> **relation list**aggregates
measurements
measurements-raw
stations
stations-raw

当您查看了model目录中的项目文件后,您应该会觉得很熟悉。该列表包含项目中定义的所有模型名称。

现在让我们检查存储在stations关系中的主数据:

flowman:weather> **relation show stations**...
usaf,wban,name,country,state,icao,latitude,longitude,elevation,date_begin,date_end
007018,99999,WXPOD 7018,null,null,null,0.0,0.0,7018.0,20110309,20130730
007026,99999,WXPOD 7026,AF,null,null,0.0,0.0,7026.0,20120713,20170822
007070,99999,WXPOD 7070,AF,null,null,0.0,0.0,7070.0,20140923,20150926
008260,99999,WXPOD8270,null,null,null,0.0,0.0,0.0,20050101,20100920
008268,99999,WXPOD8278,AF,null,null,32.95,65.567,1156.7,20100519,20120323
008307,99999,WXPOD 8318,AF,null,null,0.0,0.0,8318.0,20100421,20100421
008411,99999,XM20,null,null,null,null,null,null,20160217,20160217
008414,99999,XM18,null,null,null,null,null,null,20160216,20160217
008415,99999,XM21,null,null,null,null,null,null,20160217,20160217
008418,99999,XM24,null,null,null,null,null,null,20160217,20160217
...

目前,所有数据都显示为 CSV——这并不意味着数据存储为 CSV(事实并非如此,它存储在 Parquet 文件中)。

现在让我们来考察一下measurements的数据:

flowman:weather> **relation show measurements**...
usaf,wban,date,time,wind_direction,wind_direction_qual,wind_observation,wind_speed,wind_speed_qual,air_temperature,air_temperature_qual,year
999999,63897,20110101,0000,155,1,H,7.4,1,19.0,1,2011
999999,63897,20110101,0005,158,1,H,4.8,1,18.6,1,2011
999999,63897,20110101,0010,159,1,H,4.4,1,18.5,1,2011
999999,63897,20110101,0015,148,1,H,3.9,1,18.3,1,2011
999999,63897,20110101,0020,139,1,H,3.6,1,18.1,1,2011
999999,63897,20110101,0025,147,1,H,3.6,1,18.1,1,2011
999999,63897,20110101,0030,157,1,H,4.0,1,18.0,1,2011
999999,63897,20110101,0035,159,1,H,3.5,1,17.9,1,2011
999999,63897,20110101,0040,152,1,H,3.0,1,17.8,1,2011
999999,63897,20110101,0045,140,1,H,3.4,1,17.8,1,2011

最后,让我们来看看总量。类似于measurements关系,aggregates关系也是分区的。我们还可以选择为分区列指定一个值:

flowman:weather> **relation show aggregates -p year=2011**country,min_wind_speed,max_wind_speed,avg_wind_speed,min_temperature,max_temperature,avg_temperature,year
SF,0.0,12.3,2.1503463,2.3,34.9,17.928537,2011
US,0.0,36.0,2.956173,-44.0,46.4,11.681804,2011
RS,0.0,12.0,3.3127716,-33.0,32.0,4.5960307,2011
MY,0.0,10.8,2.0732634,21.0,34.0,27.85072,2011
GM,0.0,15.4,3.910823,-10.0,30.0,9.442137,2011
FI,0.0,21.0,3.911331,-34.4,30.7,3.1282191,2011
IC,0.0,31.9,7.235976,-14.0,17.2,5.138462,2011
SC,0.0,14.0,4.618577,20.0,32.0,27.329834,2011
NL,0.0,31.4,4.969081,-8.2,34.0,10.753498,2011
AU,0.0,15.9,1.9613459,-15.0,35.0,9.814931,2011

检查映射

在 ETL 应用程序的开发过程中,能够查看一些中间结果通常非常有用。这些映射的中间结果可能并不总是在磁盘上或数据库中有物理表示。它们只是概念,记录在处理过程中只在内存中具体化。但是 Flowman shell 也支持通过查看映射的结果来检查这些中间结果。

在我们展示这个特性之前,我们首先需要提前执行一个有点笨拙的步骤:与关系相反,数据流本身依赖于参数year,并且在没有设置该参数的情况下无法执行或检查。此外,Flowman 作业还可能设置一些执行所需的附加环境变量。

为了减轻对这种情况的处理,Flowman 提供了一个特殊的命令来设置执行环境,因为它将由特定的作业提供:

flowman:weather> **job enter main year=2011** flowman:weather/main>

作为回报,提示符发生变化,现在还包含作业的名称。

现在我们可以开始检查中间结果了。首先,让我们获得所有映射的列表:

flowman:weather/main> **mapping list**aggregates
facts
measurements
measurements-extracted
measurements-joined
measurements-raw
stations
stations-raw

现在,让我们从检查存储在 S3 的原始测量数据开始:

flowman:weather/main> **mapping show measurements-raw**043499999963897201101010000I+32335-086979CRN05+004899999V0201551H007419999999N999999999+01901+99999999999ADDAA101000991AO105000491CF1105210CF2105210CF3105210CG1+0120410CG2+0126710CG3+0122710CN1012610012110999990CN2+999990+0219100010CN30149971005638010CN40100000104001016010CO199-06CR10510210CT1+019010CT2+019110CT3+019010CU1+999990000410CU2+999990000410CU3+999990000410CV1+019010999990+020310999990CV2+019110999990+020310999990CV3+019010999990+020310999990CW100330101076010KA1010M+02031KA2010N+01901KF1+01951OB10050100101571099999900105210
013399999963897201101010005I+32335-086979CRN05+004899999V0201581H004819999999N999999999+01861+99999999999ADDAO105000091CG1+0120410CG2+0126710CG3+0122710CO199-06CT1+018610CT2+018610CT3+018610CW100330102311010OB10050064101581099999900096910
013399999963897201101010010I+32335-086979CRN05+004899999V0201591H004419999999N999999999+01851+99999999999ADDAO105000091CG1+0120410CG2+0126710CG3+0122710CO199-06CT1+018410CT2+018510CT3+018510CW100330102901010OB10050054101541099999900105010
...

如您所见,原始数据很难处理。但是幸运的是,我们已经有了提取至少一些简单字段的映射:

flowman:weather/main> **mapping show measurements-extracted**wind_speed_qual,wban,usaf,air_temperature,date,wind_speed,air_temperature_qual,wind_direction,report_type,wind_direction_qual,time,wind_observation
1,63897,999999,19.0,20110101,7.4,1,155,CRN05,1,0000,H
1,63897,999999,18.6,20110101,4.8,1,158,CRN05,1,0005,H
1,63897,999999,18.5,20110101,4.4,1,159,CRN05,1,0010,H
1,63897,999999,18.3,20110101,3.9,1,148,CRN05,1,0015,H
1,63897,999999,18.1,20110101,3.6,1,139,CRN05,1,0020,H
1,63897,999999,18.1,20110101,3.6,1,147,CRN05,1,0025,H
1,63897,999999,18.0,20110101,4.0,1,157,CRN05,1,0030,H
1,63897,999999,17.9,20110101,3.5,1,159,CRN05,1,0035,H
1,63897,999999,17.8,20110101,3.0,1,152,CRN05,1,0040,H
1,63897,999999,17.8,20110101,3.4,1,140,CRN05,1,0045,H

使用相同的命令,我们还可以检查stations映射:

flowman:weather/main> **mapping show stations**usaf,wban,name,country,state,icao,latitude,longitude,elevation,date_begin,date_end
007018,99999,WXPOD 7018,null,null,null,0.0,0.0,7018.0,20110309,20130730
007026,99999,WXPOD 7026,AF,null,null,0.0,0.0,7026.0,20120713,20170822
007070,99999,WXPOD 7070,AF,null,null,0.0,0.0,7070.0,20140923,20150926
008260,99999,WXPOD8270,null,null,null,0.0,0.0,0.0,20050101,20100920
008268,99999,WXPOD8278,AF,null,null,32.95,65.567,1156.7,20100519,20120323
008307,99999,WXPOD 8318,AF,null,null,0.0,0.0,8318.0,20100421,20100421
008411,99999,XM20,null,null,null,null,null,null,20160217,20160217
008414,99999,XM18,null,null,null,null,null,null,20160216,20160217
008415,99999,XM21,null,null,null,null,null,null,20160217,20160217
008418,99999,XM24,null,null,null,null,null,null,20160217,20160217

最后,我们可以再次离开作业上下文(这将清除所有参数和特定于作业的环境变量):

flowman:weather/main> **job leave**

执行历史

Flowman 还可以选择跟踪已经执行的所有过去运行的作业。这些信息存储在一个小型数据库中。这个历史数据库背后的想法是提供一个机会来记录成功和失败的运行,而不需要额外的外部监控系统。

我们在开始时从一个模板复制的示例配置default-namespace.yml支持这种历史记录,并将信息存储在一个小型 Derby 数据库中。

flowman:weather> **history job search**+---+---------+-------+----+------+----+-------+-----------------------------+-----------------------------+
| id|namespace|project| job| phase|args| status|                     start_dt|                       end_dt|
+---+---------+-------+----+------+----+-------+-----------------------------+-----------------------------+
|  1|  default|weather|main|create|    |success|2020-10-09T11:37:35.161Z[UTC]|2020-10-09T11:37:40.211Z[UTC]|
|  2|  default|weather|main| build|    |success|2020-10-09T11:37:40.230Z[UTC]|2020-10-09T11:38:43.435Z[UTC]|
+---+---------+-------+----+------+----+-------+-----------------------------+-----------------------------+

我们也可以搜索所有已经建成的目标。在以下示例中,我们指定只搜索作为 id 为 1 的作业运行的一部分而构建的所有目标:

flowman:weather> **history target search -J 1**+--+-----+---------+-------+------------+----------+------+-------+-----------------------------+-----------------------------+
|id|jobId|namespace|project|      target|partitions| phase| status|                     start_dt|                       end_dt|
+--+-----+---------+-------+------------+----------+------+-------+-----------------------------+-----------------------------+
| 1|    1|  default|weather|measurements|          |create|success|2020-10-12T18:02:50.633Z[UTC]|2020-10-12T18:02:52.179Z[UTC]|
| 2|    1|  default|weather|  aggregates|          |create|success|2020-10-12T18:02:52.244Z[UTC]|2020-10-12T18:02:52.261Z[UTC]|
| 3|    1|  default|weather|    stations|          |create|success|2020-10-12T18:02:52.304Z[UTC]|2020-10-12T18:02:52.320Z[UTC]|
+--+-----+---------+-------+------------+----------+------+-------+-----------------------------+-----------------------------+

放弃

最后,我们通过exitquit退出 Flowman shell:

flowman:weather> **quit**

执行项目

到目前为止,我们只将 Flowman shell 用于项目的交互工作。实际上,开发 shell 的第二步是帮助分析问题和调试数据流。使用 Flowman 项目的主要命令是flowexec,用于非交互式批处理执行,例如在 cron-jobs 中。

它与 Flowman shell 共享大量代码,因此命令通常完全相同。主要的区别是使用flowexec你可以在命令行上指定命令,而flowshell会提供自己的提示。

例如,要运行 2014 年天气项目的“构建”生命周期,您只需运行:

$ **bin/flowexec -f examples/weather job build main year=2014**...

谢谢!

非常感谢您花时间阅读这篇冗长的文章。非常感谢您!发给所有试图在本地机器上实践这个例子的人。如果你对这个例子有疑问,请给我留言——简化这样的过程总是很困难的,我可能会忽略一些问题。

最后的话

这是关于使用 Apache Spark 构建健壮的数据管道的系列文章的最后一部分。现在,您应该对我构建数据管道的最佳实践的偏好以及我在 Flowman 中的实现有了一个概念,Flowman 目前在两家不同的公司的生产中使用。整个方法已经为我提供了很好的服务,我仍然更喜欢它,而不是一个不统一的单个 Spark 应用程序集合,它们本质上做着非常相似的事情。

如果您对在您的项目中使用 Flowman 感兴趣,那么非常欢迎您尝试一下,并与我联系以解决任何问题。

大数据文件格式解释

原文:https://towardsdatascience.com/big-data-file-formats-explained-dfaabe9e8b33?source=collection_archive---------8-----------------------

斯坦尼斯拉夫·康德拉蒂耶夫在 Unsplash 上的照片

介绍

对于数据湖,在 Hadoop 生态系统中,使用文件系统。然而,大多数云提供商已经将其替换为自己的深度存储系统,如 S3GCS 。使用深度存储时,选择正确的文件格式至关重要。

这些文件系统或深度存储系统比数据库便宜,但只提供基本存储,不提供强有力的保证。

您需要根据您的需求和预算,为您的使用情形选择合适的存储。例如,如果预算允许,您可以使用数据库进行接收,然后一旦数据被转换,就将其存储在您数据湖中以供 OLAP 分析。或者,您可以将所有内容存储在深层存储中,而将一小部分热数据存储在快速存储系统(如关系数据库)中。

文件格式

请注意,深度存储系统将数据存储为文件,不同的文件格式和压缩算法为某些用例提供了好处。你如何在你的数据湖中存储数据是至关重要的,你需要考虑格式压缩,尤其是你如何** 分割 你的数据。**

最常见的格式有 CSV、JSON、****、 协议缓冲区 拼花ORC 。****

文件格式选项

选择格式时要考虑的一些事情有:

  • 你的数据的结构:一些格式接受嵌套数据,比如 JSON、Avro 或 Parquet,其他的则不接受。即使有,也可能不是高度优化的。Avro 是嵌套数据最有效的格式,我建议不要使用 Parquet 嵌套类型,因为它们非常低效。进程嵌套的 JSON 也非常占用 CPU 资源。一般来说,建议在摄取数据时将数据拉平。
  • 性能:Avro 和 Parquet 等一些格式比其他此类 JSON 表现更好。即使在 Avro 和 Parquet 之间,对于不同的用例,一个会比另一个更好。例如,因为 Parquet 是一种基于列的格式,所以使用 SQL 查询数据湖很好,而 Avro 更适合 ETL 行级转换。
  • 易阅读:考虑是否需要人阅读数据。JSON 或 CSV 是文本格式,是人类可读的,而更高性能的格式如 parquet 或 Avro 是二进制的。
  • 压缩:有些格式比其他格式提供更高的压缩率。
  • 模式演变:在数据湖中添加或删除字段远比在数据库中复杂。像 Avro 或 Parquet 这样的格式提供了某种程度的模式进化,允许您在更改数据模式的同时查询数据。像Delta Lakeformat 这样的工具提供了更好的工具来处理模式的变化。
  • 兼容性 : JSON 或 CSV 被广泛采用,几乎与任何工具兼容,而性能更高的选项集成点更少。

文件格式

  • CSV :兼容性、电子表格处理和人类可读数据的良好选择。数据必须是平面的。它效率不高,并且不能处理嵌套数据。分隔符可能有问题,这会导致数据质量问题。将此格式用于探索性分析、概念验证或小型数据集。
  • JSON :在 API 中大量使用。嵌套格式。它被广泛采用,人们可以阅读,但是如果有很多嵌套字段,就很难阅读。非常适合小型数据集、着陆数据或 API 集成。如果可能,在处理大量数据之前转换为更有效的格式。
  • Avro :非常适合存储行数据,非常高效。它有一个模式并支持进化。与卡夫卡大融合。支持文件分割。将其用于行级操作或 Kafka 中。写数据很棒,读起来比较慢。
  • 协议缓冲区:非常适合 API,尤其是 gRPC 。支持模式,速度非常快。用于 API 或机器学习。
  • 拼花:柱状收纳。它有模式支持。它与 Hive 和 Spark 配合得非常好,作为一种将列数据存储在使用 SQL 查询的深层存储中的方法。因为它将数据存储在列中,所以查询引擎将只读取具有所选列的文件,而不是整个数据集,这与 Avro 相反。将其用作报告层。
  • 类似于拼花地板,它提供了更好的压缩性。它也提供了更好的模式进化支持,但是不太受欢迎。

文件压缩

最后,您还需要考虑如何压缩数据,权衡文件大小和 CPU 成本。一些压缩算法速度较快,但文件较大,而另一些速度较慢,但压缩率较高。更多详情请查看此 文章

压缩选项(图片由作者提供)

我推荐使用快节奏的处理流数据,因为它不需要太多的 CPU 能力。对于批次来说,bzip2 是一个很好的选择。

结论

正如我们所看到的,CSV 和 JSON 是易于使用、人类可读的常见格式,但缺乏其他格式的许多功能,这使得它太慢,无法用于查询数据湖。 ORC 和 Parquet 在 Hadoop 生态系统中广泛用于查询数据,而 Avro 也在 Hadoop 之外使用,特别是与 Kafka 一起用于摄取,非常适合行级 ETL 处理。面向行的格式比面向列的格式具有更好的模式进化能力,这使它们成为数据摄取的一个很好的选择。

更新:我目前在坦桑尼亚帮助当地的一所学校,我创建了一个 GoFundMe 活动 来帮助孩子们,通过这个链接来捐款,每一点帮助!

我希望你喜欢这篇文章。欢迎发表评论或分享这篇文章。跟随me进行以后的帖子。

面向小型企业的大数据

原文:https://towardsdatascience.com/big-data-for-small-business-ae851f34e5a5?source=collection_archive---------51-----------------------

斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上的照片

面向小型企业的大数据

数据科学、机器学习(ML)和人工智能(AI)的大部分焦点和注意力都落在大型企业以及它们在该领域取得的全面创新收益上。

但事实是,数据科学对任何企业都至关重要,即使在较小的规模上执行,也能证明其极其有价值。

无论你的公司有 10 名员工还是 10,000 名员工,你都有可能在客户获取成本、客户流失、销售预测、物流或占领市场份额方面面临完全相同的挑战——只不过是用更少的资源实现这些目标。

尽管初创公司或小公司可能不会像大型企业那样捕获大量数据,但其种类和速度通常是相同的。为了与该领域更大的竞争对手竞争,利用少量资源快速利用这些数据可能变得更加必要。

事实上,在利用数据科学、ML 和 AI 方面,较小的公司甚至有一些优势。例如:

小公司更灵活

初创公司和小公司相对于大公司的优势在于,大多数都是由年轻员工创立的,他们不像传统的企业经营方式那样一成不变。

对于一个拥有十几名员工而不是几千名员工的组织来说,这种规模也更容易实施,这使得以数据为中心的思维模式更容易渗透到公司文化中。

对新思想的开放性、灵活性、创新思维以及创造性和探索性思维是创业文化的标志。

处理数据的更敏捷的方法意味着能够迭代想法和模型,快速失败,并轻松地将工作模型投入生产,以便更快地看到真正的商业价值,这种经验证的学习概念对于将商业模型和产品导向正确的方向非常重要。

小公司从一开始就是数据驱动的

由于大多数小公司和初创公司天生就以不同的方式思考他们的业务,这意味着只要手头有合适的工具,他们就可以从一开始就由数据驱动。许多大公司(令人惊讶的是,这对它们不利)仍然是直觉和高层管理人员的突发奇想与传统商业实践中几十年来根深蒂固的习惯相结合的产物。

这种根深蒂固的实践和“知识”可能非常危险,因为客户和市场是变化的,如果企业不适应,它可能会失败。

这就是为什么“我知道”这句话是危险的,因为我们只能在怀疑中确定,有了数据我们可以证明一个假设,然后说“我们的数据表明……”。

从一开始就使用数据来有效地推动决策制定,对于较小的新企业来说是一个巨大的竞争优势,也是未来增长的基础(而不是像许多老公司那样面临痛苦的转型)。

小公司不需要数据科学团队来做

现实情况是,数据科学家很难找到,雇佣成本很高,也很难留住。这使得进入壁垒对于一个成长中的公司来说似乎几乎是不可能的,因为它面临着与大公司相同的挑战,并且处于拥挤的市场中。

好消息(以及秘密)是:你不需要一个大型数据科学团队来从你的数据中获取价值(或者做 ML 甚至 AI)。关键是要有合适的技术,恰当地利用业务分析师的技能,他们可能会也可能不会编码,以有意义的方式为有影响的数据项目做出贡献。

即使只是通过实施一些简单的概念和工具,数据科学家也可以极大地改善公司中收集和处理的数据,并在处理数据时指导他人和指导最佳实践,其中许多工具都是免费的,并得到了社区的大力支持。

你不需要一个庞大的数据科学团队来从你的数据中获取价值。

这意味着允许他们轻松连接数据,快速准备和清理数据,甚至制作或迭代机器学习模型以进行预测分析。最后一点是有一个可靠的方法将这些模型投入生产,理想情况下只需几次点击就可以减少摩擦。

虽然在一个大型科技公司的世界里,作为一家初创公司或小公司似乎是一种劣势,但事实是,有了合适的工具和心态,这真的是一种优势。数据科学不是为那些财大气粗、拥有无限资源的人保留的精英领域。

现在,创业公司和小公司比以往任何时候都更有技术,可以在许多更老、更大的公司瞎忙的地方蓬勃发展——问题是,他们会利用这一技术吗?

如果你喜欢我的想法——在推特上关注我 @qayyumrajan

10 分钟内的大数据

原文:https://towardsdatascience.com/big-data-in-10-minutes-bead3c012ba4?source=collection_archive---------27-----------------------

来源:https://www.flickr.com/people/22402885@N00

是的,10 分钟就可以开始处理您的第一个大数据集!

在本文中,我将向您展示如何轻松进入大数据世界,前提是您有一些 Python 背景。

开始这个小旅程的最佳点是首先了解什么是大数据。答案真的取决于你电脑的 RAM 大小和处理速度。对于传统的 PC 来说,超过 8GB 或 16GB 的任何东西都很难处理。公司的机器可能会吃得更多一点。因此,大数据基本上是任何太大而无法以传统方式处理的数据集。

那么我们如何处理大数据呢?显然,一种方法是购买更多的内存和更强的处理器。但是这非常昂贵,并且也不是可扩展的解决方案。在数据集非常大(> 1TB)的情况下,它可能也不起作用。相反,有一个更好的、可扩展的解决方案。就是在多台计算机/计算单元上划分数据集和工作量。然而,这并不意味着你需要自己购买硬件和连接机器。幸运的是,互联网服务为我们提供了现成的完整计算基础设施。

Amazon AWS 就是这样一种服务,用户可以根据需要租用任意数量的计算单元来处理任意数量的数据。计算单元位于亚马逊服务器上,随时听候您的调遣。使用 AWS 服务的费用是完全透明的,按每小时每单位计算。不要担心,在本例中运行第一次大数据分析的总成本应该不到 4 美元。

话虽如此,让我们开始工作吧!

第 1 步创建一个亚马逊 AWS 账户:

1a。去https://aws.amazon.com/记账

创建 AWS 帐户

1b。除了通常的信息,您还需要输入您的信用卡详细信息。这是注册的最后一步。为了检查你的信用卡是否真实,亚马逊 AWS 会从你的账户中一次性扣除 1 美元(相当烦人,我同意)。

提供信用卡信息

在帐户设置期间,选择您的位置:美国西部(俄勒冈州)(这不是强制性的,但它不会伤害)

步骤 2 是启动您的集群

2a。集群是一群并行工作的计算机实例/处理器的另一种说法。登录您的 AWS 帐户,进入左上角的 Sservices,输入 EMR 。这代表 Elastic Map Reduce,它是亚马逊的一项并行计算服务。

亚马逊提供很多服务,选择 EMR

2b。一旦进入 EMR,进入左侧面板的集群,点击创建集群

开始做一个集群

2c 。然后点击进入高级选项,确保你的启动模式设置为集群。

转到高级选项

一旦你进入高级选项,有 4 页要填写,按照我下面的方法设置它们。

2d。在第一页(软件和步骤),确保您使用最新的 EMR 版本,并选择 Spark、Hive 和 Hadoop。此外,选择泽佩林,色相,Ganglia 和猪是一个好主意。点击下一步。

群集高级选项的第一页—软件

2e。在第 2 页(硬件)中,我们应该选择实例/处理器类型和实例数量。亚马逊 AWS 提供了许多不同的实例/处理器类型。它们有不同的用途和价格,所以调查哪种配置最适合您的任务是个好主意。

在这个例子中,我选择了五个 M5.xlarge 处理器(1 个主实例和 4 个核心实例)。这提供了比普通电脑多 10 倍的内存。事实证明,这样的构造对于处理 12 GB 和 2500 万行的数据集已经足够好了。

群集高级选项的第 2 页—硬件设置

2f。在集群高级选项的第 3 页(常规集群设置),我们应该为集群命名

群集高级选项的第 3 页—常规设置

2g。在集群高级选项的第 4 页(安全)中,您可以设置安全配置。我们不会太关注这个,因此我选择了在没有 EC2 密钥对的情况下继续。你可以在这里阅读更多关于 EC2 密钥对的信息。

群集高级选项第 4 页—安全性

2h。现在您的集群已经设置好了,点击创建集群,将出现以下屏幕

您的集群几乎准备好了

2i。点击左侧窗格中的集群。您的集群的状态是开始。一旦集群准备就绪,状态将变为等待(集群就绪)。此外,一旦集群可以使用,集群名称旁边的空绿色圆圈将变成一个完整的绿色圆圈。随时刷新页面,检查圆圈是否变成全绿色。

等待完整的绿色圆圈出现

您的集群已经准备好了!

2j。现在我们应该为您的代码设置工作空间了。亚马逊 EMR 在平台中集成了 Jupyter 笔记本。在左侧窗格中点击笔记本,然后点击创建笔记本

启动 Jupyter 笔记本

2k。为您的笔记本命名,然后点击选择(在集群下),将您的笔记本连接到您刚刚创建的集群。

为您的笔记本命名

将您的笔记本电脑连接到集群

2l。然后点击选择集群然后创建笔记本。你的笔记本也需要几分钟准备好。一旦准备就绪,它将从开始变为就绪。点击上方中的打开。

等到你的笔记本准备好了

2m。您的 Jupyter 笔记本将在另一个浏览器窗口中打开。一旦打开笔记本,一定要点击内核/改内核 / PySpark。这是第二步的最后一部分。

将您的 Jupyter 笔记本设置为 PySpark

第三步是准备你的(大)数据

3a。返回 AWS 第一页,转到服务并找到 S3。S3 是亚马逊提供的一个非常大的云数据库。这是您的数据应该存储的地方。

去亚马逊 S3

3b。在 S3 中,点击创建桶。这是一个存储库,您将在其中上传数据。

在亚马逊 S3 创建一个桶

3c。给你的铲斗起一个独特的名字。亚马逊 S3 上没有两个桶可以共享同一个名称

给你的 S3 桶一个独特的名字

3d。点击桶来打开它

打开你的桶

3e。您现在可以将数据添加到您的存储桶中。对于小于 160 GB 的文件,您可以简单地将它们拖放到您的存储桶中。(要上传大于 160 GB 的数据,您必须使用 AWS CLI、AWS SDK 或亚马逊 S3 REST API)

出于本教程的目的,您可以继续使用这个虚拟数据集。将其下载到您的本地机器,然后上传到您的 bucket。

虚拟数据集只有几 MB,所以不是大数据。如果你有一个合适的大数据集,可以自由地使用它来代替虚拟数据集。

将数据上传到您的铲斗

您的数据将出现在存储桶中

3f。查看您的数据是否在桶中

您的数据在桶里,准备分析

3g。现在已经为分析做好了一切准备。到您的数据的路径具有以下模式:“s3n:// 您的存储桶名 / 您的文件名.扩展名类型”。

您将使用该路径将 S3 数据导入您的 Jupyter 笔记本

第四步就是最后做你的大数据分析!

4a。从导入基本的 PySpark 包开始。

PySpark 是一个 API,一个用来支持 Python 在 Spark 上运行的工具。Spark 是一个集群计算框架,最近几乎成了大数据的同义词。简而言之,Spark 正在协调分布在多个处理单元上的工作负载。做大数据,和 Spark 交互,也可以选择 Scala,Java 或者 R,而不是 Python(PySpark)。

因为我对 Python 很熟悉,所以在这个例子中我选择了 PySpark。你会发现 PySpark 与原生 Python 语法非常相似,但是万一遇到困难,你可以在这里查找。

导入 PySpark 包

4b。创建一个 Spark 会话,并使用之前创建的路径从 Bucket 导入数据。

将数据导入 Jupyter 笔记本

4c。做你的分析。您可以选择 PySpark 或 SQL 语法。如果您选择使用 SQL 语法,不要忘记创建临时表。您只能对临时表运行查询,而不能直接对 PySpark 数据框运行查询。

选择本机 PySpark 或 SQL 语法来处理您的数据

如果你想对你的数据运行 ML 算法,这里的是一个关于如何在 PySpark 中完成的例子。

第 5 步是终止您的会话

5a。完成分析后,确保终止集群。否则你可能会付出高昂的代价。返回服务/ EMR/集群并点击终止。

不要忘记终止集群

5b。集群需要几分钟才能关闭

检查集群是否正在终止

5c。之后,你应该停止删除你的笔记本,同时删除你的 S3 桶。只要保存在 AWS 服务器上,这两者都会产生(实际上非常小的)成本。所以如果真的不需要,就删掉。在删除之前,不要忘记在本地下载您的笔记本,否则您会丢失代码。

5d。删除你的 S3 桶

删除您的存储桶

5e。最后一步是前往您的账户名称/ 我的账单仪表板查看您的账单

检查您的账单仪表板

5f。如前所述,如果您正确地遵循了所有步骤,那么本次练习的总账单不会超过 3 美元,还不包括 1 美元的信用卡检查费。(正如您在下面看到的,我设法产生了更高的成本,但这只是因为我运行了几天我的集群)。

计费仪表板提供了一些不错的 AWS 成本可视化

总结

我们的小旅程即将结束,让我们快速总结一下我们所经历的上述步骤:

  • 开立亚马逊 AWS 账户
  • 使用 AWS EMR 服务设置并激活您的集群
  • 制作一个 Jupyter 笔记本,并将其与您的集群连接
  • 将您的数据上传到亚马逊 S3
  • 运行分析

就是这样!😃

祝贺您设置了您的第一个大数据分析!!

如果您做的一切都正确,完成上述配置步骤应该需要大约 10 分钟。我希望这篇文章对您有用,并祝您在未来的大数据事业中取得更大的成功!