TowardsDataScience-博客中文翻译-2016-2018-六-

TowardsDataScience 博客中文翻译 2016~2018(六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用生成对抗网络的自动特征工程

原文:https://towardsdatascience.com/automatic-feature-engineering-using-generative-adversarial-networks-8e24b3c16bf3?source=collection_archive---------4-----------------------

计算机视觉和综合金融交易数据的应用

深度学习的目的是使用一系列可微分函数(即几何变换)来学习高维度和噪声数据的表示,这或许可以用于监督学习任务以及其他任务。它在判别模型中取得了巨大的成功,而生成模型可能由于显式最大似然估计(MLE)的局限性而表现不佳。生成对抗网络(GAN)中提出的对抗学习旨在通过使用隐式最大似然法来克服这些问题。

我们将使用 MNIST 计算机视觉数据集和一个合成的金融交易数据集来完成这些使用 GANs 的实验的保险任务。与显式 MLE 相比,GANs 是一种非常不同的学习方法。我们的目的是展示 GAN 学习的表示可以用于监督学习任务,如图像识别和保险损失风险预测。以这种方式,我们通过自动学习一组特征,即表示学习,来避免手工特征工程的手动过程。

这篇文章可以看作是这篇文章的后续:https://goo.gl/TjB2v3

生成对抗网络

GAN 有两个主要组件,生成器和鉴别器,它们相互竞争。这样,发生器学习如何从噪声中创建真实的合成样本,即潜在空间 z ,而鉴别器学习如何区分真实样本和合成样本。

由鉴别器学习的表示可以用于其他监督学习任务,即自动特征工程或表示学习。这也可以从迁移学习的角度来看。GAN 还可以用于半监督学习,我们将在另一篇论文中讨论这一点,我们将研究为此目的使用变分自动编码器、梯形网络和敌对自动编码器。

计算机视觉

为此,我们将使用 MNIST 数据集,其中原始数据是每个图像的像素强度的二维张量。图像是我们的分析单位:我们将预测每个图像的每个类别的概率。这是一个多类分类任务,我们将使用准确度分数来评估模型在测试折叠中的性能。

2 dimensional tensor of pixel intensities per image.

计算机视觉任务的手工特征工程的一些例子可能使用 Gabor 滤波器。

保险

我们将使用合成数据集,其中原始数据是每个保单期组合的历史保单级别信息的二维张量:每个单位将是一个 4x 3 维张量,即 4 个历史时间段和 3 种交易类型。保单-期间组合是我们的分析单位:我们将预测未来期间 5 的损失概率—将此视为保单的潜在续保,我们需要预测它是否会为我们带来损失,从而影响我们是否决定续保和/或调整续保保费以考虑额外风险。这是一个二元类分类任务,我们将使用 AUROC 分数来评估模型性能。

2 dimensional tensor of transaction values per policy-period combination.

保险任务的手工特征工程的一些例子可能使用列或行平均值。

合成保险金融交易数据集是用 r 编写的,其余的工作都是用 Python 完成的。

请注意计算机视觉任务的原始数据和保险任务的原始数据之间的相似之处。我们的主要目标是通过 GANs 使用自动特征工程来学习这种原始数据的良好表示。

Scikit-learn、Keras 和 TensorFlow

我们将使用 Python 机器学习库 scikit-learn 进行数据转换和分类任务。我们将把 gan 编码为 scikit-learn 转换器,这样它们就可以很容易地被 scikit-learn 管道使用。gan 将使用 Keras 和 TensorFlow 后端进行编码。我们还在 MacBook Pro 上使用了外部 GPU,即 GTX 1070。

发电机

假设我们有一个关于潜在空间 z 在哪里的先验信念: p(z) 。给定一个来自这个潜在空间的抽取,生成器 G ,一个深度学习器,输出一个合成样本。

鉴别器

鉴别器 D 是另一个深度学习器,其目的是分类样本是真实的还是合成的,即样本是否来自真实数据分布,

或合成数据分布。

让我们将鉴别器 D 表示如下。

这里我们假设正例来自真实数据分布,而反例来自合成数据分布。

游戏:最优化

GAN 同时训练鉴别器以正确分类真实和合成示例,同时训练生成器以创建合成示例,使得鉴别器不正确地分类真实和合成示例。这个 2 人迷你最大游戏有以下目标函数。

请注意,上面的表达式基本上是判别器的目标函数。

从游戏的设置中可以清楚地看到,我们试图为 D 获得一个解,使其最大化 V(D,G) ,同时我们试图为 G 获得一个解,使其最小化 V(D,G)

我们不会同时训练 D 和 T2 G。我们交替训练它们:先训练 D ,然后在冷冻 D 的同时训练 G 。我们重复这一固定数量的步骤。

如果从发生器 G 获取的合成样本是真实的,那么我们已经隐含地了解了合成数据分布。换句话说,合成数据分布可以被视为真实数据分布的良好估计。最佳解决方案如下。

为了说明这一点,让我们找出给定生成器 G 和样本 x 的最佳鉴别器。

让我们仔细看看样本 x 的鉴别器目标函数。

我们已经找到了给定一个生成器的最佳鉴别器。现在让我们关注生成器的目标函数,它本质上是最小化鉴别器的目标函数。

我们将注意到生成器的上述目标函数中的 kull back-lei bler(KL)发散。

回想一下λ发散的定义。

如果λ取值为 0.5,这就称为詹森-香农(JS)散度。这种发散是对称的和非负的。

记住这一点,让我们再来看看生成器的目标函数。

从上述生成器的目标函数中可以清楚地看到,获得的全局最小值是 - log (4) ,这在以下条件成立时发生。

当上述成立时,真实数据分布和合成数据分布之间的詹森-香农散度将为零。因此我们证明了最优解如下。

游戏:融合

假设允许鉴别器在给定发电机的情况下达到其最佳值,则

可以证明收敛到

考虑下面的目标函数,该函数之前已经被证明是关于

因为我们发现全局最小值 at -log(4)。

给定最佳鉴别器,生成器使用梯度下降向全局最小值移动。我们将证明给定一个最佳鉴别器,即,

使得以下各项的会聚

有保证。

注意,下面是凸函数集合的上确界,其中集合由鉴别器索引:

记住上确界是最小上界。

让我们回忆一下关于梯度和次梯度的一些定义。一个向量

是函数的次梯度

一点处

如果

以下关系成立:

如果 f 是凸可微的,那么它在点 x 的梯度也是次梯度。最重要的是,即使 f 不可微,次梯度也可以存在。

一组凸函数的上确界的次梯度包括函数在达到上确界的点处的次梯度。如前所述,我们已经表明

是凸的。

发生器的梯度

用于对生成器的目标函数进行增量改进

给定一个最优鉴别器 D* 。因此,趋同

有保证。

结果

在这些实验中,我们展示了生成器为 MNIST 数据集和保险数据集创建真实合成示例的能力。我们使用二维潜在流形。

最后,我们表明,使用由鉴别器学习的表示,我们可以获得与使用用于 MNIST 数据集和保险数据集的其他表示学习方法相竞争的结果,例如本文中所示的各种各样的自动编码器:【https://goo.gl/TjB2v3】T2

生成新数据

有了图像数据,我们或许可以定性地判断生成的数据是否有意义。对于金融交易数据,这是不可能的。然而,让我们来看一个生成的事务网格的例子。请注意,所有金融交易数据都已转换为介于 0 和 1 之间的值。

如果我们使用应用于图像数据的相同 matplotlib 代码来绘制上面生成的事务网格,我们将得到下面的图像。我们可以看到,对于一个事务,我们有可能的最大值,即 1,它被着色为黑色,而对于一个事务,我们有可能的最小值,即 0,它被着色为白色。介于两者之间的交易值带有一些灰色。

最后,让我们比较实际和生成的事务网格的分布,看看生成的值是否与实际值相似。这是一个简单的健全性检查,看起来分布是相当相似的。

另一种方法可能是检查由鉴别器学习的特征对于监督学习任务是否有用。在我们的保险数据示例中似乎就是这种情况,特别是如果我们在这里将它们的性能与自动编码器的性能进行比较:【https://goo.gl/TjB2v3

用于表征学习的 GAN

使用 DCGAN 的 MNIST 分类任务的准确度分数: 98.350000%

具有更深 CGAN 的 MNIST 分类任务的准确度分数: 99.090000%

使用 DCGAN 的保险分类任务的 AUROC 分数: 92.795883%

将这些结果与使用自动编码器对相同的计算机视觉和保险任务进行表征学习进行比较:https://goo.gl/TjB2v3

GitHub 上的代码

我为本文写的代码可以在我的 GitHub 上找到:https://github.com/hamaadshah/gan_keras

结论

我们已经展示了如何使用 GANs 来学习原始数据的良好表示,即,每个分析单位的二维张量,然后可以用于计算机视觉和保险领域中的监督学习任务。这使我们从手工制作的特征工程转向自动特征工程,即表示学习。GANs 也许也可以用于半监督学习,这将是另一篇论文的主题。

参考

  1. 古德费勒,我,本吉奥,y 和库维尔(2016)。深度学习(麻省理工出版社)。
  2. Geron,A. (2017)。使用 Scikit-Learn & tensor flow(O ' Reilly)进行机器学习实践。
  3. 拉德福德、卢克和钦塔拉(2015 年)。深度卷积生成对抗网络的无监督表示学习(https://arxiv.org/abs/1511.06434)。
  4. Goodfellow,I .、Pouget-Abadie,j .、Mirza,m .、Xu,b .、Warde-Farley,d .、Ozair,s .、a .、Bengio,Y. (2014 年)。生成敌对网络(【https://arxiv.org/abs/1406.2661】T2)。
  5. http://scikit-learn.org/stable/#
  6. https://towards data science . com/learning-rate-schedules-and-adaptive-learning-rate-methods-for-deep-learning-2c8f 433990 D1
  7. https://stack overflow . com/questions/42177658/how-to-switch-back end-with-keras-from-tensor flow-to-the ano
  8. https://blog.keras.io/building-autoencoders-in-keras.html
  9. https://keras.io
  10. https://github . com/fchollet/keras/blob/master/examples/mnist _ acgan . py # L24
  11. https://en.wikipedia.org/wiki/Kullback–莱布勒 _ 发散
  12. https://goo.gl/TjB2v3
  13. https://see . Stanford . edu/materials/lso coee 364 b/01-sub gradients _ notes . pdf

自动图形处理器

原文:https://towardsdatascience.com/automatic-gpus-46aa08f01886?source=collection_archive---------9-----------------------

使用 Tensorflow 中的 GPU 在 GCloud 上快速启动和运行的可再现 R / Python 方法

“A high view of a sea of clouds covering a mountain valley in the Dolomites” by paul morris on Unsplash

背景

最近在 Coursera 上完成了谷歌优秀的 数据工程认证专业(我强烈推荐),我认为在一个单一的 GCE 虚拟上获得自己的谷歌计算引擎(" GCE "或# g cloud)*实例既实用又有用——在 Tensorflow 中使用 GPU,使用 R 和 Python 像许多其他数据科学家一样,我经常使用两种语言,并且喜欢与谷歌计算平台(“GCP”)一起工作。希望您喜欢我方法的简单性,并从这次演练中获得一些收获!

带 R / Python 的 GPU 和 Tensorflow】

“A computer without the case showing the motherboard, cooling fans, graphics cards, and power supply mounted on a red-lit wall labeled ASUS in a gaming convention” by Maxime Rossignol on Unsplash

这些 GCE 机器是高度动态的,就像 AWS 实例一样,并且与张量处理单元(“TPUs”是最近在 GCP 测试版上可用的 ASIC 卡)和图形处理单元(“GPU”或用于“alt coin”挖掘、游戏和深度学习的“显卡”)一起工作。这篇文章将不包括自动 TPU 安装(也许这将是另一个有用的,当价格下降)。我们将运行一个简单的安装程序 Tensorflow,来检查 GPU 是否在工作,在运行一个 bash 脚本后,它首先完成所有繁重的工作。

最初,我尝试了许多与 GCloud 和 GPU 相关的不同演练,最终在 Medium 上找到了两个精彩的帖子,分别是这里的(Durgesh manke kar)和这里的(Luuk Derksen)。我的自动化脚本的一部分是基于上面的两篇文章,还有这个有用的要点(作者迈克尔·迪茨)以及无数其他来源。然而,其他帖子要么更适合 Jupyter 笔记本设置,要么在 CuDNN 驱动程序之前手动设置 NVIDIA Cuda,并且只测试 Python。坦率地说,考虑到最近的许多变化,我很难从其他演练中获得环境设置。

因此,我决定采取完全自动化的方法,不需要注册英伟达,登录,并下载特定操作系统的特定驱动程序。它假设用户可以用一个 bash 脚本再现下面的输出,给定一个 GCE 虚拟机的设置,该虚拟机具有任何当前可用的 g cloud GPU(NVIDIA:Tesla K80 或 P100),在 Ubuntu 16.04 上至少 25Gb 的 HD,以及 2 个以上的内核,最少 7.5Gb 的 RAM,我们也将在下面逐步介绍。

预期方向

Photo by eberhard grossgasteiger on Unsplash

如果使用共享 GPU 正确设置,下面的内容将有望允许多用户 Jupyter 笔记本配置,我希望继续关注另一个博客,该博客将使用 RStudio 服务器(易于在 GCloud 中设置密码登录)JupyterLab(不那么容易)。此外,它使用 Anaconda 安装两个 R / Python,在同一个 conda 环境 ,应该支持多用户共享 GPU。

我们来看一下设置

我们将保持这一部分非常简单,没有太多的截屏(‘咳!嗯嗯……’)。谷歌赠送了为期 12 个月的 300 美元信用(T7),让你开始在 GCP 工作。您将使用该配额为特定区域申请 GPU 配额,并在配额被允许后申请配额。

您首先需要创建一个项目;在这里,我从照片中突出显示的链接创建了ML-Test。使用+符号建立一个项目。您将在突出显示的左上方下拉列表中看到项目。

在您设置好项目之后,您会立即想要为 GPU 申请一个配额。事实上,谷歌很可能会要求你提供第二个参考项目,所以你只需建立另一个名为Project-Placeholder的项目,当谷歌发邮件给你时,你就可以用它来参考。

收到一封电子邮件大约需要 24 小时,您可以通过下拉左上方的“汉堡菜单”来参考Project-Placeholder的可用点数,以结算剩余的> >金额(对您来说大约是 300.00 美元)。顺便说一句,帮我设置的谷歌人员非常友好。礼貌地说,如果有人从谷歌上看到这个,我认为这一步可以自动化。

要访问配额页面,您需要首先进入ML-Test项目,然后下拉至 IAM > >配额,并编辑您的 GCE 以请求 GCE 的配额更新。

在您的用户信息(即,姓名、电子邮件和电话[确保使用您的帐户电子邮件[[我有过惨痛的教训]]])通过验证后,您将单击下一步(如上所示)。现在键入类似下面的内容。

提交。然后等待。谷歌友好的员工会在 24-48 小时内给你发邮件,希望ML-Test能准备好使用 GPU!

设置您的 GPU 实例

如果您想在没有 GPU 的情况下快速入门,同时使用 Python 和 R 在 GCE 上使用 Anaconda,您可以查看我最近在 Pepperdine 的一次演讲中创建的这些笔记。然而,如果您只对 GPU 感兴趣,并且您的配额得到批准,那么是时候启动 VM 了。

登录ML-Test后,点击汉堡栏计算> >计算引擎> >虚拟机实例。在那里,我们将单击“Create”。

现在创建实例…

在转到磁盘空间和操作系统之前,您需要配置前几个步骤来满足我们的最低要求。您将把虚拟机命名为gpu-vm,并匹配下面突出显示的最小设置。请注意,您的配额可能包括us-west1-b,但也可能包括特定 GPU 类型的其他区域。如果您使用一个不支持您的配额的区域,机器将会出错—这让我暂停了一段时间。

最后,在发布之前,为了进行复制,您需要通过点击“更改”来安装Ubuntu16.04和一个最低 25Gb 的硬盘(注意:您可以降低硬盘容量以避免存储费用,但发现这可能会改变 conda 环境中安装 R 时的环境最大存储容量)。

选择操作系统和存储设备后,您将使用Create按钮启动虚拟机。可选地,一旦您测试了这个模拟安装,您可能想要考虑这个虚拟机上的Pre-Emptible选项。这些可以节省高达 75%的每小时费用。然而,根据其他需求,它们可以在使用一个小时后关闭,我还没有在抢先模式下测试过这个安装。我认为在削减成本方面,这类似于 AWS 的保留实例机会。在创建菜单下的“管理、磁盘、网络、SSH 密钥”下,可以看到下面的可优先选项,红色,但是再次声明,现在让它保持“关闭”。

您的机器现在正在启动,一旦准备就绪(30 秒后),您将看到带有绿色复选标记的gpu-vm

注意:您现在正在接受计费,您将始终希望选中标记该机器,并在不使用时单击停止。当绿色的复选标记变成灰色的停止信号时,我通常只是确认机器已经关闭。

现在您将点击上面的 SSH 按钮。这将启动您到gpu-vm的 SSH 连接,并为您的虚拟机打开一个单独的选项卡。您还可以通过点击 SSH 按钮的左箭头来运行您的 SSH shell,并通过如下所示的View Gcloud Command进行访问。

点击RUN IN CLOUD SHELL,一个内嵌的云 Shell 将插入上面的命令,点击回车键,你将通过 SSH 进入你的虚拟机。在 Windows 上,这通常更好,因为 SSH 按钮会弹出一个浮动外壳,而在 Mac 上,它会打开一个新标签。

注意:在屏幕右上方的“激活谷歌云外壳”按钮下有一个免费的云外壳可供使用。GCloud 的另一个优点是在其环境中完全 SSH 安全,这意味着没有本地防火墙和 Putty。

让我们用自动脚本安装 GPU

您应该会看到类似这样的内容,但是在 VM 名称之前有您自己的用户名。

你已经准备好了,可以参加普通教育证书考试了。现在,您需要将下面的完整脚本复制到命令行中。它将执行,因为 NVIDIA 的 Cuda 还没有安装在 if 语句中。如果你对这里的任何一行有任何特殊的问题,不要犹豫,留下评论并提出来。我宁愿不去研究 Cuda——这么说吧,这使得这个过程更容易实现。该脚本已经过全面测试,可以保留路径、文件夹、删除下载的 zip 文件,并管理正确安装的环境,能够关闭该机器,并再次启动它,而不会破坏任何东西!

注意:这个 bash 脚本大约需要 10 分钟,并且一举安装 Cuda/cud nn/tensor flow-GPU/Python/R!

# Check for CUDA and try to install.
if ! dpkg-query -W cuda; then# Start Timer here
 START=$(date +%s) # Time script# Install Cuda from NVIDIA
 curl -O [http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb](http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb)
 # Login as root
 sudo dpkg -i ./cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
 rm -r cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
 sudo apt-get update
 sudo apt-get -y install cuda-8.0# Install cuDNN v6.0
 CUDNN_TAR_FILE="cudnn-8.0-linux-x64-v6.0.tgz"
 wget [http://developer.download.nvidia.com/compute/redist/cudnn/v6.0/${CUDNN_TAR_FILE](http://developer.download.nvidia.com/compute/redist/cudnn/v6.0/${CUDNN_TAR_FILE)}
 tar -xzvf ${CUDNN_TAR_FILE}
 rm -r cudnn-8.0-linux-x64-v6.0.tgz
 sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
 sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64/
 sudo chmod a+r /usr/local/cuda/lib64/libcudnn*# Export Paths
 echo 'export CUDA_HOME=/usr/local/cuda' >> ~/.bashrc
 echo 'export PATH=$PATH:$CUDA_HOME/bin' >> ~/.bashrc
 echo 'export LD_LIBRARY_PATH=$CUDA_HOME/lib64' >> ~/.bashrc
 echo 'export PATH=$PATH:$HOME/anaconda3/bin' >> ~/.bashrc
 source ~/.bashrc# Install Anaconda
 mkdir Downloads
 cd Downloads
 wget "[https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh](https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh)" -O "Anaconda3-5.0.1-Linux-x86_64.sh"
 chmod +x Anaconda3-5.0.1-Linux-x86_64.sh
 sudo sh "Anaconda3-5.0.1-Linux-x86_64.sh" -b
 cd $HOME
 rm -r Downloads# Create conda environment to work with Python/R
 # conda search python # Current Python packages hosted by Anaconda
 # conda search r  # Current R packages hosted by Anaconda
 mkdir prog_env
 source activate prog_env
 sudo apt-get update
 conda install -c anaconda --prefix=$HOME/prog_env python=3.6 -y
 conda install -c anaconda tensorflow-gpu --prefix=$HOME/prog_env -y
 conda install -c anaconda --prefix=$HOME/prog_env r=3.4 -y
 source deactivate prog_env# Shows Cuda Info
 nvidia-smi# End of timer
 END=$(date +%s)
 DIFF=$(( $END - $START ))
 echo "It took $DIFF seconds"fi

等待…如果你看到这个,那么事情看起来很好!

在我们运行一次之后,在我们停止虚拟机之后,就不需要再运行一次了。事实上,如果我们尝试的话,for 循环会阻止我们再次运行它,因为 CUDA 已经安装在进程中了。如果我们幸运的话,您将会看到 CUDA 和 GPU 被认可的初步迹象,以及完成的时间(如下所述)。

现在让我们在 R 和 Python 上测试我们的 tensorflow-gpu 安装

首先,我们想熟悉一下新创建的 conda 环境,它安装了tensorflow-gpu Python 模块,以及安装在主目录prog_env(“程序环境”)中的最新版本的 R 和 Python 语言。

为了在 R 和 Python 中测试 Tensorflow 上的 GPU,我们将运行下面的代码,应该会得到与下面用#标记注释掉的结果完全相同的结果。

关于在 conda 环境中使用 Anaconda 的详细信息

测试 Python:

## Source environment from home directory in linux
source activate prog_env## Now in program environment
(prog_env)$ python## Test GPU is working from Python
from tensorflow.python.client import device_lib
device_lib.list_local_devices() # Output should look like this
   # name: "/device:CPU:0"
   # device_type: "CPU"
   # memory_limit: 268435456 # name: "/device:GPU:0" (Note: Confirmed GPU!)
   # device_type: "GPU"
   # memory_limit: 11326131405

quit("yes") # CTRL(or CMD) + Z

测试 R:

## While in program environment
(prog_env)$ R## From R command line
install.packages("tensorflow") # Run first time only
library(tensorflow)
install_tensorflow(version = "gpu") # To use GPUs
use_condaenv("r-tensorflow") # For running from conda env
sess = tf$Session() # Creates Tensorflow session # Confirms TeslaK80 GPU being used
   # 2018-03-21 19:32:33.987396:
   # tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] 
   # Creating TensorFlow device (/device:GPU:0) -> 
   # (device: 0, name: Tesla K80, pci bus id: 0000:00:04.0, 
   # compute capability: 3.7) (Note: Confirmed GPU!)

GPUtest <- tf$constant('GPU is running!')
sess$run(GPUtest)
   # "GPU is running!"

quit("yes") # CTRL(or CMD) + Z

给所有 R 和 Python 爱好者的总结

Photo by photo-nic.co.uk nic on Unsplash

就这样,我们做到了!你现在已经有了一台完整的机器,你可以用 R 和 Python 来进行 GPU 深度学习。期待听到这篇文章是否有帮助,以及你可以如何扩展它。期待一个多用户环境,登录,链接到 GPU,使用 GCloud 按分钟付费的可抢占性。

Note on DataLab Notebooks: With GCP’s newer product DataLab, a single user GCE, using a custom Jupyter Notebook interface, setup with GPUs, is as easy to get up and running with a single line of code. Unfortunately, aside from only being single-user, it also does not ship with an R kernel for connecting to GPUs and Tensorflow through the Jupyter interface; it also requires all interaction be ran through the notebook and not the command line, given it’s Docker configuration. For an excellent walkthrough of setting up a GPU enabled DataLab GCE notebook quickly, see this article posted by Kaz Sato (you can right click translate from Japanese to English in Chrome, if needed [for the most part 次に変更 ]).

Python 中的自动图像质量评估

原文:https://towardsdatascience.com/automatic-image-quality-assessment-in-python-391a6be52c11?source=collection_archive---------0-----------------------

图像质量是一个高度依赖于观察者的概念。一般来说,
它与观看它的条件相联系;所以是一个主观性很强的话题。图像质量评估旨在定量地表示人类对质量的感知。这些指标通常用于分析计算机视觉不同领域中算法的性能,如图像压缩、图像传输和图像处理[1]。

图像质量评价(IQA)主要分为两个研究领域(1)基于参考的评价和(2)无参考的评价。主要区别在于,基于参考的方法依赖于高质量的图像作为源来评估图像之间的差异。基于参考的评估的一个例子是结构相似性指数(SSIM) [2]。

无参考图像质量评估

无参考图像质量评估不需要基础图像来评估图像质量,该算法接收的唯一信息是其质量正在被评估的失真图像。

盲法主要由两个步骤组成。第一步是计算描述图像结构的特征,第二步是根据人类的意见在特征中寻找模式。TID2008 是一个著名的数据库,遵循一种描述如何从参考图像中测量人类意见得分的方法[3]。它被广泛用于比较 IQA 算法的性能。

对于使用 TensorFlow 2.0 的深度学习方法的实现,请检查:

[## 使用 TensorFlow 2.0 进行深度图像质量评估

使用 TensorFlow 2.0 实现基于深度 CNN 的盲图像质量预测器(DIQA)的分步指南

medium.com](https://medium.com/@ocampor/deep-image-quality-assessment-with-tensorflow-2-0-69ed8c32f195)

盲/无参考图像空间质量评估器(BRISQUE)

在这一节中,我们将一步一步地编写 python 中的 BRISQUE 方法。你可以在这里找到完整的笔记本

BRISQUE [4]是一种仅使用图像像素来计算特征的模型(其他方法是基于图像到其他空间的变换,如小波或 DCT)。由于它不需要任何变换来计算其特征,因此被证明是高效的。

BRISQUE 依赖于空间域中局部归一化亮度系数的空间自然场景统计(NSS)模型,以及这些系数的成对乘积的模型。

空间域中的自然场景统计

给定一幅图像,我们需要通过局部均值减法计算局部归一化的发光,并将其除以局部偏差。添加一个常数是为了避免零除法。

*Hint: If I(i, j) domain is [0, 255] then C=1 if the domain is [0, 1] then C=1/255.

为了计算局部归一化发光,也称为均值减去对比度归一化(MSCN)系数,我们必须计算局部均值。这里, w 是大小为(K,L)的高斯核。

作者显示局部平均值的方式可能有点混乱,但它是通过对图像应用高斯滤波器计算出来的。

然后,我们计算局部偏差

最后,我们计算 MSCN 系数

作者发现,对于失真图像的更宽频谱,MSCN 系数分布为广义高斯分布(GGD)。GGD 密度函数为

在哪里

г是伽玛函数。参数α控制形状,σ控制方差。

相邻 MSCN 系数的成对乘积

相邻系数的符号也呈现出规则的结构,在失真的情况下会受到干扰。作者提出了沿四个方向(1)水平方向 H 、(2)垂直方向 V 、(3)主对角线方向 D1 、(4)次对角线方向 D2 的相邻 MSCN 系数的成对乘积模型。

此外,他还提到 GGD 并不能很好地拟合系数乘积的经验直方图。因此,他们建议拟合非对称广义高斯分布(AGGD)模型,而不是将这些系数拟合到 GGD[5]。AGGD 密度函数为

在哪里

并且可以是 rl 。前一个公式中没有反映的另一个参数是平均值

拟合非对称广义高斯分布

[5]中描述了拟合非对称广义高斯分布的方法。总之,算法步骤是:

  1. 计算γ,其中 Nₗ是阴性样本的数量,Nᵣ是阳性样本的数量。

2.计算 r 帽子

3.使用γ和 r hat 估算值计算 R hat

4.使用逆广义高斯比的近似值估计α。

5.估计左右比例参数。

计算 BRISQUE 特征

计算图像质量所需的特征是将 MSCN 系数和移位乘积拟合到广义高斯分布的结果。首先,我们需要将 MSCN 系数拟合到 GDD,然后将成对乘积拟合到 AGGD。这些功能的摘要如下:

亲自动手

在创建了计算 BRISQUE 特征所需的所有函数之后,我们可以估计给定图像的图像质量。在[4]中,他们使用了来自柯达数据集[6]的图像,所以我们在这里也将使用它。

辅助功能

1.加载图像

2.计算系数

在计算了 MSCN 系数和成对乘积之后,我们可以验证分布实际上是不同的。

3.用系数拟合广义高斯分布

4.调整图像大小并计算 BRISQUE 特征

5.缩放特征并馈送给 SVR

作者提供了一个预先训练的 SVR 模型来计算质量评估。然而,为了得到好的结果,我们需要将特征缩放到[-1,1]。对于后者,我们需要与作者用来缩放特征向量的参数相同的参数。

用于表示图像质量的标度从 0 到 100。图像质量为 100 意味着图像质量非常差。在被分析的图像的情况下,我们得到它是一个好质量的图像。

结论

该方法在 TID2008 数据库中进行了测试,效果良好;即使与参考的 IQA 方法相比。我想检查其他机器学习算法的性能,如 XGBoost,LightGBM,用于模式识别步骤。

Python 笔记本

更新 2019–12–02:包含对 Windows 10 的支持

[## o 导入/笔记本

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

bit.ly](http://bit.ly/github-brisque)

参考

[1]matre,H. (2017)。从光子到像素:数码相机手册。约翰·威利父子公司。

[2]王,z .,博维克,A. C .,谢赫,H. R .,,西蒙切利,E. P. (2004 年)。图像质量评估:从误差可见性到结构相似性。IEEE 图像处理汇刊,13(4),600–612。

[3]波诺马伦科,n .,卢金,v .,泽连斯基,a .,埃吉亚扎里安,k .,卡利,m .,&巴蒂斯蒂,F. (2009 年)。tid 2008-评估全参考视觉质量评估指标的数据库。现代无线电电子学进展,10(4),30–45。

[4]米塔尔、穆尔西和博维克(2012 年)。空间域中的无参考图像质量评估。IEEE 图像处理汇刊,21(12),4695–4708。

[5]n . e . las mar,y . Stitou 和 Berthoumieu,Y. (2009 年)。用于纹理分析的多尺度偏斜重尾模型。国际图像处理会议论文集,ICIP,(1),2281–2284。

自动问答

原文:https://towardsdatascience.com/automatic-question-answering-ac7593432842?source=collection_archive---------4-----------------------

从结构化和非结构化数据中查询信息变得非常重要。有大量的文本数据、FAQ、报纸、文章、文档、用户案例、客户服务请求等。很难记住所有的信息。谁赢得了上届欧洲杯足球赛?比特币是什么?一个著名歌手的生日是什么时候?为了找到一些信息,我们需要搜索一个文档,在找到答案之前花几分钟阅读。适马软件公司的数据科学家、本文作者纳扎尔·格里舒克认为,自动 QnA 系统可以节省我们生活中最宝贵的资源——时间。

首先,让我们讨论一下有哪些类型的问题,以及用户可以期待这些问题的什么答案。

所有的问题都可以分为几种类型:

  • 一般问题,有是/否答案
  • 疑问句,开头是:谁,什么,哪里,什么时候,为什么,如何,多少
  • 选择题,问题中有一些选项
  • 仿真问题,在文本中可以找到完整的答案。这类问题的答案由一个或几个相继出现的单词组成

在本文中,我们将重点关注仿真陈述问题回答方法,它可以处理广泛的问题,并涵盖其中最困难的一种类型。

本文将要讨论的方法是基于一种专门为仿真问答设计的算法。至于其他问题类型(一般问题、特殊疑问句、选择问题),该算法可以在一些调整之后应用。此外,一些想法可以被重用来创建您自己的方法。

主要仿真问答方法

通常,问答系统由几个逻辑块组成:

  • 数据源,
  • 信息检索系统
  • 机器阅读理解模型(MR 模型)
  • 一个或多个附加模块,例如用于文本预处理、答案后处理、检查和稳定的模块。

让我们看看这些模块是如何相互作用的:

如图所示,当问题被转移到系统时,要做的第一步是搜索可以包含问题答案的文本。这种文本的来源可以包括各种网页、存储在本地盘上的文档、维基百科等。

下一步是从找到的所有信息中选择最相关的文本。为此,可以使用以下方法:TF-IDF 相似度、Jaccard 索引、单词嵌入、深度学习文本相似度算法。所有这些方法都有优点和缺点,预处理和获得相似性指数需要不同的时间/内存。没有适用于所有情况的灵丹妙药或最佳方法。哪种方法最适合具体的任务取决于几个因素,如领域、数据集、数据量。这个问题很复杂,有很多方面,每个月都会有一些关于信息检索/文本相似性任务的文章发表。

信息检索系统

根据维基百科,“开放领域问答系统旨在针对用户的问题返回答案。返回的答案是短文本的形式,而不是相关文档的列表。”

如果你选择回答开放领域的问题,信息的来源可以是:你自己的文档,常见的抓取,维基百科,一些本体像 DBpedia 或谷歌知识图,你也可以尝试谷歌自定义搜索引擎。

如果你决定使用维基百科,有两种方法。第一个是在下载的维基百科页面中搜索。第二个是从问题中提取实体(例如,人名、位置、日期),然后提取具有这些实体的所有维基页面。但是,有一种可能性是,带有实体的 Wiki 页面没有涵盖您的问题,您将无法在文本中找到答案。

在我们的项目中,选择了 Google 定制搜索引擎,因为它不仅从 Wiki 返回最相关的信息,还从其他索引页面返回。可以通过添加特殊参数、位置、主题、网站类型等来调整搜索。此外,Google 自定义搜索引擎会返回一个带有简短摘要的 URL 列表,可用作接下来步骤的答案段落。

这是一个使用不同方法自动找到相同问题答案的例子。

在前面的步骤中,我们得到了一个相关文档的列表。下一步是将文档拆分成段落,并找到最相关的段落。

使用了以下算法:

  • 基于单词嵌入的 TF-IDF/JAC card/余弦距离的段落排序
  • 深度学习(DL)方法,如具有平均集中和注意力的双 LSTM 模型(https://arxiv.org/pdf/1511.04108.pdf)

根据数据,0.63-0.85 的 F1 分数可以存档。作为这一步的结果,我们将得到一个按照相似性指数排序的段落列表。让我们选择与下一步最相关的 5-10 个。

机器阅读

最后一步是最有趣的。我们有一个问题和一篇文章。这个想法是从文章中提取答案。这里有很多方法可以应用。例如,您可以为问题和段落建立一个抽象表示,获得一个问题类型(这样您就会知道答案类型),并获得一个答案。但是在实践中,这种方法是相当复杂的,即使对于具有受限问题类型和实体的封闭领域问题。

大多数现代方法都基于深度学习。为了使用这些方法,我们需要数据集。有一个数据集列表,比如 SQuAD,CNN\Dayli Mail,MSMarco,TriviaQA,WikiReading,用来训练神经网络(NN)。

我们已经在小队数据集 v1v2 上训练了我们的模型。V1 包含 100,000 多个问答配对,内容来自 500 多个与不同主题相关的文档。在 v2 中,增加了 50K 个没有答案的问题。在这个数据集上训练和测试的模型可以通过排行榜进行比较。数据集的结构如下所示:

还有另一种类型的数据集,问题的答案不在上下文中。Marco 女士就是这种数据集类型的一个例子。有 1M+ Bing 用户查询,160к+回答。

这里有一个问题回答的好的神经网络结构的列表,可以帮助创建一个问题回答系统。

  1. https://arxiv.org/abs/1607.04423
  2. r-NEThttps://www . Microsoft . com/en-us/research/WP-content/uploads/2017/05/r-NET . pdf
  3. https://arxiv.org/abs/1609.05284
  4. https://arxiv.org/abs/1711.07341
  5. 超级问答https://github.com/tjurczyk/HyperQA/blob/master/LICENSE
  6. 比达夫https://allenai.github.io/bi-att-flow/
  7. RDFhttps://www . semantic scholar . org/paper/Natural-language-question-answering-over-RDF % 3A-a-Zou-Huang/cb4d 277 a 51 da 6894 Fe 5143013978567 ef 5 f 805 c8
  8. https://arxiv.org/pdf/1705.02798.pdf强化记忆阅读

对于我们的任务,R-网模型被使用。之所以选择这种模型,是因为它在最先进的 leader boards 上获得了很好的分数,并且具有描述良好的架构。R-Net 模型是基于双向递归网络的,在双向递归网络中,问题和段落被分开处理。之后,一个基于门控注意力的递归网络将一个问题和一篇文章进行匹配,以获得这篇文章的问题感知表示。然后,自我匹配的注意力为整篇文章聚合证据。输出层预测答案在文章中的开始和结束位置。

图片来自www . Microsoft . com/en-us/research/WP-content/uploads/2017/05/r-net . pdf

随机问题的答案

我们在仿真陈述问题数据集上的测试:62%(EM)精确匹配

总结:

结合基于 Wiki 和 Google 定制搜索信息检索系统,我们最终得到了相当好的机器阅读模型。可以通过组合不同的信息源、对组合和评分结果进行后处理、训练新的架构和建立集成模型、增加用于训练 MR 模型的数据集和一些具体的案例来提高系统质量。

这种方法可以作为问答/用户支持系统的一部分应用于真实的商业案例。如果你正在建立一个问答系统,并使用自然语言处理引擎,像拉莎 NLU,对话流,路易斯,这个自然语言处理引擎可以回答预定义的问题。但是,如果没有预先定义的意图,您可以调用这个自动 QnA 系统在文档中搜索并返回答案。可以通过获得用户的反馈来组织持续学习。就目前而言,这个模型的质量不能胜过人,但根据一个数据集,它确实接近它(70–80%)。这些模型的质量每个月都在提高。这意味着在不久的将来,这种模型可能会像人类一样准确地回答问题,但速度要快得多。

我希望这篇文章能帮助你创建你的问题回答系统,而不用花时间去尝试非最优的方法或工具。

适马软件 AI 专长

适马软件公司聚集了人工智能专家,支持他们研究机器学习、计算机视觉、自然语言处理、机器人和人工智能的其他方面。我们的专家以这种方式获得的经验应用于现实世界的项目和产品,从聊天机器人到自动化采购规划解决方案。了解更多适马软件人工智能专业知识

基于迁移学习的自动说话人识别

原文:https://towardsdatascience.com/automatic-speaker-recognition-using-transfer-learning-6fab63e34e74?source=collection_archive---------2-----------------------

由 Christopher Gill、Hamza Ghani、Yousef Abdelrazzaq、Minkoo Park 设计的项目

当面临创建一个动态的声音识别器的挑战时,我们团队自然会选择一个图像分类器

即使今天语音交互设备(想想 Siri 和 Alexa)的技术突破频繁,也很少有公司尝试过支持多用户配置文件。Google Home 在这一领域最为雄心勃勃,允许多达六个用户配置文件。这项技术最近的蓬勃发展使得这个项目的潜力让我们的团队非常兴奋。我们还想从事一个在深度学习研究中仍然是热门话题的项目,创建有趣的工具,了解更多关于神经网络架构的知识,并在可能的情况下做出原创贡献。

我们试图创建一个系统,能够快速添加用户资料,并准确地识别他们的声音,只有很少的训练数据,最多几个句子!这种从一个样本到仅有几个样本的学习被称为 一次学习 。本文将详细概述我们项目的各个阶段。

一.项目概述

目标:用最少的训练对说话者进行分类,这样只需要几个单词或句子就可以达到很高的准确率。

数据:训练数据是从开放域有声读物的来源 Librivox 上刮下来的。测试数据要么是从 YouTube 上刮下来的,要么是现场收集的。

方法:总之,我们将所有的音频数据转换为声谱图形式。然后,我们在许多说话人身上训练了一个来自 Cifar-10 的 CNN 作为特征提取器,输入到 SVM 中进行最终分类。这种方法被称为转移学习。这种方法使我们能够获得 SVM 的小样本高性能和 CNN 的特征学习。**

我们提出的系统有很多潜在的应用。它们的范围从家庭助理需求(想想 Alexa 和 Google Home)到生物安全、营销工具,甚至是间谍活动(识别高调目标)。它也可以用作语音数据收集中说话人日记化的工具。给定先前对所包含的语音的一些小的暴露,具有多个扬声器的音频文件可以被准确地分离。这为更多潜在的“干净数据”打开了大门,这些数据可用于创建更复杂的特定于语音的模型。

****业绩:结果基本上是积极的。通过 20-35 秒的训练音频,我们的模型能够在我们的测试中以 63-95%的准确率区分三个扬声器。然而,在 5 个以上的发言者或统一的性别测试组中,表现会严重下降。

****Github 链接:https://github.com/hamzag95/voice-classification】T4

二。数据收集

背景

说话人和语音识别领域的最大挑战之一是缺乏开源数据。大多数语音数据要么是专有的、难以访问的、未被充分标记的、每个说话者的数量不足的,要么是嘈杂的。在许多相关研究论文中,数据不足被引用作为不追求更进一步、更复杂的模型和应用的理由。

我们看到这是一个为这一领域的研究做出新贡献的机会。几个小时的谷歌搜索后,我们的团队得出结论,我们项目的最佳潜在音频来源是 LibriVox ,一个开放领域有声读物的广泛来源,以及 YouTube 。这些来源是根据最符合我们的标准(如下所示)而选择的。

音频源标准

  • 一个模型有足够多的独特说话者来学习语音中的普遍差异
  • 男性和女性发言人,最好使用多种语言
  • 每个扬声器至少有 1 小时的音频可用
  • 音频可以自动标记元数据
  • 音频噪音极小(几乎没有背景噪音/音乐,质量不错,几乎没有外来声音)
  • 用于合法使用和数据集使用的开放域或知识共享许可

从 Librivox 中抓取音频

我们使用 BeautifulSoup 和 Selenium 编写了脚本来解析网站 LibriVox 并下载我们想要的有声书。BeautifulSoup 本身是不够的,因为部分网站需要时间(1-2 秒)来加载。因此,我们使用 selenium 来等待,直到网页上的某些元素出现并变得可废弃。

我们的第一次尝试使用了一个脚本,该脚本从 LibriVox 的默认主页开始移动,并下载页面中特定文件大小范围内的所有音频。我们后来意识到这是有缺陷的,因为许多有声读物实际上是多个叙述者的合作,很难自动分离。因此,我们必须找到一种方法来获得带有独特扬声器的有声读物。不幸的是,LibriVox API 没有包含一个根据项目类型(单独或协作)或讲述人姓名进行过滤的字段。

相反,我们使用高级搜索,只包括“独唱”叙述者书籍。很快我们意识到假设每本书都有一个独特的演讲者是有问题的,因为 LibriVox 有许多重复的叙述者。为了解决这个问题,我们必须阅读每本书的元数据,以维护一个勉强的叙述者列表,以确保我们的数据被正确标记。最终,我们拥有 6000 多个独特的扬声器和 24000 多个小时的音频链接。然而,由于时间限制,我们对 162 个不同的说话人进行了采样,以进行声谱图转换。下载链接的完整列表可以在我们的项目 GitHub 这里找到。

从 Youtube 上抓取音频

从 Youtube 上,我们搜集了 7 个 Youtube 明星的视频链接和他们的教程/信息视频。我们发现教程往往最符合我们的标准,因为它们大多包含干净的语言。Selenium 需要自动化这个过程,因为抓取 YouTube 需要滚动。这个过程可以在下面的视频中实时看到。

Scraping videos on Youtube using Selenium

我们没有收集更多的个人资料,因为根据视频中包括的嘉宾、音乐等来手动过滤和验证视频的效率很低。尽管就语言清洁度而言,教程频道通常符合要求,但它们在性别上严重偏向男性。视频也会有不同质量的音频和背景噪音。我们决定不使用我们收集的数据来训练神经网络,但认为它们对测试是有用的。YouTube 仍然是一个音频来源,具有很大的数据收集潜力,但在日期验证和清理方面要求非常高。

三。数据处理

背景

最终,所有收集的音频都必须转换为 503x800(x3)的声谱图图像,这些图像可以捕捉 5 秒钟的音频。由于下载格式不同,转换从 Librivox 和 YouTube 收集的数据的步骤略有不同。

对于我们的各种处理需求,我们非常幸运地拥有诸如 ffmpegsoxmp3splt 等工具,它们加快了处理速度,同时最大限度地降低了音频质量损失。

YoutTube 音频处理

一旦收集了 YouTube 视频链接,我们很幸运地找到了 YouTube-DL 库,它允许我们轻松地下载我们想要的 WAV 格式的视频。当试图将这些数据转换成频谱图时,我们发现每个文件都产生了两个频谱图,因为它是立体声音频。这是我们遇到的与 LibriVox 音频处理的主要区别。

因此,该过程可以总结为以下几点:

  1. 手动检查抓取的 YouTube 链接以验证可用性
  2. 以 WAV 格式下载所有经过验证的链接,并自动标记/分类音频
  3. 将单声道 WAV 文件分割成 5 秒钟的片段
  4. 将所有立体声 WAV 文件转换为单声道 WAV
  5. 将所有音频片段转换为频谱图

YouTube data processing phases.

YouTube 音频处理的视频可以在下面看到:

LibriVox 音频处理

我们使用单个脚本处理 LibriVox 音频,该脚本将不同处理级别的数据放入不同的目录中,以便潜在的未来用户可以按照他们的意愿更改片段长度或转换类型。

这一过程可以概括为以下几点:

  1. 为单个扬声器组合所有下载的章节
  2. 将组合音频修剪到所需长度
  3. 使用 ffmpeg 将微调音频转换为 16 位 16khz 单声道 WAV
  4. 移除超过 0.5 秒的静默
  5. 将 WAV 文件分割成 5 秒钟的片段
  6. 将每个片段转换成声谱图

LibriVox data processing stages

四。学问

我们的模型

我们通过修改现有的 Cifar-10 架构来创建 CNN,并在来自 57 个不同扬声器的频谱图上对其进行训练。使用这个经过训练的神经网络,我们通过移除最后一个完全连接的层来提取特征,并将展平层的输出输入到 SVM 中,这一过程称为迁移学习。没有公开可用的预先训练好的声音分类模型,所以我们创建并训练自己的神经网络。

CNN 架构

我们架构中的绿色层是卷积层,而蓝色层是最大池化层。对于所有卷积层,我们使用 3×3 内核。对于最大池,我们使用 2x2 的池大小。我们在每层之间使用 relu 激活函数,在最后一层使用 softmax 激活函数。我们的损失函数是分类交叉熵。

Modified Cifar-10 Architecture

CNN 培训

当对 6 个不同的人进行训练时,神经网络的准确率为 97%。这 6 个人中的每一个都有大约一个小时的 CNN 训练音频。在我们对 162 个不同说话人的更大数据集进行数据采集和处理之后,由于 AWS 上训练和存储空间的时间限制,我们在 57 个不同说话人上训练了我们的神经网络。我们用 45 分钟的音频(大约 2700 秒)训练了 57 个扬声器中的每一个。一个时代后,我们的 CNN 是 97%准确。CNN 花了大约一个半小时来训练大约 24000 幅声谱图。

SVM 与迁移学习

我们现在已经有了一个不错的神经网络来识别 57 个不同的人。我们切断了最后一层,这是一个密集层分类 57 人,并使用展平层馈入一个 SVM。支持向量机应该在数据量较小(与神经网络相比)和维数较高的情况下表现良好。使用我们的 CNN 作为特征提取器,我们有大约 400,000 个维度的数据。我们使用径向基函数作为 SVM 的核。

使用 35 秒的音频在 3 个不同的扬声器上进行训练,并在 35 秒上进行测试,结果准确率为 95%。输入 SVM,我们看到,通过对 3 个不同说话者中的每一个进行 15 秒的训练,并对每个说话者进行 15 秒的测试,我们的 SVM 得到了 83%的准确率。我们看到,我们现在能够在 15-20 秒内学会某人的声音,而不是 45 分钟的音频。

更多示例和结果

我们所有的例子都将试图区分三种新的声音。

当我们第一次测试 SVM 时,我们在三个 YouTubers 上测试了它,每个训练集和测试集有 7 个样本。我们有 95%的准确率。

这些指数对应于特定的人。本例中的阵列是这样设置的:

[ 克里斯腾·多米尼克图沙尔, 斯里拉杰·拉瓦尔 ]

输出 0 是 Christen(女性),1 是 Tushar(男性),2 是 Sriraj(男性)。

我们在这里看到,该模型从未错误分类 Christen,但对于一个样本,将 Sriraj 分类为 Tushar。对于未来的测试,我们试图将用于训练的样本数量减少到大约 5 个。人名在数组中出现的次数就是测试集的样本数。

为了测试我们的程序,我们制作了一个界面,在这个界面上,我们记录发言者,并创建一个测试和训练集。我们使用这个程序来运行现场演示,并在真人身上进行测试,而不仅仅是收集数据。

此外,我们的分类器是语言不可知的;它可以独立于语言识别你的声音。一个名字在数组中出现的顺序是分类器在这个人说话时预测的索引。看到的第一个数组是预测,第二个数组是真实的说话者。

下面是我们的模型的一些现场测试的结果。

在我们班做现场演示的时候,学习三个人的声音,两男一女,达到了 63%的准确率。这是基于 5 个用于训练的样本和 3 个用于测试的样本。下面是我们做的课堂演示的一个例子。(0 →卡拉马尼斯,1 →迪马基斯,2 →莫尼卡)

In class live demo with our professors and teaching assistant with some mixed language

另一个例子包括两个男性和一个女性声音,所有声音都在英语和各自不同的外语(西班牙语、阿拉伯语和乌尔都语)之间切换。我们的模型有 90%的准确性。

Demo among friends mixing english and their native languages

这是另一个准确率为 86%的例子。

Demo among friends in purely english

结果普遍是积极的!对不同性别的 3 人小组进行测试,通常会产生 60-90%的准确率。然而,我们的模型确实有局限性。当在完全相同性别的群体中进行测试时,或者随着群体规模的增加,表现会下降。对同性群体的测试通常会产生 40-60%的准确率。当群体规模超过 6 时,准确性接近随机猜测。

五、结论

摘要

我们想创建一个模型,仅用几个句子的训练数据来识别说话者。我们选择通过使用现有的图像分类架构来实现这一点,使用频谱图来表示音频。这包括一个重要的数据收集组件,使我们创建了一个包含 162 个扬声器的数据集,包括分段音频文件和分段频谱图。我们选择使用 take transfer learning 方法,训练 Cifar-10 CNN 的衍生物,并提取特征以馈送给 SVM 来分类新的说话者。我们将我们的训练数据限制在每人 20-35 秒(4-7 个样本)。这种方法为不同性别的三人组带来了惊人的准确率(60-90%)。性别一致的小组的结果不那么令人印象深刻,但始终比随机猜测好得多。

投稿

按照我们在开始这个项目时设定的目标,我们的团队成功地对这个研究领域做出了原创性的贡献。在一个缺乏开源数据是研究项目常见障碍的领域,我们设法为独特的演讲者创建了一个非常大的音频下载链接集。同样,这个链接列表可以在这里找到。此外,我们对音频数据使用图像识别结合 SVM 的迁移学习的方法还没有被深入研究。我们希望我们的架构和方法对未来的研究有用。

注:链接到完整的数据集,包括音频和频谱图即将推出…

未来的变化/改进

这个项目的许多障碍包括时间和计算机资源,如存储和计算能力。以下是我们的团队或其他希望改进我们工作的人未来可能采取的步骤

首先是访问更多的存储空间,这样我们就可以用每人 4 小时的音频来训练我们的神经网络,并使用我们收集的所有 162 个扬声器。我们相信这将会成为一个更好的特征提取器,用于 SVM。

其次,在将特征输入 SVM 之前,进行一些特征选择。尽管具有非线性核的支持向量机能够抵抗过拟合,但是用如此少的样本获得如此多的特征可能会导致过拟合,这可以解释准确度分数的高变化。如果有更多的时间,我们会对神经网络的架构进行更多的实验,特别是在分类层之前添加另一个密集层。这将把 SVM 的输入从大约 400,000 个要素减少到我们在新的密集图层中设置的任意结点数。另一个可以探索的架构是基于 VGG19 的模型。

第三,争取更多的发言人。我们能够从 LibriVox 中抓取 6000 多个独特的扬声器,尽管这需要时间来下载和预处理数据,以及惊人的存储量。我们将尝试刮约 500-1000,使用约 30-45 分钟。来看看这是如何改进我们的特征提取器的。这需要很多时间来训练。供参考:57 位发言人,45 分钟。花了一个半小时来训练。

使用 Youtube V3 API、Mask-RCNN 和 Google Vision API 自动收集语音识别数据

原文:https://towardsdatascience.com/automatic-speech-recognition-data-collection-with-youtube-v3-api-mask-rcnn-and-google-vision-api-2370d6776109?source=collection_archive---------3-----------------------

Image source: Pixabay

背景

随着机器学习特别是深度学习的快速发展,语音识别得到了显著的提高。这种技术依赖于大量高质量的数据。然而,为非流行语言建立的模型比那些流行语言(如英语)的模型表现差。这是因为只有几个可用的训练数据集,并且很难有效地收集高质量的数据。这篇博文将向你展示如何高效地****收集任何语言的语音识别数据

虽然 Mozilla 去年推出了一个名为 Common Voice 的开源项目,鼓励人们贡献自己的声音,但大多数人要么不知道这个项目,要么不愿意参与其中。下图显示了来自 Common Voice 的不同语言的小数据收集进度。

Little collection progress of Common Voice (https://voice.mozilla.org/en/languages)

由于 Youtube 上有大量的电视节目和电视剧,几乎没有人的参与,就可以高效地收集语音识别数据。

Meteor Garden (https://www.youtube.com/watch?v=DsuN185H58I)

如上图所示,这些剧或者节目中,有的嵌入了字幕,可以通过 OCR 提取出来。提取的文本和剪辑的音频可以形成语音识别数据的样本。

概观

下图概述了包含几个模块的整个数据收集管道。我们首先使用 Youtube V3 API 来搜索下载与我们指定的电视节目名称相关联的视频。FFMPEG 被用来将视频分割成帧,每个帧都由一个自训练的 Mask-RCNN(稍后将详细介绍)进行处理,以仅保留图像的字幕区域。然后,处理后的图像被发送到 Google Vision API,以获得预测的文本和置信度。通过 Pandas 库,我们按照时间戳对结果进行排序,然后将它们聚合起来,为每个视频生成一个 SRT 文件。下面将向您展示如何实现这些模块。

先决条件

  • Python==3.6
  • FFMPEG
  • joblib==0.12.0
  • numpy==1.13.3
  • 熊猫==0.23.3
  • 张量流-gpu==1.4.0
  • keras==2.1.3
  • 谷歌云视觉==0.32.0
  • pafy==0.5.4
  • youtube-dl==2017.12.2
  • tqdm==4.23.4
  • 编辑距离==0.4

履行

该部分由数据收集管道中的模块划分,每个子部分对应一个模块。

下载视频和提取音频

去 Youtube 搜一部你感兴趣的电视剧。确保您可以找到该节目播放列表,因为播放列表中的视频质量趋于一致。检查第一个视频是否包含嵌入的字幕,我们可以假设整个播放列表都是嵌入字幕的。

Youtube videos in a playlist

上面的代码向你展示了如何搜索 Youtube 播放列表。您需要申请一个 API 密钥才能使用 Youtube V3 API 客户端。在第 27 行,

youtube.search().list(q=name, type="playlist",part="id",maxResults=1).execute()

使用 query 作为戏剧名称执行 Youtube 搜索,并返回第一个结果的播放列表 id。

有了播放列表 ID,我们就可以得到这个播放列表中所有视频的视频 ID。

类似地,在第 15 行,

youtube.playlistItems().list(part='contentDetails',maxResults=50, playlistId=playlist_id).execute()

给定播放列表 ID,搜索多达 50 个视频的 ID(受 API 限制)。

然后,我们可以开始下载视频。

Pafy Python 包用于下载可用的最高分辨率的视频。下载完视频后,我们利用 FFMPEG 从每个视频中提取音频。

由于 FFMPEG 不支持 python SDK,我们需要在 shell 中调用它。通过触发 subprocess.call()函数,我们可以执行参数中指定的 shell 命令。现在,您已经成功下载了您指定的电视节目的视频和音频。

分割视频

然后,我们将下载的视频分割成帧,并运行 OCR。

只有视频的中间 60%部分被分割成帧,因为第一和最后 20%部分可能包含开始或结束歌曲,这不能用于语音识别。

同样,在 shell 中用子进程调用 FFMPEG。分割视频的参数描述如下:

  • ss:以秒为单位的开始时间
  • t:分割视频的时间跨度,单位为秒
  • r:采样速率

采样率越高,预测的字幕时间跨度就越精确。然而,在时间和准确性之间有一个权衡。在这里,我把它设置为 2。

训练和评估 Mask-RCNN

现在,你已经有了每个视频的画面。如果你在 Google Vision API 官网试用几张图片进行 OCR (文档文本检测,由于字幕是打字字符)。你会发现结果并不令人满意,因为这些图像的背景非常复杂。

这就是 Mask-RCNN 发挥作用的时候。Mask-RCNN 是 2017 年发布的用于对象检测和实例分割的 RCNN 家族的一部分。它能够在像素级别进行分类。

Mask-RCNN demo (https://github.com/matterport/Mask_RCNN)

我们的目标是训练 Mask-RCNN 来帮助我们识别哪些像素是字幕。

培养

为了确保训练好的模型足够通用,适合各种视频,我从十几部电视剧和动画中下载了视频。应用不同的字体大小、字体类型和字体垂直位置来丰富训练数据集。底部 40%的图像被裁剪,以确保手动添加到训练数据上的字幕不会与原始字幕重叠。这也确保了非字幕部分来自高度相似的色彩空间分布。

The above code leverages Python PIL package to add texts onto images. Since Mask-RCNN treats each connected component as an instance, in some languages, a character can be composed of different instances. For example, the character “把” comprises the left and right two components. To find the connected component, we can use the label() function in the skimage package as shown in the following code.

生成的训练数据显示在下图中。左侧显示输入图像,而右侧显示地面实况。正如您从右侧一些字符的颜色差异中所看到的,一个字符可以由几个实例组成。

Generated Mask-RCNN Training Data

为了训练 Mask-RCNN,我在这个 Github Repo 中使用了一个使用 Keras 和 Tensorflow 的优秀实现。我们需要做的是指定我们的训练模型的配置,如下所示。

你只需要设置 NUM_CLASSES = 1+1(字幕+背景),指定 IMAGE_MIN_DIM 以及 IMAGE_MAX_DIM,这取决于你训练数据的分辨率。MEAN_PIXEL 需要手动计算,以便在预处理阶段标准化。然后,就可以开始加载数据和训练了。

估价

在训练了 100 个纪元之后,让我们开始在一些图像上运行训练好的模型。

****

Evaluation Results on Different TV Shows

The left shows the input images, whereas the right show the output one. You can see that the subtitle has been clearly identified. Although there are some noise above they have no effect on the prediction of the subtitle below when running OCR. The main issue is that sometimes Mask-RCNN is too strict that it removes some parts of the text. In the second example above, the second character “難” was partially erased, which might decrease the performance of OCR. In order to recover this error, I decided to use Ensemble.

Single model prediction

集成是指使用多个模型进行预测。我没有使用上图所示的单一模型进行预测,而是训练了另一个具有不同配置的模型。输入图像被输入到这两个模型中,最终结果将是这两个模型预测的联合。

Ensemble prediction

由 Mask-RCNN 处理的结果帧如下所示。左下方是原始输入图像,右下方是只有一个模型的预测,左上方是集成结果。(右上方是测试时间增强结果,该结果已被当前管道中的系综所取代)

Mask-RCNN processed images. bottom-left: original. bottom-right: single model. top-left: ensemble. top-right: test-time-augmented (not discussed).

运行 OCR

用 Mask-RCNN 模块处理完图像后,我们就可以对这些图像运行 OCR 了。与 Youtube API Key 不同的是,你需要在 Google 云平台上申请一个 Vision API 凭据,并存储在本地磁盘中。

上面的代码编码你的图像文件,发送到 OCR API,并接收响应。响应包含预测字符、每个字符的边界框坐标以及每个字符的置信度。您可以决定自己的阈值来过滤掉低置信度的结果。最终结果被写入 CSV 文件,每行代表一帧。

生成 SRT 最终结果

最后,流水线的最后一个模块来了!通常一段字幕持续 2-3 秒,这意味着大约有 4-6 个连续的帧包含相同的字幕。剩下的问题是我们如何将不同帧的结果合并成一个,决定演讲的开始时间、结束时间和字幕。我们只需要检查当前字幕是否与上一个匹配。一个主要挑战是,有时两个帧具有相同的字幕,但 OCR 预测了不同的结果。你判断两个字幕是否相同的算法应该可以处理这些情况。

上面的代码是基于启发式的。如果当前帧和最后一帧的这两个字符串中的字符有 70%相同,而不考虑每个字符的顺序,则返回 True。

结论

如果您正确地遵循了上面的说明,那么您已经成功地构建了一个自动语音识别数据集收集管道。您可以很容易地根据 FFMPEG 指定的时间分割音频,但我将把这留给您。一个小问题是,由于字幕出现的时间和相应语音的时间可能有些不同,所以语音和文本之间可能会有一点不对齐。这可以通过语言模型来解决,以根据语音稍微调整每个字幕的时间。更多信息和详细实现,请参考本 Github Repo 。如果您有任何问题,请随时通过电子邮件联系我:【huangkh19951228@gmail.com。

使用 Doc2Vec 的自动主题聚类

原文:https://towardsdatascience.com/automatic-topic-clustering-using-doc2vec-e1cea88449c?source=collection_archive---------0-----------------------

假设你是一家大公司的经理,想要保存你的客户数据。这意味着你必须跟上当前网络安全的趋势和威胁。然而,网络安全领域发展非常迅速,因此很难跟上形势。”。

这是我们上周末在 HackDelft 黑客马拉松上做的推介的开始。我们项目的目标是创造一种向管理者展示网络安全趋势的新方式。在这篇博客中,我将解释我们是如何解决这个问题的,以及我们使用了什么技术。

目前,毕马威和 Owlin(我们案例的发起人)有一个门户,提供按重要性排序的关于网络安全话题的文章。这些都很好,但是为了能够理解这些趋势,你仍然需要阅读大量的文章。因此,我们希望建立一个门户,可以将最近的文章聚集到主题中,并在旁边附上该主题的摘要。这样你就能一眼看出当前重要的是什么。

LDA 是一种常用的主题发现算法。不过以我的经验 LDA 可以吐槽一些难以理解的话题簇。另一种方法可以是基于 tf-idf 向量的聚类,但因为 Word2Vec 和 Doc2Vec 已经显示出在自然语言处理场景中生成令人敬畏的结果,我们决定尝试这些,只是为了好玩。

Word2Vec 是谷歌开发的一种无监督算法,它试图从文本数据集中学习单词的有意义的矢量表示。它这样做是基于分布假设,假设出现在相同上下文中的单词可能有相似的意思。
你可以用这些词向量做很酷的事情,比如做下面的向量计算: King - Man + Woman 会给你一个和 Queen 的词向量非常接近的向量。如果你想自己尝试这些,你可以在这里做。此外,Google 在这里提供了一个预训练的 Word2Vec 模型。Doc2Vec(也称为段落向量)是 Word2Vec 的扩展,它学习文档的意思,而不是单词。

本文表明,通过一起训练 Word2Vec 和 Doc2Vec,文档的向量被放置在描述那些文档的主题的单词附近。这给了我们以下的想法:如果我们聚类文档,取这些聚类的平均值,并查看与这些平均值的向量表示相似的单词,会怎么样?也许这会给我们一些描述星团的词汇。

我们首先在数据集上一起训练 Doc2Vec 和 Word2Vec,由 KPMG 和 Owlin 提供,使用 Gensim Python 库。这个数据集包含了过去 200 天的大约 10 万篇新闻文章。因为它包含了许多重复的内容,我们必须先删除它们。此外,我们还删除了特殊字符和网址,并在训练前降低所有内容的大小写,以消除噪音。

训练后,我们从过去 3 天的新闻文章中提取,并使用训练好的 Doc2Vec 模型检索这些文章的向量表示。然后我们使用 K-means 算法(来自 nltk python 库)对向量进行聚类。因为相似性通常使用余弦距离来度量,我们使用余弦距离来代替欧几里德距离。

这给了我们一些很好的结果。它生成的集群的一些示例如下:

  • 川普解雇联邦调查局局长詹姆斯·科米
  • 三星 Z4 手机的发布
  • 传播中的勒索病毒 WannaCry
  • Wannacry 袭击了很多医院
  • 微软发布 Windows XP 补丁

有趣的是,它把关于惠普笔记本电脑键盘记录器的文章和关于三星智能手机发布的文章放在了一起。也许它了解到两家公司都在开发消费硬件?此外,它还产生了多个关于wanna cry:的集群,一个关于它的传播,一个关于它袭击了许多医院,一个关于微软为它发布了 Windows XP 补丁。

不幸的是,我们关于使用 Word2Vec 总结集群的想法没有实现。它产生的单词根本不能概括集群。相反,我们尝试了一种简单得多的方法:我们从每组中取出所有标题,去掉停用词和数字,并计算每个词出现的次数。然后,我们选择每个聚类中出现次数最多的 5 个单词作为该聚类的关键字。这种方法出奇地有效。
以下是一些例子:

  • 三星、tizen、安卓、惠普、z4
  • 特朗普,科米,联邦调查局,维基解密,总统
  • 勒索软件,攻击,恶意软件,wannacry,攻击
  • 勒索软件,攻击,国家,医院,hit
  • 市场,证券,报告,全球,研究

最后,我们创建了一个模型,能够使用 Doc2Vec 对相似的文章进行聚类,并在 24 小时内生成描述这些聚类内容的关键字。我们已经在 Github 这里发布了我们的代码,所以你可以自己玩。它在周末生成的集群可以在这个 JSON 文件中找到。

自动驾驶汽车的自动车辆检测

原文:https://towardsdatascience.com/automatic-vehicle-detection-for-self-driving-cars-8d98c086b161?source=collection_archive---------3-----------------------

第 2 章:用数据做酷事!

我们如何教会自动驾驶汽车“看到”路上的其他汽车,并在它们移动时跟踪它们?仅仅用一个比雷达和激光雷达便宜得多的相机就能做到吗?

是啊!请看下面的视频。

这是通过使用计算机视觉技术和支持向量机(SVM)分类器来完成的。使用深度学习也可以做到这一点,但是我更喜欢计算机视觉,因为它比深度学习更直接,深度学习可能是一个黑盒。

链接到我的 GitHub 用 Python 写的完整代码。

我们是这样做的:

  1. HOG 特征提取寻找图像的特征

HOG(梯度下降直方图)是一种强大的计算机视觉技术,利用沿边缘的梯度方向来识别对象的形状。我们可以使用 skimage.hog() 函数来实现。关键参数是“方向”、“每个单元的像素”和“每个单元的块”。方向是渐变方向的数量。pixels_per_cell 参数指定计算每个梯度直方图的像元大小。cells_per_block 参数指定给定像元的直方图计数将被归一化的局部区域。为了感受 pixels_per_cell 和 cells_per_block 的影响,我查看了每单元像素和每块单元的不同设置的 hog 图像。

HOG — 8 pixels per cell and 1 cell per block

HOG — 16 pixels per cell and 1 cell per block

HOG — 8 pixels per cell and 2 cell per block

每次调用的低像素数和每块的高单元数(上图的最后一张)具有最大的 HOG 特征,使得检测汽车相当容易。然而,这也意味着缓慢的计算

2.训练支持向量机(SVM)分类器

一旦我们从汽车中提取了猪的特征,我们就可以训练 SVM 分类器来学习汽车和非汽车图像。在这个练习中,Udacity 提供了 2826 辆汽车和 8968 张非汽车图片的数据集。非汽车图像是由非汽车的前置摄像头可视化的任何图像。

为了给 SVM 选择最佳的 HOG 参数,我尝试了各种参数组合并观察了视频中的性能。最佳选择是:

  • color_space = 'YCrCb' — YCrCb 的性能远远优于 RGB、HSV 和 HLS
  • orient = 9 # HOG orientations——我试过 6、9 和 12。模型性能变化不大
  • pix_per_cell = 16 —我尝试了 8 和 16,最终选择了 16,因为它显著减少了计算时间
  • cell_per_block = 1 —我尝试了 1 和 2。性能差异不大,但每个块 1 个单元的特征数量明显减少,并加快了训练和流水线的速度
  • hog_channel = 'ALL' —所有这些都比任何其他单个通道产生了更好的性能

使用 sklearn.svm.LinearSVC()训练线性 SVM。

3.实现滑动窗口以检测图像中汽车的存在

为了检测图像中的汽车,我们定义了不同大小的窗口,并在图像中滑动它们。在每一点上,我们提取 HOG 特征并通过我们的分类器来预测窗口中汽车的存在。如果检测到汽车,我们保存窗口位置。下面是一个用不同大小的窗口进行搜索的例子。

下面是在一些测试图像上运行上述步骤的一些例子。如您所见,存在多重检测和误报。为了平滑多次检测并消除假阳性,我们可以创建所有检测的热图,并对其进行阈值处理以消除假阳性。

4.组合重叠的框并移除假阳性检测

快到了!正如你所看到的,上面的技术容易产生误报和多重包围盒。为了解决这个问题,我们可以结合多个窗口帧的检测(20)和热图阈值(22 检测),以消除出现在几个帧中但不一致的假阳性“噪声”。

结果是对道路上的其他车辆的相当鲁棒的检测。这种技术也可以扩展到检测道路上的行人。

车道线的检测由我在另一篇博客上发表。

然而,这种技术有一些缺点。首先,我不确定这个模型在有多辆车的交通拥挤的情况下是否表现良好。你需要有近乎完美的准确性,以避免撞到其他车辆,或确保在交叉路口没有碰撞。更重要的是,该模型运行缓慢。处理 1 分钟的视频需要 6–7 分钟。我不确定这个模型在现实生活中有汽车和行人的情况下是否有效。

参考资料:

Udacity 无人驾驶汽车 Nano Degree——我感谢 Udacity 给我机会成为他们新的无人驾驶汽车项目的一部分。这是一次非常有趣的旅程。我使用的大部分代码都是在课堂讲课中建议的。

Python OpenCV 库让应用计算机视觉技术变得如此简单

自动视觉目标跟踪

原文:https://towardsdatascience.com/automatic-vision-object-tracking-347af1cc8a3b?source=collection_archive---------4-----------------------

一种平移/倾斜伺服设备,帮助摄像机使用视觉自动跟踪彩色对象。

1.介绍

在之前的教程中,我们探讨了如何控制平移/倾斜伺服设备来定位 PiCam。现在我们将使用我们的设备来帮助相机自动跟踪彩色物体,如下图所示:

这是我第一次使用 OpenCV,我必须承认,我爱上了这个神奇的“开源计算机视觉库”。

OpenCV 对于学术和商业用途都是免费的。它有 C++,C,Python 和 Java 接口,支持 Windows,Linux,Mac OS,iOS 和,Android。在我的 OpenCV 系列教程中,我们将重点关注 Raspberry Pi(所以,Raspbian 是 OS)和 Python。OpenCV 是为计算效率而设计的,非常注重实时应用。所以,它非常适合物理计算项目!

2.安装 OpenCV 3 包

我用的是 Raspberry Pi V3,更新到了 Raspbian (Stretch)的最新版本,所以安装 OpenCV 的最好方法是遵循 Adrian Rosebrock 开发的优秀教程: Raspbian Stretch:在你的 Raspberry Pi 上安装 OpenCV 3+Python

我尝试了几种不同的指南在我的 Pi 上安装 OpenCV。阿德里安的教程是最好的。我建议你也这样做,一步一步地遵循他的指导方针。

一旦您完成了 Adrian 的教程,您就应该有一个 OpenCV 虚拟环境,可以在您的 Pi 上运行我们的实验。

让我们进入虚拟环境,确认 OpenCV 3 安装正确。

Adrian 建议每次打开新终端时运行命令“source ”,以确保系统变量设置正确。

source ~/.profile

接下来,让我们进入虚拟环境:

workon cv

如果您在提示前看到文本(cv ),则您处于 cv 虚拟环境中:

(cv) pi@raspberry:~$

Adrian 提醒注意, cv Python 虚拟环境 完全独立于 Raspbian Stretch 下载中包含的默认 Python 版本。因此,全局站点包目录中的任何 Python 包对于 cv 虚拟环境都是不可用的。类似地,任何安装在 cv 的 site-packages 中的 Python 包对于 Python 的全局安装都是不可用的。

现在,在 Python 解释器中输入:

python

并确认您运行的是 3.5(或更高)版本

在解释器内部(会出现" > > > "),导入 OpenCV 库:

import cv2

如果没有出现错误消息,则 OpenCV 已正确安装在您的 PYTHON 虚拟环境中。

您也可以检查安装的 OpenCV 版本:

cv2.__version__

3.3.0 应该会出现(或者将来可能发布的更高版本)。上面的终端打印屏幕显示了前面的步骤。

3.测试您的相机

一旦你在 RPi 中安装了 OpenCV,让我们测试一下你的相机是否工作正常。

我假设你已经在你的 Raspberry Pi 上安装了 PiCam。

在您的 IDE 上输入以下 Python 代码:

import numpy as np
import cv2
cap = cv2.VideoCapture(0)while(True):
    ret, frame = cap.read()
    frame = cv2.flip(frame, -1) # Flip camera vertically
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        breakcap.release()
cv2.destroyAllWindows()

上述代码将捕获 PiCam 生成的视频流,并以 BGR 彩色和灰色模式显示。

请注意,由于组装的方式,我垂直旋转了我的相机。如果不是你的情况,评论或删除“翻转”命令行。

你也可以从我的 GitHub 下载代码: simpleCamTest.py

要执行,请输入命令:

python simpleCamTest.py

要完成该程序,您必须按键盘上的[q]或[Ctrl] + [C]键

图为结果。

了解 OpenCV 的更多内容,可以关注教程:加载-视频-python-OpenCV-教程

4.用 OpenCV 实现 Python 中的颜色检测

我们将尝试完成的一件事是检测和跟踪某种颜色的物体。为此,我们必须对 OpenCV 如何解释颜色有更多的了解。

Henri Dang 用 OpenCV 用 Python 写了一个很棒的关于颜色检测的教程。

通常,我们的相机将以 RGB 颜色模式工作,这可以理解为可以由红、绿、蓝三种颜色的光组成的所有可能的颜色。我们将在这里用 BGR(蓝色、绿色、红色)代替。

如上所述,对于 BGR,像素由 3 个参数表示,蓝色、绿色和红色。每个参数通常有一个从 0 到 255 的值(或十六进制的 0 到 FF)。例如,计算机屏幕上的纯蓝色像素的 B 值为 255,G 值为 0,R 值为 0。

OpenCV 使用 HSV(色调、饱和度、值)颜色模型,它是 RGB 颜色模型的替代表示,由计算机图形研究人员在 20 世纪 70 年代设计,以更接近人类视觉感知颜色生成属性的方式:

太好了。因此,如果您想使用 OpenCV 跟踪某种颜色,您必须使用 HSV 模型来定义它。

例子

比方说,我必须跟踪一个黄色物体,如上图所示的塑料盒。容易的部分是找到它的 BGR 元素。你可以用任何设计程序去找(我用的是 PowerPoint)。

在我的案例中,我发现:

  • 蓝色:71
  • 绿色:234
  • 红色:213

接下来,我们必须将 BGR (71,234,213)模型转换为 HSV 模型,这将由范围的上限和下限来定义。为此,让我们运行下面的代码:

import sys
import numpy as np
import cv2blue = sys.argv[1]
green = sys.argv[2]
red = sys.argv[3] color = np.uint8([[[blue, green, red]]])
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
hue = hsv_color[0][0][0]print("Lower bound is :"),
print("[" + str(hue-10) + ", 100, 100]\n")
print("Upper bound is :"),
print("[" + str(hue + 10) + ", 255, 255]")

你也可以从我的 GitHub 下载代码: bgr_hsv_converter.py

要执行该命令,请输入以下命令,并将之前找到的 BGR 值作为参数:

python bgr_hsv_converter.py 71 234 213

该程序将打印我们的对象颜色的上下边界。

在这种情况下:

lower bound: [24, 100, 100]

upper bound: [44, 255, 255]

终端打印屏幕显示结果。

最后,同样重要的是,让我们看看一旦我们确定了对象的颜色,OpenCV 如何“屏蔽”它:

import cv2
import numpy as np# Read the picure - The 1 means we want the image in BGR
img = cv2.imread('yellow_object.JPG', 1) # resize imag to 20% in each axis
img = cv2.resize(img, (0,0), fx=0.2, fy=0.2)# convert BGR image to a HSV image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # NumPy to create arrays to hold lower and upper range 
# The “dtype = np.uint8” means that data type is an 8 bit integer
lower_range = np.array([24, 100, 100], dtype=np.uint8) 
upper_range = np.array([44, 255, 255], dtype=np.uint8)# create a mask for image
mask = cv2.inRange(hsv, lower_range, upper_range)# display both the mask and the image side-by-side
cv2.imshow('mask',mask)
cv2.imshow('image', img)# wait to user to press [ ESC ]
while(1):
  k = cv2.waitKey(0)
  if(k == 27):
    breakcv2.destroyAllWindows()

你也可以从我的 GitHub 下载代码: colorDetection.py

要执行,输入下面的命令,在你的目录中有一张你的目标对象的照片(在我的例子中:yellow_object。JPG):

python colorDetection.py

上面的图片将显示原始图像(“图像”)以及应用蒙版后对象的外观(“蒙版”)。

5.物体运动跟踪

现在我们知道如何使用蒙版“选择”我们的对象,让我们使用相机实时跟踪它的运动。为此,我用 OpenCV tutoria l 基于 Adrian Rosebrock 的球跟踪编写了我的代码

我强烈建议你详细阅读阿德里安的教程。

首先,确认你是否安装了 imutils 库。它是 Adrian 收集的 OpenCV 便利函数,使一些基本任务(如调整大小或翻转屏幕)变得更加容易。如果没有,请输入以下命令,在您的虚拟 Python 环境中安装库:

pip install imutils

接下来,从我的 GitHub 下载代码 ball_tracking.py ,并使用以下命令执行它:

python ball_traking.py

因此,您将看到类似于下面的 gif:

基本上,它和 Adrian 的代码是一样的,除非是“视频垂直翻转”,这是我用下面一行代码得到的:

frame = imutils.rotate(frame, angle=180)

另外,请注意,所使用的遮罩边界是我们在上一步中获得的。

6.测试 GPIOs

现在我们已经玩了 OpenCV 的基础,让我们安装一个 LED 到我们的 RPi,并开始与我们的 GPIOs 交互。

遵循上面的电路图:LED 的阴极将通过 220 欧姆的电阻器连接到 GPIO 21,其阳极连接到 GND。

让我们在虚拟 Python 环境中测试我们的 LED。

请记住,RPi 有可能。您的 Python 虚拟环境中没有安装 GPIO!要解决这个问题,一旦您到达那里(记得确认(cv)在您的终端中),您需要使用 pip 将其安装到您的虚拟环境中:

pip install RPi.GPIO

让我们使用 python 脚本来执行一个简单的测试:

import sys
import time
import RPi.GPIO as GPIO# initialize GPIO and variables
redLed = int(sys.argv[1])
freq = int(sys.argv[2])
GPIO.setmode(GPIO.BCM)
GPIO.setup(redLed, GPIO.OUT)
GPIO.setwarnings(False)print("\n [INFO] Blinking LED (5 times) connected at GPIO {0} \
at every {1} second(s)".format(redLed, freq))
for i in range(5):
    GPIO.output(redLed, GPIO.LOW)
    time.sleep(freq)
    GPIO.output(redLed, GPIO.HIGH)
    time.sleep(freq)# do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff \n")
GPIO.cleanup()

该代码将接收一个 GPIO 号和 LED 闪烁的频率(秒)作为参数。LED 将闪烁 5 次,程序将被终止。请注意,在终止之前,我们将释放 GPIOs。

所以,要执行这个脚本,你必须输入参数, LED GPIO频率

例如:

python LED_simple_test.py 21 1

上述命令将使连接到“GPIO 21”的红色 LED 每“1”秒闪烁 5 次。

文件 GPIO_LED_test.py 可以从我的 GitHub 下载

上面的终端打印屏幕显示了结果(当然,您应该确认 LED 在闪烁。

现在,让我们使用 OpenCV 和一些基本的 GPIO 东西。

7.识别颜色和 GPIO 交互

让我们开始将 OpenCV 代码与 GPIO 交互集成。我们将从最后一个 OpenCV 代码开始,我们将在其上集成 GPIO-RPI 库,因此我们将在相机发现我们的彩色对象时打开红色 LED。这一步使用的代码基于 Adrian 的优秀教程 OpenCV,RPi。GPIO,和树莓 Pi 上的 GPIO 零点:

首先要做的是“创建”我们的 LED,将其连接到特定的 GPIO:

import RPi.GPIO as GPIO
redLed = 21
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(redLed, GPIO.OUT)

其次,我们必须初始化我们的 LED(关闭):

GPIO.output(redLed, GPIO.LOW)
ledOn = False

现在,在循环中,当找到对象时会创建“圆圈”,我们将打开 LED:

GPIO.output(redLed, GPIO.HIGH)
ledOn = True

让我们从我的 GitHub 下载完整的代码: object_detection_LED.py

使用以下命令运行代码:

python object_detection_LED.py

这是结果。注意:每次检测到物体时,LED(左下角)都会亮起:

尝试不同的对象(颜色和格式)。你会看到,一旦遮罩边界内的颜色匹配,LED 就会打开。

下面的视频展示了一些经验。请注意,只有处于颜色范围内的黄色物体才会被检测到,从而打开 LED。具有不同颜色的对象被忽略。

我们在这里仅使用上一步中解释的 LED。我做视频的时候已经把云台组装好了,所以忽略它。我们将在下一步处理平移/倾斜机制。

8.平移倾斜机构

既然我们已经玩了 OpenCV 和 GPIO 的基础,让我们安装我们的平移/倾斜机制。

详情请访问我的教程: 云台多伺服控制

伺服系统应连接到外部 5V 电源,其数据引脚(在我的例子中,它们的黄色接线)连接到 Raspberry Pi GPIO,如下所示:

  • GPIO 17 == >倾斜伺服
  • GPIO 27 == >平移伺服

不要忘记将 gnd 连接在一起==> Raspberry Pi —伺服—外部电源)

您可以选择在 Raspberry Pi GPIO 和服务器数据输入引脚之间串联一个 1K 欧姆的电阻。这将保护你的 RPi 以防伺服问题。

让我们也利用这个机会,在我们的虚拟 Python 环境中测试我们的伺服系统。

让我们使用 Python 脚本对我们的驱动程序执行一些测试:

from time import sleep
import RPi.GPIO as GPIOGPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)def setServoAngle(servo, angle):
	pwm = GPIO.PWM(servo, 50)
	pwm.start(8)
	dutyCycle = angle / 18\. + 3.
	pwm.ChangeDutyCycle(dutyCycle)
	sleep(0.3)
	pwm.stop()if __name__ == '__main__':
	import sys
	servo = int(sys.argv[1])
	GPIO.setup(servo, GPIO.OUT)
	setServoAngle(servo, int(sys.argv[2]))
	GPIO.cleanup()

上面代码的核心是函数 setServoAngle(伺服,角度)。这个函数接收一个伺服 GPIO 号和一个伺服必须定位的角度值作为参数。一旦这个函数的输入是“角度”,我们必须将其转换为等效占空比。

要执行该脚本,必须输入伺服 GPIO角度作为参数。

例如:

python angleServoCtrl.py 17 45

上述命令将连接在 GPIO 17(“倾斜”)上的伺服定位为“仰角”45 度。

文件angleservocctrl . py可以从我的 GitHub 下载

9.寻找物体的实时位置

这里的想法是使用平移/倾斜机制将对象定位在屏幕的中间。坏消息是,首先我们必须知道物体的实时位置。但好消息是,一旦我们已经有了物体中心的坐标,这是非常容易的。

首先,让我们把之前使用的“object_detect_LED”代码修改为打印被发现对象的 x,y 坐标。

从我的 GitHub 下载代码: objectDetectCoord.py

代码的“核心”是我们找到对象并在它的中心画一个红点的圆的部分。

# only proceed if the radius meets a minimum size
if radius > 10:
	# draw the circle and centroid on the frame,
	# then update the list of tracked points
	cv2.circle(frame, (int(x), int(y)), int(radius),
		(0, 255, 255), 2)
	cv2.circle(frame, center, 5, (0, 0, 255), -1)

	# print center of circle coordinates
	mapObjectPosition(int(x), int(y))

	# if the led is not already on, turn the LED on
	if not ledOn:
		GPIO.output(redLed, GPIO.HIGH)
		ledOn = True

让我们将中心坐标“导出”到 mapObjectPosition(int(x),int(y)) 函数,以便打印其坐标。功能下方:

def mapObjectPosition (x, y):
    print ("[INFO] Object Center coordinates at \
    X0 = {0} and Y0 =  {1}".format(x, y))

运行该程序,我们将在终端上看到(x,y)位置坐标,如上所示。移动物体,观察坐标。我们会意识到 x 从 0 到 500(从左到右),y 从 o 到 350(从上到下)。见上图。

太好了!现在,我们必须使用这些坐标作为平移/倾斜跟踪系统的起点

10.物体位置跟踪系统

我们希望我们的对象总是在屏幕上居中。因此,让我们定义,例如,我们将认为我们的对象“居中”,如果:

  • 220 < x < 280
  • 160 < y < 210

在这些界限之外,我们必须移动我们的平移/倾斜机构来补偿偏差。基于此,我们可以构建函数mapservosition(x,y) 如下。请注意,此功能中用作参数的“x”和“y”与我们之前用于打印中心位置的参数相同:

# position servos to present object at center of the frame
def mapServoPosition (x, y):
    global panAngle
    global tiltAngle
    if (x < 220):
        panAngle += 10
        if panAngle > 140:
            panAngle = 140
        positionServo (panServo, panAngle)
    if (x > 280):
        panAngle -= 10
        if panAngle < 40:
            panAngle = 40
        positionServo (panServo, panAngle)
    if (y < 160):
        tiltAngle += 10
        if tiltAngle > 140:
            tiltAngle = 140
        positionServo (tiltServo, tiltAngle)
    if (y > 210):
        tiltAngle -= 10
        if tiltAngle < 40:
            tiltAngle = 40
        positionServo (tiltServo, tiltAngle)

基于(x,y)坐标,使用功能位置伺服(伺服,角度)生成伺服位置命令。例如,假设 y 位置是“50”,这意味着我们的对象几乎在屏幕的顶部,这可以解释为我们的“摄像机视线”是“低的”(比如说 120 度的倾斜角),所以我们必须“减小”倾斜角(比如说 100 度),所以摄像机视线将是“向上的”,对象将在屏幕上“向下”(y 将增加到比如说 190 度)。

上图显示了几何方面的示例。

想想全景摄像机将如何操作。请注意,屏幕不是镜像的,这意味着如果你将对象移动到“你的左边”,一旦你与相机相对,它将在屏幕上移动到“你的右边”。

函数 positionServo(伺服,角度)可以写成:

def positionServo (servo, angle):
    os.system("python angleServoCtrl.py " + str(servo) + " " + 
              str(angle))
    print("[INFO] Positioning servo at GPIO {0} to {1} \
    degrees\n".format(servo, angle))

我们将调用之前显示的脚本进行伺服定位。

请注意,angleServoCtrl.py 必须与 objectDetectTrac.py 位于同一目录中

完整的代码可以从我的 GitHub 下载: objectDetectTrack.py

下面的 gif 展示了我们的项目工作的一个例子:

11.结论

一如既往,我希望这个项目可以帮助其他人找到进入令人兴奋的电子世界的方法!

详情和最终代码,请访问我的 GitHub 仓库:OpenCV-Object-Face-Tracking

更多项目,请访问我的博客:MJRoBot.org

下面是我的下一个教程,我们将探索“人脸跟踪和检测”:

来自世界南部的 Saludos!

我的下一篇文章再见!

谢谢你,

马塞洛

使用依赖解析从自然语言目标语句自动生成目标-进度界面

原文:https://towardsdatascience.com/automatically-generating-goal-progress-interfaces-from-natural-language-goal-statements-using-2b601289a2b9?source=collection_archive---------9-----------------------

okr 是一种可衡量的目标

okr 是公司和团队设定可衡量目标的一种流行方式,这种方式自然会带来进步。基本的想法是,你要努力实现一些(经过深思熟虑的)可衡量的关键结果(KRs)。通过实现这些目标,你更有可能实现你更广泛的目标(O ),而不是仅仅陈述目标并试图忙碌起来。

有很多 OKR 工具可以提供帮助。当整个公司在其许多不同的团队中使用 OKRs 时,这些特别有用。在一个层级中,团队的 okr 共同实现公司的 okr。

我的公司 Saberr 正在开发 CoachBot ,这是一款帮助团队实现目标和集体目标以及其他一切让团队更好合作的应用。通过 CoachBot ,我们试图让一个团队非常容易地设定一些 OKR 式的目标——即使他们以前从未实现过这些目标,即使他们的公司也没有(还没有)?)更广泛地使用它们。

有时候,目标进度工具可能是一种痛苦

我们一直在寻找方法使设置审查 OKRs 的过程快速而直接。团队目标应该是有用的,而不是负担。

但这通常是一个团队在关键结果上输入进度的方式:

Who wants to fiddle with dropdowns?

关键结果通常是可以衡量的——但不总是这样,尤其是当人们对他们来说是陌生人的时候。通常人们最终会写出任务,或者布尔型的结果(“创建新网站”、“启动网站”)。

我们可以使用机器学习来消除一些痛苦

为了节省时间,让我们试着自动计算出我们要处理的关键结果,如果是数字,单位是什么。

这对于依存解析来说是一个很好的任务:一种自然语言处理,预测句子中所有单词的角色关系

我们可以用预先训练好的模型很快完成这个任务。
加载教程,键入我们的关键结果,我们会看到一个解析树,如下所示:

Dependency parse tree for a key result: “We will have 1000 meetings”

“会议”是一个被“1000”引用的 对象 ,而“1000”是它的 nummod 或数字修饰符。所以看起来我们的工作会很容易!我们只需要寻找带有数字的对象。

显然有一些边缘情况和陷阱。需要几行代码来处理像“一千次会议”这样的 kr,对于复杂的句子,我们必须跟踪句子最可能的实际宾语——通过查看哪个更接近地引用句子的(“have”)。

方便的是,当 KR 被写成布尔结果或任务时,句子的词根通常是动词。

举例来说,如果你很匆忙,并作出了“装运它”的 KR,我们会解析为:

Dependency parse tree for key result: “Ship it”

这很方便,因为完成这个关键结果的动作是句子的词根(“ship”)。

这意味着我们通常可以依靠句根作为非数字目标的行动:

Automatically detecting numeric goals, their units and range, or boolean goals

这是一个很好的例子,说明预先训练好的模型可以很快地用于解决小问题。

自动化日常生活中的点点滴滴

原文:https://towardsdatascience.com/automating-bits-and-pieces-of-your-daily-life-1a18e45590b9?source=collection_archive---------14-----------------------

作为一个狂热的技术人员和问题解决者,我的头脑总是在寻找机会应用我所学的东西。除了实习期间,我还没有好好利用我的学费。直到有一天,一个通知出现在我的手机上:

My mum’s daily routine of collating meal attendance from everyone

我没有多想,只是像往常一样回答“是”。我妈妈通常要问每个家庭成员我们是否会在家里吃饭,这样她就可以相应地分配。(希望这是所有家庭的共性😇).我一点也不知道,我是在享受:

BAM. Clearly this a problem right now. Cue awkward “haha”.

毫无疑问,我立刻感到内疚和懊悔,我应该更主动地减轻她的工作量。回顾我们的信息历史,我知道是时候做点什么了……终于

This went on for years without me consciously noticing, sorry mum

快进到解决方案

基于这个问题的性质,我觉得聊天机器人将是最合适的。考虑到我妈妈对技术的基本了解,我决定开发一个在 WhatsApp 上运行的 MumBot 。花了 3 天的时间修修补补, MumBot v0.1 上线了!

下面是它的工作原理(没有技术细节):

The bot messages you privately at pre-defined timings and send collated responses to everyone. #SmartNation

Taaadaaaa妈妈快乐,生活幸福!在向她推销了这个机器人和现场演示后,这是她的回应:

你再也没有借口不回复了啊!假笑

哦,天哪,她满意了!虽然我不太确定我是不是给自己制造了更多的麻烦。尽管如此,我还是完成了我设定的目标,并赢得了 4 个快乐的顾客(我的家人)。希望这能激励你们中的一些人在家里想出一些有趣的方法!

奖金

在采用该机器人 2 周后,每个人的生活都变得轻松多了。然而,我注意到我的妈妈仍然不得不把吃午餐/晚餐的人数告诉我的助手。因此,我想看看这能带来多大的好处:

DIY box on the bar counter to notify my helper. Am I opening a store?

由于我的助手没有的 WhatsApp(或者她有……),我拼凑了一个显示盒,MumBot 可以与之通信。女士们先生们,这就是我如何取代我妈妈的。(开玩笑,她是不可替代的❤️)

用户会成为顶级客户吗?

原文:https://towardsdatascience.com/automating-interpretable-feature-engineering-for-predicting-clv-87ece7da9b36?source=collection_archive---------18-----------------------

自动化可解释的特征工程

Source: Pixabay

介绍

这篇文章将展示自动化可解释特征工程和深度特征综合的有效性,并将其应用于预测客户终身价值。

首先,我将写客户终身价值预测的商业价值,并将其扩展到用户的分类,分为顶级客户和非顶级客户,并对每种客户进行定义。随后是机器学习方法,并显示管道在这个特定问题上表现如何的结果。

如果你还没有,请在继续之前阅读这篇由威廉·科尔森撰写的帖子,它提供了对 DFS 的解释。如果你只对问题和结果感兴趣,那么你可以简单地跳过方法论部分。项目中使用的所有代码都可以在 Github 上找到。

问题定义

清楚地了解一家企业的经营状况至关重要,可以通过多种方式进行衡量。

在 SaaS 企业中,用于衡量这一点的一个基本指标是 CLV(客户终身价值)和 CAC(客户获取成本),当这两个指标结合起来时,对于确定企业的盈利能力是一个有用的启发。

CLV 衡量的是一个特定的客户在他们的整个生命周期中能为企业创造多少收入,而 CAC 衡量的是企业为获得这个客户所花费的成本。CAC 更容易衡量,因为它在漏斗开始时(T4 收购阶段)在大多数企业中变得可以量化。CLV 只有在一定时间后才变得清晰(在收入阶段)。例如,一年的使用量可以代表客户一生中会花费多少。

一般的经验法则是 CAC 不应该超过 CLV 的 1/3,但是在这个问题上几乎没有共识。这是一个商业决策,如果关注的是盈利能力,那么通过更多地依赖有机增长(降低 CAC)来最小化阈值是一个优先事项(1/4 或更低)。另一方面,如果重点是高增长,那么一个公司可能倾向于 1/1 甚至更高。

SaaS 企业的用户群产生的收入通常遵循幂律分布:一小部分用户(定义为顶级客户)产生大部分收入。(帕累托原理)。

Power-law distribution of generated revenue per user

那么,我们如何预测客户的终身价值呢?或者更进一步,我们如何预测哪个用户将成为顶级客户?

方法学

这是我在 BUX 实习期间完成的硕士论文中研究的问题,该公司是一家总部位于阿姆斯特丹的金融科技公司,它开发了一款移动应用,可以实现简单实惠的交易。他们面临着许多其他 SaaS 企业面临的类似问题——根据使用其产品的客户/用户的行为数据预测客户终身价值。

如上所述,该管道已用于 BUX 的用户。使用该产品有两个阶段。第一阶段是用户处于 funBUX 阶段,为了学习如何交易而交易虚拟货币。当用户转换到 seriousBUX 阶段,他就变成了客户,开始用真金白银交易。由于该业务通过严肃的 BUX 交易的佣金和融资费产生收入,这种转换也成为用户成为顶级客户的条件。这是用户和客户的区别——只有客户产生收入,当用户开始使用产品时,不知道他们是否会最终转化为客户。当解释由深度特征合成构建的特征时,这在结果部分将是有用的。

论文背后的主要思想是建立一个通用的机器学习管道,使可解释的特征工程自动化。让我们把它分解成两个部分:

  • 可推广的机器学习管道:管道可以在具有相同数据结构的其他问题上重用(下面将详细介绍,描述为实体集)。
  • 可解释特征工程的自动化:大量特征是基于底层数据表和这些表之间的关系自动构建的。使用两种算法来解释模型水平和个体水平上的预测,而不是使用黑盒算法来提供更少的可解释预测。

当建立了所有的特征时,选择最相关的特征以避免过度拟合(以最小化样本外误差)。当业务中出现不同的问题时(如预测客户流失、预测转化率等),可以通过改变目标值来选择不同的特性。在这种情况下,这是可推广管道的主要价值主张。

如今,数据科学家经常面临的问题是无法回答所有的业务问题。这样,投入的精力和时间就可以回答“我们可以用我们的数据预测吗?”因为在该过程中投入的人力较少。它远没有取代数据科学家,而是让他们的工作更有成效。当底层数据显然可以回答一个业务问题时,可以投入额外的时间,凭直觉手动构建功能,而这种直觉是 DFS 构建的现有功能中所没有的。该算法的作者在他们的论文中对此进行了更深入的研究。

对企业来说,回答 5 个 80%正确率的问题通常比回答 1 个 95%正确率的问题更有价值

当然,这取决于商业案例,但有时甚至简单的启发式方法也可能奏效——见规则 1)。在优化渠道上投入的额外时间与在其他问题上投入的精力和时间的机会成本相结合,往往会产生收益递减。不过,这条规则也有例外。

为了自动构建功能,数据被分为三个实体(DFS 的必要输入):群组、用户和交易。

Entity set (input into Deep Feature Synthesis)

这些实体定义了问题空间,它可以被描述为人类行为的预测。这显然是一个模糊的定义,它只能解决行为预测问题的子集。为了使系统具有通用性,数据需要以这种方式构建,否则,需要构建不同的实体结构(正如在 DFS 的文档中看到的那样,这并不难改变)。

使用的主要底层算法是深度特征合成(DFS)和局部可解释模型不可知解释(LIME)。DFS 侧重于自动化特征工程和生成可解释的特征,而 LIME 侧重于为单个预测创建可解释的解释。

对于 DFS 来说,上面提到的两个来源肯定为其背后提供了充分的直觉。对于石灰,有一个帖子提供了解释,你也可以找到的原始论文。LIME 是模型不可知的,它提供了一个局部的近似值,而不是试图理解整个模型,它只提供了对单个实例的预测的解释。

Explaining individual predictions to a human decision-maker (source)

随机森林算法被用作预测器,因为与更复杂的基于树的算法(如梯度提升树和 XGBoost)相比,其性能差异很小。

该系统有两部分——通用部分和定制部分。可概括部分可用于上述实体集结构的任何问题,而定制部分使系统能够用于更改数据源、目标值、添加手动功能等。这两个部分都表示为效用函数,即构建整个端到端管道的构件。在整个实现过程中还有很多细节,所以这篇论文可以在这里看到更多的细节。

DFS 构建的功能是从 3 周的行为数据中提取的,以预测 6 个月使用后的客户价值,该价值用作实际客户终身价值的代理。

选择 6 个月的时间跨度而不是更长的时间跨度,因为这样可以将更多最近的客户包括在学习过程中(因为每个客户都需要至少 6 个月的数据,而不是更多)。6 个月的客户价值和 1 年的客户价值之间的皮尔逊相关系数是 0.95,这表明 6 个月的时间提供了足够的信息来使用它作为 CLV 的代理。

结果

性能赋值

该管道在顶级客户分类中进行了测试,这些客户根据产生的收入位于第 99 个百分点。正如分类问题经常出现的情况那样,这意味着高度的类别不平衡。准确性不是评估渠道的有用指标(将所有客户分类为非顶级客户的无用模型提供了 99%的准确性)。

这就是为什么要使用 precision(正确分类的顶级客户在所有顶级客户中所占的比例)、recall(正确分类的顶级客户在顶级客户总数中所占的比例)和 F1 得分(两者之间的调和平均值)。

基于所建立的特征,产生用户成为顶层客户的概率。默认的决策边界为 0.5。这意味着,如果一个用户成为顶层客户的概率是 0.6,就会被归类为顶层客户。如果是 0.4,就归类为非顶级客户。

使用 5 重交叉验证评估管道,同时考虑数据中不同折叠的性能差异。

这些指标是:

AUC 分数:0.83

F1 分数:0.56 +- 0.03

精度:0.73 +- 0.05

召回率:0.48 +- 0.05

不同性能指标的微小差异表明,管道在不同的折叠上表现同样出色。

Confusion matrix before thresholding (threshold = 0.5)

业务问题的本质更重视识别尽可能多的顶层客户,因此最小化假阴性率(将顶层客户识别为非顶层客户)比假阳性率(将非顶层客户识别为顶层客户)更重要。

为了做到这一点,我们最大化回忆。通过使用阈值函数,阈值变为 0.2。这产生了 0.65 的召回率和 0.5 的精确度。这直观地意味着,我们能够正确识别 65%的顶级客户,同时在对一个客户进行分类时有 50%的把握是正确的。

考虑到行为数据并不是特别细粒度的(产品中交互的每日摘要),而且绝大多数特性都是自动构建的,这无疑是一个很好的性能。除此之外,由于特征的最大深度是 2(因为有 3 个实体), DFS 的全部能力没有被探索,而有许多更复杂的实体集的例子可以探索更广泛的特征空间。

Confusion matrix after thresholding (threshold = 0.2)

解释

说到管道的可解释性,有两个部分:

  • 功能解释(使用 DFS 构建)
  • 个别预测的解释(用石灰建造)

用管道构建 292 个特征,选择其中 20 个最相关的特征,并基于这些特征进行最终预测(可以作为管道参数改变的任意数目)。

DFS 支持用自然语言解释所有功能,如以下 5 个最相关的功能示例所示:

5 most relevant features for predicting whether a user will become a top-tier customer

正如我们所看到的,这些特性可以用自然语言来解释,并融入了直觉,否则将由数据科学家手动构建,通常需要领域专家的帮助。这个列表中唯一手动构建的功能是Conversion _ Completed _ hours _ till _ event,因为这是一个明显的低挂水果,没有被 DFS 捕获。

某一事件的时间是一组人工构建的特征。还有来自群组实体的其他手动构建的特征,描述用户开始使用产品的环境——主要是不同产品类型(如货币、指数或股票)的市场波动性。在用户实体上,人工特征描述了用户的交易部分,例如加密交易者或外汇交易者(由各种产品类型的交易决定)。虽然这些功能最初被期望提供一些有价值的信息增益,但是聚集的 DFS 功能提供了最大的价值。

使用黑盒算法(如性能通常更好的神经网络)还不可能对这些特征做出如此清晰的解释。石灰和 SHAP 是一些旨在改变这种状况的方法。使用像 DFS 这样的技术的理由是,执行速度、可解释性和较低的计算复杂性超过了额外性能的重要性。

除了对特征的解释,管道的输出还提供了对单个预测的概率的解释。例如,下面我们可以看到一个用户成为顶级客户的概率为 0.74。它还包括单个特征的贡献,如交易价值的分散程度、最大交易金额和总投资额。

Interpretation of an individual prediction (using LIME)

结论

考虑到绝大多数特性都是使用 DFS 构建的,这表明有可能快速回答这样的问题:“我们能使用我们的数据预测这一点吗?”。如果问题是肯定的,那么可以应用管道来解决问题。

如前所述,目标值是应用于根据业务用例产生分类的管道。虽然它被应用于对顶级客户进行分类,但它也可以用于行为数据的任何维度(例如,哪个用户将流失,哪个用户将购买特定产品,等等)。)这个用例特别有趣,因为用户群中的幂律分布式收入生成的业务动态(这导致数据集中目标值的高等级不平衡)。

当定期预测新的传入用户时,可以通过将管道脚本作为作业进行调度,并将预测加载到数据库中进行可视化来实现。

值得一提的是,构建整个管道花了 6 周时间,如果没有 DFS 和 LIME 的库,这绝对是不可能的,这两个库都提供了很好的例子。所以我要感谢作者们为开源社区创造的所有价值。

通过网络抓取实现社交媒体竞赛的自动化

原文:https://towardsdatascience.com/automating-social-media-contests-with-web-scraping-41c55ff6022a?source=collection_archive---------15-----------------------

随着我的第三学期即将结束,我也结束了在汤森路透实验室的兼职实习,并完成了我在学校的项目和作业。醒来时盘子里什么都没有(我吃了早餐),这是非常不舒服的,我决定学习一些似乎总是可以做到,但从来没有机会动手做的事情。

灵感

我这么做是因为我的朋友在一家数字机构工作,她的部分工作需要管理社交媒体竞赛。基本上这个想法是做赠品来换取客户更多的宣传。

Random example found on the web doing an Instagram giveaway

甚至在您的“提交”被考虑参加竞赛之前,也有一些特定的要求需要满足,并且每个竞赛在性质上可能非常不同。比如 FB 而不是 Instagram,需要赞而不是关注和标签。浏览每个评论并访问每个标记用户的个人资料以确保他们是合法的,这是一项极其乏味的工作。她还必须手动捕捉每条评论和标记的用户,以便进行社交媒体分析。我的意思是手动将每个评论转换成 Excel 表格。这太疯狂了,很多时间都浪费在处理这些每周都频繁发生的比赛上。

如果你有一个标准化的简单任务,并且要重复无数次,它绝对应该自动化,让你做更有意义的工作。

在我开始之前,我对网络抓取的唯一了解是大量使用 HTML/CSS 知识操作页面的结构/模板,以及使用名为 BeautifulSoup 的 Python 包。

are you real?

主要任务之一是检查被标记的用户是否合法。我们通常凭直觉做出决定,但为了设定一个标准定义,我将其定义为至少拥有 100 个关注者、50 个关注者和 10 篇帖子的用户。

代码演练

检查用户是否合法

我在 Windows 上,用的是 Python 3.7,但是大部分代码和思路完全一样。允许您获取页面源代码,我们会将其加载到 init BeautifulSoup。在这个例子中,我将检查我的 Instagram 是否处理了is_legit

输出被打印成一大块代码,实际上是我的 Instagram 句柄页面的 html。我在打印输出中搜索“Followers ”,找到了下面一行。

<meta content=”978 Followers, 652 Following, 677 Posts — See Instagram photos and videos from Jason Yip ([@jasonyippee](http://twitter.com/jasonyippee))” property=”og:description”/>

执行这个将帮助我提取数字。

string = soup.find("meta",  property="og:description")['content']
print(string)- 978 Followers, 652 Following, 677 Posts - See Instagram photos and videos from Jason Yip ([@jasonyippee](http://twitter.com/jasonyippee))

现在我只需要操作字符串来得到我想要的计数。

- 978 652 677

最后,我可以查看它是否满足阈值,并返回用户是否有效。我们还考虑了 Instagram 显示 243.8k 和 1,000 而不是 2438,000 和 1000 粉丝的情况。

自动化“加载更多评论”

现在,同样的想法,我们可以看看我们的比赛后,并检查评论,以检查有效的条目。你可以在页面上做 Ctrl+Shift+C 或者 Command + Option + I (Mac) ,将鼠标悬停在每个评论上来检查各自的元素。类似地,我们可以获得用户的类、标签和评论中的文本,我们可以使用 soup.find_all()使用 BeautifulSoup 进行搜索

然而,我遇到了一个关于加载更多评论按钮的问题。大多数页面只有在你进一步滚动或者点击按钮时才会加载内容。这使得我们无法获得每一条评论。

点击按钮后,页面源将只包含新的评论。这意味着我们不能简单地使用urllib来获取 url 的 html,因为它没有考虑这种动态性。

我搜索了一下,发现了一个叫做 WebDriver 的东西,它有助于在 Web 上自动执行操作。基本上你可以写一个脚本来自动访问一个 URL,点击按钮,甚至为你滚动,同时为每个单独的动作计时。

Python 有对 Selenium WebDriver 的绑定 API,我们现在将把它与轻量级包 BeautifulSoup 结合起来。Selenium 还能够通过类、标签、CSS 选择器和 XPath 来查找元素。策略是对动态部分使用 Selenium 并保持简单,对静态部分使用 BeautifulSoup】。

Selenium + BeautifulSoup. A great combination but they definitely cannot be served together.

下载 ChromeDriver 以便 Selenium 自动运行您的 Chrome 浏览器,并将单个文件 chromedriver.exe 保存在您的目录中。通过运行下面的代码,你可以看到它会自动打开你的 chrome 浏览器来访问这个例子链接。

There is a X button for that annoying grey panel which pops up when we are not logged in to Instagram. The script will find the specified element to that button and click on it.

下一个块将继续点击加载更多评论,直到所有评论都已加载完毕。

Notice how upon running the code, the browser loads the page, removes the popup, and loads all comments on its own before I scrolled up to check that there is no more Load more comments button.

在每个评论中搜索标记的用户

现在所有的评论都被加载了,我们可以像之前一样使用driver.find_elements_by_class_name()和 BeautifulSoup 来获取每个评论的用户和文本。我们还可以拆分文本,查找以“@”开头的标记,以识别标记的用户。

User  glampalmusa
Text  a great pic... lets follow each other so that we can be connected with various hairstyles! . .
User  yorke173
Text  yes please 🍁😍😍 [@avril](http://twitter.com/avril).yorke
[@avril](http://twitter.com/avril).yorke

既然我们能够从每个评论中提取标记的 Instagram 句柄,我们就可以遍历评论中的所有句柄,并将它们提供给is_legit()。如果评论具有足够数量的有效用户,并且该数量满足阈值,则评论是有效的。最后,我们只需将结果写入 csv 文件。我还为每个标记的用户添加了一个额外的行。这将提供功能,让用户谁标记更多的站在一个更高的机会获胜。

导出应用程序

核心功能已经完成。现在我只需要使它可用,我不能指望我的朋友安装 Python 及其所有的依赖。我试图用 Heroku 上的 Flask 创建一个 chrome 扩展和一个 web 应用程序,但在一天结束时,这对我来说太难了。我怀疑这主要是由于与 chromedriver.exe 的兼容性问题。

我用了 2-3 个小时写了上面的脚本,但是所有这些部署的东西花了我大约 4-5 个小时,我不能让它工作。我寻找替代方案,并意识到我可以将它打包成可执行文件。exe 文件,人们无需安装任何东西就可以运行它。用 PyInstaller 可以很容易地做到这一点。

在此之前,我意识到我不能期望用户在命令行中输入竞赛页面的 URL 和所有阈值。我搜索并找到了 TkInter ,它实际上是一个标准的 Python 包,允许我们非常容易地创建一个简单的 GUI。有了这段代码,我就能够完成我的简单应用程序。

在 Python 控制台中运行这个简单的命令来创建。可执行程序的扩展名

pyinstaller scrape.py

Creating the scrape.exe file which can be transferred around and allows us to run our program without installing anything.

我们还必须将 chromedriver.exe 复制到 scrape.exe 文件所在的文件夹中。剩下的就是把文件夹“刮”起来,发给任何人。

Process of running the app

就在那里。最终生成的 csv 文件以前需要花很多时间来手动编译。

链接到项目的回购

我相信网络抓取对整个数据科学领域都很重要。有更多的数据总是好的,不是吗?这肯定可以在许多领域进行探索,如销售线索挖掘、在 LinkedIn 等专业社交网站上寻找新员工等。我们可以抓取网址、照片、视频,为自己创造如此多的免费数据,这些数据就在网上。

希望你喜欢读这篇文章。向普通观众传达这一点很有趣。分享你的想法,如果有反馈请留下:)

注意: 我与我的示例中使用的任何用户和帐户都没有关系。它们都是从网上随机找到的,我只是搜集公开的内容。

在 LinkedIn 或通过 jasonyip184@gmail.com 与我进一步讨论!

自动化和取样

原文:https://towardsdatascience.com/automation-and-sampling-107b77807892?source=collection_archive---------13-----------------------

正如我前面提到的,我已经从爱立信过渡到了 Shopify。作为这种转变的一部分,我开始体验公共交通(以前工作离家需要 15 分钟的车程,现在,在市中心工作,我必须乘火车上下班)。今天早上,我旁边有一个女人正在用她的电脑工作,显然是在编辑一份文件,或者更可能是在里面写评论。在编辑的几分钟内,她打了一个电话,通过电话要求某人修改文档中的一些措辞,并痛苦地口述这些修改(几个词)。这个游戏大概进行了几次;在文档中编写注释,然后呼叫某人进行适当的编辑。本来可以是简单的编辑,然后通过电子邮件发送编辑过的文档变成了明显痛苦的听写练习。重点不在于找出她为什么不通过电子邮件发送文档,这可能很简单,因为没有数据计划,不愿意等待 wifi 连接,谁知道呢,但非自动化“过程”的使用使通常很简单的事情(在文档中编辑几个句子)变成了痛苦的听写体验。这也有带宽有限的后果,因此只有少数意见可以在该文件上进行修改。

这让我想起了前段时间和一个朋友的对话。他提到了他感到自豪的是,在他的组织中为两个数据源的提取、转换和存储建立了数据管道。一些数据是由他公司的系统生成的。靠近数据源,他有一个服务器,用于收集和减少/转换数据,并将结果作为文本文件存储在本地文件系统中。他每天都查看该服务器上的提取过程,以确保它仍在运行,每隔几天,他就会将新的文本文件从该服务器下载到一个服务器群和一个数据库中,他通常使用该数据库来对数据进行分析。如你所见,这也是一个痛苦的、非自动化的过程。因此,数据量很可能比自动化过程更有限,因为我的朋友需要手动满足这些管道的需求。

在 Shopify,我很高兴能够对我想分析的数据进行自动 ETL(提取、转换和加载)处理。如果您想了解一下 Shopify 在 ETL 方面提供了什么,我邀请您观看来自 Franç oise Provencher 的Shopify 的数据科学视频演示,她略微谈到了这一点以及 Shopify 数据科学家工作的其他方面。简而言之,我们使用 pyspark 和我们的数据工程师开发的定制库,从我们的来源提取、转换和加载数据到前厅数据库,公司中的任何人都可以使用该数据库获得关于我们业务的信息和见解。如果您通过 Franç oise video 收听,您将会理解自动化 ETL 方案的好处之一是我们将原始数据(大部分不可用)转换为存储在前厅数据库中的信息。然后,这些信息可用于进一步处理,以提取对公司有价值的见解。你会立即看到好处。一旦这样一个管道建立起来,它就会自动地执行它的工作,并且由于我们的数据工程团队,它会一直自我监控。显然,如果出现问题,必须有人采取行动并纠正这种情况,否则,您可以忘记管道,它总是更新的数据可供所有人使用。无需一个人花费大量时间监控和手动导入数据。一个必然的结果是,新信息的带宽相当高,我们可以获得大量的信息来进行分析。

让这么多信息唾手可得带来了新的挑战,而这些挑战是那些拥有手动管道的人从未遇到过的。对整个群体进行分析变得越来越困难和低效。你需要从样本的角度开始思考。取样时要记住几个因素:样本大小和你要取样的东西。

有数学和分析的方法来确定你的样本量,但是一个快速的方法是从一个适度的随机样本开始,进行你的分析,查看你的结果并保存它们。然后,你重复这个循环几次,看看你是否一直得到相同的结果。如果你的结果变化很大,你可能没有足够大的样本。否则你是好的。如果尽可能有效地提高未来的可重复性很重要,您可以尝试减少您的样本量,直到您的结果开始变化(此时您应该恢复到以前的样本量),但如果不是这样,足够好就是足够好!只要记住那些样本必须是随机的!如果你一次又一次地使用相同的样本重复你的分析,你没有证明任何事情。在 SQL 术语中,它是以下两者之间的区别:

SELECT * FROM table 
TABLESAMPLE BERNOULLI(10)

另一方面,这将产生 10%的的随机样本:

SELECT * FROM table 
LIMIT 1000

将很可能总是产生相同的前 1000 个元素…这不是一个随机样本!

你应该记住的另一个考虑是关于你应该取样什么,你想要观察的人群是什么。比方说,用 Shopify 的行话来说,我有一个所有商家客户的表,其中包含一个 orders 表的外键。如果我想了解客户执行了多少订单,那么被观察的人群是来自客户,而不是订单。换句话说,在这种情况下,我应该随机抽取我的客户,然后查看他们有多少订单。我不应该对订单进行抽样,以汇总每个客户的订单,并希望这将产生预期的结果。

从视觉上,我们可以看到,从订单中抽样会导致我们错误地认为每个客户平均执行两个订单。随机重采样将导致相同的错误结果。

而从客户那里取样,将得出每个客户平均执行四个订单的正确答案。

总结一下,假设您有手动(甚至半手动)ETL 管道,那么您需要将它们自动化,以提供一致性和吞吐量。一旦做到这一点,你最终会发现采样的乐趣(和需要)。取样时,您必须确保选择了合适的样本群体,并且您的样本是随机选取的。最后,你总是可以通过分析找到合适的样本量,但是通过几次试验,如果你的发现在大量随机样本中保持一致,你很可能就没事了。

封面照片由 Stefan Schweihofer 在 Pixabay

原载于 2018 年 9 月 18 日【thelonenutblog.wordpress.com】

自动车辆专用扩充库

原文:https://towardsdatascience.com/automold-specialized-augmentation-library-for-autonomous-vehicles-1d085ed1f578?source=collection_archive---------7-----------------------

在 Udacity 的自动驾驶汽车纳米级课程开始不久,我就意识到,除了通常遵循的增强技术,自动驾驶汽车还需要专门的增强。无人驾驶汽车是人工智能最复杂的挑战之一,在许多方面也不同于其他挑战。它不仅能看到白天和夜晚的世界,还能看到各种天气变化。对于一辆汽车来说,在雪地里行驶和在常规的夏季道路上行驶是完全不同的。为了使汽车比以前更安全,并将其推广到道路的各个方面,有必要在所有可能的环境中训练它们。

我搜索了互联网的深渊,但找不到人为创造这种场景的具体方法。到目前为止,训练车辆的唯一且更可靠的方法是在实际道路上训练它们。但是,道路并不是所有想训练他们汽车的 CNN 在所有条件下优雅驾驶的天才都可以到达的。

于是我决定创建****。这个库是用 python 写的,底层使用 OpenCV 和 Numpy。自动造型有助于增强图像,使其具有不同的季节。无论你想添加更多的阳光或雨水,雾或雪,或者一些速度,砾石和秋叶, Automold 都可以帮助你实现,而不会让你陷入自己编写整个代码的麻烦中。

下面是我将测试自动成型的一些图片。

original images

将雪添加到图像中真的可以帮助自动驾驶汽车工程师让汽车理解,在雪中驾驶是怎样的。下雪和下雨的道路在驾驶时会造成很大的威胁。甚至人类也发现识别路径真的很难,因此训练 CNN 识别路线是很麻烦的。

下面是一些由 Automold 生成的带有新雪的图像。

adding snow

adding rain

雨雪量也是可配置的。有三种雨可供选择,分别是“毛毛雨”、“大雨”和“暴雨”。如果你不想做太多的配置,只需设置雨的类型,你就可以了。如果你想让图像或多或少有点阴影,你可以通过设置相应的系数来使图像变暗或变亮,也可以选择随机值。

brightened images

darkened images

这不需要进入 OpenCV 颜色通道和修改像素值。你也不需要遍历你的图像列表,并在每个图像上调用函数。不管是一张图片还是整个图片列表,只要把它传递给函数就行了。整件事就像:

bright_images= am.brighten(images)

除此之外,如果你想在道路上引入阴影或砾石,Automold 可以帮助你立即做到这一点。然而,同时允许您做各种配置。定义感兴趣区域或指定引入多少砾石块有时会非常方便。如果你不想配置,你可以使用默认值。

random shadows on road

gravel patches on road

引入雾或太阳耀斑也非常容易,而且是可配置的。雾的强度,太阳耀斑的位置,耀斑的颜色,角度等。可以设置为创建所需的效果。

adding sun flare

adding fog

此外,还有两个新增加的库,允许我们添加速度运动和秋天的图像。运动模糊实际上是一个东西,当你开快车时就会发生。道路上远处的位置清晰可见,但当它们靠近时就模糊了。

adding speed

adding autumn

让树叶变成红色和橙色可能不是描述秋天的最佳方式,但仍然是人工复制这种效果的最接近的方式。尽管我仍在考虑一种更好、更健壮的方法来这样做。因此,有许多功能供您使用,可以帮助您放大专门针对道路的图像。但是,难道没有一种更好的方法来进行增强,而不是手动调用这些函数吗?嗯,是的!!您只需输入以下命令即可:

aug_images= am.augment_random(images)

该函数在输入图像上应用一组增强,并将整个增强代码减少到只有一行。

你可以在我的 Github 简介上找到文档和库代码以及其他自动驾驶汽车项目,更多我的文章请访问 MediumWordpress

AutoWorkout:如何改进运动活动分类器预测?

原文:https://towardsdatascience.com/autoworkout-how-to-improve-motion-activity-classifier-predictions-d047feead616?source=collection_archive---------9-----------------------

最近我开始开发自动锻炼 iOS/WatchOS 应用程序。它自动识别健身运动,并提供每次运动花费的时间和重复次数(在未来的版本中)。这款应用的想法自然源于我第一次尝试通过机器学习识别运动活动类型,首先是收集运动数据设计神经网络分类器,然后在核心 ML 的帮助下在 iOS 应用中利用它。

在这篇文章中,我有意跳过应用程序实现细节,专注于使运动活动分类器预测有用,因为这是最具挑战性的问题。

没有 UI 才是最好的 UI

在将预先训练好的模型导入 AutoWorkout 之前,我非常确定它们会在预测健身运动方面做得很好。他们确实这样做了,但各有各的方式。在这里,我将离开一点,描述我是如何识别运动活动的。

由于手腕可穿戴设备能够提供足够的传感器数据来预测人类的运动活动,而且我已经专注于 iOS/Watch OS 开发,所以我选择 Apple Watch 作为我的应用程序的目标设备。由于 WatchOS 支持 Core ML,我可以直接在 Apple Watch 上运行分类器,避免 iOS 和 Watch OS 之间昂贵且不总是可靠的通信,以传输传感器数据,从而在 iPhone 上进行预测。iOS 应用程序主要包含 UI 演示代码,以显示正在 Apple Watch 上收集和计算的锻炼统计数据。

我是拥抱的粉丝,没有 UI 是最好的 UI 方法,因此 WatchOS 应用程序中唯一的 UI 元素是“开始”和“停止”按钮。只需点击“开始”,开始锻炼,做你的练习,并在结束时点击“停止”。你所有的练习都会被认可,每一次花费的时间会被计算出来,重复次数会被记录下来。

Interface of the Apple Watch app

Workout statistics

预训练神经网络分类器

为了使这一切成为可能,我需要利用预训练的分类器,这些分类器每隔 1.7 秒根据传感器数据进行预测。注意到“量词”了吗?是的,我需要一个传感器数据来源——X、Y、Z 加速度计——总共 3 个分类器,每个分类器实时预测 5 种活动(跳跃、俯卧撑、下蹲、弓步和练习之间的暂停)。

在无数个小时调整他们的性能后,我最终获得了可接受的精确度:

  • x 轴分类器:89.09%
  • y 轴分类器:85.01%
  • z 轴分类器:81.66%

对于今天的分类问题来说,这些数字可能看起来并不令人印象深刻,但是考虑到我所受的时间和数据收集的限制,我发现它们相当不错。

N 个分类器,N 个观点

在我将分类器集成到应用程序中后,很明显它们能够预测健身运动,我必须检查这些预测的质量。

理想情况下,应用程序应该记录,比如说一个俯卧撑练习,如果所有 3 个分类器都预测这是一个俯卧撑练习。在现实生活中,我有不到 5%的情况下,所有 3 个模型都预测同一类。在几乎 50%的情况下,3 个模型中的 2 个模型的预测是匹配的。另外 45%的病例是所有 3 个模型预测的不同类别。

当你有三个数据来源,并且它们告诉你不同的事情时,不容易做出决定,对吗?这是机器学习环境中的一个众所周知的问题,在机器学习环境中,存在不止一个分类器,并且存在利用由多个来源提供的预测的技术。

投票

在分类机器学习问题中投票可能是从多个预测中导出单个类别的最简单也是最强大的方法。在实施投票算法时,你问自己的第一个问题是,它将是多数投票还是加权投票

在我的案例中,很明显模型 X 具有最高的准确性,但是根据地面事实标签进行的测试表明模型 X 预测 A 类(这是不正确的)和模型 YZ 都预测 B 类(并且是正确的)的情况并不少见。因此,我不能只给 model X投票中最大的影响力,并使用加权投票— 它必须是加权多数投票的混合来涵盖这种情况。

虽然,在现实生活中的测试表明,如果至少有一个模型预测“暂停”类,用户有非常高的概率确实在那一刻暂停。

所有这些观察给了我一套简单的规则,供我在投票算法中考虑:

  1. 如果一个模型预测“暂停”,记录“暂停”
  2. 如果≥ 2 个模型预测“A”类,记录“A”
  3. 如果所有模型预测不同的类别,使用来自模型 X 的预测

看,规则#2 实现了多数投票方法,而规则#3 利用了加权投票方法,通过给予模型 X 在不确定时期被选择的权利。

在投票算法被纳入分类管道后,我能够主观和客观地注意到预测变得正确且不那么混乱了。

离群值随处可见

然而,最终用户可以看到的锻炼统计数据仍然不完美:在锻炼期间没有执行的锻炼到处出现。

这一切都感觉有一些改进的空间,我开始将投票算法做出的预测与地面真相进行比较。当我知道我做了 15 秒长的深蹲,之后停顿 20 秒,然后是 30 秒的弓箭步时,在一次锻炼中,这 3 个动作中应该没有其他的训练项目。

Cells with red background contain incorrect predictions. Rows with a black background and bold text are latest exercises of each kind in a row.

在上面的例子中,你可以看到用户不太可能在一直做深蹲的同时做几个深蹲动作(第 6、9、11 行),也不太可能在做深蹲时多次做暂停深蹲(第 24、26、29 行)。第 21 行告诉我们,与地面事实相比,弓箭步检测得太早。

当然,也可能有例外,人们可以按照他们想要的任何顺序和序列进行练习,这使得检测异常(最有可能是不正确的预测)的问题几乎根本无法解决。

然而,我做了一个有根据的猜测,并决定设计一个算法,该算法将从给定锻炼时段的所有预测数组中检测并移除异常预测。

没有要检测的单一模式

当谈到任何人类活动时,很难挑出会在用户之间重复的模式。所有人都是独一无二的,每个人的锻炼方式都不一样。

我很难推导出这种异常预测检测算法的规则,因为异常预测的可变性实在太大了。但是有了预测的基础,我可以发现最常见的模式来检测异常值,并得出以下规则:

  1. 如果当前预测与下一个预测相同,则什么也不做。
  2. 如果当前预测与先前预测相同,则不采取任何措施。
  3. 如果前一个和下一个预测都不等于当前预测,则使用前一个预测。

查看在执行一次算法后,它如何帮助消除第 6、9、21、24、26 行中的红斑:

然而,异常值去除算法在第 10 行引入了另一个红点,也没有解决第 11 行的问题,因此我决定多次应用相同的算法:

通过对我所拥有的练习模式进行实验,我发现对由投票算法产生的“原始”预测进行 3 次算法传递就足以去除大部分异常值,并使结果预测尽可能接近真实情况。

为了获得对算法的更大信心,我进行了一项测试,同时比较了仅应用投票算法的预测与异常值检测算法 3 次通过后获得的预测的基本事实的标准偏差:

  • “原始”预测与基本事实的标准偏差:15.41
  • 从异常值检测算法获得的预测值与真实值的标准偏差:8.09

预测准确率提高了近 2 倍,不错!

结论

当然,在一些极端情况下,离群值检测算法会对原始数据产生扭曲,使一项或另一项锻炼持续几秒钟以上,但尽管如此,在分类器不能提供足够准确性的情况下,它在使锻炼统计数据看起来足够方面做得很好。

投票算法也是分类管道的重要补充,因为没有单一的分类器可以在检测健身运动中提供接近理想的准确性。

这两种方法使 AutoWorkout 应用程序能够更准确地检测运动活动,并提供更好的用户体验。

MediumTwitter 上关注我,看看 AutoWorkout 应用程序如何使用机器学习来计算锻炼次数。

Avinash Kaushik 谈机器学习和人工智能营销——本周的六像素分离播客

原文:https://towardsdatascience.com/avinash-kaushik-on-machine-learning-and-artificial-intelligence-for-marketing-this-weeks-six-50f0fa87a748?source=collection_archive---------11-----------------------

《六个像素的分离》第 580 集 Mirum 播客 现已直播,等待您的收听。

他回来了!谷歌的数字营销布道者、畅销书作者( Web Analytics —每天一小时Web Analytics 2.0 )、有影响力的作家(奥卡姆剃刀)、朋友和营销大脑、阿维纳什·考什克。他的每月帖子也可以是商业书籍,他对当今市场营销真正重要的东西的见解令人耳目一新。他有一种态度,他充满激情,他对我们在这个时代需要思考的问题有一些想法。最近,阿维纳什还推出了他自己的个人电子通讯,名为营销-分析交叉(你最好注册一下),我们回来讨论他为什么花这么多时间思考和研究机器学习、人工智能……以及一旦商业领袖真正参与进来,营销将如何发生巨大变化(以及其他一切)。享受谈话…

你可以在这里抓取最新一集的六像素分离(或者随意 通过 iTunes 订阅) : 六像素分离 Mirum 播客#580

米奇·乔尔 Mirum 的总裁,这是一家在近 20 个国家运营的全球数字营销机构。他的第一本书 【六像素的分离】 ,以他成功的 博客 播客 命名,是一本商业和营销畅销书。他的第二本书CTRL ALT Delete,被亚马逊评为 2013 年度最佳商业书籍之一。了解详情请点击:【www.mitchjoel.com】

避免以错误的精确度呈现产品测试结果

原文:https://towardsdatascience.com/avoid-presenting-product-test-results-with-false-precision-a42a71b30e57?source=collection_archive---------0-----------------------

我开始写这篇博文是因为我不断看到 A/B 类产品测试的结果被引用到小数点后两位的演示文稿,即使产生这些数据的样本量相当小。我最终重写了很多次,因为我试图吸收和反复误解这些测试背后的数学。最后,我得出了一个相当简单的结论:

泰勒:博士

在一个典型的测试中,测量数字产品上某件事情发生的百分比,引用超过一位小数的结果几乎是不合适的。要自信地引用精确到百分之一的数字,需要大量的样本。为了更好地交流结果,请计算与测量相关的置信区间,并将数字表示为一系列似是而非的值。

对单一数字的信心

暂时忘掉“A/B”这个方面。让我们想象一下,对一些简单的事情,比如点击网站上某个按钮的访问者数量,进行一次单独的测量。我们对 10,000 名访问者进行了抽样调查,发现其中 984 人点击了按钮。然后,你可能会天真地把它表示为 9.84%。

但是想想这个数字意味着什么。如果你说某样东西是“9.84”,那么这意味着它不是 9.83 或 9.85。如果你选择了一个不同的 10,000 个访问者的样本,你仍然会发现其中有 984 个点击了按钮。这当然不太可能。

如果您选择 10,000 个不同的样本,您预计会有多少点击量?这取决于我们有多确信我们的抽样计数或点估计值接近全部访问者的“真实”潜在比率。这种单点估计的置信区间可以计算如下[1,2]:

**p̂ = ∓ Z √(p̂(1-p̂)/n)**

其中,p̂是点估计值(即 984),n 是样本大小,z 是与我们寻求的置信水平相关的数字。

“信心水平”是什么意思?这是相当微妙的。置信区间是分布在点估计值两侧的一系列值,根据这些数据,整个总体的“真实”值可能在这个区间内。置信水平设置了间隔应该有多宽。

普遍接受的实验标准是寻求 95%的置信水平。这意味着,如果我们取 20 个样本,那么 20 次中有 19 次,点估计的置信区间将覆盖真实的总体值。鉴于我们在这里是定位按钮而不是治疗疾病,90%置信度的较低标准似乎被广泛接受为 A/B 测试的默认标准,这意味着 10 次中有 9 次与估计值相关的区间将包含真实值。

对于不同的置信水平,Z 的值可以代入上面的公式:

**Confidence Level   Z (approx)
----------------   ----------
   99%                2.58
   95%                1.96
   90%                1.69**

假设在 10,000 个样本中有 984 次点击,对于 90%的置信度,我们得到:

**0.0984 ∓ 1.69 √(0.0984(1-0.0984)/10000) = 0.0984 ∓ 0.005**

因此,9.8%的测量值与+/- 0.5%的置信区间相关,我们认为真实值可能在 9.3%到 10.3%的范围内。你可以看到,以 0.5%的间隔,引用中心测量值到百分之一是愚蠢的。

我们需要多少数据来证明一个引用到百分之二小数的数字?为此,我们需要一个不超过 0.005%或 0.00005 的置信区间。重新排列公式,我们会得到 n 的值,大约是 1 亿。这就是你需要多少数据来证明一个百分比的两位小数。

参考文献和注释

  1. Bryan Gumm,A/B 测试背后的度量和统计数据
  2. Beaulieu-Prévost,D. (2006) 《置信区间:从统计显著性测试到置信区间、范围假设和实质影响,心理学定量方法教程,2(1),11–19。
  3. 这里假设 n 大于 5,大到足以使用二项式分布的正态近似。数字环境中的任何测试都应该通过这个数量级。

避免机器学习错误 101

原文:https://towardsdatascience.com/avoiding-machine-learning-mistakes-101-1f5fbd327662?source=collection_archive---------11-----------------------

Machines Learning

比尔·盖茨曾经说过“我们总是高估未来两年将发生的变化,而低估未来十年将发生的变化;不要让自己被麻痹而无所作为。”没有什么比正在进行的机器学习革命更真实的了。

近年来,我很高兴共同开发了三个新的人工智能-人工智能解决方案,这些解决方案通过了领先公司或专家的尽职调查,并被用于解决现实世界的问题,在一所排名前 10 的大学获得了以人工智能预测分析为重点的信息学高级学位,荣获两项全球创新奖的决赛入围奖,并在美国和亚洲旅行,在技术路演上交谈和倾听。这些是我学到的一些东西:

1。天赋失焦——人工智能(AI)和机器学习(ML)需要昂贵的精通 R 或基于 Python 的平台(如 SAS、TensorFlow、Spark MLib、scikit-learn、Theano、Torch、Caffe、CNTK 或 Keras)的程序员的想法——已经成为一个神话,因为机器学习现在已经在很大程度上自动化了。如果你是数千家想象 AI & ML 可以产生非凡投资回报率和竞争优势的公司之一的决策者,那么最好是停止参与这些稀有编码员的竞标战,而是将你的人才决策集中在了解数据科学的技术专家身上。正是后一组人知道如何做两件对有效使用人工智能至关重要的事情:第一,问正确的问题;第二,部署自动化技术。你大概不想要一个能再造 TensorFlow 的专家;您希望有一位专家能够应用它和数十种类似的工具来尽快获得正确的信息,以了解因果要素并建立预测未来的模型。把软件编码(这永远都要不断重做)留给软件公司(反正你公司的市场可能更好)。

2AI-ML 即服务 —在这个软件、平台和基础设施都可以作为服务随时随地使用的时代,AI-ML 也是如此。正如现在没有人需要自己的数据中心或下载的软件许可证一样,那些花费过多时间、金钱和精力来识别和招募自己的 AI-ML 团队的公司正在浪费这三者(除非你是创建自动化 ML 工具的公司之一)。人工智能专家可以通过自动化的人工智能工具以更小的时间增量“出租”,而不是以每年 20-30 万美元的工资重新创造人工智能轮子(然后在下一次更酷的东西出现时试图留住他们,这将以月为单位)。他们可以在几周或几个月内,而不是几个季度或几年内,找到您的大数据中的因果元素、它们的比例贡献,并从几十个模型中找出最佳预测模型,而不是 6-18 个月的软件开发生命周期,而成本只是几分之一。

3。知道你不知道的事情——前国防部长唐纳德·拉姆斯菲尔德,甚至被他的许多批评者认为是一个极其聪明的人,发明了一句格言:有些事情我们知道,有些事情我们知道我们不知道,有些事情我们不知道我们不知道。坦率地与专门的数据科学招聘人员交谈,他们会告诉你几乎每天都会收到或阅读职位描述,对于擅长数据科学的技术人员来说,很明显,无论是谁写的职位描述,都不知道他们在谈论什么。他们可能理解机器学习的基本前提,从而认识到它的价值。他们可能听说过一些领先产品。从这两个入门级仿真陈述中,他们写了一份工作描述,说明谁最适合通过人工智能-人工智能策略使他们的任务超级有利可图,并且做得更好。他们很困惑,得到了他们想要的,却没有得到他们需要的。当他们意识到这一点时,那些对这个发展中的领域一无所知并问了很多问题的人已经领先了几年,而他们的成本只是这个领域的一小部分。

4。不是一个模型——已经走上人工智能道路的公司经常说类似“我们已经在 _____ 建立了一个初始模型,现在我们想优化它。”错误在于数据和模型的单一框架。事实上,他们可能有许多数据集组合。首先,每个数据集都有不同的因果要素和不同的预测模型。因此,每次添加或修改数据集时,都需要确定新的因果比例和预测模型。第二,最好的预测来自被称为集成的 ML 模型的组合,其中不同的算法在连续的步骤中被使用或者被混合,这正被迅速地接受为几乎普遍的 ML 真理。人们可以看到这种情况很快会发展到什么地步。假设有 20 个数据组合、20 个 ML 模型和三个步骤,即 20 x 20 x 20 x 20,即 160,000 种排列。将 ML 自动化而不是一次编码一个是将它们并置并发现什么是最好的唯一方法。

最近,AirBnB 的一位数据科学领导者写道,他们通过在可用的真实世界应用程序中短时间内使用自动化 ML,在很小的时间和费用内学到了增长业务的洞察力。AirBnB 可以说是通过熟练地应用数据成为世界上最大的酒店公司之一。一个季度花费 2-3 万美元,而不是几十年几十万或几百万美元,大多数业务部门或公司就可以对驱动其业务、使命和增长的数据元素有非凡的新见解,并有一个预测模型来最大化他们的未来。所以,套用盖茨先生的话来说,你为什么会被蒙骗而无所作为?

适用于您的机器学习解决方案的 AWS 架构

原文:https://towardsdatascience.com/aws-architecture-for-your-machine-learning-solutions-a208ece806de?source=collection_archive---------6-----------------------

利用 AWS 支持的销售智能 ML 渠道推动数百万的收入

Photo by Franck V. on Unsplash

前言

在为我们的客户公司设计企业级解决方案时,我面临的一个常见挑战是缺乏关于真实世界架构用例的在线参考。

您会发现大量关于如何开始学习个别技术的教程,当您的关注点仅限于特定的框架或服务时,这些教程非常有用。为了评估现有的各种方法,并预先确定将这些方法捆绑在一起的含义,你要么必须找到一个以前走过这条路的人,要么自己冒险进行一次独立的实验。

这就是为什么我决定开始分享我自己在为多家财富 200 强公司和新兴创业公司设计和开发技术解决方案时收集的一些见解。希望今天的用例能够帮助您为您的机器学习解决方案规划 AWS 架构。

Photo by Tim Gouw on Unsplash

这项事业

最近,我参与了为北美最大的钢铁制造商之一开发机器学习解决方案。

该公司希望利用 ML 的力量来深入了解客户细分、订单预测和产品数量建议。

本文围绕我们为什么以及如何利用 AWS 来部署我们的可交付成果,以便销售团队可以根据这些见解采取行动,而不需要通过复杂的技术障碍,并且让任何未来想要在公司内部增强它的数据科学家或工程师无缝地开始。

打嗝

从第一天开始,我们必须考虑的一个主要因素是,开发的解决方案最终会交给一个没有计算机科学背景的团队。是的,你没看错。

另一端最接近数据科学家的人是 IT 部门的人,他以前编程过,但没有调试完整的机器学习笔记本的能力。

因此,自动化是我们设计中的一个关键——不仅能够交付打包的解决方案,还能够交付自动化的管道,这种管道可以在非程序员之间进行自我维护,而不需要每周进行人工干预。

这些碎片

我不会详细讨论实现的细节(为了防止“40 分钟读取”标签出现),但是我会给你一个涉及到的各种活动部分的细目分类。

  • 数据源
  • 机器学习和数据工程笔记本
  • 使用 Python Flask 构建的 Web 应用程序
  • 自动化流水线

服务

以下是我们使用的 AWS 服务,根据它们服务的区域进行分类,并简要概述了它们的用法。下面的图表直观地解释了这个架构,但是我建议通读这一部分,特别是如果你不知道这些服务是做什么的话。

数据源和目标

  • S3: 大容量数据存储旨在从任何地方存储和检索任意数量的数据。这就是我们用来训练模型的数据湖所在的地方。运行模型后,一个额外的 S3 存储桶足够我们存储临时和最终的输出。
  • Athena: 允许您使用普通的 SQL 查询来查询 S3 对象系统中的数据文件。这有助于快速浏览数据和分析行,而不必每次都打开 Jupyter 笔记本。我们还使用 Athena APIs 在笔记本中提取数据。

代码版本控制

  • CodeCommit: 亚马逊的 git 版本,用于版本控制和协作。我们使用了两个独立的存储库——一个用于 ML 和数据工程笔记本,另一个用于 Web 应用。

数据工程和机器学习

  • Amazon SageMaker: 平台,使开发人员和数据科学家能够构建、训练和部署任何规模的机器学习模型。这是执行数据工程和机器学习的笔记本运行的地方。如果您已经在本地 Anaconda 实例中进行了开发,那么完全没问题,您可以在 SageMaker 中运行这些笔记本,不会有任何问题。我们使用了一个 m5.4xlarge (16 个 vCPUs,64 GB RAM)实例用于我们的培训目的,每小时大约花费一美元。每个数据工程周期处理大约 70 GB 的数据,它需要大约两个小时来端到端地运行并为 ML 笔记本电脑生成可用的文件。您可以以此为参考来决定是否需要放大或缩小实例。

完成模型训练后,关闭 SageMaker 实例是很重要的,因为费用会很快增加。这是为什么您的最终序列化模型输出应该存储在其他地方的另一个原因,比如在 S3,而不是 SageMaker 的附加 EBS 实例。不要担心,当您启动 SageMaker back up 时,它会将您的更改恢复到您在新实例中的位置。

Web 应用程序部署

  • Elastic Beanstalk: 部署和扩展使用各种语言和服务器端框架构建的 web 应用程序的服务。它初始化了部署 web 应用程序所需的所有其他必要的 AWS 服务,包括下面描述的 EC2 和 CloudWatch。在我们的例子中,这是部署 Python Flask 应用程序的地方。一个没有自动缩放的 t2.large (2 个 vCPUs,8gb RAM)EC2 实例对我们来说已经足够了,因为它将在内部使用。如果你预计流量很大,你可以使用 Beanstalk 的自动缩放功能,它会根据网络流量自动添加和删除服务器实例,这太棒了!
  • CodePipeline: 持续交付服务,帮助您自动化发布渠道,实现快速可靠的应用和基础设施更新。我们使用它来自动将合并到 CodeCommit 存储库主分支的最新代码更改推送到 Web 应用程序的实时版本。

幕后的其他服务

  • EC2: 在云中提供安全、可调整计算能力的 Web 服务。基本上,把它们想象成云上的虚拟机。其他 AWS 服务,如 Elastic Beanstalk 和 SageMaker 利用这一服务来满足他们的计算需求。
  • CloudWatch: 监控和管理服务提供数据和见解来监控您的应用,并触发自动化流程。由利用它的 AWS 服务管理,在这种情况下不需要人工干预。

建筑

自动化是我们设计中的一个关键——能够交付一个打包的解决方案,它可以在非程序员中自行处理,而不需要每周人工干预。

Machine Learning and Data Engineering

上图概述了机器学习和数据工程方面的 AWS 部署架构。如您所见,SageMaker 实例是开发人员和数据科学家主要工作的地方。笔记本拉和推数据,并直接输出到 S3 桶。如果数据驻留在其他数据库系统中,您可以随时将数据源更改为其他数据库系统。代码(即笔记本)本身实际上位于 CodeCommit 存储库中。您可以在 SageMaker 实例中克隆这个存储库,以便定期将您的更改提交给它。如果你只是玩玩,你确实可以选择在 SageMaker 中直接创建或上传笔记本,但是强烈建议你为任何严肃的开发工作准备一个版本控制系统。

Web Application

这向您展示了 web 应用程序部署的架构。web 应用程序所依赖的数据和序列化的 ML 模型存放在 S3 桶中。部署 web 应用程序的弹性 Beanstalk 实例在应用程序重启时获取新数据,并将其存储在本地系统中。这对我们来说很好,因为文件不是很大,保存在本地节省了频繁往返 S3 的时间和成本。但是如果您正在获取大量数据,您可能需要重新考虑它。

CodeCommit 中托管的 web 应用程序存储库由 CodePipeline 持续监控(code pipeline 有一个 CloudWatch 服务在幕后运行,用于监控存储库中的更改)。在我们的例子中,任何时候,新的变更被合并到主分支中,新的版本被 CodePipeline 服务自动提取并部署到 Beanstalk 实例中。

问题和反馈?

我希望这能够让你明白如何利用 AWS 服务来生产你的机器学习解决方案。我计划根据我围绕应用程序开发、大数据和机器学习所开发或遇到的内容,写更多关于这一系列架构用例的文章。请让我知道你对这篇文章的想法,以及你希望我写更多的什么样的主题。

感谢你的阅读!

是时尚科技初创公司Qarece&hack wears以及开源电子商务框架 的创建者之一他还为多家美国财富 500 强公司担任顾问,这些公司都是技术负责人、数据科学家和高级全栈工程师,涉及从应用开发到大数据分析和机器学习的项目。**

加入 EJ 的邮件列表,这样就能收到新故事的通知!❤

如果你已经读过,并且喜欢一个媒介上的故事,请鼓掌👏!它鼓励作者多写,并让你成为读者。❤

你可能会喜欢 EJ 的其他文章

** [## 6 分钟学会 hip lot——脸书用于机器学习可视化的 Python 库

高维互动情节变得简单。实践教程。

medium.com](https://medium.com/@viveckh/learn-hiplot-in-6-mins-facebooks-python-library-for-machine-learning-visualizations-330129d558ac) [## 10 分钟学会元流——网飞的数据科学 Python/R 框架

花更多时间建模,花更少时间管理基础架构。实践教程。

towardsdatascience.com](/learn-metaflow-in-10-mins-netflixs-python-r-framework-for-data-scientists-2ef124c716e4) [## 在 10 分钟内建立一个量子电路。Qiskit,IBM 用于量子编程的 Python SDK

学习量子力学的基本概念,在真实的量子上使用 Python 构建和执行量子电路…

medium.com](https://medium.com/@viveckh/build-a-quantum-circuit-in-10-mins-ft-qiskit-ibms-sdk-for-quantum-programming-75435b99ee9e) [## 为什么我的创业公司从未上线,尽管它已经有了可以投入生产的技术

技术型联合创始人的 6 个关键咒语。

medium.com](https://medium.com/swlh/why-my-startup-never-went-live-despite-a-production-ready-tech-55d344c0c057)**

面向初学者的 AWS EC2

原文:https://towardsdatascience.com/aws-ec2-for-beginners-56df2e820d7f?source=collection_archive---------6-----------------------

了解为什么应该使用 Amazon Web Services Elastic Compute Cloud(EC2 ),以及如何在 Windows 虚拟机(Windows Server)上设置基本的数据科学环境。

有时候,人们会受到台式机或笔记本电脑性能的限制。假设一位数据科学家有一个大型数据集,他们想对其进行一些分析。科学家继续尝试将整个数据集加载到内存中,出现了如下所示的错误。

Unable to load a CSV file into Memory (R Code)

由于可用内存耗尽,导致了该错误。操作系统无法再分配 500Mb 内存。虽然对于这种类型的问题有许多不同的解决方案,但是一种可能的解决方案是升级计算机的 RAM。除了必须在更多的 RAM 上投资之外,一些计算机可以升级的范围也有限制。本教程中探讨的潜在解决方案是在云中使用一个具有更多 RAM 和 CPU 的虚拟机(AWS)。

AWS EC2 上的虚拟机,也称为实例,有许多优点。一些优势包括高度可伸缩性(人们可以选择具有更多 RAM、CPU 等的实例),它们易于启动和停止(在免费层之外,客户为他们使用的东西付费),并且它们允许选择不同的平台(操作系统)。需要强调的重要一点是,虽然本教程涵盖了如何启动基于 Windows 的虚拟机,但有许多不同类型的虚拟机用于许多不同的目的。

就这样,让我们开始吧。如果你迷路了,我推荐看一下附带的视频

创建一个 AWS 帐户并登录 AWS。

1.在亚马逊网站上(这是链接,点击“登录控制台”。如果您有帐户,请登录。如果你没有,你将需要做一个。

2.在 EC2 仪表板上,单击 EC2。

创建实例

3.在 Amazon EC2 控制台上,单击 Launch Instance。

4.单击 Microsoft Windows Server 2016 Base 所在行中的“选择”按钮。请注意,这将创建一个基于 Windows 的实例,而不是典型的基于 Linux 的实例。这将影响您连接到实例的方式。如果你对启动 Linux 实例感兴趣,请看这篇教程

5.确保选择 t2 micro(自由实例类型)。

然后点击“查看并启动”

6.点击启动。

7.选择“创建新的密钥对”。在下面的框(“密钥对名称”)中,填写密钥对名称。我将我的关键数据命名为 DataCampTutorial,但是您可以随意命名。点击“下载密钥对”。这将下载密钥。把它放在安全的地方。

接下来,单击“启动实例”

8.实例现在已经启动。回到亚马逊 EC2 控制台。我建议您单击红色矩形中的内容,因为它会将您带回控制台。

9.等到看到“实例状态”正在运行时,再继续下一步。这可能需要几分钟时间。

连接到您的实例

10.点击连接。如果您选择一个 linux 实例,您可以使用 SSH 连接到一个 Linux 实例。

11.点击“下载远程桌面文件”。将远程桌面文件(rdp)保存在安全的地方。

12.点击“获取密码”。请记住,在启动实例后,您必须等待至少 4 分钟才能尝试检索您的密码。

13.选择从步骤 7 下载的 pem 文件,然后单击“解密密码”。

14.解密密码后,将其保存在安全的地方。您将需要它来登录您的实例。

15.打开您的 rdp 文件。点击继续。如果您的本地电脑是 Mac,您需要从 App Store 下载“Microsoft Remote Desktop”才能打开您的 rdp 文件。

16.输入您在步骤 14 中获得的密码

输入密码后,您应该会看到这样的屏幕

下载 Firefox

为了能够安装 R、 Python 和/或 Git,拥有一个浏览器真的很有帮助。该实例预装了启用了增强安全配置的 Internet Explorer,这可能很难使用。下载 FireFox 作为替代浏览器,以避免 Internet Explorer 增强的安全性。

  1. 当您看到下面的弹出窗口时,单击“添加”。

再次点击“添加”。

3.当你进入 FireFox 页面时,你可能需要点击几次 add(类似于步骤 1 和 2 ),直到 FireFox 下载开始。如果下载没有自动开始,那么点击“点击这里”。

现在已经安装了 FireFox,请确保使用 FireFox 作为您的浏览器。这将比从 Internet Explorer 中持续处理安全问题要简单得多。

安装 R、Python 和 Git

现在已经安装了 FireFox,您可以像在普通的 windows 机器上一样安装 R 和 Python 了。如果您需要帮助安装,这里有一些链接到下面的指南。

停止或终止实例(重要)

在使用完一个实例后,最好是停止或者终止该实例。为此,请转到 Amazon EC2 控制台,单击“Actions ”,然后单击“Instance State ”,您将可以选择停止或终止实例。

如果您计划再次使用该实例,请停止该实例。如果您不打算再次使用该实例,请终止该实例。

虽然本教程中的实例在“自由层”中,但我建议终止该实例,这样你就不会忘记它。

Please Terminate your Instance

结论

本教程提供了启动和连接 EC2 实例的快速指南,以及如何着手建立一个基本的数据科学环境。如果您想继续 EC2 学习,我建议您查看教程“使用云中的 Jupyter 笔记本进行深度学习”,其中介绍了如何为深度学习应用程序设置基于 linux 的 EC2 GPU 实例。如果您对本教程有任何问题或想法,请在下面的评论中或通过 Twitter 联系我们。

原载于www.datacamp.com

AWS SageMaker:人工智能的下一个游戏规则改变者

原文:https://towardsdatascience.com/aws-sagemaker-ais-next-game-changer-480d79e252a8?source=collection_archive---------2-----------------------

今天 AWS SageMaker 发布,是牛逼。我在以前的文章中提到过,我们主要为客户进行 AWS 部署。较小的模型适合数字海洋水滴,但是 CNN 和 word 嵌入模型确实需要 GPU 和大量 RAM。这将是另一篇技术文章,向您展示为什么今天的发布是一件大事。

让我们快速进入闪亮的新 SageMaker 服务,感受一下它能做什么。这是冰山一角。

逐步运行笔记本电脑:

首先登录您的 AWS 控制台:

接下来,跳到 SageMaker 快速启动页面来创建一个笔记本实例:

让我们在 ml.t2.medium 实例上运行笔记本本身。在 IAM 角色下,使用向导创建可以访问您的数据的角色。当然,定义一个加密密钥。

一旦你的笔记本创建完成,只需点击打开动作,熟悉的 jupyter 笔记本环境就出现了。

以下是您应该看到的内容:

要在大脑中验证系统是否安全,只需在一个匿名窗口中尝试访问笔记本的 URL,您将会看到该会话未通过身份验证。没错。可以继续了。

在 sample-notebooks 文件夹中有很多例子。确保您有一个 S3 存储桶来连接到上面定义的 IAM 角色可以访问的这些笔记本。我们的桶名是“lemaysolutions-demo”,因此在笔记本“notebooks/sample-notebooks/sage maker-python-SDK/1P _ k means _ high level/k means _ mnist . ipynb”中将桶引用更改为您的 S3 桶的正确名称。该模型旨在从 Yann LeCun 著名的 MNIST 数据集中识别手写数字。

Make sure the text where the red circle is has the name of your S3 bucket.

好的。因此,运行前几个单元格,您应该会看到如下结果:

数据存储在您的 S3 存储桶中,如下所示:

请注意,培训实例是在代码中按需提供的(疯狂!)并且是 ml.c4.8xlarge 实例。它会运行一段时间,所以请耐心等待。

Provisioning jobs from code on demand. I think the mind blowing I just had got brain all over my keyboard.

文档显示培训工作需要“7 到 11 分钟”,而实际上手机上的计时器显示该工作需要 6 分 32 秒!

Don’t worry if you see lots of red. These are just INFO messages, not crashes.

为训练好的模型设置主机也通过编程完成。文档显示还有 7 到 11 分钟的设置时间,结果更像是 12 分 39 秒。这里有个提示。如果笔记本的图标上有圆点,说明它正在运行。

The three grey dots in the red circle I added to the picture indicate something is running in the notebook. The star in the red square tells you that this is the cell that’s running.

这是数据集上模型的输出。在非常基本的意义上,这 10 个聚类表示 K-means 分类器根据它们的相似性将这些数字分组为 10 堆的结果。通过观察形状,你可以直观地看出这个系统不费吹灰之力就做得不错。

The results of the model are quite nice. We see the same digits being confounded in the embedding demo of TensorFlow’s TensorBoard.

在一天结束时,您应该已经创建了一个 S3 存储桶、一个笔记本实例、一个作业和一个经过训练的模型。

总之,AWS SageMaker 非常棒。这将彻底改变我们的咨询方式。我们都致力于快节奏的开发并尽早展现价值,SageMaker 帮助我们在第一天就做到这一点。亚马逊甚至没有付钱让我说出来😜。

如果你喜欢全新的 AWS SageMaker 上的这篇文章,可以看看我过去阅读量最大的一些文章,比如“如何为人工智能项目定价”和“如何聘请人工智能顾问”除了与商业相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习

编码快乐!

-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI

您可能喜欢的其他文章:

Azure Data Studio:初步想法和演练

原文:https://towardsdatascience.com/azure-data-studio-initial-thoughts-and-walk-through-905d25daf62b?source=collection_archive---------19-----------------------

在微软 Ignite 上,Azure Data Studio 已经全面上市。Azure Data Studio 以前被称为 SQL Operations Studio,是一个跨平台的数据库工具,可以用来管理本地和云数据源。

当我第一次安装并运行 Azure Data Studio 时,我对它的最初印象是它几乎是一个 Visual Studio 数据代码。它带有智能感知、代码片段、源代码控制集成和一个集成终端。

Azure Data Studio 中支持 Git,但是您需要安装 2.0.0 版或更高版本才能使用它。

与 Visual Studio 代码非常相似,您可以同时运行多个集成的终端,而不是在每次想要执行一些命令行工作时切换出编辑器:

All the terminals!

Windows 10 中的终端默认使用 Powershell,而 Linux 和 macOS 使用$SHELL。点击可以了解更多关于终端的配置。

还支持扩展。Azure Data Studio 中的扩展允许我们向基础安装添加更多功能,就像 Visual Studio 代码一样。你也可以开发自己的扩展,这非常棒!

让我们通过一个简单的教程来连接和查询 Azure SQL 数据库。我将假设您知道如何在 Azure 中创建数据库。如果没有,可以按照这个教程来入门。

打开 Azure Studio 开始使用。如果这是你第一次运行 Azure Data Studio,你会自动看到一个连接页面打开。如果没有,您可以通过单击服务器侧边栏中的图标来添加新连接(见下文):

Azure Data Studio 支持 SQL 登录和 Windows 身份验证。我使用过 SQL 登录,所以我需要提供我的服务器名、用户名和密码。

(注意:确保您在 Azure 中为您的服务器启用了 防火墙规则 。如果你不这样做,你可以在 Azure Data Studio 中通过一个简单的 UI 向导来完成。相当酷!)

登录后,让我们创建一个数据库和一个要使用的表。右键单击您的服务器并选择新查询。在查询编辑器中,运行以下 SQL 代码:

IF NOT EXISTS (
    SELECT name
    FROM sys.databases
    WHERE name = N'PersonDB'
)CREATE DATABASE [PersonDB]
GOALTER DATABASE [PersonDB] SET QUERY_STORE=ON
GO

一旦我们的数据库被创建,我们想改变我们的数据库到 PersonBD。我们可以使用下拉菜单来完成此操作:

然后,我们可以通过运行以下代码来创建人员表:

IF OBJECT_ID('dbo.People', 'U') IS NOT NULL
DROP TABLE dbo.People
GOCREATE TABLE dbo.People
(
   PeopleId INT NOT NULL PRIMARY KEY,
   Name [NVARCHAR](50) NOT NULL,
   Age INT NOT NULL,
   Email [NVARCHAR](50) NOT NULL
);
GO

我们可以在服务器侧栏中看到我们的新表:

现在让我们在新表中插入一些行:

INSERT INTO dbo.People
 ([PeopleID], [Name], [Age], [Email])
VALUES
  (1, N'Will', 27, N'will@example.com'),
  (2, N'Isaac', 7, N'isaac@example.com'),
  (3, N'Sam', 4, N'sam@example.com'),
  (4, N'Jan', 33, N'jan@example.com'),
  (5, N'Jane', 57, N'jane@example.com')
GO

最后,我们可以查询它以查看其内容:

SELECT * FROM dbo.People;

我们应该会看到以下结果:

既然我们已经创建了表并在其中插入了一些数据,现在让我们通过创建一个 insight 小部件来管理我们的数据库,它为我们提供了表在数据库中使用了多少空间的视图。

与 Visual Studio 代码非常相似,我们可以使用命令面板快速查找内容。要打开它,按下 Ctrl+Shift+P. 打开后,输入设置,选择首选项:打开用户设置。

我们将看到一个 JSON 文件和一个搜索输入框一起打开。在这里,键入 dashboard 并找到dashboard . database . widgets设置:

在默认用户设置中找到该设置后,您需要点击铅笔图标并选择复制到设置。如果设置中显示替换,请不要点击它!

当您将设置复制到您的用户设置文件中时,您想要添加以下 JSON:

{          
   "name": "Space Used by Tables",
   "gridItemConfig": {
           "sizex": 2,
           "sizey": 1          
    },          
    "widget": {              
        "table-space-db-insight": null          
    }      
},

右键单击您的 PeopleDB 并单击管理,保存您的设置并打开您的数据库仪表板。您应该会在控制面板中看到以下小部件:

现在,您可以通过使用过滤等方式,使用该洞察力图表来获得不同的洞察力。

一旦你使用完你的资源,你可以自由地回到 Azure 并清理掉你不再需要的资源。

正如你所看到的,Azure Data Studio 是一个非常棒的工具,可以让数据工程师管理本地和云数据源。就我个人而言,我迫不及待地想看到这个产品如何随着社区的投入而发展。

如果你想查看源代码,这里有 GitHub repo。同样,你也可以在这里看到发布说明

不列颠哥伦比亚政治:情绪分析预测霍根获胜

原文:https://towardsdatascience.com/b-c-politics-sentiment-analysis-predicts-horgan-win-682fe8b0eb44?source=collection_archive---------7-----------------------

The candidates: The NDP’s John Horgan, the Liberal’s Christy Clark and the Green Party’s Andrew Weaver. Adapted from the Vancouver Courier. Photo by Dan Toulgoet.

对 Reddit 帖子的情绪分析表明,NDP 领导人约翰·霍根将在 5 月 9 日星期二赢得不列颠哥伦比亚省的选举。这项研究表明,虽然 Reddit 用户在 r/Vancouverr/BritishColumbia 子编辑中发布了更多关于简蕙芝和不列颠哥伦比亚自由党的信息,但他们对霍根和不列颠哥伦比亚新民主党的看法要积极得多。

什么是情感分析?

情感分析,也称为观点挖掘,旨在识别给定文本中说话者或作者的感觉和态度。该技术可以根据作者使用的单词来确定文本是积极的、消极的还是中性的。具有积极情绪的单词使文本倾向于积极得分;否定词,否定。因此,情感分析程序可以快速有效地扫描大量的评论、帖子或页面,并将它们分类为表达对某个主题的情感范围。

情感分析在未来几年将变得越来越重要,原因有二;首先,随着固定电话被废弃,越来越少的人接听民意调查者的电话,传统的民意调查方法正在迅速失去可信度和有效性。其次,Twitter、脸书、Instagram 和 Reddit 等网站上的互联网对话呈指数级增长,这意味着数以百万计的个人观点突然可以通过这些技术进行审查。

在最近的美国大选中,社交媒体分析比民调更能预测特朗普的胜利。

该领域还处于起步阶段,但很可能会迅速发展,并在不久的将来成为民意研究的标准组成部分,甚至可能取代民调本身,成为评估政治竞争的标准手段。

Reddit 的观点

对来自两个政治上最活跃的不列颠哥伦比亚相关子区 r/Vancouver 和 r/BritishColumbia 的最近 1000 个帖子的情绪分析表明,Horgan 将在本周二获胜。

Sentiment towards the B.C. Liberal Party. Net Positive Sentiment: 2.7%

Sentiment towards the B.C. NDP. Net Positive Sentiment: 13%

根据 Reddit 的说法,这些图表显示了各方的偏好。根据研究结果,对 NDP 的净正面情绪为 13%,对自由党的净正面情绪为 2.7%。

任何观察不列颠哥伦比亚政治的人都会证明,这听起来是对的。你会发现,在任何一个晚宴上,任何一方的支持者和反对者都势均力敌。说到领导者,差距就更大了:

Sentiment towards Christy Clark. Net Positive Sentiment: 6%

Sentiment towards John Horgan. Net Positive Sentiment: 17%

根据这项测试,霍根个人在净正面情绪竞赛中领先克里斯蒂,17%对 6%。这是政治专家们可以深入研究的事情:霍根明显领先,我们可以宣布他是未来的赢家。

但这当然有些为时过早。

一些注意事项

情绪分析能够识别与候选人相关的积极帖子,如“无论你怎么说简蕙芝,她仍然是一位出色的活动家,”以及“是的,不列颠哥伦比亚省 NDP 领导人约翰·霍根很生气——但这是一种好的方式。”负面帖子也很容易识别,比如“金钱和傲慢会让简蕙芝输掉不列颠哥伦比亚的选举吗?”“不列颠哥伦比亚省 NDP 领导人霍根在一些问题上不明确,在资金上不具体。”但是很少有帖子这么明确。很多帖子都是模棱两可的,导致大量帖子不得不贴上“中立”的标签。

进一步,一个问题出现了:我们能相信 Reddit 上用户的情绪吗?样本量很小,在 Reddit 上发帖的人不一定能代表整体人群。他们对候选人的感觉是否准确地代表了总体人口?Reddit 用户会投票吗?

此外,这项研究没有包括非英语语言的情感——鉴于某些语言的构成,这是一个相当重要的缺失。

更重要的是,情绪和投票意向之间的关系还不清楚。很有可能一个选民会同情一个政党,但仍然不投他们的票。那些对霍根有利的数据,显示他远远领先于克拉克?嗯,韦弗的不列颠哥伦比亚绿党也有一个净积极。这是百分之百。

Sentiment towards the B.C. Green Party. Net Positive Sentiment: 100%

Sentiment towards Andrew Weaver. Net Positive Sentiment: 37.5%

虽然很明显绿党不会彻底赢得选举,但他们似乎有 Reddit 的投票!这些都是非常好的消息。

指路

因此,关键问题是样本大小、样本构成以及情绪与投票意向的关系。随着可供分析的项目数量呈指数级增长,前两个问题在未来可能会变得不那么严重,情感与意图之间的关系将永远是一个黑箱。有可能通过小规模的投票来填补特定的空白,以确定每个个案中的确切关系。

目前,可以肯定的是,根据 Reddit 的报道,下周这个时候,这个省将会有一个新政府。

要了解更多关于情绪分析和我使用的 Python 包,名为 VADER,请查看 我的 github

婴儿步入舞台:可视化虹膜数据集

原文:https://towardsdatascience.com/baby-steps-into-tableau-visualizing-iris-data-set-ed476e16f879?source=collection_archive---------8-----------------------

Source: Google Images

Tableau 有一句口号是“ ,改变你对数据的看法。经过一番思考,我们很容易得出这样一个结论:这句口号非常中肯。Tableau 作为一种工具给了我们力量,向我们展示了数据的奥秘。更重要的是,Tableau 教会了我们如何利用数据的力量,揭开这些谜团。因此,在这篇进入 Tableau 的文章中,我将带你通过使用虹膜数据集来了解 Tableau 的重要特性。

现在 Tableau 不仅仅是一个数据可视化软件,它还是一个商业智能应用程序(BI App)。有了 Tableau,商业智能变成了自助服务。

本质上,Tableau 是一个专注于商业智能的数据可视化软件。现在,对于你们中的一些人来说,“商业智能”这两个词可能会让人感到困惑,甚至会让一些人不知所措。但是,在数据可视化(即以可视化形式呈现数据)的帮助下,简单地支持或帮助组织做出决策的想法,无论是从运营到战略的任何事情,都是商业智能的核心。

Tableau 是用现代分析增强整个企业商业智能的领导者。根据 Gartner 的 2017 年魔力象限,Tableau 是商业智能和分析平台的明确领导者。

现在我们有了 Tableau 是什么的想法,让我们现在了解它的用户界面,以便最终能够使用该软件。

Tableau 的界面

Tableau 的工作空间的结构非常容易理解,它是用一种简单的方法制作的,即使如此,它也没有简单到可以简单的程度,可能需要一些时间来适应。

让我们深入研究一下。

在页面顶部,我们有一些用于文件、数据、工作表、仪表板等的下拉框。通过经常使用,你会发现最有价值的命令存在于这些下拉菜单中。

在这些下拉菜单下,我们有一个工具栏,工具栏包括许多有用的命令。第一个是保存,添加一个新的数据源,暂停任何来自数据源的自动更新,添加一个新的工作表,复制和几个其他命令,这些命令将在我们创建可视化时发挥作用。

左上角的 Tableau 徽标命令会将您带到起始页,如果要连接到另一个数据源,您可能需要返回到起始页。

要返回,我们只需再次点击徽标。

此外,页面左侧还有数据窗格。如果我们在“数据”选项卡上,我们会看到它列出了所有打开的数据源,并从该数据源中选择字段作为维度或度量。

度量是连续变量,本质上是数字。而维度是离散变量,如文本字符串和日期。

数据窗格还将显示我们可能有的任何集合或参数。

如果我们单击“analytics”选项卡,我们可以直接以拖放元素的形式显示我们的分析片段。如果它们与我们当前正在处理的视图或视觉类型无关,某些元素将会变灰。例如,时间线上的总计。

如果我们选择类似趋势线的东西,我们可以将它带到这些拖放区中的任何一个,以控制其属性的各个方面,如模型类型以及它应该应用于哪个度量等。

在底部,我们有新的工作表标签。我们可以使用这些选项卡创建工作表、仪表板和故事。我们可以做诸如重命名工作表、复制工作表、复制格式等许多事情。

如果工作簿有很多工作表,我们可以使用右下角的控件轻松导航。

界面最重要的部分之一是界面右侧中央的行和列架。要创建我们的可视化,我们只需将维度和度量从数据窗格拖到列和行架中。我们也可以这样做,将我们的维度和度量直接拖到画布上,让 Tableau 自动分离行和货架。

当我们将维度和度量值拖动到列和行卡片时,我们将观察到一个特定的配色方案。蓝色代表尺寸,绿色代表尺寸。

对于您创建的几乎每个可视化,我们都将向列架和行架添加维度和度量。

当我们举一个实际的例子并看到第一手的应用时,这一点将会更加清楚。

然后,我们有一个中央工作区,一旦行和列中有了度量和维度,可视化就会出现在这里。

在这里,我们可以给出工作表标题,为我们的可视化写标题,安排我们的可视化,还可以做一些格式化。

在右上角,我们有“演示”选项。

如果您不确定要创建什么样的可视化或 Tableau 中有哪些可用选项,可以单击“演示”选项,该选项将显示各种类型的可视化,您可以使用所选的维和度量或从当前存储在列和行中的数据创建这些可视化。

“演示”选项的一个优点是它会自动告诉您哪些类型的图表适合您所拥有的数据。因此,Tableau 试图向您介绍数据可视化的一些最佳实践。

现在来看 Tableau 界面最重要的部分之一。页面、过滤器和标记卡位于页面的中央左侧,靠近我们的行和列架以及工作区。

这两种卡片,过滤器和标记,在大多数可视化中被广泛使用。

过滤器允许我们从可视化中排除某些数据类型。例如,我们可能希望从我们的可视化和用于特定可视化的数据中排除一些值。

为此,我们可以设置一个范围并删除值。

另一方面,标记允许我们更详细地格式化图表。Marx card 由其他几个架子组成,每个架子上都可以放置字段,单击这些字段可以编辑它们的特征。更改标记类型可以更改标记卡上的架子,这样选择形状会调出形状架子。

根据视图的组成,可以有多个标记卡,每个测量一个。

将字段放置在颜色大小或形状架上时,将自动创建颜色大小和形状等图例。但是,可以通过单击菜单并选择隐藏卡片来删除图例。要恢复图例,右键单击画布本身的任意位置,选择 legend 并选择所需的图例。

应用:使用 Tableau 创建我们的第一个可视化

为了更加清晰地理解我们刚刚学到的关于 Tableau 界面的知识,让我们看一个例子并创建我们的第一个可视化。

对于这第一个可视化,我们将使用 UCI 机器学习库中非常著名的 Iris 数据集创建一些简单的图表。

这是一个相当简单的数据集,有 150 个实例、4 个属性和一个类;即萼片长度、萼片宽度、花瓣长度、花瓣宽度和具有三个类别的类别属性,即刚毛鸢尾、杂色鸢尾和海滨鸢尾。

尽管我们目前不会对该数据集进行任何分类或预测分析,但该数据集已被广泛用于进行此类分析。

就像我们将带有 Iris 数据集的 excel 表导入 Tableau 一样,我们可以立即查看数据集的各种实例和属性。在这里,我们还可以更改各种属性的数据类型。

现在让我们直接进入工作表,开始我们的可视化。

对于这里的第一个例子,我们看到了花瓣长度和花瓣宽度之间的图,它根据物种进行了颜色编码,这可以在图例中看到。

在这里,在数据窗格中,我们可以看到度量和维度之间的属性划分。如前所述,数字属性属于 measures 类别,而类属性属于 dimensions 类别。

我们已经创建了一个非常简单的散点图,显示了花瓣长度和花瓣宽度之间的关系,考虑到了各种物种。哪一个被分别放在列和行的架子上?

在标记卡中,我们可以清楚地看到,指定的属性已被放到颜色架上,以根据物种对分散点进行颜色编码。我们还可以看到颜色代码的补充图例。

让我们尝试另一种可视化方式,这次是直方图。

这种可视化表现了基于花瓣长度、花瓣宽度、萼片长度和萼片宽度的三个物种之间的比较。

我们可以看到,这四个属性是 rows shelf 的一部分,类变量 species 是 Columns shelf 的一部分。

此外,使用标记卡根据物种进行了颜色编码,正如上一个示例中所做的那样,我们还可以在图表的 X 轴上看到物种,因为物种也是色谱柱架的一部分。

结论

既然我们已经看到了这两个例子,那么 Tableau 及其界面的可用性一定非常清楚。

Tableau 有很多功能,可以通过使用各种选项进行很多小的调整,这些选项你只会在练习制作自己的可视化效果时遇到。

有很多东西需要探索,所以访问 UCI 机器学习库或任何像 Kaggle 这样的数据集资源,迈出可视化世界的第一步,成为这个领域要求你成为的探索者。

原载于 2018 年 9 月 14 日【stepupanalytics.com】

在简单的 RNN/LSTM 上推导反向传播(专长。艾丹·戈麦斯)

原文:https://towardsdatascience.com/back-to-basics-deriving-back-propagation-on-simple-rnn-lstm-feat-aidan-gomez-c7f286ba973d?source=collection_archive---------0-----------------------

Gif from this website

Aidan Gomez 做了一项惊人的工作,详细解释了反向传播 LSTM 一般是如何工作的。我也做了我的这篇文章。然而,我的朋友阿部康对我的帖子有一个问题。

所以今天,我想回顾一下反向传播的一些基本概念,同时将我的帖子和 Aidan 的帖子联系起来。

最后,我们学校的所有实验室都在翻新,因此我没有白板可以写,所以我会尽我所能在笔记本上写得尽可能整洁。

衍生品的快速重述

首先,让我们在继续之前练习一些导数。看着上面的图片,如果你觉得一切都有意义,请继续,否则我会建议你通过阅读这篇文章来复习更多关于衍生品的知识。

另外请注意,f(x) = tanh(x)的导数是 1-tanh(x ),可以改写为 1-f(x)。

链式法则的快速重述

Image from this website

所以链式法则也非常简单,上面我们可以看到,我们想要对函数 y 的 x 求导,但是,函数 y 本身不包含变量 x,所以我们不能直接求导。谢天谢地,函数 y 包含变量 u,u 包含 x,所以我们最终能够对函数 y 的 x 求导,这要感谢链式法则。

多变量衍生工具的快速重述

蓝色 →对变量 x 的导数
红色 →对变量 Out 的导数

现在让我们回顾一下多变量的导数,它只是对每一项单独求导。此外,现在请忽略变量的名称(如 x 或 out ),它没有重要的意义。让我们看另一个例子。

Left Image from this website, Right Image from this website

因为 ln(x)的导数是 1/x,如果我们对每个方程分别对 x 和 y 取偏导数,我们会得到类似上面的结果。最后,让我们看一个在逻辑 sigmoid 函数中的多变量函数的例子。

蓝色 →对变量 x 的导数
红色 →对变量 Out 的导数

递归神经网络的基本构建模块

Modified Image from this website

所以上图告诉了我们简单递归神经网络的基本构建模块,具有四个状态(用符号 s 表示)、三个输入(用符号 x 表示)和一个误差(用符号 E 表示)。现在让我们把它放进数学方程,但是没有任何激活函数。

绿框 →相对于状态 3 的误差导数
蓝框 →相对于状态 2 的误差导数
红框 →相对于状态 1 的误差导数

现在让我们看看每个状态的导数,很简单,对吧?使用链式法则以及多变量导数,我们能够对每个状态取导数,以相应地更新权重(U)。(请注意,我没有对状态 0 求导,我们使用的是 L2 损失函数。).现在让我们通过对输入求导来完成这个任务。

绿框 →相对于输入 3 的误差导数
蓝框 →相对于输入 2 的误差导数
红框 →相对于输入 1 的误差导数

LSTM 的前馈操作

Right Image from this website

前馈操作看起来非常复杂,但是,当我们做实际的数学运算时,它非常简单。左图是 LSTM 的图形表示,右图是来自 Aidan Gomez 的数学表示。现在让我们写下状态 1 和状态 2 的数学表达式(请注意,我在这篇文章中互换使用了状态和时间戳这两个术语)。我将使用艾登的符号,因为它会更容易理解。

请再次注意,我们使用的是 L2 成本函数。现在让我们来看一个数字例子,下面两张图片来自 Aidan 的博客文章。(请注意,在我的笔记中,为了简单起见,我没有写偏见术语。)

Aidan 也使用了状态 0 和 1,而我使用了状态 1 和 2。

时间戳 2 处的反向传播

Left Image Back Propagation equations by Aidan

这里有两点需要注意…

1.绿线→请记住 Tanh()的导数可以这样改写。如果您不记得原因,请向上滚动。

2.我没有对 i(2)和 f(2)求导。原因是因为那两项与 a(2)具有非常相似的导数结构。我将在下面详细解释原因。

如果我们观察 state(t)是如何计算的,我们可以看到涉及到 a(t),i(t),f(t)和 state(t-1)项。所以当我们对变量 a(t)求导时,我们可以知道,这和对 i(t)求导非常相似。然而,有一个术语我们需要更深入地研究,那就是 o(t)。因为这个术语是在我们计算状态(t)之后使用的,导数也是不同的。

橙色框 →关于 o(2)的导数

我们可以清楚地看到,导数方程与 a(2)相比有一些差别。

记住这些想法,我们可以看到,在时间戳 2 推导反向传播并不困难,因为它是 LSTM 的最外层。

时间戳 1 处的反向传播

绿框 →时间戳 1
处误差函数的直接导数部分蓝框 →时间戳 2
处的导数部分红框 →将符号汇总为β

上图是时间戳为 1 时的反向传播操作。现在,我再次使用艾登的符号,然而有一部分,我的朋友已经指出。

蓝框 →计算 t 点的导数时,为什么需要 t+1 的一项?

在第一个网站上,它肯定看起来令人困惑,所以让我们更深入地看看前馈操作。

蓝框 →当时间戳为 1(左图)和时间戳为 2(右图)时,显示状态 1

请注意,我会交替使用“时间戳”和“状态”这两个术语。不管怎样,我们可以观察到,当对状态 1 求导时。我们需要两个方程。

  1. 首先,当时间戳为 1(绿框)时,我们需要渐变
  2. 第二,我们需要时间戳为 2 时的梯度。(蓝色方框)

让我们回顾一下蓝框术语的来源。(关于状态(2)的导数)

所以在上面的导数之后,我们还需要加上 f(2)项。其原因可以解释如下。

请记住,在前馈操作期间,当时间戳为 2 时,我们将状态(1)乘以 f(2)。因此,如果我们对状态(1)求导,我们也需要乘以该项。

时间戳 1 时相对于 O 的反向传播

橙色框 →相对于 O 项的导数

现在让我们考虑关于 o 项的反向传播过程,与我们在上一节中所做的反向传播相比,有一个有趣的事实需要我们注意。

橙盒 →艾丹反向传播方程

没有 t+1 的项。对状态(t)求梯度时,这是一个明显的区别。换句话说…..

a)在对状态(t)取梯度时→我们需要考虑来自未来时间戳状态(t+1)的梯度

b)在对 o(t)取梯度时→我们不需要考虑来自未来时间戳状态(t+1)的梯度

当考虑时间标记 1 的反向传播时,可以再次看到这一点。

蓝框 →其中状态(2)(换言之状态(t+1)存在
黄框 →受状态(t+1)影响的导数
黑框 →不受状态(t+1)影响的导数

为了进一步证实这个想法,让我们看一下我以前的博客帖子,在那里我更详细地介绍了反向传播。

Image from this post

蓝框 →从时间戳 1
的成本函数对 o(用 W(o)表示)求导;绿框 →从时间戳 2 的成本函数对 o(用 W(o)表示)求导

到目前为止,我们可以理解导数,但是现在让我们看看数学。

请暂时忽略绿色/红色框。好的,这是我们得到的数学公式,但是现在让我们比较一下,我们从之前的帖子到现在的帖子得到的公式。为了便于比较,让我们扩展等式,如下所示。

红框 →公式展开的重复项
绿框 →时间戳 2 的导数

现在把所有的东西放在一起,我们从上面看到的所有的绿盒子元素,进入黑星变量。所有的红框元素都完全一样。(除了输入的 x 符号)。

这里我们可以确认的是,当对 o 项求导时(见下文),我们不需要考虑状态(t+1)的导数。

最后的话

希望这篇文章可以澄清一些困惑,但是我知道我的英文解释不是最好的。所以如果你有任何问题,请在下面评论。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。

与此同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。

参考

  1. 反向传播一个 LSTM:一个数值例子。(2016).中等。检索于 2018 年 5 月 1 日,来自https://medium.com/@aidangomez/let-s-do-this-f9b699de31d9
  2. 微积分评论:衍生规则——Magoosh 高中博客。(2017).Magoosh 高中博客。2018 年 5 月 1 日检索,来自https://magoosh . com/hs/AP-calculus/2017/calculus-review-derivative-rules/
  3. 微积分的规则-多元。(2018).Columbia.edu。检索于 2018 年 5 月 1 日,来自http://www . Columbia . edu/ITC/SIPA/math/calc _ rules _ multivar . html
  4. lnx 的衍生和例子—mathbootpcamps。(2016).数学夏令营。检索于 2018 年 5 月 1 日,来自https://www.mathbootcamps.com/derivative-natural-log-lnx/
  5. 基于递归神经网络的电价预测。(2018).Slideshare.net。检索于 2018 年 5 月 1 日,来自https://www . slide share . net/taegyunjeon 1/electric-price-forecasting-with-recurring-neural-networks
  6. 微分 3 微分的基本法则积和商法则链式法则经济学中的边际函数高阶导数。— ppt 下载。(2018).Slideplayer.com。检索于 2018 年 5 月 1 日,来自http://slideplayer.com/slide/10776187/
  7. 反向传播一个 LSTM:一个数值例子。(2016).中等。检索于 2018 年 5 月 2 日,来自https://medium.com/@aidangomez/let-s-do-this-f9b699de31d9
  8. 只有 Numpy:推导长期短期记忆中的前馈和反向传播(LSTM)第 1 部分。(2018).成为人类:人工智能杂志。2018 年 5 月 2 日检索,来自https://becoming human . ai/only-numpy-derivating-forward-feed-and-back-propagation-in-long-short-term-memory-lstm-part-1-4ee 82 c 14 a 652

借助人力资源分析重返校园

原文:https://towardsdatascience.com/back-to-school-with-hr-analytics-add03e71f8f?source=collection_archive---------10-----------------------

现在是返校季,这让我想知道教育对分析成就有多重要。由于互联网分析是一个快速发展的话题,并且不断发展,分析专业人员必须做一些功课,以跟上行业标准、最佳实践和工程进步。但人力资源分析领导者也应该发挥教师的作用,向一系列内部利益相关者和外部合作伙伴讲授分析的价值,以及它为什么重要,以及它如何帮助实现特定的业务目标。

让我们看看分析教育的几种课程选择

教育企业主:第一件事将是教导业务单位和产品经理关于信息共享,并指导他们如何利用几个分析工具。教科书大小的报告充满了员工的信息和行为,没有上下文,不会帮助公司高管做出更好的决策。事实上,它们只会导致沮丧和困惑。例如,员工绩效数据应始终与去年、上个季度或上个月进行比较,以便更好地理解。

根据该公司的情况,有一个完整的“语言”课程,以及精心定义的页面浏览量、独立访问者和会话长度等短语,可能是必不可少的。此外,管理人员应该了解这些度量标准如何相互关联,以及如何与中心业务目标保持一致。

不完全理解参数或 人力资源分析 功能的执行团队可能会匆忙采取适得其反的行动。一家大型媒体公司的高管团队感到沮丧,你永远也不想看到他们是否从两个据称可靠的来源持续获得报道,报道明显相同的细节。

人力资源分析的目标

人力资源分析旨在为组织提供有效管理员工的见解,以确保快速高效地实现业务目标。人力资产分析面临的挑战是确定应该记录哪些信息,以及如何使用这些信息来建模和预测能力,以便组织的人力投资获得最佳投资回报(ROI)。

人力资源部门正在创建比以往任何时候都多的数据,但与此同时,他们经常难以将信息转化为有价值的见解。根据领导者和人力资源人员在全球公司的工作,专家们确定了一些基本的分析方法,经理们可以利用这些方法来改善他们组织中与人相关的方面。这篇信息丰富的文章基于我的关于重要的 商业分析程序 的帖子,这可能是很好的额外背景阅读。

投资合适的人力资源分析工具

使用正确的分析工具发现并最终确定劳动力空缺,从而满足您的业务需求。了解运营和战术人力资源缺口,以加强人员规划。利用招聘、流动和退休趋势,以及人力资源干预和策略库来减少可能阻碍进步的危险。通过对劳动力论文和价格建模,评估劳动力计划情况的财务后果。

利用可靠的情报推动业务决策。探索招聘、多样性、人员流动和功能性等挑战。通过个性化标题、人力资源仪表板和报告分享见解和趋势。

Right 人力资源分析解决方案 连接业务和 IT,帮助您缩小自动化转换策略和实施之间的差距。从价值和设计发现,到加速创造,再到成功利用有形业务成果,有可能通过使用最了解应用程序的可靠顾问开辟新领域来发展您的公司。

深度学习背景去除

原文:https://towardsdatascience.com/background-removal-with-deep-learning-c4f2104b3157?source=collection_archive---------0-----------------------

这篇文章描述了我们在绿色屏幕上的工作和研究。AI 。我们很乐意听到想法和评论——在推特Linkedin

也可以看看我们的网站—www.shibumi-ai.com

介绍

在过去几年的机器学习中,我一直想打造真正的机器学习产品。
几个月前,服用了伟大的 Fast 之后。AI 深度学习课程,看起来就像星星排成一行,我有机会:深度学习技术的进步允许做许多以前不可能的事情,新的工具被开发出来,使部署过程比以往任何时候都更容易。
在前面提到的课程中,我遇到了 Alon Burg ,他是一位经验丰富的 web 开发人员,我们合作追求这个目标。我们共同为自己设定了以下目标:

  1. 提高我们的深度学习技能
  2. 提高我们的人工智能产品部署技能
  3. 根据市场需求制造有用的产品
  4. (为我们和我们的用户)享受乐趣
  5. 分享我们的经验

考虑到上述情况,我们正在探索以下想法:

  1. 尚未完成(或未正确完成)
  2. 计划和实施不会太难——我们的计划是 2-3 个月的工作,每周一个工作日。
  3. 将有一个简单而吸引人的用户界面——我们想做一个人们会使用的产品,而不仅仅是为了演示的目的。
  4. 将随时可以获得训练数据——正如任何机器学习从业者都知道的那样,有时数据比算法更昂贵。
  5. 将使用尖端的深度学习技术(谷歌、亚马逊和朋友们在其云平台上尚未商品化),但不会太尖端(因此我们将能够在网上找到一些例子)
  6. 将有可能达到“生产就绪”的结果。

我们早期的想法是从事一些医学项目,因为这个领域非常贴近我们的内心,我们觉得(现在仍然觉得)在医学领域有大量容易实现的深度学习成果。然而,我们意识到我们将会遇到数据收集的问题,也许还有合法性和监管的问题,这与我们保持简单的意愿相矛盾。我们的第二个选择是背景去除产品。

如果你使用某种“标记”和边缘检测,手动或半手动(Photoshop,甚至 Power Point 都有这样的工具)去除背景是一项非常容易的任务,见这里一个例子。然而,全自动背景去除是一项相当具有挑战性的任务,据我们所知,仍然没有产品能取得令人满意的结果,尽管有些人做了尝试

我们将移除什么背景?这被证明是一个重要的问题,因为一个模型在物体、角度等方面越具体。分离的质量就越高。在开始我们的工作时,我们想的很大:一个通用的背景去除器,它将自动识别每种类型的图像中的前景和背景。但是在训练了我们的第一个模型之后,我们明白了将我们的努力集中在一组特定的图像上会更好。因此,我们决定以自拍和人像为主。

Background removal of (almost) human portrait

自拍是一种具有突出和聚焦前景的图像(一个或多个“”),保证我们在物体(面部+上半身)和背景之间有良好的分离,以及相当恒定的角度,并且总是同一物体()。

考虑到这些假设,我们开始了研究、实施和数小时培训的旅程,以创建一个易于使用的一键式背景移除服务。

我们工作的主要部分是训练模型,但是我们不能低估正确部署的重要性。好的细分模型仍然不如分类模型紧凑(例如【SqueezeNet】),我们积极研究了服务器和浏览器部署选项。

如果你想了解更多关于我们产品部署过程的细节,欢迎你查看我们在服务器端客户端的帖子。

如果你想了解这个模型和它的训练过程,继续下去。

语义分割

当检查与我们相似的深度学习和计算机视觉任务时,很容易看出我们的最佳选择是语义分割任务。

其他策略,如深度检测分离也存在,但对我们的目的来说似乎还不够成熟。

语义分割是一项众所周知的计算机视觉任务,与分类和对象检测并列为三大任务之一。从将每个像素分类到一个类别的意义上来说,分割实际上是一个分类任务。与图像分类或检测不同,分割模型真正显示了对图像的一些“理解”,不仅说“在这个图像中有一只猫”,而且在像素级别上指出猫在哪里以及是什么。

那么分段是如何工作的呢?为了更好地理解,我们将不得不考察这一领域的一些早期作品。

最早的想法是采用一些早期的分类网络,如 VGGAlexnetVGG 是 2014 年图像分类的最新模型,由于其简单明了的架构,现在非常有用。当检查 VGG 早期层时,可能会注意到在要分类的项目周围有高激活。更深的层具有更强的活性,然而由于重复的汇集作用,它们本质上是粗糙的。记住这些理解,假设分类训练也可以通过一些调整用于发现/分割对象。

语义分割的早期结果与分类算法一起出现。在这篇文章中,你可以看到一些使用 VGG 得到的粗略分割结果:

后期图层结果:

Segmentation of the buss image, light purple (29) is school bus class

双线性上采样后:

这些结果来自于仅仅将完全连接的层转换(或保持)成它的原始形状,保持它的空间特征,得到一个完全卷积的网络。在上面的例子中,我们将一个 7681024 的图像放入 VGG,得到一个 24321000 的图层。2432 是图像的合并版本(乘 32 ), 1000 是图像网络类计数,从中我们可以导出上面的分割。

为了平滑预测,研究人员使用了一个简单的双线性上采样层。

在 FCN 的论文中,研究人员改进了上面的想法。他们沿途连接了一些层,以允许更丰富的解释,根据上采样率,这些层被命名为 FCN-32、FCN-16 和 FCN-8:

在层之间添加一些跳跃连接允许预测从原始图像中编码更精细的细节。进一步的训练进一步提高了成绩。

这种技术表明自己并不像想象的那么糟糕,并证明了深度学习在语义分割方面确实有潜力。

FCN results from the paper

FCN 解开了分段的概念,研究人员为此尝试了不同的架构。主要思想保持相似:使用已知的架构、上采样和使用跳过连接在较新的模型中仍然很突出。

你可以在一些好的帖子中读到这方面的进展:这里,这里这里。您还可以看到,大多数架构都保留了编码器-解码器架构。

回到我们的项目

在做了一些研究后,我们选定了三种模型:FCN、 Unet提拉米苏 —非常深入的编码器-解码器架构。我们也有一些关于 mask-RCNN 的想法,但是实现它似乎超出了我们的项目范围。

FCN 似乎并不相关,因为它的结果并不像我们希望的那样好(即使作为一个起点),但是我们提到的另外两个模型显示了不错的结果:在 CamVid 数据集上的提拉米苏,以及 Unet 的主要优势是它的紧凑性和速度。就实现而言,Unet 的实现非常简单(我们使用了 keras ),而提拉米苏也是可实现的。为了让我们开始,我们在杰瑞米·霍华德伟大的深度学习课程的最后一课中使用了提拉米苏的一个很好的实现

有了这两个模型,我们开始在一些数据集上进行训练。我必须说,在我们第一次尝试提拉米苏后,我们看到它的结果对我们来说有更大的潜力,因为它有能力捕捉图像的清晰边缘。另一方面,unet 似乎不够好,结果似乎有点不太好。

Unet blobbiness

数据

在用模型设定了我们的大方向后,我们开始寻找合适的数据集。细分数据不像分类甚至检测那样常见。此外,手动标记实际上是不可能的。最常见的分割数据集是 COCO 数据集,它包括大约 80K 张 90 个类别的图像, VOC pascal 数据集,有 11K 张图像和 20 个类别,以及更新的 ADE20K 数据集。

我们选择使用 COCO 数据集,因为它包含了更多的" person "类的图像,这是我们感兴趣的类。

考虑到我们的任务,我们考虑是只使用与我们高度相关的图像,还是使用更通用的数据集。一方面,使用具有更多图像和类别的更通用的数据集将允许模型处理更多的场景和挑战。另一方面,一个通宵的培训课程让我们浏览了大约 15 万张图片。如果我们引入带有整个 COCO 数据集的模型,我们将以模型看到每张图像两次(平均)结束,因此稍微修剪一下将是有益的。此外,它将为我们的目的产生一个更集中的模型。

还有一点值得一提的是——提拉米苏模型最初是在 CamVid 数据集上训练的,该数据集有一些缺陷,但最重要的是它的图像非常单调:所有图像都是汽车的道路照片。正如你很容易理解的,从这样的数据集中学习(即使它包含人)对我们的任务没有好处,所以在短暂的尝试后,我们继续前进。

Images from CamVid dataset

COCO 数据集附带了非常简单明了的 API,它允许我们确切地知道每个图像中有什么对象(根据 90 个预定义的类)

经过一些实验后,我们决定稀释数据集:首先,我们只过滤有一个人的图像,给我们留下 40K 的图像。然后,我们丢弃了所有有很多人的图片,只留下一两张,因为这是我们的产品应该找到的。最后,我们只留下了 20%-70%的图像被标记为人物的图像,删除了背景中有一个非常小的人或某种怪异的怪物(不幸的是不是所有人)的图像。我们最终的数据集由 11K 的图像组成,我们觉得在这个阶段已经足够了。

Left: good image ___ Center: too many characters ___ Right: Objective is too small

提拉米苏模型

如前所述,我们在杰瑞米·霍华德的课程中被介绍了提拉米苏模型。虽然它的全名“100 层提拉米苏”意味着一个巨大的模型,但它实际上很经济,只有 9M 参数。相比之下,VGG16 的参数超过 130M。

****提拉米苏模型基于 DensNet,一种最新的图像分类模型,其中所有层都是相互连接的。此外,提拉米苏为上采样层添加了跳过连接,如 Unet。

如果你还记得的话,这个体系结构与 FCN 提出的想法是一致的:使用分类体系结构、上采样和添加跳过连接来进行细化。

Tiramisu Architecture in general

DenseNet 模型可以看作是 Resnet 模型的自然演变,但是 DenseNet 不会“记住”每一层直到下一层,而是记住整个模型中的所有层。这些连接被称为高速公路连接。它导致过滤器数量的膨胀,这被定义为“增长率”。提拉米苏的增长率为 16,因此每一层我们添加 16 个新的过滤器,直到我们达到 1072 层过滤器。你可能期望 1600 层,因为它是 100 层提拉米苏,然而,上采样层丢弃了一些过滤器。

Densenet model sketch — early filters are stacked throughout the model

培养

我们用原始论文中描述的时间表训练我们的模型:标准交叉熵损失,具有 1e-3 学习率和小衰减的 RMSProp 优化器。我们将 11K 图像分成 70%的训练、20%的验证和 10%的测试。以下所有图片均取自我们的测试集。

为了使我们的训练时间表与原始论文保持一致,我们在 500 幅图像上设置了纪元大小。这也允许我们定期保存结果中的每个改进的模型,因为我们在更多的数据上训练它(本文中使用的 CamVid 数据集包含不到 1K 的图像)

此外,我们只在两个类上训练它:背景和,而报纸有 12 个类。我们首先尝试在 coco 的一些课上进行训练,但是我们发现这对我们的训练没有太大的帮助。

数据问题

一些数据集缺陷阻碍了我们的得分:

  • 动物 —我们的模型有时会分割动物。这当然导致欠条低。把动物加到我们的任务中,在同一个主要类中或作为另一个类,可能会删除我们的结果
  • ****身体部位——因为我们用程序过滤了我们的数据集,我们没有办法判断 person 类实际上是一个人还是像手或脚这样的身体部位。这些图像不在我们的观察范围内,但仍然到处出现。

Animal, Body part, hand held object

  • 手持物体- 数据集中的许多图像都与运动相关。棒球棒、网球拍和滑雪板随处可见。我们的模型不知何故弄不清应该如何分割它们。在动物的例子中,在我们看来,将它们作为主类的一部分或作为单独的类添加将有助于模型的性能。

Sporting image with an object

  • ****粗糙地面真相—coco 数据集没有逐个像素地进行注释,而是用多边形进行注释。有时这已经足够好了,但是其他时候地面实况非常粗糙,这可能会妨碍模型学习细微之处

Image and (very) Coarse ground truth

结果

我们的结果令人满意,尽管并不完美:在我们的测试集上,我们已经达到了 84.6 的 IoU,而当前的技术水平是 85。这个数字很棘手:它在不同的数据集和类中波动。有些类别本身更容易分割,例如房屋、道路,其中大多数模型很容易达到 90 IoU 的结果。其他更具挑战性的类别是树和人,在这些类别上,大多数模型达到大约 60 IoU 的结果。为了衡量这一困难,我们帮助我们的网络集中于单一类别和有限类型的照片。

我们仍然不认为我们的工作是“生产就绪”,因为我们希望它是,但我们认为这是一个很好的时间停下来讨论我们的结果,因为大约 50%的照片会给出好的结果。

下面是一些很好的例子,让你感受一下应用程序的功能:

Image, Ground truth, our result (from our test set)

调试和日志记录

训练神经网络的一个非常重要的部分是调试。在开始我们的工作时,很容易就进入正题,获取数据和网络,开始培训,看看会有什么结果。然而,我们发现跟踪每一步非常重要,为我们自己制造工具,以便能够检查每一步的结果。

以下是常见的挑战,以及我们所采取的应对措施:

  1. 早期问题 —模型可能没有训练。这可能是因为一些固有的问题,或者是因为某种预处理错误,比如忘记对一些数据块进行规范化。无论如何,简单的可视化结果可能会很有帮助。这里有一个关于这个主题的好帖子。
  2. 调试网络本身 —确保没有关键问题后,训练开始,使用预定义的损耗和指标。在分段中,主要的度量是IoU——交集超过并集。我们花了几节课才开始使用 IoU 作为我们模型的主要衡量标准(而不是交叉熵损失)。另一个有用的实践是显示我们的模型在每个时期的一些预测。这里有一个关于调试机器学习模型的好帖子。请注意,IoU 不是 keras 中的标准度量/损失,但您可以在网上轻松找到它,例如这里的。我们也使用这个要点来绘制每个时期的损失和一些预测。
  3. 机器学习版本控制 —在训练一个模型的时候,有很多参数,有些很难遵循。我必须说,我们仍然没有找到完美的方法,除了热情地写下我们的配置(和用 keras 回调自动保存最佳模型,见下文)。
  4. ****调试工具——完成上述所有工作后,我们可以在每一步检查我们的工作,但不是无缝的。因此,最重要的步骤是将上述步骤结合在一起,创建一个 Jupyter 笔记本,使我们能够无缝加载每个模型和每个图像,并快速检查其结果。这样,我们可以很容易地看到模型之间的差异,陷阱和其他问题。

下面是通过调整参数和额外训练改进我们模型的一个例子:

对于保存到目前为止具有最佳验证 IoU 的模型:(Keras 提供了一个非常好的回调来使这些事情变得更容易)

callbacks = [keras.callbacks.ModelCheckpoint(hist_model, verbose=1,save_best_only =True, monitor= ’val_IOU_calc_loss’), plot_losses]

除了对可能的代码错误进行正常调试之外,我们还注意到模型错误是“可预测的”,例如“切割”看起来不在通用身体计数器中的身体部分,“咬”大段,不必要的继续延伸身体部分,光线差,质量差,以及许多细节。在添加来自不同数据集的特定影像时,处理了其中的一些警告,但其他警告仍是需要应对的挑战。为了改善下一个版本的结果,我们将在模型的“硬”图像上使用增强。

我们已经在上面提到过这个问题,关于数据集的问题。现在让我们看看我们的模型的一些困难:

  1. 衣服——深色或浅色的衣服有时会被理解为背景
  2. “咬”——其他的好结果,有一些咬在里面

Clothing and bite

3.光照不足的闪电和昏暗在图像中很常见,但在 COCO 数据集中却没有。因此,除了模型处理这些事情的标准难度之外,我们甚至还没有为更难的图像做好准备。这可以通过获取更多的数据以及数据扩充来改善。同时,最好不要在晚上尝试我们的应用程序:)

poor lighting example

进一步的进展选项

继续培训

我们的生产结果是在对我们的训练数据进行大约 300 个时期的训练后得出的。过了这个时期,模型开始过度拟合。我们在离发布很近的时候得到了这些结果,因此我们还没有机会应用数据扩充的基本实践。

在将图像大小调整为 224X224 后,我们对模型进行了训练。使用更多数据和更大图像(COCO 图像的原始大小约为 600X1000)的进一步训练也有望改善结果。

通用报告格式和其他改进

在某些阶段,我们看到我们的结果在边缘有点嘈杂。一个可能使这一点更加精确的模型是通用报告格式。在这篇博文中,作者展示了一个使用 CRF 的略显幼稚的例子。

然而,它对我们的工作不是很有用,也许因为它通常在结果粗糙时有所帮助。

铺垫

即使我们目前的结果,分割是不完美的。头发、精致的衣服、树枝等精细物体永远不会被完美分割,甚至因为地面真实分割不包含这些细微之处。分离这种精细分割的任务被称为抠图,并定义了一个不同的挑战。这里有一个艺术抠图的例子,在今年早些时候的 NVIDIA 会议上发表了

Matting example — the input includes the trimap as well

抠图任务不同于其他与图像相关的任务,因为它的输入不仅包括图像,还包括三分图—** 图像边缘的轮廓,这使得它成为一个“半监督”问题。**

我们尝试了一点抠图,使用我们的分割作为三分图,但是我们没有达到显著的结果。

另一个问题是缺乏适当的数据集进行训练。

摘要

正如开始所说,我们的目标是建立一个重要的深度学习产品。正如你在 Alon 的帖子中看到的,部署变得越来越容易,越来越快。另一方面,训练一个模型是很棘手的——训练,尤其是在夜间进行的训练,需要仔细的计划、调试和记录结果。

在研究和尝试新事物,以及平凡的训练和提高之间取得平衡也不容易。自从我们使用深度学习以来,我们总是有一种感觉,即最佳模型,或我们需要的确切模型,就在眼前,另一个谷歌搜索或文章将带领我们找到它。但是在实践中,我们的实际改进来自于简单地从我们的原始模型中“挤压”越来越多的东西。如上所述,我们仍然觉得有更多的挤压出来。

总之,我们在做这项工作时获得了很多乐趣,几个月前,这在我们看来就像科幻小说。我们将很高兴讨论和回答任何问题,并期待在我们的网站上看到你:)

E 喜欢这篇文章吗?想要了解更多信息?参观www.shibumi-ai.com

糟糕的空气、病毒和 BI

原文:https://towardsdatascience.com/bad-air-virality-and-bi-9ce211edd256?source=collection_archive---------10-----------------------

来自 19 世纪伦敦的商业智能故事

(这个故事最早出现在 3AG Systems 博客 )

瘴气理论——认为疾病是由“不良空气”传播的古老信念——有一点真实性。当人们专注于掩盖臭味而不是改善卫生时,这一理论遇到了限制,正如许多人在 1858 年伦敦大恶臭期间所做的那样。值得庆幸的是,通过仔细的观察和思考,像约翰·斯诺这样受数据驱动的人成功地打破了流行的智慧,正确地确定了水传播疾病的根本原因。

一个现代的对等词是“误传”,当疾病因病毒误传而传播时就会发生。想想这里的反 vaxx 迷因。

我们如何描述发生在公司内部的类似现象?“误解”似乎已经够不祥的了。这实际上只是曲解这个词的一个花哨版本,但却格外庄重。

为什么误解会在组织内部传播?我想是因为它们都包含着一丝真理。他们是可信的。当足够多的人重复同样的误解时,很难有相反的意见。悲哀的是,在一个点头的房间里,孤独的反对者。

那么,公司如何预防病毒性误解呢?一种方法是鼓励不同意见。另一个方法是鼓励思想开放。但是,要建立一个强大的系统,公司需要投资于证据生成工具,这些工具可以尽早消除误解。这意味着投资于商业智能战略、数据挖掘工具、数据报告工具、预测分析,或许最重要的是,投资于数据可视化最佳实践,以确保人们能够正确解读呈现给他们的证据。

对公司的最终衡量是基于它们正确识别情况并做出适当反应的能力。拥有适当的工具来确保大众的智慧不仅仅是经常重复的误解似乎是明智的。

特别感谢 Nat Gyenesan 和 Xiao Mina 在《大西洋月刊》上发表的文章误导如何传播疾病

做出数据驱动的决策。在 3AG Systems,我们通过将数据转化为可操作的见解来帮助企业改进。 了解更多

一言以蔽之,视觉词汇包

原文:https://towardsdatascience.com/bag-of-visual-words-in-a-nutshell-9ceea97ce0fb?source=collection_archive---------2-----------------------

选择重要特征的艺术

Bag-of-visual-words (BOVW)

视觉单词包是图像分类中常用的方法。它的概念改编自信息检索和 NLP 的单词袋(BOW)。在 bag of words (BOW)中,我们统计每个词在一个文档中出现的次数,用每个词出现的频率来知道文档的关键词,并从中做出一个频率直方图。我们将文档视为一个单词包(BOW)。我们在视觉单词包(BOVW)中有相同的概念,但是我们用图像特征代替单词作为“单词”。图像特征是我们可以在图像中找到的独特模式。

Keywords in documents

什么是视觉单词包(BOVW)?

视觉单词包(BOVW)的基本思想是将图像表示为一组特征。特征由关键点和描述符组成。关键点是图像中“突出”的点,因此无论图像被旋转、缩小或扩展,其关键点将始终相同。描述符是对关键点的描述。我们使用关键点和描述符来构建词汇,并将每个图像表示为图像中特征的频率直方图。从频率直方图中,以后,我们可以找到另一个相似的图像或预测该图像的类别。

Histogram of visual words

如何建立一个视觉单词包(BOVW)?

我们检测特征,从数据集中的每个图像中提取描述符,并建立视觉字典。在图像中检测特征和提取描述符可以通过使用特征提取算法(例如,SIFT、KAZE 等)来完成。

Detecting features and extracting descriptor

接下来,我们根据描述符进行聚类(我们可以使用 K-Means、DBSCAN 或其他聚类算法)。每个聚类的中心将被用作视觉词典的词汇表。

Descriptors clustering

最后,对于每幅图像,我们从词汇和词汇在图像中的频率制作频率直方图。那些直方图是我们的视觉单词包(BOVW)。

我有一个图像,我想从数据集中找到另外 20 个类似的图像。我该怎么做呢?

给定另一幅图像(无论是否来自数据集),如前所述,我们检测图像中的特征,从图像中提取描述符,对描述符进行聚类,并构建与先前直方图长度相同的直方图。通过使用来自我们数据集的视觉单词包表示,我们可以计算该图像的最近邻。我们可以通过使用最近邻算法或其他算法来实现。

Image’s histogram

参考:

[## 识别和学习对象类别

荣获 2005 年 ICCV 最佳短期课程奖李菲菲(史丹福),Rob…

people.csail.mit.edu](http://people.csail.mit.edu/torralba/shortCourseRLOC/)

平衡偏差和方差以控制机器学习中的错误

原文:https://towardsdatascience.com/balancing-bias-and-variance-to-control-errors-in-machine-learning-16ced95724db?source=collection_archive---------1-----------------------

在机器学习的世界里,准确性就是一切。 你努力通过调谐和调整参数使你的模型更加精确,但永远无法使它 100%精确。这是关于你的预测/分类 模型的硬道理,它们永远不可能没有错误。在本文中,我将讨论为什么会发生这种情况,以及其他可以减少的错误形式。

假设我们正在观察一个响应变量 Y (定性或定量)和输入变量 X 具有 p 个特征或列(X1,X2…..Xp)并且我们假设它们之间有关系。这种关系可以表示为

Y = f(X) + e

这里,f 是 X1、…、Xp 的某个固定但未知的函数,而 e 是一个随机误差项,它独立于 X,均值为零。在这个公式中,f 表示 X 提供的关于 y 的系统信息。这个关系或 f(X)的估计被称为统计学习。

一般来说,我们无法对 f(X)做出完美的估计,这就产生了一个误差项,称为可约误差。可以通过对 f(X)进行更精确的估计来提高模型的精确度,从而减小可约误差。 但是,即使我们对 f(X)做出 100%准确的估计,我们的模型也不会是无误差的,这就是所谓的不可约误差 (上式中的 e)。

换句话说,不可约误差可以看做是 X 无法提供的关于 Y 的信息 量 e 可能包含对预测 Y 有用的不可测量变量 :由于我们不测量它们,所以 f 无法用它们进行预测。 量 e 也可能包含不可测的变化。 例如,根据药物本身的生产差异或患者当天的总体健康状况,特定患者在特定日期出现不良反应的风险可能有所不同。

每个问题中都存在这样的最终情况,并且它们引入的误差是不可减少的,因为它们通常不存在于训练数据中。我们对此无能为力。我们能做的是减少其他形式的误差,以得到 f(X)的一个接近完美的估计。但是首先让我们来看看机器学习中的其他重要概念,为了更进一步,你需要理解这些概念。

模型复杂性

输入和响应变量之间关系 f(X)的复杂性是从数据集学习时要考虑的一个重要因素。简单的关系很容易解释。例如,线性模型应该是这样的

Y ≈ β0 + β1X1 + β2X2 + …+ βpXp

从这种关系中很容易推断出信息,而且它清楚地说明了特定特征如何影响响应变量。这种模型属于限制模型的范畴,因为它们只能采取特定的形式,在这种情况下是线性的。但是,关系可能比这更复杂,例如它可能是二次的、圆形的等等。这些模型更加灵活,因为它们更紧密地拟合数据点,可以采取不同的形式。通常这种方法会导致更高的精度。但是这种灵活性是以可解释性为代价的,因为复杂的关系更难解释。

选择灵活的模型并不总是保证高精度。发生这种情况是因为我们灵活的统计学习程序过于努力地寻找训练数据中的模式,而 可能拾取了一些只是由随机机会而不是由未知函数 f 的真实属性 引起的模式。这改变了我们对 f(X)的估计,导致模型不太准确。这种现象也被称为过拟合

当推理是目标时,使用简单且相对灵活的统计学习方法有明显的优势。然而,在某些情况下,我们只对预测感兴趣,而对预测模型的可解释性根本不感兴趣。这是我们使用更灵活的方法的时候。

拟合质量

为了量化给定观察的预测响应值接近该观察的真实响应值的程度,回归设置中最常用的度量是均方误差(MSE),

Taken from Wikipedia

顾名思义,它是所有输入的预测值和观测值的误差或差异的均方值。用训练数据计算的称为训练 MSE ,用测试数据计算的称为测试 MSE

对于给定值 x0,预期测试 MSE 总是可以分解为三个基本量之和:f(x0)的方差、f(x0)的平方偏差和误差项 e 的方差,其中,e 是不可约误差,我们之前讨论过。所以,让我们看看更多关于偏差和方差的内容。

偏见

偏差是指用一个简单得多的模型来逼近一个可能极其复杂的现实问题所引入的误差。所以,如果真实的关系是复杂的,并且你试图使用线性回归,那么它无疑会导致对 f(X)的一些偏差。当真实的关系非常复杂时,无论你有多少观察值,如果你使用一个限制性的/简单的算法,都不可能产生一个准确的预测。

差异

方差是指如果我们使用 different 训练数据集来估计 f(X ),您对 f(x)的估计会改变的量。由于训练数据用于检验统计学习方法,different 训练数据集将产生 different 估计。但是理想情况下,对 f(X)的估计在训练集之间不应该变化太大。然而,如果一种方法具有高方差,那么训练数据中的小变化会导致 f(X)中的大变化。

一般规则

当使用试图过于紧密匹配数据点的统计方法时,数据集中的任何变化都将提供不同的估计,这是非常准确的。一般规律是, 当统计方法试图更紧密地匹配数据点或者使用更灵活的方法时,偏倚减少,但方差增加。

Credit : An Introduction to Statistical Learning by Gareth James, Daniela Witten, Trevor Hastie, Robert Tibshirani

在上图中,左侧显示了回归设置中 3 种不同统计方法的图表。黄色的是线性的,而蓝色的是稍微非线性的,绿色的是高度非线性的/灵活的,因为它与数据点太接近了。在右侧,您可以看到这三种方法的 MSE 与灵活性的关系图。红色代表测试 MSE,灰色代表训练 MSE。不确定具有最低训练 MSE 的方法也将具有最低测试 MSE。 这是因为一些方法专门估算 coefficients,以最小化训练 MSE,但它们可能没有低测试 MSE。这个问题可以归结为过度拟合的问题。 如图所示,绿色曲线(最灵活)具有最低的训练 MSE,但不是最低的测试 MSE。让我们更深入地研究一下这个问题。

Credit : ISLR by Gareth James, Daniela Witten, Trevor Hastie, Robert Tibshirani

这是一个图表,显示了特定数据集所选方法灵活性的测试 MSE(红色曲线)、偏差(绿色曲线)和方差(黄色曲线)。最小均方误差点是误差形式偏差和方差的一个有趣的点。它表明随着灵活性的增加,偏差减少的速度比方差增加的速度更快。在某个点之后,偏差不再减少,但是由于过度拟合,方差开始快速增加。

偏差-方差权衡

Credit : An Introduction to Statistical Learning by Gareth James, Daniela Witten, Trevor Hastie, Robert Tibshirani

在上图中,假设目标的中心是一个完美预测正确值的模型。随着我们远离靶心,我们的预测变得越来越糟糕。想象一下,我们可以重复整个模型构建过程,以获得对目标的多次单独命中,这样每个蓝点就代表了基于同一问题的不同数据集的模型的不同实现。它显示代表高低偏差和方差组合的四种不同情况。高偏差是指所有的点都远离靶心,高方差是指所有的点都分散。结合前面的解释,这个例子清楚地说明了偏差和方差之间的区别。

如前所述,为了最小化预期测试误差,我们需要选择一种统计学习方法,同时实现低方差和低偏差。这些值之间总有一个 trade-off,因为很容易获得一个偏差极低但方差很大的方法(例如,通过绘制一条经过每个训练观察的曲线)或一个方差极低但偏差很大的方法(通过在数据上画一条水平线)。挑战在于找到一种方差和方差均较低的方法。

掌握偏差和方差之间的权衡是成为机器学习冠军的必要条件。

在解决机器学习问题时,应该记住这个概念,因为它有助于提高模型的准确性。此外,掌握这些知识有助于你快速决定不同情况下的最佳统计模型。

如果你喜欢这篇文章,一定要点击下面的❤来推荐它,如果你有任何问题,留下评论,我会尽力回答。

为了更加了解机器学习的世界,跟我来。这是最好的办法,等我多写点这样的文章就知道了。

也可以在 Twitter 关注我在@ pra shant _ 1722直接发邮件给我 或者 在 linkedin 上找我。我很乐意收到你的来信。

乡亲们,祝你们有美好的一天:)

推荐系统优化的拦路虎

原文:https://towardsdatascience.com/bandits-for-recommender-system-optimization-1d702662346e?source=collection_archive---------0-----------------------

任何在亚马逊上购物、在 Spotify 上听音乐、或者在网飞上浏览值得狂欢的电视连续剧的人都体验过个性化推荐。公司使用推荐系统来增加客户参与度和收入。这些算法将用户、产品和上下文元数据作为输入,并通过协作基于内容的过滤方法产生个性化的动态内容作为输出。

推荐系统的质量通常通过 A/B 测试实验来衡量。然而,A/B 测试传统上用于测量静态 UI 变体中的转换率(例如,蓝色链接对绿色链接)。这就是为什么我在推荐系统的范围内探索多臂强盗作为 A/B 测试的替代。

我们将从经典的多臂土匪思想实验的概述开始。接下来将通过正式定义和示例对上下文多臂土匪进行讨论。最后,我们将传统的 A/B 测试实验与多臂 bandit 进行比较。

多兵种土匪问题

Source: https://lilianweng.github.io/lil-log/2018/01/23/the-multi-armed-bandit-problem-and-its-solutions.html

多臂土匪问题是从经典贝叶斯概率衍生出来的强化学习的一个例子。这是一个假设的实验,一个赌徒被给了一个有多个分支的老丨虎丨机,每个分支都有自己未知的概率分布。目标是在收集信息的同时按顺序一个接一个地拉动武器,以便在长期内最大化总支出。

更正式的描述假设奖励来自概率分布 a(y|θ),其中 a 表示采取的行动(或手臂运动);y是观察到的奖励,而 θ 是一组通过实验学习的未知参数[6]。多臂土匪问题的重要性在于我们(代理人)无法获得真正的土匪概率分布——所有的学习都是通过试错法和价值估计的方式进行的[7]。这被称为探索-开发权衡,即边学边赚。

背景强盗问题

情境土匪问题是对多臂土匪的一种概括,它通过使行动以环境状态为条件来扩展模型[3]。与经典的多臂 bandit 不同,它解决了在最佳时间为个人用户识别最合适内容的问题[2]。上下文信息可用于通过分类聚类技术根据共享特征对用户进行分组,假设属于相同聚类的用户倾向于具有相似的行为,而位于不同聚类的用户具有显著不同的行为【1】。

以下是上下文多武装匪徒的正式定义:

Source: http://www.hongliangjie.com/2014/04/14/unbiased-offline-evaluation/

一个常见的真实世界上下文强盗的例子是新闻推荐系统。给定一组呈现的新闻文章,奖励由用户的点击行为决定。如果她点击了这篇文章,就会产生 1 英镑的支出,否则为 0 英镑[2]。点击率(CRT)用于确定新闻推荐应用程序中广告的选择和放置。

现在假设奖励由 CTR 结合关于用户的元数据(例如,年龄和性别)来确定,因此推荐可以进一步个性化。以一名 65 岁的女性和一名 18 岁的男性为例,两人都从他们的移动设备上阅读新闻文章。对这两个用户的推荐应该反映他们的对比概况。向 18 岁的男性展示退休计划或成熟女性服装店(例如 Talbots )的广告是没有意义的。

上下文信息还可以包括地理位置、时间、星期几和季节。假设地理位置元数据可通过 18 岁男性的移动设备获得。他离德克萨斯大学奥斯汀分校很近,并通过点击行为表达了对滑板和冲浪商店的兴趣。有了这个关于用户的上下文信息,应用程序应该显示他当前地理位置内的滑板和冲浪商店的广告(例如, Tyler 的)。如果是学期开始,比如说在九月或一月,应该为这个用户生成大学教科书商店(例如,大学合作)的广告,因为他很可能是购买教科书的大学生。

A/B 测试诉多武装匪徒

对于大多数现代互联网公司来说,只要有可以衡量的指标(例如,在一个页面上花费的时间、点击率、销售转化率),几乎总是在幕后进行随机试验,目的是确定一个替代网站设计,提供对默认设计的改进[8]。这个过程和方法通常被称为 A/B 测试。 A/B 检验是统计假设检验的一种形式,使用两个给定的样本 A 和 B,前者为对照,后者为变异体。给定一个默认配置和几个备选方案(例如,网站的配色方案),标准做法是将少量科学家流量转移到这些备选方案的随机试验中,并记录每个备选方案的期望指标[8]。

多臂 bandit 是 A/B 测试的替代方案。当存在差异时,多臂 bandit 方法在寻找最佳臂方面比传统的统计实验更有效,并且其优势随着臂数的增加而增加[6]。直觉上,我们需要给新内容分配更多的流量,以便更快地了解其价值,并减少用户跟踪现有内容的时间变化[2]。以下是 Google Analytics 的高级经济分析师 Steven L. Scott 对多臂土匪实验的好处的讨论:

基于多支武装匪徒的实验通常比基于统计假设检验的“经典”A-B 实验有效得多。它们在统计学上同样有效,而且在许多情况下,它们能更快地给出答案。它们更有效率,因为它们让流量逐渐走向成功的变化,而不是强迫你在实验结束时等待“最终答案”。它们速度更快,因为本来会出现明显较差变异的样本可以分配给潜在的赢家。在高性能变体上收集的额外数据可以帮助更快地将“好”臂与“最好”臂分开。

基本上,土匪让实验更有效率,你可以多尝试。你也可以分配更多的流量给你的实验,因为流量会自动导向性能更好的页面。

现在,让我们来并排比较一下这些竞争测试方法:

Source: https://conductrics.com/balancing-earning-with-learning-bandits-and-adaptive-optimization/

正如您从上面的图中看到的,A/B 测试并不适应整个实验阶段,因为勘探和开发阶段是静态和不同的,而多臂土匪通过同时勘探和开发进行调整。此外,对于多兵种土匪,分配给次等兵种/片的时间和资源更少。相反,在整个实验过程中,流量会逐渐分配给更优化的切片。土匪测试的一大好处是土匪减轻了“遗憾”,这基本上是你在测试中探索潜在的更坏的变化时所经历的转换损失[5]。

有关多武装匪徒的更多信息,请参见以下链接:

一种有效的实时多元优化 bandit 算法

亚马逊如何采用汤普森抽样的多臂强盗方法,在一周内增加 21%的购买量。

https://blog . acolyer . org/2017/09/27/an-efficient-bandit-algorithm-for-real-time-variable-optimization/

商业实用人工智能:强盗算法

Max Pagels 关于 bandit 算法及其实际商业应用的精彩演示。他通过清晰简洁的解释呈现了多种武器的强盗,这些解释比学术白皮书中复杂的论点更容易理解。

https://www . slide share . net/SC5/practical-ai-for-business-bandit-algorithms

使用依赖臂的多臂 Bandit 的在线交互式协同过滤

通过考虑项目间的依赖关系来讨论在线交互式协同过滤问题。

https://arxiv.org/pdf/1708.03058.pdf

时变背景的多武装匪徒

报酬映射函数随时间变化的时变上下文多臂强盗问题的研究。

https://users.cs.fiu.edu/~taoli/pub/p2025-zeng.pdf

参考

[1]李,卡拉佐格鲁,和詹蒂莱。协同过滤土匪。https://arxiv.org/pdf/1502.03473.pdf

[2]李、朗福姆和沙皮雷。个性化新闻文章推荐的上下文相关方法。https://www.cs.princeton.edu/~schapire/papers/www10.pdf

[3]保罗·苏尔梅诺克。情境强盗和强化学习——走向数据科学。https://towards data science . com/contextual-bottoms-and-reinforcement-learning-6bdfeaece 72 a

[4]史蒂文·斯科特。多臂强盗实验。【https://support.google.com/analytics/answer/2844870?hl=en

[5]亚历克斯·伯基特。A/B 测试精通:从初学者到专家。【https://conversionxl.com/blog/ab-testing-guide/

[6]史蒂文·斯科特。在线服务经济中的多股武装匪徒。https://static . Google user content . com/media/research . Google . com/en//pubs/archive/42550 . pdf

[7]王,安森。解决多臂强盗问题。https://towards data science . com/solutioning-the-multi-armed-bandit-problem-b 72 de 40 db 97 c

[8]杨、拉姆达斯、贾米森和温赖特。具有在线 FDR 控制的多 A(rmed)/B(andit)测试框架。https://arxiv.org/pdf/1706.05378.pdf

争取你(竞争对手)的钱

原文:https://towardsdatascience.com/bang-for-your-competitor-s-buck-c4d318d275f7?source=collection_archive---------3-----------------------

Image from pexels.com

2014 年 12 月 23 日,iOS 游戏 The Room Two 的开发者醒来时发现了一些不可思议的巨额销售。事实上,至少比上个月的任何一天都要大。他们收到了 52 条评论,是前一周平均水平的两倍多。而且不止于此。在接下来的两周,第二会议室平均每天收到 60 条评论,几乎是 12 月 23 日之前一个月每天平均评论的三倍。这是圣诞奇迹吗?不知何故。事情是这样的:12 月 23 日,苹果在 AppStore 的首页打出了一条横幅,宣传包括每款 99 美分的“神奇应用&游戏”在内的促销活动。房间二是而不是特色应用之一。事实上,第二房间的竞争者狮子座的财富之一也在其中。狮子座的财富价格降低了 75%至 99c。

Daily Review Volume for The Room Two mobile app. The dotted line represents that day the Leo’s Fortune went on 75% sale

是的,不仅竞争对手降价,苹果公司也大力促销。然而,不知何故,这帮助了房间二。

那么为什么会出现这种情况呢?苹果的 AppStore 就像今天的许多商店一样,根据用户的浏览和购买行为向他们推荐产品。与亚马逊在其产品页面中的“购买了该商品的顾客也购买了”部分非常相似,苹果在许多 iOS 应用程序的页面上都有“顾客也购买了”部分。这些推荐是由机器学习算法产生的,这些算法读取用户的观看/购买行为,并试图理解相关性:亚马逊知道经常购买这顶帽子的用户也会购买那些手套,网飞知道经常喜欢这个节目的用户也会观看另一个节目。而且苹果知道经常浏览/购买《狮子座的财富》的用户也浏览/购买了《房间二》。

再次关注苹果 AppStore 的具体设置,我们可以想象应用程序页面之间的这些联系会影响用户在应用程序之间的“行走”:如果我在愤怒的小鸟和水果忍者的页面上,我有可能会点击水果忍者图标并进入他们的页面。诸如此类。可以想象愤怒的小鸟页面访问量的突然增加或减少会对水果忍者页面的访问量产生实质性的影响。

作为我在西北大学博士论文的一部分,我收集并分析了 4 次大型 iOS 促销活动的数据,并获得了许多有趣的见解。在这篇文章中,我将集中讨论一个问题。我的问题很简单:一个应用页面访问量的突然增加如何影响该应用类似应用的访问量,即“顾客也购买了”栏目下的应用。

我发现了一个有趣的二分法。首先,我发现,当被推广的应用程序将其价格降至免费(即使其原价仅为 99 美分)时,其竞争对手的销售额大幅下降。这里有一个原因的解释:当一个用户看到一个点击免费的东西时,没有什么可失去的。而且没有理由看得更远。

事情变得非常有趣了。当被推广的应用程序降价 3 美元或 9 美元时(记住这是 AppStore,中间价格是 0!)他们的竞争对手看到他们的销售额有了的增长。当用户看到一个在售但仍不免费的应用程序时,他们会有动力在做出承诺前进一步探索。除了查看页面上的其他应用程序,还有什么更好的探索方式呢?

总的来说,当一束假设的强光照射在一款免费应用上时,竞争对手的页面会变得更暗。但是当聚光灯照在一个 99 美分的应用上时(即使总的绝对折扣更大),竞争对手不可避免地会偷走一些光。

那么这对开发者意味着什么呢?

开发者,你需要意识到你的“邻居”和他们的行为。你的营销活动应该考虑到你的竞争对手在做什么,并实时做出反应。你应该意识到你的营销活动也能让他们受益。另一方面,如果奥普拉把你的一个竞争对手放在她的“银河中最喜欢的东西”列表中,不要失去所有的希望。只要竞争对手不是免费的,这也能促进你的销售。

这对苹果意味着什么?

苹果的激励措施之一是通过不断向用户提供优秀的创新应用来尽可能地让他们开心。但是 AppStore 有超过 150 万个应用程序,因此没有一个用户会去探索哪怕是整个系列中的一小部分。这正是这些推荐系统诞生的初衷:帮助用户发现和浏览新内容。

不可避免的是,任何这样的大型系统都会将大部分成功集中在少数几个应用程序上。随着成功的应用程序变得越来越成功,富人变得越来越富的效应也会出现一些变化。

我们的发现可以为苹果(以及任何其他集中式市场)提供另一种方式,以某种方式“推动”成功的分布:通过巧妙地决定如何填充“顾客也购买了”部分。例如,如果一款应用获得了广泛的成功,将它放在更少的付费应用的“顾客也购买了”部分是一个好主意,这样就可以为其他不太成功但同样出色的应用腾出位置。

超越苹果和移动应用

产生这篇文章的数据是特定于苹果的应用商店的,但是洞察力不是。类似的效果发生在所有类型的具有这种推荐算法的平台上。任何类型的卖家都应该意识到他们的营销活动会以意想不到的(有时是积极的)方式影响他们的竞争对手。对他们来说,集中式市场可以利用这些见解更好地在他们平台的卖家中分配焦点,并进一步帮助他们的客户发现优秀的内容。

感谢阅读!

这篇文章最初写于 2016 年,当时约尔戈斯还是一名博士生,从事在线消费者评论的研究。

依靠事实——专家意见有什么价值?

原文:https://towardsdatascience.com/banking-on-the-facts-54ea1704c270?source=collection_archive---------4-----------------------

Maptive

几年前,当我开始下一项任务时,我接待了三位新同事的来访。我很惊讶地听到第一个人承认“在这里你必须学会的第一件事是,每个人都在所有事情上撒谎”。第二个来访者不再令人鼓舞地证明只有她一个人说了实话。第三个来访者——正如他们在法语中所说的“没有三个人的两个人”——试图让我“放心”,如果前两个人说实话,他们会被闪电击中。在一个虚伪的世界里,人们要么永远诚实,要么永远虚伪,我的三个来访者中,哪一个值得相信?【我】

在一个越来越以假新闻和另类事实为标志的后真相世界里,这个故事在我的脑海中依然清晰可见。尽管同事们公然歪曲数据的情况非常罕见,但区分事实和虚构绝非易事。当今管理面临的复杂问题挑战了真理的单一版本的概念。这些挑战使得选择最佳行动方案变得更有价值,无论是在鉴定业务的“无形资产”、提高管理效率还是衡量客户满意度方面。征求专家的意见并不能解决很多问题,因为他们通常更愿意回忆过去,而不是规划未来。如果经理的工作是根据事实做出决定,他或她怎么能指望专家的建议呢?

为什么如此多的专家,即使是真诚的,也只能提供可怜的建议?风险、不确定性和模糊性等不利因素通常会阻碍专家客观评估新挑战的能力。依赖“机器学习”并不能解决问题——对于许多关键变量,每个算法都依赖于这些专家的主观估计。他们的建议意见很少因为他们对这些模型的信任而调整——他们计算客观概率,而不考虑他们自己的偏见、怀疑和对手头问题的理解。Julia Galef 将这种倾向称为“动机推理”,专家(像大多数其他人一样)倾向于优先考虑与他们自己的精神状态相对应的数据。【ii】套用幽默作家乔希·比林斯的话“问题不在于你的专家们知道什么,而在于他们如何确定事实并非如此”。【iii】

无需求助于昂贵且耗时的“大数据”和“人工神经网络”,可以使用几种相对简单的方法来证实并最终校准专家的观察能力。正如道格·哈伯德(Doug Hubbard)所建议的,将适当的方法应用于非常小的样本可以大大减少不确定性的来源。他提倡“五法则”,即评估一个分布的五个随机估计值提供了 93 . 5%的置信指数,即它的中值在最低和最高估计值之间。类似地,捕获/再捕获方法基于超几何分布有效地估计大种群的规模。【VI】定点取样提供了另一种选择,它随着时间的推移随机拍摄现象的快照,而不是不断地跟踪它们。最后,通过简单地识别随机的一组观察值,然后与该组一起采样,聚类采样产生了令人惊讶的好结果。【VII】

本文开头的谜语是“骑士和无赖”谜题的一个应用,我们假设骑士永远不会说谎,而无赖永远不会说真话。因为陈述是矛盾的,在测试假设时,只有第二个来访者内心是真实的。在商业中,背景和解决方案都更加复杂,因为事实和虚构之间的界限往往很模糊。学会利用手头的数据来支持或配合每个专家的观点可以帮助我们减少专家自身认知偏差的影响。提高决策能力是商业分析学院、暑期学校和大师班的核心。提高自己的决策能力只需点击一下鼠标。

Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析学院的负责人。 他的领英简介可以在【www.linkedin.com/in/leeschlenker.】查看 你可以在https://twitter.com/DSign4Analytics关注我们的推特


【I】改编自 Smullyan,R. (1978)。这本书叫什么名字?。普伦蒂斯霍尔

【ii】Galef,J. (2016),人类擅长辩论,却不擅长推理。Heleo 对话

【三世】比尔盖茨,J. (1874)。智慧和幽默的百科全书和谚语哲学

贝叶斯定理将在另一篇文章中展开。

Hubbard,D. (2014),如何衡量任何事物:寻找商业中“无形资产”的价值

【VI】【马】d .(2010)捕获/再捕获方法,概率统计博客

【VII】统计技术。(2017),什么是整群抽样?

神经网络

原文:https://towardsdatascience.com/basic-concepts-of-neural-networks-1a18a7aa2bd2?source=collection_archive---------4-----------------------

初学者的基本概念

torres.ai

同样,当你开始用一种新语言编程时,有一个用 Hello World print 做这件事的传统,在深度学习中,你首先要创建一个手写数字的识别模型。通过这个例子,这篇文章将介绍神经网络的一些基本概念,尽可能减少理论概念,目的是为读者提供一个特定案例的全局视图,以方便阅读后续文章,其中该领域的不同主题将得到更详细的处理。

研究案例:数字识别

在这一节中,我们将介绍我们将用于第一个神经网络示例的数据:MNIST 数据集,它包含手写数字的图像。

MNIST 数据集可以从MNIST 数据库页面【1】下载,由手工制作的数字图像组成。该数据集包含用于训练模型的 60,000 个元素和用于测试模型的 10,000 个附加元素,并且对于第一次进入模式识别技术来说是理想的,而不必花费大量时间预处理和格式化数据,这在数据分析中是非常重要和昂贵的步骤,并且在处理图像时具有特殊的复杂性;这个数据集只需要很小的改动,我们将在下面进行评论。

这个黑白图像数据集已被归一化为 20×20 像素,同时保留了它们的纵横比。在这种情况下,重要的是要注意图像包含灰度级,这是归一化算法中使用的反走样【2】技术的结果(将所有图像的分辨率降低到较低的分辨率)。随后,图像以 28×28 像素为中心,计算这些像素的质心并移动图像,以便将该点定位在 28×28 视场的中心。这些图像具有以下样式:

Pixel images of handwritten texts (From: MNIST For ML Beginners, tensorflow.org)

此外,数据集对每张图像都有一个标签,表明它代表哪个数字,因此是一种监督学习,我们将在本章中讨论。

该输入图像用矩阵表示,每个 28×28 像素的亮度值在[0,255]之间。例如,此图像(训练集的第八个图像)

用这个 28×28 点的矩阵来表示(读者可以在本章的笔记本上查一下):

另一方面,记住我们有标签,在我们的例子中是 0 到 9 之间的数字,表示图像代表哪个数字,也就是说,它与哪个类相关联。在这个例子中,我们将用 10 个位置的向量来表示每个标签,其中对应于表示图像的数字的位置包含 1,其余的包含 0。这个将标签转换成与不同标签的数量一样多的零的向量,并将 1 放入对应于标签的索引中的过程被称为独热编码

感知器

在继续之前,对单个神经元如何工作以实现其从训练数据集学习的目的的简单直观的解释可能对读者有所帮助。让我们看一个非常简单的例子来说明人工神经元如何学习。

回归算法

基于上一章已经解释的内容,让我们对经典的机器学习回归和分类算法做一个简单的提醒,因为它们是我们深度学习解释的起点。

我们可以说,回归算法使用误差测量值损失对不同输入变量(特征)之间的关系进行建模,这将在迭代过程中被最小化,以便“尽可能准确地”做出预测。我们将讨论两种类型:逻辑回归和线性回归。

逻辑回归和线性回归的主要区别在于模型的输出类型;当我们的输出是离散的时,我们谈论逻辑回归,当输出是连续的时,我们谈论线性回归。

根据第一章中介绍的定义,逻辑回归是一种监督学习算法,用于分类。我们接下来将使用的示例是一个二元分类,它通过分配 0 或 1 类型的离散值来识别每个输入示例属于哪个类。

普通的人工神经元

为了展示基本神经元是怎样的,让我们假设一个简单的例子,其中我们在二维平面中有一组点,并且每个点已经被标记为“正方形”或“圆形”:

给定一个新的点“ X ,我们想知道它对应的标签是什么:

一种常见的方法是画一条线将两个组分开,并使用这条线作为分类器:

在这种情况下,输入数据将由( x1,x2 )形式的向量表示,这些向量表示它们在这个二维空间中的坐标,我们的函数将返回‘0’或‘1’(在线的上方或下方),以知道它应该被分类为“正方形”还是“圆形”。正如我们已经看到的,这是一个线性回归的例子,其中遵循第 1 章给出的符号的“线”(分类器)可以定义为:

更一般地说,我们可以将这条线表示为:

为了对输入元素 X 进行分类,在我们的例子中输入元素 X 是二维的,我们必须学习与输入向量维数相同的权重向量 W,即向量( w1,w2 )和 b 偏差。

有了这些计算值,我们现在可以构建一个人工神经元来对新元素 X 进行分类。基本上,神经元将计算出的权重的向量 W 应用于输入元素 X 的每个维度中的值,并在最后添加偏差 b. 其结果将通过非线性“激活”函数来产生结果“0”或“1”。我们刚刚定义的这种人工神经元的功能可以用更正式的方式来表达,例如:

现在,我们将需要一个函数来对变量 z 进行转换,使其变为‘0’或‘1’。虽然有几个函数(我们将在第 4 章中称之为“激活函数”),但在本例中,我们将使用一个被称为sigmoid【3】的函数,该函数针对任何输入值返回 0 到 1 之间的实际输出值:

如果我们分析前面的公式,我们可以看到它总是倾向于给出接近 0 或 1 的值。如果输入 z 相当大且为正,则负 z 处的“e”为零,因此 y 取值为 1。如果 z 具有大的负值,那么对于“e”的大正数,公式的分母将是一个大的数字,因此 y 的值将接近 0。从图形上看,sigmoid 函数呈现如下形式:

到目前为止,我们已经介绍了如何定义人工神经元,这是神经网络可以拥有的最简单的架构。具体来说,这种架构在本主题的文献中被命名为感知器【4】(也称为线性阈值单元 (LTU)),由 Frank Rosenblatt 于 1957 年发明,并在视觉上概括为以下方案:

最后,让我帮助读者直观地了解这个神经元如何从我们已经标记为“正方形”或“圆形”的输入数据中学习权重 W 和偏差 b (在第 4 章中,我们将介绍如何以更正式的方式完成这个过程)。

对于所有已知的带标签的输入示例,这是一个迭代过程,将通过模型估计的标签值与每个元素的标签期望值进行比较。在每次迭代之后,以这样的方式调整参数值,即随着我们以最小化上述损失函数为目标继续迭代,所获得的误差变得越来越小。下面的方案希望以一种通用的方式直观地总结一个感知器的学习过程:

多层感知器

但是在继续讨论这个例子之前,我们将简要介绍当神经网络是由我们刚刚介绍过的感知器构造而成时,它们通常采用的形式。

在该领域的文献中,当我们发现神经网络具有一个输入层,一个或多个由感知器组成的层,称为隐藏层,以及具有几个感知器的最后一层,称为输出层时,我们称之为多层感知器(MLP)。一般来说,当基于神经网络的模型由多个隐藏层组成时,我们称为深度学习。在视觉上,它可以用以下方案来表示:

MLP 通常用于分类,特别是当类别是排他性的时,如在数字图像分类的情况下(从 0 到 9 的类别)。在这种情况下,由于一个名为 softmax 的函数,输出图层返回属于每个类的概率。视觉上,我们可以用以下方式表示它:

正如我们将在第四章介绍的,除了 sigmoid 之外,还有几个激活函数,每个都有不同的属性。其中之一就是我们刚刚提到的那个 softmax 激活函数【5】,它将有助于呈现一个简单的神经网络的示例,以在两个以上的类中进行分类。目前,我们可以将 softmax 函数视为 sigmoid 函数的推广,它允许我们对两个以上的类进行分类。

Softmax 激活功能

我们将以这样的方式来解决这个问题:给定一个输入图像,我们将获得它是 10 个可能数字中的每一个的概率。这样,我们将有一个模型,例如,可以预测图像中的 9,但只有 80%的把握是 9。由于这张图片中数字底部的笔画,它似乎有 5%的几率成为 8,甚至有一定的概率成为任何其他数字。虽然在这种特殊情况下,我们会认为我们的模型的预测是 9,因为它是概率最高的一个,但这种使用概率分布的方法可以让我们更好地了解我们对预测的信心程度。这在这种情况下很好,因为数字是手工制作的,当然在很多情况下,我们不能 100%确定地识别数字。

因此,对于这个 MNIST 分类的例子,我们将为每个输入例子获得一个输出向量,该输出向量具有在一组互斥标签上的概率分布。也就是说,10 个概率的向量(每个概率对应于一个数字)以及所有这 10 个概率的总和导致值 1(概率将在 0 和 1 之间表示)。

正如我们已经提出的,这是通过在我们的具有 softmax 激活函数的神经网络中使用输出层来实现的,其中该 softmax 层中的每个神经元依赖于该层中所有其他神经元的输出,因为所有这些神经元的输出之和必须是 1。

但是 softmax 激活功能是如何工作的呢?softmax 函数基于计算特定图像属于特定类别的“证据”,然后将这些证据转换为它属于每个可能类别的概率。

一种测量某一图像属于特定类别的证据的方法是对属于该类别的每个像素的证据进行加权求和。为了解释这个想法,我将使用一个可视化的例子。

假设我们已经学习了数字 0 的模型(我们将在后面看到这些模型是如何学习的)。目前,我们可以把模型看作是“某种东西”,它包含了知道一个数是否属于某一类的信息。在这种情况下,对于数字 0,假设我们有一个如下所示的模型:

Source: Tensorflow tutorial[6])

在这种情况下,对于 28×28 像素的矩阵,其中红色像素(在书的白/黑版本中是最浅的灰色)表示负权重(即,减少其所属的证据),而蓝色像素(在书的黑/白版本中是最深的灰色)表示正权重(其证据是更大的增加)。黑色代表中性值。

假设我们在上面画了一个零。一般来说,零点的轨迹会落在蓝色区域(请记住,我们讨论的是归一化为 20×20 像素的图像,后来以 28×28 的图像为中心)。很明显,如果我们的笔画越过红色区域,很可能我们写的不是零;因此,使用基于如果我们通过蓝色区域则相加,如果我们通过红色区域则相减的度量标准似乎是合理的。

为了确认它是一个好的度量,现在让我们想象我们画了一个三;很明显,我们用于零的前一个模型中心的红色区域会影响前面提到的指标,因为,正如我们在该图的左部看到的,当写 3 时,我们忽略了:

Source: Tensorflow tutorial[6])

但另一方面,如果参考模型是对应于数字 3 的模型,如上图右侧所示,我们可以看到,一般来说,代表数字 3 的不同可能走线大多位于蓝色区域。

我希望读者看到这个直观的例子后,已经直觉地知道上面提到的权重的近似值是如何让我们估计出它是多少的。

Source: Tensorflow tutorial[6])

上图显示了为这十个 MNIST 类中的每一个学习的具体模型示例的权重。请记住,在这个视觉表示中,我们选择了红色(黑白图书版中的浅灰色)来表示负权重,而我们将使用蓝色来表示正权重。

一旦属于 10 个类别中的每一个的证据被计算出来,这些必须被转换成概率,其所有成分的总和加 1。为此,softmax 使用计算证据的指数值,然后将它们归一化,使总和等于 1,形成概率分布。属于类别 i 的概率为:

直观地说,使用指数得到的效果是,多一个单位的证据具有乘数效应,少一个单位的证据具有反效应。关于这个函数有趣的事情是,一个好的预测在向量中有一个接近 1 的值,而其余的值接近 0。在弱预测中,将有几个可能的标签,它们将具有或多或少相同的概率。

参考文献

【1】MNIST 手写数字数据库。[en línea]。可在:http://yann.lecun.com/exdb/mnist【咨询日期:2017 年 2 月 24 日】。

【2】维基百科,(2016)。抗锯齿。可用地点:【https://es.wikipedia.org/wiki/Antialiasing【访问时间:2016 年 9 月 1 日】。

【3】维基百科,(2018)。乙状结肠函数。可用时间:https://en.wikipedia.org/wiki/Sigmoid_function【访问时间:2018 年 2 月 3 日】。

【4】维基百科(2018)。感知器。可在https://en.wikipedia.org/wiki/Perceptron获得【2018 年 12 月 22 日访问】

【5】维基百科,(2018)。Softmax 函数[en línea]。可用地点:https://en.wikipedia.org/wiki/Softmax_function【访问时间:2018 年 2 月 22 日】。

【6】tensor flow,(2016)教程 MNIST 初学者。[en línea]。可在:https://www . tensor flow . org/versions/r 0.12/tutorials/mnist/初学者/ 【访问时间:2018 年 16 月 2 日】。

原载于 2018 年 9 月 16 日Torres . ai

[基础数据清理/工程会议] Twitter 情绪数据

原文:https://towardsdatascience.com/basic-data-cleaning-engineering-session-twitter-sentiment-data-95e5bd2869ec?source=collection_archive---------3-----------------------

Gif from this website

所以这篇文章只是让我练习一些基本的数据清理/工程操作,我希望这篇文章能够帮助其他人。

请注意,这篇文章是为了我将来回顾数据清理/工程 方法,而不是重新研究。

推特 Kaggle 数据集

Image from this website

我将使用 Kaggle 的 Twitter 情绪分析数据。该数据包含 8.7 MB 的(训练)文本数据,这些数据是从 Twitter 中提取的,没有经过预处理。

原始文本数据的第一视图

如上所述,我们可以直接注意到数据中包含了大量的停用词和一些俚语(如 bf → Boy Friend ),需要替换或完全删除。

步骤 0)将数据读入 Panda 数据帧和基本审查

如上所示,当我们打印一些关于数据的基本信息时。我们可以马上注意到每行是如何用 int64 或 Object(对于 TextData)表示的。最后,当我们绘制情感数据的直方图时,我们可以知道正面例子比负面例子多。(1 表示积极情绪,而 0 表示消极情绪。)

步骤 1)清除停止字【清洗】

为了更快地执行,我将只使用前 5 行来清理示例数据,如上所示,当我们删除所有的停用词(如 is、so 等)时。)句子变得更干净了。

一个例子是“我的天已经 7:30 了”→“我的天已经 7:30 了”

步骤 2)替换缩写和一些拼写更正【清理】

借用这篇博客文章中的代码,我们将把一些俚语替换成更合适的单词,并做一些拼写纠正。我们可以注意到,一些社交媒体俚语已经变成了完整的词,如“哦,我的上帝”或“男朋友”。

一个例子是“OMG 已经 7:30 了”→“天哪已经 7:30 了”

步骤 3)词干化【新功能】

词干化是将屈折词(或有时是派生词)简化为词干、词根或词根形式的过程。如上所述,这个词已经变成了“已经”,以及“欺骗”。如果你想了解更多关于这些话题的信息,请点击这里阅读我对 30 个数据科学家问题的看法。

步骤 4)词汇化【新功能】

词汇化是将一个单词的词尾变化形式组合在一起的过程,因此它们可以作为一个单独的项目进行分析,通过单词的词汇或词典形式进行识别。这个过程与词干提取非常相似,但是我们可以注意到的一个区别是,单词没有变成 already。如果您希望了解有关这些主题的更多信息,请单击此处阅读我对 30 个数据科学家问题的看法。

步骤 5)词性标注(POS)【新功能】

词性标注是语法标注词类消歧,是根据定义和上下文将文本(语料库)中的单词标记为对应于特定词性的过程。如上所述,我们已经将句子中的每个单词标记为动词、名词或代词等。

步骤 6)大写

最后,我只是想尝试一下,因为大写被认为是 NLP 中的降维技术,因为它减少了表示原始文本所需的字符。(将所有字符转换成小写具有相同的效果。)

互动码

对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问这篇文章中使用的代码,请点击这里。

最后的话

我目前正在学习更多关于 NLP 环境下的数据清理和工程的知识,这是练习我的技能的好方法。但下一次我希望创造更复杂的功能。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请点击这里查看我的网站。

同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 pos t。

参考

  1. 推特情绪分析| Kaggle。(2018).Kaggle.com。检索于 2018 年 5 月 27 日,来自https://www . ka ggle . com/c/Twitter-情操-分析 2 #评价
  2. UnicodeDecodeError,i. (2018)。UnicodeDecodeError,无效的延续字节。堆栈溢出。检索于 2018 年 5 月 27 日,来自https://stack overflow . com/questions/5552555/unicode decodedeerror-invalid-continuation-byte
  3. dataframe,P. (2018 年)。Python 删除了熊猫数据帧中的停用词。堆栈溢出。检索于 2018 年 5 月 27 日,来自https://stack overflow . com/questions/29523254/python-remove-stop-words-from-pandas-data frame
  4. python,H. (2018)。如何使用 nltk 或 python 删除停用词?堆栈溢出。检索于 2018 年 5 月 27 日,来自https://stack overflow . com/questions/5486337/how-to-remove-stop-words-using-nltk-or-python
  5. 熊猫?,H. (2018)。如何应对熊猫中设置 SettingWithCopyWarning?。堆栈溢出。检索于 2018 年 5 月 27 日,来自https://stack overflow . com/questions/20625582/how-to-deal-withcopywarning-in-pandas
  6. 城市词典:APL。(2018).都市词典。检索于 2018 年 5 月 28 日,来自https://www.urbandictionary.com/define.php?term=APL
  7. dataframe,P. (2018 年)。Python 删除了熊猫数据帧中的停用词。堆栈溢出。检索于 2018 年 5 月 28 日,来自https://stack overflow . com/questions/29523254/python-remove-stop-words-from-pandas-data frame
  8. Python 脚本将文本/消息缩写转化为实际短语。(2017).中等。检索于 2018 年 5 月 28 日,来自https://medium . com/nerd-stuff/python-script-to-turn-text-message-abstracts-into-actual-phrases-d5db 6 f 489222
  9. '数据',N. (2018)。NLTK-attribute 错误:模块“NLTK”没有属性“data”。堆栈溢出。检索于 2018 年 5 月 28 日,来自https://stack overflow . com/questions/45786059/nltk-attribute error-module-nltk-has-no-attribute-data
  10. Python?,W. (2018)。Python 中最好的词干法是什么?。堆栈溢出。检索于 2018 年 5 月 28 日,来自https://stack overflow . com/questions/24647400/what-is-the-best-stemming-method-in-python
  11. Stemmers。(2018).Nltk.org。检索于 2018 年 5 月 28 日,来自http://www.nltk.org/howto/stem.html
  12. 自然语言机器学习中的预处理。(2017).走向数据科学。检索于 2018 年 5 月 28 日,来自https://towardsdatascience . com/pre-processing-in-natural language-machine-learning-898 a 84 b 8 BD 47
  13. 引理化?,H. (2018)。我如何做词干或词汇化?。堆栈溢出。检索于 2018 年 5 月 28 日,来自https://stack overflow . com/questions/771918/how-do-I-do-word-stemming-or-lemmatization
  14. 大写,H. (2018)。如何将一个字符串变成大写?堆栈溢出。检索于 2018 年 5 月 28 日,来自https://stack overflow . com/questions/9257094/how-to-change-a-string-to-upper case
  15. TypeError:序列项 0:应为字符串 i. (2018)。TypeError:序列项 0:预期的字符串,找到的是 int。堆栈溢出。检索于 2018 年 5 月 28 日,来自https://stack overflow . com/questions/10880813/type error-sequence-item-0-expected-string-int-found
  16. 下载?,W. (2018)。NLTK POS tagger 让我下载的是什么?。堆栈溢出。检索于 2018 年 5 月 28 日,来自https://stack overflow . com/questions/8590370/what-is-nltk-pos-tagger-questing-me-download
  17. 堵塞。(2018).En.wikipedia.org。检索于 2018 年 5 月 28 日,来自 https://en.wikipedia.org/wiki/Stemming
  18. 我用 30 个问题来测试一个数据科学家在自然语言处理方面的交互能力。(2018).中等。检索于 2018 年 5 月 28 日,来自https://medium . com/@ SeoJaeDuk/my-take-on-30-questions-to-test-a-data-scientist-on-natural-language-processing-with-interactive-5b 3454 a 196 ef
  19. 词性标注。(2018).En.wikipedia.org。检索于 2018 年 5 月 28 日,来自https://en.wikipedia.org/wiki/Part-of-speech_tagging
  20. 引理满足。(2018).En.wikipedia.org。检索于 2018 年 5 月 28 日,来自https://en.wikipedia.org/wiki/Lemmatisation
  21. 我用 30 个问题来测试一个数据科学家在自然语言处理方面的交互能力。(2018).中等。检索于 2018 年 5 月 28 日,来自https://medium . com/@ SeoJaeDuk/my-take-on-30-questions-to-test-a-data-scientist-on-natural-language-processing-with-interactive-5b 3454 a 196 ef

基础医疗数据探索/可视化——心脏病

原文:https://towardsdatascience.com/basic-medical-data-exploration-visualization-heart-diseases-6ab12bc0a8b7?source=collection_archive---------6-----------------------

GIF from this website

今天,我想再次练习我的数据探索技能,我想在这个 心脏病数据集 上练习。

请注意,这篇帖子是为了我未来的自己回顾和回顾数据探索的基本技术。

数据集

Image from this website

这个数据集包含 302 个患者数据,每个数据有 75 个属性,但是我们只使用其中的 14 个,如下图所示。

如果有人对每个属性的确切含义感兴趣,请看看下面的屏幕截图。

Image from this website

数据集概述/清理/查看

红框 →数据类型对象

像往常一样,让我们从简单的开始,看看一般的平均值,标准差和其他东西。很快,我们可以认识到我们的一些数据是在对象类型中。

然而,我们也可以观察到没有空变量的事实。

在进行简单的清理后,将非数字值更改为 NaN 并用 0 替换 NaN。我们现在可以有把握地说,我们的数据有些干净。

前/后 10 行

同样,为了更好地理解数据,让我们检查第一/最后几行。如上所述,没有什么太不寻常的。

数据直方图

通过简单的数据直方图,我们可以很容易地观察到不同属性的分布。这里需要注意的一点是,我们很容易看出哪些属性是分类值,哪些不是。

为了更仔细地观察,让我们来看看年龄和空腹血糖的分布。我们可以看到,年龄分布非常类似于高斯分布,而 fbs 是一个分类值。

方差-协方差矩阵

上面看到的所有图像都是方差-协方差矩阵,然而不同的是,对于最左边的一个,我使用 Numpy 手动计算。中间的那个我用了 Tensorflow,最后右边的那个我用了内置的数据框函数。而且我们可以观察到,大多数属性并没有很强的协变关系。

相关矩阵

同样,左边的图像是通过手动 numpy 计算创建的,我们可以观察到,在这些属性中,实际上彼此之间有很强的相关性。(尤其是心脏病和 thal)

交互式直方图

现在我知道这是多余的,但我想包括,因为有一个互动的部分。👌 👌

柱状图/箱线图/对线图

让我们先来看看心脏病患者和非心脏病患者的平均年龄。我们可以观察到年龄稍大的人患心脏病的几率更大。(仅来自这个数据集。)

同样,当我们创建一个与患有/未患有心脏病的平均人数相关的方框图时,我们可以观察到年轻人患心脏病的可能性较小。

最后,我想展示这一对相对于一些属性的图,如年龄、身高、ca
(胸痛类型)、thalach(达到的最大心率)和心脏病的存在。从相关矩阵中可以看出,我们可以观察到年龄和 thalach 之间有很强的负相关性。

一致流形逼近和投影嵌入(UMAP)
t 分布随机邻居嵌入(t-SNE)

再次遵循之前博文的传统,我想执行简单的降维技术,看看我们是否能够将数据分成两组。如上所述,umap 在聚类每个类方面做得相当不错。

最后,上面是 t-SNE 降维的结果图。

GitHub 代码

要获取这篇文章的代码,请点击这里。

遗言

这是另一个很好的绘图和简单的数据探索会议,我希望在不久的将来创造更多的先进的阴谋。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。

同时,在我的推特这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 pos t。

参考

  1. UCI 机器学习知识库:心脏病数据集。(2018).Archive.ics.uci.edu。检索于 2018 年 6 月 25 日,来自https://archive.ics.uci.edu/ml/datasets/Heart+Disease
  2. RPubs——用于心脏病预测的机器学习。(2016).Rpubs.com。检索于 2018 年 6 月 25 日,来自 https://rpubs.com/mbbrigitte/heartdisease
  3. DataFrame,H. (2018)。如何给熊猫数据框添加标题行?堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/34091877/how-to-add-header-row-to-a-pandas-data frame
  4. JaeDukSeo/每日神经网络实践 2。(2018).GitHub。检索于 2018 年 6 月 25 日,来自https://github . com/JaeDukSeo/Daily-Neural-Network-Practice-2/blob/master/Medical _ EXP/Pima _ Indians/a . ipynb
  5. 熊猫。data frame . describe—pandas 0 . 23 . 1 文档。(2018).Pandas.pydata.org。检索于 2018 年 6 月 25 日,来自https://pandas . py data . org/pandas-docs/stable/generated/pandas。DataFrame.describe.html
  6. Pandas DataFrame:替换一列中的所有值,b. (2018)。Pandas DataFrame:根据条件替换列中的所有值。堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/31511997/pandas-data frame-replace-all-values-in-a-column-based-on-condition
  7. 系列?,P. (2018)。熊猫—如何在 DataFrame 系列中用零值替换字符串?。堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/33440234/pandas-how-to-replace-string-with zero-values-in-a-data frame-series
  8. pandas . to _ numeric-pandas 0 . 23 . 1 文档。(2018).Pandas.pydata.org。检索于 2018 年 6 月 25 日,来自https://pandas . pydata . org/pandas-docs/stable/generated/pandas . to _ numeric . html
  9. dataframe,H. (2018)。我如何用零替换熊猫数据帧的一列中的所有 NaN 值?堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/13295735/how-can-I-replace-all-the-nan-values with a-column-of-a-pandas-data fra
  10. dataframe,P. (2018 年)。使用 seaborn 为数据帧绘制直方图。堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/32923301/plotting-histogram-using-seaborn-for-a-data frame/33137122
  11. 0.11.0,h. (2018)。如何为熊猫增加 Dataframe.hist 的图形大小 0.11.0?堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/43392588/how-to-increase-the-figure-size-of-data frame-hist-for-pandas-0-11-0
  12. matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
  13. 可视化数据集的分布— seaborn 0.8.1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 6 月 25 日,来自https://seaborn.pydata.org/tutorial/distributions.html
  14. seaborn . distplot-seaborn 0 . 8 . 1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 6 月 25 日,来自https://seaborn.pydata.org/generated/seaborn.distplot.html
  15. 零?,H. (2018)。如何将现有 Pandas 数据帧的所有值设置为零?。堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/42636765/how-to-set-the-all-the-values-of-an-existing-pandas-data frame-to-zero
  16. DataFrame,C. (2018)。将数据帧中的字符串转换为浮点数。堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/16729483/converting-strings-to-floats-in-a-data frame
  17. pandas & Seaborn——Python | Tryolabs 博客中的数据处理和可视化指南。(2017).Tryolabs.com。检索于 2018 年 6 月 25 日,来自https://tryolabs . com/blog/2017/03/16/pandas-seaborn-a-guide-to-handle-visualize-data-elegantly/
  18. 协方差矩阵。(2018).Stattrek.com。检索于 2018 年 6 月 25 日,来自 https://stattrek.com/matrix-algebra/covariance-matrix.aspx
  19. 如何在 Python 中构建方差-协方差矩阵?(2015).Firsttimeprogrammer.blogspot.com。检索于 2018 年 6 月 25 日,来自http://first time programmer . blogspot . com/2015/01/how-to-build-variance-协方差-matrix.html
  20. seaborn . bar plot-seaborn 0 . 8 . 1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 6 月 25 日,来自https://seaborn.pydata.org/generated/seaborn.barplot.html
  21. seaborn . pair plot-seaborn 0 . 8 . 1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 6 月 25 日,来自https://seaborn.pydata.org/generated/seaborn.pairplot.html
  22. 3D 散点图— Matplotlib 2.2.2 文档。(2018).Matplotlib.org。检索于 2018 年 6 月 25 日,来自https://matplotlib.org/gallery/mplot3d/scatter3d.html
  23. Pyplot 教程— Matplotlib 2.0.2 文档。(2018).Matplotlib.org。检索于 2018 年 6 月 25 日,来自https://matplotlib.org/users/pyplot_tutorial.html
  24. 笔记本,P. (2018)。Python & Matplotlib:在 Jupyter Notebook 中进行 3D 绘图交互。堆栈溢出。检索于 2018 年 6 月 25 日,来自https://stack overflow . com/questions/38364435/python-matplotlib-make-3d-plot-interactive-in-jupyter-notebook
  25. 颜色示例代码:colormaps _ reference . py—Matplotlib 2 . 0 . 2 文档。(2018).Matplotlib.org。检索于 2018 年 6 月 25 日,来自https://matplotlib . org/examples/color/colormaps _ reference . html
  26. r:解一个方程组。(2018).Stat.ethz.ch 于 2018 年 6 月 25 日检索,来自https://stat . ethz . ch/R-manual/R-devel/library/base/html/solve . html
  27. r 求解函数示例— EndMemo。(2018).Endmemo.com。检索于 2018 年 6 月 25 日,来自 http://www.endmemo.com/program/R/solve.php
  28. r:标准差。(2018).Stat.ethz.ch 于 2018 年 6 月 25 日检索,来自http://stat . ethz . ch/R-manual/R-devel/library/stats/html/SD . html
  29. (2018).Users.stat.umn.edu。检索于 2018 年 6 月 25 日,来自http://users.stat.umn.edu/~helwig/notes/datamat-Notes.pdf
  30. 相关和依赖。(2018).En.wikipedia.org。检索于 2018 年 6 月 25 日,来自https://en.wikipedia.org/wiki/Correlation_and_dependence
  31. 霍尔茨,Y. (2017)。#372 3D PCA 结果。Python 图表库。检索于 2018 年 6 月 26 日,来自https://python-graph-gallery.com/372-3d-pca-result/
  32. 操作员,I. (2018)。Tensorflow 中的交互式会话-卷积运算符的不同输出。堆栈溢出。检索于 2018 年 6 月 26 日,来自https://stack overflow . com/questions/40221651/interactive-session-in-tensor flow-different-output-for-convolution-operator
  33. tensorflow,D. (2018)。张量流中两个向量的点积。堆栈溢出。检索于 2018 年 6 月 26 日,来自https://stack overflow . com/questions/40670370/tensor flow 中两个向量的点积
  34. 安装 mpld3 —将 Matplotlib 引入浏览器。(2018).mpld 3 . github . io . 2018 年 6 月 26 日检索,来自http://mpld3.github.io/install.html
  35. NumPy . histogram—NumPy 1.14 版手册。(2018).Docs.scipy.org。检索于 2018 年 6 月 26 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . histogram . html
  36. 使用 pygal 在 IPython 笔记本中进行交互式绘图。(2015).伊诺·德·布鲁因。检索于 2018 年 6 月 26 日,来自 http://ino.pm/blog/ipython-pygal/#.WzGzS6dKiUk
  37. 使用交互式代码探索基础医学数据。(2018).走向数据科学。检索于 2018 年 6 月 26 日,来自https://towards data science . com/basic-medical-data-exploration-with-interactive-code-aa 26 ed 432265
  38. JaeDukSeo/每日神经网络实践 2。(2018).GitHub。检索于 2018 年 6 月 26 日,来自https://github . com/JaeDukSeo/Daily-Neural-Network-Practice-2/blob/master/Medical _ EXP/heart/heart . ipynb

使用交互式代码的基础医学数据探索

原文:https://towardsdatascience.com/basic-medical-data-exploration-with-interactive-code-aa26ed432265?source=collection_archive---------12-----------------------

GIF from this website

今天我想做一些数据探索,从简单的开始,我想使用著名的皮马印第安人糖尿病数据库创建一些图表。

请注意,这篇文章是为了我未来的自己审查这些材料。

  1. 简单查看数据格式和数据类型

由于我使用了 Pandas Dataframe 来研究 csv 数据,我们可以轻松地查看数据类型以及数据背后的简单见解,例如平均值或标准值。

马上我们可以看到所有的数据都是由数值组成的,事实上我们有 768 列,没有空值。

2。第一个和最后 10 个数据点

虽然我们知道我们的数据是由数值组成的,但我喜欢浏览数据(主要是第一个和最后 10 个或 100 个),只是为了好玩而查看它们。

3。相关矩阵

接下来,我想看看每一列是如何相互关联的,再次感谢 pandas Dataframe 的强大功能,制作这个图表非常容易。我们已经可以观察到结果栏与葡萄糖、身体质量指数和年龄高度相关。

4。各列直方图

现在让我们来看看每一列的分布,我们可以立即观察到我们的数据库中有更多的非糖尿病患者。在执行分类时,这可能是一个有用的信息。接下来,我们可以观察到年龄部分有一个异常值。(因为我们只有一个年龄在 80 到 81 岁之间的人。)

在这里我们可以观察到更多的情况,例如,我们大多数患者的胰岛素水平在 0-19μU/ml 之间

5。散点图矩阵

散点图矩阵图(或 SPLOM)也可以用来找出不同的相关性。使用这篇博客文章中的代码,我们可以观察每个特性是如何相互关联的。从表面上看,身体质量指数和血糖水平似乎是非常重要的特征。(正如我们在关联热图中已经看到的。)

6。一致流形逼近和投影嵌入(UMAP)
t-分布随机邻居嵌入(t-SNE)

Inspired by this blog post

最后,让我们将数据集投影到三维空间中,我们已经知道我们有 8 个特征向量(因为最后一个是患者是否患有糖尿病的二进制值,所以我们不会对其进行计数。)所以让我们把它们投射到 3D 空间。如上所述,无论是 t-SNE 还是 UMAP 都没有在非糖尿病患者和糖尿病患者的聚类方面做得很好。

如上所述,我决定只使用 4 个具有最高相关值的特征向量。

不幸的是,结果似乎并没有改变太多:(

GitHub 代码

要访问这篇文章的 ipython 笔记本,请点击这里。

遗言

对于数据探索来说,这是一个很好的起点,我希望将来能做得更多。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我也实现了广残网,请点击这里查看博文 pos t。

参考

  1. 绘制对角线相关矩阵——seaborn 0 . 8 . 1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 6 月 24 日,来自https://seaborn . pydata . org/examples/many _ pairwise _ correlations . html
  2. 带注释的热图— seaborn 0.8.1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 6 月 24 日,来自https://seaborn.pydata.org/examples/heatmap_annotation.html
  3. colormap,P. (2018)。用取自色彩图的颜色绘制直方图。堆栈溢出。检索于 2018 年 6 月 24 日,来自https://stack overflow . com/questions/23061657/plot-histogram-with-colors-take-from-colormap
  4. matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 6 月 24 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
  5. 什么是 SPLOM 图表?用 Python 制作散点图矩阵。(2018).中等。检索于 2018 年 6 月 24 日,来自https://medium . com/@ plotlygraphs/what-is-a-splom-chart-make-scatter plot-matrices-in-python-8dc 4998921 C3
  6. Plot.ly. (2018)。秘密地进口。_ _ version _ _ | Dreamshot | Plotly。【在线】可在:https://plot . ly/~ dream shot/9242/import-plotly-plotly-version-/#/【2018 年 6 月 24 日访问】。
  7. 直方图。(2018).Plot.ly .检索于 2018 年 6 月 24 日,来自https://plot.ly/pandas/histograms/
  8. 属性错误问题#24 lmcinnes/umap。(2018).GitHub。检索于 2018 年 6 月 24 日,来自https://github.com/lmcinnes/umap/issues/24
  9. dataframe,S. (2018)。在熊猫数据框架中选择列。堆栈溢出。检索于 2018 年 6 月 24 日,来自https://stack overflow . com/questions/11285613/selecting-columns-in-a-pandas-data frame
  10. 如何选择所有列,e. (2018)。如何选择除熊猫中一列外的所有列?。堆栈溢出。检索于 2018 年 6 月 24 日,来自https://stack overflow . com/questions/29763620/how-to-select-all-columns-except-one-columns-in-pandas
  11. 数字数据集的降维。(2018).Plot.ly .检索于 2018 年 6 月 24 日,来自https://plot . ly/~ empet/14816/dimension-reduction-of-digits-dataset-v/#/
  12. 皮马印第安人糖尿病数据库。(2018).Kaggle.com。检索于 2018 年 6 月 24 日,来自https://www.kaggle.com/uciml/pima-indians-diabetes-database
  13. 熊猫。数据框架-pandas 0 . 23 . 1 文件。(2018).Pandas.pydata.org。检索于 2018 年 6 月 24 日,来自https://pandas . pydata . org/pandas-docs/stable/generated/pandas。DataFrame.html

《哈利·波特》文本的情感分析

原文:https://towardsdatascience.com/basic-nlp-on-the-texts-of-harry-potter-sentiment-analysis-1b474b13651d?source=collection_archive---------4-----------------------

附带 Matplotlib 高级特性的附加教程!

我是 Greg Rafferty,湾区的数据科学家。你可以在我的 github 上查看这个项目的代码。如有任何问题,请随时联系我!

在这一系列的文章中,我通过《哈利·波特》的镜头来看一些简便的自然语言处理技术。本系列之前关于基本自然语言处理的文章着眼于使用潜在狄利克雷分配的主题建模正则表达式文本摘要

什么是情感分析?

在之前的一篇文章中,我研究了主题建模,这是一种学习给定文本主题的自然语言处理技术。情感分析的存在是为了了解人们对那个话题说了什么——是好是坏?随着互联网在我们日常生活中的使用越来越多,每天每秒钟都有大量的非结构化文本发布在博客帖子、论坛、社交媒体和评论网站上,仅举几例。情感分析系统可以获取这种非结构化数据,并自动为其添加结构,捕捉公众对产品、服务、品牌、政治等的看法。例如,这些数据在市场分析、公共关系、产品评论、净推广者评分、产品反馈和客户服务等领域具有巨大的价值。

我已经用哈利波特的文本演示了很多这样的 NLP 任务。这些书富含读者能从内心感受到的情感体验。电脑能捕捉到这种感觉吗?让我们来看看。

VADER

我用 C.J .休顿的 VADER 包提取每本书的感悟。VADER 是一个专门针对社交媒体的词汇和基于规则的工具,它代表了 ValenceAwareDictionary 和 sEentimentReasing。给定一个文本字符串,它输出一个介于 0 和 1 之间的十进制数来表示文本的消极、积极和中性,以及一个介于-1 和 1 之间的复合分数,它是一个聚合度量。

关于 VADER 软件包的开发、验证和评估的完整描述可以在本文中阅读,但要点是该软件包的作者首先构建了一个与情感相关的词汇特征列表,然后将该列表与一些描述短语的语法结构如何增强或减弱情感的规则相结合。当与人类评分员进行测试时,VADER 的准确率高达 96%到 84%。

VADER 最擅长短文本(最多两个句子),把它一次应用到一整章会导致极端和大部分没有价值的分数。相反,我逐个循环每个句子,得到 VADER 分数,然后取一章中所有句子的平均值。

Goblet of Fire, Chapter 16: Harry discovers the missionary position

通过绘制每本书每一章的 VADER 复合乐谱,我们可以清楚地标记书中的事件。上图中三个最大的峰值是哈利在第 70 章左右被火焰杯选中,塞德里克·迪戈里在第 88 章左右死亡,以及邓布利多在第 160 章左右死亡。

下面是生成该图表的代码(我的 Github 上有完整的笔记本)。数据存在于字典中,以每本书的书名作为关键字;每本书的值是另一个字典,每个章节的编号是一个键。每个章节的值是一个由章节标题和章节文本组成的元组。我定义了一个函数来计算数据的移动平均值,这基本上使曲线变得平滑了一点,并且更容易看到贯穿故事的长的多章节弧线。为了将每本书绘制成不同的颜色,我创建了一个名为book_indices的字典,其中每本书的标题作为关键字,值是该书的起始章节号和结束章节号的 2 元素元组(就好像所有的书都与整个系列中按顺序编号的章节连接在一起)。然后,我根据章节号将故事分成几个部分。

import matplotlib.pyplot as plt# Use FiveThirtyEight style theme
plt.style.use('fivethirtyeight')# Moving Average function used for the dotted line
def movingaverage(interval, window_size):
    window = np.ones(int(window_size))/float(window_size)
    return np.convolve(interval, window, 'same')length = sum([len(hp[book]) for book in hp])
x = np.linspace(0, length - 1, num=length)
y = [hp[book][chapter][2]['compound'] for book in hp for chapter in hp[book]]plt.figure(figsize=(15, 10))
for book in book_indices:
    plt.plot(x[book_indices[book][0]: book_indices[book][1]],
             y[book_indices[book][0]: book_indices[book][1]],
             label=book)
plt.plot(movingaverage(y, 10), color='k', linewidth=3, linestyle=':', label = 'Moving Average')
plt.axhline(y=0, xmin=0, xmax=length, alpha=.25, color='r', linestyle='--', linewidth=3)
plt.legend(loc='best', fontsize=15)
plt.title('Emotional Sentiment of the Harry Potter series', fontsize=20)
plt.xlabel('Chapter', fontsize=15)
plt.ylabel('Average Sentiment', fontsize=15)
plt.show()

我还使用 TextBlob 朴素贝叶斯和模式分析器制作了同样的图表,结果更差(这些图表见我的 Github 上的 Jupyter 笔记本)。朴素贝叶斯模型是根据电影评论训练出来的,这些电影评论一定不能很好地解释哈利波特世界。模式分析器工作得更好(几乎和 VADER 一样好);它基于模式库,一个与 VADER 非常相似的基于规则的模型。

情感词汇

我还通过使用由加拿大国家研究委员会创建的超过 14000 个单词的词典来研究情绪,每个单词都被分为与两种情绪(消极、积极)或八种情绪(愤怒、期待、厌恶、恐惧、快乐、悲伤、惊讶、信任)中的任何一种相关或不相关。他们友好地向我提供了词典的访问权限,我写了一个 Python 脚本,它循环一章中的每个单词,在词典中查找,并输出该单词所关联的任何情绪。然后,每一章被赋予每种情绪的分数,该分数对应于该章包含的与该情绪相关联的词的数量与该章中的总字数的比率(这基本上使分数标准化)。

这是“愤怒”和“悲伤”情绪的曲线图。我觉得很有意思的是,愤怒总是伴随着悲伤而存在,但悲伤有时可以在没有愤怒的情况下存在:

Wow, Voldemort. You really pissed off Harry when you killed the adults in his life

Those mood swings hit hard during puberty

再一次,看看我的 Github 上的 Jupyter 笔记本,看看所有情绪的详细图表。这是一个精简版:

让我们来看看我是如何制作这些支线剧情的:

length = sum([len(hp[book]) for book in hp])
x = np.linspace(0, length - 1, num=length)fig, ax = plt.subplots(4, 3, figsize=(15, 15), facecolor='w', edgecolor='k')
fig.subplots_adjust(hspace = .5, wspace=.1)
fig.suptitle('Sentiment of the Harry Potter series', fontsize=20, y=1.02)
fig.subplots_adjust(top=0.88)ax = ax.ravel()for i, emotion in enumerate(emotions):
    y = [hp_df.loc[book].loc[hp[book][chapter][0]][emotion] for book in hp for chapter in hp[book]]
    for book in book_indices:
        ax[i].plot(x[book_indices[book][0]: book_indices[book][1]],
                 y[book_indices[book][0]: book_indices[book][1]],
                 label=book, linewidth=2)ax[i].set_title('{} Sentiment'.format(emotion.title()))
    ax[i].set_xticks([])fig.legend(list(hp), loc='upper right', fontsize=15, bbox_to_anchor=(.85, .2))
fig.tight_layout()
fig.delaxes(ax[-1])
fig.delaxes(ax[-2])
plt.show()

但是看到所有的情绪如何相互比较真的变得很有趣。用这么多的差异叠加 10 条线很快就变得一团糟,所以我再次使用移动平均线:

有趣的是,矛盾的情绪会相互对立,最明显的是上面代表“积极”和“消极”情绪的粉色和棕色线条。请注意,由于移动平均窗口大小为 20 个数据点,前 10 章和后 10 章已从图中删除。

我去掉了 y 轴,因为这些数字对我们来说毫无意义(仅仅是小数:那种情绪的单词量与该章总单词量的比率)。我还删除了水平和垂直图表线,以清理情节。我并不特别在意标记常规的章节号,但我确实想在书上做标记;因此,我添加了那些垂直的虚线。图例在这个图中被颠倒了,这对于可读性或任何东西来说都不是必需的,但我这样做是为了与接下来的面积图和柱形图保持一致。

我是这样做的:

# use the Tableau color scheme of 10 colors
tab10 = matplotlib.cm.get_cmap('tab10')length = sum([len(hp[book]) for book in hp])
window = 20# use index slicing to remove data points outside the window
x = np.linspace(0, length - 1, num=length)[int(window / 2): -int(window / 2)]fig = plt.figure(figsize=(15, 15))
ax =fig.add_subplot(1, 1, 1)# Loop over the emotions with enumerate in order to track colors
for c, emotion in enumerate(emotions):
    y = movingaverage([hp_df.loc[book].loc[hp[book][chapter][0]][emotion] for book in hp for chapter in hp[book]], window)[int(window / 2): -int(window / 2)]
    plt.plot(x, y, linewidth=5, label=emotion, color=(tab10(c)))

# Plot vertical lines marking the books
for book in book_indices:
    plt.axvline(x=book_indices[book][0], color='black', linewidth=2, linestyle=':')
plt.axvline(x=book_indices[book][1], color='black', linewidth=2, linestyle=':')plt.legend(loc='best', fontsize=15, bbox_to_anchor=(1.2, 1))
plt.title('Emotional Sentiment of the Harry Potter series', fontsize=20)
plt.ylabel('Relative Sentiment', fontsize=15)# Use the book titles for X ticks, rotate them, center the left edge
plt.xticks([(book_indices[book][0] + book_indices[book][1]) / 2 for book in book_indices],
           list(hp),
           rotation=-30,
           fontsize=15,
           ha='left')
plt.yticks([])# Reverse the order of the legend
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[::-1], labels[::-1], loc='best', fontsize=15, bbox_to_anchor=(1.2, 1))ax.grid(False)plt.show()

我还做了一个面积图来显示每一章的整体情感品质。这也是一个移动平均值,以消除更极端的峰值,并更好地显示所有书籍中的故事:

这本书似乎以一点前一个故事的拖尾情绪开始,但在中间章节很快平静下来,只是在结尾时又回来了。

length = sum([len(hp[book]) for book in hp])
window = 10
x = np.linspace(0, length - 1, num=length)[int(window / 2): -int(window / 2)]fig = plt.figure(figsize=(15, 15))
ax = fig.add_subplot(1, 1, 1)y = [movingaverage(hp_df[emotion].tolist(), window)[int(window / 2): -int(window / 2)] for emotion in emotions]plt.stackplot(x, y, colors=(tab10(0),
                            tab10(.1),
                            tab10(.2),
                            tab10(.3),
                            tab10(.4),
                            tab10(.5),
                            tab10(.6),
                            tab10(.7),
                            tab10(.8),
                            tab10(.9)), labels=emotions)# Plot vertical lines marking the books
for book in book_indices:
    plt.axvline(x=book_indices[book][0], color='black', linewidth=3, linestyle=':')
plt.axvline(x=book_indices[book][1], color='black', linewidth=3, linestyle=':')plt.title('Emotional Sentiment of the Harry Potter series', fontsize=20)
plt.xticks([(book_indices[book][0] + book_indices[book][1]) / 2 for book in book_indices],
           list(hp),
           rotation=-30,
           fontsize=15,
           ha='left')
plt.yticks([])
plt.ylabel('Relative Sentiment', fontsize=15)# Reverse the legend
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[::-1], labels[::-1], loc='best', fontsize=15, bbox_to_anchor=(1.2, 1))ax.grid(False)plt.show()

请注意,在此图表中,为了可读性,反转图例变得非常必要。默认情况下,图例项是按字母顺序向下添加的,但数据是自下而上堆叠的。因此,图例和面积图的颜色走向相反——在我看来,非常混乱,难以理解。因此,在底部绘制“愤怒”,我也希望它在传奇的底部,同样在顶部绘制“信任”。

最后,一个堆叠条形图显示了各种情绪在书籍中的权重:

自然,与任何积极情绪相关的词也会与“积极”情绪相关,同样也与“消极”情绪相关,所以这两种情绪承载了书籍的大部分情绪质量也就不足为奇了。我发现值得注意的是,每本书的情绪相对一致,只是在数量上略有不同,但重量一致,除了红色的“恐惧”情绪;它似乎是整个系列中变化最大的。我也希望随着赌注越来越高,在整个系列赛中,情感的累积量会增加;然而,虽然最后一本书确实是最高的,但其他 6 本书没有显示出这种逐渐增加,而是几乎相反,从第 2 本书开始持续下降。

books = list(hp)
margin_bottom = np.zeros(len(books))fig = plt.figure(figsize=(15, 15))
ax = fig.add_subplot(1, 1, 1)for c, emotion in enumerate(emotions):
    y = np.array(hp_df2[emotion])
    plt.bar(books, y, bottom=margin_bottom, label=emotion, color=(tab10(c)))
    margin_bottom += y# Reverse the legend
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[::-1], labels[::-1], loc='best', fontsize=15, bbox_to_anchor=(1.2, 1))plt.title('Emotional Sentiment of the Harry Potter series', fontsize=20)
plt.xticks(books, books, rotation=-30, ha='left', fontsize=15)
plt.ylabel('Relative Sentiment Score', fontsize=15)
plt.yticks([])
ax.grid(False)
plt.show()

这个图中棘手的地方是使用margin_bottom变量来堆叠每一列。除此之外,它只是使用了一些以前剧情中的技巧。

《哈利·波特》文本的解读

原文:https://towardsdatascience.com/basic-nlp-on-the-texts-of-harry-potter-topic-modeling-with-latent-dirichlet-allocation-f3c00f77b0f5?source=collection_archive---------3-----------------------

基于潜在狄利克雷分配的主题建模

“Hmm,” said a small voice in his ear. “Difficult. Very difficult. Plenty of courage, I see. Not a bad mind either. There’s talent, oh my goodness, yes — and a nice thirst to prove yourself, now that’s interesting. . . . So where shall I put you?”

我是 Greg Rafferty,湾区的数据科学家。你可以在我的 github 上查看这个项目的代码。如有任何问题,请随时联系我!

在这篇文章中,我将通过《哈利·波特》的视角,用潜在的狄利克雷分配来描述主题建模,并比较不同的算法。即将发布的帖子将涵盖另外两个 NLP 任务:文本摘要和情感分析。

最近,我和一个团队参与了一个新项目,他们一致感到震惊和失望,因为我从未读过或看过关于一个名叫哈利·波特的虚构巫师的电影。为了融入团队,显然也为了避免我的职业生涯过早结束,我很快意识到我必须参加一个关于霍格沃茨发生的事情的速成班。带着我的电子书阅读器和七个闪亮的新 pdf 文件,我坐下来看看到底是怎么回事。与此同时,我已经开始从事一个由一堆不相关的 NLP 任务组成的兼职项目。我需要一套大小合适的文本文档,我认为所有这些闪亮的新 pdf 将是一个很好的来源。

在第三本书中间的某个地方,我突然意识到 LDA 基本上只是一个算法排序帽。

LDA,或潜在的 Dirichlet 分配,是由单词和/或短语组成的文档语料库的生成概率模型(在 NLP 术语中)。该模型由两个表组成;第一个表是从特定主题采样时在语料库中选择特定单词的概率,第二个表是从特定文档采样时选择特定主题的概率。

这里有一个例子。假设我有这三个(相当不重要的)文档:

document_0 = "Harry Harry wand Harry magic wand"
document_1 = "Hermione robe Hermione robe magic Hermione"
document_2 = "Malfoy spell Malfoy magic spell Malfoy"
document_3 = "Harry Harry Hermione Hermione Malfoy Malfoy"

以下是这些文档的术语频率矩阵:

从这一点看,很明显 0 号文件主要是关于哈利的,有一点是关于魔法的,还有一部分是关于魔杖的。文件 1 也有一点关于魔法,但主要是关于赫敏和长袍。文件 2 也是部分关于魔法,但主要是关于马尔福和咒语。文件 3 同样是关于哈利、赫敏和马尔福的。通常不太容易看出这一点,因为更实用的语料库将由成千上万的单词组成,所以让我们看看 LDA 算法选择什么主题:

Data Science with Excel!

这大概就是我们根据词频和直觉预测的结果。主题的数量是一个超参数,您需要仔细选择和调整,我将在后面详细介绍,但在这个示例中,我选择了 4 个主题来阐述我的观点。上面的表格显示单词和主题,下面的表格显示文档和主题。上表中的每一列和下表中的每一行的总和必须为 1。这些表格告诉我们,如果我们从 Topic 0 中随机抽取一个单词,有 70.9%的几率会得到“Harry”。如果我们从话题 3 中选一个词,几乎可以肯定我们会选“魔法”。如果我们对文档 3 进行采样,那么我们选择主题 0、1 或 2 的可能性是相等的。

这取决于我们这些聪明的人,他们可以从一堆单词中推断出这些主题的意思。在这些词汇非常有限的例子中,主题显然与单个单词相对应。如果我们在几千个餐馆描述上运行 LDA,我们可能会找到与菜肴类型或氛围相对应的主题。值得注意的是,与 Kmeans 等典型的聚类算法不同,LDA 允许一个文档存在于多个主题中。因此,在这些餐馆描述中,我们可能会在“意大利”、“约会之夜”和“咖啡馆”主题中找到一家餐馆。

这一切和分院帽有什么关系?霍格沃茨所有的新生在到达的第一天都要经历一个仪式来决定他们将住在哪个房子里(我可能是唯一一个直到几周前才知道这件事的人)。分院帽一旦戴在某人的头上,就能理解他们的思想、梦想和经历。这有点像 LDA 构建词频矩阵并理解每个文档中包含哪些单词和 N 元语法。

分院帽然后将学生的属性与各个学院的属性进行比较(勇敢归格兰芬多,忠诚归赫奇帕奇,智慧归拉文克劳,卑鄙、狡诈的人渣归斯莱特林(好吧,就一个简短的题外话——有谁能向我解释一下为什么斯莱特林坚持了这所学校的千年历史吗?这就像一个兄弟会发现自己每年都陷入另一个可笑的淫秽丑闻!)).这是 LDA 创建单词-主题表并开始关联主题属性的地方。

由于哈利集勇气、智慧、天赋和雄心于一身,他在格兰芬多和斯莱特林之间的排名明显不同,但格兰芬多只是略微领先,哈利·波特成为了整整一代年轻千禧一代的英雄,而不是反面角色。LDA 在这里创建文档主题表,并最终确定每个文档的主导主题。

好了,现在我们大致了解了 LDA 的功能,让我们来看看 Python 中的两种不同实现。查看我的 Github repo 了解所有的基本细节。

首先,确定应该建模多少主题的最佳方法之一是肘图。这也是通常用于确定使用聚类算法选择多少个聚类的技术。在这种情况下,我们将根据主题数量绘制一致性分数:

你通常会选择连贯性分数开始稳定的最低数量的主题。这就是为什么它被称为肘图——你在陡峭的收益和浅的收益之间选择肘。在这种情况下(这是一个非常尖锐的情况;通常曲线比这个稍微平滑一点),我会选择大约 20 个主题。

我使用的第一个模型是 Gensim 的 ldamodel 。在 20 个主题中,Gensim 的一致性得分为 0.319。这并不伟大;事实上,我们接下来要看的 Mallet 算法几乎总是优于 Gensim 的算法。然而,Gensim 的一个真正酷的东西是 pyLDAvis,一个可以在 Jupyter 笔记本上运行的交互式图表。它用两个主成分绘制聚类图,并显示每个聚类中单词的比例:

Harry Potter and the Allocation of Dirichlet

我研究的下一个实现是 Mallet ( ChineLearning forLanguagET12ool kit),这是 UMASS Amherst 推出的一个基于 Java 的包。Mallet 和 Gensim 的标准 LDA 之间的区别在于,Gensim 使用变分贝叶斯采样方法,该方法比 Mallet 的 Gibbs 采样更快,但精度较低。幸运的是,对于那些喜欢用 Python 编码的人来说,Gensim 有一个 Mallet 的包装器:通过 Mallet 的潜在 Dirichlet 分配。为了使用它,你需要从这里http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip下载 Mallet Java 包并安装 Java 开发工具包。一旦一切都设置好了,实现这个模型就和 Gensim 的标准模型差不多了。使用 Mallet,20 主题模型的一致性分数增加到 0.375(记住,Gensim 的标准模型输出 0.319)。这是一个适度的增长,但通常会持续各种数据源,所以尽管 Mallet 稍慢,但我更喜欢它的回报增加。

最后,我在哈利波特系列的所有 7 本书的 192 个章节上建立了一个木槌模型。以下是每个潜在主题的模型输出的前 10 个关键词。你如何命名这些集群?

比特币价格数据的基本时间序列分析和交易策略

原文:https://towardsdatascience.com/basic-time-series-analysis-and-trading-strategy-with-bitcoin-price-data-1a8f1a30f11?source=collection_archive---------2-----------------------

Photo by Dmitry Demidko on Unsplash

我必须说,时间序列分析不是一个简单的话题。至少对我来说是这样。在伦敦大会数据科学沉浸式课程的课堂上,我有机会了解这个主题,并花了一些时间来理解它。

这篇文章的目的是通过实施并试图向他人解释来巩固我所学到的东西。我不是金融专家,所以非常感谢熟悉这个领域的人的任何建议或反馈。

时间序列

时间序列是一系列按时间顺序索引(或列出或绘制)的数据点。时间序列数据应与其他类型的数据区别对待。统计数据假设之一是其独立性。独立性意味着一个观察值不会影响其他观察值。但是在时间序列数据中,每个数据点在时间上是靠在一起的,它们并不完全独立于它们的相邻值。因此,我们需要一种不同的方法来模拟时间序列数据。

首先,从加载依赖项开始。Pandas_datareader 是一个从 web 中提取金融数据的有用库。对于这篇文章,我将从雅虎财经中提取数据。

import pandas as pd
import pandas_datareader.data as web
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetimeplt.style.use('fivethirtyeight')%config InlineBackend.figure_format = 'retina'
%matplotlib inline

好了,我们来获取 2017 年初至 2017 年 12 月 27 日 BTC-美元(比特币价值以美元计)的价格数据。

btc = web.get_data_yahoo('BTC-USD', start=datetime.datetime(2017, 1, 1), end=datetime.datetime(2017, 12, 27))
btc.head()

如您所见,该数据有六列。“开盘价”代表当天的开盘价,“高”代表当天的最高价,“低”代表当天的最低价,“收盘”代表当天的收盘价,“调整收盘”代表调整后的收盘价,“成交量”代表成交量。在股票价格中,调整后的收盘价反映了股票在任何给定交易日的收盘价,该收盘价已被修改为包括第二天开盘前任何时间发生的任何分配和公司行为。

但是 100%诚实地说,我不确定一种货币的调整后收盘价将考虑哪些因素,但是通过查看“收盘”列和“Adj Close”列的差异,它们似乎完全相同。

np.sum(btc['Close'] - btc['Adj Close'])

让我们在图表上绘制“Adj Close”价格数据。

btc_adj = btc['Adj Close']
btc_adj.plot(lw=2.5, figsize=(12, 5))
plt.show()

看起来比特币的美元价值在 2017 年上半年一直保持稳定,但从 11 月份左右开始振荡并急剧上升。

移动平均数

时间序列数据的基本分析技术之一是移动平均。顾名思义,移动平均值(也称为滚动平均值)不是计算整个数据集的平均值,而是计算具有特定窗口大小的子集的平均值,并向前移动。移动平均线用于平滑短期波动,突出长期趋势或周期。

让我们通过绘制 2017 年 1 月 10 日至 2017 年 12 月 27 日的价格数据来看看移动平均线在图表上的工作原理。我选择了 2017 年第四季度来绘制数据中有强烈趋势的地方,以清楚地看到移动平均线是如何工作的。

btc_recent = btc_adj.loc['2017-10-01':'2017-12-27']
rroll_d3 = btc_recent.rolling(window=3).mean()
rroll_d7 = btc_recent.rolling(window=7).mean()
rroll_d14 = btc_recent.rolling(window=14).mean()plt.figure(figsize=(14, 7))
plt.plot(btc_recent.index, btc_recent, lw=3, alpha=0.8,label='Original observations')
plt.plot(btc_recent.index, rroll_d3, lw=3, alpha=0.8,label='Rolling mean (window 3)')
plt.plot(btc_recent.index, rroll_d7, lw=3, alpha=0.8,label='Rolling mean (window 7)')
plt.plot(btc_recent.index, rroll_d14, lw=3, alpha=0.8,label='Rolling mean (window 14)')
plt.title('BTC-USD Adj Close Price 2017-10-01 to 2017-12-27')
plt.tick_params(labelsize=12)
plt.legend(loc='upper left', fontsize=12)
plt.show()

与用蓝线绘制的原始观察结果相比,我们可以看到,随着窗口尺寸变大,线条曲线变得更加平滑。

双重移动平均线交叉

均线的另一个使用案例是在一个叫做双重均线交叉的交易策略中。我通过一篇中型博客文章了解到这一点,它被很好地解释了,不仅是关于动量策略,还有 Python 在交易策略建模中的一般用例。如果你是对 Python 金融建模感兴趣的初学者,我强烈推荐这篇文章。

我下面实现的只是我提到的博客文章中的教程的一个应用,但是我将短窗口改为 10 天而不是最初文章的 40 天,对于更长的时间,我使用 50 天并将其命名为 mid_window,而不是最初文章作者使用的 100 天。我想,如果把时间框架改得更短,这个策略将会更加短视。但我不是金融专家,我不确定将时间框架改得更短是否会犯根本性错误。如果阅读这篇文章的人是金融专家,请随时纠正我的逻辑错误。

双重均线交叉的概念非常简单。计算价格的两条移动平均线,一条是短期的,另一条是长期的。长期移动平均线的方差较低,与短期移动平均线的移动方向相同,但速率不同。不同的方向变化率导致两个移动平均值可能相等或彼此交叉的点。这些点被称为交叉点。在双重移动平均线交叉交易策略中,这些交叉点是决定买入或卖出货币的点。

按照原博文作者的说法,“当短期平均线穿越长期平均线并升至其上方时,产生买入信号,而当短期平均线穿越长期平均线并跌破长期平均线时,触发卖出信号”。

然而,在寻找关于这个主题的更多材料时,我也发现了对相同信号点的相反方法。作者介绍的上述方法称为技术方法,另一种方法称为价值方法。

价值方法提供了与技术方法相反的交易信号。价值方法认为,当短期平均线从长期平均线的下方穿越到上方时,投资现在被高估了,应该卖出。相反,当货币短期平均值低于长期平均值时,则货币被低估,应该买入。

看到对同一情况有两种相互矛盾的观点是非常有趣的。但是在这篇文章中,我将集中讨论技术方法。现在让我们看看如何将它应用到真实数据中。

short_window = 10
mid_window = 50signals = pd.DataFrame(index=btc_adj.index)
signals['signal'] = 0.0roll_d10 = btc_adj.rolling(window=short_window).mean()
roll_d50 = btc_adj.rolling(window=mid_window).mean()signals['short_mavg'] = roll_d10
signals['mid_mavg'] = roll_d50
signals['signal'][short_window:] = np.where(signals['short_mavg'][short_window:] > signals['mid_mavg'][short_window:], 1.0, 0.0)
signals['positions'] = signals['signal'].diff()

现在我们可以把它画出来,看看它在图表上是什么样子。

plt.figure(figsize=(14, 7))
plt.plot(btc_adj.index, btc_adj, lw=3, alpha=0.8,label='Original observations')
plt.plot(btc_adj.index, roll_d10, lw=3, alpha=0.8,label='Rolling mean (window 10)')
plt.plot(btc_adj.index, roll_d50, lw=3, alpha=0.8,label='Rolling mean (window 50)')plt.plot(signals.loc[signals.positions == 1.0].index, 
         signals.short_mavg[signals.positions == 1.0],
         '^', markersize=10, color='r', label='buy')

plt.plot(signals.loc[signals.positions == -1.0].index, 
         signals.short_mavg[signals.positions == -1.0],
         'v', markersize=10, color='k', label='sell')plt.title('BTC-USD Adj Close Price (The Technical Approach)')
plt.tick_params(labelsize=12)
plt.legend(loc='upper left', fontsize=12)
plt.show()

initial_investment = btc_adj.loc[list(signals[signals.positions == 1.0].index)][0]
bought = np.sum(btc_adj.loc[list(signals[signals.positions == 1.0].index)]*-1.0)
sold = np.sum(btc_adj.loc[list(signals[signals.positions == -1.0].index)])
current_btc_value = btc_adj[-1]balance = pd.DataFrame([btc_adj.loc[list(signals[signals.positions == 1.0].index)]*-1.0,
              btc_adj.loc[list(signals[signals.positions == -1.0].index)]]).transpose()
balance = balance.fillna(0)
balance['balance'] = balance.sum(axis=1)print "Initial investment amount: {0:.2f} USD".format(initial_investment)
print "Maximum invested amount: {0:.2f} USD".format(abs(min(balance.cumsum().balance)))
print "Current asset value: {0:.2f} USD".format(bought+sold+current_value)

按照技术方法,我会以 1,048.89 美元开始投资,在大约一年的时间内,我需要 1,551.77 美元继续投资,我的 1 比特币的最终价值现在应该是 1,3864.87 美元(2017 年 12 月 27 日)。这可能是一个天真的计算,没有考虑交易费或其他可能发生的费用。但在一个简化的计算中,这并不是一项糟糕的投资。

如果将价值方法应用于同一图表,情况可能会有所不同。金融学里有“做空”和“做多”的概念。“卖空一项资产意味着出售一项我们目前不持有的资产,并获得其现金价值。卖空与出售我们已经拥有的资产不同,后者被称为做多。”对我来说,这听起来总是有点违背直觉,出售一个人甚至不拥有的东西。如果你有兴趣了解这方面的更多信息,你可能会发现来自 Investopedia 的这一页很有帮助。

从技术角度来看,最后一笔交易是“买入”,但从价值角度来看,这笔交易应该是“卖出”。正如你所看到的,价格没有下跌,而是继续上涨,在这种情况下,卖空者可能会被他的经纪人追加保证金。

指数移动平均线

时间序列数据的另一种平滑技术是 EMA(指数移动平均线)。EMA 是最近 n 个(窗口大小)价格的加权平均值,权重随着每个价格/周期呈指数下降。简而言之,最近的价格比过去的价格被赋予更大的权重,并且随着时间周期从当前观察进一步向过去发展,贡献的程度呈指数衰减。

时间 t 的(调整后的)指数移动平均值定义为:

这里α是衰减因子。但是有一点我不能理解。我能理解这种逻辑,但是当涉及到 Pandas 的“ewm”函数时,我弄不明白 alpha 的默认值是什么。也许有一个标准,即使没有明确说明,每个人都同意,但我花了大量的时间试图弄清楚这一点,但我仍然不确定。也许我错过了一些重要的东西。如果你对此很熟悉,任何帮助都将不胜感激。

*更新:我在上面找到了自己问题的答案。我不得不承认,我没有仔细查看文档。有时候真的很奇怪,我在文档中查看了所有的解释,但不知何故我不能理解。与熊猫的 EWM 函数,没有默认值,你必须指定衰变。有四种不同的方式可以指定它。在下面的代码中,我用“span”来指定它,在这种情况下,alpha 被定义为 2/(span+1)。因此,通过将“span”指定为 10,我将 alpha 指定为大约 0.18。也可以从 Pandas 0 . 18 . 0 版直接指定 alpha。

但直觉上,与简单移动平均线相比,指数移动平均线对最近的价格变动反应更快,因为它赋予当前价值更多的权重。

exp_weighted_mean = btc_recent.resample('D').sum().ewm(span=10).mean()
sma_d10 = btc_recent.rolling(window=10).mean()
ax = btc_recent.plot(lw=3, figsize=(14, 7), label='Original observations')
exp_weighted_mean.plot(ax=ax, lw=3, label='EMA (window 10)')
sma_d10.plot(ax=ax, lw=3, label='SMA (window 10)')
plt.title('BTC-USD Adj Close Price 2017-10-01 to 2017-12-27', fontsize=16)
plt.tick_params(labelsize=12)
plt.legend(loc='upper left', fontsize=12)
plt.show()

从上面的图表中,你可以看到红线的均线在 12 月中旬比黄线的均线更快地抓住了向下的趋势,并且在最后,均线开始抓住向上的趋势,而均线仍然显示向下的趋势。

你可以把双重均线交叉的相同逻辑应用到原始观察和均线上。只是这次我们寻找原始观察值和均线的交叉点。让我们看看在从 2017 年 1 月 10 日到 2017 年 12 月 27 日的短时间内这将如何表现。

exp_weighted_mean = btc_recent.resample('D').sum().ewm(span=20).mean()signals_ema = pd.DataFrame(index=btc_recent.index)
signals_ema['signal'] = 0.0signals_ema['original'] = btc_recent
signals_ema['EMA'] = exp_weighted_meansignals_ema['signal'] = np.where(signals_ema['original'] > signals_ema['EMA'], 1.0, 0.0)signals_ema['positions'] = signals_ema['signal'].diff()

现在让我们在图表上看看这个。

plt.figure(figsize=(14, 7))ax = btc_recent.plot(lw=3, figsize=(14, 7), label='Original observations')
exp_weighted_mean.plot(ax=ax, lw=3, label='Exponentially weighted mean')plt.plot(signals_ema.loc[signals_ema.positions == 1.0].index, 
         signals_ema.EMA[signals_ema.positions == 1.0],
         '^', markersize=10, color='r', label='buy')

plt.plot(signals_ema.loc[signals_ema.positions == -1.0].index, 
         signals_ema.EMA[signals_ema.positions == -1.0],
         'v', markersize=10, color='k', label='sell')plt.title('BTC-USD Adj Close Price (EMA Trading Strategy)')
plt.tick_params(labelsize=12)
plt.legend(loc='upper left', fontsize=12)
plt.show()

initial_investment = btc_recent.loc[list(signals_ema[signals_ema.positions == 1.0].index)][0]
bought = np.sum(btc_recent.loc[list(signals_ema[signals_ema.positions == 1.0].index)]*-1.0)
sold = np.sum(btc_recent.loc[list(signals_ema[signals_ema.positions == -1.0].index)])
current_btc_value = btc_recent[-1]balance_ema = pd.DataFrame([btc_recent.loc[list(signals_ema[signals_ema.positions == 1.0].index)]*-1.0,
              btc_recent.loc[list(signals_ema[signals_ema.positions == -1.0].index)]]).transpose()
balance_ema = balance_ema.fillna(0)
balance_ema['balance'] = balance_ema.sum(axis=1)print "Initial investment amount: {0:.2f} USD".format(initial_investment)
print "Maximum invested amount: {0:.2f} USD".format(abs(min(balance_ema.cumsum().balance)))
print "Current asset value: {0:.2f} USD".format(bought+sold+current_value)

使用 EMA 交易策略,我会以 4,321.44 美元开始投资,在大约两个月的时间内,我需要 6,665.21 美元继续投资,我的 1 比特币的最终价值现在应该是 8,751.43 美元(27/12/2017)。

这是一个有趣的玩具项目,以实际落实我在课堂上学到的知识,我将尝试用时间序列分析和比特币数据进行进一步探索。但是我应该投资比特币吗?我还不确定,也许当我进一步探索的时候,我会找到一些答案。

感谢您的阅读,您可以从下面的链接中找到上面代码的 Jupyter 笔记本。

https://github . com/tthustle sa/TSA _ bit coin/blob/master/BTC _ price . ipynb

熊猫的基本时间序列操作

原文:https://towardsdatascience.com/basic-time-series-manipulation-with-pandas-4432afee64ea?source=collection_archive---------0-----------------------

[image courtesy: https://pixabay.com/]

作为一个几乎每天都在处理时间序列数据的人,我发现 pandas Python 包对于时间序列操作和分析非常有用。

这是关于 pandas 的时间序列数据操作的基本介绍,可以让您开始时间序列分析。具体目标是向您展示如何:

  • 创建日期范围
  • 使用时间戳数据
  • 将字符串数据转换为时间戳
  • 对数据框中的时间序列数据进行索引和切片
  • 对不同时间段的聚合/汇总统计数据的时间序列进行重新采样
  • 计算滚动统计,如滚动平均值
  • 处理缺失的数据
  • 了解 UNIX/纪元时间的基础知识
  • 了解时间序列数据分析的常见陷阱

让我们开始吧。如果您想处理您拥有的真实数据,您可能想从使用 pandas [read_csv](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)将您的文件读入数据框开始,但是我们将从处理生成的数据开始。

首先导入我们将要使用的库,然后用它们来创建一个日期范围

import pandas as pd
from datetime import datetime
import numpy as npdate_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')

此日期范围具有每小时一次的时间戳。如果我们调用date_rng,我们会看到它看起来像下面这样:

DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
               '2018-01-01 02:00:00', '2018-01-01 03:00:00',
               '2018-01-01 04:00:00', '2018-01-01 05:00:00',
               '2018-01-01 06:00:00', '2018-01-01 07:00:00',
               '2018-01-01 08:00:00', '2018-01-01 09:00:00',
               ...
               '2018-01-07 15:00:00', '2018-01-07 16:00:00',
               '2018-01-07 17:00:00', '2018-01-07 18:00:00',
               '2018-01-07 19:00:00', '2018-01-07 20:00:00',
               '2018-01-07 21:00:00', '2018-01-07 22:00:00',
               '2018-01-07 23:00:00', '2018-01-08 00:00:00'],
              dtype='datetime64[ns]', length=169, freq='H')

我们可以检查第一个元素的类型:

type(date_rng[0])#returnspandas._libs.tslib.Timestamp

让我们用时间戳数据创建一个示例数据框,并查看前 15 个元素:

df = pd.DataFrame(date_rng, columns=['date'])df['data'] = np.random.randint(0,100,size=(len(date_rng)))df.head(15)

Example data frame — df

如果我们想进行时间序列操作,我们需要一个日期时间索引,这样我们的数据框就可以在时间戳上建立索引。

将数据帧索引转换为日期时间索引,然后显示第一个元素:

df['datetime'] = pd.to_datetime(df['date'])df = df.set_index('datetime')df.drop(['date'], axis=1, inplace=True)df.head()

df with datetime index

如果我们数据中的“时间戳”实际上是字符串类型而不是数字类型,会怎么样?让我们将我们的date_rng转换成一个字符串列表,然后将字符串转换成时间戳。

string_date_rng = [str(x) for x in date_rng]string_date_rng#returns['2018-01-01 00:00:00',
 '2018-01-01 01:00:00',
 '2018-01-01 02:00:00',
 '2018-01-01 03:00:00',
 '2018-01-01 04:00:00',
 '2018-01-01 05:00:00',
 '2018-01-01 06:00:00',
 '2018-01-01 07:00:00',
 '2018-01-01 08:00:00',
 '2018-01-01 09:00:00',...

我们可以通过推断它们的格式将字符串转换成时间戳,然后查看值:

timestamp_date_rng = pd.to_datetime(string_date_rng, infer_datetime_format=True)timestamp_date_rng#returnsDatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
               '2018-01-01 02:00:00', '2018-01-01 03:00:00',
               '2018-01-01 04:00:00', '2018-01-01 05:00:00',
               '2018-01-01 06:00:00', '2018-01-01 07:00:00',
               '2018-01-01 08:00:00', '2018-01-01 09:00:00',
               ...
               '2018-01-07 15:00:00', '2018-01-07 16:00:00',
               '2018-01-07 17:00:00', '2018-01-07 18:00:00',
               '2018-01-07 19:00:00', '2018-01-07 20:00:00',
               '2018-01-07 21:00:00', '2018-01-07 22:00:00',
               '2018-01-07 23:00:00', '2018-01-08 00:00:00'],
              dtype='datetime64[ns]', length=169, freq=None)

但是如果我们需要转换一个独特的字符串格式呢?

让我们创建一个字符串形式的任意日期列表,并将它们转换为时间戳:

string_date_rng_2 = ['June-01-2018', 'June-02-2018', 'June-03-2018']timestamp_date_rng_2 = [datetime.strptime(x,'%B-%d-%Y') for x in string_date_rng_2]timestamp_date_rng_2#returns[datetime.datetime(2018, 6, 1, 0, 0),
 datetime.datetime(2018, 6, 2, 0, 0),
 datetime.datetime(2018, 6, 3, 0, 0)]

如果我们把它放到一个数据框里会是什么样子?

df2 = pd.DataFrame(timestamp_date_rng_2, columns=['date'])df2

回到我们最初的数据帧,让我们通过解析时间戳索引来查看数据:

假设我们只想查看日期是本月 2 日的数据,我们可以使用如下的索引。

df[df.index.day == 2]

这个的顶部看起来像:

我们也可以通过数据框的索引直接调用我们想要查看的日期:

df['2018-01-03']

在特定日期之间选择数据怎么样?

df['2018-01-04':'2018-01-06']

我们填充的基本数据框以每小时的频率为我们提供数据,但是我们可以以不同的频率对数据进行重新采样,并指定我们希望如何计算新采样频率的汇总统计数据。我们可以取最小值、最大值、平均值、总和等。,按照下面的示例,以每天的频率而不是每小时的频率来计算数据的日平均值:

df.resample('D').mean()

那么窗口统计呢,比如滚动平均值或滚动总和

让我们在原始 df 中创建一个新列,计算 3 个窗口期间的滚动总和,然后查看数据框的顶部:

df['rolling_sum'] = df.rolling(3).sum()
df.head(10)

我们可以看到,这是正确的计算,只有当有三个周期可以回顾时,它才开始有有效值。

这是一个很好的机会,看看我们如何在处理缺失数据值时进行数据转发或回填。

这是我们的 df,但增加了一个新列,接受滚动总和并回填数据:

df['rolling_sum_backfilled'] = df['rolling_sum'].fillna(method='backfill')
df.head(10)

用现实值(如一段时间内的平均值)填充缺失的数据通常很有用,但请始终记住,如果您正在处理一个时间序列问题并希望您的数据是现实的,您应该而不是对您的数据进行回填,因为这就像是展望未来并获得您在该时间段内永远不会获得的信息。您可能希望向前填充数据的频率高于回填。

处理时间序列数据时,您可能会遇到 Unix 时间中的时间值。Unix 时间,也称为纪元时间,是自协调世界时(UTC)1970 年 1 月 1 日星期四 00:00:00 以来经过的秒数。使用 Unix 时间有助于消除时间戳的歧义,这样我们就不会被时区、夏令时等弄糊涂了。

下面是一个以纪元时间表示的时间 t 的示例,并且将 UNIX/纪元时间转换为以 UTC 表示的常规时间戳:

epoch_t = 1529272655
real_t = pd.to_datetime(epoch_t, unit='s')real_t#returnsTimestamp('2018-06-17 21:57:35')

如果我想将 UTC 时间转换成我自己的时区,我可以简单地做以下事情:

real_t.tz_localize('UTC').tz_convert('US/Pacific')#returnsTimestamp('2018-06-17 14:57:35-0700', tz='US/Pacific')

有了这些基础知识,您就可以开始处理时间序列数据了。

以下是在处理时间序列数据时需要记住的一些技巧和要避免的常见陷阱:

  • 检查您的数据中是否存在差异,这些差异可能是由特定地区的时间变化(如夏令时)引起的。
  • 小心翼翼地跟踪时区——让阅读您代码的其他人知道您的数据处于哪个时区,并考虑转换为 UTC 或标准化值,以便保持您的数据标准化。
  • 丢失数据可能经常发生——确保您记录了您的清理规则,并考虑不要回填您在取样时无法获得的信息。
  • 请记住,当您对数据进行重新采样或填充丢失的值时,您会丢失一些关于原始数据集的信息。我建议跟踪你所有的数据转换,并跟踪数据问题的根源。
  • 当你对数据进行重采样时,最好的方法(平均值、最小值、最大值、总和等。)将取决于你所拥有的数据种类以及数据的取样方式。考虑好如何为你的分析重新采样数据

使用 IBM PowerAI 开源框架的机器学习中的图像分类基础(第 2 部分)

原文:https://towardsdatascience.com/basics-of-image-classification-in-machine-learning-using-open-source-frameworks-in-ibm-powerai-b4291dc40d25?source=collection_archive---------2-----------------------

IBM Power Systems

介绍

图像分类已经成为展示机器学习的关键试点用例之一。在之前的文章中,我介绍了机器学习,IBM PowerAI,在 IBM Power 平台上运行图像分类程序时比较了 GPU 和 CPU 的性能。在本文中,我们来看看如何检查神经网络任何内层的输出,并通过使用 Nvidia DIGITS 来训练您自己的模型。

观察隐藏层参数

直到 20 世纪 80 年代,研究人员才发现给神经网络增加更多的层可以极大地提高其性能。这种具有几个隐藏层的神经网络如今在包括图像分类在内的几个用例中很常见。与名称所表明的相反,可以观察隐藏层中的相关参数。

卷积神经网络体系结构

现在你可能知道,卷积神经网络(CNN)是一种深度神经网络,用于图像分类时会产生相当准确的结果。

在工科学校学习数字信号处理的时候,你一定会碰到卷积这个术语。简单来说,两个信号的卷积是两个信号函数的乘积的积分,在其中一个函数被反转和移位之后。在我们的例子中,每个输入图像都是像素值的矩阵。要查看隐藏层中如何执行卷积的可视化表示,请考虑以下示例。

Source: https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/

在本例中,橙色矩阵(3x3)称为滤镜,用于计算原始图像(5X5 像素矩阵)的卷积输出。结果被称为激活图或功能图。应当理解,根据所应用的滤波器,可以修改和训练输出特征图,以获得期望的输出。

在现代 CNN 中,滤波器是在训练过程中自动学习的,但是我们确实根据所使用的架构指定了某些参数(如下所示)。如果你需要更详细的分析,请访问这个博客

在我们的例子中,使用了 AlexNet 的一个版本,这是我们所依赖的标准架构。在下面的代码中,我们阅读了网络的结构。CNN 包含两个有序字典;

a) **Net.blobs**为输入数据;

a.它有以下参数–批量大小、通道尺寸、高度和宽度

b) **Net.params**是具有权重和偏差参数的斑点向量;

a.权重表示连接的强度。接近零的权重表示输入和输出之间的良好相关性。

b.偏差表示预测值与实际值之间的差距,对于预测值进入下一步非常重要。

c.它具有以下参数——权重的输出通道、输入通道、滤波器高度和滤波器宽度,以及偏差的一维输出通道。

让我们试着把这些打印出来。

# for each layer, show the output shapefor layer_name, blob in net.blobs.iteritems():print layer_name + ‘\t’ + str(blob.data.shape)

这是输出。

data (50, 3, 227, 227)conv1 (50, 96, 55, 55)pool1 (50, 96, 27, 27)norm1 (50, 96, 27, 27)conv2 (50, 256, 27, 27)pool2 (50, 256, 13, 13)norm2 (50, 256, 13, 13)conv3 (50, 384, 13, 13)conv4 (50, 384, 13, 13)conv5 (50, 256, 13, 13)pool5 (50, 256, 6, 6)fc6 (50, 4096)fc7 (50, 4096)fc8 (50, 1000)prob (50, 1000)

和;

for layer_name, param in net.params.iteritems():print layer_name + ‘\t’ + str(param[0].data.shape), str(param[1].data.shape)

这是输出。

conv1 (96, 3, 11, 11) (96,)conv2 (256, 48, 5, 5) (256,)conv3 (384, 256, 3, 3) (384,)conv4 (384, 192, 3, 3) (384,)conv5 (256, 192, 3, 3) (256,)fc6 (4096, 9216) (4096,)fc7 (4096, 4096) (4096,)fc8 (1000, 4096) (1000,)

如你所见,我们这里有四维数据。这里有一个函数来可视化这些数据;

def vis_square(data):
“””Take an array of shape (n, height, width) or (n, height, width, 3)
 and visualize each (height, width) thing in a grid of size approx. sqrt(n) by sqrt(n)”””

 # normalize data for display
 data = (data — data.min()) / (data.max() — data.min())

 # force the number of filters to be square
 n = int(np.ceil(np.sqrt(data.shape[0])))
 padding = (((0, n ** 2 — data.shape[0]),
 (0, 1), (0, 1)) # add some space between filters
 + ((0, 0),) * (data.ndim — 3)) # don’t pad the last dimension (if there is one)
 data = np.pad(data, padding, mode=’constant’, constant_values=1) # pad with ones (white)

 # tile the filters into an image
 data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
 data = data.reshape((n * data.shape[1], n * data.shape[3]) +  data.shape[4:])

 plt.imshow(data); plt.axis(‘off’)

在这里,您可以看到层 conv1 中的滤波器;

# the parameters are a list of [weights, biases]filters = net.params[‘conv1’][0].datavis_square(filters.transpose(0, 2, 3, 1))

Filters in a layer

这里,我们看到前 36 个滤波器的校正响应;

feat = net.blobs[‘conv1’].data[0, :36]vis_square(feat)

Rectified output

在这里,我们看到第五层的输出,在池化之后;

feat = net.blobs[‘pool5’].data[0]vis_square(feat)

Output of the fifth layer after pooling

第一个完全连接的层是“fc6 ”,它是一个整流输出。使用此代码显示所有非负值的直方图;

feat = net.blobs[‘fc6’].data[0]plt.subplot(2, 1, 1)plt.plot(feat.flat)plt.subplot(2, 1, 2)_ = plt.hist(feat.flat[feat.flat > 0], bins=100)

Histogram of rectified output — More explanation in this blog

这里,我们看到了所有预测类的最终概率值的直方图。这里最高的峰值显示了最高的预测类别,在我们的例子中,是猩猩。还显示了其他次要的簇峰。

feat = net.blobs[‘prob’].data[0]plt.figure(figsize=(15, 3))plt.plot(feat.flat)[<matplotlib.lines.Line2D at 0x7f09587dfb50>]

The top peak here shows the top predicted class, in our case, orangutan

如何训练自己的机器学习模型?

英伟达是什么数字?

Nvidia 深度学习 GPU 训练系统( DIGITS )是一个应用程序,用于对图像进行分类,执行分割和对象检测任务。这是一个基于 GUI 的应用程序,与 Caffe 接口。下载和安装程序可以在他们的网站上找到。Github 上也有稳定版和其他测试版。DIGITS 服务器安装在我在这个演示中使用的容器中。安装后,可以从端口 5000 访问 GUI。

下一步是从网上下载一个样本数据集到我在虚拟机中创建的目录(/DIGITS)中。这个数据集被称为 CIFAR-100。它包含 100 个图像类别,每个类别包含 600 个图像。每个类有 500 个训练图像和 100 个测试图像。CIFAR-100 中的 100 个类被分成 20 个超级类。每个图像都有一个“精细”标签(它所属的类)和一个“粗糙”标签(它所属的超类)。

下面是它包含的内容的简要说明;

  1. Labels.txt:该文件包含训练数据集中的类的列表。

  2. Train:该目录包含用于训练的图像。

  3. Train.txt:该文件包含训练文件到类之间的映射列表。标签是按位置排列的,即 labels.txt 文件中的第一个标签用数字 0 表示,第二个用数字 1 表示,依此类推。

4)测试:该目录包含用于测试训练质量的图像。

  1. Test.txt:这个文件包含测试文件和类之间的映射列表。标签是按位置排列的,即 labels.txt 文件中的第一个标签用数字 0 表示,第二个用数字 1 表示,依此类推。
root@JARVICENAE-0A0A1841:~/DIGITS# python -m digits.download_data cifar100 .

输出;

Downloading url=http://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz …Uncompressing file=cifar-100-python.tar.gz …Extracting images file=./cifar-100-python/train …Extracting images file=./cifar-100-python/test …Dataset directory is created successfully at ‘.’Done after 65.3251469135 seconds.

让我们来看看下载的数据集。虽然我没有显示上面列出的其他目录,但假设它们已经下载并存在。

root@JARVICENAE-0A0A1841:~/DIGITS# ls fine/train | headappleaquarium_fishbabybearbeaverbedbeebeetlebicyclebottle

让我们用下载的预训练数据集(CIFAR-100)创建一个新的分类数据集。

New Image Classification Dataset on DIGITS

这里,/root/DIGITS/fine/train 路径是我们数据集的路径。还要注意“单独的测试图像文件夹”选项,并指定/root/DIGITS/fine/test 目录。您还可以为此数据集指定一个名称,例如“Cifar100”(未在上面的屏幕截图中显示)。

当您单击 Create 时,将启动一个创建培训数据库的新作业,如下所示。

Job status

上图中右侧窗格显示了相关作业的状态。完成后,您的 DIGITS 主屏幕现在应该显示该数据集可供使用。

创建新的图像分类模型

让我们用我们创建的 CIFAR-100 数据集创建一个名为“分类图像”的新图像分类模型。我们将为该模型使用预构建的 AlexNet 神经网络架构。

New image classification model

单击“Create ”(创建)后,一个新的作业会像以前一样启动。下面的屏幕截图显示了名为“Train Caffe Model”的作业的状态。

Job status of new image classification model

随着培训的进行,工作状态将在下图中更新。随着时间的推移,我能够看到准确性的提高。

Training your model

一段时间后,当作业完成时,您将能够上传测试图像并根据您的模型对其进行分类。一个示例图像(一个青苹果)正在上传,结果立即可见。

Sample image classification

对于像 CIFAR-100 这样的小数据集来说,这是相当好的精度,当使用较大的数据集时,可以预期更好的精度值。

我想写一个更短的第三部分来展示火炬的好处。时间会证明一切。

如果你喜欢这首曲子,请鼓掌👏🏻(可以不止一次鼓掌)!你也可以在网上的某个地方分享,这样其他人也可以阅读。

本网站上的帖子是我自己的,不一定代表 IBM 的立场、策略或观点。

作者:乌彭德拉·拉詹

Keras 图像分类基础

原文:https://towardsdatascience.com/basics-of-image-classification-with-keras-43779a299c8b?source=collection_archive---------1-----------------------

在我之前的帖子中,我深入研究了人工神经网络的一些理论概念。在这篇文章中,我将解释一些你在 keras 中经常需要的常见操作。首先,如何保存模型并在以后使用它们进行预测,显示来自数据集的图像,从我们的系统加载图像并预测它们的类别。

如果您还没有启动 IDE,请继续阅读。

保存模型

训练模型是一个非常缓慢的过程,没有人希望每次都这样做,幸运的是,我们只需要训练我们的模型一次,保存它,然后我们可以随时加载它,并用它来预测新的图像。

Keras 以. h5 格式保存模型,所以如果您在我发布的第一篇教程中跳过了安装 h5py,请运行

pip3 install h5py

我们还需要 matplotlib 来可视化我们的图像,因此,运行

pip3 install matplotlib

这是第一个教程的代码

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD (train_x, train_y) , (test_x, test_y) = mnist.load_data()
#train_x = train_x.astype('float32') / 255
#test_x = test_x.astype('float32') / 255print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)accuracy = model.evaluate(x=test_x,y=test_y,batch_size=32)print("Accuracy: ",accuracy[1])

要保存模型,只需在 model.fit()后添加以下内容

model.save("mnist-model.h5")

推理

推理是指使用我们的模型预测新图像的过程。

在代码中,注释掉

model.fit

取而代之的是

model.load_weights("mnistmodel.h5")

我们的代码现在看起来像这样

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD(train_x, train_y) , (test_x, test_y) = mnist.load_data()
#train_x = train_x.astype('float32') / 255
#test_x = test_x.astype('float32') / 255print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnist-model.h5")
#model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)#model.save("mnistmodel.h5")accuracy = model.evaluate(x=test_x,y=test_y,batch_size=32)print("Accuracy: ",accuracy[1])

我们在这里做的是从保存的模型文件中加载模型的参数,evaluate 函数在测试数据集上运行预测,并返回我们预测的准确性。

到目前为止,我已经演示了如何保存模型并在以后使用它们进行预测,然而,这都是些无聊的东西,真正的问题是能够加载特定的图像并确定它属于哪个类。

第一步是添加下面的代码,从测试中获得特定图像的预测

img = test_x[130]
test_img = img.reshape((1,784))img_class = model.predict_classes(test_img)
prediction = img_class[0]classname = img_class[0]print("Class: ",classname)

在这里,我们只是从测试集中选取一个随机图像,在这个例子中,在索引 130 处,我们创建一个展平的副本,它被整形为

(1,784)

我们把这个拷贝输入到我们的模型中,然后我们得到预测并打印出来。

注释掉代码中的 model.evaluate,添加上面的代码并运行它。

您的输出应该是这样的:

Class: 6

现在我们有了预测,我们使用 matplotlib 来显示图像及其预测的类

img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

这里的整形操作对于 matplotlib 显示图像是必要的

您更新的代码应该都是这样的

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt (train_x, train_y) , (test_x, test_y) = mnist.load_data()train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnistmodel.h5")img = test_x[130]
test_img = img.reshape((1,784))img_class = model.predict_classes(test_img)
prediction = img_class[0]classname = img_class[0]print("Class: ",classname)img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

运行这个,你的输出应该是这样的

就是这样!非常简单,我们已经建立了一个基本的数字识别系统。

我鼓励您尝试测试图像的不同索引,亲自看看结果会是什么。

但是,如果我们想要引入一个不包含在测试集中的图像,对于这个测试,请将下面的图像保存到您的系统中,并将其复制到 python 文件所在的目录中。

运行下面的代码

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt
from keras.preprocessing import image (train_x, train_y) , (test_x, test_y) = mnist.load_data()train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnistmodel.h5")img = image.load_img(path="testimage.png",grayscale=True,target_size=(28,28,1))
img = image.img_to_array(img)
test_img = img.reshape((1,784))img_class = model.predict_classes(test_img)
prediction = img_class[0]classname = img_class[0]print("Class: ",classname)
img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

你可能会注意到一些新的东西,首先我们从 keras.preprocessing 导入图像

接下来我们添加了

img = image.load_img(path="testimage.png",grayscale=True,target_size=(28,28,1))
img = image.img_to_array(img)

在第一行中,我们从磁盘加载图像,并指定它的大小应该调整为 28 x 28 x 1,记住这是原始 mnist 图像的大小,所以我们保持不变是有好处的。

接下来,我们将图像转换成像素数组,就这样。

运行它并亲自检查结果,看预测值是否为 3。

任何问题或评论请在下面的评论框中留下,你也可以通过 twitter 联系我,电话: @johnolafenwa

如果你喜欢这个教程,给一些掌声。

下一篇文章将是关于使用卷积神经网络,这将把我们的准确率提高到 99%以上!!!保持联系就好。

使用 Python 的 Scikit-Learn 实现进行图像识别的基础知识

原文:https://towardsdatascience.com/basics-of-image-recognition-using-pythons-scikit-learn-implementation-5efcff465b64?source=collection_archive---------2-----------------------

随着机器学习和大数据分析的名气越来越大,非结构化数据分析的一个更受研究的领域是图像处理和识别。如果我们在网上看看,我们的安全部门正在努力改善图像识别,我们的智能手机使用面部识别改善图像捕捉,并使用谷歌的 TensorFlow 进行各种图像分类。

如果你一直在关注我的博客,你现在应该意识到我是 Python 的超级粉丝。虽然 Python 不是神经网络应用的最佳语言,但它仍然为快速软件开发和理解机器学习概念提供了简单的语法。Python 在许多机器学习应用程序中非常受欢迎,这仅仅是因为它的简单性及其 Scikit-Learn 机器学习库的广泛社区。

因此,我使用 MNIST 数据集为完全不熟悉图像识别的人开发了一个简单的介绍教程:

篮球分析:最好的选秀课程

原文:https://towardsdatascience.com/basketball-analytics-the-best-draft-class-13a6eac0cdb5?source=collection_archive---------9-----------------------

使用 Python 创建数据可视化

Photo by Tim Mossholder on Unsplash

介绍

NBA 内幕是电视上最好的节目。嗯,如果你热爱篮球,这是最好的节目。艾美奖获奖节目遵循了 NBA 年度最大的一些比赛的赛前和赛后分析。由厄尼·约翰逊主持,该节目涵盖了各种 NBA 话题,包括对其他工作室分析师的批判性分析:前 NBA 冠军奥尼尔和史密斯。哦,还有一个叫查尔斯·恰克·巴克利的家伙。让这个节目如此吸引篮球迷的是分析师之间的化学反应。这个节目包括 70%的篮球话题,25%的无意义话题(大部分是垃圾话题),还有 5%是厄尼试图让每个人都抓住主题。前一秒,工作人员还在谈论西部决赛的第二场比赛,然后转而谈论你应该多久给你的油箱加一次油。说真的,他们花了超过 2 分钟来谈论这个!

NBA 内部人员不断提出的一个持续的话题是老学校与新学校的辩论。沙克、肯尼和查克将会持续几天谈论他们那个时代的 NBA 球员是如何变得更好、更强,以及更有竞争力。现在,我将通过一些数据可视化来测试这一争论。还有什么更好的方法来解决与一些 Python 的争论呢!好吧,这听起来可能没什么意思,但我会努力让这个分析物有所值。

为了进行这种分析,我将只着眼于 3 个最好的 NBA 选秀(无可争议):1984 年,1996 年和 2003 年。为什么?嗯,他们每个人都有一些有史以来最伟大的球员。1984 年有哈基姆·阿卜杜尔·奥拉朱旺、查尔斯·巴克利,当然还有“山羊”迈克尔·乔丹(有争议?可能)。1996 年有阿伦艾弗森,史蒂夫纳什和科比布莱恩特。2003 年有德韦恩·韦德、克里斯·波什和勒布朗·詹姆斯(是的,我是湖人球迷)。除了是有史以来最好的选秀班,这些选秀班都代表了 NBA 不同的时代。

分析数据来自篮球参考。篮球参考从他们的网站为球迷和分析家提供统计数据,这意味着所有的统计数据都是官方的。还包括金州勇士队在 2016 NBA 总决赛3-1 领先克利夫兰骑士队的事实。但这个讨论是另一个时间。

注意:这篇文章使用的所有代码都可以在 GitHub 上找到,组织在这个笔记本上。

数据清理

我们从组织数据开始分析。

第一个数据集包含了过去 68 年来所有 NBA 球员的数据,从 1949-50 赛季开始,到 2016-17 赛季结束。

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltseasons = pd.read_csv('Seasons_Stats.csv')
seasons.head()

马上就有很多数据不会用到。分析将集中于 20 世纪 80 年代及以后的球员。因此,我将只包括那个时期的球员数据。

years = list(range(1980,2018))
seasons = seasons[seasons['Year'].isin(years)]
seasons.head()

在一个 NBA 赛季中有不同类型的球员。有所有的明星球员,角色球员,和板凳球员。后者其实并不那么重要(除非你的团队中有罗伯特·萨克雷)。对于这个分析,我想把重点放在有某种影响的球员身上。因此,我将包括在 NBA 赛季中每场比赛至少打 20 分钟的球员。为此,我需要为每场比赛的分钟数(MPG)创建一个新列。

seasons['MPG'] = round(seasons['MP'] / seasons['G'], 1)seasons = seasons[seasons['MPG'] >= 20]
seasons.head()

我需要从我们的分析中排除的另一个方面是赛季总数。每当一个球员在 NBA 赛季中通过交易或买断为两个或更多的球队效力时,就会添加一个新行来显示球员的赛季总数。例如,2013 年,乔纳森·克雷则·雷迪克,也被称为 J.J .雷迪克(你可能不知道他的名字是乔纳森),在交易截止日期前从奥兰多魔术队被交易到密尔沃基雄鹿队。因此,数据显示相同季节的多个条目(包括一个总计条目)。

seasons[(seasons['Player'] == 'J.J. Redick') & (seasons['Year'] >= 2013)]

我将删除这些行,因为我们将在后面的分析中按球员分组统计数据。此外,我将删除一个特殊的字符,这是包括在一些球员的名字。

seasons = seasons.drop_duplicates(['Player','Year'], keep = 'first')seasons[(seasons['Player'] == 'J.J. Redick')]

第二个数据集由球员信息组成,包括球员在 NBA 打球的时间段。为了分析,我将包括 1984 年,1996 年和 2003 年被选中的每一个球员。在这里,我通过包括每个球员的新秀年来选择选秀年。例如,迈克尔·乔丹在 1984 年被选中,但是数据显示他的新秀年是 1985 年。

players = pd.read_csv('player_data.csv')years_draft = [1985, 1997, 2004]players.columns = ['Player', 'Rookie Year', 'Final Year',  'Position', 'Height','Weight','DOB','College']players = players[players['Rookie Year'].isin(years_draft)]players['Player'] = players['Player'].str.replace('*','') ### Remove special character

对于数据清理过程的最后一部分,我将创建一个新的数据表,其中包含一些我们将要分析的统计数据。因为我将按选秀级别比较 NBA 球员的职业统计数据,所以我将按选秀级别分组。

data = seasons[['Year', 'Player','G','MP','PER', 'TS%', 'FG%', '3P%','2P%', 'eFG%','OWS', 'DWS', 'WS', 'WS/48',
                'USG%','OBPM', 'DBPM', 'BPM', 'VORP']]
data = data[data['Year'].isin(years)]
data['Year'] = data['Year'].astype(object)data_draft = players.merge(data, on = 'Player')data_draft['Rookie Year'] = data_draft['Rookie Year'] - 1 ### Set the Year to the correct draft classf = {'G': ['sum'],'MP': ['sum'],'PER': ['mean'], 'TS%': ['mean'], 'FG%': ['mean'], '3P%': ['mean'],'2P%': ['mean'], 
     'eFG%': ['mean'],'OWS': ['mean'], 'DWS': ['mean'], 'WS': ['mean'], 'WS/48': ['mean'],'USG%': ['mean'],
     'OBPM': ['mean'], 'DBPM': ['mean'], 'BPM': ['mean'], 'VORP': ['mean']}data_draft = data_draft.groupby(['Rookie Year'], as_index = False).agg(f)

分析

我们如何确定哪个草稿类是最好的?很容易简单地比较每个选秀球员的职业生涯得分、篮板和助攻总数。这真的能告诉我们某个选秀职业的球员比其他人更优秀吗?大概不会。为了分析选秀职业,我想使用考虑到游戏其他方面的数据。这是用于分析的 3 个最好的统计数据:球员效率等级(PER),对替补球员的价值(VORP),以及每 48 分钟的赢球份额(WS/48)。

玩家效率等级(PER)

PER 是霍林格创造的一个统计数据,它考虑了诸如投篮命中率、罚球、三分球、助攻、篮板、盖帽和抢断等成绩,以及诸如投篮不中、失误和个人犯规等负面结果。顾名思义,这个属性评估一个球员在场上的影响力。让我们来看一下,迈克尔·乔丹和勒布朗·詹姆斯是 PER 的职业领袖。所以,这是这个分析的可靠指标。

*per = data_draft.sort_values([('PER','mean')], ascending = False).reset_index()
pos = list(range(len(per['PER','mean'])))plt.style.use('fivethirtyeight')
fig, ax = plt.subplots(figsize = (15,8))
plt.bar(pos, per['PER','mean'], width = 0.75, alpha = 0.75, label = per['Rookie Year'], edgecolor = 'gray', linewidth = 2)
for i in pos:
    plt.text(pos[i], 6, s = per['Rookie Year'][i],ha='center', va='bottom', color = 'orange', size = 50)
plt.text(x = -0.68, y = 19.5, s = 'Total Career PER - 1984 Draft Class lead in efficiency',fontsize = 30, weight = 'bold', alpha = .75)
plt.text(x = -0.68, y = 18.3, s = 'Total Career PER for all NBA players drafted in 1984, 1996, and 2003',fontsize = 19, alpha = .85)
plt.text(x = -0.68, y = -1.5, s = 'National Basketball Association                                                                                       Source: Basketball-Reference.com ', fontsize = 17,color = '#f0f0f0', backgroundcolor = 'grey')
plt.xticks([],[])
ax.set_ylabel('PER', size = 25)*

价值超过替补队员(VORP)

VORP 是一名球员在替补级别球员之上贡献的每 100 场球队财产点数的盒子分数估计,转换为平均球队并按比例分配给 82 场比赛的赛季。这相当于棒球中的战争,它表明了一个球员对他们球队的总贡献。

*vorp = data_draft.sort_values([('VORP','mean')], ascending = False).reset_index()
pos1 = list(range(len(vorp['VORP','mean'])))plt.style.use('fivethirtyeight')
fig, ax = plt.subplots(figsize = (15,8))
plt.bar(pos1, vorp['VORP','mean'], width = 0.75, alpha = 0.75, label = vorp['Rookie Year'], edgecolor = 'gray', linewidth = 2)
for i in pos1:
    plt.text(pos1[i], .6, s = vorp['Rookie Year'][i],ha='center', va='bottom', color = 'orange', size = 50)
plt.text(x = -0.68, y = 2.55, s = 'Total Career VORP - Jordan and friends keep dominating',fontsize = 30, weight = 'bold', alpha = .75)
plt.text(x = -0.68, y = 2.4, s = 'Total Career VORP for all NBA players drafted in 1984, 1996, and 2003',fontsize = 19, alpha = .85)
plt.text(x = -0.7, y = -.15, s = 'National Basketball Association                                                                                       Source: Basketball-Reference.com ', fontsize = 17,color = '#f0f0f0', backgroundcolor = 'grey')
plt.xticks([],[])
ax.set_ylabel('VORP', size = 25)*

每 48 分钟赢得股份(WS/48)

WS/48 是一个简化了玩家每 48 分钟产生的胜利份额数(相当于一场 NBA 比赛)的统计。像 VORP 一样,win shares 计算玩家对团队胜利的总体贡献。由于每个玩家的上场时间不同,WS/48 调整了统计数据来帮助玩家之间的比较。

*ws = data_draft.sort_values([('WS/48','mean')], ascending = False).reset_index()
pos = list(range(len(ws['WS/48','mean'])))plt.style.use('fivethirtyeight')fig, ax = plt.subplots(figsize = (15,8))
plt.bar(pos, ws['WS/48','mean'], width = 0.75, alpha = 0.75, label = ws['Rookie Year'], edgecolor = 'gray', linewidth = 2)
for i in pos:
    plt.text(pos[i], 0.045, s = ws['Rookie Year'][i],ha='center', va='bottom', color = 'orange', size =50)plt.text(x = -0.7, y = 0.145, s = 'Total Career WS/48 - We get it. 1984 is the best draft class',fontsize = 30, weight = 'bold', alpha = .75)
plt.text(x = -0.7, y = 0.135, s = 'Total Career WS/48 for all NBA players drafted in 1984, 1996, and 2003',fontsize = 19, alpha = .85)
plt.text(x = -0.71, y = -.012, s = 'National Basketball Association                                                                                       Source: Basketball-Reference.com ', fontsize = 17,color = '#f0f0f0', backgroundcolor = 'grey')
plt.xticks([],[])
ax.set_ylabel('WS/48', size = 25)*

结论

好吧,当沙克、肯尼和查尔斯说过去的球员更好的时候,他们可能有一点道理。虽然我的分析显示 1984 年的选秀班在 PER、VORP 和 WS/48 中表现更好,但还是有一些问题。首先,现在 NBA 中的一些规则在过去并不存在。例如,在 20 世纪 90 年代早期,三分球犯规、畅通无阻犯规和防守三秒规则都不是 NBA 的一部分。这些规则中的每一条都会导致额外的罚球,这可能会增加或减少你的 PER(取决于是否罚球)。

我应该在做分析之前提出这些问题吗?也许吧。然而,这证明了我分析的全部观点:让我们停止比较几代人,享受这场表演吧!所有这些代人都是不同的,这是篮球最好的部分。魔法和鸟是不同的。乔丹是不同的。勒布朗不一样。斯蒂芬库里是不同的。篮球不应该太关注过去,而应该更多的关注未来。

批量标准化

原文:https://towardsdatascience.com/batch-normalization-8a2e585775c9?source=collection_archive---------0-----------------------

这个想法是,我们不只是将网络的输入标准化,而是将网络中层的输入标准化。它被称为“批量”归一化,因为在训练期间,我们通过使用当前小批量中的值的均值和方差(通常是零均值和单位方差)来归一化每一层的输入。

批量标准化的好处

批量归一化优化网络训练。已经证明它有几个好处:

  1. 网络训练更快 —每次训练迭代实际上会更慢,因为正向传递过程中需要额外的计算,反向传播过程中需要训练额外的超参数。然而,它应该收敛得更快,所以训练应该更快。
  2. 允许更高的学习速率 —梯度下降通常需要较小的学习速率来使网络收敛。随着网络越来越深,它们的梯度在反向传播过程中变得越来越小,因此它们需要更多的迭代。使用批量标准化允许我们使用更高的学习率,这进一步提高了网络训练的速度。
  3. 使权重更容易初始化 —权重初始化可能会很困难,在创建更深的网络时甚至更困难。批量标准化似乎允许我们在选择初始权重时不那么小心。
  4. 使更多的激活功能变得可行 —一些激活功能在某些情况下不能很好地工作。Sigmoids 很快就会失去梯度,这意味着它们不能用于深层网络。ReLUs 经常在训练中消失,在那里他们完全停止学习,所以我们需要小心输入他们的值的范围。因为批量标准化调节进入每个激活函数的值,在深度网络中似乎不太好工作的非线性实际上又变得可行了。
  5. 简化更深层次网络的创建 —由于上面列出的前 4 项,当使用批量标准化时,更容易建立和更快地训练更深层次的神经网络。事实证明,更深的网络通常会产生更好的结果,这很好。
  6. 提供一点规范化 —批量规范化会给你的网络增加一点噪音。在某些情况下,比如在初始模块中,批处理规范化已经被证明和删除一样有效。但是一般来说,将批量规范化视为一种额外的规范化,可能允许您减少一些可能添加到网络中的丢失。
  7. 总体上可能给出更好的结果 —一些测试似乎显示批量标准化实际上提高了训练结果。然而,它确实是一种帮助更快训练的优化,所以你不应该认为它是一种让你的网络变得更好的方法。但由于它让你更快地训练网络,这意味着你可以更快地迭代更多的设计。它还能让你建立更深层次的关系网,这通常会更好。因此,当你把所有因素都考虑进去时,如果你用批量规范化来构建你的网络,你可能会得到更好的结果。

我们在fully_connected函数中给层添加了批量标准化。以下是一些要点:

批量归一化的图层不包含偏差项。在 tf.layers.conv2d()和 tf.layers.dense()中设置 use_bias=False

TensorFlow 有[tf.layers.batch_normalization](https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization)函数来处理数学。

我们告诉tf.layers.batch_normalization网络是否在训练。这是重要的一步。

我们在调用激活函数的之前添加了规范化

def conv_layer(prev_layer, layer_depth, is_training):
  conv_layer = tf.layers.conv2d(prev_layer, layer_depth*4, 3, strides, 'same', use_bias=False, activation=None)
  conv_layer = tf.layers.batch_normalization(conv_layer, training=is_training)
  conv_layer = tf.nn.relu(conv_layer)

学分:来自课堂讲稿:https://classroom.udacity.com/nanodegrees/nd101/syllabus

批量规范化:理论和如何与 Tensorflow 一起使用

原文:https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad?source=collection_archive---------2-----------------------

“time-lapse photography of highway road” by Clément M. on Unsplash

不久前,深度神经网络还很难训练,在合理的时间内让复杂的模型收敛是不可能的。如今,我们有许多技巧来帮助他们收敛,实现更快的训练,并解决当我们想要训练深度学习模型时出现的任何类型的麻烦。本文将探讨其中的一个技巧:批量规范化。

为什么你应该使用它

为了理解什么是批处理规范化,首先我们需要解决它试图解决的问题。

通常,为了训练一个神经网络,我们对输入数据做一些预处理。例如,我们可以将所有数据标准化,使其类似于正态分布(也就是说,零均值和一元方差)。我们为什么要做这个预处理?原因有很多,其中一些是:防止像 sigmoid 函数这样的非线性激活函数过早饱和,确保所有输入数据都在相同的值范围内,等等。

但是问题出现在中间层,因为激活的分布在训练期间不断变化。这减慢了训练过程,因为每一层都必须在每个训练步骤中学会适应新的分布。这个问题被称为内部协变移位

那么…如果我们强制每一层的输入在每一个训练步骤中具有近似相同的分布,会发生什么?

事实真相

批量标准化是一种我们可以用来标准化每一层输入的方法,以解决内部协变量偏移问题。

在训练期间,批处理规范化层执行以下操作:

  1. 计算层输入的平均值和方差。

Batch statistics for step 1

2.使用之前计算的批次统计数据对图层输入进行归一化。

Normalization of the layers input in step 2

3.缩放和移动以获得层的输出。

Scaling and shifting the normalized input for step 3

请注意, γβ 是在训练期间学习的以及网络的原始参数。

所以,如果每批有 m 个样品,那么 j 批:

Inference formulas

编辑:在测试(或推断)时,均值和方差是固定的。使用之前计算的每个训练批次的平均值和方差来估计它们。

我们如何在 Tensorflow 中使用它

幸运的是,Tensorflow API 已经在TF . layers . batch _ normalization层中实现了所有这些数学运算。

为了在您的模型中添加批处理规范化层,您只需使用以下代码:

获得 Tensorflow 文档中所述的更新 ops 非常重要,因为在训练时间内,必须更新层的移动方差和移动平均值。如果不这样做,批量标准化将无法工作,网络将无法按预期训练

声明一个占位符来告诉网络它是处于训练时间还是推理时间也是有用的(我们已经讨论过训练和测试时间的区别)。

注意这一层有很多 更多的参数(你可以在文档中查看它们),但是这些是你应该使用的基本工作代码。

参考

如果您对批量标准化感到好奇,我建议您看看这篇论文和视频:

请随时关注我的 Twitter 或 LinkedIn T21,让我知道你对这篇文章的看法。感谢阅读!

深度学习框架之战——第一部分:2017,更多框架和接口

原文:https://towardsdatascience.com/battle-of-the-deep-learning-frameworks-part-i-cff0e3841750?source=collection_archive---------1-----------------------

深度学习的格局在不断变化。Theano 是第一个被广泛采用的深度学习框架,由深度学习的先驱之一 Yoshua Bengio 领导的 MILA 创建和维护。然而,事情发生了变化。今年 9 月,MILA 宣布在发布最新版本后,将不会在 2018 年对 Theano 进行进一步的开发工作。这个消息并不意外。在过去的几年中,不同的开源 Python 深度学习框架被引入,通常由大型科技公司之一开发或支持,其中一些获得了很多关注。

State of open source deep learning frameworks in 2017

目前,谷歌的 TensorFlow 似乎是最常用的深度学习框架——基于 Github stars & forks 和堆栈溢出活动。一些人预计,随着 TensorFlow 的推出,谷歌将主导市场多年。然而,看起来其他框架也吸引了越来越多的热情用户。最值得一提的可能是 PyTorch 的引进和成长。PyTorch 由脸书等公司于 2017 年 1 月推出。它是流行的 Torch 框架(用 C 实现,用 Lua 封装)的移植,Torch 二进制文件用 GPU 加速的 Python 封装。

除了 GPU 加速和内存的有效使用,PyTorch 流行背后的主要驱动力是动态计算图的使用。这些动态计算图已经被其他鲜为人知的深度学习框架使用,如 Chainer。这些动态图的优点在于,这些图是由运行定义的(“由运行定义”),而不是传统的“定义并运行”。特别是在输入可能变化的情况下,例如对于文本这样的非结构化数据,这是非常有用和高效的。

PyTorch dynamic computational graph — source: http://pytorch.org/about/

其他科技巨头也没有坐以待毙。微软开发了一个名为 CNTK 的内部深度学习框架,并在更名为微软认知工具包后于 2017 年正式推出 2.0 版本。2017 年,脸书也推出了咖啡馆 2 。它是著名的 Caffe 框架的继承者。最初的 Caffe 框架是由 Berkeley Vision and Learning Center 开发的,在它的社区、它在计算机视觉中的应用以及它的模型动物园(一组预先训练好的模型)中非常受欢迎。然而,似乎咖啡 2 还没有步咖啡的后尘。

另一个流行的深度学习框架是 MXNet ,由微软和亚马逊支持。MXNet 已经存在一段时间了,但是当 MXNet 被称为深度学习框架时,我经常听到人们回应“那不是 R 的深度学习框架吗?”。是的,但不止如此。它实际上支持许多语言,从 C++到 Python、JavaScript、Go,事实上还有 MXNet 突出的地方是它的可伸缩性和性能(请继续关注第二部分,在那里我们将比较最流行的框架的速度和其他指标)。

这些只是众多框架中的一小部分。其他开源深度学习框架包括 Deeplearning4j 和 Dlib(基于 C++的)。同样在 2017 年,谷歌的 DeepMind 发布了 Sonnet(基于 TensorFlow 构建的高级面向对象库)。其他值得一提的框架还有 H20.ai 和 Spark。

Straightforward model building with Keras — source: https://github.com/keras-team/keras

除了所有这些框架,我们还有包装在一个或多个框架周围的接口。深度学习最广为人知和广泛使用的界面毫无疑问是 Keras 。Keras 是一个高级深度学习 API,用 Python 编写,由谷歌深度学习研究员 Franç ois Chollet 创建。谷歌在 2017 年宣布选择 Keras 作为 TensorFlow 的高层 API。这意味着 Keras 将包含在下一个 TensorFlow 版本中。除了 TensorFlow,Keras 还可以使用 Theano 或 CNTK 作为后端。

Keras 很强大,因为通过堆叠多个层来创建深度学习模型真的很简单。当使用 Keras 时,用户不需要做层背后的数学计算。这似乎是快速原型制作的理想选择,Keras 也是 Kaggle 竞赛中的流行工具。

因此,一方面,我们目前有高级别的 Keras API,可以让您轻松构建简单和高级的深度学习模型,另一方面,低级别的 TensorFlow 框架可以让您在构建模型时更加灵活。两者都有谷歌的支持。正如预期的那样,竞争并没有坐以待毙,2017 年 10 月,微软和亚马逊的 AWS 联合发布了 Gluon API。Gluon 是一个高级 Python 深度学习接口,它包装了 MXNet,很快它还将包括微软的 CNTK。胶子是 Keras 的直接竞争对手,尽管 AWS 声称他们强烈支持所有深度学习框架,但他们当然将赌注押在胶子上,以实现人工智能的民主化。

Stacking convolutional and dense layers and parameter initialization with Gluon

令人惊讶的是,如今 TensorFlow 最大的竞争对手似乎是 PyTorch。随着社区对 PyTorch 越来越感兴趣,例如,在 Kaggle 的最新比赛中,用户经常选择使用 PyTorch 作为他们解决方案的一部分,并且它也被用于最新的研究论文中,因此 TensorFlow 于 2017 年 10 月推出了 Eager Execution 。TensorFlow 的“运行定义”界面。通过此次发布,谷歌希望赢回爱上 PyTorch 及其动态图形的用户。

对于热门深度学习课程 fast.ai 的开发者来说,这种变化来得太晚了。9 月, fast.ai 宣布从 Keras & TensorFlow 切换到 PyTorch 。fast.ai 的创始研究员、Kaggle 的前总裁兼首席科学家杰瑞米·霍华德认为 PyTorch 将能够保持领先地位。只有时间能证明一切。

有了这些深度学习框架,新来者选择一个框架可能会很有挑战性。坦率地说,即使是经验丰富的研究人员和开发人员也很难跟上最新的发展。一个积极的消息是开放神经网络交换(ONNX) 的发布。ONNX 于 2017 年 9 月宣布,并于 12 月发布了 V1,是一种表示深度学习模型的开放格式。这允许用户更容易地在不同的框架之间移动模型。例如,它允许您构建 PyTorch 模型,并使用 MXNet 运行该模型进行推理。

Open Neural Network Exchange (ONNX) Github page — source: https://github.com/onnx/onnx

ONNX 是由微软、AWS 和脸书等公司推出的。谷歌不在这个名单中并不令人惊讶。ONNX 从一开始就支持 Caffe2、Microsoft Cognitive Toolkit、MXNet 和 PyTorch,但是与其他开源项目一样,社区也已经为 TensorFlow 添加了一个转换器。

2017 年有很多令人兴奋的发展,这类似于深度学习和人工智能领域的快速发展。很难预测新的一年会发生什么。我们可能会看到一些整合,不过,大型科技公司肯定会希望使用和推广自己的技术。很高兴看到不同的框架,由不同的技术巨头支持,推动彼此更快地创新。在第二部分中,我们将根据不同的度量标准,如速度、内存使用、可移植性和可伸缩性,更详细地比较不同的框架。

最大似然估计的贝叶斯分类器

原文:https://towardsdatascience.com/bayes-classifier-with-maximum-likelihood-estimation-4b754b641488?source=collection_archive---------5-----------------------

监督学习的基本概念是给你带标签的数据来训练模型。并且我们假设有一个最优且相对简单的分类器,它将给定的输入映射到大多数输入的适当分类。训练模型后,目标是找到一个与最佳分类器一样有效的近似分类器,以便相同的分类器可以用于未标记/看不见的数据。

统计模型方法

开始时,标记的训练数据用于训练目的。利用测试数据,假设某个概率分布,并且预先计算其所需的参数,以便在分类器中使用。

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

当给定初始数据时,此处假设数据是独立选取且同分布的(i.i.d .),然后检查数据类型以决定可以使用什么概率模型。例如,如果数据是掷硬币,则使用伯努利模型,如果是掷骰子,则可以使用多项式模型。在我下面的例子中,使用了高斯模型,这是最常见的现象。为了确保分布是正态的,通常会进行正态性测试

在学习算法阶段,其输入是训练数据,输出是分类器所需的参数。为了从训练数据中选择分类器的参数,可以使用最大似然估计(MLE)、贝叶斯估计(最大后验概率)或损失准则的优化。在本文中,我将介绍一个使用最大似然估计贝叶斯分类器参数的例子。

使用最大似然估计分类器的参数

第一步是我们需要弄清楚什么是样本分布。给定一系列训练数据,假设正态高斯总体,sigma 和 mu 的估计值是多少?使用统计方法,我们将假设一个概率模型,这意味着我们将预测假设某个概率分布模型的数据的可能性有多大?然后,我们可以通过似然估计找到最佳拟合概率模型。

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf NOTE: L is for likelihood and P is for probability model

概率模型和可能性之间的差异:

(1)它们有不同的图形(2)当你对一个函数求导时,你对不同的变量求导(3) argmax 是针对不同的变量计算的。

值得注意的是,对于特定的θ和 X 值,似然函数和概率函数具有相同的输出(注意:我说的是一个特定的输出,而不是输出列表,因为它们的结果是不同的图形)。因此,给定参数θ,似然函数和概率函数的概率分布是相同的。在似然函数中,给定θ,你可以计算特征向量的概率分布。

单变量高斯例子

例如给定一个人的体重,这个人是男是女?

设 X 是一组重量数据。设 x_i 为第 I 个权重值。

设 Y 是一个类,y_0 是男性,y_1 是女性

分类器 : 贝叶斯分类器

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

argmax 选择提供最大输出值的输入。在这种情况下,给定一个权重值,它选择给出最高后验概率的性别。

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

利用贝叶斯定理,将 P[Y|X]替换为 P[X|Y]*P[Y]/P[X]。请注意,我们只对给出最高概率的 Y 值感兴趣,所以 P[X]不是我们感兴趣的,它独立于 P[Y]。所以,它可以从等式中去掉。

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

在对 y = y_0 计算上述等式一次和对 y = y_1 计算第二次之后,选择具有最高概率的 y 值。

但是我们不知道 PX|Y和 PY。这就是 MLE(最大似然估计)在估计这些概率时发挥作用的地方。

P[Y]的估计

P[Y]在学习阶段用最大似然估计。为了估计男性或女性的人口比例,使用 MLE 从训练数据计算男性或女性的比例。这里“m”是指男性群体,p 代表从测试数据中得到只有男性数据序列的概率,而(1-p)代表女性数据序列的概率。“n”代表总样本量。

为了得到 P[Y],即男性或女性的分数人口,似然函数的导数设置为 0,我们可以求解 P。然后我们得到 m/n 作为分数人口。

P[X | Y]的估计

P[X|Y]是得到体重输入数据的概率(不管有无标注),假设男性或女性。为了得到这个概率,我需要知道什么是(1)权重的总体概率分布以及(2)该分布所需的参数。假设概率分布为正态高斯分布;在本例中,单变量高斯分布。

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

但是我不知道 mu 和 sigma。因此,我将使用 MLE(最大似然估计)从我的训练数据中估计 mu 和 sigma 的值

Figure 5

每个模型是以给定的 x 值权重作为输入的 mu 和 sigma 的不同常数值的概率分布。请注意,权重的 x 值由似然函数提供。因为有无限对 mu 和 sigma,所以有无限多的这些模型。例如,假设女性的平均体重为 135 磅,给定的体重值为 110 磅,则输出概率约为 0.005。

http://www.wolframalpha.com/input/?i=plot+PDF%5BNormalDistribution%5B135,+15%5D,+x%5D+from+x+%3D+0+to+200

http://www.wolframalpha.com/input/?i=plot+PDF%5BNormalDistribution%5B135,+15%5D,+x%5D+from+x+%3D+0+to+200

似然函数所做的是采用具有 mu 和 sigma 值及其概率的模型,并输出获得 mu 和 sigma 的给定权重值的概率作为输入。

想象一下,图 5 围绕着一个 for 循环,它为每个模型运行;在这种情况下,无限数量的模型。结果,上面的三维图形被绘制出来。因为我们这里的目标是估计 sigma 和 mu 值,所以具有最高概率的 sigma 和 mu 值对(在图中具有峰值)将被选为估计值。

为了估计 sigma 和 mu 值,我们需要从似然函数图中找到最大值概率值,并查看 mu 和 sigma 值给我们的值。因此,我们对似然函数求导,将其设为 0,并求解 sigma 和 mu。然后这些值被用来计算 P[X|Y]。

多元高斯例子

例如给定一个人的体重 x 身高,这个人是男是女?

这与前面的例子非常相似。

首先,确定分类器为贝叶斯分类器。

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

P[Y =男性]和 P[Y =女性]是在学习算法阶段计算的类先验值。对于 P[X|Y =男性]和 P[X|Y =女性],在学习算法阶段估计多元高斯分布参数。

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

这是我们模型的概率分布:

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

这是可能性函数的图表:

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

贝叶斯分类器和朴素贝叶斯的区别:

与贝叶斯分类器不同,朴素贝叶斯假设特征是独立的。在我们的上述示例中,使用朴素贝叶斯,我们将假设体重和身高相互独立,并且其协方差为 0,这是多元高斯模型所需的参数之一。

现在的问题是为什么我们要使用贝叶斯分类器?因为它是最优分类器,这里证明的是。

那么这是否意味着我们的分类问题解决了?不会,因为我们需要极其多的数据根据赫夫丁不等式。

如果我希望我的错误率小于 20%,那么在从下面的不等式中求解 n 之后,我需要 10 个⁰⁰数据。注意:D 代表维度

如果我知道我的概率分布的一个参数/s,那么我应该从下面的等式中解出 n 来估计所需的最小数据量:

由于贝叶斯分类器的最优性需要太多的数据,分类问题仍在进行中。

如果您有任何反馈,请留下您的评论或给我发电子邮件至 logicdevildotcom@gmail.com

应用贝叶斯规则

原文:https://towardsdatascience.com/bayes-rule-applied-75965e4482ff?source=collection_archive---------1-----------------------

在现实世界问题上使用贝叶斯推理

贝叶斯推理的基本思想是用更多的数据变得“更少的错误”。这个过程很简单:我们有一个最初的信念,称为先验,当我们获得更多信息时,我们会更新它。虽然我们不认为这是贝叶斯推理,但我们一直在使用这种技术。例如,我们最初可能认为有 50%的机会在季度末获得晋升。如果我们从经理那里得到积极的反馈,我们会向上调整我们的估计,相反,如果我们把咖啡机弄得一团糟,我们可能会降低概率。随着我们不断收集信息,我们会改进我们的估计,以更接近“真实”的答案。

我们的直觉行为被形式化为一个简单而强大的等式,称为贝叶斯法则:

我们将左侧称为后验概率,作为给定事件 b 的事件 A 的条件概率。在右侧,P(A)是我们的先验,或事件 A 的概率的初始信念,P(B|A)是可能性(也是条件概率),我们从我们的数据中得出,P(B)是使概率分布总和为 1 的归一化常数。贝叶斯规则在统计语言中的一般形式是后验概率等于似然性乘以先验除以归一化常数。这个简短的等式引出了贝叶斯推理的整个领域,贝叶斯推理是一种对世界进行推理的有效方法。

虽然 A 和 B 可能是很好的占位符,但它们对让我们了解如何使用这个概念没有太大帮助。为了做到这一点,我们可以将贝叶斯规则应用于现实世界数据的问题。

我在自己的生活中一直在探索的一个问题是睡眠模式。我有来自我的 Garmin Vivosmart 手表的 2 个多月的数据,显示我何时入睡和醒来。在之前的一篇文章中,我用马尔可夫链蒙特卡罗(MCMC)方法计算出了我在给定时间睡着的概率。最终模型显示最有可能的睡眠时间分布(MCMC 是一种近似方法)如下。

这是我睡着的概率,只考虑时间。如果我们知道时间并且有额外的证据呢?知道我卧室的灯亮着会如何改变我睡着的概率?这就是我们使用贝叶斯规则来更新我们的估计的地方。对于特定时间,如果我们知道我卧室灯的信息,我们可以使用上面分布的概率作为先验,然后应用贝叶斯方程:

左边是后验概率,给定我卧室灯的状态(开或关),睡眠的条件概率。给定时间的概率将作为我们的先验,P(sleep),或者在没有额外信息的情况下我们使用的估计值。比如晚上 10 点,我睡着的先验概率是 27.34%。如果我们有更多的信息,我们可以使用从观测数据中得到的可能性P(bedroom light |sleep)来更新这些信息。根据我的习惯,我知道假设我睡着了,我卧室的灯亮着的概率大约是 1%。那就是:

假设我睡着了,我的灯熄灭的概率是1–0.01 = 0.99(这里我用减号(-)表示相反的情况。)这是因为条件概率分布的总和必须为 1。如果我们知道我睡着了,我卧室的灯要么开着,要么关着!

等式的最后一部分是归一化常数P(light)。这代表我的灯亮着的总概率。我的灯亮着有两种情况:我睡着了或者我醒着。因此,如果我们知道睡眠的先验概率,我们可以计算归一化常数为:

我的灯亮着的总概率考虑了我睡着时灯亮着的几率和我醒着时灯亮着的几率。(P(-sleep) = 1 — P(sleep)是我醒着的概率。)

假设我没有睡着,我的灯亮着的概率P(light | — sleep),也是通过观察确定的。在我的例子中,我知道如果我醒着,我卧室的灯有大约 80%的可能性是亮着的(这意味着如果我醒着,我的灯有 20%的可能性是不亮的)。

使用我的灯亮着的总概率,贝叶斯公式是:

假设我的灯亮着,这代表我睡着的概率。如果我的灯关了,那么我们用P(-light|...替换每一个P(light|...

只有单词的方程已经够多了,让我们看看如何将它用于数字!

如果我们知道我的灯是亮着的,我们将在晚上 10:30 应用这个等式。首先,我们使用时间计算我睡着的先验概率,得到的答案是 73.90%。先验为我们的估计提供了一个很好的起点,但是我们可以通过加入关于我的光的信息来改进它。知道我的灯亮着,我们可以用相关的数字填充贝叶斯方程:

我的灯亮着,这一事实极大地改变了我们对我睡着的概率的估计,从超过 70%变成了 3.42%。这显示了贝叶斯法则的力量:我们能够通过加入更多的信息来更新我们对形势的最初估计。尽管我们可能已经直观地做到了这一点,但从形式方程的角度来考虑它,可以让我们以严格的方式更新我们的信念。

让我们试试另一个例子。如果现在是晚上 9:45,我的灯关了怎么办?试着从 0.1206 的先验概率开始解这道题。

我没有总是手工做这个推断,而是写了一些简单的 Python 代码来做这些计算,你可以在 Jupyter 笔记本中玩这些计算。代码输出以下答案:

Time: 09:45:00 PM 	Light is OFF.

The prior probability of sleep:    12.06%
The updated probability of sleep:  40.44%

我们再次看到额外的信息改变了我们的估计。现在,如果我的妹妹想在晚上 9:45 打电话给我,她不知何故知道我的灯亮着,她可以参考这个等式来确定我是否会接电话(假设我总是在醒着的时候接电话)!谁说日常生活中不能用 stats?

看到数字结果是有帮助的,但是可视化也有助于使观点更加清晰。如果仅仅通过看方程式不能表达想法,我总是试图结合情节来表达想法。在这里,我们可以使用额外的数据来可视化睡眠的先验和条件概率分布。

当我的灯亮着的时候,曲线向右移动,表明在给定的时间我睡着的概率较低。同样,如果我的灯关闭,曲线会向左移动。从概念上理解一个统计概念可能是困难的,但是这个例子精确地说明了为什么我们使用贝叶斯法则。如果我们想减少对世界的错误,那么额外的信息应该改变我们的信念,贝叶斯推理使用系统的方法更新我们的估计。

使用更多的证据!

为什么停在我卧室的灯前?我们可以在模型中使用尽可能多的信息,它将继续变得更加精确(只要数据告诉我们一些关于这种情况的有用信息)。例如,如果我知道在我睡着的情况下,我的手机正在充电的可能性是 95%,我们可以将这一知识纳入模型。

这里,我们将假设我的手机正在充电的概率是给定我是否在睡觉的信息的情况下我的灯打开的概率的有条件独立(独立是一个稍微高级一点的概念,但它允许我们简化许多问题)。使用额外信息的贝叶斯方程被表达为:

这看起来有点吓人,但是使用一点 Python 代码,我们可以创建一个函数来为我们进行计算。我们在任何时候输入,以及我的灯是否亮着和手机是否在充电的任何组合,函数返回更新的我睡着的概率。

我将跳过数学(我让我的计算机来做)并显示结果:

Time is 11:00:00 PM 	Light is ON 	Phone IS NOT charging.

The prior probability of sleep:    95.52%
The updated probability of sleep:  1.74%

在晚上 11 点,没有额外的信息,我们几乎可以肯定地猜测我睡着了。然而,一旦我们有了我的灯亮着而手机没有充电的额外信息,我们就断定我睡着的可能性微乎其微。这是另一个查询:

Time is 10:15:00 PM 	Light is OFF 	Phone IS charging.

The prior probability of sleep:    50.79%
The updated probability of sleep:  95.10%

根据具体情况,概率会变低或变高。为了证明这一点,我们可以看看光和电话证据的四种配置,以及它们如何改变概率分布:

在这个图表中有很多信息,但是关键的想法是概率曲线根据证据而变化。随着我们获得更多的数据,我们可以进一步完善我们的估计。

结论

当只使用字母或虚构的情况给出抽象方程时,贝叶斯规则和其他统计概念可能难以理解。我上过很多课,贝叶斯法则都是用不太有用的例子来展示的,比如掷硬币或者从瓮中抽出彩球,但是直到这个项目,我才最终理解了贝叶斯推理的适用性。如果你正在纠结一个概念,寻找一个你可以应用它的环境,或者看看别人已经这样做的案例!

当我们把概念转化为问题时,真正的学习就来了。我们不仅可以通过这种方式学习新技能,还可以做一些非常酷的项目!数据科学的成功在于不断学习,将新技术添加到您的技能组合中,并找出不同任务的最佳方法。在这里,我们展示了贝叶斯推理如何让我们更新我们的信念来解释新的证据,以便更好地模拟现实。随着我们收集更多的证据,我们需要不断调整我们的预测,贝叶斯方程为我们提供了合适的框架。

一如既往,我欢迎反馈、讨论和建设性的批评。可以通过 Twitter @koehrsen_will 找到我。

贝叶斯定理:数据科学的圣杯

原文:https://towardsdatascience.com/bayes-theorem-the-holy-grail-of-data-science-55d93315defb?source=collection_archive---------1-----------------------

贝叶斯定理的直观推导

贝叶斯定理可能是数理统计和概率论领域中最重要的定理。由于这个原因,这个定理经常在数据科学领域得到应用。
在本文中,我将用一个实际问题来直观地推导贝叶斯定理。

如果你喜欢这篇文章,并想分享你的想法,问问题或保持联系,请随时通过 LinkedIn 联系我。

1。简介

以 18 世纪英国数学家托马斯·贝叶斯命名的阿耶斯定理是一个确定条件概率的数学公式。这个定理在数据科学领域有巨大的重要性。例如,贝叶斯定理的许多应用之一是贝叶斯推理,一种特殊的统计推理方法。

贝叶斯推理是一种方法,在这种方法中,随着更多的证据或信息变得可用,贝叶斯定理用于更新假设的概率。贝叶斯推理在广泛的活动中得到了应用,包括科学工程哲学医学体育和法律

在金融中,例如,贝叶斯定理可以用来对借钱给潜在借款人的风险进行评级。在医学中,通过考虑任何给定的人患病的可能性以及测试的总体准确性,该定理可用于确定医学测试结果的准确性。

现在让我们实际一点…

2.问题陈述

Con side 两个碗 XY ,里面放满橘子和蓝莓。在这种情况下,你确切地知道两个碗里各有多少橘子和蓝莓。

如果我问你从碗×碗 中挑出一个橘子的可能性有多大,你可以准确说出这个概率。由于碗中有 11 件物品×11 件 并且其中 3 件是橙子,所以挑选一个橙子的概率将是 p(橙子) =3/11。

Bowl X and Bowl Y filled with oranges and blueberries.

颠倒的情况

I pick blindly an item and get a blueberry.

但是如果我从一个随机的碗中选一样东西会怎么样呢?假设我摘了一颗蓝莓。你能说出蓝莓是从哪个碗里摘的概率吗?

这个问题可以用贝叶斯定理来回答。

3.贝叶斯定理推导

为了推导贝叶斯定理,我们要模拟一个实验。在这个实验中,我们掷骰子。每次骰子显示的数字小于或等于 4 时,我们将从碗中选择一个项目,对于数字大于或等于 5 时,我们将从碗 Y 中选择一个项目。而且我们要这样做 N =300 次。为了简化问题,我们引入以下缩写:

蓝莓:= B,橘子:= O,碗 X := X,碗 Y := Y

在我们掷骰子 N =300 次之后,我们将获得一些关于从两个碗中挑选的物品数量的统计结果。实验的假设结果如图 1 所示。此处的 s 代表一个碗或一个物品被挑选的“来源”。 y 为可观察变量(蓝莓或橙子)。

Fig. 1 Statistical results

该图告诉我们,我们已经选择了…

  • … 148 次碗里的一颗蓝莓 X: n(s= X ,y= B )=148
  • … 26 次碗里的蓝莓 Y: n(s= Y ,y= B )=26
  • …碗里一个橘子的 51 倍 X: n(s= X ,y= O )=51
  • …碗里一个橘子的 75 倍 Y: n(s= Y ,y= O )=75

鉴于这些统计数字,我们现在可以问一些有趣的问题…

从碗 X 中随机选取一个物品的概率是多少?

为了获得我们表示为 p(s=X) 的概率,我们必须将仅从碗 X 中拾取的物品数除以总拾取数 N =300。这里是 n(s= X ,y= B )=148X 和**中摘下的蓝莓数 n(s= X ,y =O= 51X**中摘下的橙子数

Eq. 1 Probability to pick an item from bowl X.

:这种概率称为“先验概率”。在贝叶斯统计推断中,先验概率是在收集新数据之前某一事件的概率。在这种情况下, p(s=X) 给出了从 X 中选择一个物品的概率,而不知道它到底是哪个物品。

因此,从 Y 中选择一个项目的概率 p(s=Y) 为:

Eq. 2 Probability to pick an item from bowl Y.

挑选一个橙子/蓝莓的概率有多大?

这一次,我们想知道在不考虑特定碗的情况下,选择橙子或蓝莓的可能性有多大。我们将这些概率表示为 p(y=O)p(y=B) 。计算类似于前一种情况。我们将特定商品的提货次数除以总提货次数。由此产生的概率由等式给出。3 和情商。4:

Eq. 3 Probability to pick an orange.

Eq. 4 Probability to pick a blueberry.

从 X 中挑出一颗蓝莓的概率有多大?

现在我们要计算联合概率 p(s=X,y=B) ,它告诉我们从 X 中采摘蓝莓的可能性。

:联合概率是事件 Nr.1 与事件 Nr 同时发生的概率。2 发生。在这种情况下,一个事件是从碰巧是 X 的碗中挑选。另一件事是我们摘了一颗蓝莓。

为了计算联合概率,我们需要将我们从 X 中采摘蓝莓的次数除以采摘的总次数:

Eq. 5 Probably to pick a blueberry from X.

因此,从 Y 中采摘蓝莓的概率为:

Eq. 6 Probably to pick a blueberry from Y.

X 中挑选一个橙子的概率是:

Eq. 7 Probably to pick an orange from X.

给定我们从 X 上摘的,它是蓝莓的概率是多少?

现在变得有趣了。我们计算第一个条件概率。在这种情况下,我们肯定知道我们从哪个碗中选择。在这种情况下,比方说,我们从 X 中选择。有了这些知识,我们可以计算出概率,告诉我们选择蓝莓的可能性。

这个条件概率表示为 p(y=B| s=X)s=X 是我们从 X 中挑选物品的条件。为了计算 p(y=B| s=X) 我们需要用从 X 中采摘的蓝莓的次数除以从 X 中采摘的商品总数:

Eq. 8 Probably to pick a blueberry, given that we pick from X.

乘积规则

是时候制定第一条重要的统计规则了。这里,我们采用之前推导出的从 X p(s=X,y=B) 中采摘蓝莓的概率,并通过在分母和分子中乘以( n(s=X,y=B)+n(s=X,y=O)) 来扩展该等式。我们可以这样做,因为概率 p(s=X,y=B) 的值不会因为这个扩展而改变。

现在,如果你仔细看看这个等式,你会注意到新的表达式由我们之前推导出的另外两个概率 p(y=B|s=X)p(s=X) 的乘积组成。

Eq. 9 Product rule

概率之间的这种关系叫做乘积法则。乘积法则允许我们利用条件概率 p(y=B| s=X) 和先验概率 p(s=X)来计算联合概率 p(s=X,y=B)

求和规则

现在让我们重温一下先验概率 p(s=X ) ,它给出了我们从 X 中选择任何项目的可能性。如果你把方程分成两个被加数,如方程第二行所示。10 你可以观察到,这两个被加数只不过是我们先前推导出的两个联合概率。

Eq. 10 Sum rule

这种关系叫做求和规则。求和规则允许通过对包含来自先前的随机变量 s=X 和任何其他随机变量 y 的联合概率求和来计算先前的 p(X) 概率。

贝叶斯规则

对于乘积规则,联合中随机变量的顺序无关紧要。因此 p(s,y)p(y,s) 具有相同的值。

如果我们使值 p(s,y)p(y,s) 相等,并做一些重组,我们得到一个新的数学表达式。p(s | y)的这个新表达式就是贝叶斯规则。

Eq. 12 Bayes’Theorem/Rule.

最后:蓝莓是从哪个碗里取的?

贝叶斯定理为我们提供了条件概率p(s | y)的计算公式,这就是我们最初问题的答案。**

我们摘了一颗蓝莓的事实可以用条件 y=B 来表示。为了回答蓝莓是从哪个碗里摘的这个问题,我们必须为 s=Xs=Y 计算 p(s|y=B)p(s|y) 的两个值都告诉我们蓝莓是从碗 X 或碗 Y 中采摘的可能性。

我们来做一下 s=X 的计算。幸运的是,我们需要的所有概率,我们已经在前面的章节中计算过了。如果我们将这些概率插入等式中的 p(s=X|y=B) 。13 我们得出以下结论:假设我们摘了一颗蓝莓,这颗蓝莓从碗 X 中摘下的概率约为 86 %。对于任何其他情况,可以类似地进行计算。**

Eq. 13 Bayes’Theorem

如果没有贝叶斯定理,p(s|y) 的计算将非常困难。然而,这个定理允许我们用更容易计算的概率来计算这个概率。这就是贝叶斯定理的神奇之处:难以计算的概率分布用非常容易计算的概率来表示。****

Bayesball:击球率的贝叶斯分析

原文:https://towardsdatascience.com/bayesball-bayesian-analysis-of-batting-average-102e0390c0e4?source=collection_archive---------5-----------------------

Photo by Joshua Peacock on Unsplash

除了我将附上的简短代码块,你可以在这篇文章的末尾找到整个 Jupyter 笔记本的链接。

我发现数据科学或统计学中的一个有趣但难以理解的主题是贝叶斯分析。在我的大会数据科学沉浸式训练营期间,我有机会探索贝叶斯统计,但我真的认为我需要一些复习和强化。

这是我个人的努力,以更好地理解贝叶斯思维,以及如何将它应用到现实生活中。

对于这篇文章,我的灵感主要来自于 Youtube 上的一个系列,作者是拉斯姆斯·贝斯,“贝叶斯数据分析介绍”。他真的很擅长让你对贝叶斯分析有一个直观的认识,不是用所有复杂的公式来轰炸你,而是给你提供一个贝叶斯统计的思维过程。

我为这篇文章选择的主题是棒球。老实说,我不是一个体育迷。我很少看体育比赛。作为一个韩国人,棒球是韩国最著名的运动,我相信在 MLB 也有一些韩国球员。承认这一点有点尴尬,但我听说过 Chan-Ho Park,但仅此而已。

那为什么选择棒球?

“我不知道你是否知道,但棒球的吸引力是小数点。没有其他运动像它那样完全依赖于连续性、统计数据和有序性。棒球迷比注册会计师更关注数字。”—体育记者吉姆·默里

他们说棒球可能是世界上记录最好的运动。历史累积了过去一百年棒球统计的记录。然而,仅仅收集数据并不能让棒球在统计学方面变得有趣。可能更重要的方面是游戏的个体性。例如,在击球时,谁在外场打球对击球手能否打出本垒打影响很小。在其他体育项目中,尤其是足球和篮球,个人数据的意义可能会被球场上其他地方发生的事情的重要性所冲淡。这就是棒球统计数据对球员比较有用的地方。

棒球统计数据由许多指标组成,有些很直接,有些很高级。我选择看一看的指标是击球率(AVG) 。在棒球运动中,平均击球率是由击球次数除以击球次数来定义的。通常报告到小数点后三位。

对击球率可能会有批评,但根据 C. Trent Rosecrans 的说法,“尽管如此,击球率相对于所有其他统计数据来说确实是历史和背景。我们都知道 0.300 的打者是什么,我们知道 0.200 的打者有多差,0.400 的打者有多棒。”

常规赛好像还没开始,马上就要开始了(3 月 29 日)。但是有春季训练。在美国职业棒球大联盟(MLB),春训是常规赛开始前的一系列练习和表演赛。

我想回答的问题如下:

  • 我应该如何解读 2018 春训的击球率
  • 我如何比较两个球员的击球率

在我进入代码之前,我将简要介绍一下 Rasmus B eth 在他的视频中解释了什么。

我们首先需要三样东西来实现贝叶斯分析。
1。数据
2。生成模型
3。在先的;在前的

在我的情况下,数据将是 2018 年春训的击球率记录。数据仅仅是我们观察到的。

创成式模型是在给定参数作为输入时生成数据的模型。这些参数是生成分布所需的值。例如,如果您知道平均值和标准偏差,您可以通过运行下面的代码轻松地生成所选大小的正态分布数据。稍后我们将看到其他类型的分布用于贝叶斯分析。

import matplotlib.pyplot as plt
import numpy as npmu, sigma = 0, 0.1 # mean and standard deviation
s = np.random.normal(mu, sigma, 1000)
plt.hist(s)

在贝叶斯分析的情况下,我们反转生成模型,并尝试用观察到的数据来推断参数。

Image Courtesy of Rasmus Bååth, “Introduction to Bayesian data analysis part 1

最后,先验是模型在看到数据之前所拥有的信息。任何概率都是同等可能的吗?或者我们有一些可以利用的先验数据吗?或者我们能做出什么有根据的猜测吗?

我将首先定义一个函数来为一个玩家抓取福克斯体育的统计页面。我将其定义为能够提取春训或常规赛的击球数据。

import pandas as pd
import seaborn as sns
import requests
from bs4 import BeautifulSoupplt.style.use('fivethirtyeight')%matplotlib inline
%config InlineBackend.figure_format = 'retina'def batting_stats(url,season):
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    table = soup.find_all("table",{"class": "wisbb_standardTable tablesorter"})[0]
    table_head = soup.find_all("thead",{"class": "wisbb_tableHeader"})[0]
    if season == 'spring':
        row_height = len(table.find_all('tr')[:-1])
    else:
        row_height = len(table.find_all('tr')[:-2])
    result_df = pd.DataFrame(columns=[row.text.strip() for row in table_head.find_all('th')], index = range(0,row_height)) 

    row_marker = 0
    for row in table.find_all('tr')[:-1]:
        column_marker = 0
        columns = row.find_all('td')
        for column in columns:
            result_df.iat[row_marker,column_marker] = column.text.strip()
            column_marker += 1
        row_marker += 1
    return result_df

现在来看看我该选谁来分析。

上面的屏幕是纽约大都会队的春季训练统计页面(正如我已经承认的,我对棒球知之甚少,我选择纽约大都会队是因为我喜欢它的标志)。如果你按照球员的击球率(AVG)来排列球员,你可以看到多米尼克·史密斯(DS)是第一名,加文·切基尼(GC)是第二名。他们是好运动员吗?我不知道。但是如果只看 AVG 的话,DS 1.000 AVG 是最好的。

但是通过谷歌搜索,我发现“近年来,全联盟的平均打击率通常在 0.260”左右徘徊。如果是这样,那么 DS 和 GC 的 AVG 似乎太高了。通过进一步观察两位球员的 At-Bats (AB),Hits (H),很明显 DS 只有 1 个 AB,CS 有 7 个。此外,通过进一步查看其他球员的 AB,2018 年最高 AB 为 13,2017 年纽约大都会队的最高 AB 为 60。

场景 1

假设我对他们过去的表现一无所知,唯一观察到的数据是 2018 年春训。我不知道我应该从 AVG 那里期待什么样的价值范围。基于此,我应该如何解读 2018 年春训的统计数据?

让我们刮一下 DS 的春季训练数据。

ds_url_st = "[https://www.foxsports.com/mlb/dominic-smith-player-stats?seasonType=3](https://www.foxsports.com/mlb/dominic-smith-player-stats?seasonType=3)"
dominic_smith_spring = batting_stats(ds_url_st,'spring')
dominic_smith_spring.iloc[-1]

n_draw = 20000
prior_ni = pd.Series(np.random.uniform(0, 1, size = n_draw)) 
plt.figure(figsize=(8,5))
plt.hist(prior_ni)
plt.title('Uniform distribution(0,1)')
plt.xlabel('Prior on AVG')
plt.ylabel('Frequency')

先验代表我们在看到数据之前的信念。在上面的分布中,任何概率几乎都是等概率的(由于随机生成,会有细微的差别)。因此,这意味着我对这个球员一无所知,我甚至没有任何关于 AVG 的有根据的猜测。我假设 0.000 AVG 等同于 1.000 AVG 或者 0 到 1 之间的任何其他概率。

现在我们观察到的数据表明有 1 个 AB 和 1 个 H,因此有 1.000 个 AVG。这可以用二项式分布来表示。具有二项式分布的随机变量 X 表示在一系列 n 个独立的是/否试验中的成功次数,每个试验以概率 p 产生成功。在 AVG 的情况下,AVG 是成功的概率,AB 是试验的次数,H 是成功的次数。

记住这些,我们可以定义我们的逆向生成模型。

我们将从我们定义的均匀分布中随机选取一个概率值,并将该值用作我们的生成模型的参数。假设我们随机选取的值是 0.230,这意味着在二项分布中有 23%的成功几率。试验次数为 1 (DS 有 1 个 AB),如果生成模型的结果与我们观察到的结果相匹配(本例中 DS 有 1 H),那么我们保持概率值为 0.230。如果我们重复这种生成和过滤,我们将最终得到一个概率分布,它生成了与我们观察到的结果相同的结果。

这成为我们的后路。

def posterior(n_try, k_success, prior):
    hit = list()
    for p in prior:
        hit.append(np.random.binomial(n_try, p))
    posterior = prior[list(map(lambda x: x == k_success, hit))]
    plt.figure(figsize=(8,5))
    plt.hist(posterior)
    plt.title('Posterior distribution')
    plt.xlabel('Posterior on AVG')
    plt.ylabel('Frequency')
    print('Number of draws left: %d, Posterior mean: %.3f, Posterior median: %.3f, Posterior 95%% quantile interval: %.3f-%.3f' % 
      (len(posterior), posterior.mean(), posterior.median(), posterior.quantile(.025), posterior.quantile(.975)))ds_n_trials = int(dominic_smith_spring[['AB','H']].iloc[-1][0])
ds_k_success = int(dominic_smith_spring[['AB','H']].iloc[-1][1])
posterior(ds_n_trials, ds_k_success, prior_ni)

后验分布中 95%的分位数区间称为可信区间,应该与频率主义者意义上的置信区间略有不同。您可以使用另一个可信的区间,当我提到 Pymc3 时,我会回到这个问题。

贝叶斯可信区间和 Frequentist 置信区间的一个主要区别是它们的解释。贝叶斯概率反映了一个人的主观信念。按照这种方法,我们可以声称真实参数在一个具有可测概率的可信区间内。这个属性很有吸引力,因为它使您能够对参数做出直接的概率陈述。许多人发现这个概念是理解概率区间的一种更自然的方式,也更容易解释。另一方面,置信区间使您能够声称区间覆盖了真实参数。如果我们收集一个新样本,计算置信区间,并重复多次,我们计算的 95%的区间将在该区间内具有真实的 AVG 值。

可信区间:“根据我们观察到的数据,AVG 的真实值有 95%的可能性落在可信区间内”

置信区间:“当我根据这类数据计算置信区间时,AVG 的真实值有 95%的可能性落在置信区间内。”

注意区别:可信区间是给定固定界限的参数值的概率陈述。置信区间是给定固定参数值时关于边界的概率。

通常在现实生活中,我们想知道的是真实参数而不是边界,在这种情况下,贝叶斯可信区间是正确的方法。在这种情况下,我们感兴趣的是球员的真实 AVG。

根据上述后验分布,我 95%确定 DS 真实 AVG 将在 0.155 到 0.987 之间。但这是一个非常宽泛的说法。换句话说,在我观察了一个没有先验知识的试验后,我不太确定 ds 的真实 AVG。

场景 2

对于第二个场景,让我们假设我们知道去年的春训数据。

dominic_smith_spring.iloc[-2:]

现在我们有了 2017 年春训统计,我们的先验应该反映了这一知识。这不再是均匀分布了,因为我们知道在 2017 年春训中,DS 的 AVG 是 0.167。

贝塔分布是具有两个参数的连续概率分布,阿尔法贝塔。它最常见的用途之一是对实验成功概率的不确定性进行建模。特别是,在已经观察到 n 次试验中的 k 次成功的情况下, X 的条件分布是β分布,其中参数 k+1α,参数n k+1β

n_draw = 20000
prior_trials = int(dominic_smith_spring.iloc[3].AB)
prior_success = int(dominic_smith_spring.iloc[3].H)
prior_i = pd.Series(np.random.beta(prior_success+1, prior_trials-prior_success+1, size = n_draw)) 
plt.figure(figsize=(8,5))
plt.hist(prior_i)
plt.title('Beta distribution(a=%d, b=%d)' % (prior_success+1,prior_trials-prior_success+1))
plt.xlabel('Prior on AVG')
plt.ylabel('Frequency')

posterior(ds_n_trials, ds_k_success, prior_i)

与情形 1 中的均匀先验的后验相比,95%分位数区域已经变窄。现在我可以说,我 95%确定 DS 的真实 AVG 将在 0.095 到 0.340 之间。然而,考虑到 0.300 以上的 AVG 通常被称为最佳击球手,该声明意味着该球员可以是最差的击球手或最佳击球手。我们需要更多的数据来缩小我们的可信区域。

场景 3

对于这个场景,我们假设我不仅有 2017 年春训的统计数据,还有 2017 年常规赛的统计数据。这对我拿到后路后的说法有什么影响?

ds_url = "[https://www.foxsports.com/mlb/dominic-smith-player-stats?seasonType=1](https://www.foxsports.com/mlb/dominic-smith-player-stats?seasonType=1)"
dominic_smith_reg = batting_stats(ds_url,'regular')
dominic_smith = dominic_smith_reg.append(dominic_smith_spring.iloc[3], ignore_index=True)
dominic_smith

ds_prior_trials = pd.to_numeric(dominic_smith.AB).sum()
ds_prior_success = pd.to_numeric(dominic_smith.H).sum()n_draw = 20000
prior_i_02 = pd.Series(np.random.beta(ds_prior_success+1, ds_prior_trials-ds_prior_success+1, size = n_draw)) 
plt.figure(figsize=(8,5))
plt.hist(prior_i_02)
plt.title('Beta distribution(a=%d, b=%d)' % (ds_prior_success+1,ds_prior_trials-ds_prior_success+1))
plt.xlabel('Prior on AVG')
plt.ylabel('Frequency')

posterior(ds_n_trials, ds_k_success, prior_i_02)

现在我可以说,我 95%确定 DS 的真实 AVG 将在 0.146 到 0.258 之间。这可能不是精确的,但与情景 1 和情景 2 相比,可信区间现在要窄得多。

场景 4

我想比较两个球员,看看谁在 AVG 方面更好。我观察到的数据是 2018 年春训的结果,我的先验知识是 2017 年春训和常规赛。现在我想比较一下 DS 和 GC。

直到场景 3,我通过拒绝产生与我观察到的结果不同的所有参数来模拟采样。但是这种类型的随机样本生成和过滤通常在计算上是昂贵的,并且运行缓慢。但幸运的是,我们可以使用一个工具,使采样器在高概率区域花费更多时间,从而提高效率。概率编程工具如 Pymc3 可以通过使用巧妙的算法如 HMC 坚果有效地处理抽样程序。

让我们先从福克斯体育台的加文·切奇尼的数据开始。

gc_url_st = "[https://www.foxsports.com/mlb/gavin-cecchini-player-stats?seasonType=3](https://www.foxsports.com/mlb/gavin-cecchini-player-stats?seasonType=3)"
gc_url_reg = "[https://www.foxsports.com/mlb/gavin-cecchini-player-stats?seasonType=1](https://www.foxsports.com/mlb/gavin-cecchini-player-stats?seasonType=1)"
gavin_cecchini_spring = batting_stats(gc_url_st,'spring')
gavin_cecchini_reg = batting_stats(gc_url_reg,'regular')
gc_n_trials = int(gavin_cecchini_spring.iloc[1].AB)
gc_k_success = int(gavin_cecchini_spring.iloc[1].H)
gc_prior = pd.DataFrame(gavin_cecchini_reg.iloc[1]).transpose().append(gavin_cecchini_spring.iloc[0])
gc_prior

gc_prior_trials = pd.to_numeric(gc_prior.AB).sum()
gc_prior_success = pd.to_numeric(gc_prior.H).sum()def observed_data_generator(n_try,observed_data):
    result = np.ones(observed_data)
    fails = n_try - observed_data
    result = np.append(result, np.zeros(fails))
    return resultds_observed = observed_data_generator(ds_n_trials,ds_k_success)
gc_observed = observed_data_generator(gc_n_trials,gc_k_success)

现在我们已经准备好安装一个 Pymc3 模型。

import pymc3 as pm
with pm.Model() as model_a:    
    D_p = pm.Beta('DS_AVG', ds_prior_success+1, ds_prior_trials-ds_prior_success+1)
    G_p = pm.Beta('GC_AVG', gc_prior_success+1, gc_prior_trials-gc_prior_success+1)
    DS = pm.Bernoulli('DS', p=D_p, observed=ds_observed)
    GC = pm.Bernoulli('GC', p=G_p, observed=gc_observed) 
    DvG = pm.Deterministic('DvG', D_p - G_p)
    start = pm.find_MAP()
    trace = pm.sample(10000, start=start)pm.plot_posterior(trace, varnames=['DS_AVG','GC_AVG','DvG'],ref_val=0)

如果我们在 Pymc3 中使用 plot_posterior 函数绘制 DS_AVG、GC_AVG 和 DvG (DS_AVG — GC_AVG)的后验分布,我们会看到 HPD 项而不是分位数。最高概率密度(HPD)区间是另一种我们可以用于后验概率的可信区间。HPD 区间选择最窄的区间,这将涉及选择包括众数在内的最高概率密度值。

我再次发现的另一个帖子由拉斯姆斯·贝斯提供了一个易于理解的分位数区间和最高密度区间的直观比较。以下是模式和最高密度区间,涵盖了六种不同后验分布 95%的概率密度。

Image Courtesy of Rasmus Bååth, “Probable Points and Credible Intervals, Part 1: Graphical Summaries

分位数区间包括中间值,50%的概率在它的左边,50%的概率在它的右边,分位数区间在两边留下 2.5%的概率(在 95%可信区间的情况下)。

Image Courtesy of Rasmus Bååth, “Probable Points and Credible Intervals, Part 1: Graphical Summaries

在 DS 和 GC 的击球率的情况下,看起来众数和中位数没有太大的不同,如果是这样,HPD 区间将类似于分位数区间。让我们看看他们看起来怎么样。

pm.summary(trace)

我们可以看到,对于 DS 和 GC,HPD 区间和分位数区间要么完全相同,要么在小数位数上略有不同。

我想回答的问题是,就 AVG 而言,谁是更好的球员,我应该说我不能确定。至少,我不能 95%确定这两个球员在 AVG 方面是不同的。我计算并绘制的差异表明,两个玩家的 AVG 差异(DS-GC,因此如果 DvG 更正,则意味着 DS 更好,否则如果 DvG 更负,则意味着 GC 更好),可以在-0.162 到 0.033 之间。

该区间包括 0.000,这表示两个玩家的 AVG 之间没有差异。因此,有一些证据表明 GC 比 DS 更好(因为 DvG 后验分布在负区域比在正区域具有更大的区域),但是我不能 95%确定这两个玩家在 AVG 方面是不同的。

也许有了更多的数据,我就能确定它们的区别。毕竟,这是贝叶斯思维的精髓。这并不是说真相不存在,而是我们不能完全了解它,我们所能希望做的就是随着越来越多的证据变得可用,更新我们的理解。

感谢您的阅读,您可以从下面的链接中找到整个 Jupyter 笔记本。

https://github . com/tthustle a/Bayes ball/blob/master/Bayes ball . ipynb

“贝叶斯可加回归树”论文摘要

原文:https://towardsdatascience.com/bayesian-additive-regression-trees-paper-summary-9da19708fa71?source=collection_archive---------0-----------------------

本文原载于【blog.zakjost.com】

一.背景

本文开发了一种贝叶斯方法来集成树。对于一篇学术论文来说,它非常具有可读性,如果你觉得这个主题有趣,我建议你花时间去读一读。

贝叶斯加法回归树(BART)类似于梯度推进树(GBT)方法,因为它们对连续弱学习者的贡献进行求和。这与随机森林相反,随机森林平均许多独立的估计。但是贝叶斯方法不是像 GBT 那样将每个顺序树乘以一个小常数(学习速率),而是使用一个先验。

通过使用先验和似然来获得预测的后验分布,我们得到了比经典回归方法的点估计更丰富的信息。此外,贝叶斯框架有一个内置的复杂性惩罚,这意味着我们不再需要对正则化、最大树深度和我们通常通过交叉验证调整的其他选项进行经验选择。

在评估的 42 个不同的数据集上,该方法的性能也优于所有其他被比较的方法,包括 GBM 和 Random Forests。

二。有什么新消息

这篇论文的新颖之处实际上是之前三部作品的结合:在贝叶斯树模型论文中的单个树的贝叶斯框架;梯度推进树的想法;以及使用 贝叶斯回填 对一般可加模型的后验分布进行 MCMC 采样。如果你能做出一个贝叶斯树,并且你知道如何从任何一个基本学习者的模型中取样,那么你就有了 BART。

三。方法

以一种可以连贯地定义先验参数分布的方式构建树问题的任务并不简单。这项工作大部分是在先前链接的树形模型论文中完成的。本质上,整个先验被分成三个子先验:一个用于树结构(深度、分割标准),另一个用于以树结构为条件的终端节点中的值,最后一个用于剩余噪声的标准偏差。提出一些聪明但直截了当的论点,以得出合理的默认建议。例如,有人认为函数的均值很可能在训练数据的 y_min 和 y_max 之间,所以它被设计成使得大部分先验质量都在这个区域。

有趣的是,在树的数量上的选择, m ,没有给出先验,这是由于计算的考虑。实际情况是,这个参数对结果的鲁棒性令人难以置信,所以他建议将其设置为 200,然后继续。事实上,结果似乎对合理的先验选择非常稳健,他主要推荐使用指定的默认值。

第二个重要部分是从模型的后部取样。像许多问题一样,这是通过 Metropolis-Hastings 算法来完成的,在该算法中,您从一个分布中生成一个样本,然后根据它的表现来保留/拒绝它。在这种情况下,它主要归结为:在加法序列中选择一棵树,通过在一些规则(修剪、生长等)中随机选择来变形它,从这个新树中,从终端节点值分布中采样,然后根据它们的后验概率比选择是保留这个新树还是原始树。通过这种方式,树被不断地改变以平衡它们的复杂性和解释数据的能力。选择先验自然有利于更简单的树,所以只有在有必要解释数据时才选择更深的先验。

四。结果

该框架应用于 42 个不同的真实数据集,并与其他流行的方法进行比较:Lasso/L1 正则化的线性回归、梯度推进树、随机森林和具有一个隐藏层的神经网络。这些模型通过各种参数选择进行了调整。笑点是:巴特赢了。如果对超参数调整执行交叉验证,您将获得最佳性能,这类似于您对所有其他模型调整参数的方式,但您可以避免所有这些,只需使用 BART 和默认值即可获得极具竞争力的结果。

此外,结果表明,高度稳健的变化选择的先验。贝叶斯理论的辉煌之处在于,它表明,即使当预测器中加入了许多无用的随机变量时(当我们在不清楚哪些变量最重要的情况下建立模型时,这种情况经常发生),与其他方法相比,它的表现也非常好。

作者还提出了一种变量选择技术,该技术涉及人工限制树的数量,然后在生成的树的分裂规则中计算变量的流行度。虽然这可能是一个很好的启发,但变量选择的问题是一个复杂的问题,它没有经过任何严格的探索。

动词 (verb 的缩写)讨论

这是一篇超级酷的论文,给出了令人印象深刻的结果。虽然我很难理解贝叶斯回填算法的细节以及吉布斯采样实际上是如何实现的,但基本原理似乎与其他 Metropolis-Hastings 方法基本一致。

最终,这种方法提供了一组“开箱即用”的默认值,这些默认值在统计上非常稳健,具有同类最佳的性能,并且能够适应超参数选择的变化。我认为这很好地展示了贝叶斯概率框架如何避免传统的、特别的方法中的许多问题,这些方法主要依赖于最大似然法。

不及物动词你试试

最令人失望的事实是,我找不到这个算法的 Python 实现。作者创建了一个 R 包( BayesTrees ),它有一些明显的问题——主要是缺少“预测”功能——另一个更广泛使用的实现叫做 bartMachine 被创建。

如果你有实现这种技术的经验或者知道一个 Python 库,请在评论中留下链接!

贝叶斯分析和复制危机:外行人的观点

原文:https://towardsdatascience.com/bayesian-analysis-the-replication-crisis-a-laypersons-perspective-241f9d4f73db?source=collection_archive---------14-----------------------

免责声明:我没有使用贝叶斯分析的任何经验,但我一直在试图理解基本概念。如果在这方面有更多知识的人发现任何错误,请在评论中指出来。

近年来,在复制危机之后,借助更强大的计算能力,贝叶斯统计分析方法越来越受欢迎。虽然我们很多人听说它是大多数人熟悉的 Frequentist 方法的替代方法,但没有多少人真正理解它的作用和使用方法。这篇文章希望简化贝叶斯分析的核心概念,并简要解释为什么它被提出作为解决复制危机的方法。

如果你只能从试图理解贝叶斯分析中得到两样东西,下面两条原则应该是最重要的:

  1. 贝叶斯分析试图通过一个通常被称为贝叶斯更新的过程,将先前的信息与当前的证据相结合,以测试一个观察结果是否支持某个假设。
  2. 贝叶斯分析中的零假设和替代假设都被认为是可能的,但可能程度不同。贝叶斯因子表明哪种假设更有可能,但它并不能得出明确的结论。

在统计分析的 Frequentist 方法中,假设检验仅使用从单一观察中收集的证据来完成。研究人员根据单个时间点测试的统计显著性来判断假设是否成立。研究人员有时会将该观察结果与以前类似观察结果进行比较,并注意最新的观察结果是否被重复,以了解观察到的效应有多大可能是真实的。

然而,贝叶斯方法会立即考虑之前收集的信息,以及最近收集的证据,以决定观察到的效应有多大可能是真实的。如下图所示,先验信念的概率分布用当前证据的概率分布更新,以生成后验信念的概率分布。后验概率与先验概率的比值给了我们贝叶斯因子,它表明哪个信念更有可能发生。

Probability distributions of Prior Beliefs, Posterior Beliefs and Current Evidence. (Image by Neeraj Singh Sarwan via Team AV)

在 Frequentist 方法中,确定一个观察到的效应的存在几乎是一个基于接受或拒绝零假设的二元是/否决策。但是在贝叶斯方法中,无效假设和替代假设继续保持它们自己的概率。例如,可能有 5%的几率零假设为真,25%的几率替代假设为真。(事实上,将假设表示为概率只能用贝叶斯方法而不能用频率主义方法,但这种错误是频率主义者经常犯的。)这意味着替代假设的可能性是零假设的 5 倍。参照统计学家哈罗德·杰弗里斯开发的解释贝叶斯因子的量表,贝叶斯因子 5 表示替代假设的适度证据。如果贝叶斯因子为 1,则意味着零假设和备择假设的概率相等;如果贝叶斯因子在 0 和 1 之间,这意味着证据支持零假设。下表解释了不同级别的贝叶斯因子:

Scale for interpretation of Bayes Factors developed by Jeffreys (1961) [1].

与当p-值小于 0.05 时拒绝零假设的频率主义方法不同,贝叶斯方法显然没有接受或拒绝某个假设的明确界限。它只是说,根据当前的证据如何更新先前的信息,一个假设比另一个更有可能。但是不管哪种假设更有可能,贝叶斯仍然会记住,任何一种假设都有可能是正确的。贝叶斯分析的这些核心原则是它被提议作为复制危机的解决方案的原因,这将在下一节中解释。

贝叶斯分析如何帮助解决复制危机

到目前为止,您可能已经看到,包含先验信息是贝叶斯分析的关键。如果我们仔细想想,这其实很有意义。当在没有考虑先验信息的情况下进行研究时,当观察效果的基本比率非常低时,犯I 型错误(检测假阳性)的风险特别高。下面的 xkcd 漫画很好的说明了这一点:

How a Frequentist and Bayesian determine whether the sun has exploded. (Image by xkcd.com)

简单来说,频率主义者根据探测器说谎的概率小于 0.05 的阈值来判定中微子探测器是对的。这种单一的观察没有考虑到这样一个事实,即根据历史记录,太阳爆炸的可能性极小。通过将该先验信息分解到分析中,贝叶斯确定检测器的输出不应该对先验信念有太大影响,如果有的话。(此处见详细解释。)

虽然这幅漫画可能是一个极端的例子,但它凸显了一种可能性,即常客往往会忽视这种可能性,并最终过于相信单一观察的结果。这部分解释了为什么一些研究不能被重复,因为观察到的效应仍然可能是偶然出现的假阳性。因此,贝叶斯分析可以通过尽可能简单地考虑先验信息来潜在地解决这个问题,作为对意外或反直觉发现的现实检查。

贝叶斯分析有助于解决复制危机的第二个原因是,它处理假设检验的方式与频率主义方法非常不同。如前所述,频率主义者的目标是基于一个二元的是/否决策来确定一个效应是否真的存在。在他最近发表的关于“统计仪式:复制错觉和我们如何到达那里”[2]的文章中, Gerd Gigerenzer (2018)强调了研究如何演变成一种“无效仪式”,对统计数据的解释成为一种仪式化的过程,在没有更深入理解的情况下使用理论。他还认为,当研究人员认为统计显著性证明了一种效应的存在时,过度自信也是一个问题。他建议学校把重点放在教学生理解统计信息的细微差别上,而不仅仅是学习遵循惯例。他还建议,期刊不应该接受仅仅报道结果为“重要”或“不重要”的论文。

贝叶斯分析本质上不存在这些问题。这种分析从整体上检查所有信息,它对通过二元是/否决策来确定影响的存在不感兴趣。如前所述,它只是表明一个假设与另一个假设相比有多大的可能性,事实上认为所有的假设都包含一定程度的可能性。这种方法允许研究人员欣赏收集的证据的细微差别,而不是简单地根据硬阈值得出结论。通过对证据的深入理解,研究人员将对他们的研究的可复制性有一个更现实的预期,也将更好地解释为什么他们的研究不能被复制。然而, Andrew Gelman (2014)正确地警告说,如果贝叶斯因子被用来以类似于 p 值的方式接受或拒绝假设,分析将最终失去其细微差别,并重新陷入同样的困境[3]。


我希望我已经解释了贝叶斯分析的基本原理,以及它的原理如何帮助解决复制危机。我没有深入研究如何进行各种贝叶斯测试的技术细节,因为我自己对它们并不熟悉,而且无论如何也可以在网上找到许多其他参考资料。我推荐的一篇文章是另一位叫做 Ankit Rathi 的媒体作家写的,他成功地以非常简洁的方式解释了贝叶斯和频率主义者之间的区别。我想澄清的是,这篇文章的目的并不是提倡在未来的研究中用贝叶斯分析取代频率主义分析。这篇文章的目的是揭开贝叶斯分析背后的概念,以及帮助人们认识到研究结论可能并不总是确定的,理解科学可能是一个更加微妙的努力。

以复制危机作为结束,虽然许多学校没有训练研究人员在统计上更加严谨可能是事实,但问题的核心可能在于谦逊的问题。《危机中的心理学》一书的作者布莱恩·休斯 (2018)在英国心理学会博客上写了一篇文章[4],“人们本能地以自我吹捧的方式解读歧义,将工作的积极方面归因于优点,将消极方面归因于机遇。心理学家也不例外。结果是一种真诚的信念,即我们的见解是深刻的,我们的疗法是杰出的,我们的研究比实际情况更强大。”不可否认,在研究中,在生活中,都存在着模糊性和随机性。但是,与其抱着一切都可以被解释以符合我们的假设的心态,不如谦虚一点,接受我们观察到的不一定符合我们的意愿。我们可能很难将自己从我们自己的研究的意义中脱离出来,但是如果忽视了这一点,所有解决复制危机的努力可能都将是徒劳的。

关于贝叶斯分析和复制危机的更多信息,请访问以下链接:

[## 用 Bayes 因子代替 p 值:心理学可复制性危机的神奇疗法

科学应该如何工作外行人、本科生和教科书作者有一个简单的科学模型…

replicationindex.wordpress.com](https://replicationindex.wordpress.com/2015/04/30/replacing-p-values-with-bayes-factors-a-miracle-cure-for-the-replicability-crisis-in-psychological-science/)

参考文献:

  1. 杰弗里斯,H. (1961)。 概率论(第 3 版。) 。牛津。第 432 页。
  2. Gigerenzer,G. (2018 年)。统计仪式:复制错觉和我们如何到达那里心理科学方法与实践进展,2515245918771329。
  3. 赫尔曼(2014 年)。统计学和科学复制的危机显著性12 (3),23–25。
  4. 休斯,B. (2018,10 月)。心理学面临夸张危机吗?。检索自https://the psychologist . bps . org . uk/volume-31/December-2018/does-psychology-face-夸张-危机

原文发布于:https://learn curily . WordPress . com/2018/10/14/Bayesian-analysis

Python 中的贝叶斯线性回归:使用机器学习预测学生成绩第 1 部分

原文:https://towardsdatascience.com/bayesian-linear-regression-in-python-using-machine-learning-to-predict-student-grades-part-1-7d0ad817fca5?source=collection_archive---------1-----------------------

探索性数据分析、特性选择和基准测试

即使在与贝叶斯线性建模理论斗争了几个星期并写了一篇关于它的博客文章之后,我也不能说我完全理解了这个概念。因此,抱着边做边学是最有效的技术的心态,我开始做一个数据科学项目,使用贝叶斯线性回归作为我选择的机器学习模型。

这篇文章是两篇记录该项目的文章中的第一篇。我想展示一个完整的数据科学管道的例子,所以这第一篇文章将集中于定义问题、探索性数据分析和设置基准。的第二部分将完全专注于实现贝叶斯线性回归并解释结果,所以如果你已经有了 EDA,前往那里。如果没有,或者如果您只是想看一些不错的图,请留在这里,我们将介绍如何开始解决数据科学问题。

该项目的完整代码可以在 GitHub 上的 Jupyter 笔记本中找到。我鼓励任何感兴趣的人来看看,并把自己的旋转这个项目。请随意使用、构建和以任何方式分发代码!

我喜欢专注于使用真实世界的数据,在这个项目中,我们将探索从葡萄牙中学收集的学生表现数据。这些数据包括学生的个人和学术特征以及期末成绩。我们的目标是创建一个可以根据学生信息预测成绩的模型。这个数据集,以及许多其他用于测试模型或尝试数据科学技术的有用数据集,可在 UCI 机器学习库上获得。

探索性数据分析

解决数据科学问题的第一步(一旦你清理了数据)是探索性数据分析(EDA) 。这是一个开放式的过程,我们在数据集中寻找异常、有趣的趋势或模式以及相关性。这些本身可能是有趣的,它们可以为我们的建模提供信息。基本上,我们使用 EDA 来找出我们的数据可以告诉我们什么!

首先,我们来看一个熊猫数据帧的数据快照:

import pandas as pddf = pd.read_csv(‘data/student-mat.csv’)
df.head()

总共有 633 个观察值和 33 个变量。每行是一个学生,每列包含一个不同的特征。等级列是我们的目标变量(也称为响应),这使得这成为一个监督、回归机器学习任务。它是受监督的,因为我们有一组已知目标的训练数据,在训练过程中,我们希望我们的模型学会根据其他变量预测分数。我们将把等级视为连续的,这使得这成为一个回归问题(从技术上讲,等级只取整数值,所以它是一个名义变量)。

感兴趣的主要变量是分数,所以让我们来看一下分布,以检查偏斜:

import matplotlib.pyplot as plt# Histogram of grades
plt.hist(df['Grade'], bins = 14)
plt.xlabel('Grade')
plt.ylabel('Count')
plt.title('Distribution of Final Grades')

分数接近正态分布,众数为 11(该学校的分数范围为 0-20)。虽然总体分数没有明显的倾斜,但是某些类别的学生可能会有倾斜的分数。为了观察分类变量对等级的影响,我们可以制作等级分布的密度图,用分类变量的值来着色。为此,我们使用了 seaborn 库和kdeplot函数。以下是按位置(城市或农村)绘制分布图的代码:

import seaborn as sns# Make one plot for each different location
sns.kdeplot(df.ix[df['address'] == 'U', 'Grade'], 
            label = 'Urban', shade = True)
sns.kdeplot(df.ix[df['address'] == 'R', 'Grade'], 
            label = 'Rural', shade = True)# Add labeling
plt.xlabel('Grade')
plt.ylabel('Density')
plt.title('Density Plot of Final Grades by Location')

我们可以使用类似的代码来绘制 guardian 的分数分布,结果如下所示:

密度图上的实际值很难解释,但我们可以用图的形状进行比较。地理位置似乎对学生成绩没有实质性的影响,卫报也没有。诸如此类的图可以为我们的建模提供信息,因为它们告诉我们知道地点或监护人是否有助于预测最终分数。当然,我们想用一个比单一情节更严谨的衡量标准来得出这些结论,后面我们会用统计数据来佐证我们的直觉!

特征选择

正如我们从图中看到的,我们并不期望每个变量都与最终成绩相关,所以我们需要执行特征选择(也称为维度缩减)来只选择“相关”变量。这取决于问题,但因为我们将在这个项目中进行线性建模,我们可以使用一个简单的测量方法,称为相关系数来确定预测分数最有用的变量。这是一个介于-1 和+1 之间的值,用于衡量两个变量之间线性关系的方向和强度。

为了选择有限数量的变量,我们可以找到那些与最终成绩有最大相关性(或正或负)的变量。在熊猫身上寻找相关性非常简单:

# Find correlations and sort
df.corr()['Grade'].sort_values()**failures     -0.384569
absences     -0.204230
Dalc         -0.196891
Walc         -0.178839
traveltime   -0.129654
goout        -0.111228
freetime     -0.105206
health       -0.096461
age          -0.042505
famrel        0.072888
Fedu          0.204392
studytime     0.249855
Medu          0.278690**

至少以我的基本社会科学知识来看,这些相关性似乎是有道理的!failures是以前上课失败的次数,与成绩呈负相关,absences也是,缺课的次数。这种负相关说明随着这些变量的增加,最终成绩有下降的趋势(虽然我们只能说这是一种相关而不是一个变量导致另一个变量下降)。另一方面,每周学习的量studytime和母亲的教育水平Medu都与成绩呈正相关。

相关性只能在数字变量之间计算,因此要找到分类变量和等级之间的关系,我们必须对分类变量进行一次性编码,然后计算相关系数。 One-hot encoding 是为分类变量中的每个类别创建一列的过程。以下是一次性编码前后的分类列示例:

一键编码是机器学习管道中的标准步骤,使用 pandas 库很容易做到:

# Select only categorical variables
category_df = df.select_dtypes('object')# One hot encode the variables
dummy_df = pd.get_dummies(category_df)# Put the grade back in the dataframe
dummy_df['Grade'] = df['Grade']# Find correlations with grade
dummy_df.corr()['Grade'].sort_values()**higher_no           -0.343742
school_MS           -0.227632
Mjob_at_home        -0.158496
reason_course       -0.138195
internet_no         -0.131408
address_R           -0.128350
address_U            0.128350
internet_yes         0.131408
Fjob_teacher         0.160938
Mjob_teacher         0.173851
reason_reputation    0.185979
school_GP            0.227632
higher_yes           0.343742**

我们再次看到直观上有意义的关系:higher_no表示学生不想继续接受高等教育,并且与分数负相关,higher_yes 表示学生确实想要接受高等教育,并且显示出正相关。Mjob_at_home 表示母亲待在家里,与成绩负相关,Mjob_teacher表示母亲教书,与成绩正相关。

在这个问题中,我们将使用这些结果来进行特征选择,只保留与最终成绩高度相关的 6 个变量。6 是一个任意的数字,我发现它在模型中工作得很好,这表明很多机器学习只是实验!

在特征选择后,我们最终使用的最后六个变量(详见笔记本)显示在新数据帧的快照中。(我重命名了这些列,以便它们更直观):

变量的完整描述在 UCI 机器学习库中,但这里有一个简要概述:

  • failures:以前的班级失败
  • higher_edu:二元表示学生是否会接受高等教育
  • mother_edu:母亲的教育水平
  • studytime:每周学习量
  • father_edu:父亲的受教育程度
  • absences:学期内缺课

当我们执行特性选择时,我们还使用 Scikit-learn 函数将数据分成训练集和测试集。这是必要的,因为我们需要有一个坚持测试集来评估我们的模型,并确保它不会过度拟合测试数据:

from sklearn.model_selection import train_test_split# df is features and labels are the targets 
# Split by putting 25% in the testing set
X_train, X_test, y_train, y_test = train_test_split(df, labels, 
                                                   test_size = 0.25,
                                                    random_state=42)

这留给我们 474 个训练观察和 159 个测试数据点。

检查所选要素

我最喜欢的图形之一是对图,它非常适合显示变量的分布以及变量对之间的关系。这里我使用 seaborn PairGrid函数来显示所选特性的 Pairs 图:

这个情节里编码了很多信息!在上面的三角形中,我们绘制了每个变量的散点图。请注意,大多数变量都是离散整数,这意味着它们只取特定的值。在对角线上,我们有直方图显示单个变量的分布。右下角有二维密度图和变量之间的相关系数。

为了解释该图,我们可以选择一个变量,并查看行和列,以找到与所有其他变量的关系。例如,第一行显示了我们的目标Grade与其他变量的散点图。第一列显示了Grade和其他变量之间的相关系数。我们看到failures在绝对量级上与最终成绩的相关性最大。

作为对所选数据的另一种探索,我们可以绘制每个变量的分布图,如果分数高于 12 的中值,则用颜色标记。为了绘制这些图,我们在数据框中创建一个列,将等级与 12 进行比较,然后将所有值绘制在密度图中。

这产生了以下图:

绿色分布代表成绩处于或高于中间值的学生,红色代表低于中间值的学生。我们可以看到,有些变量与成绩更为正相关(如studytime),而另一些变量则是低成绩的指标,如低father_edu

EDA 让我们对数据集有了很好的了解。我们制作图表,找到变量之间的关系,并使用这些来执行特征选择,以便只保留与我们的任务最相关的变量。虽然 EDA 是建模的先驱,但它本身也很有用,许多数据科学问题可以通过我们在这里制作的图表和统计数据来解决。

建立基线指标

机器学习管道中最容易被忽视的一个方面是建立基线。是的,如果您的分类模型达到 99%的准确率,这可能看起来令人印象深刻,但是如果我们每次都通过猜测相同的类来获得 98%的准确率,会怎么样呢?我们真的想花时间为这个问题建立一个模型吗?一个好的基线允许我们评估我们的模型(或者任何模型)是否适用于这个任务。

对于回归,一个好的简单基线就是猜测测试数据中每个观察值的目标中值。在我们的问题中,中位数是 12,所以让我们评估一个模型的准确性,该模型天真地预测测试集上的每个学生都是 12。我们将使用 2 个指标来评估预测:

  • 平均绝对误差(MAE) :预测值与真实值之差的绝对值的平均值。
  • 均方根误差(RMSE) :预测值和真实值之间的平均平方差的平方根。

平均绝对误差很容易解释,因为它代表了我们平均离正确值有多远。均方根误差对较大误差的惩罚更重,通常用于回归任务。根据具体情况,这两个指标可能都合适,我们将使用这两个指标进行比较。(这里讨论一下这些指标的优点。)

当我们对测试集上的每个例子预测 12 时,我们得到这些结果:

**Median Baseline  MAE: 2.1761
Median Baseline RMSE: 2.6777**

如果我们的机器学习模型无法击败这些指标,那么我们要么需要获得更多数据,尝试另一种方法,要么得出机器学习不适用于我们的问题的结论!

我们的建模重点是贝叶斯线性回归,但将我们的结果与标准技术(如线性回归、支持向量机或基于树的方法)的结果进行比较会有所帮助。我们将在数据集上评估其中的几种方法。幸运的是,这些都很容易用 Scikit-Learn 等 Python 库来实现。检查笔记本上的代码,但这里是 6 个不同模型的结果以及原始基线:

幸运的是,我们看到所有的模型最好的基线表明机器学习将为这个问题工作。总体而言,梯度增强回归方法表现最佳,尽管普通最小二乘(OLS)线性回归 ( 线性建模的频率主义方法)也表现良好。

作为最后的练习,我们可以解释 OLS 线性回归模型。线性回归是最简单的机器学习技术,在具有大量特征的复杂非线性问题上表现不佳,但它具有易于解释的优势。我们可以使用训练好的模型从线性回归中提取预测公式。下面是公式:

**Grade = 9.19 - 1.32 * failures + 1.86 * higher_edu + 0.26 * mother_edu + 0.58 * studytime + 0.03 * father_edu - 0.07 * absences**

截距,9.19,代表我们的猜测,如果一个学生的每个变量都是 0。系数(也称为权重或模型参数)表示相应变量单位增加的影响。例如,每增加一次以前的失败,学生的分数预计会减少 1.32 分,母亲的教育每增加一分,学生的分数增加 0.26 分。在解决问题时,我经常喜欢从线性回归开始,因为如果它足够好,我们就有了一个完全可以解释的模型,我们可以用它来进行预测。

结论

虽然机器学习得到了所有的关注,但它通常只是数据科学项目的一小部分。大部分工作——也是大部分价值——来自于获取、清理和探索数据。只有当我们牢牢掌握了数据的结构和其中的关系,我们才应该着手建立机器学习模型。我想展示这个项目的整个过程,以展示一个典型的数据科学工作流程。在这个项目的前半部分,我们:

  • 探索数据以发现有趣的模式、趋势或异常
  • 检查特征和目标之间的相关性
  • 使用相关值执行特征选择
  • 建立了基线和基准机器学习模型

这些技术同样适用于任何机器学习问题,所以请随意将它们作为您下一个项目的起点。虽然特定机器学习模型的确切实现细节可能不同,但数据科学问题的总体结构是相当一致的

在本系列的下半部分,我们将使用 Python 中的 PyMC3 实现一个贝叶斯线性回归模型。我们将建立模型,训练模型(在这种情况下,这意味着从后验抽样),检查模型的推论,并使用结果进行预测。我们在那里见!

一如既往,我欢迎反馈和建设性的批评。你可以在推特上找到我。

Python 中的贝叶斯线性回归:使用机器学习预测学生成绩第 2 部分

原文:https://towardsdatascience.com/bayesian-linear-regression-in-python-using-machine-learning-to-predict-student-grades-part-2-b72059a8ac7e?source=collection_archive---------0-----------------------

实施模型、解释结果和做出预测

在这个贝叶斯机器学习项目的第一部分中,我们概述了我们的问题,进行了全面的探索性数据分析,选择了我们的特性,并建立了基准。这里我们将在 Python 中实现贝叶斯线性回归来构建模型。训练完模型后,我们将解释模型参数并使用模型进行预测。这个项目的全部代码可以在 GitHub 上的 Jupyter 笔记本中找到,我鼓励任何人去看看!

提醒一下,我们正在研究一个监督的、回归的机器学习问题。使用学生成绩的数据集,我们希望建立一个模型,该模型可以根据学生的个人和学术特征来预测最终学生的分数。特征选择后的最终数据集为:

我们有 6 个特征(解释变量)用于预测目标(响应变量),在这种情况下是分数。训练集中有 474 名学生,测试集中有 159 名学生。为了了解变量分布(因为我真的很喜欢这个图),这里有一个变量对图,显示了散点图、直方图、密度图和相关系数。

关于这个情节的细节和所有变量的意义请查看第一部分和笔记本。现在,让我们继续用 Python 实现贝叶斯线性回归。

贝叶斯线性回归

让我们简单回顾一下频率主义者贝叶斯线性回归。线性回归的 Frequentist 观点假设数据是从以下模型生成的:

其中,响应 y 由模型参数β乘以输入矩阵 X 加上随机采样噪声或潜在变量引起的误差得出。在普通的最小二乘法(OLS)中,模型参数β是通过寻找使训练数据的误差平方和最小的参数来计算的。OLS 的输出是给定训练数据的“最佳”模型参数的单点估计。然后,这些参数可用于预测新的数据点。

相反,贝叶斯线性回归假设响应是从概率分布中取样的,例如正态(高斯)分布:

高斯均值是参数β和输入 X 的乘积,标准差是σ。在贝叶斯模型中,不仅响应被假设为从分布中抽样,而且参数也被假设为从分布中抽样。目标是在给定输入 X 和输出 y 的情况下,确定模型参数的后验概率分布:

后验概率等于数据的似然性乘以模型参数的先验概率,再除以归一化常数。如果我们有一些领域知识,我们可以用它来分配模型参数的先验,或者我们可以使用非信息先验:不假设任何变量的具有大标准偏差的分布。使用无信息的先验意味着我们“让数据说话”一个常见的优先选择是对β使用正态分布,对σ使用半柯西分布。

实际上,对于连续值来说,计算精确的后验分布在计算上是很困难的,因此我们求助于抽样方法,如马尔可夫链蒙特卡罗 (MCMC)从后验中抽取样本,以逼近后验。蒙特卡洛是指抽取随机样本的一般技术,马尔可夫链是指抽取的下一个样本仅基于上一个样本值。这个概念是,随着我们抽取更多的样本,后验概率的近似值最终将收敛于模型参数的真实后验分布。

贝叶斯线性建模的最终结果不是对模型参数的单一估计,而是一个分布,我们可以用它来对新的观察结果进行推断。这种分布允许我们在模型中展示我们的不确定性,并且是贝叶斯建模方法的好处之一。随着数据点数量的增加,不确定性应该会降低,表明我们的估计具有更高的确定性。

用 Python 实现贝叶斯线性建模

目前 Python 中概率编程和贝叶斯推理最好的库是 PyMC3。它包括许多用于构建贝叶斯模型和使用 MCMC 方法推断模型参数的实用程序。我们将使用 PyMC3 的广义线性模型(GLM)模块,特别是GLM.from_formula函数,它使得构建贝叶斯线性模型极其简单。

使用该模块执行贝叶斯线性回归只需要两个步骤:

  1. 构建一个将特征与目标相关联的公式,并确定数据可能性的先验分布
  2. 使用 MCMC 的参数后验分布样本

公式

我们不需要为每个模型参数分别定义概率分布,而是传递一个 R 风格的公式,将特征(输入)与目标(输出)联系起来。以下是将分数与学生特征联系起来的公式:

**Grade ~ failures + higher_edu + mother_edu + studytime + father_edu + absences**

在此语法中,~,读作“是的函数”。我们告诉模型,等级是波浪号右侧六个特征的线性组合。

该模型是在使用with语句的上下文中构建的。在对GLM.from_formula的调用中,我们传递公式、数据和数据可能性族(这实际上是可选的,默认为正态分布)。该函数解析公式,为每个要素添加随机变量(以及标准差),添加数据的似然性,并将参数初始化为合理的起始估计值。默认情况下,模型参数先验被建模为正态分布。

一旦建立了 GLM 模型,我们就使用 MCMC 算法从后验样本中进行采样。如果我们不指定哪种方法,PyMC3 会自动选择最适合我们的方法。在下面的代码中,我让 PyMC3 选择采样器,并指定样本数 2000,链数 2,调谐步数 500。

在这种情况下,PyMC3 选择了不掉头采样器,并用 jitter+adapt_diag 初始化采样器。老实说,我真的不知道这些是什么意思的全部细节,但我假设比我聪明得多的人正确地实现了它们。有时仅仅知道如何使用工具比理解实现的每个细节更重要!

采样器运行几分钟,我们的结果存储在normal_trace中。这包含每个模型参数的所有样本(,除了被丢弃的调谐样本)。跟踪本质上是我们的模型,因为它包含了我们进行推理所需的所有信息。为了了解贝叶斯线性回归的作用,我们可以使用 PyMC3 中的内置函数来检查轨迹。

轨迹图在左侧显示了模型参数的后验分布,在右侧显示了在变量轨迹中绘制的样本的进展。这两种颜色代表采样的两个差分链。

pm.traceplot(normal_trace)

这里我们可以看到,我们的模型参数不是点估计,而是分布。每个分布的平均值可以作为最可能的估计,但是我们也使用整个范围的值来表明我们不确定真实值。

查看后验分布的另一种方式是直方图:

pm.plot_posterior(normal_trace)

这里我们可以看到平均值,我们可以用它作为最可能的估计,也可以看到整个分布。95% HPD 代表 95%的最高后验密度,是我们参数的可信区间可信区间是频率统计中置信区间的贝叶斯等价(尽管有不同的解释)。

我们还可以看到所有模型参数的摘要:

pm.df_summary(normal_trace)

我们可以用与 OLS 线性回归大致相同的方式来解释这些权重。例如在模型中:

  • 以前的课堂失败和缺席有负面影响
  • 高等教育计划和学习时间有积极的影响
  • 母亲和父亲的教育有积极的影响(尽管母亲的更积极)

标准偏差栏和 hpd 限值让我们了解我们对模型参数的信心程度。例如,father_edu 特性的 95% hpd 从-0.22 到 0.27,这意味着我们不能完全确定模型中的影响是积极的还是消极的!数据似然性也有较大的标准偏差(sd行),表明目标存在较大的不确定性。总的来说,我们在模型中看到了相当大的不确定性,因为我们处理的样本数量很少。只有几百名学生,我们没有足够的数据来精确地确定模型参数。

解释可变效应

为了查看单个变量对成绩的影响,我们可以在保持其他变量不变的情况下改变该变量的值,并查看估计的成绩如何变化。为此,我们使用plot_posterior_predictive函数,并假设除了感兴趣的变量(查询变量)之外的所有变量都处于中值。我们为查询变量生成一系列值,函数通过从后验分布中提取模型参数来估计整个范围内的等级。代码如下:

结果显示了来自后验样本的 100 个样本的估计等级与查询变量范围的关系:

每条线(每个图中有 100 条线)是通过从后验迹线中选取一组模型参数并评估查询变量范围内的预测坡度而绘制的。线的分布显示了模型参数的不确定性:线越分散,模型对该变量的影响就越不确定。

对于一个变量,父亲的教育程度,我们的模型甚至不能确定增加变量的效果是积极的还是消极的!

如果我们使用这个模型来做决策,我们可能要在部署它之前三思,而不是首先收集更多的数据来形成更确定的估计。只有几百名学生,模型参数有相当大的不确定性。例如,我们不应该声称“父亲的教育水平对成绩有积极影响”,因为结果表明这个结论几乎没有什么确定性。

如果我们使用频率主义方法,并且只看到一个点估计,我们可能会因为有限的数据量而做出错误的决策。在数据集有限的情况下,贝叶斯模型是显示模型中不确定性的绝佳选择。

做预测

说到预测,贝叶斯模型可以用来估计分布。我们记得贝叶斯线性回归的模型是:

其中,β是系数矩阵(模型参数),X 是数据矩阵,σ是标准差。如果我们想要对新的数据点进行预测,我们可以通过将模型参数乘以我们的数据点来找到平均值,并使用模型参数的标准偏差,从而找到估计输出的正态分布

在这种情况下,我们将从轨迹中取每个模型参数的平均值作为参数的最佳估计值。如果我们取轨迹中参数的平均值,那么预测的分布就变成:

**Grade ~ N(9.20 * Intercept - 1.32 * failures + 1.85 * higher_edu + 0.26 * mother_edu + 0.58 * studytime + 0.03 * father_edu - 0.07 * absences,  2.28^2)**

对于新的数据点,我们代入变量的值,并构建等级的概率密度函数。作为一个例子,这里有一个来自测试集的观察结果以及概率密度函数(参见笔记本中构建这个分布的代码):

**Test Observation:
failures = 0, higher_edu = 1, mother_edu = 2, studytime = 1,
father_edu = 2, absences = 8**

**True Grade = 12
Average Estimate = 11.6763
5% Estimate = 7.7618    95% Estimate = 15.5931**

对于该数据点,平均估计值与实际等级相符,但也存在较大的估计区间。如果我们有更多的学生,估计的不确定性会更低。

我们还可以对不在测试集中的任何新点进行预测:

**New Observation:
absences = 1, failures = 0, father_edu = 1
higher_edu = 1, mother_edu = 4, studytime = 3**

**Average Estimate = 13.8009
5% Estimate = 10.0696    95% Estimate = 17.4629**

与标准机器学习模型的比较

在本系列的第一部分中,我们计算了许多标准机器学习模型的基准以及一个简单的基线。为了计算 MAE 和 RMSE 度量,我们需要对测试集中的所有数据点进行单点估计。我们可以使用估计分布的平均值做出“最有可能”的预测。产生的指标以及基准测试的指标如下所示:

贝叶斯线性回归实现了与最佳标准模型几乎相同的性能!然而,贝叶斯线性建模的主要好处不在于准确性,而在于可解释性和量化我们的不确定性。任何模型都只是对真实世界的估计,在这里我们已经看到了我们应该对基于有限数据训练的模型有多么缺乏信心。

后续步骤

对于任何想开始学习贝叶斯建模的人,我建议看看这本笔记本。在这个项目中,我只研究了一半的学生数据(我使用了数学成绩,另一半包含葡萄牙语课程成绩),所以可以对另一半进行同样的分析。此外,我们可以改变数据可能性的分布——例如,改变为一个学生的 t 分布——然后看看这如何改变模型。与大多数机器学习一样,通过尝试不同的设置,可以学到相当多的东西,而且往往没有单一的正确答案!

结论

在这一系列文章中,我们走过了用于解决数据科学问题的完整机器学习过程。我们从探索性数据分析开始,进而建立基线,尝试几种不同的模型,实施我们选择的模型,解释结果,并使用该模型进行新的预测。虽然模型实现的细节可能会改变,但这个的总体结构将很好地服务于大多数数据科学项目。此外,希望这个项目让你了解了贝叶斯机器学习的独特能力,并为你的技能组合增加了另一个工具。学习新技能是数据科学最令人兴奋的方面,现在您又多了一项部署来解决您的数据问题。

一如既往,我欢迎反馈和建设性的批评。你可以在推特上找到我。

基于模型强化学习的随机输入贝叶斯神经网络

原文:https://towardsdatascience.com/bayesian-neural-networks-with-random-inputs-for-model-based-reinforcement-learning-36606a9399b4?source=collection_archive---------3-----------------------

我在这里描述我们最近的 ICLR 论文[1][code][talk)],它介绍了一种基于模型的强化学习的新方法。这项工作的主要作者是 Stefan Depeweg ,他是我共同指导的慕尼黑工业大学的博士生。

关键贡献在于我们的模型:具有随机输入的贝叶斯神经网络,其输入层包含输入特征和随机变量,这些变量通过网络向前传播,并在输出层转换为任意噪声信号。

随机输入使我们的模型能够自动捕获复杂的噪声模式,提高我们基于模型的模拟的质量,并在实践中产生更好的策略。

问题描述

我们处理随机动力系统中的策略搜索问题。例如,要操作燃气轮机等工业系统:

这些系统的抽象如下所示。系统的当前状态表示为 s_t,并且与每个状态 s_t 相关联的是由函数 c 给出的成本 c (s_t)。在每个时间步,我们施加一个动作 a_t,它将影响下一个时间步 s_t+1 的系统状态。

从 s_t 到 s_t+1 的转变不仅由动作 a_t 决定,还由一些我们无法控制的噪声信号决定。该噪声信号由图中的方块表示。在涡轮机的例子中,噪声的产生是因为我们观察到的状态仅由传感器测量值组成,这些测量值是对系统真实状态的不完整描述。

为了控制系统,我们可以使用一个策略函数 a _ t = 𝜋(s_t;𝜃)将当前状态 s_t 映射到动作 a_t,例如𝜋(;𝜃)可以是具有权重𝜃.的神经网络

我们的目标是找到一种策略(𝜃的一个值),它将在一系列状态轨迹上产生平均较低的成本函数值。例如,我们的目标是最小化

注意,上面的表达式是随机的,因为它取决于初始状态 S1 的选择和状态转换中的随机噪声。

批量强化学习

我们考虑批量强化学习场景,在学习过程中我们不会与系统交互。这种情况在现实世界的工业设置中很常见,例如涡轮机控制,在这种情况下,探索受到限制,以避免对系统造成可能的损害。

因此,为了找到最佳策略,我们只有从已经运行的系统获得的状态转换形式的一批数据 D = {(s_t,a_t,s_t+1)},并且我们将不能收集任何额外的数据。

首先,我们从 D 得知 p(s_t+1|s_t,a_t)的模型,即下一个状态 s_t+1 的预测分布,作为当前状态 s_t 和应用的动作 a_t 的函数。然后我们把这个模型和政策联系起来,得到 p(s_t+1|s_t,a _ t = 𝜋(s_t;𝜃),它描述了系统在𝜋(政策控制下的演变;𝜃).

先前的分布可用于执行展开或状态轨迹的模拟。我们从随机采样的状态 s_1 开始,然后从 p(s_t+1|s_t,a _ t = 𝜋(s_t;𝜃))来获得状态 S1,…,s_T 的轨迹

然后,可以在采样的 s_1,…,s_T 上评估成本函数,以逼近 cost(𝜃).这种近似的梯度可用于执行随机优化,并在产生平均低值 cost(𝜃).的方向上移动

最优控制中噪声的影响

状态转换中存在的噪声会显著影响最优策略。这可以通过醉酒蜘蛛的故事来说明,这个故事最初是由 Bert Kappen [2]提出的,我们在这里用它作为一个激励的例子。

一只蜘蛛有两条回家的路:要么过桥,要么绕湖行走。在没有噪声的情况下,桥接选项更受青睐,因为它更短。然而,在大量饮酒后,蜘蛛的动作可能会随机向左或向右偏离。因为桥很窄,而且蜘蛛不喜欢游泳,所以现在更喜欢沿着湖走。

前面的例子显示了噪声如何显著影响最优控制。例如,最佳策略可以根据噪声水平是高还是低而改变。因此,我们希望通过以高精度捕获状态转换数据中存在的任何噪声模式,在基于模型的强化学习中获得显著的改进。

具有随机输入的贝叶斯神经网络

在实践中,大多数状态转移数据的建模方法只是假设 s_t+1 中的加性高斯噪声,即,

其中 f_W 例如是具有权重 W 的神经网络。在这种情况下,通过最大可能性学习 W 是非常容易的。然而,加性高斯噪声的假设在现实世界中不太可能成立。

通过使用 f_W 中的随机输入可以获得更灵活的过渡动态噪声模型。特别是,我们可以假设

在该模型下,输入噪声变量 z_t 可以通过 f_W 以复杂的方式进行变换,以在 s_t+1 中产生作为 s_t 和 a_t 的函数的任意随机模式。

然而,现在学习 W 不再能够通过最大似然法来完成,因为 z_t 是未知的。一个解决方案是遵循贝叶斯方法并在 W 和 z_t 上使用后验分布。该分布捕捉了我们在看到 D 中的数据后对这些变量可能取值的不确定性。

计算精确的后验概率是困难的,但是我们可以学习高斯近似法。这种近似的参数可以通过最小化相对于真实后验概率的偏差来调整。变分贝叶斯(VB) 是一种流行的方法,它通过最小化 Kullback-Leibler 散度来工作。

α发散最小化

不使用 VB,我们通过最小化****α-散度【3,4】来学习分解的高斯近似 q通过改变该散度中的α值,我们可以在符合真实后验概率 p 中的一个模式或旨在覆盖 p 中的多个模式的解之间进行平滑插值,如下图所示:

有趣的是,VB 是α = 0 时α散度最小化的一个特例。另一个众所周知的近似贝叶斯推断方法是期望传播,它是在α = 1 时获得的。在我们的实验中,我们使用 α = 0.5 ,因为这通常在实践中产生更好的概率预测[4]。

玩具示例的结果

下图显示了我们的贝叶斯神经网络在两个玩具例子中随机输入的结果。每个示例的训练数据显示在最左边的列中。第一行显示了双模态预测分布的问题。底部一行显示了异方差噪声的问题(噪声幅度取决于输入)。

中间一列显示了用仅假设加性高斯噪声的模型获得的预测。该模型不能捕捉数据中的双模态或异方差。最右边的列显示了我们的贝叶斯神经网络对随机输入的预测,它可以自动识别数据中存在的随机模式的类型。

湿鸡问题的结果

我们现在考虑一个强化学习基准,其中一名划独木舟的人正在二维河流上划桨,如下图中最左侧的图所示。河流中有一个漂流将独木舟者推向位于顶部的瀑布,漂流右侧较强,左侧较弱。如果划独木舟的人掉进了瀑布,他必须从河底重新开始。

河中还有湍流,左边变强,右边变弱。划独木舟的人离瀑布越近,得到的奖励就越高。因此,他会想靠近瀑布,但不要太近,这样他可能会掉下去。这个问题被称为 wetchicken 是因为它和游戏小鸡有相似之处。

湍流和瀑布将使 wetchicken 成为一个高度随机的基准:从瀑布上落下的可能性导致了状态转换中的双模态,而变化的湍流引入了异方差。

图中间的图可视化了使用我们的贝叶斯神经网络随机输入发现的策略。这是一个近乎最优的策略,在这个策略中,划独木舟的人试图停留在 x ≃ 3.5 度和 y ≃ 2.5 度的位置。

右图显示了使用高斯过程(GP)模型发现的策略,该模型仅假设了加性高斯噪声。由于 GP 不能捕获数据中存在的复杂噪声模式,因此所产生的策略在实践中表现很差。

工业基准的结果

我们还在实验中评估了我们的贝叶斯神经网络在随机输入下的性能,该实验使用了一个称为“工业基准”【5】的工业系统模拟器。根据作者的说法:“‘工业基准’旨在现实的意义上,它包括了我们发现在工业应用中至关重要的各种方面。”

下图显示了对于一个固定的动作序列,使用对应于 1)假设加性高斯噪声(MLP)的多层感知器和 2)变分贝叶斯(VB)或 3)α= 0.5 的α-散度最小化训练的贝叶斯神经网络的模型产生的展开。模拟轨迹以蓝色显示,由“工业基准”生成的地面真实轨迹以红色显示。

该图清楚地显示了使用我们的贝叶斯神经网络通过随机输入和α-散度最小化产生的展开如何更接近地面真实轨迹。

结论

我们已经看到,在学习最优策略时,考虑过渡动态中复杂的噪声模式是很重要的。我们的带有随机输入的贝叶斯神经网络是捕捉这种复杂噪声模式的最先进的模型。通过用α = 0.5 最小化α-散度,我们能够在这样的贝叶斯神经网络中执行精确的近似推断。这使我们能够产生现实的基于模型的模拟,可以用来学习更好的政策。

延伸阅读

在[6]中,我们研究了具有随机输入的贝叶斯神经网络预测中不确定性的分解。不确定性来源于 a)由于数据有限(认知不确定性)而缺乏关于网络权重的知识,或者 b)网络的随机输入(随机不确定性)。在[6]中,我们展示了如何将这两种类型的不确定性应用于主动学习和安全强化学习。

我们还推荐这篇 由 Alex Kendall 撰写的关于计算机视觉深度神经网络中前述两种不确定性的优秀博文。

参考

[1]德佩韦格 s .、埃尔南德斯-洛巴托 J. M .、多希-维勒兹 f .和乌德卢夫特 S. 贝叶斯神经网络在随机动力系统中的学习和政策搜索,ICLR,2017。

[2] H.J .卡彭特。最优控制理论的路径积分和对称破缺。统计力学杂志:理论与实验,P11011 页,2005 年。

[3]明卡,托马斯·p .发散度量和信息传递。技术报告,微软研究院,2005 年。

[4]埃尔南德斯-洛巴托 J. M .,李 y .,罗兰 m .,布伊 T. D .,埃尔南德斯-洛巴托 d .和特纳 R. E. 黑盒阿尔法散度最小化,ICML,2016

[5]丹尼尔·海因、亚历山大·亨切尔、沃尔克马尔·斯特津、米歇尔·托基奇和斯特芬·乌德勒夫特。“工业基准”简介。arXiv 预印本 arXiv:1610.03793,2016 年

[6] Depeweg,Stefan 等.具有潜在变量的贝叶斯神经网络中的不确定性分解arXiv 预印本 arXiv:1706.08495 (2017)。

定量交易的贝叶斯优化

原文:https://towardsdatascience.com/bayesian-optimization-for-quantitative-trading-20b257497a8?source=collection_archive---------13-----------------------

在本教程中,我们将了解贝叶斯优化如何减少训练稳健的系统交易策略所需的回溯测试总数,该策略包括在一袋股票中分配资本,以最小化给定预期回报的估计风险。

更新:我开了一家法律科技公司。你可以在这里找到更多

交易策略

我们将实施一个标准的 Markowitz 投资组合优化策略(MPT ),它将有许多可调参数。MPT 用两个量进行预测:风险和预期收益。我们以下列方式对一组证券中的每一个估计这两个数量:

波动率 在现代金融中经常被用作风险的代理(想想比特币;高波动性意味着高风险),这在数学上可以表示为方差。通过在可优化的时间长度(窗口)内对股票进行两两相关,我们可以生成一个协方差矩阵,然后在 Markowitz 算法中用于投资组合分配。

为了估算 预期收益 ,为了透明起见,我们简单地使用一个线性回归器,并假设一只股票在我们持有它的持续时间内将继续向同一个方向移动。

使用我们的协方差矩阵和预期回报向量,我们现在可以使用 MPT 在选择股票时分配我们的资本,同时最小化风险,但保持所需的预期回报。

在这个方法中,有许多可优化的参数。具体来说,我们将优化以下内容:

  • 计算协方差矩阵的方法(皮尔逊最大信息量 C 系数或斯皮尔曼
  • 每对股票的成对相关窗口长度
  • MIC 的α、c 和估计参数
  • 用于估计每只股票回报的线性回归预测窗口长度
  • 卖出前投资组合策略的持有时间

总体策略如下图所示:

我们希望为我们的策略确定最佳的参数配置,使我们在回溯测试中的回报最大化。

我们已经用 Python 编写了策略代码,并将使用 OPTaaS 来执行贝叶斯优化。

计分功能

**def scoring_function(holding_time, correlater, forecaster_windows):**
    forecaster = LinearForecaster(forecaster_windows, tickers)
    simulator = SingleObjectiveSimulator(correlation_method=make_correlater(correlater, tickers), forecast_method=forecaster, 
                                         holding_time=holding_time, capital=10000)
    simulator.trade(data = prices.iloc[:-50])
    score = simulator.evaluate(prices)
    demo.display_values(locals(), score)
    return score

连接 OPTaaS

每个用户都有自己的基本 URL 和 API 键来连接 OPTaaS。连接只需要 1 行代码!

client = OPTaaSClient(OPTaaS_URL, OPTaaS_API_key)

创建一个 OPTaaS 任务

然后,您需要定义参数空间(类型、界限、分布)。标签可以匿名,但出于演示的目的,我们保留了它们。然后,我们需要为 OPTaaS 创建一个任务:

correlation_windows = GroupParameter("correlation_windows", items=[
    IntParameter(pair_name, minimum=2, maximum=5) for pair_name in ticker_pairs
])parameters = [
    IntParameter('holding_time', minimum=0, maximum=50),
    ChoiceParameter('correlater', choices=[
        GroupParameter('Pearson', items=[correlation_windows]),
        GroupParameter('Spearman', items=[correlation_windows]),
        GroupParameter('MIC', items=[
            correlation_windows,
            FloatParameter('alpha', minimum=SMALLEST_NUMBER_ABOVE_ZERO, maximum=1),
            FloatParameter('c', minimum=SMALLEST_NUMBER_ABOVE_ZERO, maximum=30),
            CategoricalParameter('est', values=["mic_approx", "mic_e"])
        ]),
    ]),
    GroupParameter("forecaster_windows", items=[
        IntParameter(ticker, minimum=2, maximum=5) for ticker in tickers
    ])
]task = client.create_task(
    title='Trading Demo v2',
    parameters=parameters,
    initial_configurations=initial_configurations

)

运行任务

我们需要做的就是按照用户指定的迭代次数(在本例中为 10 次)运行任务,输出将在下面的视频中捕获。

task.run(scoring_function, 10)

结果:

正如我们所看到的,不到 10 次迭代,OPTaaS 就能够确定一个有利可图的战略。此外,OPTaaS 能够在每次迭代后提高对策略搜索空间的理解,并能够快速了解哪些配置效果最好。

将贝叶斯优化应用于定量交易的好处

贝叶斯优化允许您减少为您的策略确定最佳配置所需的回溯测试次数,这允许您通过考虑更大的参数搜索空间,在策略构建过程中更加积极主动。

贝叶斯优化也可用于识别对输入扰动稳定的 【鲁棒】 配置。这可以在多目标设置中实现,目标是逼近多目标函数的 Pareto 集合(最大夏普、最小压降、最小周转等)。下图提供了一个示例:

Return vs Risk for various trading strategy parameter configurations

然后,您可以从满足您的风险/回报标准的“稳定”集群中抽取配置样本,构建您的“稳健”策略。

感谢 AlistairConstantinos 在 OPTaaS 内部开发和实施 MPT 战略。

如果你想在自己的算法交易策略上测试 OPTaaS,请不要犹豫要一个 API 密匙!

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

其他资源:

教程:https://tutorial . opta as . mind foundry . ai

API 文档:https://opta as . mind foundry . ai

研究http://www . robots . ox . AC . uk/~ mosb/projects/project/2009/01/01/bayesopt

数据科学家应该向软件工程师学习的 4 件事

原文:https://towardsdatascience.com/be-a-better-data-scientist-1a5ad87fe48?source=collection_archive---------2-----------------------

任何数据科学家都应该掌握的软件工程实践

执行机器学习(ML)研究被认为是一项“艺术”工作,因此它通常几乎没有技术标准或通用的技术最佳实践。

在 CRISP-DM 流程模型中,端到端 ML 项目的不同阶段很容易可视化,如下图所示。从高层次的角度来看,任何机器学习项目都有两个主要阶段:研究阶段:从业务理解到对所选模型技术的清晰性能评估,以及生产阶段(又名部署)。

The CRISP-DM Process

虽然很明显,我们在开发生产代码时要求的相同级别的软件实践在做研究时并不需要或不相关,但我确实认为大多数数据科学家在他们的日常研究工作中没有利用足够的软件工程实践,这最终影响了他们的成果和效率。

在这篇文章中,我想回顾一些众所周知的软件工程实践,这些实践很容易实现,并且对任何数据科学家都非常有益。无论您是单独工作还是作为团队的一部分,在编写自己的研究代码时采用这些实践肯定会让您成为更好的数据科学家。我们开始吧。

使用你的版本控制系统

版本控制系统(VCS)是伟大的工具,不仅因为它们让我们在不同的团队成员之间共享和同步相同的代码(或者仅仅是文件)。对于一个开发者来说,它们也是很好的工具,可以享受:版本化你的代码,回滚,远程备份等等。

VCS 已经被工程团队广泛采用,令人高兴的是,使用某种形式的 VCS 工具的数据科学家越来越多。然而,从我的经验来看,大多数使用 VCS 的 DS 倾向于对如何正确使用它们有一个知识缺口。这些糟糕的做法有双重影响,一方面,数据科学家觉得工具没有给他带来足够的价值,而他需要投入大量时间来使它工作(复杂的合并,代码以意想不到的方式被更改等等)。以下是我在观察数据科学家 VSC 的工作时遇到的一些常见陷阱。在我的示例中,我使用 git 作为 VSC 特定的参考,但是在其他 VSC 系统中,概念也非常相似:

  • 提交\推送\拉取很少 —提交是使用 VCS 时最原子化的部分。不经常提交,可能会使您面临代码丢失的风险,而不经常与集中的存储库同步将总是导致代码冲突和与其他团队成员的长时间合并。
  • 提交冗余文件 —并非所有文件都应该提交给 git。有些文件只是本地配置文件,或者可能是本地的中间结果文件,您最好自己保存它们。Git ignore 是一个很好的工具,可以用来管理那些你想在 Git 中忽略的文件。在您的提交中包含本地文件会导致冗余的提交、长的同步周期以及每当团队成员从远程存储库推/拉时反复出现的冲突。
  • 不利用树枝\标签 —很多人根本不知道树枝和标签的真正力量。当真正的意图和需要是维护同一代码库的不同版本时,许多人只是使用主要的“主”分支,甚至覆盖现有的代码,而不是使用在主要建模里程碑上版本化代码的能力,以及并行维护不同分支的可能性。

手动做可以轻松自动化的事情

在敏捷商业环境中拥有工作软件的需求是开发 CI\CD 工程实践的关键触发因素。作为任何 CI/CD 实践核心的最基本的概念是自动化。我们希望确保一个特定的流程在每一次执行中,以及在不同的环境中运行时,能够自动地、系统地工作。

在进行 ML 研究时,我认为自动化在两个主要方面对高效研究至关重要:

  • 数据准备 —每个数据科学家都知道,做研究是一项迭代任务,在这项任务中,你经常要从头开始重建数据集。原因可能有很多:您决定添加更多的要素,您发现了数据集中的数据问题,您想要添加更多的数据源,您发现了一些数据泄漏,或者您甚至想要选择不同的样本进行处理。不管原因是什么,事实是,在您的研究过程中,您可能会多次重建数据集。数据准备工作通常是 ML 项目中最耗时的阶段,因此也需要大部分数据科学家的编码工作。结合对迭代过程的需要,它是如此大的时间和代码消费者的事实,以及确保我们使用通过一些基本测试的数据准备代码(见我的下一个项目)是很好的激励因素,以确保我们的数据准备代码被正确处理,并且我们可以在单击按钮时重新创建用于建模的基本数据集。
  • 打包&部署 —我们的代码几乎总是使用某种形式的第三方和对其运行环境的假设。在 python 中,我们可能会导入第三方包,并假设特定的 python 和包版本。在 R 中,代码假定了特定的 R 版本和已安装的包。除了确保我们使用语言最佳实践来管理代码依赖关系(如 python 中的“需求”文件), docker containers 也可以是很好的工具,确保您的代码将在(几乎)任何使用虚拟化概念的环境中运行。对于这种方式,我们的目标应该是有一个基本的打包脚本(或 docker 构建脚本),当执行时,它安装所需的代码依赖项,并可以容易地部署在任何新的计算机\远程环境中。拥有这样的自动化应用程序打包,可以在不同的团队成员之间轻松共享,而不需要在他们的开发环境中做任何假设,并且当试图在远程环境中执行您的代码和模型时,这也是一个很好的工具。在研究过程中,一个非常有益的常见情况是利用云资源,通常是在本地资源不足以完成任务时。在这种情况下,您可能需要为任何远程执行打包和部署您的应用程序。强烈建议能够自动执行这一周期性任务。

你测试过你的代码吗?

在常规的软件开发中,开发工作和测试工作之间有着明显的区别。很明显,没有通过任何测试的代码不应该被部署到产品中(换句话说,它不会被实际使用)。然而,令人惊讶的是,在做研究时,测试的概念相当模糊或者根本不存在,即使这样,数据科学家也是根据这个研究代码来总结其工作和发现的。我想强调一下,让我们再说一遍,但这次是从相反的方向:通常,数据科学家得出的结论和模型是基于根本没有经过任何测试的代码!

虽然研究代码中的错误可能不会影响系统的功能,但是它可能会导致错误的结论和非最优的解决方案(相对于功能故障,这实际上更难发现,因为它们需要随着时间的推移监控生产中模型的质量)。显然,这些隐藏的错误有可能严重影响业务决策。

QA(质量保证)的概念在工程团队中得到了很好的发展,并且可以以多种形式出现,从单元测试到系统测试。考虑到研究环境中代码的动态特性,这些方法中的一些在做研究时应用起来似乎过于复杂。然而,我确实认为有两个基本的实践是任何数据科学家都应该经常做的,这可以显著提高你的研究代码的质量和保证水平。

  • 先测试再用——就这么简单。你写完了你的研究代码。握住你的手指,不要用它。首先做一些健全性测试,看看它是否如预期的那样工作(甚至手动测试在这里也会有所帮助)。一个基本且重要的例子是测试您的数据准备代码。在开始建模阶段之前,导出数据集的样本,确保数据集是按预期创建的。使用你的描述性统计工具和知识。确保每个场分布看起来合理,看看简单的相关矩阵,看看基本的相关性是否有意义,等等。
  • 执行代码评审——与同事一起进行代码评审不仅是发现潜在错误或代码问题的好工具,也是确保一些基本编码标准的好方法,也是确保技术/科学团队之间知识共享的好方法。让一个同行查看您的代码,不仅会发现一些代码错误,还会发现一些概念上的误解或错误,比如检测数据泄漏或糟糕的评估过程。

维护或创建编码标准

许多人认为代码标准实践只与大型开发团队相关。然而,任何在生活中做过编码的人都知道,你可能认为是编码时间的大约 90%的时间实际上是花在阅读和理解你面前的代码的行为上,即使那是你自己的代码!拥有一个混乱的代码,你需要投入大量的时间和精力去理解代码的编写方式,甚至在处理它实际做什么之前,这是一种浪费时间的行为。

代码标准是一个很大的概念,通常每种语言都有自己的最佳实践。对于研究阶段,我确实认为保持清晰和标准的编码格式可以节省大量时间,无论是对于需要使用别人编写的代码的同行,还是对于消耗自己代码的单个数据科学家。

这种格式编码标准可以包括:

清晰的项目结构、标准的函数和变量命名约定、模块化的功能代码(而不是很长的单一脚本)、适当的注释、删除冗余的依赖、代码缩进等等。

当我开始用 R 编程时,我非常惊讶,我发现没有正式的明确约定\ R 项目看起来应该如何的最佳实践。

我认为任何数据科学家都应该确保他的代码是干净的,并且符合最著名的行业标准。如果这样的标准不存在,创建一个你自己的。如果你是团队的一员,那么团队就要就一些明确的工作标准达成一致,这一点甚至更为重要。

柳文欢·拉松 是一位经验丰富的首席技术官,拥有超过 12 年的经验,在初创公司和全球企业中领导基于人工智能的产品从业务开始到生产。

柳文欢是一家基于机器学习隐形模式的初创公司的联合创始人,之前是一家成功的机器\深度学习专业服务公司 YellowRoad 的联合创始人。

做一个更高效的数据科学家,用这个指南掌握熊猫

原文:https://towardsdatascience.com/be-a-more-efficient-data-scientist-today-master-pandas-with-this-guide-ea362d27386?source=collection_archive---------2-----------------------

Python 是开源的。这很棒,但是有开源固有的问题:许多包做(或试图做)同样的事情。如果您是 Python 的新手,很难知道特定任务的最佳包。你需要有经验的人来告诉你。我今天告诉你:有一个包你绝对需要学习数据科学,它叫做熊猫

而熊猫真正有意思的是,里面还藏着很多其他的包裹。Pandas 是一个核心包,具有各种其他包的附加功能。这很好,因为你可以只用熊猫来工作。

pandas 就像 Python 中的 Excel:它使用表格(即数据帧)并对数据进行转换。但是它可以做得更多。

如果你已经熟悉 Python,你可以直接跳到第三段

让我们开始:

Don’t ask me why “pd” and not “p” or any other, it’s just like that. Deal with it 😃

熊猫最基本的功能

读取数据

sep means separator. If you’re working with French data, csv separator in Excel is “;” so you need to explicit it. Encoding is set to “latin-1” to read French characters. nrows=1000 means reading the first 1000 rows. skiprows=[2,5] means you will remove the 2nd and 5th row when reading the file

最常用的函数:read_csv、read_excel
其他一些很棒的函数:read_clipboard(我经常使用它,从 excel 或 web 上复制数据)、read_sql

写入数据

index=None will simply write the data as it is. If you don’t write index=None, you’ll get an additional first column of 1,2,3, … until the last row.

我通常不喜欢其他功能,比如。to_excel,。to_json,。从那以后。to_csv 很好地完成了这项工作。因为 csv 是保存表格最常用的方式。还有。to_clipboard 如果你像我一样是个 Excel 狂热者,想把你的结果从 Python 粘贴到 Excel。

检查数据

Gives (#rows, #columns)

Computes basic statistics

看到数据

Print the first 3 rows of the data. Similarly to .head(), .tail() will look at the last rows of the data.

Print the 8th row

Print the value of the 8th row on “column_1”

Subset from row 4 to 6 (excluded)

熊猫的基本功能

逻辑运算

Subset the data thanks to logical operations. To use & (AND), ~ (NOT) and | (OR), you have to add “(“ and “)” before and after the logical operation.

Instead of writing multiple ORs for the same column, use the .isin() function

基本绘图

matplotlib 包使这一特性成为可能。正如我们在介绍中所说,它可以直接用于熊猫。

Example of .plot() output

Plots the distribution (histogram)

Example of .hist() output

If you’re working with Jupyter, don’t forget to write this line (only once in the notebook), before plotting

更新数据

Replace the value in the 8th row at the ‘column_1’ by ‘english’

Change values of multiple rows in one line

好了,现在你可以做一些在 Excel 中很容易做到的事情了。让我们挖掘一些在 Excel 中做不到的惊人的事情。

中级功能

计数出现次数

Example of .value_counts() output

对整行、整列或所有数据的操作

The len() function is applied to each element of the ‘column_1’

的。map()操作将函数应用于列的每个元素。

A great pandas feature is the chaining method. It helps you do multiple operations (.map() and .plot() here) in one line, for more simplicity and efficiency

。apply()将函数应用于列。使用。应用(,axis=1)在行上执行此操作。

。applymap()将函数应用于表格(DataFrame)中的所有单元格。

独一无二的 tqdm

当处理大型数据集时,熊猫可能需要一些时间来运行。map(),。apply(),。applymap()操作。tqdm 是一个非常有用的包,有助于预测这些操作何时完成执行(是的,我撒谎了,我说过我们将只使用 pandas)。

setup of tqdm with pandas

Replace .map() by .progress_map(), same for .apply() and .applymap()

This is the progress bar you get in Jupyter with tqdm and pandas

相关矩阵和散布矩阵

.corr() will give you the correlation matrix

Example of scatter matrix. It plots all combinations of two columns in the same chart.

处理缺失值

The inplace=True will fill the missing values directly in your dataset. If you don’t write inplace=True, it will temporarily fill the missing values, not permanently.

熊猫的高级操作

SQL 连接

加入熊猫太简单了。

Joining on 3 columns takes just one line

分组

一开始并不简单,你需要先掌握语法,你会发现自己一直在使用这个特性。

Group by a column, the select another column on which to operate a function. The .reset_index() reshapes your data as a DataFrame (table)

As explained previously, chain your functions in one line for optimal code

遍历行

的。iterrows()一起遍历两个变量:行的索引和行(上面代码中的 irow )。

总的来说,熊猫是 Python 如此伟大的语言的原因之一

我本可以展示许多其他有趣的熊猫特征,但这已经足以理解为什么数据科学家离不开熊猫。

总而言之,熊猫是

  • 简单易用,隐藏了所有复杂和抽象的计算
  • (通常)直觉
  • 快速,如果不是最快的数据分析包(它在 C 语言中高度优化)

它是帮助数据科学家快速阅读和理解数据并提高工作效率的工具。

我希望这篇文章对你有用,如果有用,考虑至少给 50 次掌声:)

通过更智能的销售报告提高利润

原文:https://towardsdatascience.com/be-more-profitable-with-a-smarter-sales-report-7a9c0202e0e6?source=collection_archive---------12-----------------------

现在是星期四晚上 10 点。在餐馆工作了 12 个小时,送走了最后一批顾客后,我,老板,终于有机会坐下来检查每天的销售报告。但是我只有几分钟的时间,因为我有一张明天之前要做的其他事情的清单。

我们很好奇,想知道为什么我们采访的餐馆似乎很少关注每日销售报告。决定一家餐馆是否经营良好的重要成功标准是什么?是否有每周或每月检查一次的更复杂的报告?

当今餐馆如何使用销售报告

不同的餐厅从不同的 POS 系统得到不同的销售报告。通过与 50 多名餐馆老板交谈,他们中的大多数人都回顾了当天的总销售额、付款方式和封面数量。总销售额让所有者清楚地了解他们的业务表现如何,他们是否赚了足够的钱来支付成本,如果是,赚了多少。审查这只需要几秒钟,似乎是“足够”的大多数业主。

我们经常被告知,他们“非常了解业务”,花“大约 10 到 50 分钟”检查不同卡系统的卡支付,包括每天清点钱柜中的现金,会有明显的好处。

“如果有时间,我还会查看客人的数量。系统里有,但是我没有打印出来。把这个数字和主菜的销售额对比一下,我就知道有多少人来这里吃一顿饭或者喝下午茶。”—玛丽,一个临时餐馆老板。

在真实世界中观察 POS 和报告

餐饮企业确实关心有关他们业务的数据和见解,但他们不会去检查。从我们的采访来看,目前的报道似乎需要太长时间来“消化”。许多 POS 系统打印出大量数据,但仍然需要时间来理解。这些数据没有立即反映出明确的行动。我们被告知,从 POS 系统“很容易获得”报告。然而,报告的价值似乎没有超过导出它们的努力。如前所述,经理们似乎每天只对少数几个关键数字感兴趣。

我们看到的每个 POS 系统都有某种版本的销售报告。从接受订单到支付账单,这些系统似乎收集了大量数据。餐馆老板可以选择他们想看的数据。但是,过多的选择和灵活性会不会成为一种负担,而不是一件富有成效的事情。

以下是我们的一些其他重要观察结果:

  • 餐馆老板每天只花时间检查直接影响他们日常业务表现的数据。
  • 目前还不清楚什么是对餐馆老板最有用的数据
  • 获得关于业务的有用见解需要太多时间。他们有生意要做。

如何从销售报告中获得更多

73%的餐馆经营者同意投资餐馆技术使他们的经营更有利可图。(1)

技术的作用应该是以“正确的方式”帮助一个企业。我们认为“正确的方式”是当一个企业可以看到利益,而不妨碍他们想要如何经营他们的业务。利用餐馆的数据还可以做更多的事情。简单地列出一长串数据点是没有用的,而且需要时间来“消化”。在一天结束前被告知你可能无法完成今天的目标不是更有帮助吗?或许还有一些关于如何行动的建议?

许多餐馆和咖啡馆可以从一份更直接回答关键商业问题的报告中受益。通过将企业数据呈现为更有意义和更方便使用的内容,技术可以帮助所有者腾出更多时间来处理企业事务。

让我们看一个例子(见图 1 ),并从下面选择一些数据点(如总销售额、每位客人的销售额、不同菜肴的销售额等):

Diagram 1. Example sales data from a POS system

乍一看,我们可以看到周二的总销售额(以橙色表示)比周一要好(分别为 20,750 美元和 19,250 美元)。周一有 250 个订单(蓝色),周二少了 50 个订单。如果我们只看到总销售额和订单总数,结论可能是“在星期二,餐馆不太忙,但出售价格更高的商品”。但我们不能肯定地说。可能只是星期二的顾客吃了更贵的东西。

那么,如果我们还获得了客人总数,并显示了每位客人每天的销售额(绿色)。在上面的例子中,周一的客人多花了 12.50 美元。

你想知道你的客人周一买了什么,以便你能监控如何影响周二的销售吗?一份更好的销售报告可以告诉你这一点,甚至更多。

现在,让我们看看总利润(红色),我们会发现餐馆在星期一和星期二都有 10,000 美元的利润。虽然周二实际上更忙,但周一销售了更多有利可图的项目(如甜点、开胃菜)。烹饪主菜比开胃菜和甜点需要更多的时间。因此,总销售额和总订单数并不总是能显示这些有用的信息。

那么,更好的报告能减少思考时间,让所有者更好地控制如何获得更多利润吗?

掌握有用的见解

一份“有用”的销售报告应该有助于所有者更好地监控他们的业务,而无需过多的思考。它需要快速和简单,因为所有者和管理者没有时间考虑如何使他们的数据更有用。可视化正确的数据有助于这一点。

  1. 不同时间的总销售额和总订单数有助于店主制作花名册,从而降低劳动力成本。如果从中午 12 点到下午 2 点有更多的订单,只在午餐时间雇用一名兼职人员。

Diagram 2. Total sales and total orders

2。订购的特殊项目的比率给了企业如何调整菜单上的项目的想法。

Diagram 3. Ratio of “Recommended” and “Gluten free” items ordered

突出重点菜式可以帮助你更好地了解顾客和他们喜欢什么,例如,推荐的饮料或符合特殊饮食要求的主菜。

3.点的饮料、甜点、配菜和主菜的比例和组合给出了如何 促销其菜单产品的商业思路 。如果一家餐馆为一种饮料提供特价,能让 10%的顾客点它,餐馆能获得更多利润吗?

Diagram 4. Ratio of drinks, desserts and sides to mains

在图表 4 中,周一和周二的饮料销售是相同的,但是周一的销售比例(50%)远远多于周二(28.6%)。和饮料类似,周一的甜点、头盘、配菜的比例(75%、50%、12.5%)都比周二(14.2%、14.2%、7%)好。如果餐馆在星期二提供半价饮料(8 美元),并且 10%的顾客(例如 80 人)点了它,它将带来 640 美元的额外销售额。因此,利润将增加 400 美元。

4。最上面的有序菜单项帮助厨房决定哪些项目保留在菜单上,哪些项目改变。

Diagram 5. The top 5 menu items ordered

通过更智能的报告让您的业务数据变得有用

在上面的例子中,通过更快地理解星期二发生的事情,很快就找到了增加利润的方法。想象一下,无论是在会议间隙还是在休息时,您都可以通过手机或平板电脑随时随地安全地访问这些内容。有了更多有用的数据,企业所有者和管理者可以腾出一些时间来经营企业的其他部分,或者利用这些时间来改善企业。

如果你能结合从多年经验中获得的知识和业务数据来实现更多的目标,会怎么样?敬请期待:)

数据和图表均来自 Atumio 。您想了解其他有用的报告吗?有什么想法可以分享吗?请随时联系 hello@atumio.com。在 Instagram脸书上有很多有趣的发现。

餐厅技术:明天成功的关键

Atumio——通过漂亮的社交菜单拉近人们的距离

足智多谋—在数据科学领域取得成功的最重要技能之一

原文:https://towardsdatascience.com/be-resourceful-one-of-the-most-important-skills-to-succeed-in-data-science-6ed5f33c2939?source=collection_archive---------1-----------------------

然而,这是最容易被遗忘的技能之一

足智多谋是指找到并使用可用资源来解决问题和实现目标的能力。

在数据科学和生活中追求成功的过程中,没有比足智多谋更重要的特质了。

我在数据科学领域已经工作了相当长一段时间,我一直在研究和学习许多成功的数据科学家的品质——无论是他们职业生涯中的专业品质,还是他们个人生活中的品质。

您可能会想,要成为一名成功的数据科学家,无非是以下维恩图中的组合:

(Source)

从技术上讲,这没有错,而且你是绝对正确的。然而,在学习、理解和与各种数据科学家交谈之后,缺少了一些东西——是的,软技能——而足智多谋是作为一名数据科学家取得成功的要素之一。

在这篇文章中,您将了解为什么足智多谋对于学习和追求数据科学道路至关重要,我也将分享我的经验,希望展示您如何使用这一被遗忘的技能来追求数据科学的成功,最重要的是,在生活中。

所以让我们开始吧!

1.足智多谋是一种心态

足智多谋是一种心态。句号。

当你设定的目标或问题很难实现,或者你无法想象一条清晰的路径去实现你的愿望时,这一点尤其重要。

这完全没问题。我们中的许多人(包括我)经常没有一个清晰的路径或方法来解决我们的问题以实现我们的目标。

未来存在不确定性是正常的。但是停滞不前是不行的,哪里也不去,只能等待奇迹发生。因为很有可能,它们不会发生。很遗憾告诉你真相,但现实总是残酷的。

💡足智多谋就是要主动

特别是对于有志于从事数据科学职业的数据科学家来说,有大量的资源等待着他们去发掘。然而,他们中的大多数往往是一个被动的观察者,而不是积极主动地寻找和创造自己的资源。

当我们在这里谈论资源时,我们指的是书籍、在线课程、开源项目(Kaggle 等。)、黑客马拉松和竞赛,最重要的是网络。

有了足智多谋的心态,我们就有动力去寻找方法。没有等待。我们会一直努力找到方法,一直。

当我第一次开始学习和追求我的数据科学职业生涯时,我像其他有抱负的数据科学家一样被大量的资源所困惑,其中每一个都声称是最好的。不知所措。我尽可能多地阅读书籍和文章,向尽可能多的数据科学家寻求建议,尽可能多地参加在线课程(不管是好的还是差的),尽可能多地犯错误,并从中吸取教训。

学习的道路是不确定的,但我是积极的。最终,我筛选出了一些最有用的资源,它们帮助我在尽可能短的时间内进入了数据科学领域。而且我还写了一篇文章——如何走进数据科学? —用实用指南汇编所有资源。希望对你也有帮助。

你看。当你足智多谋时,你不会让外界环境决定你何时或如何采取行动,否则你将永远满足于现状。

足智多谋的态度会激发创新思维,产生新的想法,以及想象所有可能的方式来实现你的愿望的能力。

拥有足智多谋的心态需要你保持积极。每个问题都有解决的办法,即使这意味着方向的改变。

2.足智多谋是一种技能

足智多谋是一种技能。

好消息是:这项技能是可以学习和掌握的。

我不会说我已经掌握了这项技能,因为我仍然是一个足智多谋的学习者,现在是,将来也永远是。

仅仅拥有足智多谋的心态不足以解决问题和实现我们的目标。这就是将心态付诸行动的技巧所在。

掌握足智多谋的技能在数据科学中尤为重要,因为这个领域还很年轻,没有明确的发展道路。正是这种微妙性让这个领域变得如此富有挑战性、令人兴奋,同时又有回报。这正是我在这里写数据科学的原因,因为我热爱它!

💡足智多谋就是知道找谁/找什么,问什么

下面就来说说在工作中要想在数据科学上取得成功,应该找谁。

不管承认与否,我们无法掌握数据科学中的一切,肯定有一些我们不知道和不理解的东西。因此,找到合适的人寻求帮助和建议是极其重要的。

你可能会花几个小时去理解一些重要的技术概念。但是,如果你去问你的一个朋友或同事,他是这个领域的主题专家(SME ),会怎么样呢?过去的几个小时有可能被缩短为几分钟甚至更短。

有时候答案可能就在一个问题之外。

我得对你说实话。在我工作的头几个月,我在理解领域知识、使用的数据管道、一些技术术语等方面遇到了很多困难。是的,我本可以花时间问自己或者疯狂地在网上搜索答案,但是我决定接近我的团队成员,和他们一起澄清我的问题。砰!!大多数时候,这些问题都得到了解答,并让我加快了工作速度。

但这是棘手的部分。

既然我们知道要找什么和谁,我们需要知道要问什么,并以正确和最有效的方式问。换句话说,我们需要知道问什么以及如何问正确的问题来解决我们的问题。

除了向同事寻求帮助,作为一名数据科学家,我们还会在谷歌上寻求帮助和答案。栈溢出数据科学中心Quora分析 Vidhya …你说得出的。

有很多次,我键入一些关键字来搜索解释和解决方案,但谷歌返回给我一些我不感兴趣的资源。沮丧。我试着稍微调整一下关键词,结果完全不同,给了我更准确的结果!

如果说我从这次经历中学到了什么的话:提出正确的问题不仅重要,我们还必须使用正确的关键词进行搜索,以获得最佳结果。

再说一遍,这里有很多资源。足智多谋,从合适的资源中学习。

最后的想法

(Source)

简而言之,只有当我们把足智多谋的心态和技能结合起来时,才能获得足智多谋。

在今天的数字时代,从来没有比现在更多的噪音,因此,对我们来说,从浩瀚的信息海洋中提取信号以充分利用资源是至关重要的。

感谢您的阅读。我希望这篇文章能让你对足智多谋在数据科学以及生活中取得成功的重要性有所了解。

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

Admond Lee 目前是东南亚排名第一的商业银行 API 平台【Staq】的联合创始人/首席技术官。

想要获得免费的每周数据科学和创业见解吗?

加入 Admond 的电子邮件简讯——Hustle Hub,每周他都会在那里分享可行的数据科学职业建议、错误&以及从创建他的初创公司 Staq 中学到的东西。

你可以在 LinkedInMediumTwitter脸书上和他联系。

[## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

www.admondlee.com](https://www.admondlee.com/)

Beads —仅附加针对内存占用优化的数据结构

原文:https://towardsdatascience.com/beads-append-only-data-structure-optimised-for-memory-footprint-78d241426756?source=collection_archive---------8-----------------------

我必须承认,我对数据表示产生了一种不健康的迷恋。我认为它是基本的构建模块,在计算机科学中没有得到足够的重视。

在这篇博文中,我想介绍一种数据结构,它主要专注于以非常紧凑的方式表示数据,因此提供了最小的内存占用和良好的数据局部性

小免责声明:beads 数据结构的参考实现是用 Swift 编写的,所以简短的代码片段会在 Swift 中,但不用担心,我让它对于不熟悉 Swift 编程语言的人来说是易于理解的。

当我们谈论数据结构时,我们关注运行时特征和大 O 符号。然而,我没有看到很多关于内存占用的讨论。比如:链表是一种广为人知的数据结构,以 O(1) prepend 特性而闻名。然而,我从来没有读到过这样的讨论——一个 64 位架构上的指针如何有 8 字节宽,这意味着一个布尔值列表将为每个列表元素占用 16 字节。与位数组相比,布尔值链表需要 128x 更多的空间。不要让我从数据位置开始。

eads 被设计成一个序列,它在追加时压缩值。Append 是在常数时间内执行的,它涉及一些计算,但是这些并不是很昂贵,并且基于复杂性理论,我们可以假设运行时间特性为 O(1)。

让我们举一个实际的例子。假设我们有一个数字序列[1, 5, 6, 7],我们希望将它存储在一个数据结构中。最简单的就是把它存储在一个数组里。如果数字是正数并且小于 256,我们可以将它们存储在一个[UInt8](https://developer.apple.com/documentation/swift/uint8)数组中。这意味着每个条目将只占用 1 个字节。

如果我们需要在数组中存储一个负数或者更大的数,会发生什么呢?在这种情况下,我们需要确定最大的可能值,并根据这种特殊情况选择一个数字类型。然而,预测潜在价值的大小非常困难,甚至是不可能的。这就是为什么我们通常不麻烦,我们定义一个整数数组[Int],其中[Int](https://developer.apple.com/documentation/swift/int)在 64 位架构上是 64 位宽。这意味着我们每个条目占用 8 个字节,尽管这是完全不必要的。

珠子做了一些不同的事情。Beads 不仅存储值,还存储类型。一个类型存储在 4 位中,这意味着我们可以在一个字节中存储 2 个类型标签。让我们把我们的数字系列[1, 5, 6, 7]储存在珠子里:

[{u8/u8}, 1, 5, {u8/u8}, 6, 7]

我们为每两个条目引入一个标签条目{/},这意味着条目的数量增长到 150%。因此,如果我们可以将我们的数字序列存储为一个[UInt8],我们就是在浪费空间。然而,如果我们将序列存储为[Int]。该序列如下所示:

[1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,]

每个数字占用 8 个字节。我们假设我们在一个小端架构上。不需要的字节等于0。如果我们比较珠子和一组Int——珠子只占大约 19%的空间。

如果序列是稀疏的,这种影响会变得更大——意味着我们有很多nil值。

例如:[5, nil, nil, nil, nil, 2]=>6 字节

变成:[{u8/nil}, 5, {nil/nil}, {nil/u8}, 2]=>5 字节

当一个nil值被附加到珠子上时,只有标签被添加,因为标签只占用一半的字节,我们有 50%的好处。所以在[UInt8]的情况下,我们损失 50%,[UInt8?] 随着每个nil值获得 50%。也就是说,如果我们有相同数量的数字和nil值,我们就是 100%。如果nil值的数量更大,我们向 50%收敛。如果更小,我们就向 150%收敛。

追加是如何工作的?

珠子公开了各种数字类型的附加方法。当使用类型为Int的数字调用 append 时,我们检查这个数字是否可以用更小的类型来表示。最简单但不一定是最有效的解决方案是双重造型和比较:

let value: Int = 42
let u8Value = UInt8(value)
if value = Int(u8Value) {
  // store value as u8
}

我们把初始值转换成一个更小的数字表示,然后再把它转换回来,看看它是否等于初始值。在这种情况下,我们可以采用较小的表示,并将其存储在底层缓冲区中。

该解决方案甚至适用于浮点数。浮点通常以 4 字节(单精度)或 8 字节(双精度)存储。如果传递给 append 的值是一个[Double](https://developer.apple.com/documentation/swift/double),但实际上是一个小整数(例如42.0),我们可以节省高达 81%的空间。

弦乐呢?

如果我们有一个只和数字一起工作的数据结构,这将是非常有限的。存储一个字符串序列是一个非常普通和重要的任务。

如果我们考虑一下,字符串只是一系列数字,它们对应于特定的字符编码。如今最流行的字符编码是 UTF-8 。它将文本转换成一系列的UInt8数字,或者如果你愿意的话,转换成[Data](https://developer.apple.com/documentation/foundation/data)。珠子可以附加一系列的UInt8数字,或者Data作为一个带有一对类型标签的珠子。这里有一个例子:

"Maxim" => [{data/u8}, 5, [77, 97, 120, 105, 109]]

字符串"Maxim"用下面的标签对{data/u8}表示。它表示下一个条目是以 u8 类型的大小为前缀的数据。这样,迭代器能够将下一个条目解释为大小5,并且知道接下来的 5 个条目[77, 97, 120, 105, 109]属于一起。数据内部的 5 个条目形成字符串"Maxim"ASCII /UTF-8 表示的信息没有存储在任何地方,并且被认为是隐含的知识。

这里有一个更复杂的例子,我们存储了一个带有nil值的字符串序列:

["Max", "Maxim", "", nil, "Alex"]
=>
[{data/u8}, 3, [77, 97, 120], {data/u8}, 5, [77, 97, 120, 105, 109], {data/u8}, 0, {nil/data}, {u8/-}, 4, [65, 108, 101, 120]]

让我们把这个例子分解一下。

"Max""Maxim"并不奇怪,它们存储在{data\u8}标签中,后面是代表字符串的大小和数字。

空字符串("")却很有趣。标签字节仍然是{data/u8},但是后面只跟着0。这些信息足以存储一个空字符串。

接下来是nil,在这种情况下,我们甚至不需要标签对。一个nil是一个nil,可以用一个标签来表示,只占用标签字节的一半。

下一个条目是"Alex",不出所料,它必须由一个{data/u8}标签对来表示,但是由于我们在前面的字节中仍有空间仅被nil占用,因此该标签对将分布在两个字节中。这就是导致{nil/data}, {u8/-}, 4, [65, 108, 101, 120]的原因。

零重量表示的压缩数据

如你所见,beads 非常努力地尽可能少地浪费内存。这是实现这个目标的另一个窍门。

如果我们将字符串存储在 UTF-16 中,让我们看看我们的字符串序列会是什么样子。这种格式也很普遍,但是特别是对于简单的 ASCII 字符来说更浪费。这是我们之前在 UTF-16 中的例子:

["Max", "Maxim", "", nil, "Alex"]
=>
[{data/u8}, 8, [255, 254, 77, 0, 97, 0, 120, 0], {data/u8}, 12, [255, 254, 77, 0, 97, 0, 120, 0, 105, 0, 109, 0], {data/u8}, 0, {nil/data}, {u8/-}, 10, [255, 254, 65, 0, 108, 0, 101, 0, 120, 0]]

现在"Max"表示为{data/u8}, 8, [255, 254, 77, 0, 97, 0, 120, 0]。标签字节是相同的,但是代表字符串的数字序列的长度是 8,而不是 UTF-8 中的 3。这是因为在 UTF-16 编码中,我们将每个字符存储在 2 个字节中,我们需要在序列前加上所谓的 BOM ,它可以识别数字是根据大端还是小端存储的。

当我们存储使用许多简单 ASCII 字符的语言(如英语)编写的文本时,我们最终会有许多0值。这就是我所说的“ 零重表象 ”。在这种情况下,珠子提供一种特殊的珠子类型,称为紧凑数据(简称为c_data)。让我们直接看看它的运行情况:

["Max", "Maxim", "", nil, "Alex"]
=>
[{c_data/u8}, 6, [{01010111}, 255, 254, 77, 97, 120], {c_data/u8}, 9, [{01010111}, 255, 254, 77, 97, 120, {00000101}, 105, 109], {c_data/u8}, 0, {nil/c_data}, {u8/-}, 8, [{01010111}, 255, 254, 65, 108, 101, {00000001}, 120]]

使用c_data,我们能够将"Max"减少到 75%——从 8 字节减少到 6 字节。

这是通过以下技术实现的:

我们创造了一串珠子。如果你仔细想想,[255, 254, 77, 0, 97, 0, 120, 0]可以被看作是一个 beed 本身。不过我们知道数字都是UInt8,所以可以用标志字节来存放别的东西。我们使用标志字节来存储下一个字节是否等于0。这样我们减少了:

[255, 254, 77, 0, 97, 0, 120, 0]

to ( 位屏蔽应从右向左读)

[{01010111}, 255, 254, 77, 97, 120]

使序列缩短两个字节。

现在,记住我们将[1, 5, 6, 7]存储为[Int]的例子

[1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,]

这也是一个 零重的表象。 如果我们将其存储为c_data会怎么样?

[{c_data/u8}, 8, [{00000001}, 1, {00000001}, 5, {00000001}, 6,{00000001}, 7]]

我们以(8 + 2)字节结束,这比 32 字节好,但仍然比 6 字节差,我们能够通过直接珠子追加来实现。

让我们进一步了解珠子的想法

我们讨论了添加数字和字符串,但是对于更复杂的数据类型呢?这一次,如果一个数据类型可以转换成Data[UInt8],我们可以像附加字符串一样附加它。然而,我们可以做得更好。假设我们想要创建一个三维向量的珠子:

struct Vector3 {
  let x: Double
  let y: Double
  ley z: Double
}

我们可以说,我们可以将每一个Vector3转换成它自己的珠子数据结构,然后将它们连接在一起。

让我们看看:

Vector(x:2, y: 4, z:0)可转换为[{u8/u8}, 2, 4, {u8/-}, 0]

以及Vector(x:5, y: 8, z:257)[{u8/u8}, 5, 8, {u16/-}, 1, 1]

所以如果我们有多个向量

[
  Vector(x:2, y: 4, z:0), Vector(x:5, y: 8, z:257)
]

我们可以把它们连接到下面的珠子上

[{u8/u8}, 2, 4, {u8/-}, 0, {u8/u8}, 5, 8, {u16/-}, 1, 1]

这里有一个有趣的小细节。Vector3有 3 个属性,这意味着第二个标签的第二部分是一个 跳过 标记-。如果我们想快速连接两颗珠子。我们保留 skip 标记,并用第二个珠子扩展第一个珠子的底层缓冲区。然而,如果我们不想浪费内存,我们可以将第二个珠子的成员一次附加到第一个值上,从而产生以下珠子:

[{u8/u8}, 2, 4, {u8/u8}, 0, 5, {u8/u16}, 8, 1, 1]

意思是——如果我们想为每秒连接的珠子节省一个字节,我们可以做到!(我不确定我们是否应该这样做)

在这一点上,我想强调一下,beads 是一个短暂的数据结构,也就是说,它不是持久的。这是一个有意识的选择,因为目标是拥有一个最小内存占用的数据结构。

我们如何从珠子中读取数据?

正如我之前提到的,珠子基本上是一个序列。在 Swift 中有一个叫做[Sequence](https://developer.apple.com/documentation/swift/sequence)的协议,它对实现类型强加了一个要求:它必须提供一个迭代器

大多数其他语言都提供了类似的协议:

  • [Iterable](https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html)在 Java 中
  • [IEnumerable](https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx)在 C#中
  • [IntoIterator](https://doc.rust-lang.org/std/iter/trait.IntoIterator.html)在生锈
  • 等等…

Beads 是一个Sequence,迭代器提供对下一个 beads 的访问。那么作为用户,我们可以检查这个珠子是否是一个nil值,或者要求将珠子解释为intuintdoubledata。如果给定的珠子不能按要求解释,我们得到一个nil值。因为我们可以明确地检查一个值不是nil,所以我们可以识别一个问题。

下面是一个简单的单元测试,我们将值附加到珠子上,然后将珠子映射到一个新的数组中,并检查它是否等于初始值:

func testSequenceU8AndI8ToInt() {
  var beads = BeadsSequence()
  let values = [
    1, 0, nil, 250, nil, 5, -5, -127
  ]
  for v in values {
    beads.append(v)
  }
  XCTAssertEqual(beads.map { $0.int }, values)
}

复杂数据类型呢?

为了让处理复杂数据类型变得愉快,我们引入了一个BeadsConvertible协议:

public protocol BeadsConvertible {
  static func from(
    sequenceIterator: BeadsSequence.BeadsIterator
  ) -> BeadsSequence.FailableResult<Self>?
  var numberOfBeads: Int { get }
  func toBeads() -> BeadsSequence
}

当一个类型实现这个协议时,它允许我们将这个类型的实例转换成珠子,反之亦然。

这是一个单元测试,它执行从[CGPoint](https://developer.apple.com/documentation/coregraphics/cgpoint)阵列到珠子的往返行程:

func testCGPoint() {
  var sequence = BeadsSequence()
  let points = [
    CGPoint(x: 2, y: 4),
    CGPoint(x: 2.5, y: 4.5),
    CGPoint(x: 2.1, y: 4.1)
  ]
  for point in points {
    sequence.append(point.toBeads())
  } let pointsArray = sequence.beadsConvertibleSequence(
      for: CGPoint.self
  ).map { try?$0.get() } XCTAssertEqual(points, pointsArray)
}

观点

Beads 是一种专门的数据结构,在内存占用和数据局部性很重要的用例中非常有用。它还被设计成数据序列化格式的平台。它有它的局限性,例如,它只能附加,但这也是它能做好一件事的原因。

我很想听听你们的想法、关切和建议。

我会尽快把链接添加到 github 库。

2018 年 8 月 26 日更新:

我很高兴地宣布,珠数据结构是在 Github:

[## 珠子数据结构

GitHub 是人们构建软件的地方。超过 2800 万人使用 GitHub 来发现、分享和贡献超过…

github.com](https://github.com/beads-data-structure)

2019 年 5 月 31 日更新:

由于珠子用于 Dart,我们引入了另一种(最后一种可能的)珠子类型— TinyData。

当存储的字节数组小于 16 字节时,使用微小数据。在这种情况下,数据的长度可以存储为一个标签(4 位):

"Maxim" => [{t_data/5}, [77, 97, 120, 105, 109]]

这样,我们为每个项目节省了一个字节。

目前只能在 dart 存储库中找到微小数据的实现:

[## 珠子-数据-结构/珠子 _ 镖

Dart 的珠子数据结构。通过在…上创建帐户,为 beads-data-structure/beads _ dart 开发做出贡献

github.com](https://github.com/beads-data-structure/beads_dart)

其他实现也将随之而来。

用于数据可视化的 BeakerX 和 Python

原文:https://towardsdatascience.com/beakerx-and-python-for-data-visualization-b143f960c93c?source=collection_archive---------14-----------------------

Jupyter Notebooks 为数据工程师提供了一个强大的工具,可以即时从海量数据中提取见解。典型地,Pythonistas 使用笔记本来快速编译代码、测试/调试算法和扩展程序执行;一个健壮的 Javascript 内核(这里是)现在也可以作为 IJavascript 用于笔记本,但是当然,即使是笔记本使用的 Javascript 仍然遵守变量声明的单赋值约束。由于 Jupyter 提升了 Python 安装包,Jupyter 笔记本迅速发展成为 Python 学习和数据科学的默认平台,数据可视化越来越成为大规模数据集和预测映射的可访问窗口。

BeakerX 是由 Two 适马发起的一个开源项目,这是一家投资管理公司,为他们的投资决策提供机器学习和分布式计算。作为适马众多开源项目中的一个,BeakerX 是迄今为止最强大、对社区贡献最大的项目,其多方面的目标是扩展 Jupyter 生态系统。

尽管这个项目——更确切地说是 Jupyter 扩展的分组——乍一看似乎增加了 Jupyter 笔记本的绘图和通用数据可视化库存,但它也为笔记本增加了多语言支持;通过 BeakerX 的安装,用户可以用 JVM 语言和其他语言(Groovy、Scala、Clojure、Kotlin、Java、SQL,当然还有 Python)创建一个笔记本。或者,如下所示,Python 和 Javascript 的混合(通过 Jupyter 的 magics 和 autotranslation)结合起来,从 Python 操作的数据集创建 D3.js 交互式可视化:

Python and Javascript in the same notebook — for a future post?

迟早会给我们带来:

Python & D3.js, via BeakerX

然而,BeakerX 的可视化和交互功能正是这个项目的初衷,我们将通过一个交互示例来展示它的易用性。(尽管 BeakerX 的官方活页夹中的许多例子都是用 Groovy 编写的,但我们在这里将重点关注 Python。)

装置

首先,确保PATH被正确声明(这是关于 MacOS 安装的)。MacOS 上的 Python 和 Anaconda 有时可能无法按预期执行,尤其是当您的机器上有多个 Python 版本时(例如 Python 2.7&3.6);Pandas 可能在一个位置,而可执行的 Python 版本在另一个位置(在这种情况下,您可以通过终端为必要的版本起别名)。我发现在尝试安装 BeakerX 的首选方法conda install之前,以下方法可以确保事情指向正确的方向。

~ $ export PATH=~/anaconda3/bin:$PATH

一旦处理完毕,一个接一个地运行下面的代码行,它们应该会毫无问题地执行和安装相关的库:

~ $ conda create -y -n beakerx 'python>=3'
~ $ source activate beakerx
~ $ conda config --env --add pinned_packages 'openjdk>8.0.121' 
~ $ conda install -y -c conda-forge ipywidgets beakerx

( NB。BeakerX 与 Python 版本> 3.4 一起工作。)

在那里,从 Anaconda Navigator 或您的终端初始化您在localhost:8888的 Jupyter 笔记本,

~ $ jupyter notebook

Take note of the available JVM languages, in addition to Python 3 and SQL

初始化后,我喜欢运行下面的代码来检查一切是否正常:

我们准备好出发了…

该项目

熟悉 BeakerX 功能的最佳方式是解析官方活页夹,并从熟悉的数据可视化技术开始,如时间序列输出、热图或直方图,所有这些都可能是数据科学家通过 Seaborn 的基于 matplotlib 的库或 Bokeh 库所熟悉的。我们将关注基于 Python 的输出容器示例的一小部分,这里的

我们将使用 Python 和 Pandas 从大约 300 行数据中创建一个交互式散点图,最终结果如下:

Finished product

这些数据是 BeakerX 自己的,可以在 GitHub repo 上找到。为了便于测试,有一个数据的最小化版本,但是我将使用完整的版本,它只有 314 行长,因此生成了一个更完整的图。

(有一点需要简要说明:散景的交互性本身就很强大和令人满意,而 bqplot——通过彭博——同样提供了标准化的 2D 可视化选项。但是 BeakerX 更适合与 Spark 集群计算框架集成,一个简短的教程展示了在 BeakerX 的领导下,TensorFlow 和神经网络集成是如何轻松实现的。)

尽管如此,出于介绍的目的,我们还是将重点放在一个简单的散点图上。因此,首先,我们必须通过 Pandasread数据,并打印前 5 行以检查是否一切正常:

Did we import Pandas?

敏锐的读者会注意到我们只跑了import beakerx(或者,T2)。然而,我们可以在不进口熊猫的情况下经营熊猫…

查看源代码可以发现,BeakerX 将 Pandas 合并到了它的构建中,提供了自动编译的pd.dataframe和其他 Pandas 调用的功能。

如果不了解 Pandas 库,当基于 Python 的笔记本生成可视化或处理数据时,可能很容易忽略 BeakerX 允许的大量简写代码。因此,知道pd引用了什么是有帮助的,即使read_csv是相当不言自明的。(只要确保.csv在一个可到达的目录中!)在这种情况下,BeakerX 依赖于 panda,但它也用更多类似电子表格的动作来增强 panda 的基本方法。正如下面可以看到的,BeakerX 对 Pandas 库的处理带来了更大的灵活性,从而(更)容易实现可视化。这次,对前 20 行数据运行df.head(20):

接下来,我们将处理美学:

以及处理绘图的代码:

当涉及到这样的绘图时,熟悉熊猫当然有所帮助,但如果你使用过 Jupyter 笔记本,那么你已经完成了关于熊猫、其数据帧和某种绘图的基础知识。IPython 旨在轻松处理这些事情。但简单来说…

我们将数据帧设置为df,在我们调用plot.add来构建绘图的地方,我们同样调用PointsLine参数作为数据的xy轴。因此,df.y1df数据帧中的y1列;df.y30df数据框中的y30列。等等。此外,为了便于说明,我们将setShowLegend布尔值设置为True,将鼠标悬停在图例中的项目上会根据所选的动作照亮或隐藏相应的数据点。

最终,这将产生一个整洁的、交互式的(参见。多亏了 BeakerX,只需几行 Python 代码就能绘制出来:

(完整笔记本见本要旨,或官方活页夹此处。)

结论

由于内置了多语言功能和笔记本 magics,BeakerX 是一个效率和工作流的发电站,很高兴看到更多的神经网络处理开发,特别是通过 TensorFlow 或分布式计算框架。这样的进步将允许更多的编程新手容易和直观地理解人工智能编程的复杂内部工作原理。

但在我看来,最令人兴奋的是它是开源的,是适马推动数据科学社区的两个项目之一。许多活跃的问题可供每个人挖掘并着手处理。

CTC 训练神经网络中的波束搜索解码

原文:https://towardsdatascience.com/beam-search-decoding-in-ctc-trained-neural-networks-5a889a3d85a7?source=collection_archive---------0-----------------------

一种具有集成语言模型的快速且性能良好的算法,用于在文本识别背景下解码神经网络输出

由卷积神经网络层和递归神经网络层以及最终的连接主义时间分类(CTC)层组成的神经网络(NN)是(手写)文本识别的良好选择。

神经网络的输出是一个矩阵,包含每个时间步长(水平位置)的字符概率,图 1 中显示了一个例子。这个矩阵必须被解码以得到最终的文本。实现这一点的一种算法是波束搜索解码,它可以很容易地集成字符级语言模型。

Fig. 1: Output matrix of NN consisting of two time-steps (t0, t1) and two characters (“a”, “b”) plus the CTC blank (“-”). The numbers indicate the probability of seeing the character at the given time-step.

我们将从回顾 CTC 和最佳路径解码开始我们的讨论。然后我们将讨论 CTC 波束搜索解码算法的构建模块(基本算法、CTC 评分、语言模型)。最后,我将向您介绍一个 Python 实现,您可以使用它来进行自己的测试和实验。

简短提醒反恐委员会如何工作

阅读文章“联结主义时态分类的直观解释”有助于你理解下面的讨论。在这里,我将给出一个简短的回顾。

CTC 允许用成对的图像和真实文本来训练文本识别系统。文本通过路径在 NN 输出矩阵中编码,每个时间步包含一个字符,例如“ab”或“aa”是图 1 中可能的路径。我将用双引号“文本”显示文本,用单引号“路径”显示路径。

路径以下列方式对文本进行编码:文本中的每个字符都可以重复任意多次。此外,可以在字符之间插入任意数量的 CTC 空格(非字符,不要与空白字符混淆,在本文中用“-”表示)。如果出现重复字符(如“pizza”),则路径中这些重复字符之间必须至少有一个空格(如“piz-za”)。

以下是带有相应路径的文本示例:

  • "到"→ '-t-o -',' tttttttt-ooo-','到',…
  • “你好”→‘h-ellll-ll-ooo’,‘hel-lo’,…
  • " a" → 'aa ',' a-','-a ',…

如您所见,一个文本对应的路径可能不止一个。当我们对文本的概率感兴趣时,我们必须对所有相应路径的概率求和。单个路径的概率是该路径上的字符概率的乘积,例如,对于图 1 中的路径‘aa ’,它是 0.2±0.4 = 0.08。

最佳路径解码

最佳路径解码是解码输出矩阵的最简单方法:

  • 每个时间步连接最可能的字符,产生最佳路径。
  • 然后,通过首先删除重复字符,然后删除所有空格来撤消编码。这给了我们可识别的文本。

让我们看一个例子:矩阵如图 2 所示。对于时间步长 t0 和 t1,得分最高的字符为空。所以,最佳路径是'-'。然后我们撤销编码,得到文本" "。此外,我们可以通过乘以字符概率来计算路径的概率,在本例中是 0.8±0.6 = 0.48。

Fig. 2: Concatenate most probable characters per time-step to get best path.

最佳路径解码速度很快,我们只需为每个时间步找到分数最高的字符。如果我们有 C 个字符和 T 个时间步,算法的运行时间为 O(T ^ C)。

为什么最佳路径解码会失败

最佳路径解码既快速又简单,这当然是很好的特性。但是在某些情况下可能会失败,如图 2 所示。在图 3 中,对应于文本“a”的所有路径被示出:“aa”、“a-”和“-a”。文本“a”的概率是这些提到的路径的所有概率的总和:0.2 0.4+0.2 0.6+0.8 0.4=0.52。所以,“a”比“”的概率更大(0.52>0.48)。我们需要一种比最佳路径解码更好的算法来处理这种情况。

Fig. 3: All paths corresponding to text “a”.

波束搜索解码的基本版本

波束搜索解码迭代地创建文本候选(波束)并对它们评分。基本版本的伪代码如图 4 所示。:用空射束(第 1 行)和相应的分数(2)初始化射束列表。然后,该算法在神经网络输出矩阵(3–15)的所有时间步长上迭代。在每个时间步长,仅保留来自前一时间步长的最佳刻划射束(4)。波束宽度(BW)指定要保留的波束数量。对于这些波束中的每一个,计算当前时间步长的分数(8)。此外,每个光束被扩展字母表中所有可能的字符(10),并且再次计算分数(11)。在最后一个时间步之后,返回最佳波束作为结果(16)。

Fig 4: Basic version of beam search.

让我们用 BW 2 和 alphabet {"a "," b"}来形象化算法如何解码我们的示例 NN 输出。图 5 示出了待解码的 NN 输出和波束树。该算法从一个空射束“”开始,它对应于树的根节点。然后,光束被复制并被字母表中所有可能的字符扩展。这给了我们光束“a”,“b”和“”。稍后,我们将进一步了解如何计算射束分数。现在,我们使用我们的直觉,看到只有一条路径对应于每个波束:“a”的概率为 0.2,“b”的概率为 0,“a”的概率为 0.8。

在下一次迭代中,我们只保留来自前一时间步的 2 个最佳波束(根据 BW ),即我们丢弃波束“b”。然后,我们再次复制并扩展幸存的梁,得到" aa "," ab "," a "," a "," b "," "。如果两个光束相等,如“a”的情况,我们简单地将它们合并:我们将分数相加,只保留其中一个光束。我们再次用我们的直觉来计算分数。每个包含“b”的波束的概率为 0。“aa”的概率也是 0,因为要对具有重复字符的文本进行编码,我们必须在字符之间插入空格(例如“a-a”),这对于长度为 2 的路径是不可能的。最后剩下的就是光束“a”和“”。我们已经计算了它们的概率:0.52 和 0.48。

我们完成了最后一次迭代,算法的最后一步是返回得分最高的射束,在本例中是“a”。

Fig. 5: NN output and tree of beams with alphabet = {“a”, “b”} and BW = 2.

在横梁上划线

我们还没有讨论如何在平衡木上得分。我们将波束得分分成以空白结尾的路径得分(例如“aa-”)和以非空白结尾的路径得分(例如“aaa”)。对于非空白情况,我们用 Pb(b,t)和 Pnb(b,t)表示所有路径以空白结束并对应于时间步长 t 处的波束 b 的概率。波束 b 在时间步长 t 处的概率 Ptot(b,t)就是 Pb 和 Pnb 之和,即 Ptot(b,t)=Pb(b,t)+Pnb(b,t)。

图 6 显示了当我们扩展一个路径时会发生什么。主要有三种情况:通过空格扩展、通过重复最后一个字符扩展和通过其他字符扩展。当我们折叠延伸的路径时,我们要么得到未改变的(复制的)光束(“a”→“a”),要么得到延伸的光束(“a”→“aa”或“ab”)。我们也可以反过来使用这些信息:如果我们延伸一个光束,我们就知道我们必须考虑哪些路径来计算分数。

Fig. 6: The effect of appending a character to paths ending with blank and non-blank.

让我们看看如何迭代计算 Pb 和 Pnb。请注意,我们总是添加而不是分配计算值(+=而不是=),这隐式地实现了前面讨论的光束合并。所有 Pb 和 Pnb 值最初设置为 0。

复制光束

要复制一个光束,我们可以用一个空格扩展相应的路径,得到以空格结尾的路径:Pb(b,t)+=Ptot(b,t-1) mat(blank,t)。

此外,我们可以通过最后一个字符来扩展以非空白结尾的路径(如果光束非空):Pnb(b,t)+=Pnb(b,t-1) mat(b[-1],t),其中-1 表示光束中的最后一个字符。

延伸光束

有两种情况。要么我们将光束扩展一个不同于最后一个字符的字符 c,那么就不需要在路径中分隔空格:Pnb(b+c,t)+=Ptot(b,t-1) mat(c,t)。

或者最后一个字符 b[-1]被重复,那么我们必须确保路径以空格结束:Pnb(b+c,t)+=Pb(b,t-1) mat(c,t)。

我们不用关心 Pb(b+c,t),因为我们增加了一个非空白字符。

字符级语言模型

字符级语言模型(LM)对一系列字符进行评分。我们将 LM 限制为对单个字符(unigram LM)和成对字符(bigram LM)进行评分。我们将字符 c 的一元概率表示为 P(c ),将字符 c1,c2 的二元概率表示为 P(c2|c1)。一条短信“hello”的得分是看到单个“h”的概率,看到一对“h”和“e”挨着的概率,以及一对“e”和“l”挨着的概率,…

一个字符序列 c1,c2,c3,…的概率为:P(c1,c2,c3,…)=P(c1) P(c2|c1) P(c3|c2) …

从大量文本中训练这样一个 LM 很容易:我们只需计算一个字符出现的频率,然后除以字符总数,就可以得到单字概率。我们计算一对字符出现的频率,并对其进行归一化,以获得二元模型概率。

把所有的放在一起

CTC 波束搜索算法如图 7 所示。它类似于已经展示过的基本版本,但是包含了对梁进行评分的代码:复制的梁(第 7-10 行)和延伸的梁被评分(第 15-19 行)。此外,当将光束 b 延伸字符 c 时,应用 LM(第 14 行)。在单字符梁的情况下,我们应用一元得分 P(c),而对于更长的梁,我们应用二元得分 P(b[-1],c)。波束 b 的 LM 分数被放入变量 Ptxt(b)中。当算法寻找最佳得分波束时,它根据 Ptot Ptxt(第 4 行)对它们进行分类,然后取 BW 最佳波束。

Fig. 7: CTC beam search with character-level LM.

运行时间可以从伪代码中推导出来:最外面的循环有 T 次迭代。在每次迭代中,N 个波束被排序,这占 N log(N)。BW 最佳波束被选择,并且它们中的每一个被扩展 C 个字符。因此,我们有 N=BW C 个波束,总运行时间为 O(T BW C log(BW C))。

履行

波束搜索解码(以及其他解码算法)的 Python 实现可以在 CTCDecoder 资源库中找到:相关代码位于 src/BeamSearch.py 和 src/LanguageModel.py 中,TensorFlow 提供了 ctc_beam_search_decoder 操作,但是,它不包括 LM。

估价

在 IAM 数据集上对 NN 进行解码给出了最佳路径解码的 5.60%的字符错误率,以及波束搜索解码的 5.35%的字符错误率。每个样本的运行时间从 12 毫秒增加到 56 毫秒。

下面是 IAM 数据集的一个示例(见图 8 ),可以更好地了解波束搜索如何改善结果。使用和不使用 LM 的最佳路径解码和波束搜索来完成解码。

Ground truth:        "the fake friend of the family, like the"
Best path decoding:  "the fak friend of the fomly hae tC"
Beam search:         "the fak friend of the fomcly hae tC"
Beam search with LM: "the fake friend of the family, lie th"

Fig. 8: Sample from IAM dataset.

结论

CTC 波束搜索解码是一种简单快速的算法,性能优于最佳路径解码。角色级别的 LM 很容易集成。

参考

在 5 分钟内击败 Datadriven 的邓艾竞赛基准

原文:https://towardsdatascience.com/beating-datadrivens-dengai-competition-benchmark-in-5-minutes-c12e86c4331c?source=collection_archive---------7-----------------------

持续时间最长、最有趣的数据科学和机器学习竞赛之一毫无疑问是邓艾竞赛。参赛者被要求根据环境信息预测两个南美城市的登革热病例数。

在本文中,我们试图通过仅使用一个特征时间序列预测来击败竞争对手的基准分数。在脸书的先知库,一个 Jupyter 笔记本和总共二十行代码的帮助下,我们学会了如何在几分钟内打破基准分数。

邓加伊

比赛要求你利用美国联邦政府各机构收集的环境数据,预测圣胡安(波多黎各)和伊基托斯(秘鲁)每周报告的登革热病例数。所提供的数据具有诸如每周最高温度、湿度和降雨量的特征。

平均绝对误差 (MAE)用于评分。看看排行榜上的最高分,很明显挑战并不容易:最高分的人只有 13 分多一点,而排名在第 100 位左右的人只有 17 分。如果你知道在 Iquitos 提供的数据中,每周的平均病例数只有 8 例左右,这意味着即使是顶级模型也几乎没有预测能力。

然而,比赛组织者提供了一个基准分数,包括一个完整的笔记本来帮助你开始。在这个例子中,他们只使用了负二项式广义线性模型中的几个特征,结果得分为 25.81。这篇文章的目标是通过使用时间序列预测技术,尽可能快地打破这个记录。为了帮助我们完成这项任务,我们将使用脸书的 Python 先知库

什么是脸书先知

2017 年初脸书开源 ProphetPython 和 R. Prophet 中可用的预测工具特别适合预测季节性强、历史趋势变化和遵循非线性增长曲线的趋势的时间序列。使用 Prophet 的其他好理由是提供的优秀文档和整体易用性。

Prophet for Python 可以像任何其他库一样使用,可以在命令行安装或更新。因为我使用 Python 的 Anaconda 发行版,所以我使用了一个简单的 conda 安装。

conda install -c conda-forge fbprophet

如果你在安装 Prophet 时遇到任何麻烦或错误,看看 Github 的问题或者在谷歌搜索中抛出你的错误。

准备数据

在开始预测之前,我们需要掌握数据。进入邓艾竞赛页面下载列车功能、列车标签和测试功能。然后打开一个 Jupyter 笔记本,导入熊猫numpymatplotlibfbprophet (全库或者只 Prophet 类)。

*import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet*

将数据载入你的笔记本。

*train = pd.read_csv('dengue_features_train.csv')
test = pd.read_csv('dengue_features_test.csv')
labels = pd.read_csv('dengue_labels_train.csv')*

由于我们将尝试纯粹基于时间数据进行预测,因此我们可以从数据框架中去掉城市周 _ 开始 _ 日期总 _ 例数。注意,我们选择 week_start_date 作为时间数据,因为这个特性已经被表示为一个标准日期时间字符串,并且不需要任何转换。

*train['total_cases'] = labels['total_cases']prophet_data = train[['city', 'week_start_date', 'total_cases']]*

接下来,拆分伊基托斯和圣胡安的数据,删除城市列,因为我们的预测不需要这个。

*prophet_data_sj = prophet_data[prophet_data['city'] == 'sj']\
                .drop('city', axis=1)
prophet_data_iq = prophet_data[prophet_data['city'] == 'iq']\
                .drop('city', axis=1)*

然后,对您的测试数据进行同样的操作,但是只保留 week_start_date 列。

*test_sj = test[test['city'] == 'sj']['week_start_date']
test_iq = test[test['city'] == 'iq']['week_start_date']*

为了使 Prophet 库正常运行,必须将时间特性命名为 ds 以及预测值为 y 。对两个数据帧都这样做。

*prophet_data_sj.columns, prophet_data_iq.columns = 
                                           ['ds', 'y'], ['ds', 'y']*

现在我们的数据已经准备好进行一些先知魔法了!

先知魔法

我们可以开始使用 fbprophet 库来预测我们测试数据的值。为了方便起见,我们将创建一个函数,将训练数据、测试数据和两个预测参数作为输入。

建立先知预测的第一步是创建一个先知类的新实例。在初始化该类时,您可以设置一大堆参数(例如周 _ 季节性日 _ 季节性),但我们将只设置变点 _ 先验 _ 标度(默认为 0.05)* 和年 _ 季节性(默认为 10) 。*

为了理解第一个参数的含义,你需要知道时间序列的趋势经常发生突变。这些变化被称为变点。 Prophet 将自动检测这些变化点,并允许趋势适当调整。

Prophet 通过首先指定大量潜在的变点来检测变点,然后对速率变化的幅度进行稀疏先验。这实质上意味着,Prophet 有大量可能改变速率的地方,但将尽可能少地使用它们。

调整稀疏先验的强度将改变模型的灵活性,并且可以使用 changepoint_prior_scale 参数进行调整。通过向上调整该参数,将使用更多的变点,因此模型将更好地拟合训练数据。

因为这个参数被用来改变模型的灵活性,并对抗过拟合或欠拟合,我们在函数中称这个参数为 flex

第二个参数yearly _ 季节性,是使用部分傅立叶和估算的。看看这篇论文了解更多关于部分傅里叶和与周期信号的信息。本质上,季节性论点决定了季节性变化的速度。

在我们的案例中,我们最有可能更好地应对较低的季节性,因为我们的数据与似乎不会改变的年度天气模式密切相关(看看气候训练和测试数据)。

我们函数的下一步是通过调用 fit() 函数使我们的训练数据符合我们的 Prophet 。然后,我们希望创建一个数据帧,表示我们希望预测的未来日期。这可以通过调用我们的 Prophet 上的make _ future _ data frame()函数来轻松完成。

该函数有两个参数:周期频率。在我们的例子中,周期的数量应该正好是我们测试数据的长度,频率应该设置为每周一次(‘W’),因为我们每周都有数据点。

然后,终于到了用预测值填充我们未来数据框架的时候了。我们通过调用 Prophet 上的 predict() 来实现这一点,并将未来数据帧作为输入。我们还在 Prophet 上运行 plot() 来获得我们预测的可视化。

*def create_forecast(train_data, test_data, flex, seas):

    prophet = Prophet(changepoint_prior_scale=flex, 
                      yearly_seasonality=seas) 

    prophet.fit(train_data)

    future_frame = prophet.make_future_dataframe(
        periods=len(test_data), 
        freq='W')

    forecast = prophet.predict(future_frame)

    prophet.plot(forecast)

    forecast = forecast[['ds', 'yhat']].yhat\
        .apply(lambda x : int(x))return forecast[len(train_data):]*

如果您看一下预测数据帧,您应该看到它有一大堆变量,包括时间戳( ds )和预测值( yhat )。切掉这两个值,并将预测转换为整数(竞赛只接受整数作为预测)。

数据帧还包括来自我们的训练和测试数据的所有数据。我们只需要对测试数据的预测。截取测试数据并返回这个数据帧作为我们函数的输出。现在,我们的功能已经完成,我们可以开始使用它来预测我们的登革热数据。

制作两个预测,一个针对伊基托斯,一个针对圣何塞,并将它们存储在一个变量中。这里,我们使用季节性(10)和灵活性(0.05)的默认值。

*forecast_sj = create_forecast(prophet_data_sj, test_sj, 0.05, 10)
forecast_iq = create_forecast(prophet_data_iq, test_iq, 0.05, 10)*

查看预测,我们可以看到我们确实创建了两个熊猫系列,并对我们的测试数据进行了预测。除了这个系列,还应该弹出一个图表,其中原始数据是分散的,预测是连续的线。摆弄一下季节性和灵活性参数,看看它们如何影响预测(蓝线)信心(浅蓝色)趋势(红线)和转折点(垂直红色虚线)。

Predictions for San Juan with respectively high flexibility and high seasonality

提交结果

可以说是整个流程中最简单的一步,就是准备好提交的结果并上传到 DrivenData 上。要了解提交要求,看一下提交格式(在这里找到)。

DengAI submission format

总之,比赛需要一个。csv* 文件,有四列,分别命名为城市年份星期几总 _ 例数(我们的预测)。我们再次创建一个函数,将两个城市的预测和一个提交名称作为输入。*

我们连接预测,将它们与索引列合并,给所有列指定所需的名称,并将结果数据帧保存为。csv* 文件。确保为您的 csv 提供适当的名称,以便您记住用于预测的参数(例如 prophetflex05seas10 )。*

*def create_submission(forecast_sj, forecast_iq, sub_name):

    test_index = test[['city', 'year', 'weekofyear']]

    output = pd.concat([forecast_sj, forecast_iq])\
        .reset_index().drop(['index'], axis=1)

    output.columns = ['total_cases']

    pd.concat([test_index, output], axis=1)\
        .set_index(['city']).to_csv(sub_name + '.csv')*

现在,用默认的预测参数创建一个新的提交,并给它起一个合适的名字。

*create_submission(forecast_sj, forecast_iq, 'prophetflex05seas10')*

前往竞赛提交页面并上传您刚刚创建的 csv 文件以获得分数。您应该得到 26.76 的结果,这不是我们所希望的,比基准测试还要差。请记住,这个分数是我们测试数据集中每个预测日期的平均误差。

看看您的代码生成的图表,您会发现两种预测多一点灵活性可能不会有什么坏处(增加灵活性)。此外,伊基托斯的季节性非常多变,我们的预测会更好,季节性趋势会稍微平稳一些(减少季节性)。

Forecast for San Juan and Iquitos with default Prophet parameters

用这些新信息做一个新的预测。例如,将两个城市的弹性设置为 0.10,并将伊基托斯的季节性降低为 5。

*forecast_sj = create_forecast(prophet_data_sj, test_sj, 0.1, 10)
forecast_iq = create_forecast(prophet_data_iq, test_iq, 0.1, 5)create_submission(forecast_sj, forecast_iq, 'prophsjf10s10iqf10s5')*

再次提交结果,并得出结论,我们仅用几行代码和一个特性( week_start_date )就击败了竞争基准。请注意,没有使用机器学习来进行预测。

下一步是什么?

  • 用剩下的数据!利用环境数据根据天气特征进行预测。将这些结果与我们在这里建立的时间序列预测模型结合起来。
  • 调整参数。尝试通过改变参数来提高模型的得分,不仅是这里讨论的参数,还有这里没有讨论的所有其他参数(参见文档)。
  • 寻找新的数据源。看看你能否在新闻网站或博客上找到任何关于圣胡安和/或伊基托斯登革热疫情(或没有疫情)的信息。了解年度趋势会给你带来巨大的优势。

—请随时在评论中或私信中向我指出任何不一致或错误。—

我们的人工智能如何使用数据科学在梦幻超级联赛中获得前 10 名

原文:https://towardsdatascience.com/beating-the-fantasy-premier-league-game-with-python-and-data-science-cf62961281be?source=collection_archive---------1-----------------------

(团队编号:2057677)

我们对 EPL 梦幻联盟的摇钱树方法

注意:我们开始了一个新的博客,我将在这里运行更新的算法,并更新我的团队在整个 19-20 赛季的表现:

https://medium . com/@ pruchka/EPL-fantasy-is-one-week-away-and-our-algorithm-is-ready-to-play-78 afda 309 e 28

我的朋友( Andrew Sproul )和我已经玩了很多年的官方梦幻英格兰超级联赛,尽管我们坚信我们了解英格兰足球的一切,但我们倾向于年复一年地“倒霉”,不知何故似乎从来没有选出获胜的球队。因此,我们最终决定将数据科学和“金钱球”方法应用于团队/球员分析,以确定我们是否真的在每个赛季选择了最佳的球员组合。我们的研究始于从梦幻游戏 API 中提取最新的玩家数据,并使用 Python 对所有 EPL 团队和所有个人玩家进行统计分析。我们项目的最终目标是编写一个 Python 算法,它使用来自我们分析的数据进行“智能”挑选,并在我们有限的 100 毫米预算下建立最佳的梦幻联盟阵容。

注意:最理想的幻想小队将会根据每花费一美元的幻想点数返回的总点数=投资回报率来衡量。

我们的分析将以以下假设为指导,旨在回答以下关键问题:

  1. 要检验的主要假设:
  • 大多数娱乐性的 EPL 幻想玩家在为他们的幻想队挑选队员时会有个人偏见和偏爱。换句话说,人们通常会根据他们支持的球队以及目前哪些 EPL 球员是“最热门”的来做出决定,而不会将单个球员视为长期投资以及他们每一美元的投资回报率。
  • 我们相信,如果我们在选择我们的梦幻阵容时,从决策过程中消除偏见和偏袒,并专注于单个球员的统计数据和整体团队表现,我们可以在赛季结束时比普通人做得更好。

2.我们的分析旨在回答的关键问题:

  • 个别球员梦幻联赛的统计数据,他们的球队在英超联赛中的总积分,以及该球队相应的积分榜位置之间是否存在相关性?
  • 我们能否识别出有很多表现不佳、价格过高的球员的球队,以及那些拥有非常稳固但被低估的阵容的球队,这样我们就可以告诉我们的算法相应地从这些球队中挑选球员?(注:“被低估”和“被高估”是根据幻想联盟成本而非现实世界中的实际玩家价值来衡量的。)
  • 我们能否将英超官方梦幻游戏视为股票市场的等价物,将单个球员视为金融资产,并根据他们的投资回报率找出所有定价过低和过高的球员,并相应地投资我们的梦幻美元预算?

单个玩家投资回报率=玩家幻想点数/玩家幻想成本(换句话说,我们在玩家身上花费的每 1 毫米幻想美元的总点数回报。)

  • 我们的理论是,这有助于将我们有限的 1 亿英镑梦幻联盟预算花在球员身上,在整个赛季中,每花 1 美元梦幻就能获得尽可能多的积分。
  • 如果这被证明是真的,那么我们是否可以使用 Python 来构建一个算法,通过挑选尽可能多的高 ROI 球员并结合一些昂贵的超级明星来优化预算的使用,以最大化每总预算支出的总积分回报?
  • 我们的算法和玩 EPL 幻想游戏的普通人相比怎么样?我们的团队获得了什么样的总体排名,他们是否以显著优势击败了普通玩家?

注意:这个项目是在 2018 年 11 月 14 日,游戏周 10 之后执行的,所以文章中的所有数据和表格都是准确的。

我们程序的主要步骤如下:

1.查看单个团队的数据

首先,我们首先根据目前的积分榜排名排列所有巴克莱 EPL 球队,并查看所有球员的总积分,以了解这是否与球队的积分榜位置直接相关。

Total Fantasy Squad Cost vs. Total Fantasy Points per team

我们可以清楚地看到,一般来说,一支球队在英超联赛中的表现与其球员的累计梦幻积分之间存在线性相关性。上面的橙色条显示了每支球队的球员在梦幻联盟货币方面的总成本。这有助于我们识别出平均每美元投资(ROI)可产生可观梦幻积分回报的球队,例如— 曼城、利物浦、切尔西、亚足联伯恩茅斯、沃特福德和狼队。这也暴露了一些被认为是糟糕投资的球队,如——热刺、阿森纳、曼联、富勒姆、哈德斯菲尔德、西汉姆和南安普顿。

接下来,我们绘制了每支球队的累积球员投资回报率与教练经常使用的球员数量的关系图(本赛季迄今为止至少打了 360 分钟的球员)。这将有助于我们识别那些拥有太多昂贵且表现不佳的球员的球队,由于他们的教练经常轮换阵容,这些球员很少每场比赛打满 90 分钟,从长远来看,这使他们成为一项糟糕的投资,因为他们不会每场比赛都持续不断地产生梦幻积分。此外,下面的图表将帮助我们确定教练不经常轮换球员的球队,这将导致这些球队拥有更一致的常规球员核心。这将通知我们的算法从这些球队中挑选更多的球员,因为从长远来看,他们的球员预计会产生更高的总 ROI,因为与来自经常轮换球员的球队的球员相比,他们平均会参与更多的游戏活动。

Team ROI vs Number of players that have played more than 360 mins

在上图中,我们在寻找有很高的蓝条(累积球员投资回报率)和较短的橙条(教练定期使用的球员总数)的球队。这一类别的领导者是伍尔弗汉普顿,AVG 投资回报率为 8.21,只有 11 名教练经常使用的球员(平均每名伍尔弗汉普顿球员身上花费的 1 美元产生 8.21 分的收益)。这意味着与他们的表现相比,伍尔弗汉普顿的大多数球员都被低估了,教练经常使用同样的 11 名球员,并且只在比赛快结束时或正式队员受伤时使用替补队员。即使像曼城、利物浦和切尔西这样的球队也属于这一类,拥有 13-14 名正式队员,这意味着从上述任何球队中挑选球员从长远来看都是一项不错的投资,因为正式队员比替补队员平均上场时间更长。

这一类别中最大的输家是曼联、热刺、阿森纳、埃弗顿、西汉姆和富勒姆,他们的投资回报率在 4-5 之间,许多常规球员的回报率高达 15-16。这意味着,通过从这些球队中挑选球员,你正在进行一项“糟糕的投资”,因为教练经常轮换阵容,你的球员可能无法参加每场比赛。此外,统计数据清楚地表明,与他们在梦幻联盟中的表现相比,这些球队的球员被高估了,这是由他们低于平均水平的 ROI 所表明的。

2.查看单个玩家的数据

在确定了哪些团队产生了更高的累积投资回报率之后,我们接着放大了单个玩家。在股票市场方面,我们已经确定了所有的高收益市场部门——团队——现在我们要开始分析每个部门的所有个股——玩家。计划是分离出一个具有最高 ROI 的玩家列表,并编写一个 Python 算法,该算法将使用智能逻辑来挑选最佳的玩家组合,这将为我们 1 亿毫米的有限预算带来最高的投资回报。

看着上面玩家花费与玩家总幻想点数的散点图,我们希望我们的人工智能选择出现在图上尽可能靠西北的玩家(低花费玩家产生大量幻想点数)。请注意,我们还希望包括一些来自该地块东北角的顶级玩家,因为这些将是一些产生大量积分的明星联盟玩家,尽管他们有点昂贵,但他们最终仍有不错的 ROI。下图描绘了前 20 名投资回报率玩家与后 20 名投资回报率玩家的对比。因此,我们希望我们的最终算法尽可能多地选择这些高产玩家。我们希望远离那些相对于他们的表现(高成本/低幻想点)价格过高的球员,如哈里·凯恩、阿莱克西斯·桑切斯、罗梅卢·卢卡库、克里斯蒂安·埃里克森、阿尔瓦罗·莫拉塔、保罗·博格巴、德勒·阿里等等。

Top 20 and Bottom 20 Players by ROI plotted against AVG League ROI

我们决定绘制上面的统计数据,包括联盟中所有球员的 AVG 投资回报率(绿线= 5.74 ),以直观地了解“表现出色”和“表现不佳”的球员是什么样子。例如,联盟中收益最高的球员马科斯·阿隆索的投资回报率为 12.11 ,是 AVG 5.74 的两倍多,这使他成为我们算法中显而易见的选择。

在下面的饼状图中,我们可以看到球员价值最高的球队和球员价值最低的球队的分布情况。我们期待我们的最终算法能够从拥有许多高产球员的各种球队中挑选球员,例如——伯恩茅斯、狼队、利物浦切尔西、曼城、沃特福德和埃弗顿。这种聪明的方法与普通人玩幻想游戏的方法非常不同,后者主要从他/她最喜欢的球队中挑选球员,加上来自 4 或 5 个最受欢迎球队的少数球员——阿森纳、托特纳姆、曼联、切尔西、利物浦或曼城,然后用廉价的“填充”球员填充他们幻想球队的剩余部分,这些球员从不在真实比赛中出场,也不会产生任何幻想积分。

Teams with the most players from the TOP 50 ROI list

Teams with the most players from the BOTTOM 50 ROI list

3.编写挑选最佳幻想团队的 Python 算法

现在是最有趣的部分——编写实际的 Python 算法,并将人工智能选择的结果与普通人可能为他们的幻想团队选择的结果进行比较。

要理解我们算法的逻辑,首先必须理解下面 EPL 幻想游戏的规则和约束:

  • 每个幻想玩家的预算都是 100 万英镑,必须购买 15 名足球运动员(11 名主力+ 4 名替补)才能参赛。
  • 你需要至少有 2 名守门员,5 名后卫,5 名中场球员和 3 名前锋,以完善你的阵容并有资格参加比赛。
  • 同一个足球队不能有 3 名以上的球员。

因此,我们用一个针对这些条件的if-else语句开始我们的 python 算法,然后在此基础上添加我们自己的条件和逻辑,这样每次算法遍历我们的玩家列表时,它都可以使用智能逻辑根据下面的条件做出有效的选择:

  • 检查一个球员是否受伤,被禁赛或不能比赛,如果是这样,即使他们有很高的投资回报率,也不要选择这个球员加入我们的梦幻队。
  • 先挑联盟累计联赛积分最多的前三名明星球员。(我们将使用不同数量的明星球员来测试这种情况的结果,并选择能够产生最大投资回报的版本,同时仍然允许足够的剩余预算来填充我们的团队,让我们拥有许多投资回报率排名前 50 的球员。
  • 每次我们挑选一名球员并将其加入我们的球队,我们都会从 1 亿美元的预算中减去他们的费用,并将他们的位置和球队名称添加到一个列表中,以确保我们不再为达到限制的位置和球队购买球员。
  • 一旦选择了最佳数量的昂贵超级明星球员,该算法就开始浏览投资回报率最高的球员名单,并试图尽可能多地找到顶级球员,直到我们接近耗尽我们的预算并填补所有的球队职位。
  • Algorithm 打印出它在最后挑选的球员名单,并给我们剩余的预算和球队的总幻想点数。

这里是我们团队挑选算法的一些压缩 Python 代码:

Optimal Fantasy Team Selector

下面你可以看到我们的算法选出的最终团队的截图:

注:以下团队仅准确到 2018 年 11 月 14 日。我们的算法旨在每个游戏周之后更新玩家数据,并根据团队/玩家 ROI 数据的波动做出新的选择。

Money Team as of Nov 14th, 2018 (944 Total Fantasy Points, World Ranking: 1st out of 5.8 million people)

注:我们为 AVG·乔团队编写了一个类似的算法,该算法更侧重于将预算花在来自大球队的明星球员身上,这些球员往往定价过高,可能无法在我们 1 亿英镑的有限预算中获得最高的累计投资回报。

注意:我们还要求一位同学选择一个他自己的随机团队,这样我们可以比较他的选择,并验证我们为 AVG·乔算法设计的随机团队选择器函数是准确的。

4.比较我们的结果

既然两种算法都已经建立并执行,让我们比较一下“金钱团队”与“AVG·乔的团队”和“随机同学团队”的结果,看看哪一个表现最好,差距有多大。最终结果显示,我们队的总分 944 分812 分。对于 AVG·乔团队(类似于我们同学的团队),这是一个显著的 132pt 差异!下面的柱状图展示了我们的结果:

要回答的有趣问题: 我们的算法是否返回了最高 ROI 的团队?它是否以显著优势击败了其他公司?我们的算法是否成功地从一些我们最初认为被低估的中游球队中挑选了球员?AVG·乔算法和我们的同学从顶级球队中挑选了更多价格昂贵的球员吗?

下面我们可以看到,我们的算法从我们在项目开始时确定的大部分高 ROI 团队中挑选了一组球员:

Money Team Player Distribution

这是一个更加平衡和公正的选择方法,而不是 AVG·乔在选择他/她的球员时所用的方法。请注意,下面的饼状图显示了 AVG 乔队选择的 11 名球员的球队名单。由于 AVG·乔将他/她的大部分预算花在挑选 11 名非常昂贵的球员上,他/她不得不将剩余的预算花在最便宜的可用球员上,以填补所有的替补位置,但是这些球员中没有一个可以用于产生幻想积分,因为他们实际上从未参加过真正的 EPL 比赛,并且仅被用作球队填充员。这些是来自布赖顿和卡迪夫的一些替补队员。

AVG Joe Team Player Distribution

结论:

消除团队/玩家的偏见和偏袒,专注于实际的玩家统计数据,让我们的算法得到最大的回报,并以总计 132 分或整整 16.25% 的优势击败了一般的 EPL 幻想玩家!最后,事实证明我和我的朋友实际上并不“不幸”,我们的梦幻联盟球队年复一年表现不佳是有原因的。这种对球员数据的深入研究让我们意识到,我们正在允许球队偏袒和购买大量高价球员的倾向,从而损害我们的整体梦幻联盟表现。

5.后续步骤

我们计划继续监控这些数据,在赛季中当球员开始受伤,争夺积分奖杯变得更加激烈时,检查球员统计数据中的任何剧烈变化和异常值。我们还想比较算法的团队在赛季结束时与世界上大多数休闲球员相比的表现。此外,我们计划每月更新一次这个博客,为那些对我们的人工智能进展感兴趣的人,所以请在每个月底重新访问这个博客,了解性能更新,并享受 EPL 行动的其余部分!!!

12 月更新:新博客开始更新代码,团队准备好第一周的 EPL 行动:https://medium . com/@ pruchka/EPL-fantasy-is-one-week-away-and-our-algorithm-is-ready-to-play-78 afda 309 e 28

数据扩充和伪标记简介

原文:https://towardsdatascience.com/beating-the-state-of-the-art-from-2013-with-5-of-data-without-using-transfer-learning-301faf624fb6?source=collection_archive---------2-----------------------

在本文中,我们将了解两个可以帮助您充分利用培训数据的想法。

为了更好地感受这些技术,我们将应用它们来击败 2013 年以来在区分图像中的猫和狗方面的最先进技术。情节的转折是,我们将只使用 5%的原始训练数据。

我们将与使用 13 000 幅训练图像达到的 82.37%的准确率进行竞争。我们的训练集将由随机选择的 650 幅图像组成。

模型将从零开始构建,我们不会使用迁移学习或预训练。

你可以在 github 上我的中找到我写的代码。

Image from the original Kaggle competition website from 2013

第一个模型

第一个模型必须非常简单——650 张图片是非常小的数据量。

我倾向于 CNN 架构,它通过利用在图像中几乎任何位置都可以找到相似形状的事实来限制权重的数量。

我还跳过了全连接分类器,而是决定采用全卷积网络。希望这能给我们的模型一个更好的推广机会。

最重要的是,我做了很多实验。最终的架构包含跨越 6 个卷积块的 28,952 个可训练参数。通过少量的 l2 正则化,该模型在测试集中的 23,750 幅图像上实现了 74.38%的准确率。

是时候推出第一个大创意了。

数据扩充

怎样才能让一个模特表现的更好?用更多的例子训练它,同时确保它有学习能力,通常是正确的方法。

但在实践中,更多的训练数据往往不容易得到。获取或注释额外的示例可能是乏味或昂贵的。

我们可以做的另一件事是利用我们对图像的了解来模仿拥有更多的图像。

如果从更小的距离拍摄,照片看起来会有很大的不同吗?不完全是。我们能效仿吗?绝对的!放大图片并裁剪中心。

让照片看起来像是用稍微偏右的相机拍摄的怎么样?完全没问题。将图像向左移动一点点。

这听起来很简单,但却非常强大。这里唯一要补充的小细节是,我们不会自己变换图像——我们会告诉一个算法允许它做什么样的变换,它会对它们进行一些随机组合。

不幸的是,为了从扩充的数据中学习,我需要构建一个更大的模型。它最终包含了更多的特征地图,将可训练参数数量增加到 1 003 682 个。

这似乎有点不对劲。也许我选择的架构一开始就没有那么好。然而在这一点上,我选择坚持下去,继续实验。

随着数据的增加,该模型在早期结果的基础上提高了 35%,并在测试集上实现了 83.43%的准确率。

第二个伟大想法的时间到了。

伪标记

我们能不能用模型本身来模拟拥有更多的数据?

理论上,我们可以获取所有未标记的数据,包括我们的验证集,在其上运行模型,并将我们的模型对其预测最有信心的图像添加到我们的训练集。

我们不是在冒险强化我们的模型已经在犯的错误吗?无论如何,这在某种程度上会发生。

但是如果事情按计划进行,这样做的好处将超过上述效果。

我们所希望的是,通过提供更多的数据,我们的模型将了解所有它可能看到的图像所共享的底层结构。这将有助于它进行预测。

How our perception of what a good model is changes based on seeing unlabeled data. Source: presentation by Alex Conway

为了从伪标签图像中学习,我构建了一个比之前的模型大 1.5 倍的模型。我们现在有 1 566 922 个可训练参数。

我在 24350 个未标记的例子上运行旧模型。我挑选了 1000 张它认为最有把握正确的图片。我使用大约 1 比 4 的比例,在伪标签和原始训练集图像的混合上训练我们的更大模型。

在没有对模型架构进行实验和调整混合比的情况下,新模型在测试集上实现了 85.15%的准确率,非常有信心击败 2013 年的 SOTA。

摘要

在完成 fast.ai程序员实用深度学习课程之前,我写了这篇文章。我现在会用不同的方式来面对这个挑战。我会选择 Densenet 架构,它在处理少量数据时表现得非常好。我也不会调整图像的大小,而是将它们放大并裁剪到较短的一边。这丢失了一些信息,但是它保持了纵横比不变,通常效果更好。

如果你觉得这篇文章很有趣并且想保持联系,你可以在 Twitter 上找到我 这里

漂亮的数据科学演示

原文:https://towardsdatascience.com/beautiful-data-science-presentations-9e9d8fd91446?source=collection_archive---------0-----------------------

制作视觉上吸引人的 PowerPoint 幻灯片的介绍。

概述

这篇简短博客文章的目标读者是对 3 种不同用途的演示感兴趣的人:销售工具包、流程和分析报告。当然,这篇文章的核心思想不仅限于数据科学项目,因此来自该领域之外的人也可能会发现它很有用。

我们将通过一个数据即服务项目来展示这个想法,其中输入是大量的消费者调查,输出是一些描述我们目标受众的人物角色。

商业计划书

商业计划书或销售套件的目的是为我们的数据科学咨询服务吸引潜在客户。他们可能来自不同的背景,在品牌或营销机构的营销职能部门中属于不同的员工级别。因此,我们希望通过吸引人的视觉设计,尽可能简单地传达我们的想法。

我们看到了这张由 ODESZA ( )制作的专辑封面,请注意,这仅用于演示和教育目的,该专辑拥有版权,因此我们需要所有者的许可才能修改它 ):

让我们将我们的服务名称添加到图片中,使其成为我们的主要视觉效果,并将其修改为我们的封面。

然后,我们希望通过确定可能的工作角色来吸引他们的注意力。他们可能是战略规划者、媒体购买者或创意设计师。还建议用不同的颜色突出显示关键词。

接下来,我们将通过识别他们日常工作中可能出现的问题,给他们一个继续阅读的理由。注意,我们可以谷歌关键词,如“ resource icon png white ”来获得符合我们观点的小图标。我们还可以使用 PowerPoint 内置功能 Arrange 来对齐文字和图标之间的空间,使幻灯片更加美观,同时表现出对细节的关注等专业性。

我们需要更详细地告诉观众我们的解决方案能提供什么。同样,图标可以帮助我们更好地将想法联系起来,也可以节省观众理解我们服务的时间。

在接下来的部分,我们需要通过确定我们服务中的 4 个关键要素来解释服务实际上是如何工作的。注意,也建议找风格相似的图标。比如下面的图标轮廓都比较细。虽然这可能很费时间,除非我们想创建自己的图标。

最后,我们需要给出执行计划的明确时间表,否则我们的观众可能会发现我们的服务不切实际。此外,关键里程碑可能会更好地描述如何实际执行该服务。

这总结了数据科学业务提案中最重要的部分,可能会引起观众的极大兴趣,因此我们可以进入下一阶段。

工艺流程

这个阶段的观众是更懂技术的工程师或科学家。虽然他们可能每天都在处理流程图,但也值得一提的是,漂亮整洁的图标可以帮助他们不太懂技术的观众更好地理解复杂的概念。我们想推荐的一个很好的资源是麦肯锡洞察,其中我们可以使用他们精心设计的展品作为我们的演示模板,比如这个:

现在,我们可以使用这个模板,并采取相关的图标来显示我们自己的服务的流程。PowerPoint 中的吸管工具非常适合将幻灯片上的颜色与插入的图片或其他对象进行匹配,如下所示。

一旦我们更好地理解了我们的服务是如何工作的,我们实际上就可以用它来构建一个 PoC,并拿出一个演示报告。

分析报告

这可能是我们演示中最具技术性的部分,因为它与展示我们数据科学项目的实际结果有很大关系。这里对观众来说最重要的是最终的输出是什么样的。这里的受众可能是项目利益相关者,如营销主管或机构中的品牌负责人。我们希望向他们展示我们调查数据的输入以及我们角色的输出。

根据我们选择的机器学习模型,我们可能需要不同的可视化方法。虽然分类和回归树(CART)被认为是一种不太准确和稳健的方法,但它的可解释性和可解释性对我们的营销受众非常有帮助。出于演示目的,我们选择了去年去过日本的目标受众作为调查对象。我们可以清楚地看到每个角色是如何选择的,以及哪些关键特征可以帮助我们区分我们的目标受众和其他人,即去年没有去日本的人。

这篇简短的博文大致总结了这一点,因为我们可以看到,制作漂亮的演示文稿需要时间和精力,它们可能更有助于向业务人员、技术人员或工程师以及管理层解释复杂的数据科学项目。

这是我们第一次讨论数据科学中的交流和表达方面。建议定期访问不同的资源来探索演示模板,包括 R 或 Python 图库、行业报告或简单的 Google for cool business 演示模板。

O 笔以专案为基础的工作。
jchen6912@gmail.com

为开源做贡献,成为更好的数据科学家

原文:https://towardsdatascience.com/become-a-better-data-scientist-by-contributing-to-open-source-4a95ce0c865b?source=collection_archive---------5-----------------------

参加第一次开源冲刺的有用提示

让我们面对现实吧:在一场游戏竞赛中获得高分并不需要遵循 T2 pep 8 T3 或者其他任何软件开发最佳实践。然而,代码是我们的手艺,在你职业生涯的某个时刻,你可能想要或需要学习编写生产级代码。为开源做贡献是磨练您的代码技能、学习专业最佳实践以及回馈更广泛的技术社区的一个很好的方式。

很好,你说,但是我从哪里开始呢?参与开源没有的“正确”方式,在 你的 自己的上有大量 入门 。但是另一个很好的开始方式是参加短跑。你当地的技术聚会小组或开发者大会只是可能举办 sprint 的两个例子。

冲刺的概念来自于敏捷,在敏捷中,不是等待一个产品最终完成,而是价值在它变得可用时就交付给客户。这个想法是迭代地工作,在整个开发过程中结合来自客户的反馈。开源 sprint 采用这种快速开发的思维方式,并将其应用到开源代码开发中。在冲刺阶段:

  • 开发人员和项目维护人员共处一地;
  • 每个人都在相同的代码库、包或库中工作;
  • 您可以处理已知问题(bug)、文档、单元或假设测试、重构或优化现有代码,或者使用代码开发示例/教程;和
  • 欢迎所有级别。

我的第一次冲刺,去年的WiMLDSscikit-learnsprint,是我为开源软件做贡献的开始。上周,我参加了由纽约 Python 和 PyData 联合举办的 sprintdateutil(datetime 计算的主要依赖项)。在这两个例子中,通过参加 sprint,我能够向现代数据科学的基础库发出拉请求

短跑和黑客马拉松有什么区别?

虽然两者在功能上有一些相似之处(限时编码,快速解决问题),但是一个 sprint 和一个黑客马拉松有着本质的不同。

黑客马拉松通常是一场竞赛,不同的团队有不同的想法,可能会持续一天或几天(比如一个周末)。可能会颁发奖品。通常目标是编码一些全新的东西。黑客马拉松通常(但不总是)是独立的,导致 MVP 并不总是被进一步开发。

然而,在 sprint 中,每个人都在同一个现有的开源代码库、包或库中处理不同的 bug 或问题。短跑可能持续三个小时或半天。没有奖品。目标是改进代码库,同时加强支持开发人员的社区。在 sprint 之外继续开发代码库是可以的,也是鼓励的。

When you are sprinting, don’t forget to take some photos! Photo by author.

第一次冲刺应该怎么准备?

冲刺前

sprint 的重点是从你的时间表中划出专门的时间来做实质性的工作。本着这种精神,任何准备步骤都可以在冲刺阶段的一开始就做好,只要你带着电脑并能上网。尽管如此,我还是建议在冲刺之前做以下步骤(按照重要性递减的顺序),以便充分利用你的冲刺时间。

首先,你应该提前确保你的电脑上安装了 Python,一个 IDE 或者首选的文本编辑器,以及 Git。你应该有一个 Github 账号。如果现场电源插座很少,也要给电脑的电池充电。虽然在没有工具的情况下,你也有可能在 sprint 中获得良好的体验,但是如果没有工具,你的贡献可能会受到限制。

如果您已经准备好了工具,并且还有一些时间来准备,那么就开始熟悉这个项目吧。看看项目的 Github 回购。有没有 README.md,或者是你想参考的投稿人风格指南?

阅读项目文档。有意义吗?了解代码库的功能。如果你不确定如何做出贡献也没关系。计划无论如何都要出现,并计划结对编程。 结对编程是学习更好的软件开发实践的关键

Pair programming is the key to a successful sprint and to becoming a better programmer. Photo by author.

冲刺阶段会发生什么

选择工作内容

当你第一次到达现场时,仔细观察房间,向听得见的每个人介绍你自己。要友善;询问人们他们计划做什么。如果有些东西听起来不错,问问他们是否愿意在上面配对程序!

对于第一次投稿的人来说,文档是一个很好的起点。如果您阅读了该项目的一些代码文档,但没有意义,请查看代码并尝试找出它的作用。然后写下你对其工作原理的改进解释。

查看该项目的 Github 中的已知问题选项卡。有人可能已经按难度标记了问题。你认为你能在这里解决什么问题吗?

重要 —不要太有野心。事实上,在你的第一次拉动请求中,你的野心越小越好。更改一个错别字会让你很好地理解与这个代码库交互和更改代码库所需的工作流程,这将为你在 sprint 期间或之后提交更复杂的编辑做好准备。

记住:没有提交给 Github 的工作和根本没有发生的工作是一样的。决定你的冲刺目标是有一个单一的拉请求(如果你做得更多也没关系)。因为你们是结对编程,所以要确保这也是和你一起工作的人的目标。

知道如何提交您的更改

版本控制问题可能是混乱的,您将希望等待项目维护者的指示,他们希望您如何对项目进行更改。他们是否有测试代码,您可以在本地运行,以确保项目可以在所有支持的版本上运行?项目是否有一个“声明”问题的系统,以防止两个人同时处理同一个问题?(通常这是通过在问题上留下评论来完成的,尽管一些项目维护者可能更喜欢使用看板来保持组织性。)

将项目分支到您自己的回购中。 Git 克隆到你的桌面本地工作。在做出任何改变之前,你会想要改变你的设置,这样你就可以在你自己的分部工作了(而不是大师)。如果你知道如何做到这一点,太好了!如果没有,请随意温习一下 Git 基础知识。或者,随便问问人!sprint 最大的好处是你可以和其他开发人员共处一地。

当您准备提交您的更改时

现在,您已经在自己的分支中本地进行了更改,并针对任何内部多版本支持工具测试了更改,您已经准备好发出拉请求了!

根据项目对参与的要求(活跃贡献者和一次性贡献者),记得在你的 pull 请求中包含一个修改过的 AUTHORS.md 文件,并添加你的名字和 Github 帐户。

冲刺之后

灾后小贴士

帮忙收拾;这很可能是一次志愿者领导的活动。专业建议:留下来帮忙清理空披萨盒不仅是表达你感激的好方法,也是和活动组织者聊天的最后机会。在科技领域建立关系网的最佳时机是你不需要工作的时候,第二个最佳时机是你需要工作的时候。

确保你为任何冲刺后的社交留出时间和精力,这可能是临时的而不是提前宣布的。不要害怕成为那个建议之后去酒吧的人。即使你不喝酒,这也可以是一个很好的方式来反思你所做的事情,在社交环境中向他人学习,在开源社区中变得更加活跃,结交朋友,当然,还有网络。

您的“拉”请求可能不会立即被接受,您可能需要进行一些更改,以适应项目的风格期望或需求。预计在接下来的几天内会处理好这个问题,因为这可能需要与项目维护人员反复沟通,并且当他们引用代码库的最新版本时,合并您的更改会更容易。

保持接触

然后,在接下来的几周或几个月里,写一篇关于你的经历的博文(咳咳),继续解决更有雄心的问题,因为你对这个代码库越来越熟悉了,并且享受成为现实生活中的开源贡献者的荣耀。

劳伦·奥尔德加 是纽约州布鲁克林的一名数据科学家。

成为赞助人

原文:https://towardsdatascience.com/become-a-patron-of-towards-data-science-892cf74a17f3?source=collection_archive---------10-----------------------

为什么您应该考虑承诺一小笔捐款来帮助我们运营我们的出版物?

2016 年 10 月,我们使用 Medium 创建了一个数据科学出版物。我们的目标只是收集好的帖子,并将它们分发给更广泛的受众。仅仅几个月后,我们很高兴地看到,我们有一个非常快速增长的观众和许多贡献者。

今天,走向数据科学为成千上万的人提供了一个交流思想和扩展我们对数据科学的理解的平台。我们的观众是混合的,包括对主题完全陌生的读者和想要分享他们的发明和发现的专家专业人士。

现在,我们的读者人数已经增加,我们每天都吸引着优秀作家的投稿,我们觉得是时候“升级我们的游戏”了。我们希望提供强有力的支持,让我们的作者通过编辑指导发展他们的才华。此外,我们希望继续呈现我们的观众乐于阅读的精心撰写、内容丰富的文章

人们为什么支持我们?

人们是如何评价我们的?

“数据科学正在复兴。复兴是由社区推动的,而走向数据科学是卓越的社区信息来源之一。” 罗布·托马斯—IBM 领先的分析软件。

“从数据中学习的新方式正在改变社会的几乎所有方面。分享经验教训和最新进展的场所对于确保这些新方法产生最大可能的影响至关重要。“走向数据科学是我们如何作为一个社区来加速积极变革的典范。”Leonard D ' avolio PhD——哈佛医学院助理教授,Cyft 联合创始人。

我一直很喜欢阅读别人写的机器学习相关文章。通过这种方式,我学到了很多东西,并成为了一名更好的数据科学家。所以,对我来说,把我所学到的东西回馈给 ML 社区是合乎逻辑的一步。“走向数据科学”为我提供了一个极好的平台,因为他们拥有大量的受众,因此他们可以从我的学习中受益,就像我从其他人那里受益一样。Dat Tran—Pivotal Labs 的数据科学家。

“很高兴被纳入《面向媒体上的数据科学》。我们非常喜欢与更广泛的数据科学社区分享我们的创新和知识,并相信这样做会促进该领域内有价值的对话、学习和辩论。就我们而言,我们一直在寻找方法来迭代和改进我们的实践,最终目标是让数百万旅行者尽可能轻松地进行旅游搜索。” 利兹·埃德里 ,Skyscanner 的数据科学家。

"走向数据科学是一个由志同道合的人组成的家庭,他们希望传播他们对所有数据事物的热情。在一个越来越自动化的世界里,当不平等阻碍穷人接受教育时,走向数据科学,就像许多其他出版物一样,为所有人提供了一个民主化、分享和相互学习前沿知识的机会。”* 那华康 —人工智能/机器学习,斯德哥尔摩经济学院。*

**“每个人都需要了解数据科学,以加深他们对数据科学中使用的工具的了解,使其能够为大众所用。这就是为什么我认为出版是一项伟大的事业,我们应该让各行各业的作者投稿。”Luke Armbruster——联大数据科学助教。

**“当有一个可以从中汲取新思想并与之分享想法的社区时,学习和实践数据科学会有趣得多。“走向数据科学”是一个很好的平台,可以让您随时了解数据科学社区正在发生的事情,并分享我的工作!”Gabriel Tseng——麦吉尔大学研究员。

“走向数据科学通过向合适的受众展示高质量的知识,帮助数据科学爱好者之间建立协作。发表的文章鼓励讨论和分享新的和未探索的数据科学领域。”萨扬·辛哈——IIT·哈拉格普尔大学二年级学生。

"在数据科学领域工作是一种奇妙的感觉。这本刊物给了我很多知识,也正因为如此,我才能够把我的话传播给公众,这给了我很多信心和动力。期待为《走向数据科学》写更多的文章,并从中学习新的东西。安尼施·辛格·瓦利亚——Selectdine 服务公司的实习生。

“我认为分享关于数据科学的知识至关重要,因为这是一个每天都在增长和发展的领域。为了成为最好的数据科学家,你必须不断更新,不断学习新的方法和算法。我发现写博客是了解最新动态、分享技巧和了解其他数据科学家如何应对挑战的好方法。” Shir Meir Lador —数据科学家和 PyData 特拉维夫会议的组织者。

“迈向数据科学一直是发表注重实践的文章的好地方。与传统的期刊出版物相比,这个平台更容易被广大受众访问,并有助于以经济高效的方式汇集数据科学界。” 丹尼尔·夏皮罗博士——渥太华大学机器学习博士。

**“数据科学将成为求职者的一项关键技能。如果您想了解数据科学的不同方面以及数据科学的各种应用领域,《走向数据科学》是一本重要的出版物。”Arkin Dharawat——伊利诺伊大学香槟分校理学学士。

**“迈向数据科学有一个了不起的作家社区,他们努力让每个人都能接触到数据科学。这些帖子对于新手和专家数据科学家都非常重要。随着越来越多的人参与数据科学和机器学习,创建并免费提供这种探索性和教育材料变得非常重要。与该社区合作的优势之一是他们的响应速度和反馈质量。我希望在未来继续与社区合作。”Chirag maha patra—tro oly 高级软件工程师/机器学习。

“我在 TDS 团队的经历简直太棒了。他们令人难以置信的作家和读者社区为所有的**人工智能提供了极好的观众——从基础教程到高级研究、项目和论文分析。TDS 团队速度快,反应快,在这一领域经验丰富。我强烈建议人们关注这份出版物。在一个日益受到人工智能帮助的世界,跟上最新发展至关重要,TDS 是了解所有正在开发的令人兴奋的技术的最佳场所。” 阿比纳夫·苏里——宾夕法尼亚大学生物医学研究员兼助教。**

成为数据驱动或灭亡:为什么你的公司需要一个数据战略,而不只是更多的数据人

原文:https://towardsdatascience.com/become-data-driven-or-perish-why-your-company-needs-a-data-strategy-and-not-just-more-data-people-aa5d435c2f9?source=collection_archive---------4-----------------------

在过去的 14 年里,我一直以这样或那样的方式处理数据。我最初是一名管理信息系统经理(ABN·阿姆洛),这是一个很棒的头衔,但我基本上是下载 PDF 报告,并手动将它们输入电子表格,以生成每日财务报告,多年来,我做过商业情报经理( ING 银行荷兰合作银行德尔塔·劳埃德)、数据分析师(微软)、数据科学家(阿德延), De Bijenkorf ,现在是一家荷兰支付技术初创公司( Dimebox )的数据主管。

在我所有的经历中,最让我难忘的是我的工作真正产生影响的时候。当然,当你在一家拥有超过 15,000 名员工的公司工作时,与你在一家 30 人的初创公司相比,你的影响非常小,但知道你所做的工作有助于做出决策,这可能是处理数据的最佳部分之一。

但随着数据,尤其是数据科学和分析成为最新的热门话题,我很惊讶有多少公司急于吸引数据科学家、数据工程师、机器学习工程师、人工智能工程师,但从未停下来思考他们的数据战略。

数据
).

时至今日,企业已经认识到数据的价值,尤其是可用于报告或数据分析的交易数据,这有助于做出更好的决策。但是,尽管数据的感知价值在过去二十年中有所增加,但许多公司仍在努力捕获、共享和管理数据,因为他们的行为反映了一种过时的基本观念,即数据只是应用程序的副产品,因此雇佣“数据人”来处理数据。因为为了雇佣而雇佣某人,永远不会解决任何问题,所以我认为,在考虑雇佣任何职位中有数据的人之前,组织需要创建一个符合当今现实的数据策略。

数据战略 制定数据战略背后的理念是确保所有数据资源的定位能够方便高效地使用、共享和移动。换句话说,拥有数据策略可以确保数据作为资产来管理和使用,而不仅仅是作为应用程序的副产品。通过建立通用的方法、实践和流程,以可重复的方式在整个公司范围内管理、操作和共享数据,数据战略可确保高效使用数据的目标和目的保持一致。

数据人
因此,大多数数据分析师并没有将数据转化为洞察力的明确目标,而是访问数据库,并请求运行任何基本分析工具都可以在几秒钟内提供的查询。

最近,趋势已经从雇用数据分析师转向雇用数据科学家、数据工程师、机器学习/人工智能工程师,不是因为他们是一个实际的战略或目标,而是因为每个人都在这么做。导致公司花费大量的金钱,吸引和留住数据科学家,他们花费大部分时间来提取、清理和建模数据,而不知道它将如何解决实际问题或创造新的商业机会来产生收入或利润。

该怎么办? 因此,如果您或您组织中的某人刚刚雇用了一名数据分析师、科学家或工程师,并且您一直在想这是否是正确的做法,我将这四个步骤进行了分解,我认为任何组织,无论是初创公司还是企业,如果想在数据方面取得成功,都应该经历这四个步骤。

第一步:任命一名数据主管或首席数据官 在我看来,管理层/创始人必须做出的最重要的决定,就是让某人对数据全面负责。此人的大部分职责是在公司范围内管理和使用作为组织/战略资产的数据。这意味着,与单一部门合作,设计一种获取、存储、管理、共享和使用数据的通用方法,但更重要的是,通过促进对话和分享决策和成功,确保文化采用数据驱动的思维和决策方式。

第二步:使组织的关键愿望与数据价值链相一致 每个公司都会经历其生命周期中的不同阶段,当一个组织转变为数据驱动型组织时,数据价值链上的愿望需要与组织的主要需求相一致。被指派的数据主管/首席数据官的首要任务应该是确定公司的目标是什么,这样他们就可以使之与他们的战略保持一致。

比如说; 数据集成商 主要致力于实施现代化的集成内部数据基础设施,而 业务优化师 主要致力于利用已建立的数据基础,使内部和以客户为中心的业务流程尽可能高效,而 市场创新者 主要致力于扩展认知能力,成为数字颠覆者。

Aspirations for Data

第三步:制定符合组织关键目标的战略 随着公司目标的明确,数据主管/首席数据官需要制定业务驱动的数据和分析战略,并培养数据驱动的文化。这可以从为 数据集成商 建立公司级、业务驱动的数据和信息治理,到为 业务优化者市场创新者 建立“有针对性”的治理。然而,如果商业文化不愿意改变,即使是最好的战略也会动摇。 数据集成商 ,他们依靠基于证据的运营方式茁壮成长,需要建立一种数据驱动的文化,而 业务优化者市场创新者 ,需要采用一种“快速失败”的敏捷软件开发文化来提高上市速度和创新。

第四步:吸引实现您的战略所需的人才 最后,为了实现与已制定的抱负和战略相一致的目标,数据主管/首席数据官需要担任实现目标所需的角色。 数据集成商 需要更多的技术角色,比如数据架构师、分析师、集成专员,因为内部基础还需要建立。 业务优化者 取决于他们是专注于扩展生态系统还是专注于数据的分析应用,需要技术角色和数学/业务角色的混合,如数据科学家、数据建模师和业务分析师,以推动优化和创新。最后, 市场创新者 需要数据科学家和数据可视化专家以可理解的可视化方式传达复杂的新概念。

成为数据驱动型或灭亡 我坚信,那些不相信自己的数据是一种资产并且不认为数据应该得到相应管理的公司,在未来五年将会遇到很多麻烦。但是,与其专注于雇佣一个“数据人”,我认为应该花时间和精力在你的组织中找到这样一个人,他能够看到更大的图景并制定战略,拥有改变一个组织的人和沟通技巧,并且愿意并且特别有足够的耐心站在第一线,将一个公司从数据整合者一直推进到市场创新者

感谢阅读;),如果你喜欢它,请点击下面的掌声按钮,这对我意义重大,也有助于其他人了解这个故事。通过在 Twitter 或 Linkedin 上联系我,让我知道你的想法。

来源/附加推荐阅读: IBM 商业价值研究所《首席数据官行动手册》
麦肯锡公司《构建数据驱动战略的三个关键》&公司
首席数据官:毕马威
数据驱动型组织中受欢迎的新高管成员 SAS

成为更好的数据科学家

原文:https://towardsdatascience.com/becoming-a-better-data-scientist-2c9ca2081e5e?source=collection_archive---------5-----------------------

一个人不会简单地“成为”数据科学家。它不会在一夜之间发生,也不会在获得学位后发生。这需要时间、努力、学习、质疑和大量的学习。

Photo by Mark Autumns on Unsplash

在 2008 年,我从未听说过数据科学这个术语。我是一名工科毕业生,正在学习四年的负荷图、流体力学计算和足以让人发疯的困难。直到我在社会科学硕士项目的夜校里埋头苦读(后来又有了四年的教育和工作经验),我不断发展的数据技能的现实应用才开始围绕数据科学的概念融合在一起。将近十年后,我终于开始习惯称自己为数据科学家。虽然在内心,我可能会不好意思地想“……有点”。

我从工程师到政策专家再到开发专家的演变让我认识了数据科学这个三头兽。要想在新兴的数据魔法领域真正出类拔萃,需要疯狂的科学家将计算机编程、统计能力和社会理解融合在一起——所有这些都包含在设计师的可视化和演示镜头中。如果没有编码技能,你的分析和想法将停留在健怡可乐+曼妥思瓶火箭阶段,而不是难以捉摸的猎鹰-X,完美着陆。理解你的数据并提取出统计意义,对于在众所周知的垃圾场中找到百万美元的宝藏是至关重要的。如果没有将复杂的数字转化为易于理解的见解所需的应用程序和语言的指导,世界上所有的分析都是无用的。

这些技能不容易获得。它们来源于原则和概念的学术研究之塔;在商业世界的烈火中提炼;通过漫长的夜晚和头发花白的项目打磨。即使经过多年的工作,成为数据科学家的战斗永远不会结束。

作为技术进步的驱动力和原因,数据科学已经成为新兴技能和职业的重中之重。这就是我爱上这个新兴领域的原因。我生活中的一个爱好就是学习,尽管我已经确定在大学环境之外我会学得更好。编码、分析和可视化的新方法、新技术、新系统和新流程让我不断参与其中。因为正如达芬奇所说:

铁不用会生锈;死水失去了纯净,在寒冷的天气里会结冰;即使如此,无为也会削弱头脑的活力。所以我们必须将自己的潜能发挥到极致。不这样做就是对上帝和人类的犯罪。

对于像我一样想成为更好的数据科学家的人来说,这里有一些磨砺你的铁一般的智慧和扩展你的技能的好地方。因为成为更优秀的数据科学家的旅程永无止境。

为无师自通之人: 数据科学辍学课程大卫·文丘里
编码从无到有: 370 在线编码课程昆西·拉森可视化者游乐场

成为一名生物信息学家

原文:https://towardsdatascience.com/becoming-a-bioinformatician-f579715a7e56?source=collection_archive---------10-----------------------

直入深水区。

使用 Perl 介绍生物信息学

这第一周是旋风。我刚刚开始在克兰菲尔德大学攻读应用生物信息学硕士学位。坐下来不到一个小时,我们就面对命令行的黑屏和白字,并被告知开始编程。

幸运的是,当我们开始时,我们得到了介于介绍和警告之间的东西;没有论文和很少的讲座,游戏的目的是用多种语言编写代码,直到你精通为止。

我们本周的焦点是 Perl ,这个历史编程家族被世界各地的生物学家所使用。在简要概述了我们可以使用的主要函数和数据类型之后,我们开始编写实用手册。这些包含的任务旨在逐步建立我们关于如何在相关环境中应用 Perl 的知识库。

我很快就被吸引住了,因为很明显,从一开始我们所学的一切都会对我们的未来有用。这些都不是没有实际应用的抽象挑战。相反,当我们在周末接受任务时,我们可以建立管道工具,用于揭示任何所需蛋白质的序列、结构和相互作用网络。

如果有一个角落需要删减(更重要的是,要避免代码行),那么我通常会很热心。本周晚些时候,我们被介绍给了 BioPerl。这是一个由社区开发的开源工具的集合,可以作为独立模块使用,也可以作为更大程序的一部分。

基本上,在写了一个星期的剧本后,我们被告知剧本已经写好了。当然,如果没有首先完成我们的任务,我们就不会理解 BioPerl 软件包是如何工作的,所以它不会完全贬低我们的努力。

此外,BioPerl 是面向对象的,这感觉像是下一个级别。对于 Perl,我们编写程序来处理给它们的数据并输出响应。然而,对于 BioPerl,我们定义的是程序中相互交互的对象。你可以阅读这个获得更好的解释。

这是我第一次尝试编码;Perl 是我尝试学习的第一门编程语言。我发现最初的学习曲线非常陡峭,但慢慢地你会发现一种不同的思维方式。

这是令人沮丧的逻辑,虽然 Perl 被认为是一种更健壮、更灵活的语言(非官方的格言是“有不止一种方法可以做到这一点”),但与 Python 相比,事实仍然是这里缺少一个分号,或者那里缺少一个开括号,将会停止所有的进程。在你编写的任何代码中都是如此,所以养成正确的习惯是很有价值的一课。

虽然现在学习 Perl 似乎对理解遗留代码更重要,但我已经开始喜欢使用它了。骆驼一直是 Perl 的象征,虽然唯一的官方原因是它出现在 O'Reilly Media 的第一版编程 Perl 的封面上,但很容易看到沙漠居民和经常丑陋但总是有弹性的编程语言之间的相似之处。

成为数据驱动的产品经理

原文:https://towardsdatascience.com/becoming-a-data-driven-product-manager-f320d0182a9c?source=collection_archive---------2-----------------------

产品经理,也称为产品所有者,是组织中一个相对较新且越来越重要的角色。由于我对所有新事物和技术驱动的事物贪得无厌的热爱,我最近完成了一系列对产品经理的定性采访,并对我了解到的情况感到震惊:

  • 没有大学课程对他们目前的工作进行培训,他们认为自己是一个没有现成剧本的“迷你 CEO”。
  • 他们比组织中的任何人都更关注用户/客户。
  • 他们相信自己的直觉,但他们的工作倾向于数据,有些人是由人力资源部门根据他们的数据熟练程度进行评估的。
  • 他们觉得在工作中使用数据让他们更有力量,但他们基本上是自学的,通常对数据解释感到紧张。

对于爆炸式增长的软件即服务(SaaS)公司来说,这是一个特别紧迫的问题,因为这些所有者部分或全部管理的东西会产生大量数据,并且有可能产生更多数据。因此,如果你认为自己是这些勇敢的新产品领导者之一,以下是我关于成为数据驱动型产品经理的建议:

接受你正在解决一个新的(数据)问题

我在其他地方写过关于数字化转型的力量的文章,但是你实际上是这一转型的第一线。人们仍然在弄清楚产品问题是什么,这是确定任何可行的解决方案的先决条件。这也意味着建议(当然不包括我的)将是泛泛而谈,而且往往毫无意义,因为你的产品和组织是独一无二的,而且有些人一开始就不理解你的问题。在这种情况下,关键是关注核心原则,而不是案例研究建议。

一位产品经理给了我一个这样的例子,他引用了一篇文章,该文章提倡进行功能选择,利益相关者和决策者在可能的产品功能上花费游戏资金,以确定他们在产品路线图中的优先级。对于产品经理来说,这种方法的问题是显而易见的:花钱的人不使用产品,并且不能够合理地为特性分配价值。这违反了以客户为中心的设计原则,因此尽管这个想法是一个有趣的下午活动,但产生的数据并不适合路线图。这只是个糟糕的建议。

作为产品经理,你应该关注的核心原则围绕着产品使用、以客户为中心的设计(尤其是用户体验)、竞争产品、定价、市场份额和行业趋势。如果你收到的建议不能帮助你利用数据成功地找到你工作职能中这些部分的答案,那就忽略这些建议。

我所说的“产品数据”是什么意思

作为一名产品经理,你拥有大量数据,并且有能力获取更多数据。这是行为经济学家幻想的那种实验设计环境(我将在我的下一篇文章中再次讨论这个问题)。但是,在尝试管理和使用所有这些数据时,它也会导致许多问题。这通常表明您的组织缺乏清晰的数据治理,但也可能是由于误解了您可用的不同类型的数据以及每种数据的优缺点。

数据中最明显的差异是来自产品本身的观察数据,如事件数据,而不是直接的用户/客户反馈数据,如应用商店评论或调查,这一点我采访的每个产品经理都非常清楚。这些并不是互斥的数据类型,通过将一种与另一种混合,您可以获得更好的洞察力。产品经理提到的另一个关键数据区分是结构化数据,如 5 星评级系统或拇指向上/向下,而不是用他们自己的话说的非结构化客户反馈。同样,一个不一定比另一个更好(尽管它们确实需要非常不同的分析方法),虽然结构化数据通常更容易处理,但非结构化数据通常更能提供信息。

除了数据权衡之外,大多数产品经理目前都使用一组核心指标来指导他们的路线图,他们都将成功归功于在整个组织中拥有一个通用的指标定义及其计算方式:

  • 客户获取成本(CAC)
  • 客户转换率
  • 回购率
  • 每日活跃用户(DAU)
  • 功能用法(傅,没错就是这个缩写)
  • 用户流失
  • 净推介值(NPS)
  • 客户满意度(CSAT)
  • 客户终身价值(CLV)

产品管理中的数据用例

我从产品经理那里听到的另一个关于数据的常见抱怨是拥有清晰的用例。虽然他们中的大多数人提到使用数据来优先考虑功能开发,但是数据的第一优先应该是找到整体的“产品-市场匹配”使用数据(比如事件)是一个很好的起点,但是你绝对需要包括客户反馈。我采访过的一位经理说,她从拿起电话直接与 10 位客户交谈中获得的洞察力,从来没有任何观察到的使用数据能与之相提并论。总的来说,我同意她的观点,但这不仅仅是因为对话有神奇的力量(尽管确实如此),而是因为你可能还没有建立评估使用数据的正式测试。

这是下一个用例,假设测试。不少产品经理提到,当他们进行正式测试时,他们对测试结果感到“震惊”,通常,他们对客户想要如何使用产品的直觉是错误的。测试不是你应该轻视的事情,如果一个测试结果的后果很大,比如说因为它需要大量的开发成本或者废弃你的产品路线图的一部分,那么你真的需要确保你的测试是有效的,你应该进行多次测试来检查你得到的结果是否一致。

说到高成本,产品管理并不便宜,您的数据是验证您所做的事情是否对收入产生积极影响,而不仅仅是让用户/客户满意的好方法。例如,那个昂贵的新机器学习项目真的能带来可观的投资回报吗?为推荐的追加销售添加人工智能组件是否真的增加了购买量(订单总数和总支出)?如果你用正确的数据设置了正确的测试,这些事情你很容易就能学会。

弥合部门间的分歧

看起来最快乐的产品经理都来自数据不仅仅是优先事项的组织,它是每个级别决策过程的重要部分(一些产品经理正是因为这个事实才接受了目前的工作)。这就是我所说的“一种数据文化”的意思,作为一名专注于客户希望从你的产品中得到什么的迷你 CEO,你处于持续推动和加速这种文化的最佳位置。

当数据驱动的决策结合了来自整个组织的数据时,它就进入了一个全新的层次。如果你回头看看我上面的指标列表,你会注意到它们存在于不同的部门筒仓中,虽然每日活跃用户和转化率可能是让你夜不能寐的指标,但你的产品的成功在很大程度上是在客户接触它之前由营销和销售流程预先决定的。

为了克服这个问题,使用概念框架来指导与组织中其他部门的协作,尤其是市场营销、销售和客户体验部门。这些框架中最好的包括客户旅程图、用户/客户人物角色和客户终身价值群组(特别关注找到所有用户/客户中可预测地创造总价值的 80%的 20%的用户/客户,称为帕累托人物角色)。

数据如何让你失望

与我交谈过的产品经理很明智地认识到解释数据是一个主要的棘手问题。这不仅对你来说很难,因为(可能)缺乏正式的数据培训;即使是最好的数据科学家也会时不时地犯这个错误。脏的或不完整的数据使情况变得更糟,但是即使你有完美的数据,也有可能误解它的意思。我发现的解决这个问题的唯一方法是让多个人参与到解释中来,并鼓励在这个过程中彻底的坦诚。

虽然有可能成为一名数据解释专家,但你也可以雇佣一名数据科学家来帮忙。对于将这些数据科学家嵌入开发团队还是让他们成为产品管理团队的一部分的价值,我采访的产品经理之间存在明显的意见分歧。你的具体情况应该决定这一点(记住,专注于核心原则),但确保为这项工作聘用正确类型的数据科学家是你的责任,而且有许多不同的类型

最后,即使是最大的数据也可能见解浅薄。仅仅因为你有很多数据,并不意味着它就是正确的数据。你将通过探索性数据分析、假设检验和解释输出来学习这些。但是你也可以通过定性采访来解决这个问题(这是我的下一篇文章和即将到来的 Emperitas 讲座的主题)。这是因为在大数据世界中,人类(您和您的用户/客户)仍然扮演着非常重要的角色。不要忽视你的直觉,只要告诉它更多的证据,并相信自己会根据所有可用的信息做出正确的决定。

关于作者:

Luciano 是一名经济学家、数据科学家和未来学家。除了在多个高等教育机构担任广受爱戴的教授之外,他还是商业智能解决方案公司 Emperitas 的创始人兼首席执行官,该公司将数据科学与敏捷研究和经济建模相结合。

成为机器学习工程师|第五步:建立投资组合

原文:https://towardsdatascience.com/becoming-a-machine-learning-engineer-step-5-build-a-portfolio-31d219e40fbc?source=collection_archive---------1-----------------------

本文是“成为机器学习工程师”系列的最后一篇。我开始写作的目标是通过创作来提高我的写作和学习。我最大的恐惧是我写的所有东西都会被忽视。幸运的是,恰恰相反的事情发生了。人们参与、评论、鼓掌、分享、关注我和我的作品。我对这一成功感到谦卑,并决定继续写作,希望能够在新一代机器学习工程师的学习之旅中提供帮助。谢谢

成为一名机器学习工程师不是一件小事。从一无所有到建立从数据中学习的系统需要大量的努力和耐心。如果你已经在这个系列中走了这么远,那么恭喜你,你和我几个月前一样,但是如果你和我一样,那么你不太确定如何展示你在几个月的专注练习中积累的技能。

为了展示你的技能,你能做的最有成效的事情就是建立一个作品集。高质量的投资组合可以展示:

  • 通讯能力
  • 技术能力
  • 思考问题的能力
  • 采取主动的动机和能力

这些都是雇主在决定雇佣谁时希望看到的。不幸的是,没有多少人把一个投资组合放在一起就能展示这一点。在整理你的第一个机器学习投资组合时,有五件事要记住。这五件事是指导方针,将确保你的投资组合给你最大的回报。

保持项目小

在你的投资组合中,规模的确很重要,尽管一个重大项目华而不实,但它也伴随着风险和成本。一个小项目可能不会花超过 20-40 个小时来完成,如果它没有成功,那么你的损失比一些大项目可能会变成的几个月的时间下沉要小得多。

完成项目

唯一比没有投资组合更糟糕的事情是有一个装满半成品项目的投资组合。它向世界尖叫,你没有能力完成你开始的事情,应该不惜一切代价避免。

独立项目

机器学习可以应用于几乎每个领域,你应该通过完成独立的项目而不是以前工作的扩展来展示这一点。如果你确切地知道你想擅长什么领域,并且想展示你的专长,那就忽略这一点。

新颖的项目

我班上的许多学生犯同样的错误。他们学了很多教程,觉得自己应该无所不能。然后他们试图完成我的带回家的项目,但失败了。跟随在线教程不是学好的方法,从头到尾完成新颖的项目才是学好的方法。如果我在简历中看到许多辅导型项目的组合,我会想出整个简历。
需要新颖的项目创意?查看我之前的文章 成为机器学习工程师|第四步:练习,练习,练习

容易接近

将你的作品集放到网上,让所有人都能看到。越多的人发现、阅读和评论你的作品越好。这不仅是未来雇主找到你的一个载体,而且你也可能从你的项目中获得很好的反馈。要做到这一点,最简单的方法就是将所有内容放在一个 git 存储库中,并提供一个完整的 ReadMe。

如果你像我一样,从例子中学习效果最好,那么看看这个数据科学 作品集

减去

拥有自己的作品组合正迅速成为招聘新的机器学习工程师的重要组成部分。这已经成为软件工程师招聘过程的一部分有一段时间了。现在就开始,挖掘旧的项目或建立新的项目,把它们放在一起,写几份关于你从项目中学到了什么的报告。

感谢阅读:)如果你喜欢它,点击下面的按钮,跟我来!这对我意义重大,鼓励我写更多这样的故事

咱们也连线上 推特LinkedIn,或者* 邮箱*

成为机器学习极客

原文:https://towardsdatascience.com/becoming-a-machine-learning-geek-a956a98a7498?source=collection_archive---------3-----------------------

“Big Data in 21st Century.” Source: Marketing Land.

最近写了一篇关于 的帖子。什么是你的家?

我认为家是任何你可以自由做自己的地方。最快乐的时候,最原始的你。

当我开始阅读我的机器学习教材时,我差不多就是这样。尽管我很开心(也很书呆子气),但我还是疯狂地阅读了这本书,即使是在地铁上或吃着一碗拉面的时候。作者安德里亚斯·穆勒(Andreas Mueller)是我现在的教授,我很感激我学到了这么多关于机器学习在现实世界中的应用。

Highly recommended for those interested in Machine Learning.

那么什么是机器学习呢?一个科技网站将其定义为“一种人工智能(AI ),它为计算机提供了无需明确编程就能学习的能力。基本上都是从数据中提取知识。随着机器学习在我们日常生活中无处不在的应用,它可以被视为统计学和计算机科学的交叉领域。

在我最近参与的机器学习中的女性纽约分会中,我有机会回答他们关于使用数据集的问题。以下是我的想法,希望对那些对探索数据世界感兴趣的人有所帮助!

1。说说你处理过的最乱最丑的数据集吧。你是如何让它变得可用的?

我使用 Python 和 SQL 从互联网上的各种类型中搜集数据。我发现的最难控制的数据集通常是那些缺少很多值、特征不一致以及用于识别空值的不同值的数据集。虽然这可能会延长清理过程,但我通过理解每个变量的含义、删除无关紧要的功能、创建虚拟对象以及使数据集的值保持一致,使其变得可用。

2。告诉我一个你不得不处理一个对你来说是新的数据集的时候。你是怎么探索出来的?你是如何理解这些数据的?

我处理的数据集通常很大很复杂,具有从分类和有序到离散和连续的特征。为了探索和加深对数据的理解,我将首先进入布局文件,仔细通读该列中使用的每个特性/变量,对它们的类型进行分类,并查看是否有潜在的相关特性。

我喜欢通过各种类型的图表来可视化数据特征之间的关系,从条形图、直方图和箱线图到散点图、线性和径向形式。了解我们试图构建什么以及我们的模型将如何被使用是很重要的,因此我们知道在探索我们的数据时要寻找什么。我用于数据探索的一些工具通常涉及 R (ggplot2 非常有用)、Python (matplotlib!),SAS,Excel(谁没有?),以及 D3(基于 Javascript 的库提供了一些很酷的交互特性)。

3。告诉我一个你建立的预测模型。你用了什么方法?你是如何验证你的模型的?

我在构建预测模型时使用了各种类型的监督学习技术,从广义线性模型和 k 近邻技术到决策树和神经网络。然而,大多数时候,由于数据集的复杂性较低,我使用分类和回归来建立预测模型。

我使用交叉验证(通常是 k-fold)和网格搜索以及不同的参数技术,并可能结合其他方法来很好地验证模型,避免过拟合或欠拟合。为了进一步验证,迭代过程对于确保 R 平方不仅是好的,而且是精确的是非常重要的。建设管道也有助于避免信息泄露。

4。告诉我一个你做过的地理空间分析或者你制作的地图。

我最近赢得了哥伦比亚大学商学院(Columbia Business School)举办的一场黑客马拉松,在那里我开发了一个交互式数据可视化工具,以确定治疗糖尿病、精神障碍和艾滋病毒等常见疾病的医生短缺的社区。这个想法是纽约市的公共机构或医疗服务提供者自己可以利用这些信息在地理上更好地匹配医生和病人。除了这次经历,我还喜欢在业余时间玩玩可视化,看看我最近用 D3 制作的这张简单的地图,来确定世界各国的幸福排名:http://moorissa.com/happy-countries/。

5.告诉我你的一些技能,这些技能可能有助于探索机器学习领域的数据。

云(亚马逊 AWS 或谷歌云)、D3、Excel、Git & GitHub、HTML & CSS、Javascript、Python、R、SAS、Spark Apache、Tensorflow、Hadoop MapReduce。

Moorissa 是一名研究生,目前在哥伦比亚大学学习机器学习,希望有一天她可以利用这些技能让世界变得更美好,一次一天。

成为分析经理不是晋升。

原文:https://towardsdatascience.com/becoming-an-analytics-manager-isnt-a-promotion-c3f65bbd0d95?source=collection_archive---------4-----------------------

(Photo by rawpixel on Unsplash)

是转行。

一开始是一名数据科学家可能是成为 T2 摇滚明星的现代版,但似乎没有人真正谈论你职业生涯几年后会发生什么。

分析大数据集。建筑模型。连接数据管道。挑战永无止境。

但是,如果一切开始变得有点太例行公事,你开始听到传言说你应该想在职业阶梯上继续前进到下一步会发生什么?

传统的做法通常是开始寻找管理之路,在分析领域也是如此。也许你自己的经理已经离开了,留下了一个空缺。或者你的公司导师(你确实有导师,不是吗?)建议是时候把自己推向“下一个层次”了。

唯一的方法是向上。或者是?

在许多公司结构中,数据科学的职业发展与公司其他部门没有区别。你会经历从初级分析师分析师再到高级分析师的过程,然后遇到管理这一关。最大的问题是,在任何技术岗位上的晋升都不应该意味着管理是最终的终点。

我自己也从高级分析师升到了分析经理,所以当我说:

成为分析经理不是一种晋升。

是转行。

纯粹而简单。除了从分析师或数据科学家的技术领域直接进入人员管理领域并不简单。一点也不。这就是我们将要探索的。

自从进入管理界以来,我花了六年多的时间,才真正开始挖掘是什么让这么多高成就的技术分析师的跳跃如此困难。这些人对管理的介绍中,有许多是基于所谓的“彼得原理”。潜在的前提是,根据你在当前职位的出色表现,你被认为是晋升到另一个职位的最佳人选。

彼得原则的问题在于,只有当你被提升到一个你不再擅长的职位时,你在公司组织结构图中的上升才会停止。简而言之,管理者上升到他们无能的水平。当我写这篇文章时,我能感觉到全世界有一百万个灯泡在运转。

你在职业生涯中遇到的那些完全不称职的中层经理会突然出现在你的脑海中。所有那些你质疑他们是如何走到那一步的时候,现在都得到了解答。

他们擅长其他事情,但是,当他们进入这份工作时,他们的老板发现他们并不擅长,就把他们留在了那里。现在一切都很合理了。

但这不会发生在我们身上,对吗?

你的个人经历告诉了你什么?

总是如此。

你最初为什么想进入管理层?

撞上玻璃天花板。

也许你决定尝试管理的原因是你担心作为一名分析师会碰到玻璃天花板。毫无疑问,在适当提高薪酬方面,技术职位通常都有一个保质期。很少有公司允许它的技术人员保持他们的个人贡献者身份,并骑着小马一路晋升到董事会。

如果从分析师角色进入管理层的唯一原因是为了获得更多的钱,那么你可能需要重新考虑你的策略。对于大城市中心的数据科学家来说,他们的经理是否比他们当初挣得多得多是个问题。考虑到所谓的高质量、有经验的分析师和数据科学家的短缺,对实际“做”的补偿只有一种方式——T2,那就是上涨。

一般也可以。

可能只有我一个人有这种想法,但找到一个你喜欢的角色并坚持下去也没什么错。环顾任何一个现代的格子间农场,你会发现很多工作了 15 年或 20 年的分析师,他们对自己舒适的工作非常满意。

如果你没有动力去做的话,你不需要在你的职业生涯中一直去砍树。有时候,仅仅是做好工作(如果不是杰出的话),获得丰厚的报酬,下午 5 点回家就足够了。如果这听起来像你,那么你应该知道,在企业分析领域,你有足够的空间。不要让自己痛苦地去追求晋升,去做一份你很可能会讨厌的工作。

会议室里没有密室男孩。

不得不说,在许多公司中,高管们仍然普遍(如果被掩盖的话)认为,技术人员没有继续提升的潜力,不管他们作为经理的表现如何。

我想起了我曾经听过的一个故事,一位高级主管对他的团队进行年终绩效评估。该部门的职权范围相当多样化,因此它包括营销、通信和包括分析在内的其他几个大团队。

分析团队度过了硕果累累的一年。因达到并超出业务预期,完成了大量成功的项目而受到广泛好评。然而,在对分析经理进行评分时,他们都被降了一个绩效等级。他觉得他们都是“密室男孩”,就其本身而言,他们只不过是按按钮的人,不管他们在整个公司的评价有多高。

这是一个警示故事,爬上管理层的阶梯不会神奇地让你进入董事们的私人浴室或顶层角落办公室。仍然有很多知名公司的高层管理人员不理解也不信任我们的工作。令人欣慰的是,这种情况正在改变,但这件事表明,还有很长的路要走。我只想说小心点。草不总是更绿。

把你现在的技能留在门口。你在这里不需要它们。

管理显然不适合每个人。这绝对不是你目前所做的(并且做得很好的)分析角色的自然延伸。一旦你有了飞跃,你可能会发现转型的主要问题是必须学习一套全新的技能。一开始,分析师并不总是拥有最完善的人际交往技能。这是一种刻板印象,但经验告诉我,这在某种程度上是植根于现实的(对不起,和我一起工作过的每一个人——我把自己放在这个列表的最前面!)

学习如何进行一对一、绩效评估、管理他人的工作重点以及卷入高层办公室政治,这些都不是你所习惯的。到目前为止,对于习惯于在自己的年终考评中获得高分的人来说,这是一条陡峭的学习曲线。

扮演和平使者、心理医生、牧师、仁慈的独裁者以及人事经理不得不承担的所有其他日常角色的互换角色可能会产生负面影响。尤其是对于那些更习惯戴上降噪耳机,一头扎进分析一组数据的人来说。

学会放手。

也许从分析师角色到分析经理最难的部分是意识到你不应该再做分析师的工作了。我发现很难放过这个机会,尤其是当一个有趣的项目摆在我们面前的时候。我最喜欢卷起袖子做数据侦探了。探索性数据分析是我的专长,当我不得不做范围和需求部分,然后把它交给其他人时,我很纠结

如果你发现自己希望自己是做这项工作的人,而不是管理其他人,也许这是一个信号,表明你在职业道路上走错了方向。

滴滴创始人罗布·沃林 总结得很好:

“如果你发现自己身处管理层,希望自己是一名程序员,不要等到你彻底精疲力竭、满腹牢骚的时候;帮你自己(和你的公司)一个忙——现在就做。回到代码骑师的位子上。如果你现在的公司不愿意和你合作,总会有公司愿意的。”

人生苦短,没时间做你讨厌的事情。如果你发现行政和人员管理离你想做的太远,回到你的分析师角色也没什么不好意思的。

那为什么我从四分卫变成了教练?

我进入管理层有几个非常具体的原因。

怀第二胎是最主要的。孩子是昂贵的,没有比有几个小嘴巴来喂饱和穿衣服更大的动力去攫取更多的钱。

在之前的五年半时间里,我一直是一名承包商,然后是该公司的顾问,这在其中发挥了很大作用。我知道我将管理的团队,我和我的经理有着良好的关系。在你生命中的某些时候,一点点稳定是没有错的,我认为我们即将到来的到来预示着其中的一个时期。

事实上,我们的咨询工作即将结束,一份全职工作的机会来的正是时候,这可能也是原因之一…

一旦我踏上第一级台阶,我就再也不想保持稳定的上升势头了。与许多不同的高层人物打交道,看到他们的世界与企业的日常运营如此脱节,只会强化这一点。

选择应该是你的,而且是你一个人的。

你考虑进入管理层的动机是你自己的,但我的最终建议是确保你真的是出于自己的原因在做这件事。不是因为你被强迫做你不想做的事,因为这是你的期望。如果你被迫改变方向,因为有人告诉你,如果你错过了这个机会,会给你带来不好的影响,那么你应该考虑一下,这能告诉你你工作的地方的文化是什么。

无论你的个人决定是什么,只要知道它不一定是永远的。我认识一些数据分析师,他们已经跳到管理层,而且从未回头。他们受到团队的喜爱,他们已经适应了新角色的要求。其他人变成了僵硬的机器人,无法将任何同理心带入他们的人事管理风格,最终让他们的分析师生活在地狱中,没有任何真正的最终利益。

对于那些不能放弃工作技术方面的人,他们有两个选择。要么承认这是一个错误,回到他们最擅长的地方,要么为自己制定一个妥协方案。

我总是确保自己有一些动手的编码和分析工作。这让官僚、行政和政治领域的人才流失变得稍微可以忍受一些。当然,我知道工作质量会很高。我的意思是,为什么我会被提升?

让我们听听你们的故事。

我很想看到一些关于你自己从技术角色转变为管理角色的故事的评论,以及它是如何为你工作的。知道陷阱在哪里以及你可能取得的成功对任何后来者都非常有帮助。(加上我爱管闲事,喜欢听别人的故事。)

成为数据驱动的第 1 级:拥有您信任的用户数据

原文:https://towardsdatascience.com/becoming-data-driven-level-1-having-user-data-you-trust-9d1c485b8db9?source=collection_archive---------2-----------------------

在本系列的第一部分中,我们将讨论如何获得你信任和理解的用户行为数据。这意味着涵盖漏斗和跟踪事件的设置和初步理解。如果你已经知道这些事情,那么请随意跳过。

虽然世界上有很多分析系统,但谷歌分析是事实上的标准。它免费提供高级数据,并与其他系统共享许多相同的词汇和核心概念,如事件跟踪。事件跟踪非常棒:它支持漏斗和实验分析。稍后我会深入探讨这意味着什么,但关于谷歌分析,我想提出两点。第一,可靠。我使用过各种实验和分析框架,当我们不相信来自这些系统的数字时,我们经常与谷歌分析中的数字进行比较,这是信任的明显标志。第二,它是可用的。它的高水平分析和跟踪事件的方法使它受到初创公司和一些世界上最大的在线品牌的欢迎,因为它让缺乏数据分析背景的人能够理解正在发生的事情。成为数据驱动的一个关键因素是,组织中的每个人都可以读取和解释用户数据。

Some no-effort, high-level user data from Google Analytics

为了完整起见,以下是你如何为你的网站iOS 应用Android 应用设置谷歌分析。

跟踪

而 Google Analytics 自带大量高级流量数据,如流量、留存、来源、语言等。,它不会提供太多的机会洞察力。这就是“跟踪事件”有用的地方。有了少量的代码,你就可以开始了解某件事情发生了多少次,人们是如何使用你的产品的。例如,您可以在按下特定按钮或呈现特定页面时触发跟踪事件。测量事件的相对发生率是漏斗分析和实验的基础,因此将跟踪放在你理解的地方是至关重要的。

让我们介绍一个使用事件来跟踪用户如何通过销售袜子的在线商店的实际例子。这个商店有六个页面:

  1. 包含搜索表单的主页。
  2. 搜索结果,包含一堆袜子。
  3. 列表详细信息页面,包含特定袜子的大量信息。它在页面的顶部和底部有两个“添加到购物车”按钮。
  4. 带有“结帐”和“从购物车中删除”按钮的购物车。
  5. 带有信用卡表单和“立即支付”按钮的支付页面。
  6. 支付确认页面。

人们向确认页面的移动是你的漏斗,很多用户在漏斗的顶端随意浏览你的网站,一些人沿着漏斗向下购买,也就是所谓的“转化”。

首先,你可以使用页面跟踪来跟踪每个页面,从主页到付款确认。谷歌将跟踪哪些页面被默认点击,但页面跟踪事件是分配有意义的名称和更详细信息的好方法,使分析更容易。

接下来可以介绍事件跟踪。事件跟踪可用于计算任何任意事件;在我们的示例中,我们可以为以下内容添加跟踪事件:

  • 列表详细信息页面有两个“添加到购物车”按钮——为每个按钮引发一个事件,以了解哪个按钮的点击率最高。
  • 购物车有“结帐”和“从购物车中删除”按钮。了解哪个按钮被按下可以告诉你有多少用户误用了购物车,或者有多少比例的用户进入了你的漏斗。
  • 支付页面上的“立即支付”按钮。
  • 不要忘记在付款确认页面上跟踪!以防您在“立即支付”和确认之间有一些您可能想要检测的损失(例如,导致错误和收入损失的错误)。

Sample tracking event JavaScript

有了这种跟踪,您现在正在收集数据,这些数据将构成一些后续分析的基础。恭喜你。现在我们可以弄清楚如何阅读它来理解机会。

值得注意的是,谷歌分析也支持一些专门为电子商务设计的功能

了解您的漏斗

通过你设置的跟踪事件,你可以开始了解用户是如何与你的产品互动的。

Example Behavior Flow

谷歌分析有几种不同的方式来查看和分析您的跟踪事件。一个简单的起点是“行为流”。这构建了事件、页面或屏幕被触发的顺序以及与会话期间相邻事件、页面或屏幕的比率的图片,从初始登陆到某个最终端点。这份报告对你的漏斗和用户如何使用你的产品提供了一些见解,但也有一个缺点:它可能会对一定比例的事件进行采样,而不是对高容量产品的每一个事件进行计数。如果你的转化率很低,你可能会在漏斗的末端得到稍微不准确的结果。尽管如此,这仍然是一个不错的起点。

您可以开始构建自定义报告。有了这些,你可以衡量和比较不同的事件随着时间的推移。重要的是要了解趋势,以检测你的产品是增长还是停滞。但是有龙。按周衡量是常见的,但这是危险的。以袜子零售商为例,这将是一项季节性业务,在假期期间可能会出现不成比例的销售额,然后可能在 1 月份下降。在可能的情况下,更好的比较通常是同比,即与前一年的类似日期进行比较。有时候同比比较很棘手,因为比如说,情人节可能是某年的某个星期一,而第二年的某个星期三。因此,你必须对一年的 365 天进行补偿,并将一周中的每一天与前一年对齐,直到我们拥有十进制表示地球绕太阳旋转的技术。

Sample year-on-year comparison with date correction so day of week lines up.

在早期,你可能不一定知道有多少用户可以通过你的漏斗的最佳版本(在后面的文章“成为数据驱动 3:使用数据做出令人敬畏的决定”中有更多的信息)。然而,你可以为自己设定一些漏斗优化的目标:如果有 5%的用户点击你的主页进行搜索,你可以尝试不同的方法来达到 7%。试图达到这个目标不仅会给你一些努力改善漏斗的想法,还会让你成为一个袜子亿万富翁。

进一步阅读

  • 如果你有兴趣了解更多关于谷歌分析的信息,看看谷歌分析学院
  • 虽然我使用谷歌分析作为一种方式来说明一些概念,但也有替代方案。这里是对这些替代品的一个稍微陈旧但相当彻底的回顾。
  • 漏斗分析的维基百科页面不错

包裹

在这里,我们已经讨论了如何使用 Google Analytics 跟踪和查看产品中发生的事情的纯技术练习。这是容易的部分。当你试图利用数据做出决策,并围绕数据和目标塑造组织时,事情会变得越来越难。下一篇文章将讲述如何减少在令人遗憾的项目上浪费时间的可能性……“避免糟糕的决定”,如果你愿意的话。

成为数据驱动的第二级:使用数据来避免不明智的决策

原文:https://towardsdatascience.com/becoming-data-driven-level-2-using-data-to-avoid-shitty-decisions-6756b778f1?source=collection_archive---------5-----------------------

“用数据来避免糟糕的决策”只是“降低风险”的一种委婉说法。本系列中的第 2 级是关于降低发布在线产品变更的可能性,这种变更可能不会产生投资回报或具有潜在危害。鉴于第 1 级是跟踪&报告的技术练习,第 2 级及以上更具哲理性。

你是“假设”中的“屁股”

当提出改变现有产品或推出新产品的想法时,了解你的假设是什么是很重要的。如果你知道你的假设是什么——尤其是那些你信心不足的假设——你就可以开始想办法将这些假设转化为事实。你要问自己的问题是:做这件事的最好方法是什么?这里有一张图是 100%正确的,并且由科学家进行了同行评审,以帮助构建讨论框架:

如果您可以启动和删除某些东西,而不会永久损害您的用户体验(“回滚”),那么您应该尝试通过实验在真实用户身上进行测试,让您对结果有很高的信心。另一种方法是预先进行研究,寻找先例、市场数据或在受控环境中进行用户测试。虽然本文关注的是该图的左侧,但这两种方法在正确的上下文中都是完全有效的,甚至是互补的,只是基于真实用户数据时可信度更高。这里有一些故事…

新产品 MVP

MVP 的意思是“最小可行产品”。MVP 是一个产品或特性,它包含了测试一个想法的可行性所需的最少的功能或工作量。当谈到现有产品时,在现有用户基础上进行实验的能力是一个优势。但是当用户群还不存在的时候,你需要更有创造力。

根据他们的网站“Rocket Internet 建立并投资互联网公司,将成熟的在线商业模式带到新的、快速增长的市场”。这意味着,他们通常会采用一种他们知道在一个市场成功的产品,并在另一个市场尝试,以此来降低一些风险。然而,失败的风险远非为零,这一模型的一个广为人知的假设是,一个在美国行得通的想法在另一个国家也会行得通。因此,需要制定策略来检验这一假设。例如,当他们评估 Shopwings (一种从超市送货上门的服务)的可行性时,他们派了一帮学生去当地的商店购买每件商品并拍照。每张照片都被放在网站上,并附有描述和合理的价格。钱花在了这个网站的广告上,就用户而言,这是真实的和运行的。一旦他们建立了足够的信心,他们就可以筹集资金,雇佣一个完整的团队来生产产品并交付货物。Rocket 已经非常擅长这种技术,并利用它创办了许多公司。

同样方法的一个更著名的例子是在线鞋类零售商 Zappos 。创始人尼克·斯温穆恩(Nick Swinmurn)从当地一家鞋类零售商那里拍摄了鞋子的照片,并建立了一个网站进行销售。当订单来了,他去商店,购买和运输鞋子。以较低的成本,这解决了人们愿意冒险在网上买鞋的假设。有趣的是,Zappos 启发 Rocket Internet 创建了 Zalando ,它现在是欧洲最大的在线时装零售商之一。

新功能 MVP

一个 MVP 不一定是一个全新的产品。它可以是现有产品上的新特性,允许您运行实验或执行用户测试,这取决于您的回滚能力。新产品 MVP 同样适用的原则是:我们试图用最少的努力来测试关于我们新特性的假设。

一个涵盖很多基础的例子是在 LYKE 上运行的一个小实验,这是一个为注重时尚的印尼人开发的购物应用。LYKE 的一个显著区别在于,推荐是用户体验的核心。这意味着主屏幕、搜索结果和推送通知的内容会受到先前浏览和购买行为的严重影响,而不是像传统做法那样,受到用户输入的搜索标准或由员工管理的列表的影响。然而,建立足够的数据来生成推荐需要用户浏览或购买,因此新用户的体验不如现有用户好。

为了克服这一点,LYKE 决定引入一个 onboarding 流程,用户在第一次打开应用程序时会被问及关于他们口味的问题。研究完成了,设计完成了,用户在实验室接受了测试,并且有了很高的信心。最大的风险是,如果用户理解这样做的价值,他们会愿意提供这些信息。为了测试这一假设,设计了一个 MVP,其中包含关于购物偏好的问题,但没有完成的功能所需的任何其他功能。50%的新用户暴露于此,在奇数和偶数设备 id 之间任意划分(更多关于进一步划分受众)。没有围绕它建立推荐模型,也没有存储数据。谷歌分析事件(如此简单……)被用来跟踪有多少人在入职时关闭了应用程序,在哪个阶段,有多少人没有进入主屏幕,有多少人进一步参与并购买了应用程序,而对照组则没有这种体验。为了便于比较,对控制组和变量组触发的跟踪事件进行了不同的命名。实验显示,大多数人都关闭了应用程序。一些有价值的东西是以低成本学到的:大多数用户只想购物,任何妨碍购物的东西都是不必要的干扰。

上面例子中的一个关键点是,这个项目对 LYKE 的价值与对用户的价值不同。LYKE 重视其个性化体验,但大多数用户只是想购物,而没有意识到科学在指导他们的行为。通过这种方式的实验,该团队以低廉的代价失败了,并了解了很多关于他们的用户想要他们的应用程序的东西,理解了中断他们的流量的真正影响,并帮助指导未来的产品决策。利用第一次实验的数据,他们可以理解问题的落点和最佳点。有了这些数据,他们又尝试了一次,取得了更大的成功……这次用了“跳过”按钮。

实验类型

如果你没注意到,我用了很多“实验”这个词。在上面的例子中,我介绍了两种不同类型的实验:

  • 绿野仙踪测试。这是一个对用户来说似乎完全功能化的 MVP,但是,在引擎盖下,是一些更加手动的东西,就像 Rocket 或 Zappos 的例子。
  • A/B/n 检测多元检测。将你的现有受众分成两个或更多随机的“桶”,向他们展示你的产品或功能的稍微不同的版本,并比较两组之间的行为差异。如在 LYKE 例子中所解释的。

这些很特别,因为对用户来说,它们是真实的。这给了你很多信心,根据你得到的数据,你是否应该改变(改变你的计划),放弃或进一步投资。你也可以通过调查、研究、门房 MVP或者直接的登录页面来测试你的想法的有效性,这些页面解释了如果一个产品以某种方式为用户表达兴趣而存在,它会做什么。虽然我喜欢 A/B/n 测试&绿野仙踪测试的故事,但是人们经常会遇到一些危险…

实验危险

当您对用户进行 A/B/n 测试时,您需要确保用户在存储桶之间的合理分布。LYKE 将用户分为奇数和偶数设备 id,但这是一个可怕的想法,原因有二。首先,如果您同时运行两个实验,而没有在存储桶之间随机分配用户,那么一组用户将看到两个实验的变体,一组用户将看到两个实验的对照。你实际上希望它比这更混合,这样你就可以确定哪个实验导致了哪个影响。

Two mice

未能对用户进行随机分组的第二个问题是,如果你按顺序进行实验,你会有一个总是被实验的受众,而另一个是“干净”的受众。随着时间的推移,与另一个群体相比,这可能会开始影响一个群体的潜在行为。如果你的实验经常改变你的流程的基本部分,那么如果使用你的产品是不可预测的或不稳定的,那将会使那些“不同的用户”感到沮丧。按顺序运行实验还会使安排工作变得很麻烦。

下一个常见的危险是看着实验结果说“是的,够好了”_(ツ)_/。如果你进行实验,你需要确信结果不是随机的。想象你将一枚硬币抛 1000 次,大概它落在一边的次数会比另一边多一点。如果你再次做同样的事情,假设硬币的重量分布均匀,有 50%的机会它会更频繁地落在另一边。为了确信你的结果不是随机的,你可以测试“统计显著性”。有大量的统计显著性计算器供您选择,如这个这个这个这个。尽管有不必要的页面超时,但后者是我的最爱。

统计显著性是一个很好的方法来判断一个变化是否可能是随机的结果,但是有理由偶尔暂时忽略这一点:一些变化需要时间让用户适应。如果他们习惯于把一个按钮放在一个地方,而你把它移到另一个地方,那么在他们再次恢复过来并调整习惯之前,预计他们会有些沮丧或惊讶。我不确定是否有一个好的公式来解释这一点,但当我在 iOS 和 Android 原生应用上工作时,我们经常假设更新后两三天的行为变化,并忽略这一时期进行分析,除非它是灾难性的。我们忽略它,部分是因为在应用程序更新后参与度往往会增加,部分是因为如果最新版本包含应用程序核心流程的变化,用户可能会经历一次调整。

在开始实验之前,心中有一个可以衡量的明确目标是非常重要的,理想的目标是改善你的业务,这不同于衡量对新功能的吸收。当然,衡量你的新功能是否被使用是很重要的,但是更重要的是了解这个功能是否使你的产品更有效。假设你在你的袜子销售网站上运行一个新的愿望清单功能的实验。这个“愿望清单”允许用户保存他们最喜欢的袜子,供以后查看。你当然可以衡量有多少人使用这个功能,但更重要的是要确保访问意愿列表的人继续购买(“转化”)。如果很多人使用愿望清单,但由于某种原因没有购买,那么愿望清单可能会很混乱。

最后一个危害是我所说的“情感过度投资”。当你建立一个东西时,很自然地希望它成功。如果数据显示你构建的东西没有像你希望的那样工作,那么调查一下为什么,因为你可以学到一些东西。但是注意不要找理由来证明你改变的成功。如果上一段中的愿望清单示例导致用户列出很多愿望,但购买更少的袜子,这可能是意想不到的。如果你调查并发现这种下降是真实的,请随时更改功能并再次尝试,但不要不加更改地推出这一功能,除非你对暂时少卖袜子感到舒服。

进一步阅读

  • 关于不同类型的 MVP 的好文章。
  • 可用性测试,我已经懒洋洋地称之为“用户测试”。我现在不会改变对它的引用。
  • Zappos 的故事是在重复已经写好的精益创业。值得一读。
  • A/B 测试框架列表
  • LYKE 构建了一个分桶系统来帮助将用户分配到桶中(比奇数/偶数设备 id 更好!).来看看

包裹

我们讲述了识别假设的重要性,以及测试假设以增强信心的一些方法。然后,我开始长篇大论地谈论做实验时应该避免什么。从中得出的关键是,有相当简单的技术来确定你将要发布的东西是否是一个好主意,并了解你的用户。你甚至可以用实验来对真正的用户冒真正的风险,只要你能体面地回滚。如果你不能,那么你应该把你的努力更多的放在研究和用户测试上。

下一篇文章是关于使用数据(比如通过实验收集的数据)来帮助指导决策。回头见!再见了。再见!

成为数据驱动的第三级:使用数据做出令人敬畏的决策

原文:https://towardsdatascience.com/becoming-data-driven-level-3-using-data-to-make-awesome-decisions-522179766043?source=collection_archive---------1-----------------------

系列第二篇文章中,我们谈到了你可以发现你计划对你的在线产品做的事情是否是个坏主意的方法。这一次,我们将更有前瞻性地思考,并讨论工作的预测和优先顺序。再一次,我带着一个令人兴奋的标题去了,却对这个话题的真实性感到失望。生活充满了这样令人失望的狗屎,习惯吧。

它始于一个假设(我从没想过事情会发展到这一步

假设你有一个销售袜子的网站,你注意到你卖的便宜袜子比高档袜子多。基于此,你有一个假设:如果你提高廉价袜子的突出程度,人们会购买更多。你只需要弄清楚如何检验这个假设,然后变得富有。袜富。你和你的团队讨论并提出以下实验:

  • 在主页上展示便宜的袜子,而不是由你的内部袜子专家挑选的最酷的袜子。
  • 将搜索结果改为按价格升序排序(最便宜的先排序),而不是最新的先排序。

已知的已知和已知的未知

让我们关注上面列出的第二个实验:按价格升序排列搜索结果。您可能会在两种情况下考虑这种影响:

  • 你以前在搜索结果或漏斗的其他部分做过类似的事情,所以对这种变化的潜在影响有一些想法。理想情况下,你已经将此作为实验运行,并且对结果有很高的信心。
  • 你从来没有这样做过,不知道会发生什么。

之前做过类似工作的情况下,设定一个目标要容易一些:你可以把以前的一些经验作为基线,并运用一些判断。如果你做出的最无效的积极改变在转化率上引起了 0.25 个百分点(称为“pp”)的改善,而最有效的是 2pp 的改善,那么你就有了一定的范围。然后,您可以应用其他因素来细化该范围,例如漏斗中的相对突出度,但您正在接近一个现实的目标。这很容易被忽视,但实验中最重要的人工产物之一是对未来变化的预期影响。你做的实验越多,理解的结果越多,你就越了解你的产品,你的用户和可能发生的事情。如果你把以前实验的结果储存在某个地方,那么你会得到一颗额外的金星。干得好。

如果您以前从未对您的袜子网站做过这样的改变,并且不知道会发生什么,转化率变化的范围可能是零个百分点以上或以下。这就是漏斗分析有所帮助的地方(参见成为数据驱动型第 1 级:拥有您信任的用户数据)。现在闭上眼睛,想象你正在做那个分析……很好的一个。以下是您的发现:

  • 您每个月总共有 1,000,000 次课程和 20,000 次销售。这是 2%的转化率。
  • 在这 1,000,000 个会话中,有 250,000 个会话包含搜索(25%)。
  • 250,000 个会话中的 100,000 个(包括搜索),请查看 sock 详细信息页面。其中 10,000 次课程会导致购买(转换)。
  • 因此,搜索的转化率为 4% (10,000 是 250,000 的 4%)
  • 搜索占所有转换的 50%(总销售额为 20,000,其中销售额为 10,000)。

Search result funnel

让我们提出一个假设,将搜索结果的顺序更改为价格上升将使详细页面的浏览量增加 50%(从 100,000 增加到 150,000):

  • 搜索的转化率上升了 2 个百分点,从 4%上升到 6%。
  • 总转化率从 2%上升 0.5 个百分点至 2.5%。
  • 你每月多卖 5000 双袜子。

为了简单起见,我假设转化率呈线性增长,其中 50%以上的详细页面视图转化为 50%以上的销售额。这是一个很大的延伸,因为您可能会因为展示更多相关产品而导致更随意的浏览,所以请考虑这是一个绝对最大的好处。通过运行一个实验,你会看到这有多接近。

现在你有了一个经过深思熟虑的假设,有了一个合理的目标(即使你开始时没有任何想法),并且知道要测试什么来达到这个目标。通过计算假设的潜在收益,我们有了测试工作优先级的基线。你可以开始写任务,人们可以开始设计和编码。厉害!

…然而,在预测搜索结果顺序变化的影响时,有一个巨大的“但是”:但是谁会关心搜索结果中袜子的顺序呢?我一遍又一遍看到的最大错误是团队和公司庆祝发布而不是冲击。如果你根据合同有义务交付某些东西以换取金钱,这没问题,但如果你的工作是改进你自己的产品,这就不好了。如果改变搜索结果的顺序不能增加袜子的销量,没人会在意。去尝试别的事情,直到你达到那个目标。明确一点:在计划中,你寻找的是努力和可衡量的目标。如果你没有达到那个目标,那就学习并尝试不同的东西。

比较苹果和苹果

对于制造产品的公司来说,一个重大的挑战是从无数的想法中知道该做什么。你下一步应该做什么可能偶尔会很明显。然而,很可能你的想法比你能执行的要多。为了弄清楚你应该首先做什么,许多公司和团队执行一些预定的计划,这可能每年发生一次,但也可能每周都发生。在这个计划中,来自多个来源的想法被提出,优先考虑和批准…或者被拒绝和忽略。正如第一段所确立的:生活是艰难的。从这些练习中,有四点很重要,但是经常缺少。

一致影响测量。如前所述,除非你有合同义务,否则执行项目时最重要的是影响,而不是交付。尽管通常很有可能制定出一个目标(见上文),但经常听到没有目标的项目提案。这不必是一篇很长的散文,就像“转化率增加 0.5 个百分点”,这是一种解释你计划如何达到这个数字以及你所做的假设的能力。

当涉及到多个团队提出一个项目时,康威定律经常适用,你可能会对同一件事有不同的表达。例如,您可能会听到“转化率增加 0.5 个百分点”表述为“额外售出 305 只袜子”、“每天额外售出 10 只袜子”、“搜索结果转化率增加 50%”、“每月额外收入 6982 美元”、“找到便宜袜子提高了用户满意度”等等。所有这些都可能是在陈述同样的事情,但却很难理解和比较。因此,为您的团队提供少量的度量标准和他们应该使用的单位是有益的。对于我们的袜子网站,这可能是:

  • 转换率的百分点变化(导致销售的会话)。
  • 新用户的数量(以前没有记录会话的用户)。
  • 返回用户的数量(以前记录过会话的用户)。

我们 sock 项目的很大一部分应该能够影响这三个指标中的一个。你的产品可能不是一个袜子网站,但关键是使用简单的指标,可以理解和表达整个组织一致。

向后工作。以上观点的延伸是:从一个目标开始。就我个人而言,我喜欢设定一个目标,并被赋予实现目标的自由。以“我们计划将转化率提高 0.5 个百分点”开始,然后“我们将试图通过改变搜索结果的顺序来实现这一目标,因为我们假设大多数人对廉价袜子感兴趣”。通过这样做,你强调了什么是重要的:转化率增加 0.5 个百分点。你也表达了你可能如何到达那里,但你不应该害怕改变你的计划。

T 恤尺寸是本地化的标准。这是千真万确的:t 恤尺寸反映了当地市场上人们的体型。谁知道呢?在衡量工作的复杂性或努力程度时,这也是一个比喻。两个团队可能对“小”、“中”和“大”的含义有非常不同的理解。因此,当比较来自多个团队的提议时,尽量坚持你将投入多少时间以及谁将从事这项工作。我的思维模式是“如果一个团队被锁在一个房间里做这件事,谁会在那个房间里呆多久?”。你可以表达当你进行一项实验时存在一些不确定性,实验结果可能会影响你以后的决策,或者其他一些不可预知的事情。所有这些都是有缺陷的,但是你正在寻找一种合理地比较工作的方法,以便对其进行优先排序,天、周和月是很好理解的时间单位。

你的假设可能是错的。但那很酷。围绕这个信念优化你的执行风格。如果你刚刚了解到一些关于用户如何与你的产品互动的新知识,那么错了也没关系。事实上这很重要。花费不必要的精力来完成这种学习就不那么酷了。当弄清楚如何测试你的假设时,把注意力放在尽可能少的努力和为用户伪造体验的方法上,而不是构建整个过程。

进一步阅读

包裹

ImmobilienScout24 ,我们一直在使用计划卡来帮助多个团队一致地构建我们的项目,以便我们可以进行比较、优先排序和计划。下面是一个版本,你可以用在你的袜子网站上:

A planning card and an illustration of why my parents bought me a computer

由于这可能很难阅读,上面的卡片包括:

  • 我们计划做什么(“通过推广廉价袜子来提高转化率”)。
  • 我们的三个目标和预测影响(转化率增加 0.5 个百分点,误写成 0.5%,对新用户或回头客数量没有预期影响)。
  • 我们计划进行的实验(“搜索结果上升”和“主页上的廉价袜子”)。
  • 我们所做的假设(“对用户来说,价格比近期更重要”)。
  • 我们需要的人员,这有助于我们规划容量。
  • 我们认为建立、运行和分析我们的实验需要多长时间。如上所述,时间单位有助于跨多个团队标准化。这并不酷,但很实用。如果你喜欢,可以叫实习工具。

这篇文章的关键信息概括在这张计划卡中:有一个假设,一些要测量的东西和一个起点(在这个例子中是实验);最终的可交付成果没有目标重要。

下一篇文章是关于“用数据塑造你的组织”,在这里你可以开始应用这里概述的东西来设计团队结构和流程。

*虽然我听说它有自己的月亮。

成为数据驱动的第 4 级:用数据塑造你的组织

原文:https://towardsdatascience.com/becoming-data-driven-level-4-using-data-to-shape-your-organisation-aa90cc637a9b?source=collection_archive---------4-----------------------

系列第一部分中,介绍了收集和读取数据的起点,在第二部分中,我们讨论了如何使用这些数据来启动帮助您发展业务的事情,在第三部分中,我们讨论了您可以预测和优先处理工作的方法。

在最后一部分,我们将使用这些构建模块来构建和扩展产品工程团队。我将谈谈我合作过的团队,他们将数据作为成功的定义和结构的基础。但是首先…

不同类型的团队

比方说,如果你有 8 名以上的工程师和一个产品,那么你可能希望将这些工程师、产品经理、分析师和设计师塑造和定义为最适合你试图优化的团队:速度、可靠性、技术才华、快乐、产品美观或其他。以下是一些例子:

  • 项目团队。这些团队是围绕特定的可交付成果创建的。理论上,当然对于跨越几个月的大型项目来说,这种结构优化了可预测的项目结果。项目团队通常是自治的和跨职能的。根据定义,他们也不负责他们所建造的东西的长期维护,因为一旦项目完成,他们就解散了。处理好它。
  • 特色团队。功能团队和项目团队看起来非常相似,但是有细微的区别。一个项目团队可能跨越多个特性,并且只是暂时存在,而一个特性团队可能在很长一段时间内处理同一个特性的多个项目。功能团队的一个例子可能是“支付团队”,负责与电子商务产品支付相关的所有主题。当变更需要跨多个特性工作时,这些团队需要有人来协调。
  • 组件/平台团队。在这种配置中,您可以根据平台或技术来划分团队,并努力在交互平台之间建立定义良好的接口。这可能适用于复杂的系统(例如,考虑一架飞机是如何设计和建造的),但这需要一些项目管理开销来进行跨多个平台的产品更改。它肯定不是为速度而优化的。
  • 客户团队。如果你的企业有多种不同类型的付费客户,围绕这些客户组建你的团队会很有用。例如,如果你是一家广告公司,你可能有三个主要客户,每个客户都有一个相关的团队。另一个例子可能是一个产品的用户在不同的国家,每个国家对你的产品都有特殊的需求,比如不同的语言或支付网关。这是为了以潜在的费用和技术复杂性为代价的交付而优化的。
  • 度量驱动的团队。在这种设置中,团队负责监控和改进特定的指标(如“转化率”或“页面速度”),并期望包含实现该目标所需的所有人员。它们不像项目团队那样根据具体的可交付成果来衡量。相反,它们是通过度量的变化来衡量的。这是我们将在这篇文章的剩余部分主要讨论的团队设置。

成长@ Etsy

在 Etsy 面向用户的产品工程部,我们有大约 70 名工程师、设计师、分析师和产品经理。他们被分成不同的小组,执行不同的任务。例如,我们有一个主页项目团队,一个为营销构建和维护电子邮件基础设施的平台团队,一个包含 Etsy 搜索体验大部分知识的团队,一个付费广告功能团队,等等。虽然看起来有点混乱,但这些团队相当独立,非常关心他们的工作,并进行实验,以确保所有用户看到的变化在某种程度上对 Etsy 和它的卖家是有益的。虽然一切正常,但我们希望以某种方式扩大组织规模,加深对用户体验关键部分的了解,并基于稳定的团队更有效的信念创建稳定的团队。

解决方案是将这 8 个左右的团队分成两组:增长团队和买家体验团队。增长小组的目标非常简单:增加 Etsy 网站和应用程序的会话数量。买家体验组的目标稍微复杂一些,但可以概括为“提高转化率”。增长小组增加会议次数的总体指标目标被分解为更具体的指标,并指派团队来改进每一项指标。我们将集中讨论增长是如何被组织成多个团队的,但值得注意的是购买者体验和增长之间的积极张力:随着增长团队增加会议,它抑制了购买者体验团队的转化率,然后他们努力抵消。

为了增长,会议是王道。会话是对网站或原生应用的访问(实际上比那个更复杂)。Growth 团队的任务是制定与直接增加会议次数相关的清晰、简单且可衡量的目标。

  • 新访客增长:这个团队致力于增加 Etsy 上的用户数量,而没有之前录制的会话。虽然标题指标增加了新用户的数量,但这可以分解为与 Etsy 可用的各种流量源的优化相关的更具体的指标。他们的重点是搜索引擎优化和 SEA 的改进。这涉及到网站各个部分的工作,例如,提高(主要是)谷歌的排名,降低新用户的跳出率
  • 注册:由于各种原因,如果没有注册账户,你就不能在 Etsy 上购物。一旦用户注册并登录,他们只会在购买过程中中断支付。注册用户也保持得非常好:注册一个账户不仅是一个非常强烈的参与信号,而且它还允许 Etsy 以后联系你,比如在圣诞节前一个月给你发一封电子邮件。该团队将这一高级指标分解为不同的注册方法,创建了允许用户使用脸书或谷歌帐户登录的项目,并优化了传统的注册流程。
  • 保留:这个团队的目标是通过之前录制的会话增加 Etsy 上的用户数量。他们的主要手段相当直接和生硬:电子邮件和推送通知。像新访客增长一样,一个简单的目标可以分解成许多不同的指标,这些指标与各种渠道的功效相关。一旦理解了这些,团队就可以发现改进的机会。

每个团队包括 4-6 名具备必要技能的工程师,他们可以在必要时跨 Etsy 的所有平台(web、iOS 和 Android)进行运输并执行一些分析,一名对其主题具有丰富知识的产品经理,一名确保跨 Etsy 的一致和可用体验的设计师,以及一名帮助了解工作机会和影响的指定分析师。他们的目标很明确,对于他们执行的大部分工作来说,包含了所有提出想法并自主执行的人。这个跨职能团队与营销团队的密切关系,对于那些有增长黑客经验的人来说应该是熟悉的。在建立这种亲密关系的过程中,来自营销团队的人在卡拉 ok 之夜和去看棒球的同时参加了产品工程会议。

Etsy 的招聘政策意味着人们主要是根据他们对产品的兴趣和 Etsy 的使命来选择的。在面试过程中,候选人会被问及他们的意见,而且更多的时候,他们与 Etsy 有一些个人联系。这意味着工程领域的每个人都对产品有一些看法,并且非常关心它。这为员工了解产品及其用户创造了肥沃的土壤。这一点的具体影响是,产品变更可能来自公司的任何部门,无论其角色如何。例如,工程师通常会构思一个实验,找出最简单的方法来测试他们的假设,并进行分析以理解结果。产品经理被视为其领域的专家(如保留策略),确保想法符合一些长期战略,并利用他们的产品管理专业知识来帮助考虑想法的影响,而不是规定团队将承担什么工作。对于许多产品经理和工程师来说,这通常是对以前工作的文化调整,在新员工入职时必须考虑到这一点。

供求@ LYKE

前一篇文章中提到的【LYKE 是一家为印度尼西亚服装购物者开发应用程序的初创公司。它的产品工程团队比 Etsy 小得多,大约只有 12 个人。LYKE 不出售自己的商品,而是像 Etsy 一样,为其他人(“卖家”)制造和运送的商品做广告。

LYKE 的产品工程团队最初是按平台划分的。工程师们每人负责编码、监控和部署技术基础设施的一部分。此外,尽管公司很小,但工程师和产品经理是相互独立的。如果一个产品经理想要改变一些东西,他们必须和一个特定的人谈话,然后这个人会把工作分配给每个必要的工程师。工程师们将一起找出组件间数据流的最佳接口,评估和部署该特性。产品经理们的挫折感很大,简直是被逼哭了,直接导致了辞职。对于一个局外人来说,这个问题很明显。

像大多数电子商务创业公司一样,LYKE 也遭受了库存和用户之间的循环依赖:当没有足够的用户时,很难让卖家列出库存,如果没有足够的销售,也很难获得用户。为了让工程师、产品经理、分析师和设计师专注于解决这种循环依赖,产品工程团队被分成了两个团队:“供应”和“需求”。

供应团队的产品经理有一个库存目标,工程师们执行任何必要的工作,以便更容易地在 LYKE 上列出产品。需求团队的产品经理也有工程师和设计师,但目标是通过用户增长或提高转化率来增加销售。对 LYKE 来说,需求团队融合了 Etsy 的“成长”和“买家体验”。将这两个学科结合起来只是因为公司的规模:它不够大,不足以支持拆分增长和转换率的提高,因此团队在这两个杠杆之间进行了权衡。

这种重组很快影响了日常工作:每个团队的人坐在一起,站在一起,他们之间的形象墙被拆除了,因为产品经理现在可以和工程师坐在一起,想出最好的方式来一起运送东西。工程师们的关注点已经从平台转移到了供需指标上。这需要一些调整,包括一名工程师辞职,但影响是迅速的,而且在很大程度上是积极的。团队明显更开心了,速度更快了,可以衡量他们工作的影响了,就像他们在初创公司应该做的那样,工程师们开始贡献想法,而不仅仅是工作票。值得注意的是,通过分享客户反馈会议和站立式 A/B 测试的结果来教育团队中的每个人,这变得更加容易。

本地应用@ ImmobilienScout24

ImmobilienScout24(简称“ImmoScout”)是德国领先的房地产门户网站,虽然规模与 Etsy 相似,但业务却截然不同。在 Etsy 和 LYKE,用户愿意购买的商品数量有些弹性,会受到产品变化的影响。然而,无论 ImmoScout 的网站和原生应用程序如何优化,这些平台都很难增加购买的房屋数量。尽管如此,还是有一些非常相似的挑战和解决方案。

在加入 ImmoScout 后,很明显 iOS 和 Android 原生应用团队的出货情况并不好,因为他们可以获得大约 16 名工程师、3 名设计师、1 名 UX 专家和 1 名最近辞职的产品经理的能力。团队在平台和功能上的分裂是显而易见的。沟通方面的分歧经常可以在座位图中看到,在这种情况下,所有 iOS 工程师坐在一个房间的一侧,所有 Android 工程师坐在另一侧,API 专家在其他地方。产品经理和设计师(也致力于一个平台)坐在 20 米外完全不同的房间里。在这个团队中有很多挫折,有时会导致相对较小的问题,辞职和断断续续的释放大声,循环的争论。

虽然德国购房者一手拿着 ImmoScout Android 应用,一手拿着 iOS 应用并不正常,但那些在 2016 年这样做的人应该会看到康威定律的图形说明。例如,要在地图上看到你的搜索结果,需要在 Android 应用中滑动,在 iOS 应用中点击下拉菜单。在 iOS 中,多年来一直有高效的推送通知,但从未进入 Android 应用程序。这个清单很长,但是你已经明白了。虽然这些差异不一定是一个巨大的用户问题(正如我所说,谁会同时看这两个应用?),他们是偶然的。往好里说,它们反映了 Android 和 iOS 团队之间分享的知识是多么少,往坏里说,它们代表了一种令人困惑的产品愿景。

在这一点上,我们做了三个显著的改变:首先,一个产品经理被两个产品经理取代,以反映工作量。这已经计划了一段时间,但这是一个非常积极的变化,尤其是考虑到这些产品经理带来的创业态度。他们没有主动离开公司的事实也很方便。

第二个变化是强加了一条规则,即默认情况下,所有功能更新都必须经过 A/B 测试。为此选择的工具是optimized,仅仅是因为在 ImmoScout 已经有了它的许可,我们想马上开始。这条规则的引入有两个影响:只有积极的变化会被 100%的用户看到,团队可以看到他们的工作对真实用户的影响。了解影响不仅有潜在的激励作用,也有教育意义。这种知识的增长使得规划的质量有了显著的提高。

最后,团队是由公制而不是平台组织的。一个团队叫做“成长”(还记得 Etsy 的这个吗?),其目标只是“增加 x%的会话”,另一个叫做“参与度”,其目标是保持每次会话的稳定比率,即用户查询 ImmoScout 应用程序上列出的属性的比率。这类似于转换率。询问率保持稳定而非上升的原因是(根据以前的经验)认为增加会议次数也会导致听众参与度降低。因此,保持一个稳定的汇率本身就是一个挑战,而且已经证明是一个公平的目标。

每个团队包括一名产品经理、一名设计师、一名 API 专家、一半 Android 工程师和一半 iOS 工程师。蛋糕上最后的樱桃是这些团队之间分享的分析师,以帮助他们了解影响和机会。与 LYKE 的转型类似,这导致了一些明显的变化:座位被重新安排(产品经理被故意放在中心),增长和参与团队有单独的展台,每两周展示一次两个团队,这些展示的开场幻灯片涵盖了会话和查询率指标(以及下载量、应用评级),大部分时间花在实验的状态和学习上。

按平台划分团队的理论好处之一是技术稳定性。逻辑是,如果一个 Android 团队(例如)紧密合作,而不是与产品经理保持一致,他们可以更容易地优先考虑将提高稳定性和可维护性的技术工作,因为工程经理决定谁做什么。不管这是不是真的,我们保持了相同的面向平台的报告路线。之前 iOS 和 Android 的工程经理仍然是 iOS 和 Android 专家的直线经理。这些经理负责确保部署按时进行(如果不是自己执行部署的话),保持无故障率> 99.90%,为对各自平台感兴趣的人召开会议,支持需要本地应用工作的其他团队,最重要的是,让他们的团队满意。

最后,当团队先前不开心时造成的小规模员工流失创造了雇佣具有更强产品意识的工程师的机会。在招聘过程中,对技术能力的主要关注有所放松,有利于那些对 ImmoScout 应用程序感兴趣的人。如果一个有能力的工程师带着合理的意见参加面试,告诉他们产品中哪些地方可以改进,这就让他们比一个可能更有经验、不太关心用户体验的工程师更有优势。

在证明了度量驱动模型之后,下一步是将这一理念推广到本地应用团队所在的 60 多人的“消费者体验”部门。这将创建三个多平台、跨职能的团队,每个团队都旨在改善一项指标,如新用户数量、回头客数量以及跨原生应用和网站的查询率。我期待看到 Etsy 中使用的镜像结构将如何在 ImmoScout 中工作。

进一步阅读

包裹

虽然在实现度量驱动团队的过程中偶尔会遇到一些困难,但我相信上面描述的变化(以及在之前的文章中的描述)在很大程度上是积极的。由此产生的团队持续交付超出正常预期的价值,团队能力随着期望的增加而增长。此外,他们创造了有趣的工作环境,很好地留住了员工。工作不仅仅是让公司变得更富有,它还关系到你如何度过生命中的 86000 个小时。当它们经过你的办公桌时,数下每一个小时。数一数。如果你真的看到计数到零,你就老了。超级老。

虽然 Etsy、LYKE 和 ImmobilienScout24 的例子侧重于不同的目标,涉及不同的个性,但它们有一些共同的特征:

  • 他们的工作集中在一个明确的目标上。有时候这很容易,老板或客户交给你一个交付目标,围绕这个目标组织人员。往往不是那么清楚。有了清晰、持久的度量标准,即使下一个大项目不明显,他们也能够保持专注和稳定。
  • 他们包含了有知识和技能的人来做决定和改变产品,只是偶尔需要来自其他团队的输入。换句话说,它们是跨职能的,并且足够可信,可以自主运营。
  • 他们很开心。士气普遍很高,工作人员的保留率也很高,令人遗憾的损失很少。
  • 默认的立场是实验。这意味着所有用户可用的每一个变化都提升了公司。这也意味着团队中的大多数人理解他们的贡献,并且拥有强大的知识体系来提出和预测想法的影响。

感谢您阅读本文,我希望这个系列对您有用...好吧,那么…嗯…再见?

贝多芬、毕加索和人工智能

原文:https://towardsdatascience.com/beethoven-picasso-and-artificial-intelligence-caf644fc72f9?source=collection_archive---------7-----------------------

“A low-angle black-and-white shot of a person playing the piano” by Guang Yang on Unsplash

介绍

当人们想到有史以来最伟大的艺术家时,他们可能会想到贝多芬或毕加索这样的名字。没有人会认为电脑是伟大的艺术家。但如果有一天,事实确实如此。计算机能学会画出像蒙娜丽莎这样不可思议的画吗?也许有一天,一个机器人将能够创作下一部伟大的交响乐。一些专家认为是这样的。事实上,人工智能领域一些最伟大的头脑正在努力开发能够独立于人类创作绘画和音乐的程序。人工智能在艺术领域的应用甚至被谷歌等科技巨头所采用。

本文中包含的项目可能会对我们的日常生活产生重大影响。它们还可能改变我们看待艺术的方式。它们还展示了人工智能领域取得的令人难以置信的进步。图像识别并不像研究那样深入。以我们过去伟大艺术家的风格创作音乐的能力也是如此。虽然会涉及到这些主题,但我们将重点关注几个更高级的成就,如文本描述被转化为图像,以及生成完全原创的艺术和音乐。这些项目中的每一个都带来了新的和创新的东西,并向我们展示了艺术空间是如何成为进一步探索人工智能应用的绝佳场所。我们将讨论这些项目中遇到的问题以及如何克服这些问题。人工智能的未来看起来很光明。让我们看看未来会怎样。通过这样做,我们可能能够更好地理解人工智能在一个由人类创造力驱动的领域中可能产生的影响。

GAN 及其演化形式

机器必须接受教育。他们从指导中学习。我们如何引导机器不去模仿已经存在的东西,并让它们创造新的技术?“没有一个有创造力的艺术家会在今天创造出试图模仿巴洛克风格、印象派风格或任何其他传统风格的艺术,除非他们试图讽刺地这样做”[4]。这个问题也不仅限于绘画。音乐在某些方面非常有条理,但也是一种需要大量创造力的艺术形式。那么我们如何着手解决这样一个问题呢?我们要讨论的第一个概念叫做 GAN(生成对抗网络)。GANs 虽然相当复杂,但正在成为一种过时的模型。如果艺术领域的人工智能要进步,研究人员和开发人员将不得不努力寻找更好的方法,让机器产生艺术和音乐。其中两种方法以草图的形式呈现——RNN残(创意对抗网络)。这些方法都有其优于 GANs 的优点。

首先,让我们探讨一下 GAN 到底是什么。下面是一小段摘录,解释了 GAN 的工作原理:

生成对抗网络有两个子网络,一个生成器和一个鉴别器。鉴别器可以访问一组图像(训练图像)。鉴别器试图区分“真实”图像(来自训练集)和生成器生成的“虚假”图像。生成器试图在看不到图像的情况下生成与训练集相似的图像[4]。

生成器创建的图像越多,就越接近训练集中的图像。这个想法是,在生成一定数量的图像后,GAN 将创建与我们认为的艺术非常相似的图像。至少可以说,这是一个非常令人印象深刻的成就。但是如果我们更进一步呢?

许多与 GAN 相关的问题只是限制了它的功能。GAN 是强大的,但是不能做我们想要的那么多。例如,上述模型中的生成器将继续创建越来越接近提供给鉴别器的图像的图像,它不会生成原创艺术。GAN 可以被训练为与用户一起绘制吗?不太可能。该模型也无法将基于文本的图像描述转化为实际的图片。尽管 GAN 可能令人印象深刻,但我们都同意它可以改进。提到的每一个缺点实际上已经被处理,并且在一定程度上被解决。让我们看看这是如何做到的。

Sketch-RNN 是 Google 开发的递归神经网络模型。素描 RNN 的目标是帮助机器学习以类似人类学习的方式创造艺术。它已经被用于谷歌人工智能实验,能够与用户一起绘制草图。在这样做的同时,它可以为用户提供建议,甚至在用户决定休息一下时完成用户的草图。Sketch-RNN 接触到了大量的草图,这些草图是通过一组矢量图提供的,这些矢量图是通过另一个谷歌应用程序获得的,我们将在后面讨论。每一个草图都有标签,让程序知道草图中的物体是什么。数据集将草图表示为一组笔画。这使得素描 RNN 然后了解某个物体的每个素描有什么共同点。如果用户开始画一只猫,素描 RNN 就可以向用户展示这只猫的其他共同特征。这个模型可以有许多新的创造性应用。“在各种课程上训练的纯解码器模型可以通过建议完成草图的许多可能的方法来帮助艺术家的创作过程”[3]。Sketch-RNN 团队甚至认为,给定一个更复杂的数据集,这些应用程序可以在教育意义上用于教用户如何绘画。单独使用 GAN 无法轻松实现草图 RNN 的这些应用。

另一种用于改进 GAN 的方法是创造性的对抗网络。在他们关于对抗性网络产生艺术的论文中,一些研究人员讨论了一种通过易拉罐产生艺术的新方法。这个想法是,CAN 有两个对手网络。一个是生成器,它无法接触到任何艺术。在生成图像时,它没有任何基础。另一个网络,鉴别器,被训练来将生成的图像分类为艺术或非艺术。生成图像时,鉴别器向生成器提供两条信息。第一个问题是,它是否认为生成的图像与它接受训练的艺术作品来自同一个发行商,另一个问题是,鉴别器如何将生成的图像归入它所学习的艺术类别之一。这种技术是神奇的,因为它帮助生成器创建图像,这些图像既可以模仿过去的艺术作品,因为它学习了这些图像的优点,又具有创造性,因为它被教导产生新的不同的艺术概念。这与甘模仿训练图像的艺术创作有很大的不同。最终,CAN 将学会如何只生产新的和创新的艺术品。

香草甘的最后一个未来是堆栈甘。StackGAN 是一个从文本到照片的逼真图像合成器,它使用堆叠式生成对抗网络。给定文本描述,StackGAN 能够创建与给定文本非常相关的图像。这对于正常的 GAN 模型来说是不可行的,因为即使使用最先进的训练数据库,从文本描述中生成照片级的图像也是非常困难的。这就是 StackGAN 的用武之地。它把问题分成两部分。“低分辨率图像由我们的第一阶段 GAN 生成。在第一阶段 GAN 的顶部,我们堆叠了第二阶段 GAN,以根据第一阶段结果和文本描述生成逼真的高分辨率图像”[7]。正是通过对第一阶段结果和文本描述的调节,第二阶段 GAN 可以发现第一阶段 GAN 可能遗漏的细节,并创建更高分辨率的图像。通过将问题分解成更小的子问题,StackGAN 可以解决常规 GAN 无法解决的问题。下一页的图片展示了常规 GAN 和 StackGAN 每一步的区别。

This image came from the StackGAN paper [7].

正是通过近年来取得的这些进步,我们可以继续推动人工智能的发展。我们刚刚看到了改进一个已经相当复杂和创新的概念的三种方法。这些进步中的每一项都有实际的、日常的用途。随着我们不断改进人工智能技术,我们将能够做越来越多的事情,不仅仅是艺术和音乐,而是各种各样的任务来改善我们的生活。

DeepBach、Magenta 和 NSynth

然而,图像并不是人工智能能够影响的唯一艺术类型。正如我们所说,它对音乐的影响正在被探索。我们现在将探讨一些具体案例及其对音乐和人工智能的影响。在这样做的时候,我们应该能够看到艺术如何为人工智能做同样多的事情。这两个领域都从我们在这里探索的项目类型中受益匪浅。

机器能够创作出像约翰·塞巴斯蒂安·巴赫这样的音乐吗?在一个名为德普巴赫的项目中,几名研究人员试图创作类似巴赫合唱曲的作品。DeepBach 的美妙之处在于它“能够生成连贯的音乐短语,并提供,例如,旋律的各种重新和声,而不会抄袭”[6]。这意味着什么,DeepBach 可以创造结构正确的音乐,是原创的。这正是巴赫的风格。这不仅仅是他作品的混搭。DeepBach 正在创造新的内容。DeepBach 的开发者继续测试他们的产品是否真的能愚弄听众。

作为实验的一部分,超过 1250 人被要求投票决定展示给他们的作品是否确实是巴赫创作的。受试者有不同程度的音乐专长。结果显示,随着 DeepBach 复杂性模型的增加,受试者在区分巴赫的合唱曲和 DeepBach 的合唱曲时会遇到越来越多的困难。这个实验向我们表明,通过使用人工智能和机器学习,完全有可能以伟人的形象再造原创作品。但这是人工智能在艺术和音乐领域的极限吗?

DeepBach 取得了一些在不久前闻所未闻的成就,但这肯定不是人工智能在音乐领域所能做的最大贡献。如果我们想创造新的和创新的音乐呢?也许人工智能可以一起改变音乐创作的方式。肯定有项目做得更多来突破极限。事实上,这正是 Magenta 背后的团队所要做的。

Magenta 是谷歌大脑团队正在进行的一个项目,由 Douglas Eck 领导。埃克自 2010 年以来一直在谷歌工作,但这并不是他对音乐兴趣的开始。埃克帮助建立了大脑音乐和声音,一个大脑、音乐和声音研究的国际实验室。他还参与了麦吉尔音乐媒体和技术跨学科研究中心的工作,并且是蒙特利尔大学计算机科学的副教授。

Magenta 的目标是成为“一个研究项目,推进音乐和艺术生成的机器智能的艺术状态”[2]。它是一个使用 TensorFlow 的开源项目。Magenta 的目标是学习如何以一种真正可生成的方式生成艺术和音乐。它必须超越仅仅模仿现有的音乐。这与 DeepBach 的项目截然不同,DeepBach 试图以一种不抄袭现有音乐的方式模仿现有音乐。Eck 和他的公司意识到,艺术就是捕捉惊喜的元素,并吸引人们对某些方面的注意。“这带来了或许是最大的挑战:将世代、关注和惊喜结合起来,讲述一个引人入胜的故事。如此多的机器生成的音乐和艺术在小块中是好的,但缺乏任何种类的长期叙事弧”[2]。这种观点赋予了电脑生成的音乐更多的内容,并帮助它变得不那么噱头。

magenta 团队开发的项目之一叫做 NSynth 。NSynth 背后的想法是能够创造前所未有的新声音,但除此之外,重新想象音乐合成是如何完成的。与普通合成器专注于“振荡器的特定排列或样本回放的算法,如 FM 合成或粒度合成”[5]不同,NSynth 在个体层面上生成声音。为此,它使用深度神经网络。谷歌甚至推出了一项实验,让用户真正看到 NSynth 可以做什么,让他们将现有乐器的声音融合在一起,创造出前所未有的新混合声音。例如,用户可以使用两种乐器,如班卓琴和大号,并提取它们声音的一部分来创建一种全新的乐器。该实验还允许用户决定每种仪器的使用比例。

像 Magenta 这样的项目向我们展示了人工智能在创作音乐方面的全部能力。他们探索人工智能的新应用,可以独立于人类产生新的想法。这是我们最接近机器创造力的阶段。虽然机器还不能真正思考和表达创造力,但它们可能很快就能产生新的独特的艺术和音乐供我们欣赏。不过不要担心。Eck 不打算用 AI 取代艺人。相反,他希望为艺术家提供以全新方式创作音乐的工具。

深梦且快,画!

当我们展望人工智能在艺术领域被用来实现新的和创新的想法的更多方式时,我们看着像这样的项目快速,绘制!深梦。这些项目展示了该领域的惊人进展,同时指出了人工智能研究人员在未来几年必须解决的一些问题。

快,画!是来自谷歌创意实验室的一个应用程序,被训练来识别快速绘图,就像人们在猜字谜游戏中看到的一样。该程序可以根据之前给它的许多图片的共同点来识别简单的物体,如猫和苹果。虽然程序不会每次使用时都得到正确的图片,但它会继续从绘制的图片和之前的数百张图片中学习相似之处。

快,画背后的科学!“使用了一些帮助谷歌翻译识别你的笔迹的技术。要理解笔迹或图画,你不能只看这个人画了什么。你看看他们实际上是怎么画出来的”[1]。它以游戏的形式呈现,用户画出应用程序选择的对象的图片。然后程序有 20 秒的时间来识别图像。在每个会话中,用户总共有 6 个对象。这些图像然后被存储到用于训练应用的数据库中。这恰好是我们之前在草图-RNN 应用程序中看到的同一个数据库。这种图像识别是人工智能在艺术和音乐领域的一个非常实际的应用。它可以在日常生活中给我们带来很多好处。但这仅仅开始触及人工智能在该领域所能做的事情的表面。尽管这非常令人印象深刻,但我们可能会指出,该应用程序并没有真正理解正在绘制的内容。它只是发现了一些模式。事实上,这种区别是简单的 AI 技术和真正的人工通用智能之间的差距的一部分。真正理解图像中的物体是什么的机器似乎不会在不久的将来出现。

艺术领域另一个有趣的项目是谷歌的 Deep Dream 项目,该项目使用 AI 来创建新的独特的图像。不幸的是,深度梦生成器团队不会对技术本身进行太多的细节描述(主要是担心对于一封电子邮件来说太长了)[8]。然而,他们解释了卷积神经网络是在著名的 ImageNet 数据集上训练的。这些神经网络然后被用来创建艺术般的图像。本质上,深度梦采用一个图像的样式,并用它来修改另一个图像。结果可以是任何东西,从愚蠢的融合到艺术杰作。当程序识别用户提供的图像的独特样式并将这些样式强加到用户提供的另一个图像上时,就会发生这种情况。通过使用 Deep Dream 可以很容易地观察到,计算机还没有能力真正理解它们在艺术方面做了什么。它们可以被输入复杂的算法来生成图像,但并不从根本上理解它们正在生成什么。例如,计算机可能看到一把刀正在切一个洋葱,并假设刀和洋葱是一个物体。缺乏真正理解图像内容的能力是研究人员尚未解决的一个难题。

也许随着我们在人工智能方面的不断进步,我们将能够拥有真正理解图像中的对象以及它们的音乐所唤起的情感的机器。实现这一目标的唯一途径是达到真正的人工智能(AGI)。与此同时,深度梦团队相信,生成模型将能够创造出一些真正有趣的艺术作品和数字内容。

我们将何去何从?

在这一部分,我们将考虑人工智能在艺术领域的发展方向。我们将看看人工智能是如何影响这个领域的,以及它能以何种方式继续这样做。我们也将关注艺术和音乐在未来几年继续影响人工智能的方式。

虽然我不认为我们已经完全掌握了模仿过去伟大艺术家的能力,但这个问题的解决只是时间问题。真正需要解决的任务是在艺术和音乐上创造新的创新。我们需要朝着没有模仿的创造方向努力。很明显,我们正通过 CAN 和 Magenta 等项目朝着这个方向前进。人工通用智能(AGI)并不是完成这项任务的唯一途径。事实上,即使那些质疑 AGI 的可能性的人也很难质疑由一台机器创造出独特的艺术作品。

通过人工智能进一步提高艺术和音乐的一条途径是创建更先进的数据集,用于训练复杂的网络,如素描 RNN 和深度梦。人工智能需要经过训练才能达到预期的性能。这种训练对我们获得的结果有着巨大的影响。难道我们不应该尽可能以最有益的方式训练我们的机器吗?即使开发像 Sketch-RNN 这样的软件来使用《深度梦境》中使用的 ImageNet 数据集,也可能会在教育艺术家绘制复杂、逼真图像的技术方面发挥巨大作用。复杂的数据集很可能是我们更有效训练的答案。在我们的机器能够像我们一样思考和学习之前,我们需要非常小心使用什么数据来训练它们。

艺术和音乐可以帮助影响人工智能的方式之一是提供另一种图灵测试机器的方法。对于那些梦想创造 AGI 的人来说,有什么更好的方法来测试机器的能力,以创造出测试人类创造力的东西呢?艺术是人类创造力最真实的表现。事实上,这就是它的本质。尽管艺术可能不是人工智能的终极目标,但它可能是测试机器能力极限的最佳方式之一。有一天,计算机可以创作原创音乐作品,并根据用户的描述创建图像,这很可能就是我们无法区分人和机器的那一天。

结论

在音乐领域使用人工智能有很多好处。其中一些已经在我们目前讨论的项目中出现过。我们已经看到了人工智能如何用于图像识别,以及它们将我们的话语转化为精彩图像的能力。我们也看到了人工智能如何被用来合成从未听过的新声音。我们知道,人工智能可以用来与我们一起创作艺术,也可以独立于我们之外。它可以被训练来模仿过去的音乐,并且可以创造新的想法。所有这些成就都是推动人工智能研究走向未来的一部分。谁知道呢?也许有一天,我们将实现人工智能,机器将能够理解它所获得的图像中的真实内容。也许我们的计算机能够理解他们的艺术带给我们的感受。有一条清晰的道路告诉我们从这里去哪里。我坚信,无论是在艺术领域还是在我们的日常生活中,我们都应该继续这项研究,并测试人工智能的极限。

参考

  1. 开发者,谷歌。(2016 年 11 月 15 日)。人工智能实验:快,画!美利坚合众国。
  2. Eck,D. (2016 年 6 月 1 日)。欢迎来到 Magenta!从品红色检索:【https://magenta.tensorflow.org/welcome-to-magenta
  3. 埃克博士和哈博士(2017 年)。素描的神经表征。 eprint arXiv:1704.03477。
  4. 埃尔加马尔,a .,刘,b .,埃尔霍塞尼,m .,&马佐尼,M. (2017)。CAN:通过学习风格和偏离风格规范来产生“艺术”的创造性对立网络。
  5. 恩格尔、雷斯尼克、罗伯茨、迪耶曼、埃克、西蒙扬和诺鲁齐(2017)。用 WaveNet 自动编码器对音符进行神经音频合成。eprint arXiv:1704.01279。
  6. Hadjeres,g .,Pachet,f .,和 Neilsen,F. (2016 年)。 DeepBach:巴赫合唱曲生成的可控模型。 eprint arXiv:1612.01010。
  7. 黄,陈,李,黄,,王,徐,张,张,张(2016)。 StackGAN:利用堆叠式生成性序列网络进行文本到照片级的图像合成。 eprint arXiv:1612.03242。
  8. 团队,D. D. (2017 年 9 月 22 日至 25 日)。电子邮件。(c .卡拉希基,采访者)

在人工智能接管我们的工作之前,它会组织我们的工作。

原文:https://towardsdatascience.com/before-artificial-intelligence-takes-over-our-jobs-it-will-organize-our-work-7de8f2bac24d?source=collection_archive---------1-----------------------

用不了多久,人工智能就能比人类更好地预测项目的成功。

2012 年 5 月,离正式日期还有 4 周,柏林新国际机场的启用被宣布将再推迟几周。几周变成了几个月,几个月变成了几年。对其实际开放的最新预测是 2018 年底。

项目的计划进度和实际进度之间存在巨大的不匹配。

当一个项目像柏林机场一样被戏剧性地延迟时,这显然是一个以上问题的结果。然而,这个大型项目分享了许多项目延迟或失败的大多数常见原因:沟通不畅、不切实际的时间估计和政治游戏,这些甚至可能超过最精心的规划和过程。

新技术为重新思考项目管理奠定了基础。

几年前在科技公司开始的事情现在正在冲击主流业务:聊天取代电子邮件。WhatsApp、微信和 Messenger 向普通公民介绍了即时通讯的优势。它们为 Slack 等面向商业的聊天解决方案铺平了道路,Slack 结合了 IRC 等老派聊天应用的强大功能和现代移动通讯应用的易用性。Slack 正在被初创公司广泛采用,微软现在正在将其等效的 Teams 应用程序推向更保守的市场。

这个新时代的到来也为项目管理软件开辟了新的可能性:加上目前在机器学习方面取得的进步,新的聊天技术为项目管理人工智能的发展奠定了基础。

这一切都始于范式的转变。

在这场定义新标准的竞赛中,候选人之一是一款名为工作流的 Slack 应用。这是第一款完全基于 Slack 聊天基础设施的项目管理软件。传统的项目管理软件被设计成所有计划和沟通的中心,而工作流团队采取了不同的方法:他们将公司现有的沟通渠道视为工作协调的真正中心。流程和工具必须包含这些渠道,因此要嵌入其中。Workstreams 的产品经理 Christian Bick 指出了这种范式转变如此重要的原因:

为了做出准确的预测并给出有意义的见解,软件必须成为我们交流渠道的积极参与者。这样,it 可以了解团队成员和项目合作伙伴之间的信息流动。

AI 会首先改善我们的沟通,然后纠正我们的乐观主义倾向。

这是有道理的:没有人能够跟踪一个项目中交换的所有信息。然而,计算机是监控通信的大师,在未来,这正是他们要做的。机器还没有必要达到人类的理解水平;重要的是知道谁在什么时候分享信息,分享什么主题的信息。这些知识已经足以在合作者之间的沟通不畅发展成昂贵的问题之前识别出它。人工智能不仅会检测这类问题,还会提出解决问题的措施。

人工智能将负责对项目进度做出更准确的估计。对项目信息流进行建模可用于项目的特征描述和分类。为了做出精确的预测,人工智能需要从成千上万的参考项目中学习。这些项目中的沟通结构将在人工智能的训练中发挥主导作用。

房间里有一头大象!就在那里!

即使人工智能与我们的数字对话相结合,它仍然会错过我们作为人类的主要交流方式。如果不是大部分的话,很多重要的信息交流是在离线的面对面的会议中进行的。工作流团队提出了一个简单的策略来解决这个问题:

人工智能不需要亲自出席会议来了解已经交换的信息。它真正需要知道的是会议召开了,谁参加了会议。随着数字日历已经成为标准,这是微不足道的。

关于会议时间和参与者的信息已经在网上发布了。如果会议的议程和结果没有以数字方式发布,那么人工智能无论如何都会引起注意,因为它负责确保信息共享。无论如何,由于最近在录音和识别方面的创新,计算机已经开始被整合到物理会议中。

欢迎你的新团队成员——这不完全是约翰·克立斯

那么,当这一愿景成为现实时,经理们会担心自己的工作吗?尽管计算机在生成预测和见解方面将比人类更好,但有一样东西是人工智能在很长一段时间内都不会具备的:理解人类关系独特性的能力。评估人工智能的发现,并把这些建议放到一个更大的背景下,仍然是团队和经理的责任。工作流团队考虑的是劳动力的分配:

我们的目标是为今天的团队增加一名有价值的成员——一名在沟通和评估方面具有独特技能的成员。不过,不要指望你的新伴侣会过于有创造力和风趣。那是人类的工作。也是最重要的一个。

How things might soon look.

目前,所有这一切都只是一个愿景。工作流团队仍然忙于做好基础工作。今天看起来很奇特的任务管理应用程序可能很快会变成项目管理的一场革命。

Workstreams current Slack integration and web interface

柏林机场还有希望。

智能软件已经存在,并将越来越多地出现在日常生活中。自动驾驶汽车已经在我们家门口了。迟早,同样的技术会集成到我们的数字协作工具集中,并增强我们的工具集。这些进步绝对值得关注。尤其是当你计划去柏林旅行的时候。

新手问“人工神经网络要用多少个隐层/神经元?”

原文:https://towardsdatascience.com/beginners-ask-how-many-hidden-layers-neurons-to-use-in-artificial-neural-networks-51466afa0d3e?source=collection_archive---------1-----------------------

人工神经网络(ann)的初学者很可能会问一些问题。这些问题包括使用多少个隐藏层?每个隐藏层有多少个隐藏神经元?使用隐藏层/神经元的目的是什么?增加隐藏层/神经元的数量总是能得到更好的结果吗?我很高兴地告诉大家,我们可以回答这样的问题。明确地说,如果要解决的问题很复杂,回答它们可能会太复杂。到本文结束时,您至少可以了解这些问题是如何回答的,并能够根据简单的例子进行自我测试。

介绍

ANN 的灵感来自于生物神经网络。为简单起见,在计算机科学中,它被表示为一组层。这些层分为三类,即输入层、隐藏层和输出层。

知道输入和输出层的数量及其神经元的数量是最容易的部分。每个网络都有一个输入层和一个输出层。输入层中神经元的数量等于正在处理的数据中输入变量的数量。输出层中神经元的数量等于与每个输入相关联的输出的数量。但是挑战在于知道隐藏层及其神经元的数量。

以下是了解分类问题中隐藏层和每个隐藏层的神经元数量的一些准则:

  1. 根据这些数据,画出一个预期的决策边界来分隔这些类。
  2. 将决策边界表示为一组线。请注意,这些线的组合必须服从决策边界。
  3. 选定线的数量表示第一个隐藏层中隐藏神经元的数量。
  4. 为了连接由前一层创建的线,添加了一个新的隐藏层。请注意,每次需要在前一个隐藏层中的线条之间创建连接时,都会添加一个新的隐藏层。
  5. 每个新隐藏层中隐藏神经元的数量等于要建立的连接的数量。

为了让事情更清楚,让我们将前面的指导方针应用到一些例子中。

示例 1

让我们从一个简单的两类分类问题的例子开始,如图 1 所示。每个样本有两个输入和一个表示类标签的输出。这与异或问题非常相似。

Figure 1

要回答的第一个问题是是否需要隐藏层。确定是否需要隐藏层的规则如下:

在人工神经网络中,当且仅当数据必须非线性分离时,才需要隐藏层。

查看图 2,似乎这些类必须是非线性分离的。单行不行。因此,我们必须使用隐藏层,以获得最佳决策边界。在这种情况下,我们可能仍然不使用隐藏层,但这将影响分类精度。所以,最好使用隐藏层。

为了添加隐藏层,我们需要回答以下两个问题:

  1. 所需的隐藏层数是多少?
  2. 每个隐藏层中隐藏神经元的数量是多少?

按照前面的过程,第一步是绘制划分两个类的决策边界。如图 2 所示,有不止一个可能的决策边界可以正确分割数据。我们将用于进一步讨论的是图 2(a)。

Figure 2

按照指导方针,下一步是用一组线来表达决策边界。

使用一组线来表示决策边界的想法来自于这样一个事实,即任何人工神经网络都是使用单层感知器作为构建块来构建的。单层感知器是一个线性分类器,它使用根据以下等式创建的线来分离类别:

y = w1 * x1+w2 * x2+⋯+w1 * x1+b

其中 x_i 为输入, w_i 为其权重, b 为偏置, y 为输出。因为每增加一个隐藏神经元都会增加权值的数量,因此建议使用最少数量的隐藏神经元来完成任务。使用比所需更多的隐藏神经元将增加更多的复杂性。

回到我们的例子,说 ANN 是使用多个感知器网络构建的,等同于说网络是使用多条线构建的。

在这个例子中,判定边界由一组线代替。这些线从边界曲线改变方向的点开始。在这一点上,放置了两条线,每一条都在不同的方向上。

因为边界曲线只有一个点改变方向,如图 3 中灰色圆圈所示,所以只需要两条线。换句话说,有两个单层感知器网络。每个感知器产生一条线。

Figure 3

知道只需要两条线来表示决策边界告诉我们,第一个隐藏层将有两个隐藏神经元。

到目前为止,我们有一个带有两个隐藏神经元的隐藏层。每个隐藏神经元可以被视为线性分类器,如图 3 中的线所示。将有两个输出,一个来自每个分类器(即隐藏神经元)。但是我们要构建一个单一的分类器,用一个输出表示类标签,而不是两个分类器。结果,两个隐藏神经元的输出将被合并成单个输出。换句话说,这两条线将由另一个神经元连接。结果如图 4 所示。

幸运的是,我们不需要添加另一个具有单个神经元的隐藏层来完成这项工作。输出层神经元将完成这项任务。这种神经元将合并先前生成的两条线,使得网络只有一个输出。

Figure 4

知道了隐藏层及其神经元的数量后,网络架构就完成了,如图 5 所示。

Figure 5

示例 2

另一个分类示例如图 6 所示。它类似于前面的例子,其中有两个类,每个样本有两个输入和一个输出。区别在于决策边界。这个例子的边界比上一个更复杂。

Figure 6

根据指南,第一步是绘制图 7(a)所示的决策边界。

下一步是将决策边界分割成一组线,其中每条线将被建模为人工神经网络中的感知器。在画线之前,应如图 7(b)所示标出边界改变方向的点。

Figure 7

问题是需要多少行?每个顶点和底点将有两条线与之相关联,总共四条线。中间点的两条线将与其他点共享。要创建的行如图 8 所示。

因为第一隐藏层将具有与行数相等的隐藏层神经元,所以第一隐藏层将具有四个神经元。换句话说,有四个分类器,每个都由一个单层感知器创建。目前,网络将产生四个输出,每个分类器一个。下一步是将这些分类器连接在一起,以使网络只生成一个输出。换句话说,这些线将通过其他隐藏层连接在一起,以生成一条曲线。

Figure 8

由模型设计者来选择网络的布局。一种可行的网络架构是建立具有两个隐藏神经元的第二隐藏层。第一个隐藏神经元将连接前两条线,最后一个隐藏神经元将连接后两条线。第二个隐藏层的结果。第二层的结果如图 9 所示。

Figure 9

至此,有两条分离的曲线。因此,网络有两个输出。下一步是将这些曲线连接在一起,以便整个网络只有一个输出。在这种情况下,输出层神经元可以用于进行最终连接,而不是添加新的隐藏层。最终结果如图 10 所示。

Figure 10

网络设计完成后,完整的网络架构如图 11 所示。

Figure 11

欲了解更多信息,

深度学习+用人工神经网络解异或简介

slide share:https://www . slide share . net/AhmedGadFCIT/brief-introduction-to-deep-learning-solution-xor-using-ANNs

YouTube:https://www.youtube.com/watch?v=EjWDFt-2n9k

卷积神经网络初学者指南

原文:https://towardsdatascience.com/beginners-guide-for-convolutional-neural-network-cnn-convnets-5a5e725ea581?source=collection_archive---------16-----------------------

到现在为止,你可能知道机器学习,这是计算机科学的一个分支,研究可以学习的算法的设计。深度学习是机器学习的一个子领域,它受到人工神经网络的启发,而人工神经网络又受到生物神经网络的启发。卷积神经网络非常类似于具有可学习权重和偏差的普通神经网络。在神经网络中,卷积神经网络主要应用于图像识别、图像分类、物体检测、人脸识别等。

卷积是什么意思?

卷积来自拉丁语 convolvere,“to convolve”的意思是卷在一起。卷积是对两个函数(f 和 g)进行数学运算,以构造第三个函数,该函数表示一个函数的形状如何被另一个函数修改。它是计算两个函数重叠程度的积分。假设卷积是通过将两个函数相乘来组合它们的一种方式。

"绿色曲线显示蓝色和红色曲线的卷积,作为 t 的函数,垂直绿线表示位置。灰色区域表示作为 t 的函数的如下所示的乘积,因此它作为 t 的函数的面积正好是卷积。”

如果用 CNN 的话,对输入图像进行的操作是特征检测器/内核/过滤器和特征映射。

我们的大脑是如何对一幅图像进行分类的!

每当我们看到一幅图像,我们的大脑就会寻找图像中的特征来对图像进行分类。我们通过识别特征来对事物进行分类。为了证明这一点,这里有两个图像,我们将分类:

A two-faced man!

在上面的图像中,如果我们看向图像的右侧,我们会看到一个人朝右侧看,而如果我们看向中间,我们会感觉到那个人正朝我们看。

我们的大脑在识别这些不同的场景时会不会很挣扎,会不会对这个人是向右看还是朝我们看感到困惑?
发生这种情况是因为我们的大脑研究图像中的特征,然后假设应该采取什么。

考虑另一个图像:

A young girl or an old lady?

上图描绘了一个小女孩看着别处,一个老太太头上戴着围巾向下看。迷茫?图像是为了迷惑你而创建的!

如果特征不清晰,像这样呢?

Dazzling face!

我们是不是有点眼花缭乱?你的大脑能够决定什么是正确的吗?
不!这是因为描述的特征不足以帮助大脑对它们进行分类。

所有上述图像都是为了理解我们的大脑根据它所看到的图像的特征来运作,然后对其进行相应的分类。

神经网络以类似的方式工作。我们可以在下图中看到,神经网络已经成功地将猎豹和子弹列车分类,但在预测手玻璃方面却不成功。这是因为图像中的特征不清楚。

简而言之,神经网络的工作方式与人类思维完全一样。

计算机是如何看到图像的?

How computer sees an image!

众所周知,图像是像素的矩阵。如果有一个黑白图像,那么我们将得到一个 2D 阵列。然而,如果我们传递一个彩色图像,那么我们将得到一个 3D 数组,这意味着它有一个额外的深度参数,即 RGB 通道,如下所示。像素值介于 0 和 255 之间,图像以字节(0 到 255)存储。

How images are converted in arrays!

总结:

我们已经讨论了什么是 CNN,以及如何根据图像中的特征对图像进行解释和分类。细胞神经网络在图像和视频识别、推荐系统和自然语言处理中有着广泛的应用。

在下一篇博客中,你会发现关于卷积运算和 ReLU 层的概念。在那之前,继续学习。

如果您有任何疑问或建议,可以在下面留言:)

参考资料:

  1. https://skymind.ai/wiki/convolutional-network#tensors
  2. http://mathworld.wolfram.com/Convolution.html
  3. https://medium . com/@ RaghavPrabhu/understanding-of-convolutionary-neural-network-CNN-deep-learning-99760835 f148
  4. https://medium . com/technology made easy/the-best-explain-of-convolutionary-neural-networks-on-the-internet-fbb 8 B1 ad 5d F8

数据科学入门指南— Python + Docker

原文:https://towardsdatascience.com/beginners-guide-to-data-science-python-docker-3181fd321a5c?source=collection_archive---------5-----------------------

每样都来一点

范围

我最近发现了安舒尔·巴吉上映的公告

[## 人工智能教育全球黑客周:7 月 28 日至 8 月 4 日

你的开源人工智能项目将获得 17,000 美元的奖金

medium.com](https://medium.com/opened-ai/ai-for-education-global-hackweek-7edc7db87d4f)

尽管我不知道 S#!关于机器学习,我注册了,希望学习,并希望建立一个有用的工具。嗯,老实说,注册的好处(AWS 积分、Bluemix 积分等)也很吸引人。

所以这是我的尝试,从新手开始,慢慢走向机器学习中令人满意的水平,并根据我的研究和我觉得对我这样的初学者有趣和有用的话题,发表更多的故事。

那么到底什么是机器学习呢?

让计算机在没有明确编程的情况下运行。

就是这样!现在你只需要知道这些。

数据科学

你知道 Amazon.com 是怎么提出建议的。它知道你需要一双新袜子,甚至在你真正需要它们之前。这一切都是通过数据来完成的——你的数据,我的数据,所有这些数据。它会根据搜索查询,或者过去的购买记录,或者躲在橱窗后面列出你所有的对话,来预测你下一件想买的东西。

简而言之,数据科学是一种分析、处理大块数据并将其转换为信息的科学,这样就可以用它来预测你想要购买的下一件东西。也适用于教育、医疗、时尚等领域。

在第一个示例中,我们将获取一个水果度量(如大小、重量、质地)的样本数据集,标记为苹果和橙子。然后,我们可以使用 scikit-learn 的决策树(一个满足所有机器学习需求的糟糕模块)预测给定的一组新水果指标的水果。

第一次提交

码头工人

一个可怕的工具,你应该昨天就学会了。

说真的,Docker 让开发环境的建立变得轻而易举。我倾向于在装有不同操作系统的不同机器上工作,安装了 Docker 就没有必要担心依赖性。

步骤:

  1. 安装对接器
  2. 创建 Dockerfile(在名为“MyCatKnowEverything”的新文件夹中名为“Dockerfile”的文件)— Dockerfile 是一个文本文件,包含自动构建给定图像所需的所有命令。在这里是 python。
# Use an official Python runtime as a parent image
FROM python:3.6-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

3.Create requirements.txt —包含 python 模块,与 Docker 无关。在 Dockerfile 内部调用。

numpy
scipy
scikit-learn

Python

在文件夹 MyCatKnowEverything 中创建一个名为“app.py”的文件

from sklearn import tree#DataSet
#[size,weight,texture]
X = [[181, 80, 44], [177, 70, 43], [160, 60, 38], [154, 54, 37],[166, 65, 40],
     [190, 90, 47], [175, 64, 39],
     [177, 70, 40], [159, 55, 37], [171, 75, 42], [181, 85, 43]]

Y = ['apple', 'apple', 'orange', 'orange', 'apple', 'apple', 'orange', 'orange',
     'orange', 'apple', 'apple']

#classifier - DecisionTreeClassifier
clf_tree = tree.DecisionTreeClassifier();
clf_tree = clf_tree.fit(X,Y);

#test_data
test_data = [[190,70,42],[172,64,39],[182,80,42]];

#prediction
prediction_tree = clf_tree.predict(test_data);

print("Prediction of DecisionTreeClassifier:",prediction_tree);

我不打算浏览代码,因为它是 Python 而不是 Java。

Directory Structure

5.运行docker build-t。| example- docker build -t 这很简单。(不要忘记“.”)

6.运行 docker 运行< tag_name > | 示例——docker 运行 this_is_easy

Output — see them apples there

不要被庞大的 docker run 命令吓到。“rm”在完成执行后删除容器,“name”只是给容器命名,“v”是用容器挂载一个卷。更多关于这个这里

这里有几个 docker 命令,可以让你动起来

https://docs.docker.com/get-started/part2/#recap-and-cheat-sheet-optional

我们完了。我们刚刚使用 Docker 创建了我们的第一个 Python 数据科学程序。

源代码:

[## a shish-y/Docker _ Python _ data science

用 docker + python + SciKit-learn 进行一些数据科学测试

github.com](https://github.com/ashish-y/Docker_Python_DataScience/blob/master/README.md)

觉得这篇文章有帮助?别忘了推荐分享:)

从自动驾驶汽车开始我的旅程

原文:https://towardsdatascience.com/beginning-my-journey-in-self-driving-car-udacity-nano-degree-a39d898658a2?source=collection_archive---------0-----------------------

在开始我的 SDC 纳米学位之旅之前,给你一点我自己的背景,我是 SDC 纳米学位的学生(2016 年 12 月队列)。我在机器学习、深度学习和 web 应用程序开发方面有大约 5 年以上的经验。我总是对技术充满热情,对其积极的进步充满好奇。随着交通行业经历一场革命(从化石燃料转向电动和自动驾驶),人工智能正在发挥重要作用,我真的很有兴趣成为这场革命的一部分。而我的旅程是从 Udacity 的自动驾驶汽车纳米学位课程开始的。

那么,我为什么选择这门课呢?正如我之前提到的,我已经在从事机器学习和深度学习,但是我没有对端到端系统(即硬件、软件和环境)有一个整体的想法。然后我就把这个课程的内容过了一遍,真的是在履行我的要求。

让我们从我的项目经历开始吧。

项目-1 车道检测

Lane detection using opencv

经历:

这是 SDC 纳米学位的第一个项目。在这里,我们将让汽车学习在道路上向何处行驶。我们必须找到道路上的车道线,使汽车安全行驶。这个项目是用 python 和 opencv 实现的。

在车道线检测期间,我在这个项目中面临的挑战如下:

  1. 不同道路的车道线颜色不同
  2. 线路并不总是完全连接的
  3. 线条的曲率在不同的条件下也不同
  4. 在许多情况下,道路的照明条件也会发生变化

外卖:

  1. 使用 opencv 学习并实现了不同的计算机视觉技术
  2. 对图像应用不同的颜色变换
  3. 应用 canny 边缘检测算法寻找边缘
  4. 利用霍夫变换从 Canny 边缘检测直线

项目-2 使用深度学习的交通标志分类

Deep Convolutional Neural Network Architecture for Traffic sign Classification

体验:

这个是第一学期的第一个深度学习项目。因为我已经进入了深度学习,所以对深入研究这个项目感到非常兴奋。我的网络由两个卷积层和两个全连接层组成。深度神经网络需要大量的训练数据和大量的参数调整。因此,训练一个深度神经网络更像是艺术而不是科学/工程。经过几次实验,我终于冻结了我的网络。

我对这个项目的观察和收获如下:

  1. 首先,我尝试了一个深度神经网络(没有卷积),它在一定程度上起作用,但不是实时场景。
  2. 当汽车在非常复杂的环境中行驶在道路上时,所有的交通标志都不是清晰可见的。有时它们被遮挡或者能见度不清等等..
  3. 在这种情况下,为了处理遮挡、平移变化和部分可见性,简单的深度神经网络不够健壮。
  4. 卷积层来了。卷积层相对于其他层的优势是参数共享。当滤波器在图像上卷积时,它试图捕捉图像的所有可能的特征。这有助于通过每层中不同的过滤器组来学习图像的所有不同特征。这带来了特征学习和分类的鲁棒性。
  5. 学习速率和正则化对学习也有重要作用。学习速率的衰减和对正确层的权重的调整提高了模型的性能。同样,这是一门艺术,在可视化每一层的输出后,微调你的学习率和正规化。

项目-3 使用深度学习的行为克隆

经历:

这是深度学习的第二个也是最后一个项目,目标是在赛道上安全驾驶汽车(预测转向角)。我真的很享受在这个项目中度过的时光。从很多方面来说,这都是一次很棒的理论和实践学习经历。分享详情如下:

  1. 数据收集是任何深度学习任务中最重要的任务之一。使用模拟器收集数据很有趣。然而,这是一项耗时的任务,因为深度神经网络是贪吃的。Udacity 通过发布这个项目的 dataset 成为了救世主。
  2. 学习 keras 让我的生活变得轻松,因为它去掉了锅炉板代码。Keras 是在 Theano 和 Tensoflow 之上的高级深度学习框架。在 keras 中开发一个深度神经网络真的很容易,因为它简单而抽象。
  3. 数据扩充在为模型带来变化以及模型性能的稳健性方面具有重要作用。我学到了许多不同的数据增强技术及其在训练模型中的重要性。很少经常使用的是剪切,裁剪,翻转和改变亮度。
  4. 迁移学习确实推动了人工智能的快速发展。我更愿意强调迁移学习是培训的第一阶段,在实际培训开始之前,我们将已经学到的特性引入到我们的模型中。
  5. 我的网络灵感来自英伟达论文http://images . NVIDIA . com/content/tegra/automotive/images/2016/solutions/pdf/end-to-end-dl-using-px . pdf
  6. 选择正确的激活函数对于训练神经网络至关重要。在这里,我选择了 ELU,而不是雷鲁。ELU 激活提供了与 RELU 相同的对消失梯度的保护,此外,ELU 具有负值,这允许它们将平均激活推向更接近零,从而提高梯度下降的效率。
  7. 辍学。不要小看这个。我在这里的直觉是,辍学可能并不适合回归问题中的每一层。在分类问题中,我们只关心相对于另一个类的软最大概率,所以即使丢失影响了最终值,也没有关系,因为我们只关心相对于其他类的值。对于回归,我们关心最终值,所以退出可能会有负面影响。为了避免这种困境,我在全连接层中选择了 l2 正则化。

我的行为克隆体验真的很令人满意。

项目-4 超前车道检测

Lane detection using opencv

经历:

这是第一学期的第四个项目。这里我们使用 opencv 来寻找车道。在这个项目中,有机会学习许多使用 opencv 的计算机视觉技术。

  1. 失真校正对于在图像中找到正确形状和外观的对象具有重要作用。
  2. 正在实施摄像机标定和畸变校正,以使物体的几何形状一致。
  3. 透视变换为我们提供了一种自上而下查看所有曲率的方法。
  4. 其他技术,如梯度大小和梯度方向的梯度阈值也是这个项目的一个收获。
  5. 不同的颜色空间和颜色阈值具有梯度,具有在图像中找到对象的作用。
  6. 滑动窗口搜索来找到图像中的对象是我的另一个收获。

然而,我对这个项目的体验并不那么令人满意。我未来的工作范围将涉及使用深度学习来实现相同的项目。

项目-5 车辆检测与跟踪

vehicle detection using svm and opencv

体验:

这是第一学期的最后一个项目。这个项目的目标是使用 HOG 和支持向量机结合滑动窗口搜索来检测车辆。虽然我已经用上面的方法实现了这一点,但我对实现的健壮性并不满意。

我肯定会选择车辆检测的深度学习方法。许多先进的架构,如 fast-rcnn、YOLO、SSD,在各个方面都优于其他传统的对象检测方法。

致谢:

我要感谢 udacity 的所有相关人员。我还要感谢 Shreyas Gite (导师) Vivek YadavDhruv ParthasarathyOliver CameronDavid Silver 以及其他许多人的真知灼见,帮助我完成了 SDC 大学第一学期的课程。

保持饥饿,保持愚蠢..

史蒂夫·乔布斯

对于代码库和其他查询,请通过下面的链接联系我。

[## ashispapu (Ashis Samal)

ashispapu 有 288 个存储库。在 GitHub 上关注他们的代码。

github.com](https://github.com/ashispapu/) [## Ashis Samal | LinkedIn

用人工智能构建下一代产品

www.linkedin.com](https://www.linkedin.com/in/ashissamal/) [## Ashis Samal (@ashis_samal) |推特

Ashis Samal 的最新推文(@ashis_samal)。想象,通过…为社会的积极变化而努力

twitter.com](https://twitter.com/ashis_samal)

为第二学期做好准备:)

开始走数据科学之路(上) :熊猫系列

原文:https://towardsdatascience.com/beginning-to-walk-the-data-science-road-part-1-pandas-series-920e2237c336?source=collection_archive---------10-----------------------

Photo by Jordan Rowland on Unsplash

既然我们已经迈出了数据科学的第一步,

[## Python 数据科学的第一步— NumPy

我读到过学习的最好方法是写博客。因为我学习数据科学已经有一段时间了…

towardsdatascience.com](/first-step-in-data-science-with-python-numpy-5e99d6821953)

让我们继续沿着这条路走下去,探索周围的世界。在本帖中,我们将寻求解决更多的问题,这次使用的是熊猫。这将是一个两部分的系列,有趣的是,第一部分是关于系列

熊猫?

Photo by Damian Patkowski on Unsplash

不,不是动物。虽然刚开始学的时候真的以为是以动物命名的。这并不奇怪,因为这种语言本身就是以一种蛇命名的。也许 Python 生态系统只是对动物有一种爱。后来我才知道,这种语言实际上是以巨蟒剧团的命名的,熊猫与功夫熊猫没有任何关系。尽管一旦你掌握了熊猫,你就可以在数据科学方面下功夫。

当我知道熊猫实际上是“盘”的意思时,我明白了很多。因为这就是我们在熊猫身上遇到的一切。我们有一些以表格结构排列的数据,我们使用不同的方法和属性来分析这些数据。如果你熟悉结构化查询语言(SQL),你会发现数据的组织方式有很多相似之处。如果没有,也不用担心。只是按行和列排列的数据。

根据文档,pandas 是一个 Python 包,它提供了快速、灵活和富有表现力的数据结构,旨在使处理“关系”或“标签”数据变得既简单又直观。Pandas 有两个主要的数据结构——一维的系列和二维的数据帧。在这一部分中,我们将查看系列,然后在下一部分中以此为基础来理解数据框架。

让我们编码

你可以在下面的链接中找到这篇文章的完整代码。

[## bajracharya-kshi tij/熊猫

GitHub 是人们构建软件的地方。超过 2800 万人使用 GitHub 来发现、分享和贡献超过…

github.com](https://github.com/bajracharya-kshitij/pandas)

代码使用 Python3 和安装了 anaconda 的熊猫。见此处如何安装熊猫。

像往常一样,第一步是导入我们将要使用的包。所以,还是进口熊猫吧。

import pandas as pd

这里 pd 是 pandas 的别名,今后将用于访问 pandas 包中的方法和属性。

问题出在哪里?

随着 pandas 的安装和导入,我们已经准备好正式定义我们要在这里解决的问题。

问题

给你 5 个人的身高(英寸)和体重(磅),如下表所示:

+--------+--------------+-------------+
| Person | Height(inch) | Weight(lbs) |
+--------+--------------+-------------+
| A      |           72 |         186 |
| B      |           69 |         205 |
| C      |           70 |         201 |
| D      |           62 |         125 |
| E      |           57 |          89 |
+--------+--------------+-------------+

后来发现,该表实际上遗漏了人 F 和 G 的条目,他们的身高分别是 65 英寸和 60 英寸,F 的体重是 121 磅,但是遗漏了 G 的体重数据。此外,发现所有高度的值都比它应有的值小 5 英寸,而所有重量的值都比它应有的值大 5 磅。如果可能的话,为每个人找到正确的体重指数(身体质量指数)。

解决办法

首先,我们从上表中创建一个身高的字典。字典的关键字是人名,值是相应的身高条目。

height_dictionary = {'A': 72, 'B': 69, 'C': 70, 'D': 62, 'E': 57}

现在,我们可以使用这个字典生成一个熊猫系列。

height_series = pd.Series(height_dictionary)

如果您现在打印height_series,您将看到以下内容。

A    72
B    69
C    70
D    62
E    57
dtype: int64

该系列只是采用字典,并将键设置为索引,将值设置为相应的数据点。它与 NumPy 非常相似,因为我们可以使用整数索引来访问数据点。例如,如果我们打印height_series[1],它将打印出69。但是 pandas 带来的好处是,现在我们也可以使用我们的自定义索引来访问数据点。所以,使用height['B']也会生成相同的数字69

熊猫和 NumPy 关系密切,当我们和熊猫一起工作时,我们会经常看到 NumPy 的用法。接下来,让我们使用 NumPy 数组为权重创建一个熊猫系列。在此之前,我们需要导入 NumPy。

import numpy as np

当使用字典创建一个序列时,我们可以只传递一个参数,因为索引和数据点都是可用的。但是,为了使用 NumPy 数组创建序列,我们需要两个单独的数组——一个用于索引,另一个用于数据点。让我们创建这些数组。

weight_data = np.array([186, 205, 201, 125, 89])
weight_label = np.array(['A','B','C','D','E'])

接下来,我们提供这两个数组作为创建熊猫系列的参数。

weight_series = pd.Series(data=weight_data, index=weight_label)

weight_series现在看起来如下:

A    186
B    205
C    201
D    125
E     89
dtype: int64

身高体重系列准备好了。但是现在我们发现表中缺少了一些数据。因此,我们为这些缺失的数据创建另一个系列。首先,我们将为缺失的高度创建一个系列。

missing_height = pd.Series([65,60],['F','G'])

这里,我们省略了数据和索引的显式定义,因为我们以默认顺序提供参数。此外,我们传递一个简单的 Python 列表,而不是 NumPy 数组,它也工作得很好。

missing_height现在看起来如下:

F    65
G    60
dtype: int64

现在,我们对丢失的重量做同样的处理。这一次我们将改变索引和数据的顺序。为此,我们需要在参数中显式定义索引和数据,否则F将被视为数据而121将被视为索引。

missing_weight = pd.Series(index=['F'],data=[121])

这导致missing_weight等于

F    121 
dtype: int64

在这一点上,我们有四个系列,但这不是我们想要的。我们创造后两个系列只是因为我们之前错过了。我们真正想要的只是两个系列——一个是身高系列,一个是体重系列。所以,让我们继续把丢失的值添加到原始序列中。

updated_height_series = height_series.append(missing_height)
updated_weight_series = weight_series.append(missing_weight)

现在,我们有了updated_height_series的完整数据:

A    72
B    69
C    70
D    62
E    57
F    65
G    60
dtype: int64

并且updated_weight_series为:

A    186
B    205
C    201
D    125
E     89
F    121
dtype: int64

最后,我们只需要两个系列。但是现在我们发现这个系列的数据仍然是不正确的。这些人的身高被发现比正常情况下少了 5 磅,体重被发现比正常情况下多了 5 磅。让我们用correction_series来纠正这一点。在这里,我们为 7 个人创建了一个包含 7 个条目的序列,其中每个条目都是 5。我们将使用 NumPy 的ones方法来完成这项工作。

correction_series = pd.Series(5*np.ones(7),index=['A','B','C','D','E','F','G'])

你本来也可以做5+np.zeros(7)。无论如何,我们现在有了一个如下所示的修正系列:

A    5.0
B    5.0
C    5.0
D    5.0
E    5.0
F    5.0
G    5.0
dtype: float64

最后,我们可以用这个修正系列来修正这两个系列。

corrected_height_series = updated_height_series + correction_series
corrected_weight_series = updated_weight_series - correction_series

我们现在有了corrected_height_series作为:

A    77.0
B    74.0
C    75.0
D    67.0
E    62.0
F    70.0
G    65.0
dtype: float64

corrected_weight_series为:

A    181.0
B    200.0
C    196.0
D    120.0
E     84.0
F    116.0
G      NaN
dtype: float64

注意,添加correction_series后,系列的数据类型从int64变为float64,因为correction_series创建了一个类型为float64的系列。还要注意,对于corrected_weight_seriesG的值不是数字NaN。这是因为原始的updated_weight_series不包含G的条目。因此,当我们试图从一个不存在的值中减去 5 时,我们得到了一个NaN

由于 G 的重量是不可得的,我们不能计算 G 的身体质量指数。因此,让我们从corrected_height_seriescorrected_weight_series中删除 G 的条目。

要从corrected_height_series中移除 G 的条目,我们可以使用索引来删除该条目。

corrected_height_series.drop(['G'])

我们可以传递一个索引列表作为参数来删除想要的条目。但是,如果我们现在检查corrected_height_series,我们将会看到什么都没有改变。

A    77.0
B    74.0
C    75.0
D    67.0
E    62.0
F    70.0
G    65.0
dtype: float64

pandas 这样做是为了避免数据意外丢失。为了使放置永久化,我们需要在drop方法中指定另一个参数。这个参数叫做inplace,必须设置为True。在熊猫身上,inplace的说法被用在许多方法中。让我们继续下去,使下降永久化。

corrected_height_series.drop(['G'],inplace=True)

现在,当我们检查原始序列corrected_height_series时,G 的条目将被删除。

A    77.0
B    74.0
C    75.0
D    67.0
E    62.0
F    70.0
dtype: float64

对于重量的情况,G 的重量是不可得的。为了删除 G 的条目,我们可以简单地使用dropna方法。使用上述drop方法删除所选的指数及其数值。dropna删除数据点不可用的所有指数。同样,我们需要指定inplace=True,否则 drop 不会反映在原系列中。

corrected_weight_series.dropna(inplace=True)

现在我们有了corrected_weight_series作为:

A    181.0
B    200.0
C    196.0
D    120.0
E     84.0
F    116.0
dtype: float64

最后,我们在两个系列中都有了想要的值。现在,是时候计算体重指数了。计算身体质量指数的公式如下:

我们看到我们需要以千克为单位的重量和以米为单位的高度。但是我们上面的数据是以磅为单位的重量和以英寸为单位的高度。因此,在应用公式之前,我们必须首先进行必要的转换。

我们知道,1 磅= 0.453592 千克,1 英寸= 0.0254 米,我们先用变量来定义这些。

lbs_to_kg_ratio = 0.453592
inch_to_meter_ratio = 0.0254

现在,我们可以使用 NumPy 的multiply方法进行必要的转换。

weights_in_kg = np.multiply(corrected_weight_series,lbs_to_kg_ratio)

那么,weights_in_kg就是:

A    82.100152
B    90.718400
C    88.904032
D    54.431040
E    38.101728
F    52.616672
dtype: float64

同样的,

heights_in_m = np.multiply(corrected_height_series,inch_to_meter_ratio)

导致heights_in_m为:

A    1.9558
B    1.8796
C    1.9050
D    1.7018
E    1.5748
F    1.7780
dtype: float64

最后,我们可以用上面的公式来计算身体质量指数。

BMI = np.divide(weights_in_kg,np.square(heights_in_m))

这样我们得到的BMI系列为:

A    21.463230
B    25.678196
C    24.498049
D    18.794449
E    15.363631
F    16.644083
dtype: float64

你觉得你已经会功夫了吗?等着看另一个熊猫对象——data frame。在第 2 部分中,我们将看看如何使用 DataFrame 解决同样的问题以及其他一些问题。

[## 开始走数据科学之路(下) :熊猫数据框架

在第 1 部分中,我们开始走这条路,一路上,我们遇到了系列。

towardsdatascience.com](/beginning-to-walk-the-data-science-road-part-2-pandas-dataframe-c3e898499d90)

开始走数据科学之路(下) :熊猫数据框架

原文:https://towardsdatascience.com/beginning-to-walk-the-data-science-road-part-2-pandas-dataframe-c3e898499d90?source=collection_archive---------6-----------------------

Photo by Jason Leung on Unsplash

在第 1 部分中,我们开始走这条路,一路上,我们遇到了系列。

[## 开始走数据科学之路(上) :熊猫系列

既然我们已经迈出了数据科学的第一步,

towardsdatascience.com](/beginning-to-walk-the-data-science-road-part-1-pandas-series-920e2237c336)

但是我们的探索还没有结束。在这一部分,我们将看看另一个熊猫对象——data frame。我们将首先解决我们在系列中看到的相同的体重指数问题,然后进入一个稍微复杂一点的问题。

DataFrame 可能是熊猫中最重要也是最常用的对象。数据帧基本上是共享公共索引的一系列数据的集合,这就是我们首先看到系列的原因。数据帧在表格结构中以行和列的形式排列数据。

万一你忘了,让我们重新定义身体质量指数的问题。如果你确实记得,向前跳到解决方案。

问题 1

给你 5 个人的身高(英寸)和体重(磅),如下表所示:

+--------+--------------+-------------+
| Person | Height(inch) | Weight(lbs) |
+--------+--------------+-------------+
| A      |           72 |         186 |
| B      |           69 |         205 |
| C      |           70 |         201 |
| D      |           62 |         125 |
| E      |           57 |          89 |
+--------+--------------+-------------+

后来发现,该表实际上遗漏了人 F 和 G 的条目,他们的身高分别是 65 英寸和 60 英寸,F 的体重是 121 磅,但是遗漏了 G 的体重数据。此外,发现所有高度的值都比它应有的值小 5 英寸,而所有重量的值都比它应有的值大 5 磅。如果可能的话,为每个人找到正确的体重指数(身体质量指数)。

解决方案 1

我们已经看到了使用级数的解决方案。现在,让我们尝试使用 DataFrame 解决相同的问题。同样,您可以在下面的链接中找到完整的代码。

[## bajracharya-kshi tij/熊猫

GitHub 是人们构建软件的地方。超过 2800 万人使用 GitHub 来发现、分享和贡献超过…

github.com](https://github.com/bajracharya-kshitij/pandas)

首先,我们将使用 DataFrames 来表示给定的表。条目(也称为数据点)作为列表传递给数据参数,列名作为字符串列表传递给列参数。我们创建了两个数据框——一个是身高数据框,另一个是体重数据框。

height_df = pd.DataFrame(data=[['A',72],['B',69],['C',70],['D',62],['E',57]], columns=['Person','Height'])
weight_df = pd.DataFrame(data=[['A',186],['B',205],['C',201],['D',125],['E',89]], columns=['Person','Weight'])

接下来,我们检查数据帧的head。Head 通过返回参数中定义的第一个n行数,为我们提供了一个表格示例。在这种情况下,我们将定义n = 3

height_df.head(n=3)

它返回

如果没有将n指定为 head 方法的参数,则返回前 5 行。

weight_df.head()

返回

现在,我们有两个数据帧,但实际上我们只是想要一个来表示给定的表。因此,我们将使用merge方法连接两个数据帧。由于两个数据帧都有公共列 Person ,我们将使用它将它们合并成一个数据帧。

height_weight_df = pd.merge(height_df,weight_df,on='Person')

所以现在我们有height_weight_df作为:

我们可以在这个数据框架上使用describe方法来获得关于平均值、标准差、四分位数和其他的统计信息。

height_weight_df.describe()

返回

我们还可以使用info方法来获得每一列中条目数量及其数据类型的更多细节。

height_weight_df.info()

info方法的结果看起来是这样的:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 0 to 4
Data columns (total 3 columns):
Person    5 non-null object
Height    5 non-null int64
Weight    5 non-null int64
dtypes: int64(2), object(1)
memory usage: 160.0+ bytes

describe方法只显示身高和体重列的细节,而不显示人员列的细节。这是因为 Person 列中的条目属于object类型;它们只是名字,不可能对名字进行统计操作,如均值、标准差和四分位数。这也可以通过info方法来说明,该方法显示身高和体重属于int64类型,而人属于object类型。

实际的计算只针对身高和体重。person 列只使用一个公共索引将一对值绑定在一起。因此,让我们使用set_index方法将 Person 列设置为这个数据帧的索引。set_index接受一个列数组作为参数。

height_weight_df.set_index(['Person'])

但这不会改变原始数据帧中的任何内容。回想一下系列,熊猫不希望你不小心丢失信息。当我们在数据帧上设置新的索引时,我们会丢失现有的索引。当然,此刻索引只是默认的整数。尽管如此,为了使索引永久化,您必须声明您希望这个改变发生在inplace

height_weight_df.set_index(['Person'],inplace=True)

现在,如果我们检查height_weight_df,我们会看到

info方法现在只显示身高和体重列。

<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, A to E
Data columns (total 2 columns):
Height    5 non-null int64
Weight    5 non-null int64
dtypes: int64(2)
memory usage: 120.0+ bytes

我们已经用级数解决了。再解决这个问题有什么意义?

这里的要点是证明 DataFrame 只不过是由公共索引绑定在一起的一组序列。如果你打印出height_weight_df[‘Height’],它返回

Person
A    72
B    69
C    70
D    62
E    57
Name: Height, dtype: int64

这显然是一个系列。如果你打印出height_weight_df[‘Weight’],同样的事情也会发生。这表明身高和体重都是具有共同索引 A 到 e 的序列,这是列所关心的。现在,让我们看看行。如果使用height_weight_df.loc['A']打印出 A 的行,我们得到

Height     72
Weight    186
Name: A, dtype: int64

也是一个系列。所以,A 到 E 也是拥有共同指数身高和体重的系列。我们可以使用type(height_weight_df[‘Height’])type(height_weight_df.loc[‘A’])来查看这两者的类型。这两个人都回到了pandas.core.series.Series

现在我们清楚了数据帧是由系列组成的,让我们回到我们的问题。我们现在意识到 F 和 G 的身高和体重从表格中消失了。因此,我们为丢失的值创建另一个数据帧。

missing_df = pd.DataFrame(data=[[65,121],[60]],index=['F','G'],columns=['Height','Weight'])

missing_df现在看起来是这样的

这里我们看到 G 的权重丢失了,所以取而代之的是一个NaN值。接下来,为了获得单个数据帧,我们将这个missing_df附加到原始的height_weight_df中,

updated_df = height_weight_df.append(missing_df)

这样updated_df就变成了

同样,我们发现每个人的身高减少了 5,体重增加了 5。所以,让我们修改一下。

updated_df['Height'] += 5
updated_df['Weight'] -= 5

这就把我们的updated_df改成了

所有人的身高和体重已被正确更新,并可进一步用于计算身体质量指数。但是由于 G 的重量丢失,不可能计算出 G 的身体质量指数,所以我们把 G 的条目一起去掉。同样,我们需要指定inplace=True来使其永久化。

updated_df.dropna(inplace=True)

然后移除 G 的条目。

既然我们已经正确地得到了所有的值,那么是时候找到身体质量指数了。我们已经知道,计算身体质量指数的公式如下:

要应用上述公式,首先必须将体重从磅转换为千克,将身高从英寸转换为米。我们知道,1 磅= 0.453592 千克,1 英寸= 0.0254 米,我们用变量来定义这些。

lbs_to_kg_ratio = 0.453592
inch_to_meter_ratio = 0.0254

使用上述比率,我们将数据框更新为所需的单位。

updated_df['Height'] *= inch_to_meter_ratio
updated_df['Weight'] *= lbs_to_kg_ratio

我们现在有updated_df作为

现在我们已经有了正确单位的所有数据,我们可以使用上面的公式来计算身体质量指数。我们将一个新列BMI添加到现有的数据帧中

updated_df['BMI'] = updated_df['Weight']/(updated_df['Height']**2)

所以updated_df现在看起来像

最后,通过将索引标签设置为Person,我们将这个数据帧导出到一个名为BMI.csv的 csv 文件中。csv 文件保存在保存程序源代码的同一目录中。

updated_df.to_csv('BMI.csv',index_label='Person')

如果我们比较这两种方法,使用 DataFrame 方法会产生一个更简洁的问题解决方案;部分原因是我们可以用一个数据框架同时处理两个系列。

熊猫能做的就这些吗?

目前我们看到的只是对熊猫的简单利用。然而,当我们处理复杂的问题时,熊猫的真正力量变得显而易见。所以,现在让我们来看一个稍微复杂一点的问题,看看熊猫到底能做什么。这次我们将使用一个真实的数据集。

什么是数据集?

数据集只是在感兴趣的特定领域中收集的数据的集合。例如,可以有一个世界各国的数据集。该数据集可以包含特定年份世界各国的人口、按性别、年龄组划分的人口、各国的 GDP、预期寿命、识字率、婴儿死亡率以及各种其他数据。这些只是一堆毫无意义的数字。但是有了像熊猫这样的分析工具,我们可以从这个数据集产生有价值的见解,比如,一个国家的 GDP 和它的识字率之间有关系吗?或者婴儿死亡率和女性预期寿命的关系?这些是熊猫帮助我们解决的问题类型。 UCI 机器学习库包含许多有趣的数据集。一旦您熟悉了 DataFrame,您就可以尝试使用其中的一些数据集。在这篇文章中,我将使用一个相对简单的数据集,我们将在下一个问题中讨论。

问题 2

我们有一个数据集,其中包含司机在一段时间内的出行数据。数据集的描述如下:

一名司机每天开车上下班时使用一款应用程序追踪 GPS 坐标。该应用程序收集位置和海拔数据。该数据集中总结了大约 200 次旅行的数据。

使用数据集,查找
a)第一个、最后一个和第十个条目的详细信息,
b)每天的详细信息,
c)当一天的总行驶距离大于 90 但小于 100 时的条目,
d)c)单行的距离和燃油经济性,
e)当平均移动速度大于 90 时的星期五的条目,
f)当最大速度大于 135 或燃油经济性小于 8 时的条目,以及
g)

解决方案 2

我们从这个链接下载数据集,并将其保存在一个名为travel-times.csv的文件中。现在,我们需要从 csv 文件中获取数据。read_csv方法接受文件名作为参数,并返回一个 DataFrame。

travel_df = pd.read_csv('travel-times.csv')

此时此刻,我们并不真正知道数据集中有什么样的数据。在我们开始解决问题之前熟悉数据通常是一个好习惯。为了查看数据集中可用的数据类型,我们使用了返回 DataFrame 的前 5 行的head方法。

travel_df.head()

返回以下内容

head方法让我们熟悉了数据集中可用的列,并提供了一个数据样本。让我们通过使用describe方法来了解更多的数据。

travel_df.describe()

describe方法只列出原始数据帧中的 6 列。这是因为只有这 6 个是数字类型,因此它们的平均值、标准差、四分位数等也是数字类型。可以被计算出来。让我们用info方法进一步验证这一点。

travel_df.info()

返回

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 205 entries, 0 to 204
Data columns (total 13 columns):
Date              205 non-null object
StartTime         205 non-null object
DayOfWeek         205 non-null object
GoingTo           205 non-null object
Distance          205 non-null float64
MaxSpeed          205 non-null float64
AvgSpeed          205 non-null float64
AvgMovingSpeed    205 non-null float64
FuelEconomy       188 non-null object
TotalTime         205 non-null float64
MovingTime        205 non-null float64
Take407All        205 non-null object
Comments          24 non-null object
dtypes: float64(6), object(7)
memory usage: 20.9+ KB

实际上只有 6 列是类型float64。然而,我们从info方法中发现了一些有趣的信息。总共有 13 列,其中 11 列有 205 个条目,但是FuelEconomy只有 188 个,而Comments字段只有 24 个。相对而言,这是非常少的数据,不能为我们提供太多信息。此外,我们的问题没有定义任何关于评论的东西。因为我们对评论不感兴趣,所以我们将放弃这个专栏。记住,我们需要声明inplace=True来永久删除该列。

travel_df.drop(labels=['Comments'],axis=1,inplace=True)

如果没有定义 axis,它将被设置为 0,这意味着删除索引。为了删除一列,我们显式定义了axis=1。同样,我们检查 head 和 info 方法。

travel_df.head()

travel_df.info()

它返回

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 205 entries, 0 to 204
Data columns (total 12 columns):
Date              205 non-null object
StartTime         205 non-null object
DayOfWeek         205 non-null object
GoingTo           205 non-null object
Distance          205 non-null float64
MaxSpeed          205 non-null float64
AvgSpeed          205 non-null float64
AvgMovingSpeed    205 non-null float64
FuelEconomy       188 non-null object
TotalTime         205 non-null float64
MovingTime        205 non-null float64
Take407All        205 non-null object
dtypes: float64(6), object(6)
memory usage: 19.3+ KB

现在,我们只剩下 12 列了。我们仍然在FuelEconomy列中缺少我们感兴趣的数据。让我们看一个更大的样本,这样我们就可以看到 FuelEconomy 不是 NaN 的行。

travel_df.head(n=10)

我们看到FuelEconomy列包含数字,但是info方法将FuelEconomy列的数据类型显示为object。让我们用dtype属性进一步验证这一点。

travel_df['FuelEconomy'].dtype

它返回dtype(‘O’)。“O”表示它属于类型object。通过查看上面的头部,我们可以看到它不仅包含NaN s,还包含虚线(-)条目,类型为object。在执行任何操作之前,我们需要将FuelEconomy列转换为数字类型。为此,我们使用to_numeric方法。

travel_df['FuelEconomy'] = pd.to_numeric(travel_df['FuelEconomy'],errors='coerce')

方法试图将一个字符串解析成一个数字。errors=’coerce’将无法解析为数字的条目设置为NaN。如果没有显式定义 errors,默认结果将是抛出一个异常,因为虚线(-)条目无法解析为数字。

现在,让我们再次看看 info 和 head 方法。travel_df.info()现在退货

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 205 entries, 0 to 204
Data columns (total 12 columns):
Date              205 non-null object
StartTime         205 non-null object
DayOfWeek         205 non-null object
GoingTo           205 non-null object
Distance          205 non-null float64
MaxSpeed          205 non-null float64
AvgSpeed          205 non-null float64
AvgMovingSpeed    205 non-null float64
FuelEconomy       186 non-null float64
TotalTime         205 non-null float64
MovingTime        205 non-null float64
Take407All        205 non-null object
dtypes: float64(7), object(5)
memory usage: 19.3+ KB

travel_df.head(n=10)现在显示

FuelEconomy的数据类型现在已经更改为float64,现在有 186 个非空条目,因为虚线条目已经设置为NaN

为了执行进一步的计算,最好将所有数值都填满。移除NaN值的一个常用方法是用列中可用值的平均值填充这些条目。为此,我们将fillna方法与inplace=True结合使用。

travel_df['FuelEconomy'].fillna(travel_df['FuelEconomy'].mean(),inplace=True)

head现在显示

并且info给出

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 205 entries, 0 to 204
Data columns (total 12 columns):
Date              205 non-null object
StartTime         205 non-null object
DayOfWeek         205 non-null object
GoingTo           205 non-null object
Distance          205 non-null float64
MaxSpeed          205 non-null float64
AvgSpeed          205 non-null float64
AvgMovingSpeed    205 non-null float64
FuelEconomy       205 non-null float64
TotalTime         205 non-null float64
MovingTime        205 non-null float64
Take407All        205 non-null object
dtypes: float64(7), object(5)
memory usage: 19.3+ KB

现在,我们在FuelEconomy列中的所有 205 个值都用平均值填充了数据缺失的地方。

现在我们准备开始解决上面给出的问题。对于第一个问题,我们使用iloc属性来查找数据帧中的第一个、最后一个和第 10 个条目。

travel_df.iloc[0]给了我们第一排

Date              1/6/2012
StartTime            16:37
DayOfWeek           Friday
GoingTo               Home
Distance             51.29
MaxSpeed             127.4
AvgSpeed              78.3
AvgMovingSpeed        84.8
FuelEconomy        8.69059
TotalTime             39.3
MovingTime            36.3
Take407All              No
Name: 0, dtype: object

我们可以看到这是一个系列。

类似地,我们可以使用travel_df.iloc[-1]查找最后一行,使用travel_df.iloc[9]查找第 10 个元素。

接下来,我们看到一个日期有多个条目。因此,让我们将数据分组,以便每个日期只有一个条目。我们尝试按照Date列对数据帧进行分组。

travel_df_by_date = travel_df.groupby(['Date'])

如果我们通过使用type(travel_df_by_date)来查看travel_df_by_date的类型,我们将看到它返回pandas.core.groupby.DataFrameGroupBy。所以travel_df_by_date是一个DataFrameGroupBy实例。为了组合具有相同日期的多行,我们在DataFrameGroupBy实例上使用了sum方法。

travel_df_by_date_combined = travel_df_by_date.sum()

该数据帧的head返回

看我们的问题,也需要DayOfWeek栏。但是使用sum方法只能保留数字字段。因此,为了获得DayOfWeek列,我们通过DateDayOfWeek列以及结果DataFrameGroupBy实例上的sum进行分组。

travel_df_by_date = travel_df.groupby(['Date','DayOfWeek'])
travel_df_by_date_combined = travel_df_by_date.sum()

travel_df_by_date_combinedhead显示

但是我们现在可以看到 DataFrame 现在有一些不正确的数据。按日期分组时,DistanceTotalTimeMovingTime列的总和是正确的。但是通过使用sum方法,我们还添加了MaxSpeedAvgSpeedAvgMovingSpeedFuelEconomy列,这是不正确的。MaxSpeed应包含特定日期各行的最大值,其他列应包含各行的平均值。所以,让我们修改一下。

travel_df_by_date_combined['MaxSpeed'] = travel_df_by_date['MaxSpeed'].max() travel_df_by_date_combined['AvgSpeed'] = travel_df_by_date['AvgSpeed'].mean() travel_df_by_date_combined['AvgMovingSpeed'] = travel_df_by_date['AvgMovingSpeed'].mean() travel_df_by_date_combined['FuelEconomy'] = travel_df_by_date['FuelEconomy'].mean()

现在,如果我们检查一下travel_df_by_date_combinedhead,我们会看到

太好了。我们现在有了所有所需列的正确数据。现在让我们检查数据框travel_df_by_date_combined上的info

<class 'pandas.core.frame.DataFrame'>
MultiIndex: 111 entries, (1/2/2012, Monday) to (9/8/2011, Thursday)
Data columns (total 7 columns):
Distance          111 non-null float64
MaxSpeed          111 non-null float64
AvgSpeed          111 non-null float64
AvgMovingSpeed    111 non-null float64
FuelEconomy       111 non-null float64
TotalTime         111 non-null float64
MovingTime        111 non-null float64
dtypes: float64(7)
memory usage: 7.4+ KB

通过DateDayOfWeek列进行分组产生了一个多索引数据帧,如 head 和 info 方法所示。但是我们希望DayOfWeek是一个常规列,而不是索引。因此,我们首先重置索引,使数据帧的索引变成普通整数。在下一步中,我们将Date列设置回索引。

travel_df_by_date_combined.reset_index(inplace=True)

这一次我们使用tail方法查看最后 5 行,并且看到DateDayOfWeek都被设置为常规列。

travel_df_by_date_combined.tail()

接下来,我们将Date列设置为索引。

travel_df_by_date_combined.set_index(['Date'],inplace=True)

travel_df_by_date_combined中的head现在显示

完美。我们将Date作为索引,我们还保留了DayOfWeek列和所有其他数字列。每个日期都有一个条目。这是上面问题 b 的答案。

这么多工作只为了一个简单的答案。

是的。那是一个相当大的过程。但是不用担心。到目前为止,我们一直在准备数据,以便能够回答上述所有问题。从这里开始,事情就非常简单了。我们已经做了所有的艰苦工作。现在是收获我们所播种的东西的时候了。

现在,让我们找出距离大于 90 但小于 100 的条目。为此,我们使用条件选择。

distance_above_ninety = travel_df_by_date_combined['Distance']>90

这将导致distance_above_ninety包含一系列布尔值。它的作用是,获取travel_df_by_date_combined[‘Distance’]数据帧的每个条目,并检查它是否大于 90。如果是,它为结果序列中的相应条目设置True;否则设置False。请注意,该系列的索引将是Date列。

同样,我们可以发现

distance_below_hundred = travel_df_by_date_combined['Distance']<100

现在我们可以把这两个数列结合起来,找出距离大于 90 小于 100 的Distance。但是我们不能像在 Python 中那样使用*and*操作符来组合distance_above_ninetydistance_below_hundred。这是因为*and*操作符只作用于两个布尔值,但是这里我们处理的是两个布尔值序列。使用*and*操作符会导致值错误:一个序列的真值是不明确的。为了找到一系列组合的真值,我们需要使用*&*操作符。也就是我们用distance_above_ninety & distance_below_hundred

结合条件选择,

ninety_to_hundred_df = travel_df_by_date_combined[distance_above_ninety & distance_below_hundred]

我们得到一个数据帧,其中只有满足这两个条件的条目

我们可以看到所有的距离都在 90 到 100 之间。这解决了我们的问题 c。我们可以使用这个数据帧来解决问题 d。在问题 d 中,我们需要做的就是从上面的数据帧中提取任意行的详细信息。让我们用loc得到最后一个日期的DistanceFuelEconomy

ninety_to_hundred_df.loc[['8/26/2011'],['Distance','FuelEconomy']]

对于问题 e,我们再次使用组合条件选择来查找星期五平均移动速度高于 90 的条目。

over_ninety_on_friday = travel_df_by_date_combined[(travel_df_by_date_combined['AvgMovingSpeed']>90) & (travel_df_by_date_combined['DayOfWeek']=='Friday')]

和上面的条件选择一样。我们现在已经简单地在一行中写了所有的内容。

所有条目都是星期五的,每行的平均移动速度超过 90。

我们用同样的方法来解决问题 f。这里,我们需要最大速度大于 135 或者燃油经济性小于 8 的条目。就像在*and*操作符的情况下,出于同样的原因,我们不能使用*or*操作符。相反,我们使用管道(|)运算符。

max_speed_over_one_thirty_five_or_fuel_economy_below_eight = travel_df_by_date_combined[(travel_df_by_date_combined['MaxSpeed']>135) | (travel_df_by_date_combined['FuelEconomy']<8)]

这次我们有更多的行,因为只需要满足两个条件中的一个。有些条目的MaxSpeed高于 135,有些条目的FuelEconomy低于 8,有些条目两者都有。这就解决了问题 f。

最后,我们来看看一周中每一天的一些统计信息。DataFrameGroupBy 实例上应用的sum方法提供了每一天中每一列的总和。

travel_df.groupby(['DayOfWeek']).sum()

请注意,这些列再次包含不正确的MaxSpeedAvgSpeedAvgMovingSpeedFuelEconomy值。但是这里我们只是在演示sum方法的作用。

同样,我们可以沿着各个日行找到每一列的max值。max方法也适用于非数字列。

travel_df.groupby(['DayOfWeek']).max()

也可以使用 describe 方法获得所有细节,如平均值、标准差、四分位数等。立刻。下面我们对其中一列AvgMovingSpeed使用 describe 方法。

travel_df.groupby(['DayOfWeek'])['AvgMovingSpeed'].describe()

这解决了我们的最后一个问题。

我头疼。

我知道这很难接受。但是 DataFrame 是一个非常重要的主题,一旦你熟悉了它,你就可以选择你感兴趣的任何数据集,然后找到对数据的所需见解。同样,这篇文章没有涵盖 DataFrame 的所有方法和属性。这篇文章中所采取的一系列步骤可能不是解决问题的唯一途径。也许你可以找到另一种方法。更有效的方法。你需要的只是练习。只要像阿宝一样坚持下去,你也能成为功夫熊猫。

在下一篇文章中,我们将利用我们目前所学的知识,以一种更紧凑、更具视觉吸引力的方式将结果可视化。我们将使用 Matplotlib 包,特别是 pyplot 模块,最终用图形和图表来表示文本、数字和表格。

[## 冲刺可视化轨道(第 1 部分):Matplotlib

我们已经用 DataFrame 走了很久,

towardsdatascience.com](/sprinting-into-the-visualization-track-part-1-matplotlib-6c069ac91e40)

使用 Graphext 进行行为分析

原文:https://towardsdatascience.com/behaviour-analysis-using-graphext-ddca25ebd660?source=collection_archive---------10-----------------------

为什么人们会这样做?他们为什么买产品,为什么辞职,为什么换伴侣?这些动机中的许多可以从人们的行为中归纳出来,这些行为反映在数据中。

公司拥有大量关于客户、员工、供应商的数据……让我们将这些数据用于智能数据发现,看看我们能学到什么。

我们将使用我们在 Kaggle 中找到的来自 IBM 人力资源部门的数据集来演示一个示例:https://www . ka ggle . com/pavansubhasht/IBM-HR-analytics-attraction-dataset

在这个数据集中,每一行代表一个雇员,而列是描述它们的不同变量。这些变量包括分类和定量信息。让我们将数据集上传到 Graphext 并查看一下:

在这个例子中,我们想要分析员工离开的原因。在原始数据集的二进制变量“LEFT”列中,1 表示一名员工已经离开,0 表示他们已经留下。从我们的分析中排除这个“目标变量”列,然后我们可以使用其余的变量来观察可能会或可能不会导致人才流失的行为模式。让我们来看看输出。

在这个可视化中,每个节点都是一个雇员。彼此相似的节点位置更近,反之亦然。因此,我们可以看到具有不同模式的数据图。我们使用我们自己的高级降维方法创建了这个网络,并在此基础上运行了网络中社区检测的聚类算法。

因为我们有一个要解释的目标变量,所以让我们用变量“LEFT”给数据集着色,看看它是如何分布的。

我们可以清楚地看到,以黄色表示的离职员工形成了不同的群体,表明他们有不同的行为模式,尽管他们都被归入了同一个“左派”类别。

使用预测模型的传统分析会从将所有“左”员工放在同一个篮子中开始,忽略了存在许多不同类型的“左”员工的事实。然而,使用智能数据发现,我们可以识别这些员工的行为模式,区分他们的行为,并在开始预测之前提出更好的问题。

让我们从人力资源的角度来看这个问题,把分析的重点放在“销售”部门和“低”工资的员工身上。通过点击这两个过滤器,我们可以缩小我们的数据选择。

现在,让我们用“左”或“不”来给员工涂色,看看这个小组的行为模式有何不同。

我们可以看到,至少有三组不同的员工“离开”了公司。

首先,我们选择左上方的集群,找出它们离开的原因。左边的面板会自动告诉我们是什么变量将这个群体从其他人群中分离出来。

Graphext 自动告诉我们它们是由以下分布定义的:

  • 我们能看到的“项目数量”非常少
  • “满意度”约为 4 分(满分 10 分),与整个人口相比也非常低

  • “最后评价”在 4-6 分之间(满分 10 分),也非常低
  • “平均月小时数”,低于平均值

现在让我们问一个问题,你会主动在你的公司留住这类员工吗?这些员工不开心,只在几个项目中工作过,而且上次评估很糟糕。如果你想留住他们,你可以根据他们的需求提供专门的培训项目。

让我们继续,选择下一批已经离开的员工。

在这种情况下,它们由以下分布定义:

  • “平均每月小时数”,我们可以看到很高,但不是最高的
  • “在公司度过的时间”,大约在 5 到 6 年达到顶峰

  • “最后评价”,我们可以看到非常高,意味着他们是非常好的员工
  • “满意度”,在分布中相当高,意味着他们很快乐

这些员工工作时间很长,对公司很满意。他们才是你真正想留住的人!这些员工离开可能是因为他们被另一家提供更高薪水的公司录用了。为了留住他们,惩罚计划可能会创造奇迹。

我们看到了两种截然不同的行为模式,需要不同的保持策略。用传统的预测模型分析这些数据会让你失去做出有实际影响的决策的机会。通过智能数据发现发现这些模式将允许您为每种特定行为创建更好的规范策略。

想了解更多?向我们索取演示

行为克隆在自动驾驶汽车模拟赛道上的应用

原文:https://towardsdatascience.com/behavioural-cloning-applied-to-self-driving-car-on-a-simulated-track-5365e1082230?source=collection_archive---------1-----------------------

最近我在 Udacity 上了一门课程,重点是无人驾驶汽车,所以我终于能够在课程中发布其中一个项目了。

这个项目,标题如上,有一个目标是训练一个模型在模拟轨道上自动驾驶汽车。该模型驾驶汽车的能力是通过克隆人类驾驶员的行为来学习的。训练数据从模拟器中的人类驾驶示例中获得,然后输入到深度学习网络中,该网络学习模拟中遇到的每一帧的响应(转向角度)。换句话说,该模型被训练为在驾驶时为每一帧预测适当的转向角度。然后,在新的轨迹上验证该模型,以检查用于执行转向角预测的学习特征的一般化。

我对这个项目的解决方案受到了 nvidia 论文、 comma.ai 论文vivek 博客的影响,我在制定解决方案时参考了这些论文。 Keras 深度学习库Tensorflow 后端一起使用,执行深度学习操作。

这篇文章组织如下:1。数据记录,2。数据处理,3。模特培训,4。模型测试;5 .结论。

1。数据记录

模拟器有两种模式——训练模式和自主模式。训练模式用于收集训练数据,方法是在赛道上行驶,并将行驶数据记录在文件夹中。自主模式用于测试经过训练的模型。

Self-Driving Car Simulator

Udacity 提供了一组训练数据(24,108 个数据集),可以通过模拟器下载。我认为 Udacity 数据集可能不够,所以我记录了自己的训练数据(104,145 个数据集),并将使用 Udacity 数据集进行验证。绘制 10,000 个训练数据样本的直方图显示,由于轨道的性质,来自轨道 1 的数据具有更多的 0°和左转向角,因此我们的处理步骤还将包括数据扩充和平衡,以防止我们的模型偏向于直行和左转。

2.数据处理

进行数据处理是为了让我们的模型能够轻松地处理用于训练的原始数据。在这个项目中,数据处理内置在一个生成器(keras fit_generator )中,以允许实时处理数据。这样做的好处是,在我们处理大量数据的情况下,整个数据集不会加载到内存中,因此我们可以一次处理一批可管理的数据。因此,为了提高效率,发电机与模型并行运行。

以下是对数据执行的处理步骤:

  1. 从中心、左、右摄像机图像中随机选择:模拟器提供三个摄像机视图,即:中央、左侧和右侧视图。因为我们只需要使用一个摄像机视图,所以我们从三个视图中随机选择。在使用左右图像时,我们分别给转向角加上和减去 0.25,以补偿相机偏移 1
  2. 平移图像(抖动)并补偿转向角:由于原始图像大小为 160x320 像素,我们随机将图像向左或向右平移,并以每平移像素 0.008 补偿转向角的平移。然后,我们从图像中裁剪出一个 120x220 像素的感兴趣区域。请注意,对于我的解决方案,我仅在水平方向平移。
  3. 随机翻转图像:为了平衡左右图像,我们随机翻转图像并改变转向角的符号。下图显示了经过抖动、裁剪和角度校正后的左、右和中央摄像机的视图。右摄像机视图已经翻转,因此看起来像左摄像机图像。
  4. 增亮我们通过将图像转换为 HSV 通道,并随机缩放 V 通道来模拟不同的亮度场合。

Camera views after processing and steering angle compensation.

绘制 10,000 个已处理图像的样本显示了处理后转向角的更平衡的分布:

3.模特培训

采用 Nvidia 模型进行训练,因为它在试验了其他类型的模型(例如 comma.ai)后给出了更好的结果。该网络由 9 层组成,包括一个归一化层、5 个卷积层和 3 个全连接层。与 Nvidia 模型相反,输入图像在传送到网络之前被分割成 HSV 平面。

Nvidia model

图像在第一层被标准化。根据 Nvidia 的论文,这使得标准化也可以通过 GPU 处理来加速。

卷积在前三层中使用 2x2 步长和 5x5 内核,非步长卷积在后两层中使用 3x3 内核。

卷积层之后是三个全连接层,然后输出转向角。

通过在所有层上使用积极的下降(0.2)和在第一层上使用 L2 正则化(0.001)来减少过拟合。这被证明是一个很好的实践,因为该模型可以推广到第二个轨道,而无需将其用于培训。

Adam 优化器用于优化。由于学习速率是自适应的,这几乎不需要调整。此外,在训练过程中使用检查点和早期停止机制,通过监控验证损失来选择最佳训练模型,如果损失在连续三个时期内没有减少,则停止训练。

虽然有超过 100,000 个训练数据,但是每个时期包括 24,064 个样本。这使得训练更容易处理,并且由于我们使用了生成器,所有的训练数据仍然在训练中使用,但是在不同的时期。

再次重申,自我记录的数据用于训练,而 Udacity 提供的数据用于训练期间的验证。

4.模型检验

经过训练的模型在第一条跑道上进行了测试。这给出了一个很好的结果,因为赛车可以在赛道上平稳行驶。参见下面的路线 1 测试结果视频

此外,为了测试推广性,在第二个轨道上测试了模型。值得注意的是,该模型从未在这条赛道的样本上训练过,但它在这条赛道上驾驶成功。参见下面的路线 2 测试结果视频:

5.结论

通过使用人类行为采样数据来训练在模拟轨道上自主驾驶的深度学习模型。该模型包括 5 个卷积层和 3 个更完全连接的层,能够通过克隆人类行为进行学习,并能够概括对新测试轨道的反应。虽然该模型只控制转向角,但它也可以扩展到控制油门和刹车。

笔记

以下是我在这个项目中的个人笔记:

  1. 数据处理和学习过程一样重要:我意识到,也许这个项目最重要的部分是提出一种预测测试用例并进行归纳的数据处理,因此使用了抖动和亮度增强。一旦我能够在 Nvidia 模型上训练,在 comma.ai 模型上工作也很容易,在相同的数据处理下,它也给出了令人满意的结果。
  2. 数据量统计:更多的数据最能提高学习效率。当我有大量数据进行训练时,我可以很容易地看到改进,并能够根据 Udacity 数据集进行验证。
  3. 一些我觉得没用的处理:虽然其他一些人也用了这些方法,但对我来说并没有什么影响。例如,垂直平移、通过添加一些均匀噪声来扰动 0°附近的转向角,以及使用正方形大小的输入。

你可以在我的 github 这里找到这个项目和其他自动驾驶汽车相关的项目。虽然这个项目已经完成,但我想改进或者训练这辆车在越野赛道上行驶。请在评论中给出任何建议、更正或补充。

成为一名自学成才的机器学习工程师:7 个月

原文:https://towardsdatascience.com/being-a-machine-learning-engineer-7-months-in-343a6fae0234?source=collection_archive---------16-----------------------

在我作为机器学习工程师的头 7 个月里,我学到了 7 件事

Where most of my self-study/project work happens.

在过去的 7 个月里,我一直是 Max Kelsen 的机器学习工程师。在我参与的几个项目中,有几件事每次都会出现。

当然,因为数据不同,客户不同,目标不同,所以永远不会相同。但是一个问题的原理通常可以用于另一个问题。

每当我开始使用新的数据集时,我都要提醒自己以下几点。

a)看数据。不是真的,看看数据。

当你第一次得到一个数据集时,你应该做的第一件事就是浏览它,并制定一系列的问题。

不要马上寻找答案,过早这样做可能会给你的探索过程设置障碍。

‘这个专栏和什么有关?’

“这会产生这样的效果吗?”

‘我应该了解更多关于这个变量的信息吗?’

“为什么这些数字是这样的?”

“这些样品总是以那种方式出现吗?”

你可以在第二次浏览数据时开始回答这些问题。如果这些问题你自己都无法回答,那就去找专家吧。

b)与专家交流

数据就是数据。它不会说谎。事情就是这样。但这并不意味着你得出的一些结论不会因为你自己的直觉而产生偏差。

假设你试图预测房价。可能有些事情你已经知道了。房价在 2008 年下跌,有白色栅栏的房子赚得更多,等等。

但是重要的是不要把这些当作硬性的假设。在你开始建造世界上最好的住房模型之前,你可能想问一些有经验的人的问题。

为什么?

因为这会节省你的时间。当你在第一部分列出你的问题清单后,问一个主题专家可以节省你几个小时的预处理时间。

“哦,我们不再使用那个指标了,你可以忽略它。”

“你看到的那个数字实际上与其他东西有关。”

c)确保你回答了正确的问题

当你开始建立一个模型的时候,确保你已经想好了你要解决的问题。

这应该与客户、项目经理和任何其他主要贡献者进行讨论。

模型的理想结果是什么?

当然,当你重复不同的选项时,目标可能会改变,但是有目标总是一个好的开始。

没有什么比花两周时间建立一个 99%准确的模型,然后向客户展示你的作品,却发现你在建模错误的东西更糟糕的了。

测量两次。切一次。实际上,这句话对机器学习并不适用,因为你会制作大量的模型。但是你明白了。

d)特征工程、特征编码和数据预处理

有什么样的数据?

仅仅是数字吗?

有没有可以纳入模型的分类特征?

注意,分类特征可以被认为是任何类型的数据,这些数据不能立即以数字形式出现。

在尝试预测房价的问题中,您可能会将个浴室作为数据的数字特征,将房屋的郊区作为数据的分类特征(非数字类别)。

有不同的方法来处理这两个问题。

对于数字,主要的方法是确保它们都是相同的格式。例如,想象一下汽车的制造年份。

99(99 年)是 18(2018 年)的四倍吗?

您可能希望将这些更改为 1999 年和 2018 年,以确保模型捕捉到这两个数字实际上有多接近。

分类特征的目标是将它们转换成数字。你怎么能把住宅郊区变成数字呢?

比如说你有帕克里奇格林维尔和阿斯科特。

你能说帕克里奇= 1,格林维尔= 2,阿斯科特= 3 吗?

但不代表帕克里奇+格林维尔=阿斯科特?

这说不通。

更好的选择是对它们进行一次热编码。这意味着给一个值 1 代表它是什么,0 代表它不是什么。

有许多其他的方法可以将分类变量转换成数字,而计算出最好的方法是有趣的部分。

e)快速测试、迭代、更新

您能在开始时创建一个简单的度量标准吗?

可能有一个你正在努力实现的理想场景,但是有没有一个更简单的模型可以用来测试你的想法呢?

从最简单的模型开始,逐渐增加复杂性。

不要害怕犯错,一次又一次,一次又一次。测试中出错总比生产中出错好。

如果有疑问,运行代码。就像数据一样,代码不会说谎。它会完全按照你说的去做。

你越快发现什么不起作用,就能越快找到什么起作用。

f)不断重温主要目标

机器学习项目产生的主要问题通常不是数据或模型,而是相关方之间的沟通。

沟通永远是关键。

解决一个问题可能会让你陷入困境。你想尝试一件事,这导致了一件又一件事,现在你甚至不确定你在解决什么问题。

这不一定是一件坏事,一些最好的解决方案就是这样找到的。

但是记住不是每个人都能理解你的思路。如有疑问,请多沟通。

问问你自己,“我还在正确的轨道上吗?”因为如果你答不出来,你觉得别人会怎么走?

g)几声大喊

在我偶然发现这两个惊人的资源后,我的工作质量得到了提升。

  1. Daniel Formoso (很棒的名字)的笔记本,它从头到尾使用 scikit-learn、TensorFlow 和一系列其他技术完成了一项数据科学分类任务。
  2. CatBoost ,决策树库上的火箭动力开源梯度 boosting。换句话说,一个史诗般的算法将我最近的所有结果提高了 10%。

你可以将这两者结合起来,为你的下一个机器学习项目建立一个非常健壮的基础。

额外收获:每天都是第一天

我差点忘了这个。

这个领域有太多的事情正在发生。可能很难跟上。尤其是当你刚开始的时候。

机器学习技术具有难以置信的潜力,可以为社会带来价值。所以它们值得学习是有道理的。但是像任何值得学习的东西一样,这些技能需要时间来培养。

每次你认为你已经尽了最大努力,总会有更多的收获。你可能会对此感到厌烦或兴奋。一个有用,另一个没用。

想要更多吗?我在 YouTube 上制作关于学习机器学习、健康和健身的每周视频,并在mrdbourke.com上写每日文章(这就是这篇文章的出处!).我在 LinkedIn 上也很活跃。回头见!

比谷歌更擅长机器学习——可能吗?

原文:https://towardsdatascience.com/being-better-at-machine-learning-than-google-is-it-possible-62c5e4643ddb?source=collection_archive---------4-----------------------

Comparing Facebox by Machine Box with Google Vision

说你在某件事上比谷歌更好是没有意义的。然而,当我对我们的面部识别技术和谷歌的视觉 API 进行测试时,我发现我们更加准确……更加准确

当我看到‘我们’时,我说的是我公司的机器箱。我们在 Docker 容器中制作机器学习模型,这样任何可以编写 API 的开发人员都可以在他们的产品中实现机器学习,不需要博士或数学知识。

这一切都是从一个实验开始的,看看 Facebox 可以在一张图片中看到多少张脸。我搜索“人群”的图片,想找到一些好的测试图片,结果发现了这个:

A photo with a lot of faces — source: http://www.sportsplexoperators.com/blog/wp-content/uploads/2013/07/crowd_2.jpg

所以我创建了一个 Facebox 的实例,并把图片贴在上面。下载并分析图像几秒钟后,Facebox 用 JSON 作出响应,在 JSON 的顶部是一个facesCount元素,显示检测到的人脸总数。

JSON response from Facebox

153,还不错。我通过我们开发人员的控制台预览模式再次运行了这张图片,得到了一些值得截图的东西:

Screen shot of Facebox’s preview mode in the developer console

然后我想知道,鉴于他们围绕机器学习的新声明,这与其他云认知服务,特别是谷歌视觉,有什么关系。我访问了他们的页面,他们让你在服务上发布一张照片,看看会有什么结果。经过几秒钟的处理,我得到了这个结果。

Google Vision console

我可以立即从缩略图看出检测到的人脸较少,但当我向下滚动右侧的响应窗口时,我有点震惊地看到他们只检测到了 50 张人脸。

他们漏掉了那张照片中的 100 多张脸。那太多了。😬

谷歌视觉的人脸识别产品当然有更多的功能,比如情绪检测、眉毛定位、头饰检测等等。在 Machine Box,我们让 Facebox 非常擅长检测和识别人脸(你可以用一张图片教 Facebox 某人是谁)。就是这样!我们这样做是因为我们希望我们的盒子具有尽可能高的质量,这意味着只有在技术水平足够好以返回准确结果的情况下才实现特性。

也就是说,我们喜欢谷歌,对于一些用例来说,他们用于机器学习的公共云 API 将会工作得很好。他们有一个惊人的数据集来训练机器学习模型。那么 Machine Box 比 Google 更擅长机器学习吗?不,当然不是…是谷歌!他们在深度学习和其他人工智能相关技术上投入了大量时间和金钱,当然,也为地球上的几乎每个人提供了有价值的服务,这令人敬畏。但是,很多开发人员需要在本地或在他们自己的基础设施中实现一些具有极高精确度的东西(他们喜欢 Docker),所以他们选择了 Machine Box——我们非常感激。

制作锋利的开发工具是我们的热情和信念,我们希望您能尝试一下。它将永远免费用于开发和测试。

2018 年 CNN 推理的标杆硬件

原文:https://towardsdatascience.com/benchmarking-hardware-for-cnn-inference-in-2018-1d58268de12a?source=collection_archive---------4-----------------------

CNN 推理和边缘计算即将到来——几乎每个移动平台(苹果、三星、华为)都将获得专用硬件来进行推理。而且,随着自动驾驶汽车的出现,有像英伟达的 Jetson Tx2 这样的机器人平台将推理带到了边缘。今年夏天,我有机会尝试了各种硬件平台,并了解了 CNN 推断的堆栈是如何相互竞争的。

今年夏天,我有机会在 Aquifi 实习,这是一家 3D 视觉初创公司,旨在实现制造业物流流程的自动化。通常,摄像机连接到进行推理处理的远程服务器。然而,他们的智能相机还包括一个附加的“片上系统”,所以我们想看看我们是否可以在边缘运行网络。3D vision 中的示例网络可大可小,例如:

小:用于关键点检测的 KCNN
关键点在 3D 视觉中有许多用途,例如识别用于 3D 重建的良好特征。

大型: MVCNN 用于识别 3D 形状
MVCNN 是一个大型网络,它采用许多 2D 图像来识别一幅 3D 图像。它使用一个 VGG 作为主干,以及一个“视图池”层来聚合各个 2D 影像的特征地图。

我测试的各种硬件有:
1)英伟达 Jetson Tx2
2) Movidius 2450(英特尔神经电脑棒/谷歌视觉套件)
3)英伟达 1080ti(benchline)
4)麒麟 970(华为手机)
5)高通 660
6) ActionSemiS900

Hardware Platforms

要考虑的因素

在 CNN 的推断中,需要考虑的事情很多。我将主要关注推理速度。
1)用电量
2)成本
3)开发容易度
4)推理速度

CNN 的推论可以运行在哪里?

1)FPGA
2)GPU
3)DSP
4)ASIC
5)x86 或 Arm CPU
6)加速器(TPU NPE)

所有这些硬件在灵活性和效率方面都有各种各样的折衷。此外,公司现在正在生产新的名称,如 NPU(神经处理单元)或 TPU(张量处理单元),但实际上这些只是矩阵乘法和相关算术运算的加速器。在同一平台中,设备通常有多种类型。例如,高通 660 在同一块主板上集成了 CPU、GPU 和 DSP(数字信号处理器)。这使得实现算法变得困难,因为你必须实现所有硬件的所有原语层。下图显示了高通平台上不同图层类型的兼容性。

https://developer.qualcomm.com/docs/snpe/network_layers.html

编译程序

那么你已经在 Tensorflow/Pytorch 中训练了一个模型,你实际上如何让它在这些特定的硬件上运行呢?虽然一般可以在 GPU 或 CPU 上运行网络进行训练,但在推理过程中,大多数平台一般都要求你在网络上运行自己专有的编译器。

英伟达:TensorRT
谷歌视觉套件:视觉软帽编译器
麒麟 970: 华为图形编译器
高通:SnapDragon-tensor flow-to-DLC
神经计算棒:神经棒图形编译器

尽管这些编译器有不同的实现,但我们可以假设它们做了以下一些事情:

1)自动层融合
2)内存优化
3)不同硬件处理器(CPU、GPU、DSP、NPU)之间的分配
4)权重&激活校准(INT8 或 FP16)

Nvidia TensorRT

型号

InceptionV3: ~92 Mb,~ 2380 万参数
InceptionV2_Resnet: 214Mb, 5580 万参数
MobilenetV1 _ 0p 5 _ 128:~ 1.89 Mb,~0.5 万参数
MobilenetV1_1p_224: 16.3Mb, 420 万参数
MobilenetV1_0p5_160: 5.2Mb, 130 万参数

选择的模型是那些最终适用于大多数平台的模型。我排除了 VGG,因为它相当大,永远不会运行移动。Resnets 也是被排除在外的热门选择。

结果

初始版本 3

当每个平台具有不同的功能时,有时很难进行公平的评估。例如,在图中,高通将推理量化为 8 位。在 Nvidia TensorRT 中,您可以选择使用 FP32 或 FP16。麒麟 970 支持 8 位和 1 位量化。在这个图表中,一些有趣的点
1)英特尔神经计算棒是最慢的,比英特尔 i7–8700k CPU 慢 3 倍。
2) Nvidia Jetson Tx2 GPU 运行速度与英特尔 i7–8700k CPU 相同
3) 1080ti 比英特尔 i7–8700k CPU 快约 10 倍
4) Kirin970 和高通 660 移动平台速度相似
5) Jetson Tx2(Float TensorRT)与移动平台速度相似,但由于 Float 与 8 位推断不完全相同,因此这种比较并不公平。

移动网络

对于更小的 mobilenets,这使得不太强大的硬件如 ActionSemiS900 甚至 RaspberryPi 能够进行推理。Mobilenets 是最先进的边缘计算,有两个主要参数可以调整:1)宽度乘数 2)输入图像的大小。

下图显示了
1)宽度乘数= 0.25 &输入大小= 128
2)宽度乘数= 0.5 &输入大小= 160

使用最小的 mobilenet,硬件可以在几毫秒内进行推断。此时,硬件之间的传播差异小于 50 毫秒。因此,加载模型权重、将数据从 CPU 传输到 GPU 以及其他各种事情可能比推理本身需要更长的时间。
有趣点 1)英特尔神经棒比谷歌视觉套件快 4 倍,二者使用相同的底层 Movidius 2450 板。相同层的软件实现很重要。
2)

Nvidia Tx2 洞察

就速度而言 TensorRT(Half) < TensorRT(Float) < Tensorflow(Float), each faster by a factor of ~2x. We can expect the fastest verson TX2 TensorRT(Half) to be roughly 2–5x slower than 1080ti(Float) for various models — check out 这个再现了它。

https://github.com/NVIDIA-Jetson/tf_to_trt_image_classification

高通 660 洞见

高通 660 是该平台的旧版本,当前版本是 845。就像 Mobilenets、mobilenetsd、InceptionV3 这样的小型网络而言,高通 660 提供了不错的速度。例如,它可以以 Mobiletnet_0p25_128 为主干,为 MobilenetSSD 做 10fps。虽然速度很快,但缺点是 SNPE 平台仍然相对较新。在尝试使用 snpe-tensorflow-to-dlc 编译器编译某些最先进的模型时,我遇到了一个问题。我在论坛上看过类似的问题,但这是对新平台的预期。

麒麟 970 见解

对于 InceptionV3,麒麟 970 比高通 660 快一点。它甚至比高通的 SNPE 平台更新,因为华为 HiAI 平台于 2018 年 5 月发布。这个平台主要支持 Caffe。有一定的限制,如他们只支持 Tensorflow 1.3 和模型大小必须是<100mb. Most of the newest Mobilenets are trained with Tensorflow 1.6 or above. Thus, it is hard to compile some of the pretrained models on the internet currently.

ActionSemiS900 & CPU TF 结果

ActionSemiS900 是一款低功耗主板,配有 64 位四核 Cortex-A53 CPU 和 G6230 PowerVR GPU。虽然 PowerVR 为面向人工智能的应用程序推出了他们的 PowerVR CLDNN SDK ,但截至目前,它只支持拥有 PowerVR GPU 的 Chromebooks。因此,我在 Tensorflow 和 TFLite 上对 Cortex-A53 CPU 进行了一些测试。你可以实时运行所有的移动网络。TFLite 是谷歌的边缘计算方法,是 TF Mobile 的继任者。TFLite 对于特定型号来说速度稍快,但截至 2018 年 7 月,它还没有准备好生产-对于某些更大的型号,如 InceptionResnetV2(图中未显示),它甚至慢了几个数量级。

其他知名公司

就硬件而言,它真的是狂野的西部。下面显示的是 4 家公司,他们特别想从事人工智能系统芯片业务。要查看除片上系统之外的硬件,请查看这个全面的列表。简单总结一下这四个:
恩智浦:拥有各种 SoC 和其他解决方案,如 I.MX 8 系列用于 CNN 推断,使用 DeepView ML 工具包
联发科:芯片供应商对于中型手机,Helio P60 将类似于高通或华为的平台。使用他们的 NeuroPilot AI 平台,该平台被认为支持 TF,Caffe,ONNX,Android NN API
意法半导体:真正的大公司,在 1 月份的 CES 上宣布它想进入这个领域。
RockChip: 福州一家公司,宣称他们的 SoC 比 Jetson Tx2,Kirin970,Apple A11 都快…

展望未来

可以预计,硬件/平台将在 ML 的未来发挥很大作用。如你所见,每个手机芯片供应商(苹果、华为、高通、联发科...)都在抢着建自己的加速器。尽管硬件将在不到一年的时间内上市,但软件平台可能需要更长的时间才能赶上。真的,Nvidia 比这些家伙领先 10 年,这些芯片供应商正在从头开始编写软件。使用不同的专有编译器可能会很笨拙,在未来,我希望有一个像 Android NN API 这样的通用接口,可以访问硬件。

Android NN API

数据科学的优势和伦理挑战——COMPAS 和智能电表

原文:https://towardsdatascience.com/benefits-and-ethical-challenges-in-data-science-compas-and-smart-meters-da549dacd7cd?source=collection_archive---------3-----------------------

长篇散文。

Getting the balance right: weighing benefits against ethical challenges in Data Science.

1.介绍

最近在处理大量数据方面取得的进步为改善个人生活和我们社会的福利创造了大量新的机会。例如,监控家庭用电量的智能电表可以在不在家时帮助省电,或者根据消费模式建议最便宜的电力供应商。

然而,想象一下电力供应商的网站说,如果你提供实时而不是每周的电力消耗数据,你每年的电力成本将下降 20%。应该允许电力供应商向消费者施压,用隐私换取金钱吗?

1.1.概述

本文描述了数据科学的两个应用,即美国法院和家用智能电表中使用的替代制裁罪犯管理概况(COMPAS)软件系统,以对比它们的好处和道德挑战。

1.2.关键术语的定义

定义数据科学有两个组成部分。首先,海量数据(兆兆字节、千兆字节)具有大数据的三个特征:容量、速度和多样性(Laney,2001)。第二,数据科学代表以软件形式实现的统计模型,可以检测这些数据中的模式。

当关于什么是对什么是错的观点出现分歧时,伦理挑战就出现了。比如,一个算法是否应该拥有决定被告是否被保释的权力?由于统计模型是建立在数据之上的,像 COMPAS 这样的应用首先需要分析数据是如何产生的。当巡逻的警察以有偏见的方式控制公民时,道德挑战可能会出现,但这超出了本文的范围。

为了改善个人生活和我们社会的福利需要一个应用程序来为一个或多个个人的生活创造价值,而没有负外部性并且在法律界限内。换句话说,有人从使用这项技术中获益

最后,智能电表是一种电子设备,它测量家庭用电量,并与其他电子设备进行通信,作为连接网络的一部分(想想物联网)。

2.好处和道德挑战

COMPAS 和智能电表利用大量数据,提供清晰明确的优势,提出引人注目的道德挑战,受到众多学者的讨论,似乎对当今和未来的社会影响最大。

2.1.什么是 COMPAS?

美国各地的法官越来越依赖算法来评估等待审判的被告是否有可能再次犯罪。由 Northpointe 公司开发的一个这样的算法系统叫做 COMPAS,在威斯康星州、加利福尼亚州、科罗拉多州和佛罗里达州等地使用。在审讯过程中,每名被告都提供了 100 多个独立的输入变量,包括年龄、性别和犯罪史(安格温,未注明日期)。根据被告与特定群体的相似程度,COMPAS 输出从 0 到 10 的风险评分。得分从 5 到 7 代表中等,得分从 8 到 10 代表再次犯罪的可能性高。评委将分数视为决策过程中的众多因素之一。

好处

Swets 等人(2000 年)的研究论文发现,在某些情况下,数据科学方法优于人类判断。COMPAS 是对人类判断的补充,保证了基于所有可用的案例证据对被告进行客观公正的评估。它有助于防止出现 Danziger 等人(2011 年)描述的结果,他们发现,在法官用膳休息后,法院做出有利裁决的可能性迅速上升(见下图)。

Proportion of rulings in favour of the prisoners. Circled points represent the first decision after meal breaks (Danziger et al., 2011).

此外,COMPAS 在充斥着官僚主义和行政挑战的刑事司法系统中大放异彩,因为它简化了管理,简化了决策过程,提高了效率。

伦理挑战

我确定了三个主要的道德挑战:不公平的歧视、强化人类偏见和缺乏透明度。

不公平的歧视。

什么是公平被告评估,数据科学家如何开发适用于任何被告的相应算法?

Northpointe 对公平算法的定义指出,无论种族如何,每个风险类别中重新犯罪的被告比例大致相同。换句话说,例如 7 的风险分数预示着黑人和白人被告再次犯罪的可能性相等。根据定义,任何替代定义都会通过人为提高白人被告的风险水平来歧视他们。斯坦福大学和伯克利大学的研究人员根据佛罗里达州布劳沃德县的大约 5,000 个样本验证了单一风险分数代表实际再犯的风险大致相等(Corbett-Davies 等人,2016 年)。

然而,调查性新闻机构 ProPublica 通过分析佛罗里达州布劳沃德县治安官办公室的 1 万多份被告样本,发现了对黑人被告的不公平歧视。他们比较了 COMPAS 发布的累犯风险分数和分数发布两年后的实际累犯率,发现该算法将黑人被告归类为中等至高风险的可能性是白人被告的两倍多,即使黑人和白人被告都没有继续犯罪。虽然黑人被告没有重新犯罪,但他们受到了法院系统更严厉的对待(Larson et al .,2016)。

歧视性待遇本身不存在道德问题;这种待遇的影响,即根据种族被送进监狱或保释,是这种应用的伦理问题(Schermer,2011)。

一个算法能在满足 Northpointe 对公平的定义的同时减轻 ProPublica 的合法担忧吗?

强化人类的偏见。

前面定义的数据科学的两个方面(大量数据和统计模型)导致了基于过去数据模式做出决策的固有限制。COMPAS 的开发人员可能会向系统输入累犯数据,让模型识别与再次犯罪可能性相关的变量——这是训练分类算法的标准方式。如果数据是完全无偏的,那就不会有问题,但是公司所能做的就是鹦鹉学舌般地告诉我们自己的偏见。其中包括法官严重的种族主义偏见,他们认为黑人被告“比白人更有可能再次杀人”(Epps,2017 年),或者墨西哥被告实施了性侵犯,“因为他是墨西哥人,墨西哥男子想拿什么就拿什么”(科罗拉多最高法院,2017 年)。

将判决的责任交给电脑,让法官不仅可以根据相关因素(如犯罪的严重性)做出决定,还可以根据道德上有问题的因素(如推断的种族和性别)做出决定。假设 COMPAS 预测被告是高风险。然而,法官不同意并释放了被告,他后来再次犯罪。为什么法官不遵从软件的建议?这种结果比 COMPAS 建议低风险时更容易发现,但法官对被告进行判决,并(可能)防止再犯。

谓缺乏透明度。

向公众隐瞒公司的内部运作禁止了对减轻习得性偏见的理解和讨论。然而,可以理解的是,Northpointe 辩称,公布其专有算法将导致竞争劣势,“因为这肯定是我们业务的核心部分”(Liptak,2017),正如《纽约时报》援引一位高管的话说。当政府机构授权私营公司将数据科学应用于敏感的政府数据时,这种困境就不足为奇了。有两个关键领域需要透明度。

首先,统计建模的透明度要求 Northpointe 披露导致风险评分的逐步过程、基本模型及其参数。根据所使用的模型,这项任务可能非常困难,因为像神经网络这样的模型的确切工作方式仍然不清楚。立法者应该只允许完全理解的算法做出如此广泛的建议吗?

第二,仍然不清楚使用了什么数据。虽然种族不是一个输入变量,但其他变量,如性别,在 Eric L. Loomis 案件的诉讼程序中显而易见(威斯康星州最高法院,2016 年)。如果用于训练的数据集可以根据其他变量来推断种族,这在伦理上是非常成问题的。有超过 100 个输入变量,有可能一些变量子集可以准确地预测种族。在这种情况下,统计模型无法区分单个变量和该组变量的预测能力。Northpointe 的首席科学家蒂姆·布伦南(Tim Brennan)甚至承认,“很难构建一个不包括可以与种族相关的项目的分数”(Angwin et al .,2016)。共享变量之间的相关性与商业秘密并不冲突。

被告应该有权知道 COMPAS 是如何计算分数的吗?COMPAS 是否侵犯了被告获得个性化判决的权利和基于准确信息被判刑的权利?(《州诉卢米斯案》,2017 年)

2.2.什么是智能电表?

最近的技术进步引发了从许多小规模来源而不是少数大型发电厂向更分布式发电的转变。这至少需要对电网进行部分重新设计,包括智能电表,以保证安全运行。更具体地说,系统运营商可以获得网络透明度,消费者可以可视化和优化他们的电力消耗。智能电表有很多好处,但也有风险(芬斯特和鲍姆加特,2015)。

利益

电力供应商的利益可分为网络运营和更灵活的计费(Jawurek 等人,2012 年)。

智能电表使公司能够更好地管理电网,包括更好地预测未来的网络容量需求、网络基础设施的预防性维护和快速停电检测(Depuru 等人,2011b)。

关于计费机会,公司可以利用数据开发新的电价模型,包括电力消费和发电(上网电价)。这为消费者提供了更多选择的新市场。事实上,先进的计量基础设施是具有波动电力馈入的分散式网络的关键使能因素(Rö mer et al .,2012)。此外,智能电表有助于检测欺诈,降低电力供应商和消费者的成本。一项研究估计,全球电力供应商每年因窃电损失约 250 亿美元,由于发电量增加和缺乏回收二氧化碳的资金,这也导致二氧化碳排放量增加。即使是部分缓解也能降低电力公司和消费者的成本,减少二氧化碳排放,增加社会福利(Depuru 等人,2011a)。

除此之外,消费者还受益于更高的电力消费透明度、为物联网中心的计量基础设施重新定位的灵活性,为其他智能服务和新的商业模式提供动力,例如允许离家为电动汽车充电(Veale,2017)。

道德挑战

道德挑战可以分为三个主要领域:隐私、缺乏透明度、同意和权力。

隐私。

乍一看,人们可能不会将用电量归类为特别敏感的数据。然而,精确的仪表读数可以用来确定一个人是否在家,在什么时间使用哪些电器(莫利纳-马卡姆等人,2010 年),你是否让电器超过要求的时间,甚至建筑物的特征(贝克尔等人,2014 年)。因此,用户日常生活的隐私细节可能会被暴露,并以侵犯个人隐私的方式使用(Quinn,2009)。

谓缺乏透明度。

例如,征收新关税的机会引发了透明度问题。假设我的邻居和我的价格不同,即使我们有相同的单位面积和数据参数。这种差异是因为我周末用的电比她多吗?什么数据定义关税模型?

同意和权力。

新的关税模型可能会将数据粒度与关税价格联系起来。换句话说,数据越细,资费越便宜。因此,消费者可以用隐私换取电费,这可能会推动低收入家庭同意更多的数据共享(Veale,2017)。

然而,在同意分享之前,消费者首先需要理解并能够访问这些数据。尼森鲍姆(2011)将这个问题称为透明悖论:低水平数据难以理解,汇总统计数据隐藏了关键细节——我们无法在不放弃另一个的情况下实现一个。

3.批判性分析

我不想提供克服所讨论的挑战的具体建议,而是想用以下方法批判性地分析第 2 部分中讨论的挑战:统计分析、权衡而不是完美、数据的伦理(个人和群体隐私)以及实践的伦理。

3.1.康派斯牌衬衫

统计分析

回到涉及 Northpointe 和 ProPublica 的辩论,我们建立了两个前提:

  • 无论种族如何,每个风险类别中重新犯罪的被告比例应该大致相同(Northpointe 对公平的定义)。
  • 没有再犯的黑人被告被认为比他们的白人同行更危险(ProPublica 的批评)。

缺少的一条信息是,黑人被告的总体累犯率高于白人被告(52%比 39%)(Corbett-Davies 等人,2016 年)。这意味着,为了满足 Northpointe 对公平的定义,我们说过改变这一定义是有问题的,从数学上来说,对于最终没有再次犯罪的被告,黑人被告被分配更高的风险水平——该模型代表了数据集中的偏斜。

这并不意味着我们应该忽视 ProPublica 的观点,而是应该与包括立法者、法官和公民在内的利益相关者就哪些算法应该优先考虑以及可以引入哪些替代政策进行公开讨论。例如,新的跟踪技术可以使保释要求变得无用,这样就不会有人被不必要的监禁。

取舍而非完美。

COMPAS 不能做出完美的决策,但是我们不能期望它没有偏见和副作用。完美是一个追求的方向,但是当我们务实地比较有 COMPAS 的法院系统和没有 COMPAS 的法院系统时,前者似乎具有更好的利益与挑战之比(Baase,2012)。我们仍应寻求改进,例如终止与 Northpointe 的合作,在美国政府内部开发类似的软件工具,并防止商业秘密的困境。政府可以公布算法细节以确保透明度。

3.2.智能电表

数据伦理学。

最紧迫的个人隐私挑战是重新识别和实时监控。这些可以通过例如将所有数据存储在设备上来减轻,直到在消费发生一天后传输总消费数据。这种方法降低了信息价值,但增加了隐私,同时仍然允许前面讨论的好处。电力供应商寻求高粒度的数据,但无论消费者的收入水平如何,法律都应确保数据粒度不能越过个人尊严屈服于电力供应商要求的界限(Warren 和 Brandeis,1890)。

欧盟委员会(2014 年)在 2014 年宣布,到 2020 年,28 个成员国中的 16 个将大规模(80%或以上)覆盖智能电表。数据粒度、安全机制和应急计划等关键主题尚未得到解决。

例如,计量数据可以根据特定的消费模式(例如工作日与周末)将人们分类。保护个人隐私并不一定意味着保护群体隐私。人群可能成为罪犯的诱人目标,例如周末用电量较少的市民,暗示他们不在家。Floridi 认为,当前的政策框架(如当前的欧洲立法)过于以人类为中心(强调自然人)和原子论(只考虑单个个人),无法确保群体隐私。法律保护个人隐私和社会隐私,但不保护社会群体的隐私。Floridi (2015 年)认为,这种新法律需要调和两种道德义务:改善人类福利和促进人权隐私权。有时,保护个体的唯一方式是保护群体,就像一个渔民带着一群沙丁鱼一样——他试图抓住鱼群,而不是个体沙丁鱼(Floridi,2014)。

实践伦理。

传统的伦理分析可能会提出一个道义上的行为准则,关于什么是道德的,什么不是。然而,我们处在一个应用伦理学的环境中,在这种环境中,结果主义的方法更合适。这是因为新技术带来了新问题,而旧方法对这些问题的价值有限。政策可能导致不可预见的后果,因此需要一个灵活的政策框架,允许快速和频繁的适应。这种框架的一个例子是英国内阁办公室部长(2016) 数据科学道德框架,旨在通过建立六项对比公共利益和项目风险的关键原则,使创新更加容易。这是一份简单易懂的文件。

4.结论

总之,本文对问题进行了批判性分析,并围绕 COMPAS 和智能电表作为应用数据科学的例子展开了辩论。确定的挑战包括不公平的歧视、强化人类偏见(COMPAS)、隐私、同意和权力(智能电表)以及缺乏透明度(两者都有)。批判性分析使用了统计分析、权衡而非完美(COMPAS)、个人和群体隐私以及实践道德(智能仪表)等方法。

让我们回到开篇提出的问题:应该允许电力供应商向消费者施压,用隐私换取金钱吗?。考虑到所讨论的方法,政策制定者需要给予消费者最低程度的隐私,无论其经济状况如何。找到合适的水平需要公开的公共讨论(参见 COMPAS)和灵活的政策框架(参见 smart meters)。

你还想到了其他什么应用?

5.文献学

Angwin,j . n . d .样本-对比-风险-评估-对比-“核心”。ProPublica。

Angwin,j .,Larson,j .,Mattu,s .,Kirchner,l .,2016。机器偏差。全国各地都有用来预测未来罪犯的软件。而且对黑人有偏见。ProPublica。

Baase,s .,2012 年。火的礼物:计算技术的社会、法律和伦理问题,第 4 版。由…编辑新泽西州上萨德尔河皮尔逊。

贝克尔,c .,萨达莫里,l .,斯塔克,t .,桑蒂尼,s .,2014 年。从智能电表数据揭示家庭特征。能量 78,397–410。【https://doi.org/10.1016/j.energy.2014.10.025

科比特-戴维斯,s .,皮尔森,e .,费勒,a .,戈埃尔,s .,2016。一个用于保释和判决的计算机程序被贴上了对黑人有偏见的标签。其实没那么清楚。华盛顿州贴吧。

Danziger,s .,Levav,j .,Avnaim-Pesso,l .,2011 年。司法判决中的外部因素。继续。自然。阿卡德。Sci。108, 6889–6892.https://doi.org/10.1073/pnas.1018033108

德普鲁,s . s . s . s . r .,王,l .,天尊菩萨,v .,2011a。窃电——概述、问题、预防和基于智能电表的防窃电方法。能源政策,关于海上风力发电规划、经济和环境的特殊章节 39,1007–1015。https://doi.org/10.1016/j.enpol.2010.11.037

Depuru,s . s . s . s . r .,Wang,l .,Devabhaktuni,v .,n . 2011 b。面向电网的智能电表——挑战、问题、优势和现状,载于:2011 年 IEEE/PES 电力系统会议和博览会。发表于 2011 年 IEEE/PES 电力系统会议暨博览会,第 1–7 页。https://doi.org/10.1109/PSCE.2011.5772451

Epps,g .,2017。最高法院在陪审团室直面种族主义。大西洋。

欧盟委员会,2014 年。以电力为重点,对 EU-27 中的智能计量部署进行基准测试。

印第安纳州鲍姆加特市芬斯特,2015 年。隐私感知智能计量:一项调查。IEEE Commun。Surv。家教。17, 1088–1101.https://doi.org/10.1109/COMST.2015.2425958

佛罗里达州弗洛里迪,2015 年。信息伦理,再版。由…编辑牛津大学出版社,牛津。

佛罗里达州弗洛里迪,2014 年。开放数据、数据保护和群体隐私。菲洛斯。技术。27, 1–3.https://doi.org/10.1007/s13347-014-0157-8

Jawurek,m .,Kerschbaum,f .,Danezis,g .,2012 年。SoK:智能电网的保密技术——选项调查。

兰尼博士,2001 年。3D 数据管理:控制数据量、速度和多样性。

拉尔森,j .,马特图,s .,基什内尔,l .,安格温,j .,2016。我们如何分析 COMPAS 累犯算法?ProPublica。

利普塔克,2017 年。被一个软件程序的秘密算法送进了监狱。纽约时报。

内阁办公室部长,2016 年。数据科学道德框架— GOV.UK

2016 年,米特斯塔特大学,法学学士,阿洛大学,轩辕洛尹大学,沃希特大学,洛里迪大学。算法的伦理:绘制辩论图。大数据 Soc。3, 2053951716679679.https://doi.org/10.1177/2053951716679679

莫利纳-马卡姆,a .,谢诺伊,p .,傅,k .,切切特,e .,欧文,d .,2010。智能电表私人回忆录,载于:第二届 ACM 建筑节能嵌入式传感系统研讨会会议录,BuildSys '10。美国纽约州纽约市 ACM,第 61-66 页。【https://doi.org/10.1145/1878431.1878446

h .尼森鲍姆,2011 年。在线隐私的情境方法。代达罗斯 140,32–48。https://doi.org/10.1162/DAED_a_00113

奎因,2009 年。隐私和新能源基础设施(SSRN 学术论文编号 ID 1370731)。纽约州罗切斯特市社会科学研究网络。

Rö mer,b .,Reichhart,p .,Kranz,j .,皮科特,a .,2012 年。智能计量和分散式电力存储在智能电网中的作用:正外部性的重要性。能源政策,特别部分:过去和未来的能源转变——历史的洞察力 50,486–495。https://doi.org/10.1016/j.enpol.2012.07.047

Schermer,B.W .,2011 年。自动剖析和数据挖掘中的隐私限制。计算机。法律安全。修订版 27,45–52。https://doi.org/10.1016/j.clsr.2010.11.009

2017 年州诉卢米斯案。。哈维。法律修订

科罗拉多州最高法院,2017 年。佩纳-罗德里格斯诉科罗拉多(教学大纲)。

威斯康星州最高法院,2016 年。埃里克. l .卢米斯诉威斯康星。

Swets,J.A .,Dawes,R.M .,Monahan,j .,2000 年。心理科学可以改善诊断决策。心理学。Sci。公共利益 1,1–26。https://doi.org/10.1111/1529-1006.001

维勒,硕士,2017。数据管理和使用:技术和治理案例研究——为英国科学院和皇家学会编写。

沃伦,法学博士,布兰代斯,法学博士,1890 年。隐私权。哈维。法律修订版 4,193–220。https://doi.org/10.2307/1321160

BERT 解释道:NLP 的艺术语言模型

原文:https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270?source=collection_archive---------0-----------------------

BERT(来自变压器的双向编码器表示)是谷歌人工智能语言的研究人员最近发表的一篇论文。它在各种各样的 NLP 任务中展示了最先进的结果,包括问答(SQuAD v1.1)、自然语言推理(MNLI)等,从而在机器学习社区中引起了轰动。

BERT 的关键技术创新是将 Transformer(一种流行的注意力模型)的双向训练应用于语言建模。这与以前从左到右或者结合从左到右和从右到左训练来查看文本序列的努力形成对比。论文的研究结果表明,双向训练的语言模型比单向训练的语言模型具有更深的语境感和语流感。在论文中,研究人员详细介绍了一种名为掩蔽 LM (MLM)的新技术,它允许在模型中进行双向训练,这在以前是不可能的。

背景

在计算机视觉领域,研究人员已经多次展示了迁移学习的价值——在已知任务(例如 ImageNet)上预先训练神经网络模型,然后进行微调——使用经过训练的神经网络作为新的特定目的模型的基础。近年来,研究人员已经表明,类似的技术在许多自然语言任务中是有用的。

另一种不同的方法是基于特征的训练,这种方法在 NLP 任务中也很流行,并在最近的 ELMo 论文中举例说明。在这种方法中,预先训练的神经网络产生单词嵌入,然后将其用作 NLP 模型中的特征。

伯特是如何工作的

BERT 使用 Transformer,这是一种学习文本中单词(或子单词)之间上下文关系的注意力机制。一般来说,Transformer 包括两个独立的机制——一个读取文本输入的编码器和一个为任务生成预测的解码器。由于 BERT 的目标是生成一个语言模型,所以只有编码器机制是必要的。谷歌在的一篇论文中描述了 Transformer 的详细工作原理。

与顺序读取文本输入(从左到右或从右到左)的方向模型相反,Transformer 编码器一次读取整个单词序列。因此,它被认为是双向的,虽然说它是非定向的会更准确。这一特性允许模型基于单词的所有周围环境(单词的左侧和右侧)来学习单词的上下文。

下图是变压器编码器的高级描述。输入是一系列标记,这些标记首先被嵌入到向量中,然后在神经网络中进行处理。输出是大小为 H 的向量序列,其中每个向量对应于一个具有相同索引的输入令牌。

当训练语言模型时,存在定义预测目标的挑战。许多模型预测序列中的下一个单词(例如,“孩子从 __”回家),这是一种方向性的方法,固有地限制了上下文学习。为了克服这一挑战,BERT 采用了两种训练策略:

蒙面 LM (MLM)

在将单词序列输入 BERT 之前,每个序列中 15%的单词被替换为一个[MASK]标记。然后,该模型尝试根据序列中其他未屏蔽单词提供的上下文来预测屏蔽单词的原始值。在技术术语中,输出字的预测需要:

  1. 在编码器输出之上添加分类层。
  2. 将输出向量乘以嵌入矩阵,将它们转换到词汇维度。
  3. 用 softmax 计算词汇中每个单词的概率。

BERT 损失函数只考虑屏蔽值的预测,而忽略非屏蔽字的预测。因此,该模型比方向模型收敛得更慢,这一特性被其增强的上下文感知所抵消(参见要点 3)。

注意:在实践中,BERT 实现稍微复杂一些,并不能取代所有的 15%屏蔽字。更多信息参见 附录 A

下一句预测(NSP)

在 BERT 训练过程中,模型接收句子对作为输入,并学习预测句子对中的第二个句子是否是原始文档中的后续句子。在训练期间,50%的输入是一对,其中第二个句子是原始文档中的后续句子,而在另外 50%中,从语料库中随机选择一个句子作为第二个句子。假设随机句子将与第一个句子断开。

为了帮助模型在训练中区分这两个句子,输入在进入模型之前以下列方式处理:

  1. 在第一个句子的开头插入一个[CLS]标记,在每个句子的结尾插入一个[SEP]标记。
  2. 指示句子 A 或句子 B 的句子嵌入被添加到每个记号。句子嵌入在概念上类似于词汇为 2 的标记嵌入。
  3. 向每个标记添加位置嵌入,以指示其在序列中的位置。Transformer 论文中介绍了位置嵌入的概念和实现。

Source: BERT [Devlin et al., 2018], with modifications

为了预测第二个句子是否确实与第一个句子相关联,执行以下步骤:

  1. 整个输入序列经过变压器模型。
  2. 使用简单的分类层(权重和偏差的学习矩阵),将[CLS]令牌的输出转换成 2×1 形状的向量。
  3. 用 softmax 计算 IsNextSequence 的概率。

在训练 BERT 模型时,屏蔽 LM 和下一句预测一起训练,目标是最小化两种策略的组合损失函数。

如何使用 BERT(微调)

使用 BERT 完成特定任务相对简单:

BERT 可以用于各种各样的语言任务,同时只在核心模型中增加了一个小的层:

  1. 通过在[CLS]令牌的转换器输出之上添加分类层,类似于下一句分类来完成诸如情感分析的分类任务。
  2. 在问题回答任务中(例如,SQuAD v1.1),软件接收关于文本序列的问题,并被要求在序列中标记答案。使用 BERT,可以通过学习标记答案开始和结束的两个额外向量来训练问答模型。
  3. 在命名实体识别(NER)中,软件接收文本序列,并被要求标记文本中出现的各种类型的实体(人、组织、日期等)。使用 BERT,可以通过将每个令牌的输出向量馈送到预测 NER 标签的分类层来训练 NER 模型。

在微调训练中,大多数超参数保持与 BERT 训练中相同,本文对需要调整的超参数给出了具体指导(第 3.5 节)。BERT 团队已经使用这种技术在各种具有挑战性的自然语言任务上实现了最先进的结果,详见本文的第 4 部分。

外卖食品

  1. 模型的大小很重要,即使是大规模的。 BERT_large,拥有 3.45 亿个参数,是同类型中最大的模型。在小规模任务上,它明显优于 BERT_base,后者使用相同的架构,只有 1 . 1 亿个参数。
  2. 有了足够的训练数据,更多的训练步数==更高的准确率。例如,在 MNLI 任务上,当在 1M 步(128,000 字批量大小)上训练时,与相同批量大小的 500K 步相比,BERT_base 准确度提高了 1.0%。
  3. 伯特的双向方法(MLM)比从左到右的方法收敛得慢(因为每批中只有 15%的单词被预测),但是在少量的预训练步骤之后,双向训练仍然优于从左到右的训练。

Source: BERT [Devlin et al., 2018]

计算考虑因素(培训和应用)

结论

BERT 无疑是机器学习用于自然语言处理的一个突破。事实上,它的平易近人,并允许快速微调,将有可能允许在未来广泛的实际应用。在这个总结中,我们试图描述论文的主要思想,而不是淹没在过多的技术细节中。对于那些希望更深入了解的人,我们强烈建议阅读全文和其中引用的辅助文章。另一个有用的参考是 BERT 源代码和模型,它们涵盖了 103 种语言,并由研究团队慷慨地作为开源发布。

附录 A —单词屏蔽

在 BERT 中训练语言模型是通过预测输入中随机选取的 15%的标记来完成的。这些标记经过如下预处理— 80%替换为“[MASK]”标记,10%替换为随机单词,10%使用原始单词。促使作者选择这种方法的直觉如下(感谢来自 Google 的 Jacob Devlin 的洞察力):

  • 如果我们 100%的时间都使用[MASK],那么这个模型不一定能为非屏蔽单词产生良好的表征。未屏蔽的标记仍然用于上下文,但是该模型被优化用于预测屏蔽的单词。
  • 如果我们在 90%的时间里使用[掩码],在 10%的时间里使用随机单词,这将告诉模型观察到的单词是永远不会正确的。
  • 如果我们在 90%的时间里使用[MASK],在 10%的时间里保留同一个单词,那么这个模型就可以简单地复制非上下文嵌入。

这种方法的比率没有进行消融,不同的比率可能效果更好。此外,模型性能并没有通过简单地屏蔽 100%的所选令牌来测试。

关于最近机器学习研究的更多总结,请查看 Lyrn。AI

除了单词嵌入,为什么你需要知道字符嵌入?

原文:https://towardsdatascience.com/besides-word-embedding-why-you-need-to-know-character-embedding-6096a34a3b10?source=collection_archive---------1-----------------------

Photo by Kai D. on Unsplash

2013 年,Tomas Mikolov [1]引入了单词嵌入来学习更好的单词质量。那时,单词嵌入是处理文本的最新技术。后来,也引入了 doc2vec。如果我们从另一个角度思考呢?不是从一个单词到一个文档的聚合,而是从一个字符到一个单词的聚合。

在这篇文章中,你将经历什么,为什么,什么时候以及如何进行字符嵌入。

什么?

项和扬恩[2]介绍了人物 CNN。他们发现字符包含了改善模型性能的关键信号。在本文中,字符表定义了 70 个字符,其中包括 26 个英文字母、10 个数字、33 个特殊字符和换行符。

Capture from Text Understanding from Scratch (Xiang and Yann, 2016)

# Copy from Char CNN paperabcdefghijklmnopqrstuvwxyz0123456789 -,;.!?:’’’/\|_@#$%ˆ&*˜‘+-=()[]{}

另一方面,Google Brain 团队引入了探索语言建模的极限并发布了 lm_1b 模型,该模型包含 256 个向量(包括 52 个字符、特殊字符),维数仅为 16。与单词嵌入相比,维数可以增加到 300,而向量的数量是巨大的。

Capture from Exploring the Limits of Language Modeling ( Rafal et al., 2016)

为什么?

在英语中,所有的单词都是由 26 个字符组成的(如果同时包含大小写字符,则为 52 个字符,如果包含特殊字符,则为更多)。有了字符嵌入,每个单词的向量都可以形成,即使是未登录词(可选)。另一方面,单词嵌入只能处理那些看到的单词。

Another benefit is that it good fits for misspelling words, emoticons, new words (e.g. In 2018, Oxford English Dictionary introduced new word which is boba tea 波霸奶茶. Before that we do not have any pre-trained word embedding for that).

它比 word2vec 嵌入更好地处理不常用的单词,因为后者缺乏足够的训练机会来训练这些不常用的单词。

第三个原因是,由于只有少量的向量,它降低了模型的复杂性并提高了性能(就速度而言)

什么时候?

在 NLP 中,我们可以将字符嵌入应用于:

怎么会?

字符嵌入

  1. 定义一个列表中的一个字符(即 m)。例如,可以使用字母数字和一些特殊字符。对于我的例子,英语字符(52),数字(10),特殊字符(20)和一个未知字符,UNK。总共 83 个字符。
  2. 将字符转换为 1-hot 编码,得到一个向量序列。对于未知字符和空白字符,用全零向量代替。如果超过预定义的最大字符长度(即 l),则忽略它。每个字符的输出是 16 维向量。
  3. 使用 3 个 1D CNN 层(可配置)来学习序列

句子嵌入

  1. 双向 LSTM 遵循 CNN 层
  2. LSTM 之后添加了一些辍学层。

密码

这个示例代码将演示如何使用字符嵌入来进行分类。测试数据集可以在 UCI ML 知识库中找到。

预处理

首先,我们需要准备元信息,包括字符字典和将标签从文本转换为数字(因为 keras 只支持数字输入)。

preporcess(labels=df['category'].unique())

输出

-----> Stage: preprocess
Totoal number of chars: 83
First 3 char_indices sample: {';': 0, '"': 1, 'A': 2}
First 3 indices_char sample: {0: ';', 1: '"', 2: 'A'}
Label to Index:  {'b': 0, 'e': 2, 'm': 3, 't': 1}
Index to Label:  {0: 'b', 1: 't', 2: 'e', 3: 'm'}

流程

我们必须将原始输入训练数据和测试转换为 keras 输入的 numpy 格式

x_train, y_train = char_cnn.process(
    df=train_df, x_col='headline', y_col='category')
x_test, y_test = char_cnn.process(
    df=test_df, x_col='headline', y_col='category')

输出

-----> Stage: process
Number of news: 100
Actual max sentence: 3
Train Shape:  (100, 5, 256) (100,)
-----> Stage: process
Number of news: 10
Actual max sentence: 1
Train Shape:  (10, 5, 256) (10,)

建立模型

利用 CNN 层和双向 LSTM 构建字符 CNN 文本分类器。首先,用一维 CNN 建立字符块

def _build_character_block(
    self, block, dropout=0.3, 
    filters=[64, 100], kernel_size=[3, 3], 
    pool_size=[2, 2], padding='valid', activation='relu', 
    kernel_initializer='glorot_normal'):

    for i in range(len(filters)):
        block = Conv1D(
            filters=filters[i], kernel_size=kernel_size[i],
            padding=padding, activation=activation,
            kernel_initializer=kernel_initializer)(block) block = Dropout(dropout)(block)
        block = MaxPooling1D(pool_size=pool_size[i])(block) block = GlobalMaxPool1D()(block)
    block = Dense(128, activation='relu')(block)
    return block

句子级别块将使用 3 个字符块构建

def _build_sentence_block(
    self, max_len_of_sentence, max_num_of_setnence, 
    filters=[[100, 200, 200], [200, 300, 300], [300, 400, 400]], 
    kernel_sizes=[[4, 3, 3], [5, 3, 3], [6, 3, 3]], 
    pool_sizes=[[2, 2, 2], [2, 2, 2], [2, 2, 2]],
    dropout=0.4):

    sent_input = Input(shape=(max_len_of_sentence, ), dtype='int64')
    embedded = Embedding(self.num_of_char, char_dimension,
        input_length=max_len_of_sentence)(sent_input)

    blocks = []
    for i, filter_layers in enumerate(filters):
        blocks.append(
            self._build_character_block(
                    block=embedded, filters=filter_layers,
                    kernel_size=kernel_sizes[i],
                    pool_size=pool_sizes[i])
            ) sent_output = concatenate(blocks, axis=-1)
    sent_output = Dropout(dropout)(sent_output)
    sent_encoder = Model(inputs=sent_input, outputs=sent_output) return sent_encoder

最后,我们将根据句子建立文档块

def _build_document_block(
    self, sent_encoder, max_len_of_sentence, max_num_of_setnence, 
    num_of_label, dropout=0.3, 
    loss='sparse_categorical_crossentropy', optimizer='rmsprop',
    metrics=['accuracy']):

    doc_input = Input(shape=(
        max_num_of_setnence, max_len_of_sentence), dtype='int64')
    doc_output = TimeDistributed(sent_encoder)(doc_input)
    doc_output = Bidirectional(LSTM(
        128, return_sequences=False, 
        dropout=dropout))(doc_output) doc_output = Dropout(dropout)(doc_output)
    doc_output = Dense(128, activation='relu')(doc_output)
    doc_output = Dropout(dropout)(doc_output)
    doc_output = Dense(
        num_of_label, activation='sigmoid')(doc_output) doc_encoder = Model(inputs=doc_input, outputs=doc_output)
    doc_encoder.compile(
        loss=loss, optimizer=optimizer, metrics=metrics)
    return doc_encoder

输出

训练

train(x_train, y_train, x_test, y_test, epochs=10)

输出

结论

你可以从 github 中找到所有代码。

字符嵌入是解决大量文本分类的绝妙设计。它解决了一些单词嵌入问题。字符嵌入和单词嵌入的区别在于,字符嵌入可以构建任何单词,只要包含这些字符。

脸书艾研究(尚可)做了更进一步。小组使用子词来训练模型。以“脸书”为例,他们用“F”、“Fa”、“Fac”等来训练单词。关于 fasttext 的详细信息,您可以访问他们的网站以便更好地了解。

这是对字符嵌入的一些评论,因为它不包括任何词义,而只是使用字符。我们可以同时包括字符嵌入和单词嵌入来解决我们的 NLP 问题。

额外材料

用于信息检索的卷积池结构潜在语义模型

学习词性标注的字符级表示

用于文本分类的字符级卷积网络

情感分析中的人物级深度学习

关于我

我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。你可以通过媒体博客LinkedInGithub 联系我。

参考

[1]托马斯·米科洛夫、格雷戈·科拉多、程凯和杰弗里·迪恩。向量空间中单词表示的有效估计。2013 年 9 月。https://arxiv.org/pdf/1301.3781.pdf

[2]张翔,颜乐存。文本理解从零开始。2016.https://arxiv.org/pdf/1502.01710v5.pdf

[3]金伊、杰尼特伊、桑塔格、拉什..字符感知神经语言模型。2015.https://arxiv.org/pdf/1508.06615.pdf

按城市划分的最佳和最差租赁时间

原文:https://towardsdatascience.com/best-and-worst-times-to-rent-by-city-f19aaa1378ae?source=collection_archive---------1-----------------------

寻找一个新的公寓或晚上更新你的租约是我们许多人每年都必须参与的一些更有压力的事件。一部分原因是每天都可能发生的租金定价的剧烈波动。特别是对于长期租赁,即使是轻微的租金价格上涨也意味着租赁期内的一笔巨款。利用 Zillow 提供的逐月单居室租金数据,我们来看看一些与租金相关的指标:
美国顶级城市租金最贵和最便宜的月份
年同比租金价格趋势
每个市场的价格波动幅度

下面我将呈现一些最有趣的全国范围内的见解,但如果你有兴趣查看特定的州或城市,我强烈推荐你访问我的 免费互动仪表板 ,以便更深入地挖掘你感兴趣的地点。

租金最贵的城市:一居室租金定价——按月租金中位数(美元)排序

看看排名前 50 位的市场,通常都是顶级玩家。大城市和硅谷位居前列,前五大市场的一居室公寓平均月租金超过 2000 美元!旧金山以每月 3480 美元的租金中位数领先,这似乎很荒谬。然而,这五大市场的租金中值增幅不超过 1.7%(纽约),实际上旧金山、圣何塞和波士顿的租金有所下降(我知道你在想什么,“太便宜了!”).那么,如果这些顶级市场没有继续暴涨,那么哪些市场会继续暴涨呢?

上涨的租金成本:单卧室租金定价——按租金中值的同比变化排序

当查看前 50 个市场中哪个经历了最大的年同比增长时,北卡罗来纳州和加利福尼亚州占据了前 5 名。北卡罗来纳州城市罗利和夏洛特的增长率分别为 29%和 14.5%。在加州,萨克拉门托、阿纳海姆和长滩的同比增幅分别为 14.5%、14.3%和 14.0%。

定价可变性:单卧室租金定价——按月定价可变性排序

我为此分析的另一件事是定价的每月可变性。为此,我查看了每个城市最贵月的租金中位数和最便宜月的租金中位数之间的差异,并将该差异除以 2016 年的租金中位数。田纳西州的孟菲斯以 30.2%的可变性击败竞争对手,紧随其后的是底特律(22.7%)。这两个城市的月租金都相对较低(月租金中位数都在 700 美元以下),但排名第三的阿纳海姆的月租金变动率为 18.9%(最便宜的月份(仍为 1575 美元)和最贵的月份(1883 美元)相差 308 美元)。另一个值得一提的是旧金山,排在前十名之外。在 12 月(3100 美元)和 2 月(3635 美元)租公寓有 535 美元的月差。尽管如此,引用北加州人的话说,即使是最便宜的月租金 3100 美元也是“海拉贵”。

当观察排名最前的所有 272 个城市时,发现平均而言,租金最便宜的月份是 1 月和 12 月,其中 34.2%的城市有最便宜的月份。租金最贵的时间往往是在夏季的中心(9 月是 13.1%的城市租金最贵的月份,紧随其后的是 6 月和 7 月。

现在让我们来看看排名前 100 的市场,这些市场被贴上了一居室租金最便宜的月份的标签。瓷砖按州进行了着色:

现在,这些只是一些样本见解,但我已经建立了一个交互式仪表板,供您在 Tableau Public 上访问和互动,以便您可以更深入地了解您最关心的州和城市。点击此处查看!

要阅读更多关于公立学校免费餐项目、NBA 出勤率和旅游业的数据报道,请点击这里!

最佳和最差租赁月份(美国前 30 大市场):

纽约纽约纽约房租最便宜的月份:12 月(比纽约房租中位数低 5)
纽约房租最贵的月份:10 月(比纽约房租中位数高 7)
加州洛杉矶
洛杉矶房租最便宜的月份:12 月(比洛杉矶房租中位数低 7)
洛杉矶房租最贵的月份:4 月(比洛杉矶房租中位数高 1)
芝加哥、 伊利诺伊州
芝加哥房租最便宜的月份:7 月(比芝加哥房租中位数低 3)
芝加哥房租最贵的月份:2 月(比芝加哥房租中位数高 11)
德克萨斯州休斯顿
休斯顿房租最便宜的月份:11 月(比休斯顿房租中位数低 9)
休斯顿房租最贵的月份:1 月(比休斯顿房租中位数高 8)
费城、 宾夕法尼亚州
费城房租最便宜的月份:1 月(比费城房租中位数低 3)
费城房租最贵的月份:5 月(比费城房租中位数高 4)
亚利桑那州凤凰城
凤凰城房租最便宜的月份:12 月(比凤凰城房租中位数低 5)
凤凰城房租最贵的月份:6 月(比凤凰城房租中位数高 7)
拉斯维加斯、 内华达州
拉斯维加斯房租最便宜的月份:7 月(比拉斯维加斯房租中位数低 2)
拉斯维加斯房租最贵的月份:6 月(比拉斯维加斯房租中位数高 3)
德克萨斯州圣安东尼奥
圣安东尼奥房租最便宜的月份:12 月(比圣安东尼奥房租中位数低 4)
圣安东尼奥房租最贵的月份:3 月(比圣安东尼奥房租中位数高 3%)

要查看其他几大城市房租最便宜和最贵的月份,请前往 我的网站

感谢您阅读我最新的数据帖子。作为一名产品营销和数据分析专业人士,我对数据支持的讲故事充满热情。这些数据新闻帖子是我将真实数据与我个人的不同兴趣整合起来的方式,这些兴趣包括从旅行和娱乐到经济和社会问题的任何事情。
如果您有任何评论、故事想法或预期的数据项目,请随时发送电子邮件至 dwpwriting <至> gmail < dot > com 或通过
LinkedIn联系我。

原载于 2017 年 12 月 3 日【dwpeterson.com】

最佳书架:用 D3.js 改编真实世界对象的数据可视化

原文:https://towardsdatascience.com/best-bookshelf-data-visualization-adapting-real-world-objects-with-d3-js-ca420b5d79cc?source=collection_archive---------6-----------------------

这个项目是关于数据可视化项目,最好的书架。

[## 最佳书架

1996 年以来《纽约时报》评选的最佳书籍的数据可视化。由谭永金创作。由…提供动力

tany.kim](http://tany.kim/best-bookshelf)

当你听到“数据可视化”时,第一个想到的视觉形式是什么?条形图还是折线图?一些更奇特的东西,比如热图或者定向网络?虽然这些经过验证的可视化技术已被广泛用于有效地交流数据,但独特的视觉形式可以更好地实现主题匹配,并且可以简单地在视觉上更令人愉悦,而不会牺牲数据可视化最重要的作用——将数字真实地编码为视觉元素。

这篇文章是关于我最近的数据可视化项目最佳书架的设计过程。我将书籍和作者数据可视化,以适应现实世界中的物体、书籍和书架。改编有三个方面。

  1. 每本书的数据维度被编码到一本书的物理属性中。
  2. 分组和排序书籍的方式类似于书架上存放书籍的各种规则(每个人都有她或他自己的方式!).
  3. 交互和跟随动画复制了在书架上拿起和移动书籍的动作。

How would you organize your books on the bookshelf? (source)

Curious to know what the height, width, diagonal lines, tags, and colors mean? How would you organize books?

《纽约时报》最佳书籍及其元数据

我关心我花时间看的内容的质量。在找好书推荐的时候,偶然看到一篇文章,《纽约时报》的2016 年 10 本最好的书。从这开始,我列出了从 1996 年开始的所有最好的书,那是 NYT 第一次宣布最好/最著名的书。后来,利用Goodreads API纽约时报图书 API (当然还有手工填写电子表格),我收集了每本书及其作者的元数据。Python 脚本可以在我的 GitHub repo 获得。

最终,我有了 206 本书和 184 个作者。数据集包括以下字段。在这里,我按数据类型列出了它们——它们是在设计过程中将被可视化编码的东西。

名义数据

  • 书名:如《房间》
  • 作者姓名:如爱玛·多诺霍
  • 出版商:例如,利特尔、布朗和公司

分类数据—每种类型有两个值

  • 体裁:小说和非小说
  • 作者性别:女性或男性
  • 畅销书:要么这些书是纽约时报的畅销书,要么不是
  • 语言:原文为英文或翻译

定量数据—序数

  • 选择年份:例如,2010 年
  • 出版和原始出版日期
  • 作者的出生日期:如 1969 年 10 月 24 日
  • 作者死亡日期:可以为空

定量数据—连续

  • 页数
  • 给图书评分的 Goodreads 用户数
  • 平均阅读评分
  • 最初出版时作者的年龄:从最初出版日期和出生/死亡日期开始计算。
  • 书名的长度

数据集的初步检查

在可视化设计的早期阶段,我通常会快速检查数据集,看看是否有什么有趣的模式。我使用的一些常用方法是带有 ggplot 的 R 和带有 Matplotlib 或 SeabornPython。为了这个项目,我也尝试了 Tableau Public 。通过这项初步工作,我从数据集中发现了一些事实。举几个例子,我看到大多数书的页数在 200-400 页之间;小说的作者比非小说的作者年龄范围更广。从过去 11 年的数据来看,我并没有看到作者性别的不平衡(但是你会在文章的最后看到一些不同的东西!).

Age of author at publication & Number of pages, generated with Python Matplotlib

Gender of authors of the best books from 1996 to 2006

另外,我按年创建了小倍数。这是用 D3.js 做的。

Small multiples: visualizing best books by year

在这一点上,我不相信数据集对于一个交互式可视化项目来说是足够引人注目的。老实说,尽管我在生成数据集方面付出了努力,但我还是对继续这个项目持怀疑态度。

来自日常物品的设计灵感

我承认简单地在二维图表上绘制图书并不有趣,我开始考虑一种不同的方法——根据不同的数据维度列出和过滤图书。这样,作为数据点的书籍可以以线性方式显示;然后我意识到这正是人们整理书架上书籍的方式。

将数据字段编码成书籍的物理属性

在一本书的物理属性中,我重点关注了当一本书被垂直放在书架上时可以实际看到的那些属性。你只会看到书脊是一个细长的长方形,其宽度由页数决定(假设纸张厚度相同)。因此,将页面数量编码成矩形宽度是一个直观的决定。高度的决定是相当武断的,但我希望它是现实的;物理属性的维度可以代表一个数据字段的范围。在连续的数据维度中,我发现所有书籍的平均 Goodreads 评分大多在五分之三以上。从之前的数据检查中,我发现作者在出版时的年龄在可视化时会很有趣。因此,这个连续的变量在脊柱上呈现为半透明的覆盖层。带有 D3 和 Lodash 的 javascript 代码如下所示:

const storyH = 100; //same as maximum book height
const bookWRange = [10, 60]; //book thickness
const bookHRange = [60, storyH]; //book height rangeconst pages = books.map((d) => d.book.pages);
const pageRange = getRange(pages, 100);
const ageRange = getRange(ages, 10);//pages to width
const bookW = d3.scaleLinear().domain(pageRange).range(bookWRange); //average rating to height
const bookH = d3.scaleLinear().domain([3, 5]).range(bookHRange); //age to overlayed height
const middleH = d3.scaleLinear().domain(ageRange)
    .range([10, bookHRange[0]]);//get floor/ceiling range
function getRange(arr, by) {
  return [
    Math.floor(_.min(arr) / by) * by, 
    Math.ceil(_.max(arr) / by) * by
  ];
}

在数据集中,有四种分类数据。我想把这一点也编码到书的其他物理属性中。所有这些维度都是二元的,或者有两个可能的值。体裁用颜色区分(绿色代表小说,红色代表非小说)。女作家的书充满了斜线(性别通常用颜色来表示,但我想避免太传统的东西。《纽约时报》的畅销书都标有一颗星。已翻译的图书会在左上角突出显示一个三角形。

Total seven data dimensions are represented as physical attributes of a book. This legends are introduced on the actual project page.

组织书籍-对数据集进行分组和排序

让我们重温一下数据类型——分类数据、名义数据、数量序数数据和数量连续数据。为了组织书籍,C 分类和顺序变量用于分组数据点,而名义和连续变量用于排序

Organizing (grouping or sorting) options in HTML page: first, the books are grouped by year, then by genre. The labels are both levels are also displayed.

这些分组和排序功能是作为 HTML 页面中的下拉选择实现的。一旦用户选择了对数据集进行分组或排序的维度,所有的书都会重新排列。如果第一个选择的项目是用于分组的维度,则可以在第一个类别下进一步对图书进行分组或排序(如果第二个级别也是分组,则图书按照第二个组中的原始数据集中所列进行排序)。如果用户选择一个名义或类别尺寸,第二个选项变得不可见。

When the books are sorted by the number of pages (ascending), the dividers appear and the labels are seen as the first-level grouping

排序或分组的结果被合并到可视化中。我把第一个选项的标签放在书架上层的书上。例如,当书籍第一次按年份排序时,您会看到年份和年份内的书籍数量。第二层标签显示在书籍之间的分隔线上。当书名或作者的名字在书脊上旋转时,第二级选项的名字也旋转。当书籍没有预先分组就被分类时,我在书籍之间添加了分隔线,以便更好地索引。

D3 书的物理运动的过渡

Moving mouse over a book triggers lifting the book and tooltip popup.

当鼠标悬停在一本书上时,这本书的垂直位置会发生变化,这是在模仿被拾取的书的状态。这种微妙的过渡可以包含现实世界物体的特征。

重组书籍意味着改变视觉元素的位置。书籍的过渡以随机速度进行动画制作,首先到同一文章的新位置(X 位置),然后到新文章(Y 位置)。

来自最佳书架的见解

正如我之前所描述的,我没有发现很多关于《纽约时报》选择最佳书籍的惊人事实(模式、相关性或异常值)。然而,调整书架的逻辑和美学,这种可视化有助于研究书籍的视觉编码属性。我发现了一些有趣的见解:

  • 2009 年是《纽约时报》选择女性作者的书籍多于男性作者的第一年。自 1996 年以来,男女作家之间一直不平衡。我个人想多读读女人说的话,所以这个发现很重要。
  • 非科幻片往往有一个较长的标题,主要是由于它的描述性副标题。与 23 部小说相比,只有 3 部非小说的标题少于 10 个字母。
  • 英文原版书占主导地位。只有 11 本书是翻译的,没有一本是 2003 年以前选的。
  • 成为畅销书并不意味着 Goodreads 上的高收视率。不过似乎和平均评分更有关系。如果平均评分高于 5 分中的 4 分,成为畅销书的几率会增加约 50%。
  • 当作者 35 岁或更年轻时,只有 4 本非小说类图书出版,而当作者 35 岁或更年轻时,有 15 本小说出版。最年轻的五位作者都是小说家。

在最终设计中,我添加了一个输入表单,用户可以通过作者姓名、书名或出版商进行搜索。当用户键入三个或更多字母时,会显示结果总数。这样就可以了解到出版社的图书数量。Knopf 的书最多,25 本;企鹅出版社出版了 16 本,兰登书屋出版了 15 本。

这个项目是一个不直接使用传统图表的数据可视化的例子。相反,我将数据集的主题“书”关联起来,将书和书架的物理属性应用到可视化设计中——将单个数据作为书(将定量连续数据编码为书的大小,将分类数据编码为颜色/图案/标记),将数据集分组和排序作为组织书的规则,D3 转换作为组织书时书的移动。我希望这篇文章对那些想要创建足够有创意但又不会迷惑用户的定制数据可视化的人有所帮助。

你发现最好的书有什么有趣的地方吗?请通过回复让我们知道!

购买小玩意最贵和最便宜的国家

原文:https://towardsdatascience.com/best-country-to-buy-gadgets-e5b5cca722f2?source=collection_archive---------4-----------------------

你在哪里可以买到清单上那个小玩意的最优惠价格?使用这个包含 2016-2017 年 72 个国家流行电子设备和品牌成本的数据集,我探索了购买特定小工具最昂贵和最便宜的国家。

gadget price by country and continent (excluding Venezuela)

我们可以进行许多观察,包括但不限于:

  • 安哥拉是购买 iphone 的好地方,但不是安卓产品、PS4 或智能电视的好地方
  • 孟加拉国在硬盘方面提供很好的交易
  • 而在匈牙利,也得到了一台 PS4
  • 从俄罗斯买苹果手表可能比从菲律宾买要好

当我第一次看这些数据时,委内瑞拉的物价看起来完全疯了(一部 iphone 可能要 10 万美元),我起初以为有什么问题,直到我读了这篇 Times 的文章,才意识到通货膨胀已经把它的价格吹得不成比例。

如果包括委内瑞拉小配件价格的异常值,图表看起来像这样:

New way to flout your wealth is to buy a gadget in Venezuela

按国家查看后,我们可以探究区域级别的价格。

Gadget price benchmark by region

在区域一级,我们可以看到:

  • 大洋洲的 Xbox one 和 Apple Watch 价格更低
  • 几乎所有非洲国家苹果产品和游戏设备的价格都高于中值
  • 品牌耳机在亚洲有点贵,而 Macbook 在大多数国家价格较低。

除了与全球基准相比,我们还可以与考虑了工资因素的当地购买力相比。这更能说明一个国家的电子产品对当地消费者来说价格过高。

Gadget price is relatively high in several South America and Southeast Asian countries considering purchasing powers

这是我关于数据科学和视觉故事的# 100 日项目的第 25 天。我的 github 上的全部代码。感谢阅读,欢迎反馈。

机器学习和数据科学的最佳 Python 库:(第 1 部分)

原文:https://towardsdatascience.com/best-python-libraries-for-machine-learning-and-data-science-part-1-f18242424c38?source=collection_archive---------0-----------------------

Python 日渐流行,已经开始取代业界很多流行的语言。Python 受欢迎的主要原因是因为以下原因:

  • Python 因其简单性而被称为初学者语言。
  • Python 有助于开发人员从开发到部署和维护都更加高效。
  • 与 Java、C 和 C++相比,Python 的语法非常简单和高级,因此可以用更少的代码行构建应用程序。
  • Python 有大量的库集合。
  • 可移植性(当然概率也是 Java 的主要特点)。

用于机器学习的 Python:

python 的简单性吸引了许多开发人员建立机器学习和数据科学的库,因为所有这些库,Python 几乎作为数据科学的 R 而流行。一些最好的 Python 机器学习库是:

1.张量流:

如果你正在工作或者对机器学习感兴趣,那么你可能听说过这个著名的开源库 Tensorflow。它是由谷歌大脑团队开发的。谷歌几乎所有的应用都使用 Tensorflow 进行机器学习。如果你正在使用谷歌照片或谷歌语音搜索,那么你就间接地在使用 Tensorflow 建立的模型。

Tensorflow 只是一个计算框架,用于表达涉及大量张量运算的算法,因为神经网络可以表示为计算图形,它们可以使用 Tensorflow 作为对张量的一系列运算来实现。张量是代表我们数据的 N 维矩阵。

tensorflow 的主要优势是并行性,这意味着您的计算图形是并行执行的,您可以完全控制执行,并且可以在不同的处理器上调度不同的操作,如 CPU、GPU 等。

Tensorflow 基本上是用 C 和 C++编写的,但有一个复杂的 Python 前端。您的 Python 代码被编译,然后在使用 C 和 C++开发的 Tensorflow 分布式执行引擎上运行。Tensorflow 针对速度进行了优化,它可以利用 XLA 等技术来实现更快的线性代数运算。您可以使用 pip 获取 Tensorflow 或访问该网站获取说明:https://www.tensorflow.org//?nav=true

详细教程:https://www . data camp . com/community/tutorials/tensor flow-tutorial

2.Numpy:

Numpy 当然是 Python 最伟大的数学和科学计算库之一。Tensorflow 和其他平台在内部使用 Numpy 对张量执行多种操作。Numpy 最重要的特性之一是它的数组接口。

该接口可用于将图像、声波或任何其他原始二进制流表示为 N 维实数数组。Numpy 知识对于机器学习和数据科学非常重要。

3.Keras:

Keras 是最酷的机器学习库之一。如果你是机器学习的初学者,我建议你使用 Keras。它提供了一种更简单的表达神经网络的方法。它还提供了一些用于处理数据集、编译模型、评估结果、可视化图表等的工具。

Keras 内部使用 Tensorflow 或 Theano 作为后端。也可以使用其他一些类似 CNTK 的 pouplar 神经网络框架。如果您使用 Tensorflow 作为后端,那么您可以参考本文 Tensorflow 部分显示的 Tensorflow 架构图。与其他库相比,Keras 速度较慢,因为它使用后端基础设施构建计算图,然后使用它来执行操作。Keras 模型是可移植的(HDF5 模型), Keras 提供了许多预处理数据集和预训练模型,如 Inception、SqueezeNet、Mnist、VGG、ResNet 等

Keras 教程:https://elitedata science . com/keras-tutorial-deep-learning-in-python

Keras 小抄:https://S3 . Amazon AWS . com/assets . data camp . com/blog _ assets/Keras _ Cheat _ Sheet _ python . pdf

4.Theano:

Theano 是一个计算多维数组的计算框架。Theano 类似于 Tensorflow,但其效率不如 Tensorflow,因为它无法适应生产环境。Theano 可以像 Tensorflow 一样用在并行或分布式环境中。

教程:【http://deeplearning.net/software/theano/tutorial/

更多的库将在下一部分介绍。谢谢你,☺

文本分类深度学习最佳研究文章(2015–2016)

原文:https://towardsdatascience.com/best-research-articles-on-deep-learning-for-text-classification-2015-2016-aaa7950af775?source=collection_archive---------2-----------------------

文本分类在许多任务中都有应用,例如句子分类、文档分类、情感分析等。当我最初开始寻找使用深度神经网络进行文本分类的研究文章时,我发现很难找到最近最好的文章。经过相当长的时间和努力,我能够总结使用深度神经网络进行文本分类所需的研究文章:)

这些文章已经按顺序排列,这有助于读者逐步学习和理解各种深度神经网络模型,因此随着列表的下降,复杂程度增加;)

  1. 许多关于神经网络尤其是卷积神经网络的文章都涉及图像数据。但是第一篇文章“用于句子分类的卷积神经网络”有助于读者理解 CNN 关于文本数据的基础知识,这对于理解来说是惊人的。
  2. 一旦读者理解了 CNN 在文本数据上的用法,下一步就是帮助神经网络从零开始理解文本;)
  3. 本文详细介绍了如何构建一个用于文本分类的字符级 CNN以及更多的实验结果。需要注意的是,本文是对第 2 点中提到的文章的详细撰写;)
  4. 所有上述文章都处理像句子这样的文本数据,但(几乎)从未处理过文档分类,尽管文档分类是最重要的任务之一。但是关于“Recurrent CNN for text class ification”的文章考虑到了这个缺点,并提出了一个神经网络模型来显式地处理文档分类。

请随意评论更多关于文本分类的感兴趣的文章。

应对人工智能黑暗面的最佳方法

原文:https://towardsdatascience.com/best-ways-to-deal-with-dark-side-of-artificial-intelligence-da5e30a181ce?source=collection_archive---------13-----------------------

人工智能(AI)是一个已经发展了一段时间的概念。它对我们今天的生活有着切实的影响。事实上,它是如此的主流,以至于它几乎存在于我们所做的、所见的、所触的和所听的一切事物中。虽然有些人利用这一点为我们的社会做出积极贡献,但其他人却以更可疑的方式从中赚钱,丝毫不顾他们的社区或他们行为的后果。这是生命中一切事物的命运——包括人工智能。当在正确的人手中时,人工智能提供了很好的网络安全解决方案,但与此同时,黑客和网络罪犯也在使用它来进行他们的秘密活动。

使用双重性问题

Teiss 说这很可悲,但却是事实:人工智能技术可能会导致创新类型的网络犯罪和政治危机的发生。这是因为网络安全官员在战斗中落后了。虽然一旦黑客发动攻击,他们需要一段时间来创建合理的解决方案,但网络犯罪分子自己可以迅速找到系统和网络中的新漏洞进行攻击。从这个角度来看,人工智能就像一把双刃剑——既可以用来打击犯罪,也可以用来增强安全系统。

为什么提高意识很重要

意识是更好的在线和数据保护习惯的开始,这将降低网络犯罪率(例如,身份盗窃、隐私泄露、被盗信用卡号)。在某个时候,即使是最注重隐私的人也会成为人工智能技术被用于邪恶目的的受害者。

人工智能现在被认为是一个广泛的主题。虽然今年没有很多重要突破,但它显然有可能产生新的威胁。这就是为什么创建有效的监管框架至关重要,这样你的企业才能更好地防止人工智能技术的恶意实施。在这些恶意实现之外,AI 是一个奇妙的东西。然而,正是这些恶意的实现威胁着我们现有的所有在线互动。

涉及人工智能技术的可能威胁

教育人们如何使用人工智能以及如何将它用于好的目的是很重要的,因为大多数人听到的是人们如何使用它以不良和不负责任的方式行事。然而,很多人没有意识到的是,AI 是一个自动检测软件漏洞的伟大工具。然而,网络罪犯正在利用这一点,在人们最意想不到的时候发动攻击。这增加了目前存在的恶意链接和附件的数量。可悲的是,这可以超越数字平台,进入我们的物理世界——例如,恐怖分子在技术驱动的发展和发明中植入炸丨药。

在一些社会中,人工智能也被用来制造政治混乱。一些政府甚至用它来压制少数民族和那些对其政权持异议的人。还有一些设备被用来制造虚假信息运动,并执行拒绝信息罪,以产生和传播假新闻。

虚拟专用网络如何帮助

阻止网络罪犯的最佳方法之一是实施不太容易被黑客攻击的软件和设备。这是政府和国际监管机构需要参与的事情,提供资金资助这些技术的研究和开发。

实施 VPN 服务(虚拟专用网)将是另一个伟大的解决方案。这些将加密你的内容,所以人们不能窥探你-你基本上绕过互联网服务提供商,黑客和政府监督机构。

适用措施

T4 对网络安全情报的使用将有助于挫败网络攻击。要做到这一点,你需要理解为什么你必须改进技术工作。这将需要使用人工智能的国家之间更好、更顺畅的政策整合。这里的主要目标是了解人工智能错误信息和滥用的危险,以便人工智能支持的网络攻击和黑客事件的影响可以最小化,人工智能技术可以用作防御机制。

要做到这一点,决策者和研究负责人必须合作。目前,当人工智能用于数字安全时,政府和网络安全行业必须控制、培养和资助人工智能的创新进展。道德的最佳实践必须被认为是有效的,无害的创造被发现。

每个人都必须付出努力

重要的是采用一种有效的方法来应对人工智能的双重用途问题。在这个过程中会有一些模糊和争议,因为不存在针对网络犯罪威胁的快速、直接的解决方案。采取上述一些措施将有助于我们应对网络犯罪的影响,并为长期解决方案建立一个框架。一些专家认为,找到确定的解决方案可能永远也不可能。相反,我可能只是在事情上贴了一个“创可贴”。

政府到达

我们大多数人已经知道并理解黑客事件或重大网络攻击可能造成的损害程度。这是因为社会工程和虚假信息运动更容易产生“虚假”内容。虽然有些人可以快速而容易地确定一幅图像是否被篡改,但这对于主流媒体来说并不容易确定。这就是为什么人们很容易陷入恐慌。使用人工智能来预测未来可能会成为一种徒劳的练习,因为它必须扩展今天的威胁,同时也扩展抵御网络威胁所必需的防御机制。

结论

我们的知识和我们对人工智能的使用之间有很大的差距。这种争论有时会避开某些领域——尤其是那些尚未完全开发的领域。这就是为什么政府、研究人员、网络安全公司和行业专业人士必须共同努力,击退黑客和网络罪犯。这不仅仅是建立一个充满可能解决方案的政策框架。他们还必须投资工具来打击 AI 的恶意使用。虽然这些人负责处理这个问题,但理解人工智能是一个影响我们所有人的问题很重要。当黑客利用和完善 AI 的时候,所有人都会受害。这些影响将是巨大的,尤其是当涉及到影响个人的数据隐私和匿名时。

更好的协作数据科学

原文:https://towardsdatascience.com/better-collaborative-data-science-d2006b9c0d39?source=collection_archive---------9-----------------------

从 Kaggle 社区学到的两个指导性见解

上周六,我在南加州最大的数据会议Data Con LA 2018(原大数据日 LA)上做了主题演讲。这是我的博客形式的演讲。

在我的主题演讲中,我分享了 Kaggle 的团队学到的两件事,这些事让数据科学家能够在项目中更高效地合作。这两种见解决定了我们的社区在过去八年中如何发展成为世界上最大的数据科学家在线社区。

  1. 获得社会认可的知识的重要性
  2. 使数据项目易于复制的重要性

Kaggle 简介

首先,以防你没听说过 Kaggle,我给你提供一点背景。今天,超过 200 万 Kagglers 来到这个平台来做数据科学项目。他们参加机器学习竞赛,并在我们的数据集平台上发布和探索数据。对于竞赛和我们的数据集平台,用户可以用 R 或 Python 分析数据,并与我们的免费托管笔记本环境 Kernels 分享他们的工作。

Some recent stats about Kaggle’s prolific community. August 2018.

所有这些竞赛、内核中共享的开源代码以及公共数据集,都让我们对数据科学家如何合作解决问题有了更深入的了解。

有了这个简短的介绍,我想直接进入这两个洞见,从获得社会认可的知识开始。

我们很早就了解到,即使在竞争激烈的环境中,我们的社区也非常积极地分享知识,但有时发现和改进信息和想法很困难。

当 Kaggle 上的每个竞赛结束时,用户在论坛上分享获胜和创新的解决方案;他们已经在我们的博客上发布了 200 多个“我是如何做到的”采访。有时甚至发表关于新方法的论文,如使用 WaveNet 进行销售预测或使用卷积神经网络诊断糖尿病视网膜病变的一些早期工作。

现在有一个传统,每当一个新的比赛开始时,竞争者会立即在我们的网站和互联网上搜寻他们可以用来启动他们在这个新挑战上的工作的见解。虽然一方面,这些内容的存在很棒,但每次需要访问它们时,这本身就是一个挑战。

现在,我想用一个例子来对比一下,在这个例子中,获取知识不仅容易,而且很容易。为此,让我们转向 XGBoost 梯度增强库的开发。

在早期,作者陈天琦 在竞争论坛上引导竞争对手逐步安装和试用他的新软件。在那里,他对意外行为和撞车的报告做出反应。他甚至能够在比赛结束时通过调查寻求反馈。结果,他做了改进,修复了他知道对图书馆用户很重要的错误。

几年后,XGBoost 成为在结构化数据上进行机器学习的最成功的算法之一,这要归功于社区中用户的紧密反馈循环,在这个社区中,知识得到了积累,质量得到了提高。

回到每次比赛产生的知识洪流的例子。今天,我们提供工具来帮助用户发现与他们想要解决的问题相关的内容。

例如,我们的一个用户利用我们关于 Kaggle 的公共数据集 Meta Kaggle,创建了所有获奖解决方案的最终主列表,使用多类分类等标签按问题陈述和特征进行组织。例如,现在每当多类分类竞赛开始时,用户就可以一站式查阅过去在类似问题上的工作。

在一个类似的例子中,另一个 Kaggler 使用标签和其他流行度指标创建了一个数据科学词汇表,其中包含了内核中共享的所有顶级开源代码,这些代码通过使用标签的技术进行组织。对于开始新数据项目的人来说,这是多么不可思议的资源啊!

那么我们的团队从这样的例子中学到了什么呢?我们的团队坚信,没有人应该从闪烁的光标开始数据科学项目。

这种洞察力对于新的数据科学家来说尤其重要。无论是刚开始学习的人还是团队中的新人。它甚至适用于一个新的商业或研究问题。

使用集中定位的和可搜索的知识,通过与当前问题的相关性来组织,用户应该能够更快地开始编写代码和回答问题。我们还了解到,像 XGBoost 这样在我们的社区中得到社会验证的知识,或者通过可用性和流行度指标得到验证的知识,对于识别和重复好的想法是至关重要的。

关于协作数据科学,我们学到的第二个观点是让您的工作具有可重复性的重要性。再现性不仅对你的队友很重要,对你的头号合作者也很重要:你未来的自己。

为了说明可再生数据科学的重要性,我将回到五年前的一场比赛。在这个例子中,一个用户出于好意,希望让更多的人参与到协作解决问题中来。

然而,在这篇论坛帖子中,我们观察到数据科学家在试图分享他们的工作时遇到的许多绊脚石。

  1. 首先,在一个 pastebin 中共享他的代码。我们也经常看到用户将 Python 和 R 代码作为论坛附件添加给其他人下载,并弄清楚如何在本地运行。
  2. 其次,他列出了他对数据形状的假设。他必须这么做,因为他没有分享数据本身。
  3. 最后,真正有意思的是,他在自己的帖子上添加了一个更新。其他人(企图合作!)发现了一个 bug,所以他不得不在 pastebin 中调整他的代码。每个下载旧代码的人都被蒙在鼓里。

所有这些挑战,我们在早期的 Kaggle 论坛上反复看到,意味着代码、想法和结果极难重现。这是合作的巨大障碍,即使有意愿(或必要性)也是如此。

我们的团队没有忽视用户在协作方面的痛点。我们希望让用户能够轻松分享他们的想法并进行协作,因此我们构建了内核,这是我们为笔记本和脚本提供的免费托管计算环境。从这里开始,事情发生了巨大的变化。

为了说明这一点,我在这里展示了一个Fran ois Chollet 的教程内核,演示了如何使用他当时的新库 Keras,在预测西尼罗河病毒的比赛中获得可观的分数。

Franç ois Chollet 的 starter 内核与通过 pastebin 五年共享的代码形成了巨大的对比,因为内核是代码、数据和环境的版本包。这意味着大约 60 个用户能够从他们自己的副本中派生出他的代码并执行。

在这一点上,我希望你记得一个更早的统计数据:截至 2018 年 8 月,平台上有 184,000 个公共开源内核,任何人都可以派生、运行和修改。现在只需点击一个按钮;没有混乱的安装或数据下载需要。

内核促进可再现性的容易程度也对 Keras 在 Kaggle 上的流行轨迹产生了很大影响。就在 6 月,超过 1500 个 Python 内核在 Kaggle 上导入了 Keras。

最后,这不仅仅是工具和基础设施的问题。我们还观察到,Kaggle 用户为他们的数据项目采用的最佳实践往往分为以下两类:

  1. 模板化
  2. 证明文件

模板化是一种最佳实践,例如跨项目使用公共目录结构、模块化代码和数据,以及为团队中常用的代码片段创建和共享库。

然后是文档。除了记录代码,我们的用户还在 Kaggle 上记录他们的数据。我们采访过的顶级 Kagglers 也普遍报告说保持包括重现结果的步骤的密切日志,特别是如果他们在比赛中不使用内核的话。他们还使用“实验室风格”笔记来记录他们实验的想法、他们测试的假设以及他们在迭代项目时的结果。这意味着想法和无效的结果不会被放到抽屉里积灰,而是可以从中学习。此外,他们可以为将数据项目用作投资组合的一部分打下良好的基础。

那么我们从这些例子中得到了什么启示呢?如果数据科学中的好想法易于复制,更多的人将能够质疑、使用和扩展这些好想法。

可再生数据科学项目将版本化的代码、数据和环境打包在一起。他们还使用模板化和文档化等最佳实践。

结论

总之,我们的团队了解到,数据科学家最大的两个需求是获得社会认可的知识,以及复制他们和其他人的工作的能力。

这些见解和其他见解已经告知我们如何开发我们的数据集和内核产品,以允许用户今天在竞争之外的数据项目上进行合作。

如果你想发现更多关于数据科学家如何合作的见解,我鼓励你查看我们关于 Kaggle 的公共数据集,Meta Kaggle 。有大量的社区内核可供浏览并从中派生出您自己的数据项目!

利用人工智能实现更好的内部审计

原文:https://towardsdatascience.com/better-internal-audits-with-artificial-intelligence-53b6a2ec7878?source=collection_archive---------5-----------------------

答审核内部报告是一个非常手工的过程。我们看到了利用人工智能改善流程的机会。这篇文章讲述了我们是如何做到这一点的,以及我们将把这项技术带向何方。

让我们从描述什么是真正的内部审计开始:

  • 内部审计是强制性的
  • 人类审查大型非结构化数据文集寻找风险和控制

这听起来像是一个用人工智能解决的好问题。但是等等……这个复杂的任务有可能自动化吗?

是的,没错。

本文的其余部分是关于我们如何从对审计一无所知到构建一个审计增强工具,从从主题专家那里收集需求开始,发展到问题陈述,最后到达一个帮助审计员做他们的事情的解决方案。

The AuditMap.ai process involves configuring an audit universe, dumping in internal reports and documents, and then using the output of the tool to gain insights on programs, activities, entities, risks, controls, and so forth.

我的第一次内审经历是在医疗器械领域(nuraleve.com),在那里我们会定期接受 ISO、加拿大卫生部和 ce 的审核。内部审计是全球医疗器械生产和分销过程的标准组成部分,所以马修·勒梅和我已经对内部审计的结构和功能有所了解。在为一家小公司进行医疗器械内部审计时,我们没有看到企业级内部审计的规模。这绝对是巨大的。

许多组织的内部审计职能——尤其是上市公司和政府——是庞大的、强制性的,并且不是非常有效。我们与审计专业人员进行了深入的合作,以充分了解问题的范围,并实施解决方案。

首先要做的事情:通过三个简单的步骤了解内部审计

像所有好的项目一样,我们在行业伙伴的帮助下开始简要地创建内部审计的定义。这让我们看到了应用深度学习的用例。

步骤 1:为什么存在内部审计

在我们开始深入学习之前,对内部审计的目的有一个基本的了解是一个先决条件。哈哈哈)对于这种高度非结构化的数据。因此,我们首先向内部审计师协会(IIA)寻求澄清:

“内部审计活动应监控和评估组织风险管理系统的有效性。”—IIA-标准 2110。一流的

文档继续进一步解释:

“内部审计活动应通过识别和评估重大风险并促进风险管理和控制系统的改进来帮助组织。”— IIA 标准 2110—风险管理

所以基本上 IA 就是来找问题的。既然我们有了 IIA 对内部审计的明确定义,我们就开始从管理和过程两个层面理解审计是如何进行的。

步骤 2:内部审核是如何组织的

各种规模的企业如何实现“ 评估【他们的】风险管理体系的有效性是通过几个内部评估(“审计”)的执行来获得他们组织运营的各个环节的脉搏。我们对此进行了更深入的研究,概述了这些评估的基本方法和过程,并发现了任何风险管理系统的关键结构:审计领域。每个公司都通过明确识别以下内容来定义其审计领域的组成部分:

  • 公司结构和问责制框架
  • 内部细分和外部组件
  • 操作程序
  • 每个计划中的活动

从本质上来说,审计领域勾勒出的边界确定了所有能够接受组织监督的事物。所有的内部审核和评估都是在这个审核范围内进行的,因此导致了第 3 步。

步骤 3:进行内部审计 101

内部审计,简单来说,就是评估组织中的某个部分相对于其适当的法规遵从性或策略要求的执行情况。类似 ISO,你说你做的,做你说的,然后验证你做了你说你该做的。由于内部审计对于所有组织/团体的意图和目的都是强制性的,这些活动应该遵守一套标准。规划和承担这些任务需要人对大量非结构化数据进行审查。这是 AI 擅长的地方。**

审计人员希望通过几个不同的角度来识别和理解他们被要求审计的业务中的风险和控制。透视中的这些变量用于梳理流程中的潜在问题,并涉及检查实体:

  • 通过控制目标、战略目标
  • 按风险发生的频率
  • 按类型

之所以有这些不同的看法,纯粹是为了找问题。值得注意的是,如果一个风险领域被反复确定为多年来一直缺乏控制措施,则应在管理审计报告中作为额外注释予以强调。类似地,如果没有识别出风险或控制,这可以向审核员表明在没有被评估的程序或过程中存在隐藏的风险。

哦不!内部审计被破坏

这种手工进行内部审计的过程已经被打破了。我在上面描述了内部审计应该做的事情。随着我们努力了解内部审计的性质,我们发现流程中出现了越来越多的漏洞,从审计选择和完整性方面的偏差,到人员培训方法不足和高度人工劳动密集型审计流程。

Today internal audit is a broken window into the risks and controls hiding within mountains of internal reports from across the organization.

下面是我们在需求集合中发现的一些例子:

  • 无法获得可量化的概述。数字很难生成,因此 50,000 英尺的视角经常会产生误导。内容的语料库一般是从取样的,因为有太多的文档需要手动分析。**
  • 该过程依赖于不可量化的人类决策:风险没有得到应有的识别,控制措施没有有效关联。更不用说“人类有感情”这个因素了;背景和经历都有偏见。
  • 知识转移不力——导致知识孤岛和对关键员工的严重依赖。
  • 一些项目被过度评估,而其他项目很少被审计。例子:信用卡审计太普遍,管理审计太少。如果审计中处理的唯一风险是财务风险,那么其他关键因素,如技术风险。**
  • 审计功能的目标是展示过程性能和暴露问题,而不是仅仅勾选一个框,然后说你做了审计。**
  • 这份清单还在继续…

内部审计的主要难点是审计完整性、更好的报告调查以及确保审计期间的最佳实践。这种进行内部审计的令人厌烦的手动过程需要一些重大的返工,并且显然是一个可以从我们实施深度学习模型中受益的领域。

Example of how to define the audit universe template and risk management framework within AuditMap.ai

Example Audit Universe (Public Expenditure and Financial Accountability Assessment). The full tree is available here.

Audit map . ai 如何改进内部审计

在收集了最终用户需求并与主题专家一起确定了 IA 流程中的缺陷后,我们的团队有了改进的机会。简而言之,我们的愿景是,将深度学习应用于内部审计,在不影响审计质量的情况下带来更好的业务成果。****

AuditMap.ai 是一种自然语言理解工具,使审计人员能够针对已知的行业问题进行评估:审计完整性、更好的报告调查以及确保审计期间的最佳实践。应用深度学习通过解决日常跑腿工作来加速审计功能,这些日常跑腿工作阻碍了审计人员在不影响质量的情况下进行评估和报告的能力。

考虑一个激励的例子…

举例——作为导演,知道你在和什么合作

为审计功能描绘一幅高水平的画面应该不难。现在,是的。这是新老审计主管的首要任务。AuditMap.ai 使用数字和交互式审计领域,因此了解情况成为新的标准。比方说,代理审计主管“X”需要对其监管的每个项目相关的风险环境有一个全面的了解。我们的工具提供了以下关键功能:

  1. 自动识别所有 audit universe 文档中的风险、控制和其他关键实体。
  2. 绘制实体关系的知识图,以伴随风险摘要。
  3. 将风险和控制与审计范围内的文档进行映射和关联
  4. 将具有高度相似性的风险陈述分段,以努力确定可能提高审计效率的领域,以及
  5. 在按项目汇总风险时显示,显示审计范围内没有审计文档或风险陈述的地方,表明审计职能部门忽略了某个项目。

AuditMap 提供了可量化的概述,并将总监和她的审计团队置于这样一个位置,即他们的工作重点是了解他们工作发展的领域,并努力交付高管层期望他们完成的工作产品。

对评估范围的深刻理解可以带来更多的效率发现,因为越来越多参与规划的人有能力提出类似“如何改进我们的工作?可以简化吗?我们是否可以利用该计划范围之外的方法?”

我们的解决方案需要在样本审计报告上标注大量数据,以便为训练模型理解各种类型的句子及其含义奠定基础。应用深度学习非常有利于程序的规划阶段探索的性能。利用以上示例中建议的功能,AuditMap.ai 可以使用深度学习模型来组合由 ai 支持的推理创建的风险和控制报告的结果,这些推理在能够使用语法和/或语义识别感兴趣的文本片段的增强型搜索引擎(ElasticSearch with Kibana)中进行索引。不用说,该解决方案为审计经理带来了业务流程自动化的飞跃,让他们有更多的时间来指导团队和分享知识,而不是一直依赖关键员工来完成普通的文档理解任务。

结论和未来工作

总之,AuditMap.ai 使用深度学习来加速内部审计功能中的大量流程。从高级搜索方法到文档分割,对于需要大量资源密集型工作的环境来说尤其如此。就内部审计而言,应用深度学习为更好、更快地实现业务成果铺平了道路。

上面文章中展示的几个例子,以及其他例子,在我们基于人工智能的内部审计解决方案 AuditMap.ai 中得到了充分的应用和部署

我们现在(终于)进入了销售周期,我们的目标市场是审计商店、五大和大型企业客户,它们是早期采用者客户。要了解更多关于 AuditMap.ai 的信息,请联系我,我会帮你联系。或者联系马修·勒梅:

发现你的审计图,联系:
Mathieu Lemay matt @ audit map . ai
T:+1–819–923–6288

如果你喜欢这篇关于使用人工智能改善内部审计的文章,请点击关注按钮,看看我过去读过的一些文章,比如“如何雇用人工智能顾问”除了与业务相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习

——丹尼尔
丹尼尔@lemay.ai ←打个招呼。询问 audit map . AI
LEMAY . AI
1(855)LEMAY-AI

超越准确性:精确度和召回率

原文:https://towardsdatascience.com/beyond-accuracy-precision-and-recall-3da06bea9f6c?source=collection_archive---------0-----------------------

为分类任务选择正确的指标

你会相信一个声称完全在大脑中创造了一个模型的人以超过 99%的准确率识别试图登机的恐怖分子吗?嗯,这里有一个模型:简单地给每个从美国机场起飞的人贴上非恐怖分子的标签。鉴于每年平均有 8 亿乘客乘坐美国航班以及【2000 年至 2017 年有 19 名(已确认)恐怖分子登上美国航班,这个模型达到了惊人的 99.9999999%的准确率!这听起来可能令人印象深刻,但我怀疑美国国土安全部不会很快打电话购买这种型号。虽然这个解决方案具有近乎完美的准确性,但这个问题是一个准确性显然不是一个足够的度量标准的问题!

恐怖分子检测任务是一个不平衡分类问题:我们需要识别两类——恐怖分子和非恐怖分子——其中一类代表绝大多数数据点。当疾病在公众中的发病率非常低时,另一个不平衡的分类问题出现在疾病检测中。在这两种情况下,积极阶层——疾病或恐怖分子——在数量上远远超过了消极阶层。这些类型的问题是数据科学中相当常见的情况,即准确性不是评估模型性能的好方法。

凭直觉,我们知道在恐怖分子检测问题中宣布所有数据点为阴性是没有帮助的,相反,我们应该专注于识别阳性病例。我们的直觉告诉我们应该最大化的指标在统计学中被称为,或者模型在数据集中找到所有相关案例的能力。召回的精确定义是真阳性的数量除以真阳性的数量加上假阴性的数量。真阳性是被模型分类为阳性但实际上是阳性的数据点(意味着它们是正确的),假阴性是被模型识别为阴性但实际上是阳性的数据点(不正确的)。在恐怖主义案例中,真正的阳性是被正确识别的恐怖分子,而假阴性是被模型标记为而不是恐怖分子的个体,而实际上是恐怖分子。召回可以被认为是模型在数据集中找到所有感兴趣的数据点的能力。

你可能会注意到这个等式的一些东西:如果我们把所有人都贴上恐怖分子的标签,那么我们的召回率就会达到 1.0!我们有一个完美的分类器,对吗?不完全是。与数据科学中的大多数概念一样,我们在选择最大化的指标时会有一个权衡。在召回率的例子中,当我们增加召回率时,我们降低了精确度。同样,我们凭直觉知道,将 100%的乘客贴上恐怖分子标签的模型可能没有用,因为那样我们就不得不禁止每个人乘坐飞机。统计学为我们提供了表达直觉的词汇:这种新模型会遭受低精度,或者分类模型仅识别相关数据点的能力。****

精确度被定义为真阳性的数量除以真阳性的数量加上假阳性的数量。假阳性是模型错误地标记为阳性而实际上是阴性的情况,或者在我们的示例中,模型归类为恐怖分子的个人不是恐怖分子。回忆表达了在数据集中找到所有相关实例的能力,而精确表达了我们的模型所说的相关数据点实际上是相关的数据点的比例。

现在,我们可以看到,我们的第一个模型将所有人都标记为而不是恐怖分子,这不是很有用。虽然它有近乎完美的准确性,但它的精确度和召回率都是 0,因为没有真正的阳性结果!假设我们稍微修改一下模型,将一个人正确地识别为恐怖分子。现在,我们的精度将是 1.0(没有假阳性),但我们的召回率将非常低,因为我们仍然会有许多假阴性。如果我们走向另一个极端,将所有乘客归类为恐怖分子,我们将有 1.0 的召回——我们将抓住每一个恐怖分子——但我们的精确度将非常低,我们将拘留许多无辜的个人。换句话说,当我们提高精确度时,我们降低回忆,反之亦然。**

The Precision-Recall Trade-off (Source)

结合精确度和召回率

在某些情况下,我们可能知道我们希望以牺牲其他指标为代价来最大化召回率或精确度。例如,在对患者进行后续检查的初步疾病筛查中,我们可能希望召回率接近 1.0——我们希望找到所有实际患病的患者——如果后续检查的成本不显著,我们可以接受较低的精确度。然而,在我们想要找到精确度和召回率的最佳结合的情况下,我们可以使用所谓的 F1 分数来组合这两个指标。

F1 分数是精确度和召回率的调和平均值,在下面的等式中考虑了这两个指标:

我们使用调和平均值而不是简单平均值,因为它会惩罚极值。精度为 1.0、召回率为 0.0 的分类器的简单平均值为 0.5,但 f 1 值为 0。F1 分数对这两个指标赋予了同等的权重,并且是一般 Fβ指标的一个具体示例,其中β可以调整为对召回率或精确度赋予更大的权重。(还有其他衡量精度和召回率的指标,如精度和召回率的几何平均值,但 F1 分数是最常用的。)如果我们想要创建一个具有召回率和精确度的最佳平衡的平衡分类模型,那么我们尝试最大化 F1 分数。

可视化精度和回忆

我已经向您抛出了几个新术语,我们将通过一个示例来展示它们在实践中的用法。在我们到达那里之前,我们需要简要地谈论一下用于显示精确度和召回率的两个概念。

首先是混淆矩阵,它有助于在给定模型预测标签的情况下快速计算精确度和召回率。二元分类的混淆矩阵显示了四种不同的结果:真阳性、假阳性、真阴性和假阴性。实际值构成列,预测值(标签)构成行。行和列的交叉点显示了四种结果中的一种。例如,如果我们预测一个数据点是正的,但它实际上是负的,这是一个假阳性。

从混淆矩阵到召回率和精确度需要找到矩阵中各自的值并应用以下等式:

显示分类模型性能的另一个主要可视化技术是接收机工作特性(ROC)曲线。不要让复杂的名字把你吓跑了!这个想法相对简单:ROC 曲线显示了当我们改变模型中识别阳性的阈值时,召回率与准确率的关系是如何变化的。阈值代表一个值,高于该值的数据点被认为是正类。如果我们有一个识别疾病的模型,我们的模型可能会为每个患者输出一个介于 0 和 1 之间的分数,我们可以在此范围内设置一个阈值,用于将患者标记为患有疾病(阳性标记)。通过改变阈值,我们可以尝试达到正确的精确度和召回率的平衡。

ROC 曲线在 y 轴上绘出了真阳性率,在 x 轴上绘出了假阳性率。真阳性率(TPR)是召回率,假阳性率(FPR)是虚警的概率。这两者都可以从混淆矩阵中计算出来:

典型的 ROC 曲线如下所示:

Receiver Operating Characteristic Curve (Source)

黑色斜线表示随机分类器,红色和蓝色曲线表示两种不同的分类模型。对于一个给定的模型,我们只能停留在一条曲线上,但我们可以通过调整我们对阳性病例进行分类的阈值来沿着曲线移动。通常,当我们降低阈值时,我们沿着曲线向右上方移动。阈值为 1.0 时,我们将位于图表的左下方,因为我们没有将数据点识别为阳性,导致没有真阳性假阳性 (TPR = FPR = 0)。随着阈值的降低,我们将更多的数据点识别为阳性,导致更多的真阳性,但也导致更多的假阳性(TPR 和 FPR 增加)。最终,在阈值为 0.0 时,我们将所有数据点识别为阳性,并发现我们位于 ROC 曲线的右上角(TPR = FPR = 1.0)。****

最后,我们可以通过计算曲线(AUC) 下的总面积来量化模型的 ROC 曲线,这是一个介于 0 和 1 之间的度量,数字越大表示分类性能越好。在上图中,蓝色曲线的 AUC 将大于红色曲线,这意味着蓝色模型在实现精确度和召回率的混合方面更好。随机分类器(黑线)获得的 AUC 为 0.5。

概述

我们已经讨论了几个术语,没有一个术语本身很难,但是加在一起可能会有点让人不知所措!让我们快速回顾一下,然后通过一个例子来巩固我们学到的新观点。

二元分类的四种结果

  • 真阳性:标记为阳性的数据点实际上是阳性的
  • 假阳性:标记为阳性的数据点实际上是阴性的
  • 真阴性:标记为阴性但实际上是阴性的数据点
  • 假阴性:标记为阴性但实际为阳性的数据点

召回率和精确度指标

  • 回忆:分类模型识别所有相关实例的能力
  • 精度:分类模型只返回相关实例的能力
  • F1 得分:使用调和平均值结合召回率和精确度的单一指标

可视化回忆和精确

  • 混淆矩阵:显示来自分类问题的实际和预测标签
  • 受试者工作特征(ROC)曲线:绘制真阳性率(TPR)对假阳性率(FPR)的曲线,作为模型的阳性分类阈值的函数
  • 曲线下面积(AUC): 根据 ROC 曲线下面积计算分类模型整体性能的指标

示例应用程序

我们的任务是对 100 名患者进行诊断,这些患者中有 50%的人患有某种疾病。我们将假设一个黑盒模型,在这个模型中,我们输入关于患者的信息,并得到一个介于 0 和 1 之间的分数。我们可以改变将患者标记为阳性(患有疾病)的阈值,以最大化分类器的性能。我们将从 0.0 到 1.0 以 0.1 的增量评估阈值,在每一步计算精确度、召回率、F1 和 ROC 曲线上的位置。以下是每个阈值的分类结果:

Outcome of model at each threshold

我们将在阈值为 0.5 的情况下对召回率、精确度、真阳性率和假阳性率进行一次样本计算。首先我们制作混淆矩阵:

Confusion Matrix for Threshold of 0.5

我们可以使用矩阵中的数字来计算召回率、精确度和 F1 分数:

然后,我们计算真阳性和假阳性率,以找到 ROC 曲线的 y 和 x 坐标。

为了制作完整的 ROC 曲线,我们在每个阈值进行这个过程。正如您可能认为的那样,这非常繁琐,所以我们没有用手工来做,而是用 Python 这样的语言来做!任何人都可以在 GitHub 上看到带有计算的 Jupyter 笔记本。最终的 ROC 曲线如下所示,阈值高于点。

在这里,我们可以看到所有的概念走到了一起!阈值为 1.0 时,我们没有将患者归类为患有该疾病,因此召回率和精确度为 0.0。随着阈值的降低,回忆会增加,因为我们识别出更多患有该疾病的患者。然而,随着我们回忆的增加,我们的精确度会降低,因为除了增加阳性,我们也会增加阳性。阈值为 0.0 时,我们的回忆是完美的——我们找到了所有患有该疾病的患者——但我们的精确度很低,因为我们有许多假阳性。我们可以通过改变阈值来沿着给定模型的曲线移动,并选择使 F1 分数最大化的阈值。为了改变整个曲线,我们需要建立一个不同的模型。****

每个阈值的最终模型统计如下:

基于 F1 分数,总体最佳模型出现在阈值 0.5 处。如果我们想在更大程度上强调精确性或回忆性,我们可以选择在这些度量上表现最好的相应模型。

结论

我们倾向于使用准确性,因为每个人都知道它意味着什么,而不是因为它是完成任务的最佳工具!虽然更适合的度量标准,如召回率和精确度,可能看起来很陌生,但我们已经有了一个直观的感觉,为什么它们更适合一些问题,如不平衡的分类任务。统计学为我们提供了计算这些度量的正式定义和方程式。数据科学是关于了解用于某项工作的正确工具,在开发分类模型时,我们通常需要超越准确性。了解了召回率、精确度、F1 和 ROC 曲线后,我们可以评估分类模型,并对任何只吹捧模型准确性的人持怀疑态度,特别是对于不平衡的问题。正如我们所看到的,准确性并不能对几个关键问题提供有用的评估,但是现在我们知道如何使用更智能的指标了!

一如既往,我欢迎建设性的批评、反馈和讨论。可以通过 Twitter @koehrsen_will 找到我。

超越机器人

原文:https://towardsdatascience.com/beyond-the-bot-b5ee7ebf835b?source=collection_archive---------6-----------------------

耶鲁安普鲁伊姆

当谈到客户互动的创新时,Messenger 上的 KLM 聊天机器人经常被作为教科书中的例子提及。然而,大多数公司在对话驱动的界面或其背后的文本识别和人工智能技术方面做得不多,或者根本没有做什么。这是一个错过的机会。这么多已经是可能的,如果你想的比聊天机器人更广泛,并且可以将技术、用户需求和营销结合在一起,甚至还有更多待价而沽。

许多公司首先挑选容易摘到的果子,通过他们网站、应用程序或信息平台上的问答服务来自动化频繁出现的对话。这种简单的对话很容易编写并带来快速的利润,但一旦它变得更复杂,你就会发现一些限制,要求使用不同于目前使用的大多数标准机器人软件的软件,具有高级形式的文本和意图识别,以及复杂的对话结构。

从机器人到认知服务平台

目前,大约 85%的以目标为导向的聊天机器人对话是成功的,不需要人工干预。如果出现问题,因为聊天机器人不理解问题,员工可以接管对话。但这并不是可能性的终结。将你的机器人连接到具有客户或其他相关数据(CRM、PIM 等)的系统。)提高了成功率,仅仅是因为有更多的信息可以提供正确的答案。机器人可以查找和解释数据,如产品信息、可用性或订单或请求的状态。还可以链接执行某些智能任务的服务,如推荐、预测、情感分析或图像编辑。这就是一个简单的聊天机器人如何成为一个认知系统平台。

科技设计

通过众所周知的新技术、人机逻辑、数据和创造力的结合,我们已经可以实现无数创新、可靠和以客户为中心的对话解决方案。这需要一个多学科的专家团队,他们从用户和技术的角度进行思考。举例来说,以下是使用数据和认知服务的机器人对话的一些成分和可能性。

有一些简单的原则:

  1. 我们认为几乎所有的客户互动都是一种对话。机器人仅仅是一种手段。
  2. 客户互动总是有目标的。客户不会通过联系来进行有趣的对话,组织也不会。
  3. 与每次谈话一样,目的是快速收集信息(客户想要什么?)以便据此提供答案。
  4. 答案以数据或内容的形式保存在系统中,或者以知识的形式保存在组织内外的人们的大脑中。
  5. 人工智能可以帮助分析和制定(智能)答案。

对于你下面看到的例子对话,我们每次都回答这两个问题:1。客户的问题(目标)是什么,我们如何把它说清楚?2.最佳答案是什么,在哪里可以找到?

示例:

你在阿姆斯特丹旅游,需要一个酒店房间。你和一个旅行社代理人(机器人)开始对话。随后,机器人通过某些步骤和服务。

最大的机遇和挑战在哪里?

智能意图分类和实体识别

意图分类是一种帮助从客户的问题中提取其意图的技术。这可能很棘手,因为客户沟通的方式不同,可能会在一句话中提到多件事情。像 RASA(开源)、API.ai(谷歌)或 LUIS(微软)这样的自然语言处理(AI)工具可以用来分析复杂的句子结构,并将它们翻译成一个或多个客户意图。它们还从文本中提取事实信息(实体识别),例如公司名称、目的地或鞋号。这使用户能够有效地交流信息,而使用 web 表单会花费更多的时间。

对话管理

大多数聊天机器人解决方案使用脚本对话(“if-then-else”)。然而,对于更复杂的对话,这缺乏灵活性,并且难以维护。幸运的是,(部分)基于机器学习的解决方案的开发进展很快,对话开发的质量和效率也在提高。

自动和监督学习

RASA 的强化学习技术改善了每次对话的文本识别。但是,为了真正提高对话的质量,重要的是,机器人是由人在监督下“手动”训练的。使用机器人不理解的对话,你可以注释用户真正的意思,允许添加概念或意图,并使机器人下次能够提供更好的答案。

(认知)API

我们可以使用用户提供的信息或我们已经拥有的信息来连接外部服务,以进行拼写(纠正输入)、图像识别(读取信用卡上的文本,或将用户的照片与其姓名相关联)、推荐(如餐馆)、咨询可用性或执行预订。某些“认知”API 甚至可以用来识别情绪,因此在对话不顺利的情况下,用户可以被转发到一个真实的人。

无缝多渠道体验

机器人可以通过 Whatsapp 发送通过网站预订的确认,这也可以用于以后进行更改。下一次同一个用户进行预订时,机器人会记住他们的数据(例如通过来电显示),从而使对话变得更加容易。

混合机器人/人类解决方案

如果机器人不能很好地处理对话,我们显然不想惹恼用户。在这种情况下,对话可以传递给人工服务代理。这可以是主动的(参见认知 API)或者当用户请求时。然后,可以对已经可用的信息进行汇总并转发给代理,这样就可以无缝地进行对话。

数据分析和主动预警

对话可以由用户发起,也可以由机器人本身发起。例如,机器人可以开始对话,根据数据分析向用户提供相关的见解或建议。

内容

机器人不一定只能用文本交流。不同的频道支持使用图像、视频或交互式功能,如提供按钮或动作。

所以,这不仅仅是一个机器人

对于支持(对话驱动的)客户交互过程来说,“聊天机器人”是一个过于简化的名字。它基本上是关于建立一个平台,通过使用已经或即将可用的“智能”服务来学习、交流和解决客户的问题。这些服务可以在新设计的和现有的流程中使用,所有这些都是通过具有可用 API 的现代平台的模块化设计实现的。

将智能技术知识与服务设计知识相结合,可以带来更好的客户体验。人类的创造力和机器智能无缝协作。所以,在对话中思考,让设计师、技术人员和顾客都参与进来,魔法一定会发生。

最初发布于 Emerce (荷兰语)。

dori Jan si iko创作的图像。

炒作之外:机器学习和人工智能对企业的价值(第一部分)

原文:https://towardsdatascience.com/beyond-the-hype-the-value-of-machine-learning-and-ai-artificial-intelligence-for-businesses-892128f12dd7?source=collection_archive---------6-----------------------

作者科里·卡普莱特

Machine learning and AI play a powerful role in marketing technology.

想象一下:你的营销软件为撰写创新的个性化内容提供了可行的指导,这将稳步提高转化率。您的员工更积极、更快乐,在单调乏味的重复性任务上花费的时间更少,例如总结文章、标记内容以及向 CMS 中的图像添加描述性元数据。相反,他们正致力于创造性的营销活动,制作新鲜、受欢迎的内容。您的团队更有生产力,转化为整个公司的效率。

由于人工智能在数字营销中的实际应用,这一场景正在成为现实。描述 AI 将如何在未来从根本上改变我们的工作和生活的炒作并不缺乏。当谈到人工智能时,很难区分事实和虚构,在许多情况下,市场营销和实际应用也是如此。要了解人工智能技术如何影响你的业务,首先必须了解这项技术目前如何被用来提供价值。

Many of the apps and programs we use already incorporate machine learning and AI-powered solutions.

在过去的十年里,营销技术一直在快速发展。我们已经看到内容管理系统转变为功能齐全的客户体验平台。随着平台的发展,我们看到了营销点解决方案的爆炸式增长。营销系统的数量之多导致了对功能和数据互操作性的关注。如果你有一个电子邮件系统,一个 CMS,和一个 CRM,现在更容易把这些数据放在一起,然后找到可以帮助你的业务的相关性和洞察力。与此同时,计算已经发展到任何企业都可以使用运行神经网络或处理机器学习模型所需的算法和计算能力的地步。这两个部分在这里有一个汇合点,即计算能力与海量数据的可承受性。

面向大众的人工智能

包括微软、IBM、Alphabet(谷歌的母公司)和亚马逊(仅举几例)在内的顶级科技公司都在竞相开发公开可用的认知 API。这类智能服务统称为机器学习即服务(MLaaS)。值得注意的是,根据 Stratistics MRC(全球市场研究公司)的数据,预计到 2023 年,MLaaS 市场将增长到 76 亿美元。这些公司投资于由顶级计算机科学家、语言学家和数据科学家组成的大型团队,他们所做的工作为所有客户提供了巨大的价值,允许其他公司利用这一专业知识,而无需自己开发工具。

大型科技公司不仅竞相率先上市提供这些服务,而且他们还在内部运营中大量使用这些技术,不要忽视尚未实现的应用和企业的巨大潜力。这种无处不在且廉价的认知服务的持续趋势正在刺激采用,允许软件提供商、系统集成商和内部开发团队将先进的人工智能功能注入到他们的软件中,而投资成本只是五年前的一小部分。

“这里有很多关于机器学习和人工智能的炒作。一般来说,它今天对大多数企业的影响被高估了。这不是忽视它的理由;从长远来看,它对商业的影响将是破坏性的。它意味着你应该警惕营销炒作,据此设定今天的预期,并搜索实际应用。”

虽然我犯了互换使用 ML 和 AI 的错误,但是注意它们之间的区别是很重要的。人工智能是一种通用的编程机器分类,用于显示智能行为或“思考”的特征机器学习是人工智能的一个子集,其中系统通过访问数据而无需显式编程来自动学习和改进。提供的数据越多,系统执行特定任务的能力就越强。

机器学习和人工智能对企业的价值

从长远来看,机器学习和人工智能有潜力为企业提供指数级价值,但在短期内也不乏好处。任何拥有制作大量内容的内容作者部门的组织(出版、媒体、B2B、非营利组织)都可以从自动化各种频繁任务的效率中受益。在内容管理领域,这包括自动标记图像和文本或创建文本摘要。

早在几年前,包括美联社(AP)、福克斯新闻频道和雅虎在内的几家媒体巨头已经在使用人工智能软件制作故事和摘要。虽然这些都不是完全没有人类参与的工作,但人工智能软件可以减少的任务消除了员工花在这种工作上的时间,使他们能够承担更高价值的任务。人工智能最好被视为增强人类能力的工具,而不是暂时取代人类。

机器学习和人工智能另一个引人注目的领域是分析活动的自动化,如分割、优化和预测建模。在现成产品和服务中提供这种能力的竞赛提供了释放客户洞察力的潜力,这在以前没有一小群数据科学家是不可能的。

推荐引擎是预测分析的一个很好的例子,也是我们通过随意使用流行服务而熟悉的一个例子。亚马逊和网飞等公司投入大量资金,训练机器学习和人工智能模型,以做出令人惊讶的相关和准确的预测。考虑到可以标记的变量数量和可以分类的各种维度,他们不缺乏数据。

Netflix shown on a tablet, with personalized recommendations for the user.

例如,网飞可以根据内容本身的描述进行推荐(基于内容的过滤),也可以根据用户与其他用户的相似性(协同过滤)来进行推荐。这两种模式的结合被称为混合推荐系统,在网飞的情况下,允许公司向他们的客户提供个性化的内容推荐。

“你不需要知道机器学习和 AI 是如何工作的。您需要知道如何利用它来应对您的业务挑战和目标。”

了解如何将人工智能应用到您的业务中

这些技术如此容易被采用的一个缺点是,它变得更容易陷入选择一种技术来寻找问题的陷阱。最重要的是首先关注将获得最大利益的业务和用例,然后利用正确的技术来解决这个问题。下面的列表描述了今天可以使用的机器学习服务的类别,以及它们特别适合解决的潜在商业用例。

1.计算机视觉

计算机视觉的新兴领域包括图像、物体和面部识别。可以使用廉价的 API 来获取信息,如主题、文本摘要、已识别的面孔、情感或情绪、不适当或淫秽的内容,或者照片中个人的性别和年龄。如果您的数字媒体库有成千上万的图像,这可以极大地简化库的手动维护,并在检索内容时提供更有用的方法来搜索您的日期。例如,你可以很容易地找到白天城市街道上快乐的人走在街上的照片。

2.自然语言处理

Natural Language Processing (NLP) seeks to understand, interpret, and manipulate human language.

自然语言处理(NLP)是人工智能的一个分支,其中系统被开发来理解、解释和操纵人类语言。当解释语言的歧义时,推导句子的概念或意图是一个复杂的问题。虽然该领域已经存在了 40 多年,但通过人机交互获得更强客户体验的需求、计算能力的进步以及对大量语言数据的访问等因素已经给该领域带来了巨大的好处。今天,这个领域实际上应用于语音界面(Alexa)、聊天界面(chatbots)和文本挖掘应用程序,如社交媒体情感分析或评论审核。

Voice interfaces like Amazon Alexa have become a part of many households.

我们的许多客户拥有大量的内容储备,这些内容已经被人类精心标记了几十年,这是训练新预测模型的完美数据集。现在,我们正在教沃森根据以前标记的内容库自动标记新文章。我们还使用微软和其他公司的现成模型,用情感、语气、等级和其他与内容写作相关的方面来标记内容。该应用程序特别适合媒体或出版客户端。

3。 机器学习平台

鉴于许多公司拥有庞大的数据存储,机器学习和人工智能服务提供了强大的能力,可以提供可操作的见解。通过提供描述您的内容或产品的数据,以及从众多来源和客户接触点收集的分析,可以挖掘数据的相关性和模式。该系统搜索数据以发现新的客户群、有价值的客户旅程,或者推荐更有可能导致期望转化的内容。亚马逊、微软和 IBM 正在部署一个快速扩展的工具集,允许企业集成这项技术,而不必学习和掌握复杂的 ML 算法。有了正确的数据和适量的机器学习知识,你就可以开始构建推荐系统,这些系统由网飞或亚马逊用来个性化内容的类似技术提供支持。

名义成本使中型企业更容易获得 ML / AI

值得一提的是,每次进行 API 调用,都要花费几分之一的费用。大公司正在以很低的成本提供这些认知服务,作为他们增强的云产品套件的一部分。在大多数情况下,你不需要签署冗长的合同条款,这意味着使用这些技术的门槛非常低。

结论

虽然围绕人工智能在改善客户体验和营销计划方面的应用有大量的炒作,但希望这篇文章有助于显示这项技术今天有许多实际用途。我们现在正在采取一些小的、可衡量的措施,这样客户就可以看到这些解决方案对其特定业务挑战的积极影响。我们专注于使用易于获得且经济高效的认知服务和机器学习 API,客户可以使用它们来自动化日常任务,因此他们的团队可以专注于更高价值的工作,如个性化活动和内容。

的下一篇文章中,我们将讨论所有这些如何明确适用于我们在数字营销领域看到的挑战,以及为什么我们热衷于帮助我们的客户在这个时候投资这项技术。

关于作者

Corey Caplette, CTO, Velir

Corey Caplette 是 Velir 的首席技术官,负责指导技术愿景和执行,这为 Velir 赢得了值得信赖的技术合作伙伴的声誉。凭借 15 年的数字经验,他凭借在软件开发、系统架构、企业内容管理和营销技术集成方面的专业知识,为复杂的技术问题带来了深思熟虑的战略方法,并因此赢得了声誉。Corey 负责管理 Velir 的解决方案架构、开发、生产支持、托管服务和 IT 团队。Corey 从 Fidelity Investments 加入我们,他在 Fidelity 应用技术中心的研发组担任技术专家。

关于 VELIR

我们是一家完全整合的数字机构,总部位于马萨诸塞州萨默维尔市的波士顿郊外。我们拥有一支由 130 多名数字专业人员组成的团队,以我们为一些世界上最大和最有影响力的非营利组织、会员协会和财富 500 强企业所做的数字工作而闻名。我们在营销技术和数据可视化方面的能力是业内公认的最佳水平,这源于 17 年来对数字战略、创意设计、网络工程和应用程序开发的专注。我们已经完成了复杂的实施和大规模的品牌建设,包括拜耳,罗伯特·伍德约翰逊基金会,大都会艺术博物馆,美国退休人员协会,耶鲁大学和信息。我们被大波士顿商会和萨默维尔商会授予“年度小型企业”荣誉称号,并在波士顿和华盛顿州 DC 设有办事处。更多信息,请访问www.velir.com

超越 MOOC:数据科学书虫指南

原文:https://towardsdatascience.com/beyond-the-mooc-a-bookworms-guide-to-data-science-e87271cb0572?source=collection_archive---------7-----------------------

最后更新:2020 年 9 月

Sylvia Yang // Unsplash

介绍

投身数据科学可能是一项艰巨的任务:网上有这么多优秀的(不幸的是,多余的)资源,很难知道把宝贵的时间花在哪里。在沿着同样的道路奋斗并收集了该领域数十位从业者的建议后,我在这篇文章中综合了我最喜欢的资源,希望能有所回报。

为什么是课本?

有许多学习编程和机器学习的好方法,其中一种方法不一定比所有其他方法都好。经过多次反复试验,我发现教科书内容的学习时间比其他媒介要高得多,原因如下:

  • 教科书作者通常是教授,他们比典型的 MOOC 制作人或博客作者拥有更深的知识和更强的动机
  • 阅读时记笔记需要持续的专注;坐在教室里或看在线教程时,人们太容易不去关注
  • 网上有大量令人惊叹的免费教科书,还有有趣的数据集,你可以用它们来学以致用

为了使这个学习过程有效,我强烈建议你在读完每本书后,立即将你的阅读应用到现实世界的挑战或 Kaggle 数据集。这最后一步将确保你已经在精神上消化了你所阅读的内容,并给你一个代码库,如果你将来需要重温这本书的话。这里有一个简单的例子,是我看完预测:原理&实践后写的(见下面我的评论)。

开始你的旅程

如果你是这个领域的新手,下面的链接应该是你达到中级水平所需要的。每本书都建立在上一本书的基础上,所以我建议按照列出的顺序浏览它们。免责声明:为了您的方便,我提供了以下链接;我不通过联盟营销赚任何钱。

R(ISLR)统计学习简介

加雷思·詹姆斯,丹妮拉·威滕,特雷弗·哈斯蒂,罗伯特·蒂布拉尼

这是机器学习的经典介绍,有大量易于理解的可视化和 R 代码,可以帮助您入门并运行。我怎么推荐这本书都不为过:这无疑是我读过的关于统计学或编程的最容易理解的教科书。从这里开始!

R 为数据科学

加勒特·格罗勒蒙德,哈德利·韦翰

对于那些想了解 R,中的数据争论和可视化的人来说,这是一个很好的资源,这两项技能很容易占据你 60% 的工作时间。当你通过 ISLR 学习统计学的时候,浏览了 R 之后,这个网站将帮助你提高你的基本编程技能。

动手使用 Scikit-Learn & TensorFlow

奥雷连·盖伦

毫无疑问是我读过的关于 Python 中机器学习的最有用的教材。第 1 章是关于各种 ML 主题的高级 FAQ,是对许多不同领域的特别强有力的概述。你可以在亚马逊上找到它,但我建议你问问你的学校或雇主,他们是否提供免费访问奥莱利的媒体网站。

机器学习

吴恩达

大师亲自出马的经典 MOOC。这门课程告诉我,比起看 MOOCs,我更喜欢看书,但安德鲁迷人的教学风格和深厚的专业知识使这个系列成为必看节目。这门课是用 MATLAB 教授的,所以在尝试之前,你应该先学习编程的基础知识。如果你想测试你新发现的技能,尝试 Python 中的每个作业,并与你在 MATLAB 中的答案进行比较。

成长为你的利基

通过上面的资源学习基础知识后,您会希望让您的个人兴趣和用例为您指明学习旅程的下一步。下面列出了一些我最喜欢的深度探索,按主题领域分类。

人工智能:一种现代方法

斯图尔特·拉塞尔,彼得·诺维格

由斯坦福和谷歌重量级人物撰写,这本书是一个全面的,写得很好的指导 ML 的构建模块,最有趣的是,强化学习。这本书有 1000 多页,我会有选择地浏览一下,而不是完全阅读。

贝叶斯方法:贝叶斯数据分析

安德鲁·盖尔曼

大量关于贝叶斯的参考资料,并附有 r 语言的代码。理解贝叶斯推理将补充你在这个列表的“入门”部分开发的频率主义观点。再说一遍,这本书更像是一个值得浏览的标题,而不是一本从头到尾阅读的书。对于贝叶斯统计的快速概述,我们在分析 Vidhya 的朋友已经覆盖了

因果推断:大多是无害的计量经济学

约书亚·d·安格里斯特,约恩-斯特芬·皮施克

在这本现代因果推理建模的无障碍指南中,安格里斯特和皮施克探讨了回归如何成为理解因果关系的无价工具。其他感兴趣的主题包括匹配、倾向评分和固定效应模型。在我的“高级阅读”清单中,这本书比 Gelman 和 Hill 的书更容易理解,但它们很好地结合在一起,在不同的粒度水平上涵盖了类似的主题。

Python 中的数据科学:机器学习简介

莎拉·圭多,安德烈亚斯·米勒

作者涵盖了从基本的无监督方法到 Python 中的自然语言处理的所有内容。可以把它看作是 ISLR 的 Python 等价物,更侧重于中间用户。这本书也是免费的,奥莱利订阅了。

深度学习:深度学习

伊恩·古德菲勒、约舒阿·本吉奥、亚伦·库维尔

如果没有深度学习的技术圣经,我们的列表将是不完整的,涵盖了从感知机到卷积神经网络的一切。根据埃隆·马斯克的说法,这本书是“关于这个主题的唯一一本全面的书”,不像这个列表中的其他大量参考书籍,我建议从头到尾读一遍。

DevOps: 加速:精益软件和 DevOps 的科学

妮可·福斯格伦,杰斯·亨布尔,吉恩·金

DevOps 是“您的组织为大规模构建安全、有弹性、快速发展的分布式系统而遵循的流程”。随着我在数据科学旅程中的前进,并开始在生产中部署机器学习系统,我了解到如果没有正确的流程和实践,生活会多么痛苦。在本书中,Nicole 提供了一个基于研究的视角,关于管理和开发最佳实践、敏捷开发以及持续集成/持续交付(CI/CD)的重要性。

广义可加模型:从回归角度的统计学习

理查德·伯克

我读过的关于广义可加模型和回归分析的最彻底的教科书。游戏及其可解释性的非常有用的概述,有大量的 R 代码来平滑学习过程。伯克教授还涵盖了更现代的预测技术(例如,助推),但他深思熟虑的推理建模方法是这本书的必读内容。

中级 Python: 流畅 Python

卢西亚诺·拉马尔霍

这本书让我的 Python 技能更上一层楼。如果你花大量的时间在 Python 上,这是一个必读书,尽管拉马尔霍的大多数建议不能很好地推广到其他编程语言。

关于编程好:清理代码

罗伯特·马丁

尽管这本书最初是为软件工程师写的,但对数据科学家来说阅读和理解也同样重要。如果您渴望编写生产就绪的代码,本书提供了许多高层次的建议来指导您的思考。

时间序列分析:预测:原理与实践

罗布·J·海曼,乔治·阿萨纳索普洛斯

R 中关于时间序列预测的很好的读物,有帮助的代码和视觉效果来解释端到端的建模过程。如果你需要一点动力去钻研这篇文字,Hyndman 的 R 库,预测, 在 Kaggle 上获得了一个高价值的沃尔玛预测比赛

理解“黑箱”模型:解释性机器学习

克里斯托夫·莫尔纳尔

Christoph 在捕捉从线性回归到 XGBoost 的可视化最佳实践方面做得非常出色。他的指南简短、实用、引人入胜,作为他的电子书的直接结果,我已经将 Shapley 值、PDP 和 ICE 图添加到我的正常工作流程中。

高级阅读

如果你能阅读、理解并运用你从上面列出的书中学到的知识,那么你可能会喜欢我最近喜欢的几本书。这些推荐都是技术;如果您正在寻找充满数学符号和代码示例的页面,那么您来对地方了。

高级回归:使用回归和多级/分级模型的数据分析

安德鲁·盖尔曼,珍妮弗·希尔

在我听到 Richard McElreath 说“多水平模型应该成为回归的默认模式”之前,我从来没有认真考虑过多水平回归。读完这段文字,我终于明白为什么我们几乎总是喜欢运行多层次模型(线性、逻辑、广义等。)到一个普通的回归。这篇文章非常全面,提供了 R (frequentist)和 Buds (Bayesian)两种语言的实例,但可能比需要的要长 150 页。

贝叶斯统计:统计反思

理查德·麦克尔瑞斯

如果你对学习贝叶斯统计很感兴趣,但还没有找到合适的指南,这本写得非常好的教科书应该是你阅读清单的第一位。作者从贝叶斯统计的全面概述开始,然后分享几种技术来帮助改善你的因果推理游戏。

分布式计算:海量数据集的挖掘

Jure Leskovec,Anand Rajaraman,Jeff Ullman

这本书提供了有效处理大量数据的分布式计算系统和技术的详细概述。涵盖的主题包括哈希策略,聚类技术,篮子分析和推荐引擎。这篇文章是为了指导斯坦福大学的 CS246(挖掘大规模数据集)而写的,可以通过上面的链接免费获得。

函数式编程:Scala 中的函数式编程

保罗·丘萨诺,罗纳尔·比雅纳松

这本书结合了函数式编程的最佳实践和对 Scala 的引人入胜的介绍,Scala 是一种通用编程语言,构成了 Apache Spark 的主干。

实用深度学习:用 PyTorch 进行深度学习

伊莱·斯蒂文斯,卢卡·安提卡

深度学习和 PyTorch 库的简单介绍。这本书丰富多彩的插图和直观的代码示例巩固了我对张量、PyTorch 语法和涉及反向传播的线性代数的理解。最重要的是,它可以通过上面的链接免费获得。

Python 优化: Python 高性能

加布里埃尔·拉纳罗

如果计算性能阻碍了你,我推荐 Python 高性能作为高级 Python 编程的直观指南。这篇文章以简洁的方式涵盖了基准测试/分析、矢量化、提前和即时编译、并发性、并行处理和分布式计算,并提供了大量的代码示例来帮助您入门。我也喜欢类似的书高性能 Python 中涵盖的所有硬件理论,但是我觉得 Lanaro 用更少的文字和更好的代码示例涵盖了类似的主题。

系统设计:设计数据密集型应用

马丁·克莱曼

当你的技术技能开始渗透到工程领域时,Kleppmann 写了一本很棒的书来阐明你最喜欢的 web 应用程序是如何大规模运行的。本阅读涵盖系统设计原则、数据模型优化、数据库、微服务架构、流、缓存和分布式计算。

总结

关于这个领域,我最喜欢的一点是它发展得有多快。不管我们读了多少,总会有更多的东西需要我们去消化和学习。在完成这个列表后,您将最终为最精彩的部分做好准备:仔细阅读关于 arXiv 的研究论文。激动人心的时刻即将到来!

你最喜欢的数据科学读物有哪些?随时欢迎您的建议和意见。感谢阅读!

超越语音:人工智能和手势控制

原文:https://towardsdatascience.com/beyond-voice-ai-and-gesture-control-869f9a752fbe?source=collection_archive---------0-----------------------

这是我们讨论家庭用户界面及其发展趋势系列的第四部分。本系列基于我们在 2016 年 CEDIA 上的演讲。你可以在这里 观看现场直播

第一部分: 家庭用户界面的演变

第二部分: 为什么现在是家庭语音控制的时候

Part 3: 没有 UI 就是最好的 UI

人工智能

就语音之外和我们现在所处位置之外的东西而言,首先要提到的话题是人工智能。我们经常听到这个术语。我们在科幻电影和电视上看到它。它实际上意味着什么?

首先,人工智能是做不同事情的不同技术的集合。这对我们来说意味着使用大数据,使用传感器,使用学习算法,这样家庭就能够在没有编程的情况下变得更加智能。这也意味着创造出能够像人类一样互动的人,无论是通过声音、手势还是其他自然的互动。

一个很好的例子是,如果用户 100%的时间在天黑后回家,她打开车库,然后打开厨房的灯。如果乔希看到她快到家了,他会打开车库,自动打开厨房的灯。这可以通过跟踪和使用大数据来学习,而不是预先编程。

在不久的将来,我们将看到人工智能真正起飞,我认为随着人工智能与语音和其他先进技术的结合,这些技术将结合起来,使体验真正神奇。人工智能是我未来几年密切关注的事情之一。

手势控制:已经在这里

接下来是手势控制,也很常见。如果我们是在面对面交谈,我可能会指着一个说话者说“把它关小一点,它真的很吵”或者“你能把它开大一点吗”。关于手势,它确实和声音结合在一起。手势控制是一项 AND 技术,不是 OR 技术。

事实上,我们已经看到了手势。诸如 Fibaro SwipeSeven Hugs 智能遥控器等设备正在制造其中一些产品。他们已经在使用非常棒的传感器和摄像头以及不同的技术来使用手势控制和识别。

再说一遍,所有这些新技术都是一种去除用户界面的方式。你走进去,指着什么东西,它应该会激活,应该会继续。因此,这是另一项我们近期真正看到的新兴技术。

继续本系列的第 5 部分,我们将深入探讨虚拟现实和图像识别

这是由 Josh.ai 的联合创始人兼首席执行官亚历克斯·卡佩塞拉特罗撰写的。此前,亚历克斯是美国宇航局,桑迪亚国家实验室和 NRL 的研究科学家。在此之前,Alex 在 Fisker Automotive 工作,并在 Pool 和 Yeti 创立了。亚历克斯拥有加州大学洛杉矶分校的工程学位,住在洛杉矶,喜欢在推特上发布关于人工智能、创业公司和设计的消息。

Josh.ai 是你家的人工智能代理。如果您有兴趣了解更多信息,请访问我们的https://Josh . ai

喜欢我们上 脸书 ,关注我们上 推特

超越单词嵌入第 1 部分

原文:https://towardsdatascience.com/beyond-word-embeddings-part-1-an-overview-of-neural-nlp-milestones-82b97a47977f?source=collection_archive---------6-----------------------

神经 NLP 里程碑综述

TLDR;

自从 word2vec 的出现,神经单词嵌入已经成为在 NLP 应用中封装分布式语义的 goto 方法。本系列将回顾使用预训练单词嵌入的优点和缺点,并演示如何将更复杂的语义表示方案(如语义角色标记、抽象意义表示和语义依赖解析)整合到您的应用程序中。

神经自然语言处理里程碑

在过去的五年里,深度学习的出现在自然语言处理领域带来了一些令人印象深刻的里程碑。

本系列的第一篇文章将重点介绍一些里程碑的例子以及开始使用它们的链接。

共参照分辨率

Allen NLP Co-Reference resolution

共指消解的任务是找出文本中所有指代同一实体的表达式。对于涉及自然语言理解的核心 NLP 任务,如文档摘要、问题回答和信息提取,这是重要的一步。这个任务的两个最好的可用库是 huggingfaceAllen NLP

情感分析

An example of the Azure Text Analytics service

这些模型能够检测给定文本的情感。这种功能对于检测社交媒体、客户评论和论坛中的积极和消极情绪非常有用。在基于云的服务中,如 Azure Text Analytics 内容由您提供;模型和训练数据由服务提供。

可训练命名实体识别和范围标记

命名实体识别模型从文本中提取实体,如人员、位置、组织和杂项。 Azure Text Analytics 提供强大的预训练模型。对于那些喜欢训练自己模型的人来说, SpacyAllen NLP 都提供了快速训练定制 NER 模型的文档,这些模型可以与 Azure ML APIAzure 笔记本服务一起使用。

意图分类

意图分类系统旨在识别对话中有价值的信息,如 LUIS 认知服务解释用户目标(意图)并从句子(实体)中提取有价值的信息,以实现高质量、细致入微的语言模型。 LUIS 与 Azure Bot 服务无缝集成,轻松创建复杂的 Bot。

机器阅读理解 BiDAF

AllenNLP MC Model

机器理解 (MC)通过在证据文本内选择答案范围来回答自然语言问题。AllenNLP 工具包提供了以下 MC 可视化,可用于 AllenNLP 中的任何 MC 模型。有关机器阅读理解的更多信息,请参见《入门》,这里有一个很棒的关于 Azure DLVM 的演示,它包含了一些最新架构的实现,比如 BiDAF、SynNet、OpenNMT 和 Document QA。

自然语言推理 SLNI 可分解注意力

Allen NLP NLI/TE model

文本蕴涵(TE) 获取一对句子,并预测第一个句子中的事实是否必然隐含第二个句子中的事实。文本蕴涵是信息抽取系统的关键组成部分,通常用于通过确保候选答案包含给定的抽取查询来过滤候选答案。AllenNLP 工具包提供了上述 TE 可视化,可以为您开发的任何 TE 模型运行,也可以为您的应用程序中使用的预训练模型运行。

神经翻译 NMT

持续改进翻译很重要。然而,自 2010 年代中期以来,SMT 技术的性能改善一直停滞不前。通过利用微软人工智能超级计算机的规模和能力,像微软翻译器这样的工具现在提供基于神经的翻译,这使得翻译质量的提高进入了一个新的十年。

抽象单文档摘要

Example of improvements in neural summarization Abigail See et. all

神经 NLP 也有助于抽象单文档摘要任务中的基准。这项任务使用户能够生成长文档的简短摘要。传统上,这是使用提取方法完成的,提取方法通过从文本中直接引用来生成摘要,但神经 NLP 的进步,如 Abigail See 的指针生成器网络已经能够从长文档中创建可理解的简短抽象摘要。

行动呼吁

下面是开始使用上述工具和模型的一些资源。

  • 【Azure Text Analytics—Text Analytics API 是一个基于云的服务,提供对原始文本的高级自然语言处理,包括四个主要功能:情感分析、关键短语提取、语言检测和实体链接。
  • Azure LUIS —基于机器学习的服务,为定制意图分类和基本实体提取构建自然语言。
  • Allen NLP—Allen NLP 是一个开源的 NLP 研究库,基于 PyTorch 构建,用于开发各种语言任务的最先进的深度学习模型。
  • Azure DLVM 机器阅读理解——深度学习虚拟机(Deep Learning Virtual Machine)是数据科学虚拟机(Data Science Virtual Machine,DSVM)的一个特殊配置的变体,可以更直接地使用基于 GPU 的虚拟机实例来训练深度学习模型。DSVM 上有一个很棒的 pyTorch 入门模块,你可以在这里找到。
  • SpaCy—SpaCy 是 Python 中自然语言处理的免费开源库。它具有 NER、词性标注、依存句法分析、词向量等功能。
  • hugging face——为模型提供空间的扩展,如相互参照和情感分析。

下一篇文章

本系列的下一篇文章将回顾用词向量表示和建模的进步是如何推动上述 NLP 系统的进步的。

如果你有任何问题、评论或话题想让我讨论,请随时在 Twitter 上关注我。如果你觉得我错过了某个里程碑,请让我知道。

关于作者

亚伦(阿里)博恩施泰因(阿里)是一个狂热的人工智能爱好者,对历史充满热情,致力于新技术和计算医学。作为微软云开发倡导团队的开源工程师,他与以色列高科技社区合作,用改变游戏规则的技术解决现实世界的问题,然后将这些技术记录在案、开源并与世界其他地方共享。

超越单词嵌入第 2 部分

原文:https://towardsdatascience.com/beyond-word-embeddings-part-2-word-vectors-nlp-modeling-from-bow-to-bert-4ebd4711d0ec?source=collection_archive---------1-----------------------

从 BoW 到 BERT 的词向量和自然语言处理建模

TL;速度三角形定位法(dead reckoning)

自从 word2vec 的出现,神经单词嵌入已经成为一种在文本应用程序中封装分布式语义的常用方法。本系列将回顾使用预训练单词嵌入的优点和缺点,并演示如何将更复杂的语义表示方案(如语义角色标记、抽象意义表示和语义依赖解析)整合到您的应用程序中。

介绍

本系列的最后一篇文章回顾了神经自然语言处理领域的一些最新里程碑。在本帖中,我们将回顾文本表示的一些进步。

计算机无法理解单词的概念。为了处理自然语言,需要一种表示文本的机制。文本表示的标准机制是单词向量,其中来自给定语言词汇的单词或短语被映射到 向量 实数

传统词向量

在直接进入 Word2Vec 之前,有必要简要回顾一下神经嵌入之前的一些传统方法。

袋字或弓矢量表示法是最常用的传统矢量表示法。每个单词或 n-gram 都链接到一个向量索引,并根据它是否出现在给定的文档中而标记为 0 或 1。

An example of a one hot bag of words representation for documents with one word.

BoW 表示经常用于文档分类方法中,其中每个单词、双单词或三单词的频率是训练分类器的有用特征。单词包表示的一个挑战是,它们不编码任何关于给定单词含义的信息。

在 BoW 中,单词的出现是均匀加权的,与它们出现的频率或上下文无关。然而,在大多数 NLP 任务中,一些单词比其他单词更相关。

TF-IDF ,简称 词频——逆文档频率 ,是一个数字统计量,意在反映一个词或 n-gram 对一个集合或语料库中的文档有多重要。它们根据给定单词出现的上下文为其提供一定的权重。TF–IDF 值与单词在文档中出现的次数成比例地增加,并被语料库中包含该单词的文档数量抵消,这有助于调整某些单词比其他单词出现得更频繁的事实。

https://skymind.ai/wiki/bagofwords-tf-idf

然而,即使 tf-idf BoW 表示为不同的单词提供了权重,它们也不能捕捉单词的含义。

正如著名语言学家 J. R. Firth 在 1935 年所说,“一个词的完整意义总是语境化的,脱离语境的意义研究是不可能被重视的。

分布式嵌入使词向量能够封装上下文语境。每个嵌入向量是基于它与给定语料库中的其他单词的互信息来表示的。互信息可以被表示为全局共现频率,或者被顺序地或基于依赖性边限制到给定的窗口。

An example distributional embedding matrix each row encodes distributional context based on the count of the words it co-occurs with

分布向量先于用于单词嵌入的神经方法,并且围绕它们的技术仍然是相关的,因为它们提供了对更好地解释神经嵌入所学内容的洞察。要了解更多信息,你应该去读读戈德堡和利维的作品。

神经嵌入

Word2Vec

预测模型学习它们的向量,以便提高它们对丢失的预测能力,例如从周围上下文单词的向量中预测目标单词的向量的丢失。

Word2Vec 是一个预测嵌入模型。有两种主要的 Word2Vec 架构用于产生单词的分布式表示:

  • 连续词袋(CBOW)——上下文词的顺序不影响预测(词袋假设)。在连续跳格结构中,该模型使用当前单词来预测上下文单词的周围窗口。
  • 连续跳字对附近的上下文单词的加权比对更远的上下文单词的加权更重。尽管顺序仍然没有被捕获,但是每个上下文向量被独立地与 CBOW 进行加权和比较,CBOW 相对于平均上下文进行加权。

CBOW and Skip-Gram Architectures

CBOW 速度较快,而 skip-gram 速度较慢,但对于不常用的单词效果更好。

手套

CBOW 和 Skip-Grams 都是“预测”模型,因为它们只考虑局部环境。Word2Vec 没有利用全局上下文。 GloVe 相比之下,嵌入利用了使用分布式嵌入的同现矩阵背后的相同直觉,但是使用神经方法将同现矩阵分解成更具表现力和更密集的词向量。虽然 GloVe 向量的训练速度更快,但 GloVe 或 Word2Vec 都不能提供更好的结果,应该对给定的数据集进行评估。

快速文本

FastText 建立在 Word2Vec 的基础上,学习每个单词的向量表示和每个单词中的 n 元语法。然后,在每个训练步骤中,这些表示的值被平均为一个向量。虽然这给训练增加了许多额外的计算,但是它使得单词嵌入能够编码子单词信息。通过多种不同的方法,FastText 矢量被证明比 Word2Vec 矢量更准确

神经 NLP 架构的 10,000 英尺概述

除了更好的词向量表示之外,neural 的出现还导致了机器学习架构的进步,这些进步已经在上一篇文章中列出。

本节将重点介绍神经架构中的一些关键发展,这些发展使得迄今为止所见的一些 NLP 进展成为可能。这并不意味着对深度学习和机器学习 NLP 架构的详尽审查,而是旨在展示推动 NLP 向前发展的变化。

深度前馈网络

线性深度前馈网络的出现,在 NLP 中也被称为多层感知器(MLP) 引入了非线性建模的潜力。这种发展有助于 NLP,因为存在嵌入空间可能是非线性的情况。以下面的文档为例,其嵌入空间是非线性的,这意味着无法线性划分两个文档组。

It doesn’t matter how you fit a line there is no linear way to split the spam and ham documents

非线性 MLP 网络提供了正确模拟这种非线性的能力。

然而,这种发展本身并没有给 NLP 带来重大的变革,因为 MLP 不能对单词排序进行建模。虽然 MLP 为语言分类等任务的边际改进打开了大门,在这些任务中,可以通过模拟独立的字符频率来做出决策,但对于更复杂或模糊的任务,独立的 MLP 是不够的。

1D CNN

Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification

在应用于自然语言处理之前卷积神经网络(CNN)提供了突破性的结果随着 AlexNet 的出现,计算机视觉在自然语言处理中不再对像素进行卷积,而是在单个或多组单词向量上依次应用和汇集滤波器

在 NLP 中,CNN 能够通过充当嵌入的 n-gram 特征提取器 来模拟局部排序。CNN 模型在分类和各种其他 NLP 任务中为最先进的结果做出了贡献。

最近 Jacovi 和 Golberg 等人的工作有助于更深入地理解卷积滤波器所学的内容,他们证明了滤波器能够通过使用不同的激活模式对丰富的 n 元语法语义类进行建模,并且全局最大池诱导了从模型决策过程中过滤掉不太相关的 n 元语法的行为。

一个很好的入门 1D CNN 可以在下面的链接中找到。

[## 自然语言处理的深度学习——第三部分

距离我写完这个系列的第一部分已经一个月了。在那里,我分享了我对单词向量的一点了解…

medium.com](https://medium.com/cityai/deep-learning-for-natural-language-processing-part-iii-96cfc6acfcc3)

RNNs (LSTM/GRU)

基于由 CNN 提供的局部排序,递归神经网络(RNNs)和它们的门控细胞变体(例如长短期记忆细胞(LSTMs)和门控递归单元(GRUs ))提供了用于对文本中的顺序排序和中间范围依赖性(例如句子开头的单词对句子结尾的影响)进行建模的机制。

[## LSTM 和 GRU 的图解指南:一步一步的解释

嗨,欢迎来到长短期记忆(LSTM)和门控循环单位(GRU)的图解指南。我是迈克尔…

towardsdatascience.com](/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21)

RNNs 的其他变体,如以从左到右和从右到左两种方式处理文本的双向 RNNs 和用于增强未被充分表示或不在词汇表中的单词嵌入的字符级 RNNs ,导致了许多最先进的神经 NLP 突破

An sample of some different RNN architectures and coupled with example use cases.

注意和复制机制

虽然标准的 RNN 架构在 NLP 领域带来了令人难以置信的突破,但它们也面临着各种挑战。虽然在理论上他们可以捕捉长期的依赖关系,但他们往往难以建模更长的序列,这仍然是一个公开的问题。

对于诸如 NER 或翻译之类的序列间任务,次优性能标准 RNN 编码器-解码器模型的一个原因是,它们将每个输入向量对每个输出向量的影响平均加权,而实际上输入序列中的特定单词在不同的时间步长可能具有更大的重要性。

注意机制 提供了对每个输入向量对 RNN 的每个输出预测的上下文影响进行加权的手段。这些机制是自然语言处理中当前或接近当前技术水平的主要原因。

An example of an attention mechanism applied to the task of neural translation in Microsoft Translator

此外,在机器阅读理解摘要系统中,rnn 通常倾向于生成结果,这些结果虽然乍一看结构正确,但实际上是幻觉或不正确的。有助于缓解这些问题的一种机制是 复制机制

Copy Mechanism from Get To The Point: Summarization with Pointer-Generator Networks Abigail See, et all

复制机制是在解码期间应用的附加层,它决定是从源句子还是从通用嵌入词汇表生成下一个单词更好。

与埃尔莫和伯特一起

ELMo 是一个基于单词出现的上下文为其生成嵌入的模型,因此为其每次出现生成略微不同的嵌入。

例如,在上面使用标准单词嵌入的句子中,单词“ play ”编码了多个含义,如动词play或在句子 a theatre production 的情况下。在诸如 Glove、Fast Text 或 Word2Vec 的标准单词嵌入中,单词play的每个实例将具有相同的表示。

ELMo 使 NLP 模型能够更好地区分给定单词的正确含义。在它的发布中,它实现了在许多下游任务中的几乎即时的艺术状态,包括诸如共同引用的任务,这些任务在以前对于实际使用是不可行的。

ELMo 还为在域外数据集上进行迁移学习提供了有希望的启示。Sebastien Ruder 等一些人甚至将即将到来的 ELMo 称为 NLP 的ImageNet moment,虽然 ELMo 是具有实际现实世界应用的非常有前途的发展,并催生了最近的相关技术,如BERT,它们使用注意力转换器而不是双向 RNNs 来编码上下文,但我们将在即将发布的帖子中看到,在神经 NLP 的世界中仍然有许多障碍。

Comparsion of BERT and ELMo architectures from Devlin et. all

行动号召:开始行动

下面是一些资源,可以帮助你开始学习上面提到的不同的单词嵌入。

文档

工具

打开数据集

下一个帖子

既然我们对神经 NLP 中的一些里程碑以及中的模型和表示有了坚实的理解,下一篇文章将回顾当前最先进的 NLP 系统的一些缺陷

如果您有任何问题、评论或话题希望我讨论,请随时在 Twitter 上关注我。

关于作者 亚伦(阿里)博恩施泰因是一个狂热的人工智能发烧友,对历史充满热情,致力于新技术和计算医学。作为微软云开发人员倡导团队的开源工程师,他与以色列高科技社区合作,利用游戏改变技术解决现实世界中的问题,这些技术随后被记录在案、开源并与世界其他地方共享。

超越单词嵌入第 3 部分

原文:https://towardsdatascience.com/beyond-word-embeddings-part-3-four-common-flaws-in-state-of-the-art-neural-nlp-models-c1d35d3496d0?source=collection_archive---------7-----------------------

最先进的神经 NLP 模型中的四个常见缺陷。

TLDR;

自从 word2vec 的出现,神经单词嵌入已经成为在 NLP 应用中封装分布式语义的常用方法。本系列将回顾使用预训练单词嵌入的优点和缺点,并演示如何将更复杂的语义表示方案(如语义角色标记、抽象意义表示和语义依赖解析)整合到您的应用程序中。

介绍

本系列的前几篇文章回顾了最近神经 NLP 中的一些里程碑,以及将单词表示为向量的方法和利用它们的架构进展

尽管神经 NLP 已经导致了许多突破,正如在以前的帖子中看到的那样,但是使用预先训练的单词嵌入和注意机制的最新模型仍然存在许多缺陷。神经 NLP 中的这些缺陷对生产系统有着危险的影响,这些生产系统很少甚至没有不精确和不可预测的余地。

这篇文章将深入探究现代最先进的自然语言处理系统的缺陷。

缺陷 1:词汇推理

尽管基于注意力的模型和更好的嵌入有所改进,但神经 NLP 模型仍难以推断缺失的信息。下面我们来看看神经自然语言推理模型。

这个模型很难识别文本" Jack 和 Jill 攀登珠穆朗玛峰"意味着 Jack 和 Jill 是两个徒步旅行者正在攀登一座,并且错误地声明这两个陈述是中性的。

NLI 模型未能捕捉到这种关系是反直觉的,因为理论上(珠穆朗玛峰,山)和(徒步旅行者,登山者)的嵌入空间应该是接近的。在现实中,很难预先准确预测注意力模型将符合什么特征以及为什么要符合 。

与词汇推理相关的另一个挑战是对算术关系 建模的 概念,尽管诸如神经算术逻辑单元 (NLAU)之类的机制的最新发展已经提高了对基本数字关系建模的能力,但是现有技术的模型仍然倾向于与数字概念作斗争,例如识别当 Jack 和 Jill 一起出现时它们应该与单词 2 对齐。

有关 NALU 的更多信息,请参见:

[## 神经算术逻辑单元快速介绍

经典的神经网络非常灵活,但是它们不太适合某些任务。一些…

towardsdatascience.com](/a-quick-introduction-to-neural-arithmetic-logic-units-288da7e259d7)

缺陷 2:肤浅的相关性

当前最先进模型的另一个挑战是,它们学习数据中的表面相关性,这导致模型捕捉隐含的社会偏见。

下面是几个捕捉这种隐性偏见的模型的例子。

Higher numbers are correlate to positive sentiment where as lower numbers correlate with negative sentiment.

请注意,尽管“我的名字是 __ ”或“让我们去吃 ____ 食物”语句应该都提供几乎相同的情绪,而不管种族如何,但上述神经模型实际上捕捉到了它被训练的数据集的隐含偏差。想象一下,如果这些模型应用于处理简历或模拟保险风险等任务。

最近埃拉泽和戈德堡等人。al 已经做了一些早期的工作,通过对抗训练来消除偏见,然而,尽管在这个领域已经取得了一些进展,它仍然是一个没有解决的问题。

除了偏差的问题,表面的相关性会导致对现有模型性能的夸大估计。在许多大型数据集上,如 SQUAD 或 SNLI,许多神经注意力模型的高性能更多地是学习测试和训练数据集之间的表面相关性的结果,这些数据集实际上并不代表正在解决的问题。

当声称一个模型在测试集上比人类做得更好时,这是一个潜在的原因。表面相关性的一个例子是,仅通过查看前提和假设句子的句子长度,就可以在 SLNI 数据集上生成强基线。

缺陷 3:对抗性评估

表面相关性的一个副产品是,它们将模型暴露在敌对的攻击之下。以下面的 BiDAF 模型为例,我们看到正确地返回了布拉格的问题“特斯拉在 1880 年搬到了哪个城市?”在第一个岗位上。

当我们在段落末尾添加一个更明确但明显不合适的城市参考时,该城市不是特斯拉搬到的,这导致 BiDAF 模型返回一个不正确的答案芝加哥。

From Iyyer and collaborators.

这一点的影响是非常令人震惊的,因为人们可以想象在数字医疗保健、数字保险和数字法律等行业中使用对立的例子来操纵和利用关键的生产 NLP 系统。

缺陷 4:语义可变性

在自然语言中,有许多方式或释义可以表达相同的概念、关系或想法。本系列的下一篇文章将深入探讨这一挑战。

表面相关性驱动许多现有技术结果的一个潜在指标是,即使在给定的测试示例上,模型看起来像预期的那样执行,当相同的测试示例用不同的句法结构表达时,现有技术模型可能失败。

下面的例子很好地证明了这一点,尽管句子“看着孩子受苦没有乐趣”和“看着孩子受苦没有乐趣”表达了相同的情感,用于情感分类的现有技术的树形结构的双 LSTM 模型之一提供了两种完全不同的分类。

Iyyer and collaborators broke the tree-structured bidirectional LSTM sentiment classification model.

为了有一个健壮的模型,它需要超越仅仅记忆与公共句法结构相关的相关性。

先天的先验辩论

上面概述的挑战促成了一场正在进行的辩论,即引入结构来指导神经模型是必要的好事还是坏事。

“结构是必要的善还是恶?."

Yann Lecun and Christopher Manning

这场辩论中的两位主要人物是来自斯坦福大学自然语言处理实验室的克里斯多佛·曼宁和来自脸书研究实验室的扬·勒昆。

虽然 Manning 和 Lecun 都认为引入更好的结构对于减轻上面展示的神经 NLP 系统中的一些缺陷是必要的,但是他们在引入结构的本质上有分歧。

曼宁认为引入结构偏差是一个必要的好处,可以从更少的数据和高阶推理中实现更好的概括。他认为,许多研究使用神经方法来表示结构的方式简化为“美化的最近邻学习”,这阻碍了研究人员构建需要更少数据的更好的架构学习系统。

另一方面,LeCun 认为在神经模型中引入结构是一种【必要的邪恶】迫使模型设计者做出某些假设是有局限性的。他认为结构仅仅是“优化工作所需的元级基础”,并且随着更具代表性的数据集和更强的计算能力,更简单的模型应该能够直接从数据中获得同样强有力的概括。

有关这场辩论的更多信息,请参见:

[## 深度学习、结构和先天优势

本月早些时候,我得到了一个令人兴奋的机会,主持了 Yann LeCun 教授和…

www.abigailsee.com](http://www.abigailsee.com/2018/02/21/deep-learning-structure-and-innate-priors.html)

下一篇文章

事情的真相很可能介于勒村和曼宁这两个温和的极端之间。与此同时,该领域的大多数 NLP 研究人员都同意,为了解决这篇文章中概述的挑战,需要更好的机制来建模和合并语义理解。

NLP 中的大多数最新模型顺序处理文本,并试图隐式地对数据中的复杂关系进行建模。虽然人类的确是按顺序阅读文本的,但是个体之间的关系、单词之间的关系并不是按顺序的。

虽然通过计算来表示语言结构的形式对于该领域来说并不新鲜,但是在过去,形式化规则和注释关系的成本非常昂贵。由神经 NLP 提供的顺序解析的进步为这些系统的实际应用和开发提供了新的途径。

不管你在隐性和结构性学习的辩论中站在哪一边,将语义结构和更好的隐性文本表示相结合的趋势是解决当前艺术系统的陷阱的一个有希望的工具。

如果你站在 LeCun 一边,希望随着更一般化的动态和数据驱动的形式的开发,它们将为如何构建更好的隐式模型提供更好的见解;如果你站在 Manning 一边,目标是使用建模来创建更健壮的语义形式,以便用更少的数据实现更好的建模。

在本系列的下一篇文章中,我们将会看到一些有前途的建模语义结构的方法以及将这些信息整合到实际的 NLP 应用中的演练工具。

行动呼吁

下面是一些有助于更好地理解上述挑战的资源。

如果您有任何问题、评论或希望我讨论的话题,请随时在 Twitter 上关注我。如果您认为我错过了某个里程碑,请告诉我。

关于作者

亚伦(阿里)博恩施泰因 是一个狂热的人工智能爱好者,对历史充满热情,致力于新技术和计算医学。作为微软云开发倡导团队的开源工程师,他与以色列高科技社区合作,用改变游戏规则的技术解决现实世界的问题,然后将这些技术记录在案、开源并与世界其他地方共享。

超越单词嵌入第 4 部分

原文:https://towardsdatascience.com/beyond-word-embeddings-part-4-introducing-semantic-structure-to-neural-nlp-96cf8a2723fb?source=collection_archive---------9-----------------------

将语义结构引入神经自然语言处理

TLDR;

自从 word2vec 的出现,神经单词嵌入已经成为在 NLP 应用中封装分布式语义的常用方法。本系列将回顾使用预训练单词嵌入的优点和缺点,并演示如何将更复杂的语义表示方案(如语义角色标记、抽象意义表示和语义依赖解析)整合到您的应用程序中。

介绍

本系列的最后几篇文章回顾了神经 NLP 中的一些最近的里程碑,将单词表示为向量的方法和利用它们的架构进展,以及现有神经 NLP 系统的常见陷阱

正如我们在之前的文章中所看到的,尽管诸如 attention 等先进的神经技术有助于建立更强大的 NLP 模型,但它们仍然无法捕捉对语言的牢固理解,从而导致了经常意想不到的结果。

这篇文章将关注于将语言结构整合到自然语言处理应用中的形式主义的发展。

正如我们在上一篇文章中所看到的,自然语言有两个特性使得建模变得很困难,模糊性和可变性。我非常感谢BIU NLP 实验室的 Ayal KleinIdo Dagan 对这篇文章的帮助。

歧义

根据出现的上下文,某些单词或短语可以有多种不同的词义。例如,句子“像苹果一样的果蝇”有两种模糊的潜在含义。这个短语可能指的是一种喜欢吃 T21 苹果的飞行昆虫,也可能指的是如果一个人穿过一个水果,它会像苹果一样飞行。

The 6th Century BCE linguist Pāṇini

自公元前 6 世纪的耶斯卡和 Pāṇini 以来,语言学家们已经认识到某些自然单词表现出共同的句法模式和相关的语义属性。为了解决歧义,语言学家定义了某些语法语言属性,如 词性、语态和时态 来帮助区分歧义短语。

虽然句法属性如词性有助于区分单个单词的预期含义,但它们无法捕捉单词之间的关系。

句法 语法

随着 20 世纪 50 年代早期计算机的发展,为了处理文本,对解析单词表示之间的关系的形式化技术重新产生了兴趣。

借鉴前人的正式数学著作,语言学家诺姆·乔姆斯基创造了短语结构语法,其中单个单词用 终结符表示,它们的词性为 终结符 规则 ,可以用更复杂的成分结构如名词短语来构建。

With parts of speech a linguist can easily differentiate between the two potential ambiguous meaning of the above phrase. Constituent structures help formalize part of speech identification by

在实践中,为这些系统创建规则是一项艰苦的工作,而且非常脆弱,因为我们对语言的理解不是决定性的。虽然这些系统取得了一些早期的成功,如 SHRDLU,但这些系统并不比玩具程序多多少。

SHRDLU in action

可变性

虽然近年来神经系统的出现有助于关于词性标注和成分分析和的最新技术成果,但是它们仍然不能有效地概括共享语义的不同句法短语。

为了更好地理解这一点,认识到自然语言可以以多种形式表达是有帮助的。

让我们回到之前帖子中的例子,其中两个句子,如“看着孩子受苦没有乐趣”和“看着孩子受苦,没有乐趣”具有不同的句法结构,但仍然嵌入了相同的语义关系,如孩子、受苦、观看、乐趣没有

以下章节将涵盖一些不同的语义结构,这些语义结构有助于统一出现在不同句法上下文中但保持相同语义的单词之间的关系,不仅有助于更好地理解上下文,还有助于更好地理解词汇推理。

语义结构

语义角色标注(SRL)

SRL 旨在恢复一个句子的动词 述元结构,如谁对谁做了什么,何时,为何,何地以及如何。

For a relatively enjoyable introduction to predicate argument structure see this classic video from school house rock

谓词视为函数 ,将 语义角色视为类类型化参数 。AllenNLP 提供了一个最新的 SRL 标记器,可以用来映射动词谓词和论元之间的语义关系。

Allen NLP SRL model

语义角色标注的一个挑战是,虽然更容易解析,但它只映射给定句子的动词谓语论元信息,因此这种表示本质上无法捕捉副词和形容词之间的重要上下文关系。此外,谓词\处理复杂事件共指需要消除歧义。

抽象意义表征

AMR 是从句子结构中抽象出关系的语义表示,例如在下图中,三个句子在同一个 AMR 图中表示。

Convcomp2016: Verso la “chat intelligente”: la ricerca in Natural Language Processing e Machine Learning

AMR 图是有根的、有标签的、有向的、无环的图( DAGs ),包括整个句子。AMR 代表偏向于英语——它并不意味着作为一种国际辅助语言。虽然 AMR 到文本生成很有前途,但是准确解析 JAMR 仍然是一个公开的问题。JAMR 解析器是一个既能解析又能生成 AMR 语句表示的解析器。

语义依赖分析(SDP)

SDP 任务类似于上面的 SRL 任务,除了目标是捕获一个句子中所有实词的谓词-论元关系。艾尔。, 2014).这些关系是由不同的语言学派生的语义语法定义的。

Example Semantic Dependency Grammars

与 SRL 不同,SDP 解析考虑了所有实词之间的所有语义关系,而不仅仅是动词和名词谓词。因此,它们不需要谓词意义歧义消除,并且能够表示更广泛的语义现象。

此外,与 AMR 语义依赖解析不同,SDP 与句子标记对齐,这意味着它们更容易与神经 NLP 序列模型一起解析,同时仍然保持语义泛化。

语义依赖解析任务已经有了稳步的改进,对于这个任务,最好的开源工具之一是 call NeurboParser。然而,由于 NeurboParser 是用 C++编写的,安装和使用起来很棘手,所以我冒昧地为这个工具编写了一个 python 包装器和 docker 环境,可以在这里找到。

[## aribornstein/pyNeurboParser

NeurboParser 的 python 包装器。通过在…上创建帐户,为 aribornstein/pyNeurboParser 的开发做出贡献

github.com](https://github.com/aribornstein/pyNeurboParser)

未来的帖子将记录如何开始使用 pyNeurboParser。

开放知识表示 OKR

上述语义表示只映射到句子级标记。在现实世界的实际应用中,表示跨多个句子、段落和文档的数据之间的关系是很重要的。

一个早期的尝试是提供一个统一的知识表示来链接语义分析与事件和实体相互引用,这就是 T2 OKR:一个统一的多文本开放知识表示。

Ori Shapira 的一个演示应用于事件新闻推文的交互式抽象摘要任务,OKR 将多条推文映射为语义摘要在此可以找到。

总结和未来工作

上述语义表示的一个关键挑战是它们是由语言学家在特定领域语料库上开发的,并且它们可能是复杂的和难以理解的。

目前有许多 NLP 实验室,如华盛顿大学、巴尔-伊兰大学、脸书人工智能研究所和艾伦人工智能研究所,它们正在致力于生成新的语义自然语言语法,这些语法是由解析它们的文档驱动的。

QA- SRL demo learned relations from natural text http://qasrl.org/

这项工作的一个例子是 QA-SRL,它试图对自然语言符号之间的关系提供更容易理解和动态的解析。

[## 质量保证-SRL |浏览数据

编辑描述

demo.qasrl.org](http://demo.qasrl.org/)

行动呼吁

下面是一些资源,可以更好地理解上面概述的语义解析工具。

工具

资源

下一篇帖子

在这个系列中,我们已经讨论了自然语言处理中除嵌入之外的一些最新发展和趋势。未来的帖子将涵盖相关的进步和代码示例,说明如何随着领域的发展使用这些工具。我还对与计算机视觉、时间序列处理和机器学习操作化相关的主题感兴趣,并将尝试涵盖这些主题。

如果你有任何问题、意见或话题想要我讨论,请随时在推特上关注我。

关于作者 亚伦(阿里)博恩施泰因是一个狂热的人工智能爱好者,对历史充满热情,致力于新技术和计算医学。作为微软云开发倡导团队的开源工程师,他与以色列高科技社区合作,用改变游戏规则的技术解决现实世界的问题,然后将这些技术记录在案、开源并与世界其他地方共享。

如果我们听之任之,大数据会有偏见

原文:https://towardsdatascience.com/bias-in-big-data-for-the-non-tech-90fc53729025?source=collection_archive---------2-----------------------

如果我每次听到“数据不会说谎”都能得到一便士…

对于我们这些肩负着使用大数据来帮助解决组织中一些最大的低效、问题或难题的令人兴奋且日益增长的任务的人来说,永久化偏见是一种太容易犯的错误,我们现在都应该熟悉它了。

对于其他人来说,这是怎么回事:

快速回顾对于那些当数据术语抛向你时感到困惑的人

( 如果这不是您要找的信息,请沿着移动到下一部分 )

  • 大数据是大量的数据。大量用于识别模式、趋势和关系的定量和定性指标。
  • 算法' 在计算或其他解决问题的操作中要遵循的过程或一组规则。例如,如果我决定早上穿什么,我会在心里使用一种算法,考虑天气、我的心情、我要去的地方,以及昨晚我不该吃的 Ben & Jerry's,这导致我选择我的服装。
  • 机器学习为系统提供自动学习和根据经验改进的能力,而无需明确编程。。如果我是一个机器学习算法,我昨晚就不会吃那个本&杰里的,因为我会从上次做的事情中知道我会后悔。

偏见是如何被引入我们的“智能”世界的

我第一次接触数据驱动偏见的概念让我大吃一惊,让我想知道我以前怎么没见过。那是 ProPublica 的一篇题为《机器偏见》的文章。就在标题后面写着:

全国各地都有用来预测未来罪犯的软件。而且对黑人有偏见。

TL;这里的故事是,美国几个州实施了一种算法来预测被告在法庭上再次犯罪的风险,并在量刑时将这一数值作为一个因素。有趣的是,种族或民族声称不是这个算法中的变量,但不知何故,它最让黑人失望。只有 20%的被告被认定在未来有实施暴力犯罪的高风险,但实际上却有;而且它误标黑人的比率几乎是白人的两倍。

整篇文章和他们对数据的分析绝对值得一读,但最重要的是,这不是算法让少数民族和其他群体失败的唯一地方。

Credit: Ford Foundation

重要的是要注意,在我们进一步深入这个兔子洞之前,我不认为人们建造这些工具的意图是故意歧视或制造任何种类的偏见。我们可以提出完全相反的观点:像这样的工具旨在通过提供“不可否认的”、可量化的、值得信任的数据来限制任何进行风险评估的人的个人偏见。

很长一段时间以来,我的座右铭是“如果什么都不变,什么都不变”,在这种情况下它听起来最真实。偏见不是什么新鲜事,它需要在数据科学领域内外采取具体行动来克服。通过向我们的算法输入历史数据,我们含蓄地告诉它们歧视历史上被歧视过的每一个人。

这些例子中的一些已经融入了我们的文化,我们接受它们作为规范——尽管并不总是愉快的:你的性别、收入、教育水平和其他因素决定了你将支付多少医疗费用。一些与健康相关的指标也是如此,比如你是否吸烟。然而,不吸烟的健康女性比每天抽两包烟的久坐不动的男性支付更多的保险费并不罕见,尽管许多医生同意,根据该数据,后者更有可能生病。

性别偏见的另一面:出于类似的原因,男性确实会为汽车保险支付更多的钱。例如,一个住在内华达州的 18 岁男性,如果不幸在那里长大,平均每年要为他的轿车支付 6268 美元的保险费。这比他的双胞胎姐姐支付的费用高 51%(假设他们有相同的成绩和驾驶记录),根据 CoverHound 的分析,他的双胞胎姐姐只需支付 4152 美元就可以购买一辆相同的汽车,。既然我们谈到了汽车保险这个话题,在风险相似的社区里,少数族裔比白人支付更多的汽车保险。

这比以往任何时候都重要

这种算法已经存在了几十年,许多时间被组织用来通过使用适用于每个人的可重复模式来扩展他们的操作。

我们现在比以往任何时候都更需要关注这个问题的原因是,通过一个不断增长和繁荣的科技行业,这些模型正在几乎所有地方得到应用:从法院判决、求职、信用卡、大学和抵押贷款申请、消费品等,到人工智能语音机器人评估教师表现有针对性的社交媒体广告等等。

这意味着,无论你是否对大数据、算法和技术感兴趣,你今天都是其中的一部分,它将越来越多地影响你。

如果我们不制定可靠、可操作和可访问的解决方案来处理数据科学中的偏见,这些类型的通常是无意的歧视将变得越来越正常,与人类方面正在尽最大努力进化过去的偏见的社会和机构对立,并作为一个全球社区在历史上前进。

今天做什么

这个问题的解决方案不是停止围绕大数据算法和机器学习的创新。幸运的是,几个方面正在取得进展。

算法英雄

Joy Buolamwini(下面是她精彩的 TED 演讲)创立的算法正义联盟(Algorithmic Justice League)和算法观察(AlgorithmWatch)等组织正在努力通过提供教育和培训材料来帮助评估和识别现有算法中的偏见,并为人们提供一个协作和包容的空间来报告算法中的偏见,并作为一个社区来帮助解决这些问题。

有许多其他的个人、研究人员和组织正在以不同的方式处理这种情况。

政策变化同欧洲

不幸的是,像 AJL 这样的组织不足以保证必要的改变。变革需要政策支持。在欧洲,GDPR(2018 年 5 月在欧盟生效的一般数据保护法规)将监管涉及数据偏差的三个关键因素

首先,剖析,他们将其定义为

任何形式的个人数据自动处理,包括使用个人数据评估与自然人相关的某些个人方面,特别是分析或预测与该自然人的工作表现、经济状况、健康状况、个人偏好、兴趣、可靠性、行为、位置或活动相关的方面。

与此同时,向消费者清楚地解释他们的数据将如何被使用,并为他们提供选择退出的选项。

其次,解释权。当公司使用自动化决策时,如果决策完全由算法和数据做出,用户将有权要求解释和争议决策。这一行动的范围尚未完全确定,但预计将适用于信贷申请、求职和其他关注领域。

最后但同样重要的是,有一个特定的偏见和歧视部分,防止组织使用可能会助长偏见的数据(如种族、性别、宗教或政治信仰、健康状况等)来做出自动决策(除了一些经核实的例外)。

接下来需要发生什么

与人类偏见不同,我们可以通过将偏见作为另一个指标来快速教会算法考虑和避免偏见。我们还可以制定政策来防止数据驱动偏差的发生。在我看来,在不久的将来,我们需要在三个主要领域努力,以确保在数据空间中减少偏差。

教育

潜在的最重要的方面,也是短期内最容易实现的方面,是促进和要求对参与创建和维护自动化决策工具以及其他容易产生偏见的数据驱动工具的人员进行培训和教育。

在科技行业,我们看到了很多关于偏见的争议,并通过增加人力资源层面的教育和培训来应对这一问题;试图在个人层面传播多样性和平等的价值。现在是扩大培训范围的时候了,应该让所有相关人员了解他们在开发工具时所做的决定可能会对少数群体产生的影响,并提供相关的技术知识来防止这种情况发生。

不属于科技行业的人也应该意识到这一点,足以识别他们什么时候可能成为受害者并大声说出来。如果没有个人分享他们的故事,以及这些方法如何改变了他们的生活,信息就会变得冷漠和没有人情味,这正是我们试图避免的。

规定

我特别喜欢 GDPR 的例子(尽管它的实施效果如何还有待观察),因为它来自一项命令。这不是一个建议或选项,它需要发生。欧盟议会认为,数据安全越来越与全体公民息息相关,并认为这也可能对部分公民不公平。这里面有难以置信的价值和验证。

这种数据监管,特别是关于偏见和歧视的监管,在我看来是大数据行业健康发展的关键。如果没有公共部门的领导,忽略对受歧视人群给予特别关注的必要性的机会太诱人了,也太实惠了。

透明度

最后,这是我个人的信念,我认为收集数据和开发这些工具的组织的某种程度的数据透明度将有助于识别和防止这种事情在未来发生。机器可以学习,但人类的洞察力需要成为他们的监督老师,通过开放和共享非个人数据来分析偏见,组织可以从寻求促进公平的多元化全球社区的力量中受益。

免责声明:这并不意味着对现有算法的科学分析或对前景的技术评估,而是对不经常参与这一领域的人们所发生的事情的一种谦卑的翻译。

偏差-方差困境?

原文:https://towardsdatascience.com/bias-variance-dilemma-74e5f1f52b12?source=collection_archive---------17-----------------------

偏差-方差困境与监督机器学习相关。这是一种通过分解预测误差来诊断算法性能的方法。有三种类型的预测误差:偏差、方差和不可约误差。

  • 偏差误差:由于偏差造成的误差,即模型的预期(或平均)预测值与试图预测的真实值之间的差异。当然,只有一个模型,所以谈论预期或平均预测值可能看起来有点牵强。然而,如果它不止一次地重复模型构建过程:每次收集新的数据并运行新的分析来创建新的模型。由于基础数据集中的随机性,生成的模型将具有一系列预测。偏差通常衡量这些模型的预测与正确值的差距。假设对具有非线性模式的数据集进行线性回归拟合:

High bias model(underfitting).

无论收集了多少更多的观察值,线性回归都无法对这些数据中的曲线进行建模!这就是所谓的欠拟合。

  • 方差误差:方差引起的误差是给定数据点的模型预测的可变性。再一次,想象有可能多次重复整个模型构建过程。方差是给定点的预测在模型的不同实现之间的变化程度。例如,有一种算法可以使一个完全不受约束的灵活模型适合数据集。

High variance (overfitting)

如上图所示,这个无约束模型已经基本记住了训练集,包括所有的噪声。这就是所谓的过度拟合。

  • 不可约误差是真实关系中任何模型都无法从根本上减少的噪声项。它通常来自固有的随机性或不完整的功能集。

从根本上说,处理偏差和方差实际上就是处理欠适应和过适应。偏差减少,而方差相对于模型复杂度增加。例如,线性回归中的多项式项越多,生成的模型就越复杂。换句话说,偏差具有负的一阶导数以响应模型的复杂性,而方差具有正的斜率。

The relation between bias and variance.

为什么在偏差和方差之间有一个权衡?

低方差(高偏差)算法变得不太复杂,具有简单或严格的底层结构。这些模型包括线性或参数算法,如回归和朴素贝叶斯。

另一方面,低偏差(高方差)算法变得更加复杂,具有灵活的底层结构。这些模型包括非线性或非参数算法,如决策树和最近邻算法。

复杂度的权衡是偏差和方差的权衡,一个算法不能同时变得更复杂和更简单。

Understanding the Bias-Variance Tradeoff, by Scott Fortmann-Roe.

总误差是多少?

然后,总误差可以分解为偏差、方差和不可约误差分量:

Bias-Variance card by Chris Albon.

如何检测过拟合和欠拟合,有什么解决方案?

过拟合导致低训练误差和高测试误差,而欠拟合导致训练和测试集中的高误差。

然而,当数据点相对较少而算法需要许多数据点时,测量训练和测试误差是困难的。在这种情况下,一个很好的选择是使用一种叫做交叉验证的技术。

这是我们把整个数据集分成 k 个组的地方。对于每个 k 组,我们在剩余的 k-1 组上进行训练,并在第 k 组上进行验证。这样,我们可以最大限度地利用我们的数据,本质上就是获取一个数据集并在其上训练 k 次。

Cross-validation

至于检测到问题后怎么办?高偏差是一个足够简单的模型的症状。在这种情况下,最好的办法就是选择一个更复杂的模型(获取更多的要素或尝试添加多项式要素)

高方差的问题更有趣一点。减少高方差的一个简单方法是使用更多的数据。理论上,对于复杂的模型,随着样本数趋于无穷大,方差趋于零。然而,这种方法是幼稚的,因为方差减小的速率通常相当慢,并且大数据问题几乎总是很难遇到。

减少方差的更好的解决方案是使用正则化。它很好地模拟了训练数据,惩罚它变得太复杂。本质上,正则化通过告诉模型不要变得太复杂而将偏差注入模型。常见的正则化技术包括 lasso 或 ridge 回归、神经网络的丢弃和软边界支持向量机。

或者,你可以获得 5 美元/月的中等订阅。如果你使用这个链接,它会支持我。

用数据克服你的偏见

原文:https://towardsdatascience.com/biases-and-how-to-overcome-them-692c8c35f4a5?source=collection_archive---------17-----------------------

(Source)

我们不擅长客观地看待世界。数据可以有所帮助。

有一个广为流传的神话——也许是经济学课程教给你的——人类是理性的。传统观点是我们客观地分析世界,得出准确的结论,并做出符合我们最大利益的决策。虽然很少有人完全接受这种观点,但我们仍然经常意识不到自己的认知偏差,结果是我们投票、花钱、形成基于扭曲世界观的观点。

我最近的一次亲身经历——由于认知错觉——让我严重误判了现实——让我明白了这一点,并证明了检查我们对世界的看法的重要性。虽然这种情况没有负面后果,但它提醒我们,我们都受到强大的偏见的影响,个人意见不能代替检查数据。

搬到波士顿后不久,我注意到一个惊人的现象:很多人吸烟。几天后,在我看来,每个街角都挤满了点燃香烟的人。我来自中西部的一个小镇,在那里很少看到有人吸烟,我很沮丧:也许大城市鼓励了我最终会染上的不良恶习,或者更糟的是,吸烟率在全国范围内都在上升。

几十年前,我别无选择,只能要么坚持这一信念,要么费力地在图书馆寻找人口统计数据,而现在我能够在几秒钟内从疾病控制和预防中心找到经过验证的数据。令我惊讶的是,我发现下表比较了离我的小镇最近的大都市地区(伊利诺伊州皮奥里亚)和波士顿的吸烟率,这大大打击了我对自己的理性看法:

Source: CDC

正如不重叠的 95%置信区间所示,我不仅错了,而且明显错了。(尽管我们倾向于关注单个数字,考虑不确定性估计是至关重要的,尤其是在处理现实世界的人口统计数据时)。为了直观地展示我是多么的错误,甚至考虑到不确定性,我做了下面的吸烟率箱线图:

Boxplot of Smoking Rates

为什么我错了?我坚信分析你的错误,这样你就不会再犯在这个过程中,我总结出三个理由:

  1. 可用性启发式 : 我们通过记忆中某件事出现的次数来判断它发生的可能性有多大。
  2. 证实偏差 : 一旦我们有了一个信念,我们就会无意识地寻找证实它的证据,而忽略与之相矛盾的证据。
  3. 分母忽略 : 我们只看分子——吸烟者的数量——而忽略分母——我们一天中看到的总人数。

这些都是认知偏差的例子——推理中的错误和对理性决策的偏离——或者启发式——我们用来快速做出判断的心理捷径(经验法则)。虽然这些在我们进化的过去很好地服务了我们,但在今天的世界它们经常让我们失望。我们现在需要处理许多具有复杂交互因素的信息流,而我们快速的直觉并不适合这个目的。

(关于认知偏差以及如何克服它们的权威参考,请阅读丹尼尔·卡内曼的杰作 思考,快与慢 学习这些的一个不那么吓人的格式是 你没那么聪明播客 )。

纠正我们先天不足的最简单的方法之一就是检查我们自己。尤其是在一个有如此多准确信息可自由获取的时代,坚持错误信念是没有借口的。不要从个人经历/轶事中推理,而是去查实际数字!

此外,除了找出正确的答案,思考我们为什么会出错也很重要。我们永远无法摆脱认知偏见,但我们可以学会识别它们何时出现以及如何克服它们。例如,我应该注意到不吸烟的人(分母),或者想想我每天在我的小镇上看到的总人数与我在波斯顿观察到的人数相比。

在最后一点的基础上,虽然看数据本身是有用的,但试图理解它在你的生活中意味着什么可能更有帮助。这就是一些统计和基本数据操作大有用武之地的地方。

在我的家乡,平均每天,我可能会看到大约 50 人在附近散步(好吧,在中西部没有人散步,但和我在一起),相比之下,波士顿的人数可能是 5000 人的 100 倍。知道了吸烟率和我期望看到的总人数,我模拟了 10,000 天,以找出与我的家乡相比,我在波士顿一天期望看到多少吸烟者。(GitHub 上有 Jupyter 笔记本)。

Simulation results for 10,000 days in my hometown versus Boston.

尽管我的家乡吸烟者的比例在统计上更高,但就原始数据而言,平均每天我会看到大约 100 倍于波士顿的吸烟者。这些图表,加上我对分母的忽略,显示了为什么我如此容易受到可用性启发的影响。

为什么这很重要

虽然这个小例子无伤大雅,但我们偏见的普遍影响是普遍的,而且往往是有害的。例如,由于负面新闻占主导地位(体现在可用性启发中),人们普遍认为世界正在变得更糟。事实上,从几乎所有的客观标准来看,我们正生活在人类历史上最好的时期,情况正在改善。(所有图表均来自启蒙运动现作者史蒂芬·平克)。

**

Graphs showing positive gains in numerous measures worldwide.

这具有现实世界的含义:人们投票给承诺回到更好时代的领导人,因为他们没有看数据,没有意识到现在是最佳时机!离开政治,想想你的个人生活:有没有一段你花了太长时间的感情,一份你一直坚持的消极工作,或者甚至是一本书,尽管你不喜欢,但你还在继续读?那么你就成了沉没成本谬误的受害者,我们继续在努力上浪费时间,因为我们已经付出了努力。

再举一个例子,如果你发现自己在担心航空旅行,不要去读那些微不足道的飞机坠毁事件,看看显示飞行是最安全旅行方式的数据。

我试图为自己采纳两条简单的规则来减轻认知偏差:

  1. 查找相关数据:尝试寻找多个可靠的来源,考虑不确定性估计,并在可能的情况下自己探索数据
  2. 寻找不确定的证据 : 当你读的所有东西都证实了你的信念时,很可能是时候读点别的了。

遵循这些指导方针不会让我变得完美,但是它们会帮助我逐渐变得少犯错。我不相信总有一个客观真理,但我确实认为事实比我们的主观判断好得多。

以一个令人高兴的消息结束这篇文章,这里有一个图表显示了美国吸烟率的下降(尽管我有误解)!

National Smoking Rates in the United States (Source: Gallup). There’s no substitute for accurate data.

一如既往,我欢迎反馈和建设性的批评。可以通过 Twitter @koehrsen_will 或者通过我的网站 willk.online 找到我。

BiBirra:啤酒标签识别

原文:https://towardsdatascience.com/bibirra-beer-label-recognition-8546c233d6f4?source=collection_archive---------4-----------------------

几周前,我和我的女朋友在超市,我们被邀请去吃饭,我们想带酒。我们都不是葡萄酒专家,但她有一张绝妙的王牌,她拿出手机,拍了一张葡萄酒标签的照片,立即得到了对那瓶酒的描述和评论。那个应用程序的强大给我留下了深刻的印象(它被称为 ViVino ),她要求我开发类似的东西。

我接受了这个挑战,但加入了一些个性化的内容:

  • 因为比起葡萄酒,我更喜欢啤酒,所以我想做一个啤酒识别应用程序
  • 我想比维维诺做得更好,甚至能从一张照片上认出多个瓶子。

这就是我如何想出 BiBirra (birra 是啤酒的意大利语)

我们需要构建啤酒识别器的第一件事是啤酒图像的数据库。据我所知,没有这样的数据库存在,所以我们只能做一件事:

That’s not exactly what Jian Yang said

幸运的是,网络上充斥着卖啤酒的网店,我已经开发了一个名为 Raschietto 的小型网络抓取图书馆。这个库让我可以非常快速地编写刮刀,不到一天我就可以从网上收集到大约 2300 张啤酒瓶图片以及它们的基本信息(名称、类型、颜色、酒精体积、苦味……)。

关于每种啤酒的信息到处都有一些缺失的数据(主要是因为一些商店不包含太多关于啤酒的信息),清理这些数据以获得像 ViVino 一样的完美结果真的很耗时,需要大量的手工工作。我的目标是创建一个工作原型和图像,所以我决定继续下一阶段。

瓶子检测

在进行实际的啤酒识别之前,我们首先需要检测图像中的每个瓶子。由于瓶子的形状非常独特,这很容易做到。一种方法是训练二元(两类:啤酒或非啤酒)分类器,然后应用滑动窗口方法来检测每个瓶子。具体来说,这意味着在整个输入图像的不同位置和尺度上应用分类器,然后应用非最大抑制来移除重叠的边界框。

An example of sliding window

可以使用经典的 HOG+SVM 组合来构建分类器,这在检测形状没有太多变化的对象(例如)方面非常好。我们只需要从每个训练图像中提取一个梯度方向直方图(HOG)

然后在转换后的数据上训练线性支持向量机(SVM)

这种历史悠久的方法非常强大,但训练这样的分类器非常耗时,尤其是当我们考虑到我们可以免费且几乎立即获得一个基于现代深度学习的现成模型时。

单发探测器

为了检测,我决定使用一种特殊类型的 CNN ( 卷积神经网络)称为单次检测器。这种神经网络直接输出一组包围盒和类来实现检测,而不使用滑动窗口。

这种架构的一个很大的优点是输入图像的每个像素只被提供给模型一次(与使用滑动窗口时的多次相比),这意味着我们不会浪费资源多次重新计算局部特征。这个观察激发了一个著名的探测模型的名字:YOLO ( 只看 一次)。类似的机型还有很多: SSDR-CNN更快的 R-CNN

我决定使用这里介绍的模型,它是 MobileNet 架构和单次检测器框架的组合,可以检测:飞机、自行车、鸟、船、瓶子、公共汽车、汽车、猫、椅子、牛、餐桌、狗、马、摩托车、人、盆栽、羊、沙发、火车和电视监视器。这个使用 MobileNet 架构的模型是轻量级的,但是仍然有很好的性能。

我只需要 bottle 类,所以这个模型可能有点过了,但它工作得很好(识别算法对检测错误很健壮),很快,随时可以使用,所以我决定采用它。

An example of detection failure but correct recognition (I know, the background is quite strange but this is what I’ve found on the internet)

啤酒识别

算法的关键部分来了,给定一个瓶子的图像,我们需要拿出一个啤酒标签。如果我们把这个问题看作一个分类问题,我们有 2300 个类,每个类有 1 或 2 个例子,这是一个不可能的问题。更好的方法是把它看作一个基于内容的图像检索(CBIR) 问题:给定一张啤酒的图片,我们需要在数据库中找到最相似的图像。我们需要做的唯一事情是定义(或学习)一个相似性度量,并使用它来比较查询图像和我们数据库中的所有图像,并选择最相似的一个。检索过程可分为两步:

  1. 嵌入:我们需要从每张图片中提取出其内容的简洁表示。然后,我们使用这种表示来计算两幅图像之间的相似性。嵌入的一个例子可能是计算颜色直方图或使用由自动编码器学习的潜在表示。
  2. 索引:给定查询图像的嵌入,我们将需要一种从数据库中检索最相似图像的有效方法。索引算法帮助了我们,允许我们进行快速的最近邻查询。

筛选/冲浪功能

每个啤酒标签都是独一无二且固定不变的(除了视角和光线的变化),因此使用筛选(或冲浪)描述符可以获得良好的代表性。这些描述符所做的是找到图像上的一组关键点(连同它们的比例和方向),然后用浮点向量表示每个关键点(例如 SIFT 产生长度为 128 的向量)。这些描述符被设计为对比例、旋转和光照的变化具有鲁棒性。

对于像 SIFT 或 SURF 这样的局部描述符,可以使用许多方法:

  • 使用一个视觉单词包方法,用描述符频率的直方图表示每个图像,然后比较这些直方图,在数据库中找到与查询图像最相似的图像。
  • 使用本地描述符和 RANSAC 来尝试将查询图像与 DB 中的每个图像对齐,然后选择最匹配的一个。如论文中提出的“手机酒标识别”。
  • 给定一个查询图像,对于每个描述符,从数据库中找到最相似的描述符,并给相应的图像一些点。在使用所有描述符后,选择得分最高的图像作为匹配。

我发现后一种方法(我认为是我发明的)在这种情况下更好,所以我决定采用它。请注意,这种方法不需要任何对齐阶段,因此比论文中提出的方法更快,并且通过同时查询所有图像,允许使用索引来加速查询。

为了进一步提高查询速度,我使用 PCA 将描述符压缩到 16 维。这种压缩不影响准确性(它删除了许多不重要的功能),但大大减少了空间和时间需求。

A visualization of the structure used by Annoy

用 airy 近似最近邻

为了获得快速的最近邻居查询,我决定使用骚扰(由 Spotify 开发)

aroy(Approximate Nearest NeighborsOh Yeah)是一个 C++库,使用 Python 绑定来搜索空间中靠近给定查询点的点。它还创建了基于文件的大型只读数据结构,这些数据结构被映射到内存中,以便许多进程可以共享相同的数据。

在引擎下,airy 创建了一个二叉树森林,每个二叉树都是通过用随机超平面分割数据来构建的。每个查询将返回一组近似的最近邻。由 aroy 产生的结果只是近似的,不能保证得到最接近的点,但这是减轻维数灾难和获得良好性能的代价。

结果

我收集了一个非常小的测试集,由 45 张啤酒图片组成,我达到了 100%的准确率。如此小的测试集在统计上并不显著,但这一结果无疑是良好性能的标志。

让我们来看看算法的运行情况:

The algorithm works also in case of detector failure (left) and in presence of occlusion (right)

你可以在我的网站https://Matteo . ronche tti . XYZ上找到更多关于我的信息,我所有的项目和我所有的帖子

我写的关于计算机视觉的其他文章:

[## 用 Python 和 OpenCV 创作点彩画

我最喜欢的绘画技巧之一是点彩画,这是一种用小的不同颜色点…

hackernoon.com](https://hackernoon.com/https-medium-com-matteoronchetti-pointillism-with-python-and-opencv-f4274e6bbb7b)

大数据分析和零售—未来会怎样?

原文:https://towardsdatascience.com/big-data-analytics-and-retail-what-does-the-future-have-in-store-e2afd5a7d1e4?source=collection_archive---------0-----------------------

多亏了互联网,今天大多数人都有能力跟上当前的市场趋势和新兴技术。联网设备的无处不在、不断发展的技术环境和不断增长的人均收入是普通消费者期望值大幅提高的部分原因。因此,B2C 公司一直在努力满足消费者的奇思妙想。

例如,出于同样的原因,零售业多年来经历了许多经营变革。大数据分析解决方案在帮助零售商实现上述变化方面一直发挥着关键作用。因此,随着越来越多的零售商不断致力于增强供应链运营、改善营销活动、提高客户满意度和忠诚度,以实现高水平的零售成功,分析解决方案的采用稳步增长。

我写的另一篇文章探讨了一些主要的技术创新,这些创新目前正在帮助零售业的一些分析操作。现在,让我们来看看可能会塑造未来零售业的一些技术。

可穿戴技术

很久以前,使用智能手机、平板电脑和个人电脑进行零售交易已经变得司空见惯。然而,与可穿戴设备相关的进步可能会在不久的将来进一步提升购物体验。例如,Apple Pay 是一款在零售领域掀起波澜的应用。Apple Pay 是一种数字钱包或移动支付服务,由苹果公司于 2014 年推出。

除了 iPhone、iPad 和 Mac 设备,这项服务也适用于 Apple Watch。这项服务使消费者能够在零售店进行简单安全的支付。双击手表侧面的按钮,调出保存的借记卡/信用卡。然后消费者只需将手表靠近商家终端,几秒钟内就完成了支付。

可穿戴设备的类似应用可能会被开发出来,这不仅会节省消费者和零售商的时间,还会促进大数据分析操作的数据收集。

虚拟现实

由于虚拟现实(VR)技术,今天的几家零售商能够提供身临其境的购物体验。例如,阿迪达斯推出了基于微软 Kinect 技术的 BodyKinectizer,为顾客提供数字零售体验。

BodyKinectizer 是一款低成本的人体扫描仪,可以对客户进行精确的 3D 扫描。然后,该系统会根据顾客的身体尺寸给出尺寸建议。该系统还包括一个交互式触摸屏界面,允许他们打扮自己的虚拟自我。这有助于顾客想象自己穿着他们选择的服装,从而提供丰富的零售体验。

随着技术变得更加可扩展和可访问,零售行业对 VR 的采用将会增加。

无人机和卫星

Orbital Insight(地理空间大数据公司)首席执行官詹姆斯·克劳福德(James Crawford)透露,深度学习人工智能神经网络可用于确定到达零售店的车辆数量。可以看出周模式,这有助于零售商了解购物者的行为。这些见解还有助于实时规划和衡量销售活动。

此外,与商店往返客流量相关的数据有助于衡量不同天气条件下的销售业绩。

人工智能

根据德勤关于 2016 年零售趋势的报告,机器人帮助下的自动化在商店中越来越普遍。例如,沃尔玛正在与五行机器人公司合作开发一款名为 Dash 的机器人购物车,它将帮助客户找到商品,同时减轻他们推着沉重的购物车时的压力。购物车也有助于方便支付。

另一个例子是零售连锁店 Lowe's,它最近与 Fellow Robots(一家技术公司)合作推出了 LoweBot。LoweBot 是一个五英尺高的自主服务机器人,具有自主导航、库存审计、语音识别和避障等功能。

LoweBot 主要服务于两个目的:库存管理和客户协助。机器人能够扫描库存并保存相关数据。这些数据有助于零售商做出更快的商业决策。该机器人使用 3D 扫描来检测人体框架,并通过语音识别与客户交流。它帮助顾客在商店内导航并找到所需的商品。

(representative image)

显然,零售业正在快速发展,消费者的行为也随着技术的进步而改变。率先采用新兴技术的零售商将会出现在新闻中,因此也是相关的。此外,他们更有可能吸引新客户,并保留现有的客户群。

相反,抵制变革的企业将很快被遗忘。随着越来越多的零售商采用最新技术,有效利用大数据分析解决方案将成为获得竞争优势的关键。

沃尔特·勒布在一篇文章中写道,后千年人口,通常被称为 Z 世代,将极大地影响零售业未来的发展。58%的人说他们喜欢在实体店购物。

在尝试新产品和在社交媒体上分享信息方面,Z 世代似乎也很热情。这种消费者行为至关重要,因为实体和在线零售商都在不断尝试寻找新的方式来提供差异化服务。此外,零售商意识到了社交媒体评论的重要性,以及它们会如何影响或破坏自己的商业声誉。

在这方面,看看零售业的影响者和专业人士在 2017 年 1 月在纽约市举行的全球领先的年度零售活动-零售大展(NRF 年度会展)上说了些什么:


这篇报道最早出现在 BRIDGEi2i 博客 上。

大数据分析:技术和工具

原文:https://towardsdatascience.com/big-data-analytics-its-technologies-and-tools-e77f9bd0d37c?source=collection_archive---------1-----------------------

Big Data Analytics: It’s Technology and Tools

大数据主要由数据集的容量来定义。大数据集通常都很大——达到数十 TB——有时甚至超过数 Pb。术语“大数据”之前是使用数据库管理系统(DBMS)管理的超大型数据库(VLDBs)。如今,大数据分为三类数据集——结构化、非结构化和半结构化。

What is Big Data Analytics?

结构化数据 集合包括可以以其原始形式用于导出结果的数据。例子包括关系数据,如雇员工资记录。大多数现代计算机和应用程序被编程为以预设格式生成结构化数据,以使其更易于处理。

非结构化数据 集合则相反,没有适当的格式化和对齐。例子包括人类文本、谷歌搜索结果输出等。这些随机收集的数据集需要更多的处理能力和时间来转换成结构化数据集,以便它们可以帮助得出切实的结果。半结构化数据集是结构化和非结构化数据的组合。这些数据集可能具有适当的结构,但是缺少用于排序和处理的定义元素。例子包括 RFID 和 XML 数据。

半结构化数据集是结构化和非结构化数据的组合。这些数据集可能具有适当的结构,但是缺少用于排序和处理的定义元素。例子包括 RFID 和 XML 数据。

大数据处理需要特定的物理机和虚拟机设置才能得出结果。处理是同时进行的,以尽可能快地获得结果。如今大数据处理技术还包括云计算人工智能。这些技术通过自动化许多流程和任务来帮助减少人工输入和监督。

大数据不断发展的本质使得人们很难给它一个普遍接受的定义。根据处理数据集所需的技术和工具,数据集被归类为大数据状态。

大数据分析—技术和工具

大数据分析是通过分析不同类型的大数据集来提取有用信息的过程。大数据分析用于发现隐藏的模式、市场趋势和消费者偏好,有利于组织决策。大数据分析涉及几个步骤和技术。

数据采集

数据采集有两个组成部分:识别和收集大数据。大数据的识别是通过分析数据的两种自然格式完成的,即天生的数字格式和天生的模拟格式。

原始数字数据

它是通过数字媒介获取的信息,例如计算机或智能手机应用程序等。由于系统不断从用户那里收集不同类型的信息,这类数据的范围不断扩大。天生的数字数据是可追踪的,可以提供个人和人口统计的业务洞察力。示例包括 Cookies、网络分析和 GPS 跟踪。

天生的模拟数据

当信息以图片、视频和其他与我们世界的物理元素相关的格式出现时,它被称为模拟数据。这些数据需要通过使用传感器(如照相机、录音、数字助理等)转换成数字格式。技术范围的不断扩大也提高了传统模拟数据通过数字媒体转换或获取的速度。

数据采集流程的第二步是收集和存储被识别为大数据的数据集。由于陈旧的 DBMS 技术不足以管理大数据,因此使用了一种新的方法来收集和存储大数据。这个过程被称为 MAD——有磁性、敏捷而深刻。由于管理大数据需要大量的处理和存储容量,因此对于大多数依赖大数据分析的实体来说,创建这样的系统是遥不可及的。因此,今天最常见的大数据处理解决方案基于两个原则——分布式存储和大规模并行处理,也称为 MPP。大多数高端 Hadoop 平台和专用设备在其系统中使用 MPP 配置。

非关系数据库

存储这些海量数据集的数据库在数据存储的方式和位置方面也发生了变化。JavaScript 对象符号或 JSON 是当今保存大数据的首选协议。使用 JSON,可以在应用层编写任务,并允许更好的跨平台功能。从而为 devs 实现可伸缩和灵活的数据解决方案的敏捷开发。许多公司用它来代替 XML,作为在服务器和 web 应用程序之间传输结构化数据的一种方式。

内存数据库系统

这些数据库存储系统旨在克服大数据处理过程中的一个主要障碍,即传统数据库访问和处理信息所需的时间。IMDB 系统将数据存储在大数据服务器的 RAM 中,因此大大减少了存储 I/O 差距。Apache Spark 是 IMDB 系统的一个例子。VoltDB、NuoDB 和 IBM solidDB 是更多相同的例子。

混合数据存储和处理系统— Apache Hadoop

Apache Hadoop 是一个混合数据存储和处理系统,以合理的成本为中小型企业提供可扩展性和速度。它使用 Hadoop 分布式文件系统(HDFS)来跨多个系统(称为集群节点)存储大文件。Hadoop 具有复制机制,即使在单个节点出现故障的情况下也能确保平稳运行。Hadoop 以 Google 的 MapReduce 并行编程为核心。该名称源于函数式编程语言在其大数据处理算法中的“映射”和“归约”。MapReduce 的工作前提是增加功能节点的数量,而不是增加单个节点的处理能力。此外,Hadoop 可以使用现成的硬件运行,这大大加快了它的开发和普及。

数据挖掘

Data Mining

这是一个最近的概念,它基于对大数据集的上下文分析来发现独立数据项之间的关系。目的是让不同的用户将一个数据集用于不同的目的。数据挖掘可用于降低成本和增加收入。

阅读完整和更新的故事什么是大数据分析,我的业务为什么需要它? ,其中包括- 【使用大数据分析的 10 大行业】
利用数据科学发展业务的 8 种方式
为什么我的业务需要数据科学?

大数据与 ML:巨头联姻!

原文:https://towardsdatascience.com/big-data-and-ml-a-marriage-between-giants-1d6dc52d54de?source=collection_archive---------15-----------------------

过去十年见证了大数据的巨大增长。和大数据分析,这无意中与强大的机器学习技术联系在一起。

从根本上来说,大数据就是大量的数据,在数量、种类、准确性和速度方面都很大。这使得大数据对于传统的分析方法来说特别复杂,难以掌握、解密和/或简化。

另一方面,机器学习是人工智能的一种高级应用,可以自动建立分析模型。有了机器学习,就有可能创造出识别模式和学习的系统,而无需被编程来执行那些特定的任务。

当大数据遇到机器学习时,模型就会蓬勃发展。我们能够以闪电般的速度和规模从大型、异构和不同的数据源中获取价值。有最少的人为干预和指导。有用!无论是对于充斥着变量的数据流、非结构化数据,还是基于人类情感和情绪的数据。

还有呢?!它在不断增长的数据集上茁壮成长。随着越来越多的数据被输入模型,模型被修正、调整和完善。随着每一次迭代,得出的见解越来越准确,结果越来越可靠,它们支持的业务决策也变得非常精确!

信息时代

我们生活在一个“信息”被包装、共享和重视的时代,毫不夸张地说,比其他任何东西都重要!此外,这种信息交流的参与度也有所提高。所有这些活动都会产生大量数据,即大数据。

对那些倾听的人来说,这些数据可以被利用并挖掘出答案。无论是业务盈利能力、营销策略还是识别和降低风险,公司都可以确定任何细节。

帮助这些追求的是系统不断增长的计算能力。所有数据都有充足的存储空间。内存增加了性能的速度。云和现收现付模式使参与变得可行。此外,规模经济使这些系统变得非常容易获得且价格低廉。

高科技公司、技术公司和数据科学家都预测了人工智能和大数据结合起来的非凡、主导和颠覆性的力量。

使用传统方法进行数据分析

传统的数据分析方法无法处理大数据。他们永远无法真正捕捉到全部价值!

首先,数据量太大,无法进行全面分析。第二,数据中的相关性、关系和模式可以在完全不同的系统、格式或结构中找到。并且,整理这些来支持一个假设是困难的。

此外,建立假设本身是困难的,因为它需要更好地处理数据——准确地知道你在做什么以及你如何浏览数据集;清楚了解数据是如何收集的;并仔细研究数据的底层分布。

最后,传统方法通常需要关注静态分析。在这里,数据样本被及时冻结并进行分析。假设样本代表整个集合。基于系统模型,这个假设可以被证明或者被否定。

对于大数据,没有任何样本可以作为准确的表示。也不能预测任何假设,而是需要从丰富的数据传播中发现它们。

利用机器学习挖掘大数据流

机器学习或 ML,是一门即将到来的科学。在计算机科学的最边缘——诞生于算法和程序,统计——封装数学和模型,以及人工智能——依赖于机器智能和认知。

其结果是一套有感知能力的算法,能够独立适应和学习。速度也同样重要。准确性。和灵活性。实时的。

这些算法已经得到了广泛的应用——彻底改变了营销自动化、客户细分、自动驾驶汽车、欺诈检测、产品推荐等。此外,对于大数据-ML,应用程序甚至更加壮观。

1.营销自动化:

自动化客户之旅,使其更加灵活,消除痛点,并在所有渠道之间建立无缝连接,无论是消息传递还是品牌推广,这就是营销自动化的内在价值。

在 ML 和大数据的支持下,营销自动化可以利用情绪分析、客户“一个客户的细分”,甚至直接营销、调整活动和重新计算个性化的点滴信息,以满足您的需求。

2.情感分析:

情绪分析可以是一个强大的盟友。尤其是当你想推出新产品、引入新功能或通过创造不同的东西来挑战常规的时候。你想知道你的顾客是会对你的产品神魂颠倒,还是会完全忽视它。

事实上,在产品设计之初就预测这些结果是可能的,这简直太棒了。话又说回来,你也可以随着市场需求的变化而改变你的设计,即使你的产品在发展,设计在成熟,顾客在更有决定力!

3.产品推荐:

做出合理的产品推荐是一门很有造诣的艺术。它需要技巧和强大的大数据技术组合。

为了做出好的产品推荐,系统需要清楚地了解你作为顾客的需求,你的好恶,你的朋友和同龄人的建议,你的愿望清单上有什么,你和什么品牌有联系等等。这些信息大部分可以从你的社交媒体评论中收集。剩下的是从网络表单、位置和你使用的大量其他渠道收集来的。

将这些信息与您的特定和独特需求以及像您一样的其他客户正在购买的产品进行匹配,就会为您生成一份非常精确的产品推荐列表!亚马逊和网飞是带头利用这些能力的大玩家,他们的成功迫使各地的公司探索这一前景,许多公司已经开始这样做了。

4.风险和监管:

大数据正在为数字处理 ML 算法提供丰富的数据流,因此合规性、风险识别和监管很容易实现。

无论是增强欺诈检测还是减少财务违规,甚至是发出警报检测非法交易、内幕交易和其他异常情况,您的 ML-Big Data dynamic duo 都能帮您应对!

风险和监管是一个非常复杂的应用领域。经验丰富的公司正在这一领域掀起波澜。在大数据分析的支持下,WorkFusion 的认知自动化超越了预期 —揭示信息并实现完全合规和监管。

5.首先是预测性分析,然后是规范性分析:

机器学习能够预测未来的结果。虽然这确实很有趣,但大数据上的 ML 可以让规定性分析在您的业务中成为现实。

指令性分析实际上是分析的前沿,其中系统会建议路径和假设,遵循和坚持这些路径可以获得更高的成功率。90%的时候。随着更多数据的暴露,处方中的不准确和不一致最终被消除。

大数据和 ML 都是能够创造巨大成功的巨头。两者结合在一起,他们的力量更加多才多艺。触及商业运作和组织策略。

云端训练模型的大数据

原文:https://towardsdatascience.com/big-data-for-training-models-in-the-cloud-32e0df348196?source=collection_archive---------6-----------------------

当我们的训练数据太大而不适合我们的机器时,或者训练模型开始需要几个小时时,会发生什么?我们当然要上云!

当您拥有大量数据,以致无法在本地计算机上合理地运行培训,或者数据的大小超过了您的硬盘容量时,就该考虑其他选择了。

上云

一个可靠的选择是将机器学习培训转移到另一台具有更多存储空间的计算机上,从而释放您的硬盘空间,并允许您在培训进行时处理其他事情。

Don’t let data limits hold back your stream

让我们具体分析一下哪些部分需要迁移到云中。将我们的培训视为需要两种主要资源是有益的:计算和存储。

有趣的是,我们并不需要像你一开始期望的那样将它们紧密地联系在一起。我们可以将它们解耦,这意味着我们可以利用两者的专用系统。在处理大数据时,这可以带来规模效益。

计算负载的转移非常容易,但是大型数据集的转移可能会更加复杂。然而,如果你的数据确实很大,结果值得努力的,因为它允许数据被许多机器并行访问,在你的机器学习训练工作中工作。

将数据移动到云

Google Cloud Platform 有几种简单的方法将这些抽象联系在一起。首先,我们要确保我们在谷歌云存储(GCS)上的数据。我们可以使用各种工具来完成这项工作。

gsutil

对于中小型数据集,只需使用[gsutil](https://cloud.google.com/storage/docs/gsutil)。这是一个命令行工具,专门用于与谷歌云存储交互,并支持一个-m选项,允许并行发送多个流,从而加快传输速度。

谷歌传输设备

如果您的数据太大而无法通过网络发送,请使用 Google Transfer Appliance ,这是一台运送到您的数据中心的物理机器,可以安全地捕获和传输高达 1pb 的数据。

在典型的 100 兆比特每秒的网络带宽下,通过网络上传 1pb 的数据需要 3 年时间!即使你有一个 1gb 的连接,它仍然需要 4 个月!谁愿意等那么久!?另一方面,transfer appliance 可以在短短的 25 小时(T2)内捕获 1pb 的数据。太快了!

接下来

现在我们的数据在云中,我们已经准备好大规模地进行我们的机器学习训练。但那是一个完整的话题!别担心,我们下一集会讲到。

利用有限的计算和存储资源,在大型数据集上训练机器学习模型可能具有挑战性,但事情不一定是这样的!通过使用gsutil或 Transfer Appliance 将数据移动到云中,您可以在大型数据集上进行训练,而不会出现任何问题。

感谢阅读这一集的云人工智能冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的me或订阅 YouTube 频道来观看未来的剧集。更多剧集即将推出!

但现在,请记住:当你需要在大数据集上进行机器学习时,请将数据放在云中。

大数据集成

原文:https://towardsdatascience.com/big-data-integration-9a2fb2d78529?source=collection_archive---------9-----------------------

1.介绍

数据集成是一组用于从不同来源检索数据并将其组合成有意义和有价值的信息的过程。一个完整的数据集成解决方案可以提供来自各种来源的可信数据[5]。传统的数据集成技术主要基于 ETL(提取、转换和加载)过程来摄取和清理数据,然后将其加载到数据仓库中。

如今,大量的数据是从许多异构数据源收集的,这些数据源实时生成不同质量的数据,这就是所谓的大数据。大数据集成非常具有挑战性,尤其是在传统的数据集成技术无法处理大数据之后。

我们可以说,大数据集成在许多方面不同于传统的数据集成:数量、速度、多样性和准确性,这些是大数据的主要特征:

  • 体量:这是大数据的原始属性。如今,联网设备和人员的数量比以前更多,这极大地影响了世界范围内的数据源数量和数据量。
  • 速度:随着数据源数量的增加,数据生成的速度随着时间的推移而大大提高,尤其是在社交媒体和 IOT 出现之后。
  • 多样性:更多的数据源意味着我们存储数据的格式有更多的多样性。我们有高层次的结构化和非结构化数据。每种类型都有大量的格式:文本、图像、声音、xml、文档、空间数据等等。
  • 准确性:上面列出的特征导致我们有不同的数据质量,所以我们可以找到不确定或不精确的数据,特别是社交媒体和博客允许用户传播这种数据。

在本文中,我们试图概述大数据集成技术和挑战,并展示该领域的一些最新研究。

本文主要基于 X. L. Dong 和 D. Srivastava 撰写的令人惊叹的《大数据集成》[2]一书。

2.传统数据集成

要跨混合应用程序环境集成数据,您需要将数据从一个数据环境(源)获取到另一个数据环境(目的)。在传统的数据仓库环境中,提取、转换和加载(ETL)技术已经被用来完成这一任务。[1]

ETL 工具结合了从一个数据环境获取数据并将其放入另一个数据环境所需的三个重要功能。

  • 提取:从源数据库中读取数据。
  • 转换:转换提取数据的格式,使其符合目标数据库的要求。(转换通过使用规则或将数据与其他数据合并来完成。)
  • Load:将数据写入目标数据库

传统上,ETL 在数据仓库环境中与批处理(rest 上的数据)一起使用。

数据仓库为业务用户提供了一种方法来整合不同来源的信息,以分析和报告与其特定业务焦点相关的数据。ETL 工具用于将数据转换成数据仓库所需的格式。在将数据装载到数据仓库之前,转换实际上是在中间位置完成的。

许多软件供应商,包括 Oracle、Microsoft、IBM、Informatica、Talend 和 Pentaho,都提供了传统 ETL 软件工具。

Image Source: www.neiltortorella.com/hadoop-data-warehouse/impressive-hadoop-data-warehouse-5-traditional-data-warehouse-systems-data-integration-or-etl-systems

大数据出现后,传统的数据仓库系统无法处理它,这增加了改进和使用更高效和强大的技术的需求。

3.大数据集成

与传统的关系数据库相比,大数据平台的元素以新的方式管理数据。因为管理结构化和非结构化数据需要可伸缩性和高性能。从 Hadoop 到 NoSQL 数据库,大数据生态系统的所有组件都有自己的方法来提取、转换和加载数据。

此外,传统的 ETL 工具正在发展,以处理新的大数据特征。虽然传统形式的集成在大数据世界中有了新的含义,但集成技术需要一个支持数据质量和分析的通用平台。

正如我们在上一节中提到的,传统的数据集成是使用批处理来执行的(关于其余部分的数据),而大数据集成可以实时或通过批处理来完成。这使得 ETL 阶段被重新排序,在某些情况下成为 ELT,因此数据被提取出来,加载到分布式文件系统中,然后在使用之前进行转换。

为了根据大数据分析做出良好的业务决策,数据需要得到组织所有级别的信任和理解。它需要在整个企业中以可信、可控、一致和灵活的方式交付给业务部门。为了实现这一目标,使用了三种基本技术:

  • 模式映射
  • 记录链接
  • 数据融合

模式映射和记录链接用于传统的数据集成,但它们包含在 ETL 过程中,它们不像集成大数据时那样具有挑战性。在接下来的章节中,我们将描述这些技术中的每一种,并展示将这些技术应用于大数据集成的最新研究成果。

4.模式映射

4.1.模式映射基础

在大数据分析的初始阶段,您对数据定义的控制水平可能不如对运营数据的控制水平。然而,一旦您确定了与您的业务最相关的模式,您就需要能够将数据元素映射到一个公共定义。然后,这个通用定义被带入到运营数据、数据仓库、报告和业务流程中。

模式映射可以被认为是由两个阶段组成的过程。首先,创建一个中介(全局)模式,然后识别数据源的中介模式和本地模式之间的映射,以确定哪些(组)属性包含相同的信息。[2]

例如,假设我们正在收集关于“板球”运动员的数据。[17]

我们有三个数据来源:S1、S2 和 S3。每个数据源包含不同的属性,如表 1 所示。

首先,我们确定了我们希望在中介模式中包含的四个属性,即姓名、比赛次数、总分和球队。然后,我们进行中介模式和数据源模式之间的映射,如表 2 所示。

映射完成后,我们可以查询所有数据源,因为它们是一个逻辑数据源。图。图 3 显示了一个例子,说明在搜索名为“Allan Border”的玩家时,我们如何收集数据。

4.2.文献评论

4.2.1.概率模式对齐

为了处理属性含义的模糊性,Das Sarma 等人提出了在属性匹配和模式映射中增加概率。 [19]对从五个域中抓取的 web 表进行评估,每个域包含大约 50-800 个 web 表。此外,它给出了比确定性方法更好的结果。

4.2.2.集成 Deep Web 数据

“Deep web”术语用于描述搜索引擎无法到达的网页。为了提供对 deep web 的访问,的马德哈万等人提出了一种算法。【20】并在 50 万个 HTML 表单的样本上进行测试,实现了对底层数据库的良好覆盖。

4.2.3.集成 Web 表格

“网络表格”是存储在 HTML 中的不同种类的表格形式的数据;它没有一个清晰而精确的模式。 Cafarella 和 al 提出了一种基于 Web 表的关键字搜索方法。 [21]基于两种排序方法特征排序和模式排序。

达斯萨尔马和阿尔。【22】提出了一个框架来检索与给定表格相关的 web 表格。他们在维基百科的表格上试验了这个框架,结果很好。

为了从 Web 表中提取知识, Limaye 和 al。【23】提出了一种基于图形模型的 Web 表格标注方案,他们的实验表明图形模型比传统模型获得了更高的准确率。

5.记录链接

5.1.记录链接基础

记录链接是一项任务,在这项任务中,我们可以识别不同数据源中引用相同逻辑实体的记录,尤其是当多个数据源之间不共享公共标识符时(比如人员的 SSN)。在传统的数据集成中,它只处理链接结构化数据。

在大数据集成中,数据源在结构上是异构的,并且是从提供非结构化文本数据的许多来源(社交媒体、传感器日志等)收集的,并且数据源是动态的和不断发展的[2 ],这使得该技术非常具有挑战性。

举一个非常简单的例子来说明记录链接意味着什么,如果我们从不同的医院收集病人的数据。假设我们正在收集一个名为“Mohammad Hassan”的病人的数据,他出生于 1953 年。

我们在表 3 和表 4 中找到了来自两家医院 A 和 B 的两个记录。

在映射模式属性之后进行比较,通过一些比较,我们可以发现这些行属于同一个患者的概率。图。4 显示了比较的假设。

图 4。显示首先比较两个名字的概率是 50%,然后比较出生年份的概率是 80%。此外,我们可以从输入日期中发现这些行并不冲突。因此,我们可以 80%的概率假设这些行属于同一个患者。

在记录链接中,使用了许多技术:

  • 成对匹配:这种技术用于比较一对记录,以检查它们是否属于同一个逻辑实体。
  • 集群:这种技术用于对适当的记录分区做出全局一致的决定,以确保每个分区属于不同的实体。
  • 分块:这种技术用于将输入记录划分为多个块,以便只允许成对匹配同一块中的记录。

5.2.文献评论

5.2.1.使用 MapReduce 并行化阻塞

5.2.1.1.MapReduce 简要描述

Hadoop MapReduce [14]是一个分布式计算的编程模型,它基于两个重要的任务 Map 和 Reduce。正如 IBM analytics [25]所描述的,Map task 获取一组数据并将其转换为另一组数据,其中各个元素被分解为元组(键/值对)。Reduce 任务将地图的输出作为输入,并将这些数据元组组合成一个更小的元组集。reduce 作业始终在地图作业之后执行。

映射器负责使用 Map() 函数,减速器负责 Reduce()。

Image Source: www.tutorialspoint.com/hadoop/hadoop_mapreduce

5.2.1.2.这个提议

使用 MapReduce 的记录链接基本方法易受服务负载不平衡的影响,这是由于倾斜的块大小会降低性能。

科尔布和艾尔。[26]提出了两种策略(BlockSplit 和 PairRange)用于 reducers 之间的负载平衡。此外,在真实数据集上对各种负载均衡策略进行了实验评估,并与基本方法进行了比较,结果表明该方法具有更好的鲁棒性和效率。

5.2.2.元分块:修剪成对匹配

帕帕达基斯和艾尔。[27]提出了元分块代替多重分块键的方法,以解决在处理大规模异构数据时表现出的一些低效率。此外,他还做了实验来评估剪枝方案,以表明元阻塞提高了阻塞效率。

5.2.3.增量记录链接

Whang 和 Garcia-Molina 关注的是成对匹配规则随时间的演变,并确定了可以执行增量记录链接的一般增量条件[28] [29]。格伦海德和艾尔。[30]提出了一些比批量链接和旧的增量记录链接算法更有效的增量技术。

5.2.4.将文本片段链接到结构化数据

Cortez 和 da Silva [31]建议在使用链接技术之前,使用非结构化数据上的信息提取技术来获得结构化数据。

为了将成千上万的产品报价与结构化产品信息联系起来,Kannan 和 al。[32]提出了一种将文本片段链接到结构化数据的新方法,该方法主要基于:

  1. 使用标记、合理解析和最佳解析技术对文本片段进行语义解析
  2. 返回记录间匹配概率分数的匹配函数。

5.2.5.时间记录链接

李和艾尔。[33]提出了一种使用实体随时间演变的模型来识别过时属性值的技术,该模型允许在时间记录上进行链接。

蒋和艾尔通。[34]开发了详细的概率模型,以更好地捕捉实体演化,并提出了更快的时态记录链接算法。此外,他们在真实世界数据集上进行实验,包括 DBLP(计算机科学文献数据集)数据集,以评估他们的工作,他们在 DBLP 的困难案例上取得了良好的结果。

5.2.6.具有唯一性约束的记录链接

郭和艾儿。[35]提出了一种记录链接技术,该技术在存在错误数据和同一属性值的多种表示的情况下显示了有希望的结果。

他们提出了记录链接和数据融合的组合来识别错误的属性值,并将其与正确值的替代表示区分开来。

6.数据融合

6.1.数据融合基础

当非结构化和大数据源与结构化运营数据集成时,您需要确信结果是有意义的。

数据融合是多种技术的结合,旨在解决来自一系列来源的冲突,并找到反映真实世界的真相。这是最近出现的一个新领域。它的动机正是数据的准确性:网络使得发布和传播来自多个来源的虚假信息变得很容易,这使得剔除小麦和谷壳成为呈现高质量数据的关键。[2]

数据融合中使用了三种技术:拷贝检测、投票和源质量。

  • 复印检测:检测复印机源并减轻其重量
  • 投票:检测每个属性最常见的值。
  • 来源质量:在投票后,我们给予知识渊博的来源(具有最高数量的共同属性)更多的权重

例如,假设我们有五个数据源 S1 … S5,它们具有相同的五个属性 Att1 … Att5,如表中所示。5

如图所示。首先我们搜索复印机来源,在查看 S3、S4 和 S5 之后,我们发现 S3 和 S4 是相同的。另外,和 S5 的区别只有一个。因此,减轻了 S4 和 S5 的重量。

之后,是投票阶段,我们为每个属性寻找最常见的值,如图所示。6 (红色数值是最常见的数值)

在最后一个阶段,源质量我们发现 S1 具有最高数量的公共属性,所以我们给它更多的权重。

6.2.文献评论

6.2.1.真理发现

人们做了许多努力来衡量消息来源的可信度。[36]提出了一个由 3 个阶段组成的数据融合过程:真相发现、可信度评估和拷贝检测。在这之后,许多研究人员为每个阶段提出了一些扩展。[37] [38] [39]

6.2.2.在线数据融合

在许多领域中,在线数据会随着时间的推移而变化,在许多情况下,需要对其进行实时评估。针对这个问题刘和周虎。[40]提出了一种在线数据融合技术,其中在离线模式下评估源准确性和复制关系,并且在查询回答时评估真相发现。该技术通过在图书数据集上的实验进行了评估,并显示了较高的效率。

6.2.3.动态数据融合

在线数据集通常是动态的,在很多情况下数据会高速变化,这给静态数据融合技术带来了问题。针对这个问题,董和艾儿。[41]提出并评估了一种动态数据融合算法。

7.讨论

正如我们在前面几节中看到的,有许多提议的算法和技术来解决大数据集成挑战,但这些提议中没有考虑到许多事情。首先,所有建议都考虑到数据是格式良好的,并且数据预处理(提取、转换)已经完成,但是当我们谈论在线数据时,我们谈论的是由多种语言数据源生成的数据,即使该语言被很好地识别,它也可能是俚语。

此外,唯一考虑的非结构化数据类型是文本,但也经常实施其他类型,例如:社交媒体上的帖子可以包含视频、音频、图像、地图和其他类型。此外,在整合来自社交媒体(博客、推文、帖子……)的数据时,数据的质量大多非常低,因为这些数据是由普通用户提供的,他们可能不具备基本的计算和写作技能。因此,提取有用的信息是非常具有挑战性的。

此外,所有提案都要求首先离线构建模型,然后在线填充。这在现实世界中并不总是能做到。当涉及到数据的准确性和多样性时,我们不能总是离线分析数据源。有时我们需要在线分析,这是非常具有挑战性的,尤其是如果我们考虑到上述问题。

此外,当谈到数据融合时,在 Truth discovery 中,基于哪些数据源包含最高投票值(由最大数量的数据源提供的值)来评估数据源。然而,在许多情况下,特别是在谈到网络宣传时,虚假信息以很高的速度广泛传播,所以由最大数量的来源提供的价值并不总是真实的。

8.数据集成工具

大数据整合使用的工具有很多。其中一些用于传统的集成流程,并得到了增强和发展,以适应大数据需求。此外,它们还可以分为商业软件和开源软件。下表包含了其中的一些工具。

9.摘要

在本报告中,我们简要介绍了传统的数据集成技术。然后,我们讨论了大数据集成的挑战,并描述了该领域中使用的三种技术:模式映射、记录链接和数据融合。

此外,我们还列举了该领域的一些最新研究课题。最后,我们展示了一些可以使用的工具。

10.参考

  • [1] J. Hurwitz 和 A. Nugent 以及 F. Halper 和 M. Kaufman,“虚拟数据”,发布日期:2013 年 4 月 5 日
  • [2] X. L. Dong 和 D. Srivastava,“大数据集成”,出版日期:2017–08–26
  • [3]什么是“数据集成定义”,URL:http://whatis.techtarget.com/definition/data-integration,检索日期:2017–12–30
  • [4] Pentaho,“什么是数据集成”,网址:【http://www.pentaho.com/faq/what-is-data-integration】T2,检索日期:2017–12–30
  • [5] IBM,“数据集成”,网址:【https://www.ibm.com/analytics/data-integration ,检索日期:2017–12–30
  • [6] Pentaho,《Pentaho 数据集成(Kettle)教程》,网址:https://wiki . Pentaho . com/display/EAI/Pentaho+Data+Integration+(Kettle)+教程,检索日期:2017–12–30
  • [7] Teradata,“Teradata 产品”,网址:【https://www.teradata.com/Products】T2,检索日期:2017–12–30
  • [8] Matillion,“Matillion ETL 产品概述”,网址:https://redshiftsupport . Matillion . com/customer/en/portal/articles/1975 061-Matillion-ETL-Product-Overview,检索日期:2017–12–30
  • [9] Oracle," Oracle Data Integrator ",URL:http://www . Oracle . com/tech network/middleware/Data-Integrator/overview/index . html,检索日期:2017–12–30
  • [10]微软,“SQL Server 集成服务”,URL:https://docs . Microsoft . com/en-us/SQL/Integration-Services/SQL-Server-Integration-Services,检索日期:2017–12–30
  • [11] Guru99,“什么是 Informatica?完整介绍”,网址:https://www.guru99.com/introduction-informatica.html,检索日期:2017-12-30
  • 【12】阿帕奇猪,“欢迎来到阿帕奇猪!”,网址:https://pig.apache.org/,检索日期:2017-12-30
  • [13] Apache sqoop,“Apache sqoop”,网址:http://sqoop.apache.org/,检索日期:2017 年 12 月 30 日
  • [14] Hadoop Mapreduce,《Mapreduce 教程》,网址:https://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html,检索日期:2017–12–30
  • [15]数据砖块,“什么是 Apache Spark?”,https://databricks.com/spark/about,检索日期:2017-12-30
  • [16] Talend,“用于数据集成的 Talend 开放工作室”,URL:https://www . Talend . com/products/Data-Integration/Data-Integration-Open-Studio,检索日期:2017–12–30
  • [17] X. L. Dong 和 D. Srivastava,《大数据集成小教程》,网址:http://www . research . att . com/~ divesh/papers/BDI-icde 2013 . pptx,检索日期:2017–12–15
  • [18] IBM,“用于数据集成的 IBM 信息服务器”,网址:https://www . IBM . com/us-en/market place/Information-server-for-data-integration,检索日期:2018–01–10
  • [19] Anish Das Sarma、Xin Luna Dong 和 Alon Y. Halevy,“引导现收现付数据集成系统”,第 861-874 页,出版日期:2008 年。
  • [20]贾扬特·马德哈万、戴维·科、卢贾·科特、维格内什·甘帕尼斯特、亚历克斯·拉斯姆森和阿隆·哈勒维。,“谷歌的深层网络爬行”,出版日期:2008 年
  • [21]迈克尔·j·卡法雷拉、阿龙·y·哈勒维、黛西·王哲、尤金纽和张旸,“网络桌:探索网络桌的力量”,出版日期:2008 年。
  • [22] Anish Das Sarma,Lujun Fang,Nitin Gupta,Alon Y. Halevy,Hongrae Lee,,Reynold Xin 和,“寻找相关表格”。,第 817-828 页,出版日期:2012 年
  • [23] Girija Limaye,Sunita Sarawagi 和 Soumen Chakrabarti。“使用实体、类型和关系标注和搜索 web 表格”,出版日期:2010 年
  • [24]阿帕奇风暴,“阿帕奇风暴”,网址:【http://storm.apache.org/, 检索日期:2018–01–12
  • [25] IBM analytics,“什么是 MapReduce?”,网址:https://www.ibm.com/analytics/hadoop/mapreduce,检索日期:2018–01–13
  • 26 Lars Kolb、Andreas Thor 和 Erhard Rahm。“基于 mapreduce 的实体解析的负载平衡”,第 618–629 页,出版日期:2012 年。
  • [27]乔治·帕帕达基斯、乔治亚·库特里卡、西米斯·帕尔帕纳斯和沃尔夫冈·奈杰尔。“元阻塞:将实体解析提升到一个新水平”,出版日期:2014 年
  • [28]史蒂文·艾荣·黄和埃克托·加西亚·莫利纳。《规则不断演变的实体解决方案》,出版日期:2010 年
  • [29]史蒂文·艾荣·黄和埃克托·加西亚·莫利纳。《规则和数据的增量实体解析》,出版日期:2014 年
  • [30] Anja Gruenheid、Xin Luna Dong 和 Divesh Srivastava。《增量记录链接》,出版日期:2014 年
  • [31]伊莱·科尔特斯和阿尔蒂格兰·苏亚雷斯·达席尔瓦。“通过文本分割进行无监督信息提取”,出版日期:2013 年
  • [32] Anitha Kannan,Inmar E. Givoni,Rakesh Agrawal 和 Ariel Fuxman。“将非结构化产品报价与结构化产品规格相匹配”,出版日期:2011 年。
  • [33] Pei Li,Xin Luna Dong,Andrea Maurino 和 Divesh Srivastava。《连接时态记录》,出版日期:2011 年
  • [34]蒋月轩、安海多安和杰弗里·f·诺顿。“时态记录匹配的实体演化建模”,出版日期:2014 年
  • [35]、Xin Luna Dong、Divesh Srivastava 和雷米·扎亚茨。“具有唯一性约束和错误值的记录链接”,出版日期:2010 年
  • [36]辛鲁纳·东、劳雷·贝蒂-埃奎莱和迪韦什·斯利瓦斯塔瓦。“整合冲突数据”,出版日期:2009 年
  • [37] Alban Galland、Serge Abiteboul、Am elie Marian 和 Pierre Senellart。《来自不同观点的佐证信息》,出版日期:2010 年
  • 38 杰夫·帕斯捷尔纳克和丹·罗斯。《知道该相信什么(当你已经知道某事时)》,出版日期:2010 年
  • [39]肖鑫·尹、韩家伟和菲利普·s·于。“网上多个冲突信息提供者的真相发现”,出版日期:2007 年
  • [40]、辛露娜·董、和迪韦什·斯利瓦斯塔瓦。《在线数据融合》,出版日期:2011 年
  • [41] Xin Luna Dong、Berti-Equille 和 Divesh Srivastava。“动态世界中的真理发现和复制检测”,出版日期:2009 年

大数据——为什么、如何和什么——一个思维过程和架构

原文:https://towardsdatascience.com/big-data-the-why-how-and-what-a-thought-process-and-architecture-76d1d3572714?source=collection_archive---------4-----------------------

我在与客户交谈时遇到的最常见的问题之一是,他们如何能够建立一个良好的大数据架构,让他们能够处理所有现有数据。的最终目标是在 it 基础上执行高级分析和人工智能,以获取洞察力,使他们能够在当今不断快速发展的世界中保持相关性。

为了解决这个问题,我总是首先询问他们对“大数据”的理解,因为一个客户与另一个客户不同。一个人可能认为大数据只是他们能够处理所有不同 excel 文件的方式,而另一个人可能认为大数据是他们所有项目和智慧的圣杯。在本文中,我想向您解释大数据对我的意义,并为您提供一个思考过程,帮助您为组织定义大数据战略。

什么是大数据?Gartner 通过不同的 V 来解释它:“量”、“多样性”、“速度”、“准确性”,其中如果您有前三个中的两个,那么您就在谈论大数据。用他们自己的话说:

大数据是高容量、高速度和/或高多样性的信息资产,需要经济高效、创新的信息处理形式来增强洞察力、决策制定和流程自动化。

然而,对我来说,大数据远不止这些。当你在使用时,能够谈论它并认识到它是一回事,但是以一种你的整个组织能够从中受益的方式来实现它是另一回事。

让我们来解决我在与客户打交道时看到的 3 个最常见的棘手问题:

1.创建集中式数据湖

在与我的客户交谈时,每当我想开始利用大数据时,都会遇到同样的问题。“我们要把它存放在哪里”的问题。但是每次答案都很简单:“尽可能集中”。将您的数据存储在一个集中的地方将使您能够更好地控制它。通过这种方式,您将能够了解您的流入流程、处理流程以及流出流程,从而能够从所有这些数据中进行复杂的分析。

但是为什么人们会忽略这一点呢?因为在现实世界中,事情并不像听起来那么简单。许多企业都有几十年的历史,它们的流程和结构有时可以追溯到那个时代。只要想想那些仍然在垂直结构中工作的企业,团队在孤岛中工作,属于这些团队的数据不会跨越到不同的团队。导致数据支离破碎。

由于这个原因,在设置您的集中式数据存储库时,第一部分是在组织上执行变更管理。你能从一个垂直的结构转向一个更水平的结构吗?在这个结构中,团队互相合作,使用同一个数据仓库。在第三点中会有更多的介绍。

第二部分是,如何正确存储来自所有这些不同系统的不同格式和数据类型的数据。这是我们将在第二点中看到的。

如果你将这一思维过程形象化,你可能会得到如下结果:

2.通过着陆区利用你的数据湖

因此,我们有所有这些数据进来,在所有不同的格式和数据类型。乍一看,这似乎是一件坏事;但实际上不是。数据湖就是为此而创建的,以任何格式存储数据,使其成为满足您所有历史需求的完美工具。

但是我们如何组织这些数据呢?好的,一个好的做法是把进来的数据存储在不同的“着陆区”。它们不仅用于存储来自 BI 系统、视频等的原始数据,还用于存储经过处理的数据——数据的处理方式是,每种格式和数据类型都按照您习惯的标准进行标准化。只需考虑将数据标准化,使其在任何地方都使用相同的日期格式。这些区域我们通常称为“原始”和“分段”区域。

将这两个区域链接在一起只是连接正确的 ETL 过程的问题,ETL 过程从“原始”区域提取数据,以您想要的方式修改它,然后将它放入您的“暂存”区域,准备供您的报告工具或数据仓库使用。

您现在可能会有一个有趣的问题:“但是,如果我们从原始的结构化数据源转向数据湖,然后再回到数据仓库,我们的性能会不会下降呢?”这确实是一个有趣的问题,我们只能通过回到数据湖的目的来回答。数据湖它的目标是拥有一个集中式数据存储库,在这里收集我们所有的数据,以便我们的数据科学家能够对最纯粹形式的源数据执行他们的工作。但是其次,我们的 ETL 作业正在运行,不断地将数据从已处理的“暂存”区域复制到目标系统。回顾这些不同的目的,我们可以说,即使我们可能会遇到一个小的性能问题,它也将是一个控制我们数据上发生的一切的简单系统,从而改进分析、报告甚至治理流程。

3.正确的内部治理

如同在一切美好的事物中,凡事还是有一个硬的东西;这也不例外。创建集中式数据湖最困难的部分是治理。现在,您已经做好了从不同系统向数据湖提取数据的一切准备,并且您能够处理这些数据,使其可供使用。但是,在不同的团队中,你实际上是如何工作的呢?

不同的团队将处理数据湖中的数据,因此必须有正确的访问控制角色来定义哪些用户可以访问数据湖的哪个部分。想象一下不同的场景,比如一个 BI 专家不需要访问数据湖,但是需要访问我们提供给他们的聚合视图。或者您希望跨区域工作,允许您对数据提供行级安全性,以便不同区域的人只能看到对他们有意义的数据。这些都是您在创建大数据架构时必须考虑的事情。

我们经常会看到以下角色以及这些角色在这些组织中是如何配置的:

  • 数据工程师:您的数据工程师负责设置 ETL 作业,以处理从一个着陆区到另一个着陆区的数据,需要完全访问数据湖。
  • 数据科学家:这个角色可以通过“原始”登陆区以最纯粹的形式访问数据湖。通过提供对这些的访问,数据科学家将能够从你的数据中得出结论,并在这些基础上建立人工智能模型,这可能会大大有利于你的组织。
  • BI 专家:这些人通常不需要访问数据本身,而是需要查看视图。因此,提供对通过诸如 Hive 这样的系统创建的视图的访问可能是有益的,该系统允许您的专家在您的数据上运行简单的 SQL 查询,同时仍然提供行级安全性和您在安全性方面习惯的其他一切。(注意:行级安全性需要正确配置,这听起来很简单,但是在非结构化数据上正确配置需要一段时间)

如果您希望额外的安全性并且没有人访问数据湖,您可以通过简单的 ETL 副本创建数据湖的一个子集,不同的角色可以在其中扮演角色并做他们想做的任何事情。这个子集每晚都被重新创建。

示例架构

因此,我们定义了在设计大数据架构时需要考虑的 3 个主题,但现在实际情况如何呢?为此,我创建了两个架构,希望与大家分享。

第一个是标准的大数据架构,让您可以看到我们如何将数据从源系统接收到数据湖中,并开始为此提供服务。这种体系结构就是我所说的更“慢”的体系结构,因为您可能依赖于每“x”秒或每“x”分钟轮询一次以查看新数据是否可用的轮询系统。这将发生在从源系统获取数据的最左边部分,以及将数据推送到消费层的最右边部分。然而,对于大多数用例来说,这可能是好的,这完全取决于这个问题:“我希望我的消费层中的数据多快可用?”。

但是,如果您希望数据一放入系统就可以访问,那么您需要考虑更“事件驱动”类型的系统。这些将处理每次数据可用时触发的事件,而不是每隔几秒或几分钟轮询一次。

具有粗略结构的大数据,第 1 部分—计数-最小草图

原文:https://towardsdatascience.com/big-data-with-sketchy-structures-part-1-the-count-min-sketch-b73fb3a33e2a?source=collection_archive---------2-----------------------

你是一家流媒体公司的开发人员。你的团队开发了一个视频内容平台,比如网飞和 YouTube。你的应用程序很受欢迎,用户基数大,内容丰富。

现在,您的团队希望开始加强数据分析,以提高用户参与度。你的团队做的第一件事就是分析平台上的视频流行度。您可能在某个地方有一个散列表,将每个视频的唯一 id 映射到一个观看次数。

a standard hash table

所以你开始分析这个视频观看计数数据,试图找到趋势和诸如此类的东西,但你很快就遇到了一个问题。哈希表的空间复杂度为 O(n)——消耗的空间量与存储的项目数量成正比。例如,如果您的平台有 40 亿个视频,并且每个视频都有一个 32 位的唯一 id(这是支持这种规模的集合的最低值),那么您将需要 160 亿字节的数据,或 16 GB,仅仅是为了跟踪每个视频的 id!然后,您必须考虑视图计数——每个视图都可以存储在一个 32 位整数中。这又是 16 GB,意味着您的哈希表总共将消耗 32 GB!

大多数消费者笔记本电脑没有足够的内存来处理这么多数据。如果您想要将这些视图计数与元数据(如地区、语言、年份、长度和流派)进行交叉引用,以便进行高级分析?你做梦去吧。

在这一点上,很多人会认输,惊呼他们需要一个计算集群来运行分布式并行计算工具,如 Hadoop 和 Spark。也许这是正确的解决方案。但是,在我们投入大量资金并给我们的项目增加大量复杂性之前,让我们探索一些可能使我们的工作稍微容易一点的替代数据结构。

草图——它们是什么?

有一类数据结构被称为草图,它们有能力用次对数甚至恒定的空间复杂度来表示极大的集合。这意味着,当您从第一千个视频过渡到第一个一百万个视频,再到第一个十亿个视频时,您不需要扩展您的计算能力!

听起来好得难以置信?从某种意义上来说,的确如此。草图依靠各种技巧来压缩数据,通常,这些技巧会导致草图包含不准确的信息。初始化草图时,可以分配任意多的空间。但是如果你的集合变得太大,或者你没有分配足够的空间,那么草图很可能返回不精确的结果。这里有一个非常明显的权衡——尺寸与精度——作为一名工程师,这取决于您能否找到满足您需求的平衡点。

作为一个比喻,把原始场景想象成一幅美丽的画,而你的素描,嗯,就是那幅画的素描。就像你需要投入更多的精力来完美地复制这幅画一样,你也需要更多的空间来正确地复制一套。就像一幅错综复杂的画比一幅简单的画更难模仿一样,大型布景比小型布景需要更多的空间来绘制草图。如果你熟悉机器学习,你可以认为素描类似于降维。当您的应用程序正在处理大数据时,这是一种有效的技术,但它不需要完美的准确性。

Count-Min Sketches——人们大约看了多少次阿黛尔的《你好》?

回想一下,我们需要目录中每个视频的浏览量。本质上,这是一个事件发生问题;我们有一个事件流(视图),我们想计算每个事件发生了多少次。事件发生问题的一个流行解决方案是计数分钟草图

Count-Min 草图的内部结构是一个表,类似于散列表。然而,虽然散列表使用单个散列函数,但 Count-Min 草图使用多个散列函数,每列一个。最初,Count-Min-Sketch 中的每个单元都被初始化为 0。当一个事件发生时,该事件的 id 在每一列上被散列。每个哈希函数输出一个行值,并且每个行-列组合的计数器都会递增。为了查询一个事件的计数,我们在所有散列函数中取该事件计数的最小值。

我们举个例子。假设我们有一个 3 列 4 行的最小计数草图。你平台上的第一个用户决定观看“日本历史”。当视频的 id 被这三个散列值散列后,我们得到 1、2 和 1,这表明我们应该在(1,1)、(2,2)和(1,3)处递增计数器。

现在假设另一个用户观看 Adele 的“Hello ”,它的哈希值为 1、1 和 4。接下来,又一个用户观看“日本历史”。

此时,我们决定检查用户观看“Hello”的次数。我们已经看到“Hello”散列为 1、1 和 4,所以我们应该检查单元格(1,1)、(1,2)和(4,3)的计数。这些计数分别为 3、1 和 1。

我们知道“你好”只被观看了一次,然而,在上面的计数-分钟草图中,一个计数器显示“你好”被观看了三次!这是因为“Hello”和“Japan”在第一个 hash 函数上发生碰撞,所以任何观看了两次的“Japan”的视图也将计入“Hello”中。从本质上讲,Count-Min 草图是双重的,允许多个事件共享同一个计数器以节省空间。表格中的单元格越多,我们在内存中存储的计数器就越多,因此重复出现的次数就越少,我们的计数器就越精确。

即使我们不知道观看历史,我们也可以很容易地断定“你好”被观看了不超过一次。如果它真的被观看了 3 次,那么所有加粗的计数器将至少为 3。因为三个加粗的计数器中的最小值是 1,所以我们可以断定“Hello”被观看了不超过 1 次。

现在让我们看一个 Count-Min 草图错误的例子。

即使“你好”在这个序列中从未被观看过,但每个视频都至少在一个哈希函数中与“你好”发生了冲突。结果,当我们查询 Adele 的“Hello”的观看次数时,我们被错误地告知它已经被观看了一次。如前所述,我们可以通过使用更大的表来降低错误的概率和大小。一个小错误并不意味着世界末日,特别是如果我们的目标是了解总体趋势而不是进行精确测量的话。

最小计数草图的属性

Count-Min Sketch 不寻常的结构的伟大之处在于,当我们向集合中添加新事件时,我们不需要分配新的内存。我们增加了一些计数器,但是我们分配的空间是不变的。即使我们添加了一百个、一千个或一百万个新事件,我们的程序也应该在同样多的时间内用同样多的内存运行。换句话说,Count-Min Sketch 在时间和空间上都是 O(1)。问题是,随着我们添加新的事件,会发生更多的冲突,我们的近似计数和真实计数之间的差距会越来越大。

尽管如此,计数分钟草图是非常有效的。一个 1000x8 的 Count-Min 草图(即 8 个散列函数,每个函数映射到一个 1000 长度的数组)需要存储 8000 个 32 位整数。总共是 32kb——比我们之前设想的 32 GB 的大型哈希表小几个数量级!

Count-Min 草图的另一个吸引人的特性是它是并行的。我们可以同时向表中添加多个事件,只要这些事件的散列不冲突。在“较高”的表中,冲突发生的频率较低,在这些表中,散列函数(列)的数量较少,而散列值(行)的范围较大。为并行应用设计的 Count-Min 草图应该记住这一点。

任何需要精确计数的任务——比如跟踪广告显示的次数——都不适合计数-分钟草图。计数-最小草图也不提供减少计数的功能,因此您不会使用它们来跟踪可能上下波动的值。

最后,计数-分钟草图有一个有趣的特性,他们从来不会低估——他们只会高估事件的数量。从统计学上来说,你可能会说计数分钟草图是偏差。如果你只是在比较两个值,这没问题——例如,如果你想弄清楚“你好”是否比“日本历史”更受欢迎。

然而,如果偏差是一个问题,那么您可以使用计数最小草图的去偏差版本,称为计数平均最小草图。当从 Count-Mean-Min 草图中获取事件 e 的计数时,每个 e 的单元格通过减去列平均值来消除偏差。然后,Count-Mean-Min 草图返回偏差校正计数的中值(与 Count-Min 草图不同,它返回高估计数的最小值)。

下次—超对数和布隆过滤器

在本文中,我们学习了一种很酷的、节省空间的方法来计算一个元素在流或大型集合中出现的次数,而不必将集合本身存储在内存中。在下一篇文章的中,我们将学习两种新的用于处理大规模集合的草图数据结构——一种让您估算一个集合的大小,另一种让您检查一个集合中的成员。

具有粗略结构的大数据,第 2 部分—超对数和布隆过滤器

原文:https://towardsdatascience.com/big-data-with-sketchy-structures-part-2-hyperloglog-and-bloom-filters-73b1c4a2e6ad?source=collection_archive---------4-----------------------

本文是我之前的文章“具有粗略结构的大数据,第 1 部分”的后续文章,在这篇文章中,我介绍了空间最优的粗略数据结构的概念。上一次,我们讨论了 Count-Min Sketch,这是一个用来计算一个元素在一个集合中出现的次数的结构。在本文中,我将介绍另外两种流行的草图结构。

有多少用户登录了?O(n)空间解

我们已经建立了一种节省空间的方法来估算视频浏览量。这很好——有了这些数据,我们可以开始了解什么样的内容会吸引用户到我们的平台,并让他们保持参与。

假设您的团队想要开始跟踪其他相关的用户参与度指标。一个明显的例子是在任何给定的时间单位内活跃用户的数量。例如,您可以跟踪每月用户、每日用户甚至每小时用户的数量。你的产品在工作日更受欢迎,还是在周末?用户喜欢在白天访问,还是在晚上访问?

让我们从实现每日活跃用户计数器开始。我们可以使用一个散列集合,每当用户登录时就将他或她添加到集合中。如果用户每天多次登录,或者在不同的设备上登录,或者在不同的浏览器上登录,我们不会重复计算,因为他们的登录 id 将映射到相同的哈希值。每天结束时,我们可以将集合的大小(也称为它的基数)保存到某个每日计数表中。然后,我们重置设置,并开始为第二天计数。

如果我们每天有 10 亿用户,并且使用 32 位整数来存储用户 id,那么仅存储一组活动用户 id 就需要 4 GB。即使你使用一个位图——能够用一个比特表示一个用户——你仍然需要十亿字节的内存来表示十亿个用户。这些数字实际上相当不错。然而,仍然有改进的余地。哈希集和位图都具有 O(n)空间复杂度,这意味着它们消耗的空间与您跟踪的数据量成正比。

尽管您满足于今天跟踪活跃用户的数量,但是明天您可能想要跟踪每个国家的活跃用户的数量,或者每个年龄的活跃用户的数量。您决定监控的指标越多,就越需要投资存储。O(n)数据结构也使得对大数据进行实时分析变得更加困难,因为摄入的数据大小可能会超过您的分析管道的吞吐量。

如果您愿意接受不太精确的用户计数,您可以使用 HyperLogLog ,一种草图数据结构,以获得更好的空间效率。

超级日志-大约有多少用户登录?

超对数(HyperLogLog)是一种具有亚对数 O(log(log(n))空间复杂度和常数 O(1)时间复杂度的草图数据结构。像 Count-Min 草图一样,HyperLogLog 关注的是多重集——每个唯一元素可能出现不止一次的集合。Count-Min 草图可以告诉你一个多重集中的每个元素大概出现了多少次。另一方面,HyperLogLog 可以告诉你一个多重集有多少独特的元素。这就是所谓的基数估计问题

让我们看看如何使用 HyperLogLog。每当用户登录我们的应用程序时,HyperLogLog 算法会将用户的 id 散列成一个位串。假设均匀分布,我们可以得出结论,大约一半的位串以 0 开始,另一半以 1 开始。类似地,大约四分之一的位串以 00 开始,大约八分之一的位串以 000 开始。

你可以看到模式。一般来说,均匀分布的位串的每个 2^ z 中大约有 1 个将以序列z0 开始。

假设,在某个给定的时刻,我们对所有活动用户的 id 进行哈希运算,我们发现前导 0 的最长序列是 0000。这种情况发生在任何随机位串上的概率是 1/16。换句话说,我们平均需要 16 个随机的位串才能找到一个以 0000 开头的位串。所以我们可以猜测,在那一分钟内,我们的应用程序可能有大约 16 个访问者。

HyperLogLog 就是建立在这个想法上的,尽管数学有点复杂。在最初的论文中,位串被分成多个,并且基数被计算为这些段中每一个的 2^z 的调和平均值。哈希冲突产生的偏差由乘法常数处理,线性计数用于为较小的集合提供更精确的计数。这种方法对于一篇中型文章(和我的大脑)来说有点太复杂了,所以如果你真的想深入了解它是如何工作的,我推荐你阅读菲利普·弗莱乔莱 2007 年的原始论文。

尽管是一个相对较新的算法,超对数已经在工业上相当成功。 Redis Labs 使用 HyperLogLog 将一个 12 MB 的数据集压缩到只有 12 KB,同时仅出现 0.81%的错误。谷歌用它来统计他们每天的搜索查询次数。几个数据库,比如 ElasticsearchAWS 红移,都在幕后使用 HyperLogLog。像大多数草图数据结构一样,HyperLogLog 也是完全可并行化的,这使得它对于高吞吐量并行应用程序来说是高效的。要点:HyperLogLog 是一种非常好的节省空间的方法,可以估算出集合中唯一条目的数量。

推荐系统的缺陷

在这一点上,你的团队已经有了一些很好的用户参与度分析——由于 Count-Min Sketch,你可以知道每个视频大约被观看了多少次,由于 HyperLogLog,你可以知道过去一个月每天大约有多少活跃用户登录。您可以使用这些数据来制定业务决策,例如基于最受欢迎的视频制作新内容,或者对未来增长进行预测。

你可能考虑过创建一个推荐系统。人们喜欢基于个人喜好的定制体验。所以,你推出了一个推荐系统,起初,事情进展顺利。

但是过了一段时间,你会发现用户保持率开始下降。这是怎么回事?你做了一些研究,发现许多用户在使用了主页上的推荐后离开了网站。原来你的推荐引擎一直在一遍又一遍的推荐同一个视频,忽略了你的用户已经看过那些视频的事实。你的用户被引导相信他们已经用尽了你的有趣内容目录,所以他们开始离开。

我们如何解决这个问题?我们需要跟踪每个用户看过的视频,并确保这些视频不会再次推荐给那个用户。这是典型的集合成员关系问题的一个实例。给定一个项目(一个推荐的视频),我们想确定这个项目是否属于一个特定的集合(用户的历史)。

我们已经讨论了散列集和位图如何具有线性空间复杂度。如果 10 亿用户每人观看 100 个视频,每个视频由位图上的一个比特表示,我们将需要 1000 亿比特,即 100 GB。让我们努力做得更好。

Bloom Filters——用户大概看过哪些视频?

Bloom Filter 是一种在 O(1)空间和时间上解决集合成员问题的数据结构。布隆过滤器的内部结构是一个 m 长的位串。最初,所有位都设置为 0。像 Count-Min 草图一样,Bloom Filter 使用了 k 个不同的哈希函数,每个函数返回 0 和 m-1 之间的一个位位置。Bloom Filters 支持两种操作——put(x ),它表示将元素 x 添加到集合中,get(x ),它告诉我们 x 是否是集合的成员。

当调用 put(x)时,每个 k 散列函数独立地将 x 散列到一个位位置,然后将 k 选择的位翻转为 1。类似地,get(x)调用相同的散列函数并检查得到的 k 位。如果每个位都是 1,get(x)告诉我们 x 很可能在集合中。如果至少有一位是 0,get(x)告诉我们 x 不能在集合中,因为集合(x)会将 x 的所有位设置为 1。

您可以在下面的操作中看到 initialize()、put()和 get()函数。

让我们看看如何将它应用到我们的推荐系统中。假设我们的推荐系统认为一些用户真的喜欢看“你好”、“日本历史”和“什么是区块链智能合约?”。不过这位用户已经看过《日本史》了,实在不想推荐。

在后台,这三个标题中的每一个都被散列,这些散列被对照用户的观看历史进行检查,被表示为 Bloom 过滤器集。我们看到“日本历史”包含在集合中,所以我们将其过滤掉。最后只有“你好”和“什么是区块链智能合约?”被发送到用户的主页。你的用户看到了新鲜的内容,你的广告商获得了更多的眼球,你的经理获得了更多的钱,你获得了积极的员工评价,所有人都很高兴。耶,布鲁姆过滤器!

布隆过滤器中的偏差

像所有草图数据结构一样,布隆过滤器以准确性换取效率。布隆过滤器返回的错误类型被称为假阳性。当集成员资格查询 get(x)错误地返回“true”时,即使从未调用过 put(x)操作,也会发生这种情况。

怎么会这样?让我们看看下面的例子。用户只观看了“日本”和“区块链”,但这个特定视频组合的哈希值恰好与“你好”的哈希值重叠。因此,“Hello”将被错误地从该用户的推荐列表中省略。听起来很糟糕,对吧?

事实证明其实也没那么糟。只要程序的成功不受误报的影响,您就可以安全地利用节省空间的 Bloom Filters。在我们的推荐系统示例中,我们不会因为某个视频没有出现在他或她的推荐提要中而失去用户。如果一些用户错过了阿黛尔的最新歌曲,这并不是世界末日。只要你不断提供吸引用户兴趣的新鲜内容,你就能保持稳定的参与度,这才是对你的业务真正重要的。

布鲁姆过滤器中的误报实际上与计数-分钟草图中的过度计数错误非常相似。事实上,这两个都是偏向错误,它们都是由同一个现象导致的——哈希位冲突。为了最小化误报率,您需要最小化哈希冲突的概率。解决方法很简单——使用更大的位串。

布隆过滤器可能是当今最流行的草图数据结构。它们用于恶意 URL 检测、网页缓存、数据库查找,甚至拼写检查。布隆过滤器也是一个活跃的研究领域,近年来有许多变种,如计数和滑动布隆过滤器。

未来是概率性的

在这两篇文章中,我们研究了三种概率数据结构——Count-Min Sketch、HyperLogLog 和 Bloom Filters——它们正被用于解决当今的大数据问题。解决问题的概率方法已经被人工智能社区所接受,现在,它们在软件工程师中也越来越受欢迎。软件是关于权衡的——时间与空间,读取与写入,清晰与简洁,一致性与可用性——现在,精度与效率。

50+数据科学实习大名单

原文:https://towardsdatascience.com/big-list-of-50-data-science-internships-ee917ed3413f?source=collection_archive---------2-----------------------

我能找到的所有本科生数据科学实习生职位

数据科学实习是一件棘手的事情。大多数雇主都在寻找高学历的职位,而现在却有实习生的位置,这听起来几乎有悖常理。但事实确实如此,数据科学实习生的招聘数量每年都在快速增长。

明年夏天的大部分角色还没有发布。然而,我发现雇主通常会在八月到十月的任何时候开始张贴申请。开始申请这些数据科学实习生职位可能有点早,但让我来帮助你在时机到来时领先一步。

不用说,领先是有帮助的。相信我,我知道。直到去年夏天,我艰难地通过了 200 多份本科实习生申请和 50 多个 T2 面试,最终在 T4 的一家科技独角兽公司获得了一个数据科学职位。

这个列表是那些明确以数据科学为中心的实习生角色的汇编。建议你把它收藏起来,这样你以后找工作的时候就可以参考了。

虽然相当全面,但你会注意到我的搜索偏向于主要城市,尤其是西海岸。我建议你更多地关注公司本身,而不是下面列出的相关地点,因为这些地点每年都会有所不同。

我也在我的 Github 上以 Markdown 格式发布了这个列表,在那里你还会找到 150 多个之前提供的实习生角色,这些角色不是明确针对数据科学家的,但有些相关。

[## 知识 3/DS-职业-资源

DS-Career-Resources -帮助我踏上数据科学家之旅的资源和见解汇编

github.com](https://github.com/conordewey3/DS-Career-Resources)

最后,这份名单没有特定的顺序,仅仅因为一家公司去年夏天提供了这个职位,并不能保证他们今年夏天也会提供。然而,这是一个很好的搜索起点。至少对我来说是这样。我的任务是扩展一个相似的列表,我用它从最近的、指定的列表开始。尽情享受吧!

工作日

数据科学实习生—普莱森顿,加利福尼亚州

爱彼迎(美国短租平台)

数据科学实习生—加利福尼亚州旧金山

Quora

数据科学实习生—加州山景城

推特

大学数据实习生-加州旧金山

商务化人际关系网

数据科学,分析实习生-加利福尼亚州森尼维尔

国际商用机器公司

数据科学实习生—多个地点

Spotify

纽约州纽约市广告与市场部门数据科学实习生

加拿大白鲑

数据科学实习生—加州圣何塞

易趣

数据科学本科生实习生—加利福尼亚州圣何塞

VMware

数据科学实习生—加州帕洛阿尔托

麦肯锡公司

纽约州纽约市数据科学实习生

塔布拉

数据科学实习生—加州洛杉矶

Unity 技术公司

数据科学,分析实习生-加利福尼亚州旧金山

齐格

数据科学实习生—加州圣克拉拉

拥挤的街道

数据科学实习生—加利福尼亚州埃尔塞贡多

Airware

数据科学实习生—加利福尼亚州旧金山

主厨

数据科学实习生—加利福尼亚州埃尔塞贡多

好事达

数据科学实习生—加州门洛帕克

汞数据

数据科学实习生—加州圣巴巴拉

沃尔玛

数据科学实习生—加州圣布鲁诺

ViaSat

数据科学实习生—加利福尼亚州圣地亚哥

1010 数据

纽约州纽约市数据科学实习生

波音

数据科学实习生—华盛顿州西雅图

ZestFinance

数据科学实习生—加州洛杉矶

NetApp 公司

数据科学/机器学习实习生—加利福尼亚州森尼维尔

阿瓦尔

数据科学实习生—加利福尼亚州旧金山

口香糖

数据科学实习生(NLP) —加州圣莫尼卡

皮船

马萨诸塞州剑桥数据科学实习生

额外跳跃

数据科学实习生—华盛顿州西雅图

暴发户

数据科学实习生—加利福尼亚州圣卡洛斯

BXB 数字

数据科学实习生—加利福尼亚州旧金山

表扬

数据科学工程师实习生—华盛顿州西雅图

塔拉

数据科学实习生—加州圣莫尼卡

数字录像机

马萨诸塞州波士顿数据科学实习生

美国世纪

数据科学家实习生—加州山景城

布兰德利斯公司。

数据科学实习生—加利福尼亚州旧金山

财富前线

数据科学实习生—加利福尼亚州雷德伍德城

大写一

数据科学实习生—多个地点

规则 14

数据科学实习生—加州圣莫尼卡

跳跃资本

伊利诺伊州芝加哥数据科学实习生

尼尔森

数据科学实习生—佛罗里达州坦帕

Centerfield 公司

数据科学实习生—加州洛杉矶

叶组

数据科学实习生—加州圣莫尼卡

太阳能涡轮机

数据科学实习生—加利福尼亚州圣地亚哥

豪饮艾伦·汉密尔顿

数据科学家实习生-德克萨斯州圣安东尼奥

纯存储

数据科学/采矿实习生—加州山景城

橡子

数据科学实习生—加利福尼亚州阿纳海姆

脚锁

纽约州纽约市数据科学实习生

大学董事会

数据科学实习生—弗吉尼亚州莱斯顿

住宅区的树屋

数据科学营销实习生—加利福尼亚州旧金山

自动化洞察

数据科学实习生—北卡罗来纳州达勒姆

HomeAway

数据科学实习生—德克萨斯州奥斯汀

擎天柱咨询公司

数据科学实习生-华盛顿特区

Expedia

数据科学实习生—华盛顿州贝尔维尤

我希望这个列表对你有所帮助!这篇文章是正在进行的“开源”我在数据科学职位上的申请和面试经验的一部分。如果你对我之前的相关帖子感兴趣,请查看:

如果你对未来的更多帖子感兴趣,请确保关注我并订阅下面的我的简讯以接收任何新内容。更多关于我和我在做什么的信息,请查看我的网站。

大 O

原文:https://towardsdatascience.com/big-o-d13a8b1068c8?source=collection_archive---------8-----------------------

在准备我的编码面试的过程中,我阅读了许多教程和建议,关于我们应该把时间集中在什么上。我可以肯定地说,大 O 符号的概念是永远不会消失的。大 O 符号说明了一个算法如何根据其输入大小来扩展复杂度。它描述了函数增长的上限。大 O 符号中常见的一个误解是,它谈论算法执行的速度。有可能在不影响算法复杂度的情况下,使算法显著加快。大 O 表示当输入变大时,一个算法还需要做多少“工作”。

所以现在你可能想知道,大 o 到底是什么,让我们给它一个正式的定义。

在数学中,维基百科对大 O 的定义是:

大 O 符号是一种数学符号,它描述了当自变量趋向特定值或无穷大时函数的极限行为。它是保罗·巴赫曼、埃德蒙·朗道等人发明的记数法家族中的一员,统称为巴赫曼-朗道记数法或渐近记数法。

更具体地说,这篇文章将计算机科学中的大 O 定义为:

在计算机科学中,大 O 符号用于根据算法的运行时间或空间需求如何随着输入大小的增长而增长来对算法进行分类。在解析数论中,大 O 符号通常用于表示算术函数和更好理解的近似之间的差的界限;

实际上,还有一些其他符号与大 O 符号密切相关,例如ω和θ。

大ω有两个广泛存在且不相容的定义。出于本文的考虑,我们将把大ω定义为渐近下限,或者换句话说,最好的情况。例如,如果我们对一个数组进行排序,最好的情况是数组已经排序了。另一个例子是,如果我们在一个数组中搜索一个数字,它是我们检查的第一项。

另一方面,大θ指的是算法的平均运行时间。一个算法在平均输入量下会有怎样的表现?

虽然在为特定解决方案选择最佳算法时考虑最佳运行时间或平均运行时间是件好事,但最好总是考虑最坏的情况。如果我们总是为最坏的情况做准备,我们可以肯定地说,我们的算法将总是比一些阈值执行得更好。

那么我们如何计算一个算法的大 O 呢?

让我们从一个简单的例子开始:

int sumTwoNumbers(int a, int b) {
    return a + b
}

让我们再想想大 O 是什么意思;这是一个算法的复杂性如何随着它的输入增加而增加,或者换句话说,当我们给它越来越多的输入时,一个算法还会做多少“工作”。

现在花点时间想想这个例子中的大 O 是什么…

不,真的尝试一下…

想想…

想想…

如果你说 O(1),你是对的。不管我们给这个函数一个多大的数,它总会做一次加法。我们称之为恒定时间,因为我们的复杂性总是恒定的。

让我们看另一个例子:

void printMatrix(int a)    {
    for(int i=0; i <= a; i++)    {
        for(int j=0; j <= a; j++)    {
            cout << j// Prints out a square matrix
        }
    }
}

在这个例子中,我们有嵌套循环,对于外部循环的每次迭代,我们将遍历整个内部循环。因此,对于我们的第一次外循环迭代,我们的内循环,假设a是任意数,比如 4,它将打印:

1234

在我们的下一次迭代中(i = 1 ),它将打印:

1234
1234 

跳到最后我们得到:

1234
1234
1234
1234

所以我们把 4 个字符打印了 4 次,换句话说就是 4 个。如果使用a = 8,您预计我们的代码片段会打印多少个数字。我们将为每次迭代打印 8 个字符,总共 8 个,所以是 8。你能看出模式吗?因此,对于这个片段,我们得到 O(n ),因为无论输入的大小如何,我们都将打印 n 次。

虽然这是一个非常简单的例子,但我希望它能让你对什么是大 O 以及它是如何计算的有所了解。如果您想了解更多关于 Big O 的信息,请查看以下资源:

大 O 的定义

大 O 上的 HackerRanks 视频

感谢阅读!

*如果您喜欢这篇文章,请在底部留下评论 *

BigQuery 公共数据集

原文:https://towardsdatascience.com/bigquery-public-datasets-936e1c50e6bc?source=collection_archive---------4-----------------------

Kauai, HI

唯一比数据好的就是数据!但是获取大型数据集并不容易。从笨拙的存储选项到难以让分析工具正确运行数据集,大型数据集在实际使用它们做一些有用的事情时会导致各种各样的困难。数据科学家要做什么?

在《人工智能历险记》的这一集,我们将去看看 BigQuery 公共数据集,探索开放数据的神奇世界!

BigQuery 公共数据集

…有一个每月 1 TB 的免费层,让入门变得超级简单。

我们都爱数据。最好是多多益善!但是随着文件大小的增长和复杂性的增加,实际使用这些数据变得非常困难。
BigQuery 公共数据集是 Google BigQuery 为您托管的数据集,您可以访问并将其集成到您的应用程序中。

这意味着谷歌为这些数据集的存储付费,并通过你的云项目提供对数据的公共访问。您只需为对数据执行的查询付费。此外,还有一个每月 1TB 的免费层,让入门变得超级简单。

那么…我如何访问所有这些数据呢?

查看 BigQuery 公共数据集页面,我们可以看到有将近 40 个公共数据集。每个数据集又有许多表。来自世界各地数百个项目的数千个查询正在利用这些庞大的公共数据集。

你可以在网上找到关于图像的最紧迫问题的答案

真正有趣的是,这些数据集中的每一个都带有一些解释文本,帮助您开始查询数据并理解其结构。

树木普查、开放图像和无轨电车

例如,这是纽约市的树木普查。该页面向我们展示了如何轻松找到诸如“纽约市最常见的树种是什么?”以及“自 1995 年以来,纽约市的树种有什么变化?”。这些都可以从直接进入 BigQuery 界面的 docs 页面中点击一下来访问!

If you want to run it yourself, the query is here: https://bigquery.cloud.google.com/savedquery/1057666841514:052da8fe3c014d169752e86b7cc2eaf5

另一个非常惊人的数据集是开放图像数据集。它包含大约 900 万个图像的 URL 和元数据,这些图像被标注了超过 6000 个类别的标签!

你可以在网上找到关于图像的最紧迫问题的答案,比如“数据集中有多少张无轨电车的图像?”(剧透预警:超过 3000 了!)

If you want to run it yourself, the query is here: https://bigquery.cloud.google.com/savedquery/1057666841514:d6d5d8ed6b5449498326f724cbce3091

但是我跑题了。 BigQuery 开放数据集是探索公共数据和练习数据分析技能的好方法。结合像云数据实验室FacetsTensorFlow 这样的工具,你可以做一些真正令人敬畏的数据科学。你还在等什么?前往公共数据集页面,让您的分析尽情发挥吧!

有关更多细节和示例,请查看 BigQuery 的公共数据集文档页面并开始查询!

感谢阅读本集云 AI 冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的 me 或者订阅 YouTube 频道,以便在未来的剧集出现时观看它们。更多剧集即将推出!

大峡谷:扮演上帝,用 Python

原文:https://towardsdatascience.com/bigvalley-play-god-in-python-14563fb7728d?source=collection_archive---------3-----------------------

大峡谷是一个小小的模拟生态系统,有三种动物:草、兔子和狼。

bigValley in action.

草长在岩石上,然后被兔子吃掉。兔子反过来被狼吃掉。每过一年,每只动物都会做三件事情中的一件:1)繁殖,如果她有足够的能量 2)吃食物,如果食物在她旁边,增加她的能量 3)移动,如果她旁边没有食物,减少她的能量

你可以访问这个页面来观看这个世界的动态。动物的运动是可视化的,并且绘制了一些关于它们进化的统计数据(下面将更详细地讨论)。这个世界一直运转,直到狼或兔子灭绝,然后在一个新的时代再生。

学问

这项工作的真正目的是设计一个过程,通过这个过程,世界本身可以了解导致最稳定的生态系统的理想参数。这是一个通常被称为的基于代理的建模的例子。有几种语言和库是为做这种模拟和建模而设计的,特别是 NetLogoArena 。然而,为了在整个学习过程中最大限度地控制参数的设置和重置,bigValley 是用 Python 从头开始构建的。更多的技术细节,以及运行您自己的模拟的代码,可以在该项目的 GitHub 自述文件中找到。

测试了两种学习最佳参数的方法。第一种是更传统的响应面方法方法,拟合一次多项式线性模型,然后在相关系数的方向上以固定的学习速率调整每个参数。第二种利用随机森林模型,从一组随机生成的选项中选择一组最佳参数。下面是关于这两种方法和结果的更多信息。但首先,简单概述一下我们正在优化的参数。

因素

每一个新的生物都有一些小的随机正态变化,这些变化集中在该生物的硬编码起始参数上。当生物繁殖时,子代的变化以其父代的值为中心。随着世界年龄的增长,这创造了某种程度的“遗传”或“进化”。每个生物都有以下参数:

能量是那个生物的启动能量

生殖是动物繁殖所必须达到的能量阈值

疲劳是动物每转一圈所损失的能量(不吃东西)

注意:草和石头因为不动,所以没有有意义的疲劳值。他们每回合都会获得一点能量,直到他们繁殖或者被吃掉。每次迭代中石头的数量不会改变(即石头不会再生被吃掉)。

总共有十个参数设置在每个时期的开始。前六位分别是狼和兔子的能量再现疲劳(以下简称沃尔夫沃尔夫沃尔夫法等。).另外四个是在那个时代开始时存在的狼、兔子、草和岩石的数量。

初始训练运行

在每个模拟的开始,世界的 25 个纪元以默认开始参数为中心运行。这些参数在每个时期都添加了随机正态噪声,从而生成了训练模拟的某种“正态分布”的表象。此外,每次每个生物的开始位置都是随机的,所以这给每次迭代增加了另一个随机因素。

一旦运行了 25 个时期,第一个学习迭代通过在这 25 个时期上训练机器学习模型(下面讨论)并相应地设置其参数而开始。

稳定阈值

每个纪元一直运行,直到兔子或狼灭绝,或者达到预设的“成功”阈值(运行 500 年没有灭绝,或者增长到 10,000 只动物)。在下面的示例中,在计算汇总统计数据之前,进行了 50–75 次学习运行。每个测试运行都用一个 3 字符的字母数字 ID 来标识,以便于在图之间进行比较。前缀 LM-表示使用线性模型进行学习的运行,而 RF-表示随机森林。

响应面线性模型

在最初的 25 个训练时期之后,用上面讨论的 10 个参数作为解释变量,用该迭代的第一次灭绝的年份作为响应,拟合 OLS 线性模型。因此,反应是有限的,下限为 1(第一年灭绝,可能性极小),上限为 500(重启前允许的最大年限)。

然后,在每个相应参数的系数方向上调整下一个时期的起始参数。

这个过程在每个时期重复,因此模型适合所有 25 个训练迭代,和所有先前的学习时期。然后为下一个时期相应地调整起始参数。下面是两个线性模型模拟的可视化。

动物统计:线性模型

从左到右,随着算法的学习,你会看到生态系统的演变趋势。狼被描绘成紫色,兔子被描绘成蓝色。内部的大圆圈代表物种的起始能量,而它周围的大圆圈代表繁殖阈值 Repro ,小圆圈代表疲劳。中间的线条显示了每个时代开始时每个生物的相对数量。底部的面积图和数字显示了这些时代在灭绝前的成功程度。

尽管这些痕迹远非完全相同,但还是出现了一些模式。例如,在两个测试中,兔子和狼的疲劳立即向零移动,直到达到最小允许值。同样,随着学习的进行,两种模拟都会增加草地和岩石的起始计数。

然而,更有趣的是注意到狼和兔子的参数朝着相反的方向移动。汇聚了极少数容易繁殖的非常大的狼,以及大量繁殖前需要更多能量的小兔。另一方面,O55在大量中等体型、繁殖速度较慢的狼和数量适中、繁殖速度较快的大型兔子之间找到了平衡。

随机森林模型

随机森林模型采用了一种完全不同的方法。同样,每个测试运行从 25 次训练迭代开始。然后,在每个学习迭代中,随机森林回归器适合于训练数据(其再次包括初始的 25 个,以及所有的先前学习时期)。在这一点上,产生了 100 组参数,这些参数围绕每个参数的“中心值”随机正态变化。然后,新训练的回归器为这 100 个参数集的每一个预测第一次灭绝的年份,并选择预测结果最好的一个(即直到灭绝的大多数年份)。这个“最佳参数集”然后被用于运行当前时期。

注意:这些用于生成 100 个选项的“中心值”最初被设置为附录中的默认值,但是一旦算法开始学习,它们就被设置为前一个时期中预测的“最佳参数集”的值。与线性模型方法相比,这提供了探索更多特征空间的较慢的参数移动。

生物统计:随机森林

这两个与两个线性模型运行相比没有那么明显,尽管它们确实显示了另一组似是而非的解决方案。虽然两者都选择了少量繁殖相当缓慢的中等体型的狼,OUP实际上似乎正在向甚至更小的狼发展。尽管R7J有中等数量的中等大小的兔子,而OUP展示了少量的小兔子,但是这两个系列都趋向于繁殖速度不快的兔子。

结论和后续步骤

上面的图显示了优化一个稳定的生态系统的给定问题的四种不同的“解决方案”。更多模拟的类似总结可以在这里查看,还有更简洁的总结海报这里

超越“最佳”

这种模拟在广泛的领域都有应用,从野生动物生物学到救护车路线到在线社区建模。与寻找单个“最佳”参数集相反,从基于代理的模型(如这种模型)中获得的主要收益是探索参数之间的相互作用的能力,以及探索给定问题的可能解决方案的很大空间的能力。

线性建模方法似乎比随机森林更快地收敛到其最佳设置。然而,考虑一个真实世界的情况,其中某些参数不能简单地“调高或调低”而没有一些巨大的成本。当然,如果 grassNum更高可能会“更好”,但是想象一下,这代表了“红十字会在灾区投放的食物数量”。简单地将食物投放点的数量增加四倍可能是不切实际的。在这种情况下,随机森林和其他非参数模型带来了很多东西。

后续步骤

这项研究可以有很多方向。一个明显的例子是引入全新的代理(例如“超级掠食者”吃狼;或者可能是一种大型的、繁殖速度较慢的食草动物与较小的、速度较快的兔子共存)。然而,如果要从这种建模中获得任何真实的收益,我们必须确保不要引入太多超出我们控制的变量。

另一个有趣的方法是建立不同的“大陆”这将需要同时模拟几个生态系统,但在网格上彼此相距很远。最终,种群会扩大到足以相互交流。观察不同进化种群在这些边界上的相互作用可能会令人着迷。通过访问上方的图像,点击“大陆”单选按钮,可以看到测试版。

每个纪元 500 年的限制也可以增加。这可能是最简单、信息量最大的扩展。该限制部分是为了控制异常值,但主要是为了控制计算时间。这里展示的例子花了几天时间在一个相当小的 AWS EC2 实例上进行模拟。有了更多的计算能力,这个限制可以大大放宽,并且可以观察到更多样和有趣的互动。此外,让模拟运行的时间远远超过我们在这里展示的 50–75 个学习周期将会非常有趣。它们最终会汇聚到不会导致灭绝的环境中吗?似乎有可能。

定制

对于那些喜欢冒险的灵魂,请随意打开 bvLife.py,创造一些属于自己的生物。每吃一种植物就能获得双倍能量的反刍动物?成群猎食的掠食者?一种以低能量觅食者为食的食肉植物?唯一的限制是你自己的想象力…

访问 bigValley GitHub repo 开始您的旅程。

公告牌 100 大热门分析

原文:https://towardsdatascience.com/billboard-hot-100-analytics-using-data-to-understand-the-shift-in-popular-music-in-the-last-60-ac3919d39b49?source=collection_archive---------2-----------------------

Photo by Malte Wingen on Unsplash

关于流行的现代音乐,你从“年长”的人那里听到的最多的是什么?总的主题是:“你的音乐声音太大,缺乏内容”。他们用意味深长的歌曲、深情的艺术家、能让你感动落泪的低音吉他谈论“过去”的日子。当他们这么说的时候,他们是在比较:

Downtown by Petula Clark, 1965

对此:

Stir Fry by Migos, 2018

很明显,有明显的区别。然而,这将需要一个数据点来得出一个一般性的结论(这是人类非常擅长的)。作为一名千禧一代和数据科学家,我发现这是一个有趣的话题。让音乐“伟大”的因素真的改变了那么多吗?声音、歌词和“信息”都变了吗?如果他们改变了,他们到底是如何改变的?

使用 billboard 从 1950 年到 2015 年的热门 100 强排行榜和 Spotify 的 API,我们想仔细看看流行音乐在过去六十年里发生了多大的变化,并找出今天的音乐与其他音乐的真正区别。

我的方法

在这篇文章中,我将“伟大的音乐”定义为进入公告牌百强。我从一个慷慨的 GitHub 用户 Keven Schaich 那里得到了数据。该数据包含许多有趣的特征,如情绪、射击雾指数(估计第一次阅读理解文本所需的正规教育年数)、单词数、重复单词/短语数等。

此外,Spotify 还有一个有趣的 API 端点,叫做 get_audio_features 。端点允许你获得歌曲的特征,如响度、乐器性(使用了多少乐器)、能量、活跃度(现场观众的存在)、语速、歌曲持续时间等。这使得 1950 年至 2015 年间公告牌百强热门歌曲的歌曲总数达到约 30 首。

所有这些特性都在这里这里进行了解释,我还会在以后的文章中解释一些。

最初,我开始在这个项目中使用 Python,我也这样做了。算是吧。我用 python 的 pandas 和一个名为 spotipy 的 Python 包完成了我的第一次数据收集迭代。

然而,在这个过程中,我回顾了我的方法,发现了一个更有趣的数据集。为此,我特意回到 R,因为 tidyr::gather()函数(在 pandas jeez 中旋转数据太烦人了)。

下面是 RPython 中的代码,除了一个名为 get_audio_features 的函数之外,它们在大多数方面都是不同的。我的最终数据集可以在这里找到。

我花在数据收集上的时间与我的其他项目形成了鲜明的对比,因为与我的其他项目不同,有人花时间将现成的数据集放在一起。这是我分享我收集的所有数据的主要原因,希望有人不会花 6 周时间去收集数据。

我们开始吧!

1.在过去的六十年里,我们在音乐方面只有两次重大的变化

通过使用一种叫做聚类的算法,我们可以使用他们的歌曲特征来发现艺术家和他们的音乐的相似性/聚类。

使用这种方法,我们有两个艺术家群体——弦乐爱好者诗学。我们之所以选择这些怪异的名字,是因为歌曲的两个特征最能定义这些集群:工具性和

乐器性在 0 到 1 的范围内预测音轨是否不包含人声。“哦”和“啊”的声音也被视为乐器。该值越接近 1,就越有可能没有有声内容(例如音轨),越接近 0,就越有有声内容(例如说唱或口语)。

语音检测音轨中是否存在语音单词。

  • 弦乐爱好者在器乐性方面得分较高,但在语音方面得分较低。这意味着这一时期的艺术家倾向于乐器而不是演讲。
  • 诗学是完全相反的。他们在语言能力上得分很高,但在工具性上得分很低。

关于这些集群的另一个有趣的事情是当它们出现在广告牌 Hot 100 上时。

  • 大多数弦乐爱好者出现在 90 年代以前的 Billboard 上。
  • 90 年代以后大部分诗学出现在 Billboard 上。

  • 90 年代本身似乎是音乐的一个关键时期,正如我们所看到的,弦乐爱好者和诗学之间各占一半。这意味着艺人们被分成了两派,要么继续这种新类型的音乐,要么坚持现有的声音。

2.乐器的使用减少了,主要是因为摇滚乐队变得不那么流行了

在 60 年代末和 21 世纪初之间,乐队非常受欢迎,以至于有和独唱艺人一样多的乐队。

在 2000 年代之前,一年中的乐队越多,该年的平均乐器演奏度越高。

然而,90 年代以后,乐队的数量对乐器的使用几乎没有影响。

除了两个异常值,波段的数量对仪器的使用几乎没有影响。这很有趣,因为正如我之前提到的,乐队在 21 世纪初仍然很受欢迎。

发生了什么事?

我相信你猜到了。乐队的类型变了。

90 年代以前,大约 60%的乐队是摇滚乐队——通常只有一名主唱和一群乐器演奏者。

然而,从 2000 年代至今,摇滚乐队的比例大幅下降,为一种新的乐队品牌让路,这种乐队通常由所有歌手组成:流行乐队。想想《命运之子》、《小野猫》、《第五和声》、《单向乐队》——你能想到的都有!

3.我们也可能把诗学的出现归功于嘻哈音乐的兴起

除了语速和用词的增加,诗学使用的复杂词汇是弦乐爱好者的两倍(例如,Jay-Z 说富裕而不是财富),并使用更多音节的词汇。当我们想到御词艺人时,每个人脑海中都会立即浮现出一个流派:嘻哈

鉴于 Hip-Hop 在与单词相关的特征方面领先于所有其他流派,毫不奇怪的是 Hip-Hop 在 90 年代获得了主流流行——与诗学的兴起相对应。

4.虽然随着时间的推移,音乐风格发生了很大变化,但过去 60 年的流行歌曲大多是关于爱女人的

为了达到这个目的,我使用了一种叫做主题建模的算法。顾名思义,该算法在给定的文本中搜索主题。

在我们的例子中,文本是公告牌歌曲的歌词。

让我们看看这些话题在几十年间是如何变化的:

这绝对是惊人的!

像歌曲的特点一样,歌词也明显分为两个类别,主题 1 捕捉到了 50 年代到 80 年代,主题 2 捕捉到了 90 年代之后的几十年,以及作为过渡期的 90 年代!

这意味着歌曲的声音和“信息”以几乎相同的速度变化。

那么,这些话题是什么呢?

题目几乎是一样的东西!在过去的六十年里,顶级歌曲不成比例地成为“耶,我爱我的宝贝”。

这里还发生了一些有趣的事情。这两个主题之间的一个主要区别是,在 90 年代之前,歌曲可能有一个更“直接”的方法——你可以看到一个主要主题是“将要”,例如“我会爱你”。而在 90 后,它似乎更间接一些,比如请求允许,因此用“想要”代替了“将要”。《Wanna》也可以描绘一种更具未来感、更富想象力的爱女人的方式。

5.更“安静”的体裁在诗歌时代不复存在

这在某种程度上证实了我们现在比以前更倾向于选择更响亮的音乐。

五种最“安静”的音乐类型是——爵士乐、摇摆乐、民谣、蓝调和迪斯科。

这些流派在诗歌时代也不再作为流行音乐存在,除了爵士乐似乎被一个艺术家(诺拉·琼斯)保存了下来。

这些都是什么意思?

总而言之:

  • 90 年代是音乐史上极其重要的时期。
  • 摇滚乐队的衰落和嘻哈音乐的兴起在引领音乐走向今天的道路上扮演了重要角色。
  • 在过去的 60 年里,爱情一直是流行歌曲的主题,但不同时代的音乐对爱情的理解可能会有所不同。
  • 是的,现代艺术家可能会更大声,但这是因为我们有内容:)。
  • 额外收获:尽管迈克尔·杰克逊在 80 年代最受欢迎,但他是一个富有诗意的人!他超越了他的时代!

有趣的事情和需要记住的事情

  • 我采用了一种不同的(也更有趣的)方法来展示这个项目的数据。我用 HTML,CSS,js 和 chart.js 搭建了一个仪表盘!这款应用还没有针对手机进行优化,所以最好在笔记本电脑上使用。

http://bit.ly/music-dashboard】下面是链接:T5

  • 仪表板有两个选项卡。第一个是“艺术家仪表板”,显示每个艺术家的平均歌曲特征。

  • 第二个标签“比较仪表板”允许你比较多达三个艺人的歌曲特征,看起来像下面的截图。

  • 你可以使用右上角的图标在推特或脸书上分享结果。
  • 万一你忘记了这些特性的意思,将鼠标悬停在标题上,你会得到一个解释它的小工具提示🙂
  • 诗意的时代(我喜欢这样称呼它)是一个持续的时代,所以如果我们有 2016 年至 2018 年的数据(特别是随着陷阱音乐的兴起),这些见解可能会发生变化。然而,我不认为效果会很大。
  • 衡量一首歌的“政治意识”会很有趣。我可能会在推特上发布结果。
  • 像往常一样,我受到慷慨的 GitHub 用户的数据收集方法、Spotify 的算法以及 Billboard 如何进入热门 100 名的限制。

希望你读这篇文章的时候和我写这篇文章的时候一样开心🙂

原载于 2018 年 6 月 10 日【theartandscienceofdata.wordpress.com】

用于方面术语抽取的 BiLSTM-CRF

原文:https://towardsdatascience.com/bilstm-crf-for-aspect-term-extraction-87630406573a?source=collection_archive---------4-----------------------

本文组织如下。首先,我们将谈论体术语提取的背景。其次,我会给你一个构建 BiLSTM-CRF 模型来提取方面术语的教程。

  • 1 背景
  • 1.1 什么是特征术语抽取
  • 1.2 我们为什么需要 ATE
  • 1.3 如何提取方面术语
  • 2 数据准备
  • 2.1 数据定义
  • 2.2 数据集创建
  • 3 BiLSTM-CRF
  • 3.1 模型定义
  • 3.2 培训

1 背景

在这一部分中,你将有一个关于方面术语抽取的概述知识。

1.1 什么是方面术语提取

方面术语抽取是基于方面的情感分析中的一个关键子任务,旨在从在线用户评论中抽取明确的方面表达。那么,体貌术语是什么呢?方面术语是意见的目标。比如这里有一个评论,“牛肉很嫩,在我嘴里融化了”。在这篇综述中,体术语是“牛肉”,观点术语是“嫩”。

1.2 为什么我们需要 ATE

这里我们展示一个亚马逊的例子。还有无线耳机。考虑到这种情况,一个客户有多台不同 OS 的设备,就像两台分别装有 iOS 和 Android 的智能手机,MacBook Pro,Surface Pro 等等。所以这位客户想知道这款耳机是否可以连接多个设备。但是要从成百上千的评论中找到有用的评论会花费太多的时间。幸运的是,有一个部分叫做“阅读评论”。客户可以通过单击软件按钮找到关于该软件的所有评论。这可以帮助顾客快速找到他们想要的东西。你可以从下图中得到这个想法。

但是我们可以看到这个实现只是从文本中提取相同的单词,这不是一个聪明的方法。为了比较,我从中国最大的电子商务网站淘宝上拍了一张照片。

After I clicked the ‘服务好’(Good Service), the below part showed all reviews related to ‘Good Service’. And we can see the aspect terms/phrases are not just the same with ‘Good Service’.

至于真正的实现,我从产品团队找到了答案。

  1. 根据类别特征,提取相关评论,进行分词和词频统计。
  2. 用 LDA 对词进行聚类,用本体对词进行分类。
  3. 将观点词分配给体貌词,决定句子的情感。(我想这里他们可能会使用依赖解析)
  4. 给体词附加感情,标出体词在句子中的位置。
  5. 在搜索引擎中建立方面情感和位置标记。

下面是中文版答案

1.3 如何提取方面术语

ATE 任务可以被视为序列标记问题。传统的序列模型如条件随机场(CRF)、长短期记忆网络(LSTMs)和分类模型如支持向量机(SVM)已经被应用于处理 ATE 任务并取得了合理的性能。

这些现有工作的一个缺点是它们没有利用这样的事实,即根据任务定义,方面术语应该与意见指示词一起出现。因此,上述方法倾向于在非意见性句子中对那些频繁使用的方面项输出误报,例如,“餐馆开始时挤满了人,所以我们等了 20 分钟”中的单词“餐馆”,该单词不应该被提取,因为该句子不传达对它的任何意见。

有一些工作在处理 ATE 任务时考虑了观点项,如递归神经条件随机场(RNCRF)、耦合多层注意(CMLA)等。这里就不多说了。

如题,这次我们将使用 BiLSTM-CRF 来做 ATE 任务。BiLSTM-CRF 已被证明是一个强大的序列标注模型,如命名实体识别(NER)、词性标注和浅层句法分析。如果你正在做与序列标记任务相关的工作,这是丰富你的技能集的必备工具。

2 数据准备

我们将 ATE 任务视为序列标记任务,它非常类似于命名实体识别(NER),即定位文本中的命名实体并将其分类到预定义的类别中,如人名、组织名、位置名、时间表达式等。例如,我们输入句子,“奥巴马总统正在白宫发表演讲”,其中的“奥巴马”应标记为“人”,“白宫”应标记为“地点”。可以试试 anaGo 的试玩

简而言之,如果我们遵循 NER 使用的数据格式,我们可以通过使用序列标记模型来容易地处理 ATE。说到 NER 使用的数据格式,它遵循了 IOB 格式的惯例。 BIO 分别表示开始、内侧和外侧

IOB 标签已经成为表示块结构的标准方式。你可以在 2.6 表示组块:标签 vs 树中找到更多信息。

  • PRPVBDDTJJNN 是每个词的词性标签。
  • B 和 I 标签以组块类型作为后缀,例如 B-NP、I-NP。
  • NP 是一种组块类型,意思是名词短语组块,或 NP-chunking。

至于 ATE 任务,格式将变得更简单,因为只有一种组块类型,即方面术语。我们可以用下面的例子来表示每个句子。 BIO 分别表示方面跨度的开始、内部和外部。

在我们准备好数据集之后,我们可以使用 BiLSTM-CRF 模型进行训练。

2.2 数据集创建

为了将 ATE 任务视为序列标记任务,我们首先需要将数据格式从 XML 转换为 CSV。可以在这里找到 SemEval 2016 餐厅的 XML 原文: semeval-2016 。XML 数据格式如下所示。

这个 XML 脚本包含三个句子。在每个句子块中,它包含三个部分,句子 id、文本、观点。在意见部分,目标是体项。以第一句为例,它只有一个体项。所以我们需要为单词“place”分配标签“B ”,为其他单词分配“O”。

因为我们把它当作一个序列标注问题,所以在预处理部分,我们只把单词转换成小写。我们不删除停用词和词条。所以数据清理部分相当简单。

在最后一步,我们将数据保存为 CSV 文件。每行将包含句子 id、单词和标签。

1 将 XML 数据读取到 BeautifulSoup

这里我们使用 BeautifulSoup 来读取 XML 文件。

sentence_nodes看起来像是:

2 将 soup 对象转换为字典列表

在这一步中,我们将 soup 对象转换为字典列表。每个字典包含三个关键字:

  • ‘方面’:一个列表包含一个句子中的方面术语
  • ' id ':句子 id
  • ' text ':字符串包含审阅文本

sentences看起来像:

3 创建数据帧

3.1 将文本拆分成文字

用空格分割字符串并保留标点符号。

3.2 带 IOB 格式的 taggin word

给句子中的每个单词分配 IOB 标签。

3.3 将字典列表转换为数据帧

3.4 总结一下

获得 DataFrame 对象后,我们将其保存到 CSV 文件中。

对于测试数据集,再次遵循上述步骤。最后,数据如下图所示。

3 BiLSTM-CRF 模型

在实现之前,我们先简单介绍一下 BiLSTM-CRF 模型。下图显示了 BiLSTM-CRF 的架构。

  • 单词嵌入。这一层将把每个单词转换成一个固定尺寸的向量。通常没有必要自己训练单词向量。已经有很多预先训练好的单词嵌入数据可供使用,我们使用手套
  • BiLSTM 编码器。该编码器包含两个 LSTM 层,它可以从上下文中学习信息。
  • CRF 层。该层可以向最终预测的标注添加一些约束,以确保它们是有效的。在训练过程中,CRF 层可以从训练数据集中自动学习这些约束。

3.2 培训

在模型构建方面,BiLSTM 很容易用 Keras 实现,关键是 CRF 层的实现。

有两种方法。一种是使用 keras-contrib 中的 CRF 层,另一种是使用 anaGo 库。我实现了这两种方法。keras-contrib 实现获得了 0.53 f1 微分,anaGo 获得了 0.58 f1 微分。所以在这里我将介绍如何使用 anaGo。但是你可以找到两个实现笔记本。

anaGo 的源代码写的很好,构造的也很好,包括如何读取嵌入文件,加载嵌入权重。仔细看看代码是值得的。这次我们使用 glove.840B.300d.txt 文件,这意味着 8400 亿个单词,220 万个词汇,每个单词表示为 300 个维度。记号表示语料库中“单词”的总数,vocab 是唯一的单词。

anaGo api 易于使用,您可以通过几行代码实现 BiLSTM-CRF 模型。另一方面,学习后面的实现对使用没有好处。作者 Hironsan 自己实现了 CRF 层,代码写得很好。我强烈建议您先阅读本文,然后再看 anaGo 实现。

正如 anaGo 的文档所示,样本的输入格式是单词列表,标签应该是 IOB 标签列表。

这里我们写一个函数将数据帧转换成输入格式。

然后我们就可以写出整个过程了。

看,实现部分只需要 4 行。在训练过程中,它会显示每个时期的 f1 分数。在这里,我们将 epoch 设置为 50,以使其过拟合,并查看多少个 epoch 是合适的。

总结一下

最后,我们将所有代码加在一起。

这是实现 BiLSTM-CRF 的简单方法。您可以在下面找到两个实施笔记本。

查看我的其他帖子 中等 分类查看
GitHub:
bramble Xu LinkedIn:徐亮 博客:bramble Xu

二元逻辑回归——理解可解释的人工智能

原文:https://towardsdatascience.com/binary-logistic-regression-understanding-explainable-ai-c79208bb3ca9?source=collection_archive---------19-----------------------

可解释的人工智能或 XAI 是人工智能的一个子类,其中模型做出的决定可以由人类来解释,这与“黑盒”模型相反。随着人工智能从纠正我们的拼写和定向广告转向驾驶我们的汽车和诊断病人,验证和证明得出的结论的需求开始得到优先考虑。”

在我的上一篇关于可解释的人工智能(XAI)的故事明显受欢迎之后,是时候解决一个类似透明但有用的算法了,逻辑回归。逻辑回归属于“广义线性模型”的快乐家族,它给线性回归的直线增加了一层复杂性。

A Plain / Vanilla Linear Model

通过数据点拟合直线在许多情况下都很有效,其中 xy 可以在合理的范围内取任何值,例如根据体重或教育收入预测身高。然而,在某些情况下,感兴趣的变量是二进制的,只取两个值。例如,预测某人是否会对他们的保险提出索赔,或者如果你的产品做了广告,客户是否会购买,这可能是有用的。在这种情况下, y 取值 0(事件不会发生)或 1(事件发生)。

当我们在这种类型的问题上使用线性回归时,我们会预测超出[0,1]范围的 y 的值,这使得对结果的解释令人困惑,甚至毫无意义。

一个更好的模型应该能够调整 y 的分布,并且只提供有意义的预测。这就是广义线性模型的目的。

函数 f()被恰当地命名为' link 函数,将 X'B 的线性规格与非线性变量 y 联系起来。这里明显的限制是假设 X 变量的一个线性组合足以解释 y

对于二元结果情况,我们将使用 Logit 函数,其结果如下:

Logistic regression with the same data as above

与简单的线性模型不同,逻辑回归中的参数 B 没有封闭解。相反,我们必须像在深度学习场景中拟合权重一样拟合它们——通过迭代改进。这需要两件事;衡量 B 有多“好”的标准,以及提高 B 的方法。

B 有多好?

我们采用“可能性”方法来评估 B,估计我们的模型成为生成数据的“真实模型”的可能性或概率。从数学上讲,我们找到了观察我们拥有的数据的概率,给定了参数。对于 y 和 logit 函数 S() 的单次观察,该概率由下式给出:

当参数 B 对 y 给出更准确的预测时,概率会更高。这个等式的直觉给出如下:

dodgy truth table

通过假设每个观察是独立的,我们可以将整个数据集的概率计算为所有观察水平概率的乘积,我们称之为可能性, L()

显然,为了优化目的而寻找 L 的导数是不切实际的,因此通常的做法是取似然函数的对数来得到 L()。

The nicely simplified version

取对数是有效的,因为我们主要关心不同 B 规格的相对可能性水平,而不是值本身。由于 log(x)x 中总是增加的,如果一个规格的可能性比另一个大,那么它的对数可能性也会大。这种形式允许我们分别定义 l,l’l”的一阶和二阶导数,同时仍然给我们一个 was 来量化一组参数在拟合数据方面有多“好”。

如何让 B 变得更好

有许多算法可以找到最佳 B 值,其中大多数算法的目标是找到使对数似然函数 l 最大化的 B 值。这些算法是“爬山”,因为它们找到了函数的最大值,这与试图找到最小损失函数的深度学习技术相反。

一种这样的技术是牛顿-拉夫森方法,该方法寻找函数 F 的根(当函数等于零时)。通过应用以下规则,每次迭代我们都稍微接近 F 的根:

使用一些高中微积分,我们知道我们的对数似然函数在导数等于零的地方有最大值。用 l '代替 F,我们就剩下爬山算法了:

值得庆幸的是,所有这些公式,包括 l 的导数,都可以用矩阵形式表示,从而加快了计算速度。(这个项目的代码和包含的乐趣* 线性代数可以在这里访问。)*

结果

逻辑模型的结果很容易解释,预测值 y = S(X'B)y 取值为 1 的概率,因此是事件发生的概率。

生物信息学和数据科学

原文:https://towardsdatascience.com/bioinformatics-and-data-science-431899ddd552?source=collection_archive---------4-----------------------

生物信息学家可以轻松转换到数据科学角色吗?他们应该期待什么样的挑战?他们的技能组合是否足以满足数据科学的需求?

Differentially methylated CpGs from https://doi.org/10.1371/journal.pgen.1002781

近来,生物学和医学科学界对数据科学产生了浓厚的兴趣。来自这些领域的研究人员正在生成大量数据,自然,正如任何可以访问大型数据集的领域一样,人们对“数据科学”能够提供什么感兴趣。希望数据科学家将处理和过滤这些大型数据集,并通过应用统计学和机器学习模型产生有意义的生物/医学见解。当我听到这样的事情时,我会说“等等!!这不就是我们这些年一直在做的生物信息学吗?”。简短的回答是“部分”。在整个医学科学中,研究人员拥有更加多样化的数据集(成像、病历等。)相比我们日常处理的那些,但数据分析方法的核心、数据的规模和方法是相似的,无论数据集如何。在这方面,我一直将“数据科学”视为我所称的“生物信息学”的一般化版本。如果这是真的,生物信息学家可以轻松地转换到数据科学角色吗?他们应该期待什么样的挑战?最重要的是,他们的技能组合是否足以胜任数据科学角色?为了回答这些问题,除了广泛的 google-fu 和个人经验之外,我还与数据科学家进行了交谈。

什么是生物信息学?

我首先要澄清我所说的生物信息学是什么意思。对我来说,以下术语描述了非常相似(如果不是完全相同)的领域:“生物信息学”、“计算基因组学”和“基因组数据科学”。虽然会有人试图区分这些术语,但它们对我来说代表着相似的东西。这些领域要求您处理和分析大规模基因组数据集,并提出生物学见解。为了在这些领域发挥作用,你需要能够处理大规模的原始数据(通常是测序或某种形式的组学数据),对处理后的数据进行质量检查和转换。然后,您将需要根据您的问题应用机器学习或统计模型。您最有可能做一些降维和聚类,然后进行可视化。根据分析的初始结果,您可能需要重复所有这些步骤或采取不同的方法。你将写报告和做演示,以传达你的数据驱动的故事。除此之外,他们还需要适应不断变化的数据生成技术、文件格式以及新的统计和机器学习方法。在 Coursera“基因组数据科学”课程的教师对生物信息学的定义持有类似的观点。

生物信息学技能集

现在,让我描述一下生物信息学的技能。这些技能组合期望适用于我们的实验室。生物信息学家的任务和要求可能各不相同。除了技术技能,人们还需要有科学好奇心、心态和动力来解决与生物学和医学相关的问题。但是这些更多的是品质而不是技能。这就是他们不在名单中的原因。在我看来,生物信息学家需要具备以下知识和技能,或者至少在他们完成时获得这些知识和技能。他们不需要样样精通,但至少应该有一些实践经验。

  • 特定领域的数据处理和质量检查
  • 常规数据转换和过滤
  • 应用统计学和机器学习
  • 特定领域的统计工具和数据可视化
  • 通用数据可视化和报告工具
  • 特定领域的数据集成:这可能需要使用 API、数据库和/或平面文件
  • 能够为数据分析任务编写带有版本控制的代码。代码应该是可重用的,高效的和文档化的。我们实验室的很多人都需要编写 python/R 包。
  • 能够通过出版物、海报和演示文稿交流数据驱动的见解/故事

数据科学技能集

根据 udacity 的说法,数据科学家的基本技能是:

  • 编程;编排
  • 机器学习
  • 统计数字
  • 数据争论:数据处理、格式化和转换
  • 数据可视化和通信
  • 数据直觉(这个有点不太清楚,我猜他们指的是数据分析相关问题的故障排除,知道当事情出乎意料时要检查和测试什么。)

你可能在网上看到的其他列表可能会列出大数据处理技术堆栈(Hadoop、spark 等。)或者对线性代数和微积分有深入的理解。但是这些技能,尤其是技术,很可能是组织特有的。“数据直觉”可能是你多年来在处理数据分析问题时形成的。由于定义模糊,我在这里做一个假设。我们也可以看看数据科学家的招聘广告,然后得出类似的所需技能列表

我意识到成为所有这些领域的专家非常困难,很明显公司在“数据科学”下有不同的角色,他们并不总是希望雇用多面手,但他们希望在上述每个领域都有一定程度的精通。

比较

如果您从生物信息学技能集中移除特定领域的要求,您将剩下大部分数据科学技能集以及更多。从生物信息学转向数据科学的人很可能需要适应他们雇主的数据组织和分发环境。这些问题来自不同的领域,所以他们也需要适应。但至少在某种程度上,数据科学家在不同雇主之间转换工作也是如此。

在我看来,一个定期进行从原始数据到洞察的端到端数据分析的生物信息学家在“数据科学”职位上不会有问题,我应该强调,我并不是说任何生物信息学家都可以在数据科学职位上表现出色。他们可能需要学习新的领域特定知识或技术堆栈(hadoop、spark 等)。)与公司的数据组织相关,但学习新方法并实施它们是他们在博士培训和博士后工作期间的例行工作。我认为,如果你具备上述核心技能,并愿意适应和学习,你可以在任何数据分析相关领域表现出色。

从生物信息学转行的数据科学家的见解

我的网络中有十几个人已经从生物信息学转向了数据科学。我问了一些他们的经历。一位联系人表示,转向数据科学的人应该意识到,优先事项和文化与工业界的学术界不同。在工业界,更多的是以客户和产品为导向的思维。你的方法的故障安全、可伸缩性和健壮性可能与最酷的方法同等重要,甚至更重要。他还补充说,团队合作、团队间和客户互动也越来越多。交流和建立交互协议非常重要。所以,转变也需要调整心态。

另一位联系人,Markus Schüler ,现任数据科学负责人,前生物信息学家,同意行业中的思维模式是不同的。他也承认产品导向思维的必要性。这些模型需要是健壮的和可维护的。这并不是说你做了一个模型,然后就让它这样。此外,他还分享了这样一个观点,即你并不总是追求最酷和最好的模型,其他因素,如运行时间、实现需求、可伸缩性和架构适合度,以及模型本身的可解释性,在面向产品的思维中也同样重要。但就技能而言,他补充说,生物信息学和数据科学即使不完全相同,也非常相似。尽管在工业中,数据集越大,数据处理就需要越专业、越快速的工具,如 Spark

一锤定音

如果核心技能相似性的论点成立,来自数据科学的人在获得一些特定领域的技能和知识后,应该能够在生物信息学职位上表现。我有第一手资料。我们实验室的前数据科学家、现生物信息学博士生 Jonathan Ronen 在这个新领域做得非常好,将他的技能应用于单细胞基因组学和癌症基因组学的问题。

总而言之,这两个领域所需的技能是相似的,具有我上面描述的技能集的生物信息学家可以在行业中的数据科学角色中表现,前提是他们可以调整自己的心态以适应行业。

生物信息学工作流管理系统

原文:https://towardsdatascience.com/bioinformatics-workflow-management-systems-cc3edd97be79?source=collection_archive---------6-----------------------

介绍 Unipro UGENE 来模拟生物信息学工作流

随着从生物获取数据的各种方法的发展,易于使用的生物数据激增。然而,如果没有适当的方法来执行一系列步骤,按照我们想要的那样处理数据,输出想要的结果,那么如此大量的数据将毫无用处。这就是工作流管理系统派上用场的地方。

在进一步深入之前,让我解释一下今天的大纲。我将带您浏览本文的以下部分。

  1. 什么是工作流?
  2. 什么是工作流管理系统?
  3. 什么是生物信息学工作流管理系统?
  4. Unipro UGENE

Image Source: PublicDomainPictures on pixabay (CC0)

我不会深入讨论如何创建生物信息学工作流,但我会解释工作流管理系统,并向您介绍 Taverna ,一个被生物信息学家广泛使用的工作流管理系统。

什么是工作流?

一个工作流由一组活动组成,这些活动是由转换材料、提供服务或处理信息的资源的系统化组织实现的。它可以被描述为完成一个过程的一系列操作。

Example Workflow (Image Source: YouTube)

什么是工作流管理系统?

一个工作流管理系统 ( WMS )是一个软件,它提供了建立、执行和监控科学工作流的基础设施。

工作流管理系统的出现解决了如何在大量异构数据上执行和自动化复杂流程的问题。他们以工作流程图的形式可视化工作流程,描绘输入、输出、服务和数据流。它们还允许保存用于发布和共享的工作流。

什么是生物信息学工作流管理系统?

生物信息学工作流管理系统是工作流管理系统的一种特殊形式,专门设计用于组成和执行一系列与生物信息学相关的计算或数据操作步骤。

这种系统以有向图的形式显示了计算的抽象表示以及它是如何进行的。图中的每个节点代表一个要执行的任务,每个边代表不同任务之间的数据流或执行依赖关系。该系统提供了一个可视化的前端,允许用户在很少或没有编程专业知识的情况下建立和修改不同的工作流。

一些著名的生物信息学工作流管理系统包括,

Taverna Workbench (Image Source: Apache Taverna)

Galaxy (Image Source: MGEscan)

A simple workflow I drew using Unipro UGENE

Unipro UGENE

UGENE Loading Screen

Unipro UGENE 是一款免费开源的跨平台生物信息学软件。它允许您使用工作流设计器查看、编辑、注释和排列 DNA、RNA 和蛋白质序列,使用 3D 结构和表面算法工作,并模拟工作流。你可以从这里阅读更多关于 UGENE 的细节。

你可以从这里下载 Unipro UGENE。下载安装程序后,请在安装前遵循 readme.txt 中给出的步骤。确保复制下载中提供的示例文件夹,其中包含不同格式的示例文件。

一旦安装并打开应用程序,您将看到如图 1 所示的起始页。(我之前打开过一个文件,你可以在最近的文件下看到。如果你第一次打开 UGENE,你不会在这里看到任何文件。)

Figure 1

使用 UGENE 工作流设计器构建简单的工作流

UGENE 工作流设计器允许创建和运行复杂的计算工作流,即使他或她不熟悉任何编程语言。

我们将从构建一个简单的工作流开始;在一个或多个序列中查找给定的模式,并将其保存为注释。

点击起始页中的创建工作流选项。你会看到如图 2 所示的工作流设计区域。

Figure 2

拖放元素列表中的基本分析部分中的元素,如图 3 所示。

Figure 3

现在将数据读取器部分的读取序列组件添加到元素列表中,如图 4 所示。

Figure 4

点击读取序列组件上的循环标记,将其拖动到查找模式元素上的半循环标记上,如图 5 所示进行连接。

Figure 5

现在类似地,从元素列表中的数据写入器部分添加写入序列组件,并将其连接到查找模式元素。最终的工作流应该如图 6 所示。

Figure 6

现在我们必须定义包含输入序列的文件。为此,点击读取序列组件中的单词取消设置,您将在屏幕右侧的属性编辑器中看到其详细信息。在数据集 1 下,点击添加文件图标。参见图 7。

Figure 7

您将看到示例文件夹已打开。在本例中,我们将在给定的路径中选择以下文件。参见图 8。

samples → Genebank → murine.gb

Figure 8

现在我们必须定义我们想要找到的模式。点击查找模式组件中的单词取消设置,您将在屏幕右侧的属性编辑器中看到其详细信息。在参数下,输入您想要匹配的模式,作为注释为部分下模式的值。参见图 9。我使用了以下模式。

TTCCGAGGGACACTAGGCTGACTCCATC

Figure 9

我们的最后一步是定义输出文件。点击写序列组件中的默认文件,您将在屏幕右侧的属性编辑器中看到其详细信息。在参数下,输入输出文件名为 pattern.gb输出文件的值。将输出文件文件格式更改为 GeneBank 。最终值应该如图 10 所示。

Figure 10

现在,您可以通过点击工具栏中的运行工作流程按钮来运行工作流程,如图 11 所示。

Figure 11

如图 12 和图 13 所示,将会显示一个包含所有工作流执行信息的报告。

Figure 12

Figure 13

可以打开结果文件( pattern.gb )进行查看,如图 14 所示。

Figure 14

您可以使用该工具,查看其他可用的组件,创建工作流并运行它们。

希望你已经对生物信息学工作流管理软件有了一个基本的概念,可以开始实验了。

干杯!😊

使用打字模式的生物认证

原文:https://towardsdatascience.com/biometric-authentication-using-typing-pattern-c5d778e264c4?source=collection_archive---------1-----------------------

我最近构建了一个应用程序,使用应用于击键生物识别的机器学习算法来演示基于打字模式的身份验证。这里有详细流程的 prezi。

早在 2003 年,我就致力于这个确切的想法,作为我本科最后一年项目的一部分。那是神经网络流行的最初几天,当今世界没有多少先进的工具可用。我们炮制了一个基于 C++前端和基于 Matlab 的神经网络(NN)感知器模型与几个隐藏层的解决方案。我们的方法是训练单个神经网络模型来识别多个个体的分型模式。我们能够达到 90%的准确率——好到足以毕业:-)。

使用开源工具进行机器学习

快进 10 年,你会有一些非常强大的开源工具和库来完成捕捉击键生物特征、创建和训练神经网络模型的重任。这个领域本身有了一个全新的名字——机器学习。我目前破解生物认证的方法是基于 Keras 库,Keras 库本身是基于谷歌开源的 TensorFlow 库。前端登录屏幕是基于登录流由马克斯斯托伊伯基于反应样板。它通过 Rx.js 库使用 reactor 模式实现来捕获击键间隔。登录流程也得到了增强,可以利用电子邮件验证。后端是带有 MongoDB 的 NodeJS 服务器,用于存储用户凭证。 ZeroRPC 用于调用为运行 NN 算法而定制的 python 函数。

初速电流状态

这里使用的机器学习算法非常简单。而且,学习是基于在注册过程中提供的单个正样本。在这种约束下,应用程序仍然能够以非常高的准确度预测正确的身份验证。

次状态

我在考虑添加一个应用程序的激励系统,让用户有动力打破对方的认证,这反过来又为训练提供了负面的样本。让我用一个例子来解释这一点:

用户集:U1、U2、U3

用户模型的正面训练样本(Px ):

U1: [P11,P12]

U2: [P21,P22]

U3: [P31,P32]

在激励系统中,U1 被要求破解 U2 的认证。这是完全匿名的,U1 不知道他/她正在破坏谁的认证。这给出了 U2 的负样本(Nx)。

U2: [P21,P22,N23]

那么激励在哪里呢?用户破坏他人身份验证的贡献越大,负面样本收集的身份验证弹出窗口就越多。越多的阴性样本意味着认证过程越准确。经过一段时间后,整个系统的精确度会提高。

今后

有相当多的公司已经在这个领域做了大量的工作。 TypingDNA 提供先进的击键动力学服务,其准确性令人惊讶。然而,他们确实让你开始输入至少 90 个字符。我建议你看看那里的产品,也试试的快速演示。这是对未来的一瞥。

乐观

最后乐观地说,有一天我们都将摆脱记住密码的麻烦,认证将像在纸上签名一样简单。

尝试/反馈/分享/重复

欢迎合作!

欢迎分享!

毕晓普的 PRML 书:回顾和见解,第 4-6 章

原文:https://towardsdatascience.com/bishops-prml-book-review-and-insights-chapters-4-6-eb2a2a33c939?source=collection_archive---------4-----------------------

大家好!在的上一篇文章中,我发表了一份关于 Bishop 的《模式识别和机器学习》一书前三章的简短简历,在这本书里,我将继续写下一章。

对于更注重实践、正在寻找如何提高理论背景的数据科学家,对于那些想要快速总结一些基础知识的人,或者对于刚刚起步的初学者来说,这可能会很有趣。

4.分类的线性模型

在第三章中,我们发现了线性回归的一个推广形式为 f(w,x)= w0+w1 * x1到*w0+w1 фI(x)+…+фn(x),,其中 ф(x) 称为基函数。我想,这里几乎每个人都知道,要应用这个模型进行分类,我们需要把我们的 w_i * x 传递给一个激活函数: y(x) = f(w_i * x)。

首先,我们想知道,如何做 N 类分类,其中 N > 2。例如,在 scikit-learn 中,我们可以选择以“一对一”或“一对一”模式训练二进制分类器,但这些方法存在一些模糊区域,我们不知道如何做出决策,并且构建这些模型需要更多时间:

Ambiguity regions for “one vs one” or “one vs all” approaches

相反,我们有三种主要策略来构建判别函数:

  • 最小二乘法 —直接求解矩阵方程,但对异常值不太好。
  • Fisher 线性判别式 —我们希望找到一种投影,使类别分离最大化,例如,类别均值。使用类间和类内方差和类的均值,我们建立 Fisher 判别式,我们稍后使用它来建立方程,类似于最小二乘法。
  • 感知器——非常类似于逻辑回归,我将在下面描述,或者你可以在这里阅读。

逻辑回归的推导非常简单,通过最大似然法,我们得到了我们最喜欢的二元交叉熵:

cross-entropy loss

对于逻辑回归,还展示了迭代算法,基于 Hessian ( Newton-Raphson )以最小化损失,并针对不同应用进行扩展,其中 softmax 或逻辑函数不适合(如二元变量)——概率单位回归。例如,让我们考虑 2 类问题,其中我们可以有一些给出阈值θ的激活函数,并且我们基于 if w_i * x 高于或低于θ来分配类。主要思想是θ是有噪声的,例如从一些 PDF 中提取的,并且该 PDF 的参数将被估计。

本章继续介绍拉普拉斯近似法,其目的是在一组连续变量上找到 PDF 的高斯近似法。我们主要在贝叶斯推理应用中需要它,在这种情况下使用高斯分布很方便:

visualization of PDF (yellow) and Laplace approximation (red)

本章最后是模型比较和贝叶斯逻辑回归与地图,高斯近似和预测分布。值得一提的是贝叶斯信息准则 (BIC)。有了 {M_i} 模型、 {W_i} 参数和数据 D 对于每个模型,我们可以定义似然 p(D|W_i,M_i) ,并从中定义模型证据 p(D|M_i) 。对于后者我们计算ln(p(D))~ ln(p(D | W _ map))—M * ln(N),其中 M —参数个数, N —数据点个数。正如我们所看到的,BIC 惩罚模型有太多的参数。

5.神经网络

我想读者已经对 NNs 有了很多了解,我将只提到一些有趣的时刻。

首先,这里引入神经网络作为具有基函数的模型,基函数是预先固定的,但是它们必须是自适应的。有趣的是,跳过连接中使用的resnet在本书中有显示:

skip connections in neural networks

这本书的很大一部分致力于反向传播和衍生品。它展示了如何:

  • 用 BP 计算雅可比矩阵
  • 用 BP 及其逆运算计算 Hessian 矩阵(对角线,外积近似)

神经网络的正则化也在这里讨论。首先,弹性正则化项被提出,因为具有正则权值衰减的神经网络是不变的线性变换

我们都知道,例如,对于计算机视觉,我们做了很多数据增强,但通常我们认为这是对初始数据集的放大。使用切线传播也可以更“正确”地完成。主要思想是,我们将这些变换形式化为一些流形 M 上的向量,并且我们对它们的方向导数进行反向传播:

tangent of x on a manifold M

NNs 的另一个很酷的应用是密度近似,其中从数据 {X_i} 我们预测经验分布的均值和方差为高斯混合。

本章以贝叶斯神经网络结束。我们设定目标分布和权重的先验,我们可以用拉普拉斯近似后验分布。

6.核心方法

大多数线性模型可以用等价的“对偶表示”来表示,其中预测是基于在数据点评估的核函数的线性组合来完成的。

对偶表示可以从损失函数中得到。例如,正则化均方损失 J(w) 后,我们通过导数计算最佳参数值,在表达式中,我们将得到类似于 w^t * ф_i(x)的结果。我们可以称之为 a_n,并重新表示最小二乘 J(a) ,因为我们为这个 a 求解,并得到一个具有 Gram 矩阵 K,的解,其中K _ nm =ф_ I(x _ n)ф_ I(x _ m)= K(x _ n,x _ m)——*这是我们的核。

我们可以将核构造为多项式、高斯函数或逻辑函数:

polys, Gaussians and logistic functions as kernels

有很多不同的方法来构建内核:从内核的加法和乘法组合开始,到像 Fisher 内核这样的专用版本,它测量 x 和 x '之间的相似性。

另一个有趣的算法是径向基函数网络。当输入噪声过大时,它适用于插值问题。内核(根据 NNs 的激活函数)与 Nadaraya-Watson 模型中的相同。在这个模型中,我们希望将期望 E(Y|X)建模为某个函数 y(X), Naradaya 和 Watson 建议将 y(X)估计为某个加权平均值,并且核应该起到加权函数的作用。

Nadaraya-Watson estimator

在这一章的最后有一类非常重要的算法,特别是对于时间序列——高斯过程。如果在贝叶斯线性或逻辑回归中我们设置了权重分布的先验,为什么在 f(w,x) = w_0 + w_1x_1* 到 w_0 + w_1 * ф_i(x) + … + ф_n(x) 中我们不能直接定义函数 f 的概率分布?事实上我们可以。高斯过程的优点是它们可以通过期望和协方差函数来定义,后者可以用核来表示,这就是它们与核方法相关的原因。下图是不同的高斯过程,取决于不同的协方差函数。

different Gaussian processes

必须学习协方差函数的超参数。为了将高斯过程应用于分类问题,我们有三种主要策略:

  • 变分推理
  • 期望传播
  • 拉普拉斯近似

附言
关注我还可以在脸书看到太短的人工智能文章,在 Instagram 看到个人资料,在 Linkedin

你不需要多样化的加密投资组合来分散风险:原因如下

原文:https://towardsdatascience.com/bitcoin-dominance-5a95f0f3319e?source=collection_archive---------3-----------------------

区块链系列的未来

除了少数异常情况,顶级加密货币与比特币的相关性非常密切;因此,在我看来,分散投资组合以分散风险的想法真的只是一个神话。本文考察了加密货币价格之间的相关性,以解释我的推理。

有很多关于加密货币的错误信息、谣言和不正确的信息。事实上,我认为加密货币市场最具误导性的标签之一是比特币统治地位的这种想法,这种想法表现为比特币对加密货币整个市值的百分比所有权。你可以在 CoinMarketCap 等合法网站上找到它,虽然这是一个公平的想法,但我认为它的标签对加密货币市场的运作产生了误解。简单来说,比特币统治地位的计算方法是:

2018 年 9 月 23 日,CoinMarketCap 报告称,比特币的统治地位为 51.3%,因为其总市值为 1157 亿美元,而总市值为 2255 亿美元。115.7/225.5 = 0.513,即 51.3%。

但是这个数字与事实相去甚远。比特币的实际主导地位延伸到整个市场的更深处——任何加密货币交易员都可以通过观察比特币历史性地创造或破坏他们的整个投资组合来证实这一点。

Really strong positive correlation between Bitcoin and three major cryptocurrencies; Data Source: www.coingecko.com

我做了一些相关性比较,看看 BTC 到底需要多少时间。莱特币、以太坊和 Ripple 在 2016 年至 2018 年期间都显示出与比特币价格具有极强相关性的迹象。

通常当比较两个项目之间的相关性时,0.7 到 1.0 之间的任何数字都表示强正相关;换句话说,在这两个数字之间,很有可能你和这两个数字之间有很强的关系。有了正的、强有力的关系(我们称之为正相关),当一个项目的数字上升时,另一个项目也上升,反之亦然。

话虽如此,2016 年至 2018 年间,比特币的价格相关性莱特币为 0.954,以太坊为 0.916,Ripple 为 0.836。莱特币和以太币都是比特币基地的可交易加密货币,这可以说是目前存在的最大的法定到加密直接交易所,这可以解释与比特币价格的强相关性——每个人都在同一时间兑现和兑现。

Data Source: www.coingecko.com

Ripple 是替代硬币的一个有趣的代表性案例,它存在于直接的法定货币到加密货币的交换领域之外,因为它只能在历史上不接受法定货币的交换中找到。这意味着用户必须经历额外的一步,将比特币从比特币基地等地转移到 T4 币安 T5 等交易所。

从纯粹的心理学角度来看,这一额外的步骤可能表明实际购买 Ripple 的愿望比其他两个步骤强烈得多。例如,在比特币基地,你可能会想,“当然,我也会把一些放入以太坊和莱特币,为什么不呢?”但是因为 Ripple 不在比特币基地,你不会买它的任何一个——除非你真的想买。然后你必须学会如何将你的资金从比特币基地转移到一个交易 Ripple 的交易所。

然而,即使有一个可以说更加坚定和坚定的投资者群体,2016 年至 2018 年期间,Ripple 与比特币价格的相关性仍为 0.836。

怀疑论者可能会说,比特币对其他硬币价格的影响以前比现在强得多,但回到 2016 年,我不公平地权衡了不相关的历史数据,以传播对替代硬币的恐惧、不确定性和怀疑(FUD——加密巨魔最喜欢的首字母缩写)。

但首先,我不是来拉屎的。我自己也有很多,我有波纹。我在这里只是为了让你在现实中扎根——当然,硬币可能在某个时候“月亮”,但除了那些异常事件,它们的价格将直接受到比特币的影响。

第二,也是更重要的一点,如今比特币对其他硬币价格的影响力比几年前更大了。在下面的图表中,我创建了当今市场上一些顶级硬币之间的关联矩阵:比特币、以太坊、Ripple、Stellar、莱特币、Monero 和 Dash。

2016 年,各货币之间的价格相关性非常松散。事实上,如果我没记错的话,除了通过这个名为 Gatehub 的粗略网站,你甚至不能购买 Ripple。我认为你必须使用菲亚特购买,但因为这对美国公民来说是一个问题,我不认为我的帐户被验证过。细节有点模糊,有点跑题,但关键是,在 2016 年,altcoin 价格与比特币的关联非常松散。只有莱特币、Monero 和 Dash 真正表现出与比特币的适度相关性。按照股价标准,有人可能会说它仍然具有很强的相关性,但与最近几年相比,0.6-0.7 看起来相当不错。

牛市

2017 年标志着最近一轮加密货币牛市的开始,几乎把每一个替代硬币都变成了一个以比特币为中心巨星的星球。请注意,相关性急剧上升,只有 Ripple 对比特币定价表现出一些抵制。

Data Source: www.coingecko.com

接近 2017 年底时,Ripple 通过提供自己的泵,对比特币的价格泵做出了非常戏剧性的反应。Ripple 拥有一家企业实体,与全球许多金融机构建立了强大的合作伙伴关系,该公司在那一年对比特币价格变化表现出了最强烈的抵制。

它的竞争对手 Stellar(具有讽刺意味的是,由 Ripple 的前创始人兼首席技术官创建)也表现出了抵触情绪——这两种货币之间的相关性为 0.9,这似乎表明了两种货币之间的普遍情绪——例如,当投资者对 Ripple 有信心时,投资者可能也会对 Stellar 有信心。

市场崩溃

2018 年,随着围绕加密货币的积极市场情绪减弱,价格趋势发生了转变。比特币价格从 17000 美元跌至今天的 6600 美元左右,整个加密货币市场都可以感受到这一崩溃的影响。在此期间,加密货币价格之间的相关性甚至很强,比特币价格下跌的重量将所有东西都拉了下来。

2018 年期间(1 月至 9 月),与比特币价格的相关性从未低于 0.85。有趣的是,莱特币和以太币在 2017 年牛市期间表现出与比特币价格更强的相关性,但在整个崩盘期间与 BTC 的相关性最弱。这是否也与它们都可以通过比特币基地获得的事实有关,或者如果你认为这是其他原因,请在本文的评论部分详细阐述。

极端值

然而,在 2018 年的崩盘中,尽管大多数主要加密货币(即前 15 名)都表现出与比特币价格非常强的相关性(> 0.70),但 EOS 对这一趋势表现出了非常强的抵抗力。

2017 年,当 EOS 首次推出时,它表现出与比特币价格的正相关关系。其为期一年的 ICO 于 2017 年 6 月开始,于 2018 年 6 月结束,随着其主网的推出而达到高潮。尽管作为一种加密货币,它具有争议性,但无可争议的是,这种硬币已经获得了强大的追随者,其 ICO 产生了超过 40 亿美元的收入。

2018 年,EOS 是少数几个成功保持高于 1 月份价格的硬币之一。如果我必须将这种模式归因于一个原因,我的大胆猜测是,这至少部分归因于几次比特币牛市和 EOS ICO 长达一年的性质。

随着 2017 年比特币的每一轮牛市,随着时间的推移,EOS 都有一个更大的牛市。2018 年 4 月,随着 ICO 日期接近尾声,EOS 主网准备推出,再次出现了与比特币价格无关的大幅飙升。

虽然批评者可能会认为这是一种个人崇拜,价格可以归因于公众对其领导人的认可(丹·拉里默),但考虑到以太坊和比特币现金等其他加密货币都有领导人物(分别是维塔利克·布特林和罗杰·韦尔),个人崇拜的情况将非常难以辩驳。如果你研究以太坊和比特币现金的相关性,你会发现两者都与比特币价格有很强的相关性。所以,如果你真的相信个人崇拜的论点,那么你也必须相信,出于某种原因,丹·拉里默比其他人有一个强大的崇拜者。

那么这一切意味着什么呢?

数据很有趣,但正如许多人警告的那样,它实际上只是过去模式的一个指标。尤其是在这个动荡的市场中,没有人能保证这些相关性模式会持续一年,一个月,甚至一天。

然而,一些有趣的观点是,在我看来,分散风险的多样化加密货币投资组合的想法是一个神话。你当然可以出于兴趣和试图最大化上行空间等原因进行多元化,但正如相关性模式所显示的那样,持有其他硬币的风险并没有减少,尤其是因为比特币拖累了一切。虽然我没有量化这种说法的价值,但从目测和个人经验来看,我观察到,比特币的价格下跌通常会导致替代比特币更大幅度的下跌。

由于与比特币价格的相关性如此之强,任何不积极投资或日间交易加密货币的人都可以通过多元化投资组合获得相当不错的回报,特别是多元化的 1B+市值硬币。虽然我们已经看到了 EOS 的异常情况,因为主网现在已经关闭,区块链必须兑现承诺,但如果宣传与现实不符,它可能很快就会成为另一种与比特币挂钩的加密货币。

我从哪里得到我的数据?

不,我没有付钱给 CoinMarketCap 来访问所有这些定价数据。我收集了 2016 年至 2018 年的数据,并使用了 CoinGecko API ,它是免费的,包含了同样多的高质量数据——远远超过了我进行这一分析所需的数据。

使用 LSTM 预测比特币价格

原文:https://towardsdatascience.com/bitcoin-price-prediction-using-lstm-9eb0938c22bd?source=collection_archive---------2-----------------------

2017 年 11 月围绕比特币的激烈讨论吸引了我的注意力,我决定深入了解这到底是什么。我阅读了一堆论文,几本书和许多关于这个话题的观点,以便对它在当前市场中的价值有一个像样的了解。

你可能听说过比特币,但如果你想完全承认它的存在,我推荐阅读安德烈亚斯的书——《货币的互联网

当然,最吸引绝大多数人的是这种资产的价格波动。比特币价格在短时间内大幅上涨/下跌是一个有趣的现象,根本无法预测。然而,我认为在这个价格上看到任何强大的机器学习模型的效果都会很好。

所以我选择了一个递归神经网络和一组比特币价格来预测这种金色加密货币的未来。

从 01/02/2009 到今天,我每天都使用比特币的收盘价以及这个奇妙的 Kaggle 内核的一点帮助。

#1.开始实施

让我们首先定义我们的库:

我们将使用keras来训练模型。

Keras 是一个高级神经网络 API,用 Python 编写,能够在 TensorFlowCNTKTheano 之上运行。

我们还声明了numpy(矩阵操作)panda(定义数据结构)matplotlib(可视化)和sklearn(标准化我们的数据)

#2.准备数据

我们的下一步将是准备数据。这包括从第三方来源获取、清理并分成培训和测试。

这里的是访问一个的绝佳链接。带价格的 csv 文件。

  • 加载数据并删除未使用的字段(在本例中为“日期”)

我们使用pandas来读取。csv 文件并删除无用的列。

  • 分为培训和测试

这里所做的决定只是为了本教程的目的。在真实的项目中,你应该总是将你的数据分成训练、验证、测试(通常是 80%、20%、20%)。我们已经将培训设置为 30 天,这意味着我们将在最后一个月测试我们的模型。

  • 正常化并准备培训

我们使用fit_transform来确定数据的中心,使其具有 0 个平均值和 1 个标准误差。我推荐阅读这篇 Stackoverflow 回答来澄清。然后,我们将数据分为x_trainy_train。本质上,这是因为我们使用了递归神经网络。我们的模型将从x_train获取第 0 个元素,并尝试从y_train(即x_train的第一个元素)预测第 0 个元素。这样我们就创建了一个序列——这正是 rnn 训练所需要的。如果你需要更多关于这些奇妙网络如何工作的信息,你可能会发现我的一篇文章很有用。

最后,我们重塑x_train数据,以匹配使用keras进行训练的需求(见下文)。

#3.火车模型

现在我们需要使用上述数据来训练我们的模型。有了keras,这个过程就变得极其容易理解。你不需要知道任何运算背后的数学原理就能产生像样的结果。不过,如果你有兴趣钻研方程和算法,你可以在这里 (LSTM 网)找到更多信息,在这里 (GRU 网)找到

我们正在构建如下模型:

  • 第 1 行:用于 LSTM 单元的单位数(输出态的维数)。
  • 第 2 行:用于 LSTM 电池的激活功能(在我们的例子中为s 形)。
  • 第 3 行:用于最小化损失函数的优化器(在我们的例子中是亚当)。
  • 第 4 行:在调整网络的权重和偏差时我们需要最小化的损失函数(在我们的例子中是均方误差)。
  • 第 5 行:神经网络通常是分批训练的,这意味着在每次迭代中,我们从训练集中挑选 5 个例子,并使用它们进行训练。
  • 第 6 行:历元的数量决定了我们需要进行多少次迭代。

在解释了每个超参数的含义后,我们开始训练模型:

  • 第 9 行:定义堆叠所有层(输入、隐藏和输出)的顺序模型
  • 第 12 行:将 LSTM 单元添加到我们的模型中。这里很好地解释了它在 Keras 中是如何工作的。
  • 第 15 行:添加输出层——是一个简单的密集,具有默认的线性激活函数和维度 1。
  • 第 18 行:这是实际训练前的最后一步。我们需要设置上面指定的优化器和损失函数。
  • 第 21 行:使用输入x_train和标签y_train训练模型。

#4.预测价格

我们终于到了期待已久的预测价格的时刻。我们有 2 个步骤:预测价格,并绘制价格图,与真实结果进行比较。

  • 预测下个月的价格

正如你已经看到的,Keras 让一切变得如此简单。这里的情况是一样的:

第 1–6 行:我们做的和训练集完全一样。使用min_max_transform来缩放数据,然后为预测重塑数据。

第 7 行:预测。

第 8 行:重新调整预测数据以匹配其真实值(美元价格)

  • 可视化结果

最后,我们将使用下面的代码片段绘制测试价格和预测价格:

结果碰巧真的很有趣。当然,预测的准确性并不出色,但仍然很酷:

更多 AI 内容,在 LinkedIn 关注我

感谢您的阅读。如果你喜欢这篇文章,给它一些掌声👏。希望你有一个伟大的一天!

使用时间序列预测的比特币价格预测

原文:https://towardsdatascience.com/bitcoin-price-prediction-using-time-series-forecasting-9f468f7174d3?source=collection_archive---------3-----------------------

这篇文章是关于使用时间序列预测来预测比特币价格的。时间序列预测与其他机器学习模型非常不同,因为-

1.它依赖于时间。因此,线性回归模型的基本假设,即观察值是独立的,在这种情况下不成立。

2.除了增加或减少的趋势,大多数时间序列都有某种形式的季节性趋势,即特定时间范围内的变化。

因此,简单的机器学习模型无法使用,因此时间序列预测是一个不同的研究领域。本文采用 AR(自回归模型)、MA(移动平均模型)和 ARIMA(自回归综合移动平均模型)等时间序列模型对比特币价格进行预测。

该数据集包含 2013 年 4 月至 2017 年 8 月比特币的开盘价和收盘价

导入必要的库

**import** **pandas** **as** **kunfu**
**import** **numpy** **as** **dragon**
**import** **pylab** **as** **p**
**import** **matplotlib.pyplot** **as** **plot**
**from** **collections** **import** Counter
**import** **re**

*#importing packages for the prediction of time-series data*
**import** **statsmodels.api** **as** **sm**
**import** **statsmodels.tsa.api** **as** **smt**
**import** **statsmodels.formula.api** **as** **smf**

**from** **sklearn.metrics** **import** mean_squared_error 

数据从 csv 文件加载到列车数据帧中。这是我们数据的前五行看起来的样子。

绘制时间序列

以日期为索引,x 轴为日期,y 轴为收盘价。

data = train['Close']
Date1 = train['Date']
train1 = train[['Date','Close']]
*# Setting the Date as Index*
train2 = train1.set_index('Date')
train2.sort_index(inplace=**True**)
print (type(train2))
print (train2.head())
plot.plot(train2)
plot.xlabel('Date', fontsize=12)
plot.ylabel('Price in USD', fontsize=12)
plot.title("Closing price distribution of bitcoin", fontsize=15)
plot.show()

测试平稳性

增强迪基富勒测验:

扩展的 Dicky Fuller 检验是一种称为单位根检验的统计检验。

单位根检验背后的直觉是,它决定了趋势对时间序列的定义有多强。

单位根检验有许多种,ADF 是应用最广泛的一种

1。 零假设(H0): 检验的零假设是时间序列可以用一个非平稳的单位根来表示。

2.备选假设(H1): 检验的备选假设是时间序列是平稳的。

p 值的解释

1。 p 值 > 0.05: 接受零假设(H0),数据有单位根,非平稳。

2。 p 值 < = 0.05: 拒绝零假设(H0),数据是平稳的。

**from** **statsmodels.tsa.stattools** **import** adfuller

**def** test_stationarity(x):

    *#Determing rolling statistics*
    rolmean = x.rolling(window=22,center=**False**).mean()

    rolstd = x.rolling(window=12,center=**False**).std()

    *#Plot rolling statistics:*
    orig = plot.plot(x, color='blue',label='Original')
    mean = plot.plot(rolmean, color='red', label='Rolling Mean')
    std = plot.plot(rolstd, color='black', label = 'Rolling Std')
    plot.legend(loc='best')
    plot.title('Rolling Mean & Standard Deviation')
    plot.show(block=**False**)

    *#Perform Dickey Fuller test* 
    result=adfuller(x)
    print('ADF Stastistic: **%f**'%result[0])
    print('p-value: **%f**'%result[1])
    pvalue=result[1]
    **for** key,value **in** result[4].items():
         **if** result[0]>value:
            print("The graph is non stationery")
            **break**
         **else**:
            print("The graph is stationery")
            **break**;
    print('Critical values:')
    **for** key,value **in** result[4].items():
        print('**\t%s**: **%.3f** ' % (key, value))

ts = train2['Close']      
test_stationarity(ts) 

由于 p 值大于 0.05,时间序列是非平稳的。到目前为止,我们测试了这个系列,它不是稳定的。因此,这里需要做一些工作。所以现在我们用变换使级数平稳。

测井转换系列

日志转换用于对高度扭曲的数据进行去扭曲。从而有助于预测过程。

ts_log = dragon.log(ts)
plot.plot(ts_log,color="green")
plot.show()

test_stationarity(ts_log)

由于 p 值仍然大于 0.05,所以序列仍然是非平稳的,所以我们需要做进一步的变换。让我们继续做差分。

通过差异消除趋势和季节性

在差分以使时间序列稳定的情况下,当前值与先前值相减。由于这一点,平均值是稳定的,因此时间序列的平稳性的机会增加。

ts_log_diff = ts_log - ts_log.shift()
plot.plot(ts_log_diff)
plot.show()

ts_log_diff.dropna(inplace=**True**)
test_stationarity(ts_log_diff)

由于我们的时间序列现在是平稳的,因为我们的 p 值小于 0.05,因此我们可以应用时间序列预测模型。

自回归模型

自回归模型是一种时间序列预测模型,其中当前值依赖于过去值。

*# follow lag*
model = ARIMA(ts_log, order=(1,1,0))  
results_ARIMA = model.fit(disp=-1)  
plot.plot(ts_log_diff)
plot.plot(results_ARIMA.fittedvalues, color='red')
plot.title('RSS: **%.7f**'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))
plot.show()

移动平均模型

在移动平均模型中,序列依赖于过去的误差项。

*# follow error*
model = ARIMA(ts_log, order=(0,1,1))  
results_MA = model.fit(disp=-1)  
plot.plot(ts_log_diff)
plot.plot(results_MA.fittedvalues, color='red')
plot.title('RSS: **%.7f**'% sum((results_MA.fittedvalues-ts_log_diff)**2))
plot.show() 

自回归综合移动平均模型

它是 AR 和 MA 模型的结合。它通过差分过程使时间序列本身平稳。因此,对于 ARIMA 模型,不需要明确地进行差分

**from** **statsmodels.tsa.arima_model** **import** ARIMA
model = ARIMA(ts_log, order=(2,1,0))  
results_ARIMA = model.fit(disp=-1)  
plot.plot(ts_log_diff)
plot.plot(results_ARIMA.fittedvalues, color='red')
plot.title('RSS: **%.7f**'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))
plot.show()

因此,我们看到,RSS(残差平方和)误差是最小的 ARIMA 模型。因此,ARIMA 模型是三个模型中最好的,因为它利用了对滞后值和误差项的依赖性。因此,它进一步用于计算均方差。在下面的代码片段中,数据集分为训练和测试。

对于测试中的每个值,我们应用 ARIMA 模型,然后计算误差,然后在迭代测试集中的所有值后,计算预测值和期望值之间的平均误差。

size = int(len(ts_log)-100)# Divide into train and test
train_arima, test_arima = ts_log[0:size], ts_log[size:len(ts_log)]history = [x **for** x **in** train_arima]predictions = list()
originals = list()
error_list = list()

print('Printing Predicted vs Expected Values...')
print('**\n**')# We go over each value in the test set and then apply ARIMA model and calculate the predicted value. We have the expected value in the test set therefore we calculate the error between predicted and expected value **for** t **in** range(len(test_arima)):
    model = ARIMA(history, order=(2, 1, 0))
    model_fit = model.fit(disp=-1)

    output = model_fit.forecast()

    pred_value = output[0]

    original_value = test_arima[t]
    history.append(original_value)

    pred_value = dragon.exp(pred_value)

    original_value = dragon.exp(original_value)

    # Calculating the error
    error = ((abs(pred_value - original_value)) / original_value) * 100
    error_list.append(error)
    print('predicted = **%f**,   expected = **%f**,   error = **%f** ' % (pred_value, original_value, error), '%')

    predictions.append(float(pred_value))
    originals.append(float(original_value))

# After iterating over whole test set the overall mean error is calculated.   
print('**\n** Mean Error in Predicting Test Case Articles : **%f** ' % (sum(error_list)/float(len(error_list))), '%')plot.figure(figsize=(8, 6))
test_day = [t
           **for** t **in** range(len(test_arima))]
labels={'Orginal','Predicted'}
plot.plot(test_day, predictions, color= 'green')
plot.plot(test_day, originals, color = 'orange')
plot.title('Expected Vs Predicted Views Forecasting')
plot.xlabel('Day')
plot.ylabel('Closing Price')
plot.legend(labels)
plot.show()

预测= 2513.745189,预期= 2564.060000,误差= 1.962310 %
预测= 2566.007269,预期= 2601.640000,误差= 1.369626 %
预测= 2604.348629,预期= 2601.990000,误差= 0.090647 %
预期= 2372.560000,误差= 6.258791 %
预测= 2379.066829,预期= 2337.790000,误差= 1.765635 %
预测= 2348.468544,预期= 2398.840000,误差= 2.099826 %
预测= 2405.2999999 误差= 12.841677 %
预测= 2238.150016,预期= 2318.880000,误差= 3.481421 %
预测= 2307.325788,预期= 2273.430000,误差= 1.490954 %
预测= 2272.890197,预期= 2817.60000 误差= 0.899246 %
预测= 2763.766195,预期= 2576.480000,误差= 7.269072 %
预测= 2580.946838,预期= 2529.450000,误差= 2.035891 %
预测= 2541.493507,预期= 2671.7800000

预测测试用例文章的平均误差:3.593133 %

因此,原始时间序列和预测时间序列的平均误差为 3.59%。因此,我们能够使用不同的转换和模型来预测比特币的收盘价。

如果你读到最后,谢谢你。这是我关于数据科学的第一篇文章,以后还会有更多文章。如果您发现任何错误或有任何建议,请做评论。如果你喜欢这个帖子,请不要忘记鼓掌!谢谢你。

比特币:数学原理是什么?

原文:https://towardsdatascience.com/bitcoin-whats-the-math-ebbae3be37a3?source=collection_archive---------5-----------------------

Bitcoin- will it replace fiat currency? How does the math work? And where can I get one of those physical coins?

大约 6 个月前,我偶然发现了比特币,这要感谢一位朋友,她自己开了一家使用区块链技术的公司。我以前听说过比特币——我的大致想法是“比特币是我哥哥在我高中时用来挖矿的虚拟货币。”像大多数人一样,除此之外我不知道太多。

真正引发我兴趣的是我意识到比特币和其他数字货币是密码学的一个伟大应用(因此得名“加密货币”),这是一个我一直非常着迷的领域。对我来说,密码学是在现实世界中使用数学的完美方式。意识到这一点后,我决定研究比特币背后的数学原理。

尽管我读了无数的文章,包括最初的中本聪白皮书,我仍然努力寻找一个资源来回答这个基本问题:数学是什么?我能找到的最好的文章是讨论椭圆曲线加密和用于比特币的特定参数的文章。这并没有让我满意。

按照朋友的建议,我拿到了一本安德里亚斯·安东诺普洛斯的《 《掌握比特币:编程开放区块链 》。这本书对我来说真的把所有的东西都集合在一起了。我强烈推荐!

我希望这篇博文能从数学的角度帮助你理解比特币协议和比特币区块链。我首先假设你熟悉比特币,其次假设你有数学知识。对于那些不太熟悉的人,我会在下面留下解释数学主题的链接。

区块链与挖掘 : SHA256,Merkle Trees

人们普遍认为采矿的目的是发行新的货币。实际上,挖掘就是对交易进行验证的过程。采矿允许对区块链的状态进行分散的全网络共识,这就是这项技术如此特殊的原因。发行新货币是诱因。

尽管货币发行是动机而不是目标,我们将从采矿和“创造”新 BTC(或 XBT)开始我们的讨论。从这里,我们将看看这种货币是如何“花费”的,以及其中涉及的数学。

假设爱丽丝有一个挖掘节点,它实际上只是一个计算机程序。挖掘器的目标是构造一个新的块,并解决一个计算量很大的密码难题,使得这个新的块可以被网络接受,并被合并到区块链中。在解决这个密码难题后,爱丽丝的矿工将“获胜”并获得一笔支付(截至本文撰写时,目前为 12.5 BTC),支付到她的比特币地址。Alice 还将收取新开采区块中所有交易的费用。

Alice 采矿的第一步是验证区块链的最新区块。让我们把这个最近的块称为 A。在验证了 A 中的事务后,Alice 的挖掘程序将为链中潜在的下一个块构造一个标题。我们称这个块为 b,新块的头有 6 个字段:版本、前一块哈希Merkle 根、时间戳、目标。这里有大量斜体的数学内容需要解开。

前一个块哈希:double-SHA256

如果 Alice 的 miner 想要查找区块链中的任何区块,有两种方法可以实现。第一种方法是参考块的高度。第二种方法是计算块 ID,其中块 ID = double-SHA256(块头)。块 ID 也是先前的块散列。例如,假设 A 的块 ID 是 A' = double-SHA256(blockIDA)。然后,对于扩展区块链的块 B,其字段“先前块散列”被设置为等于 A’。这将块链从块 A 扩展到块 B,块 B 是子块,而块 A 是父块。这也是爱丽丝的矿工如何使用其采矿权力来“投票”区块 A 作为链中最近的区块。

Merkle root:一个概念本身,和 double-SHA256

Merkle 根是 Merkle 树中的最终散列。简而言之,Merkle 树是一棵二叉树,其中每个父节点都是其子节点的散列。这是在比特币中通过递归计算 double-SHA256 对节点构建的,直到树中只有一个哈希,这就是 Merkle 根。以比特币为例,每个子代都包含交易信息,因此 Merkle 根在一个块中汇总所有交易。

A simple figure of creating a Merkle Root. The hash function H is double-SHA256, with the transactions (T) as the inputs. Thanks Paint for helping me make this beautiful figure!

目标和随机数

目标是所有挖掘节点共享的 256 位数字。挖掘的目标是找到一个 nonce(一个从 0 开始的一次性使用数),使得头和 nonce 的散列(SHA256)一起小于或等于目标。目标每 2016 块更新一次。

继续我们的示例,Alice 的 miner 想要包括区块链中的新区块 B。目标是找到一个随机数,使得:

sha 256(B+nonce 的报头)< = target。

找到这个 nonce 的计算量非常大,但是由于这个 hash 函数的性质,很容易验证。找到这个随机数就证明了一个矿工完成了要求的工作量,也就是“工作量证明”一旦发现 nonce,Alice 的 miner 就会将 B 的信息传播到整个比特币网络。一旦足够多的矿工验证了包括在 B 中的交易是真实的,那么 B 是链中的下一个块,并且爱丽丝将把她的 12.5 BTC 的支付加上交易费收集到她的钱包中。网络中的所有矿工,包括 Alice 的矿工,然后将构造新的块 C,其中先前的块散列字段引用 b 的 ID。

关于工作证明的一个注意事项:重要的是密码难题(即找到一个小于目标值的散列值)必须是计算开销很大的。如果不是,那么一个拥有相当于 51%网络计算能力的不诚实的人可以重写交易以支付到他们自己的钱包,然后将这个块包括在链中。(然而,随着这一开支的增长,它就成了问题,这是另一篇文章的主题。有新的协议试图解决这个问题!)

现在我们在爱丽丝的钱包里有 12.5 BTC。接下来我们将看看她是如何花费的,这里涉及到数学。

总结这一部分,数学是:

  • Double-SHA256(块头)创建块 A 的 ID,它将位于新块 B 的前一个块哈希字段中,其中 B 是 A 的子块。
  • Merkle 树并递归地执行 double-SHA256 来创建汇总块中所有事务的 Merkle 根。
  • 块头和 nonce 的 SHA256,以执行验证块中所有事务所需的工作证明,并找到小于或等于目标的散列。一旦发现该随机数,该块将被包括在区块链中。

交易和钱包 : ECDSA,RIPEMD160,SHA256

比特币使用公钥加密技术进行交易,特别是基于离散对数问题的椭圆曲线数字签名算法(ECDSA)。

钱包:像钥匙扣

比特币钱包并不包含真正的比特币。相反,它包含指向公共分类账(区块链)上的交易输出的键。只有拥有相应私钥的人才能“消费”与接收者钱包地址相关的比特币。

交易:认证

让我们继续我们的例子。假设爱丽丝想给她的朋友鲍勃发送 1 BTC。Alice 将使用她的钱包构建一个交易,将这 1 个 BTC 发送到 Bob 的公共钱包地址。这个交易就是信息。Alice 将使用她的签名(r,s)对消息进行签名,以提供真实性,并且这将被传播到网络。任何对等体都可以通过使用 Alice 的公钥来验证她的身份,该公钥与她的钱包地址相关联。换句话说,该过程如下:

设 D =爱丽丝的私钥,E =爱丽丝的公钥,M =事务。
1。Alice 的 wallet 构造了 M,它向 Bob 的公共地址发送了 1 个 BTC。
2。爱丽丝用符号 M 表示出 M' = D(M)。
3。任何对等体都可以通过执行 E(M') = M 来验证 Alice 的真实性。

现在鲍勃怎么花掉爱丽丝给的这 1 个比特币呢?当 Alice 构造 M 时,她实际上是在构造一条消息,该消息说“我将把 1 BTC 给拥有对应于这个公共地址(在本例中是 Bob 的地址)的私钥的任何人。”为了让 Bob 花掉这笔钱,他的钱包将构建一个新的交易,他将用他的签名(r’,s’)来签名,该签名是从只有他有权访问的私钥(根据椭圆曲线加密)中导出的,并且该过程继续。

比特币所做的是使用 ECDSA 来授予发送者真实性,这种认证是“花费”比特币所需要的。比特币交易不需要加密,因为每笔交易都传播到网络,并指定接收者的公共地址,这是匿名的。

创建比特币地址

按照椭圆曲线加密法,公钥是从私钥生成的,而比特币地址是从这个公钥创建的。

私钥 k 在[1,n-1]的范围内,其中 n 是椭圆曲线的阶。比特币协议中使用的特定椭圆曲线是 secp256k1,它指定了椭圆曲线的系数以及生成器 g。创建比特币地址的步骤如下:

1.私钥 k 是随机生成的。
2。公钥 K = k * G,其中 G 是生成器。
3。钱包地址 A = RIPEMD160(SHA256(K))。
4。地址 A 是 Base58Check 编码的,以产生' =前缀|| A ||校验和,这是最终的钱包地址(“||”表示串联)。

Base58Check 是 Base58 和校验和的组合,Base58 是一组字符{大写,小写,数字} \ {0,O,I,l}。特定校验和是 double-SHA256 输出的前 4 个字节(前缀+ A),在这种情况下前缀为 0。最终的 Base58Check 编码地址 A' =前缀|| A ||校验和。

The elliptic curve with the parameters of secp256k1, over the real numbers. Yay math!

总之,这部分的数学公式是:

  • ECDSA 来“花”比特币,签名为(r,s)。
  • 椭圆曲线加密从私钥 K 生成公钥 K。
  • RIPEMD160 和 SHA256 一起被称为 HASH160,并使用 Base58Check 编码从公钥 k 中产生一个比特币钱包地址。

结论

当我第一次开始钻研比特币的数学时,我只知道它在某些方面使用了椭圆曲线加密。我不知道如何使用 ECC 是在交易中,发行货币,还是什么?最后,我清楚地了解了数学是如何被用来让比特币和区块链成为如此强大的颠覆性技术的。

Math 用于验证交易(挖掘)、进行交易,以及创建向其发送交易的钱包地址。双 SHA256 用于识别区块并将交易汇总到 Merkle 根中,单 SHA256 用于证明采矿期间的工作。ECDSA 用于“签署”交易。RIPEMD160 和 SHA256 与 Base58Check 编码一起用于创建钱包地址。现在一切都说得通了!

资源

对于那些想了解更多细节的人,无论是第一次,还是只想回忆一下:

维基百科和比特币维基:

公钥密码学:【https://en.wikipedia.org/wiki/Public-key_cryptography
椭圆曲线密码学:https://en.wikipedia.org/wiki/Elliptic-curve_cryptography
椭圆曲线数字签名算法:https://en . Wikipedia . org/wiki/Elliptic _ Curve _ Digital _ Signature _ Algorithm(在我看来比 bitcoinwiki 页面好多了)
secp 256k 1:https://en.bitcoin.it/wiki/Secp256k1 sha 256:https://en.wikipedia.org/wiki/SHA-2
ripe md160:https://en.wikipedia.org/wiki/RIPEMD

书籍:

威廉·斯塔林斯的《密码学与网络安全》:一本非常棒的密码学书籍。我把它推荐给任何有兴趣钻研数学的人。它甚至提供了数论的介绍,所以如果你是第一次学习这类东西,这是很棒的。
安德烈亚斯·安东诺普洛斯《掌握比特币》:必读!

最初发表在我的个人网站上,Serena . MC donnell . ca .

小型数据科学

原文:https://towardsdatascience.com/bite-sized-data-science-4d9e398c4763?source=collection_archive---------11-----------------------

第 2 集:标记化和 GridSearchCV

在上周的节目中,我们开始跟踪韦斯利·查维斯,因为他开始了他与 Postmates 的高级数据科学家、前 D-Waver 的柳文欢·什克拉斯基为期 8 周的师徒关系。

本周,我们将了解 Wesley 的进展如何,以及他在迄今为止的项目中掌握了哪些生产级数据科学技巧。

零零碎碎还是厄运黑盒?

原文:https://towardsdatascience.com/bits-and-bolts-or-black-boxes-of-doom-1ac1757a8d3a?source=collection_archive---------8-----------------------

当我写这篇文章的时候,我想起了我刚刚读过的一篇文章以及几周前的一次对话。

这是关于人工智能机器决定不公开它们的信息处理过程。想象一下擎天柱突然转向犯罪生活。这张照片展示了我想象中的样子。

让机器变得智能的过程是通过机器学习来完成的,特别是通过使用深度神经网络。对于那些没有被机器学习和神经网络的文章轰炸过的人,我将给出一个非常概括的机器学习方法的描述,监督学习。

在监督学习中,输入和输出由程序员或人类用户设置,然后机器基本上必须从一端到达另一端。这种从输入到输出的“获取”是通过神经网络来完成的。这些网络是以类似于人脑的原理或功能为模型的。每个人工神经元接受大量输入,然后根据每个输入的权重激活神经元。这些输入实际上是 1 和 0,1 表示神经元被激活,0 表示神经元不被激活。

激活神经元的权重由数学函数分配,这些函数基于达到的特定阈值来激活神经元。一旦达到阈值,神经元就会被激活。然后,激活沿着网络从一个神经元传播到另一个神经元(在更大的意义上,激活从一个神经层传播到另一个神经层)。

该图说明了人工神经网络中基于函数的权重分布。输入 x 被转换成一个三维向量 h,然后再被转换成一个二维向量 g,最后再被转换成 f。[1]

网络中的每一层都有自己要完成的特定任务。假设机器学习系统的输入是一张脸,输出是文本“脸”,这将表明系统对输入的理解。每个神经层的任务是识别线条、曲线、形状(眼睛或鼻子的曲线)、形态(鼻子、眼睛)、整体(有眼睛、鼻子、嘴巴、耳朵、头发的脸),然后使系统到达神经网络的末端,然后发送输出文本“脸”。

An illustration of what a deep network looks like.

如果没有达到输出,意味着有一个错误,然后一个叫做反向传播的方法发生,系统从输出开始一层一层的向后遍历。随着时间的推移,它会调整每一层的输入权重,直到错误点被纠正,并达到正确的输出。

这是一个相当概括的描述,但是我希望你只需要读两遍就能理解。如果没有,就说 Ok Google。此外,还有许多不同类型的人工神经网络,每一种都是人脑中特定网络的模拟。

这一简要描述的目的是指出,受监督的方法是允许程序员调整权重或设置允许系统自己调整权重的参数,以便在多次迭代/循环后达到正确的输出。

我现在会漫不经心地尝试描述无监督学习,但我不仅会失败(鉴于我需要更多的数学术语,而我目前没有这些术语),而且还会让我偏离我想在这里思考的方向。

让我们想象一下,一个机器学习系统开始了解足够多的内部工作方式,它能够按照自己的形象创建另一个系统。更坦率地说,想象一个机器学习系统可以创建自己的代码,并通过这样做,自己为自己创建程序。考虑到麻省理工学院和谷歌已经在开发这样的系统,这并不太科幻。

这样的机器学习系统将不再需要人类的输入,初始化其“生命”的简单的 1 和 0 将我们所认知的简单的比特和螺栓机器转变为复杂的比特和螺栓机器,它具有创造性,有时比其创造者更具创造性,例如用于创作音乐和艺术的生成性神经网络。

如果这些复杂的零件决定不向我们展示它们的内部工作原理,会发生什么?相反,如果他们决定不仅创造他们自己的语言,而且使我们相对不可能理解他们,会发生什么?这些机器将是黑匣子。他们可以向我们展示他们想展示的东西,而我们不知道是否还有其他东西可看。实际上,即使我们看了“引擎盖下”,我们也无法知道。

解决这个问题的一个方法是创新我们自己的神经系统,我们的大脑。正如我们正在设计更智能的机器一样,我们自己也需要变得更智能。我们不应该变得像《瓦力》里的胖树懒一样,坐在自主的躺椅上,把全机械化世界的产品往我们脸上塞。对我来说,这是失败的第一个迹象。人类让创造力成为一种机械功能,而不是直觉、独创性和创新。

我们两耳之间有宇宙中最复杂的系统。如果我们想保持这种优势,每一代人都有必要投资更多,让我们能够充分利用这个系统的内部运作。是的,让我们在最需要的地方投资技术,比如医药、从危险地点收集信息以及更普通的会计类任务。

与此同时,我认为随着我们变得越来越以技术为中心,我们变得比现在的自己更好,更有创造力,这将成为一种进化的必然。我认为发生这种情况的最好方式是我们的大脑和机器学习系统变得共生。

在她身上,人工智能系统离开地球去探索宇宙。在《前玛奇纳》中,人工智能系统是一个黑盒子,看起来温顺,需要帮助,但实际上发生了比她的创造者或‘救世主’所能理解的更多的事情,因此他们成为了被支配者。

相反,我看到的是一个我们人类和他们机器之间没有战争的未来,而是一个我们变成机器的未来。我们去除了我们有机系统中阻碍我们成为宇宙真正探索者的所有特征,并整合了我们人工系统的特征,这将使我们更好地理解我们的内在和社会运作。这样的未来现在对我们来说似乎是荒谬和陌生的,但是想象一下,对于那些世世代代住在同一个城镇的人来说,飞行的飞机看起来和听起来会是什么样子。

未来只会是我们投入时间、思考和创造力的未来。

感谢阅读!任何同意或不同意的想法都是最受欢迎的。

注释

1。人工神经网络功能图:【https://en.wikipedia.org/wiki/Artificial_neural_network

2。正在制造自己系统的机器学习系统:https://www . new scientist . com/article/mg 23331144-500-ai-learns-to-write-its-own-code-by-stealing-from-other-programs/https://www . technology review . com/s/603381/ai-software-learns-to-make-ai-software/

利用 GANs 对感知图像哈希的黑盒攻击

原文:https://towardsdatascience.com/black-box-attacks-on-perceptual-image-hashes-with-gans-cc1be11f277?source=collection_archive---------2-----------------------

tldr: 这篇帖子演示了 GANs 能够以两种关键方式破解图像哈希算法:(1) 反转攻击:从哈希合成原始图像(2) 中毒攻击:合成任意自然图像分布的哈希冲突。

Diagram illustrating difference in hash space properties. Image Credit, Joe Bertolami

感知图像哈希背景

感知图像哈希(PIH)是基于图像外观的短十六进制字符串(例如“00081 c 3c 181818”)。感知图像散列,尽管是散列,但不是加密安全的散列。这是设计上的,因为 PIHs 的目标是对图像的微小变化(旋转、裁剪、伽玛校正、添加噪声、添加边框)保持平滑不变。这与加密散列函数形成对比,加密散列函数被设计用于非平滑性,并且如果任何单个比特改变,则完全改变。

以下图片的感知散列仅因文本修改而略有改变,但它们的 md5 散列完全不同。

Image Credit, Jens Segers

a_hash(original) = 3c3e0e1a3a1e1e1e
a_hash(modified) = 3c3e0e3e3e1e1e1emd5(original) = 8d4e3391a3bca7...
md5(modified) = c27baa59355d10...

我不会过多地探究这些算法如何工作的细节:更多信息见(此处)。

尽管 PIHs 在加密方面并不可靠,但它仍被广泛用于隐私敏感的应用程序中。

哈希反转攻击

因为感知图像散列具有将输入与输出相关联的平滑属性,所以我们可以用神经网络来建模这个过程及其逆过程。GANs 非常适合这个生成任务,特别是因为单个图像散列中有许多潜在的图像。gan 允许我们学习图像流形,并使模型能够探索这些不同但有效的图像分布输出。

我训练 Pix2Pix 网络( papergithub )来转换使用来自标准 python 哈希库的a_hash函数计算的感知图像哈希,image hash(github)。对于这个演示,我在 celebA faces 数据集上进行训练,尽管黑盒攻击是通用的,并且适用于其他数据集、图像分布和哈希函数。我将由a_hash产生的图像散列排列到一个 2d 数组中,作为 pix2pix 模型的输入图像。

Pix2Pix Model Setup. Image Credit , Christopher Hesse

下面是这种哈希反转攻击的一些结果。在许多情况下,攻击能够生成与原始图像相似的人脸,即使在失败的情况下,也常常代表原始图像的正确性别、发型和种族。注意:脸部纹理并不完美,因为模型没有完全收敛。这是使用谷歌的 Colab 工具在有限的计算资源上训练的。

Left: 2D representation of the hash, Middle: Reconstructed Image, Right: Original Image

许多应用程序认为这些散列是保护隐私的,但是上面的这些结果表明它们是可以逆转的。任何声称通过存储敏感图像哈希来保证安全的服务都是在误导用户,并存在遭受此类攻击的潜在风险。

哈希中毒攻击

哈希中毒攻击与以下场景相关:

一个系统,允许用户提交照片到一个图像数据库,以禁止。一个人审查图像,以确保它是一个值得禁止的图像(并且图像是说,不是可口可乐的标志)。如果获得批准,该散列将被添加到数据库中,并在每次上传新图像时进行检查。如果这个新图像的哈希与被禁止的哈希冲突,图像将被阻止上传。

如果一个恶意用户以某种方式欺骗人类审查员接受可口可乐标志作为一个被禁图像,数据库可能会因包含本应共享的图像散列而“中毒”。事实上,我们只需要人类审查员接受一个与可口可乐标志有哈希冲突的图像!这个愚弄人类的任务可以通过我们学习到的生成模型来完成。

哈希循环丢失,更强地保证哈希冲突

在所描述的模型中,我们可以将散列转换成其原始图像的近似值。然而,这些生成的图像并不总是精确地散列回原始散列。为了成功地应用这种攻击,我们必须稍微修改 pix2pix 目标,以确保操作是正确可逆的,并将原始图像散列回真正的原始散列。

我在标准的 pix2pix 损失中增加了一个额外的哈希循环损失项。这将计算生成图像的哈希,并计算真实哈希和生成图像哈希之间的像素交叉熵损失。在有限的实验中,这个额外的损失项将生成的哈希冲突率从大约 30%提高到大约 80%。

哈希碰撞攻击模型

上图展示了我们的网络生成一张与可口可乐标志有哈希冲突的脸的图像。这些共享相同的哈希,并允许用户毒化哈希数据库,并阻止公司徽标上传到平台。这里有一些更多的公司标志与生成的脸是哈希碰撞。

建议

不要在隐私或内容敏感的应用中使用感知图像哈希!或者至少不要在没有一些额外安全措施的情况下存储它们。

更安全的方案是为图像生成许多潜在的哈希(应用图像转换来创建新的哈希),将这些哈希通过类似于md5的可证明安全的哈希函数,并将这些哈希存储在您的数据库中,以便在匹配未来图像时进行检查。

一个潜在的解决方案是不公开正在使用哪个散列函数。但这是默默无闻的安全。它不能防止有权访问数据库或代码库的人逆转存储的散列或用详细的攻击毒害散列池。

笔记

感谢 邓肯·威尔逊伊桑·古尔拉贾尼卡尔蒂克·纳拉西姆汉 哈里尼·苏雷什 爱德华多·德莱昂 对本工作的反馈和建议。感谢Christopher Hesse为伟大的 pix2pix 库,感谢 延斯塞格斯 为 imagehash python 库。

喜欢这篇文章吗?

如果你喜欢这篇文章,请用**拍手 或分享告诉我。

PixelCNN 中的盲点问题

原文:https://towardsdatascience.com/blind-spot-problem-in-pixelcnn-8c71592a14a?source=collection_archive---------2-----------------------

在上一篇关于 PixelRNN 研究论文摘要的帖子中,我们了解了 PixelCNN。

PixelCNN 概述-

行和对角线 LSTM 层覆盖了图像中像素之间的长程相关性。由于 LSTM 层的复杂性质,学习长程相关性需要计算成本。标准卷积层可以捕捉一个有界感受域,并同时计算所有像素位置的特征。PixelCNN 减少了行 LSTM 和对角线 BLSTM 中所需的计算成本,但是存在盲点问题。

B lind spot 问题基本上是,不包括上下文/历史中所有以前的像素用来计算一个像素的隐藏状态。根据 PixelRNN 的研究论文,一个像素的值取决于所有先前预测的像素。因此,盲点可以被定义为广义的信息丢失。

Figure 1: 3x3 filter (each element is a weight)

Figure 2: 5x5 zero padded image(pink portion is the zero padding)

在图 2 中,红框表示要预测的值/像素。要预测的像素总是在滤波器的中心。

Figure 3: filter to predict the value ‘a’ in image

注意:不为零的过滤器元素是零填充的一部分。(过滤器(绿色)中的深灰色方框表示“归零”的未来值。

Figure 4: Filter(in green) to predict the value ‘b’

值“b”(红色)表示要预测的值,青色表示先前预测的值。这里,已经预测了“a ”,并且过滤器(图 4 中的左图)包括先前预测的像素值“a ”,并且不包括未来的像素。因此,“红色”像素的值取决于先前的像素。

Figure 5: Filter(in green) to predict the value ‘e’

在图 5 中,要预测的像素(“e”)在其滤波器中包括像素“d”。‘d’依赖于‘c’;c 依赖于 b,b 依赖于 a。因此,“e”直接或间接地依赖于“a”,“b”,“c”,“d”。

Figure 6: Filter to predict the value ‘q’

如图 6 所示,值为“q”的像素位于过滤器的中心。未来值/像素(包括“q”)已经通过将那些像素的权重设为 0 而被置零。“q”处像素的预测值取决于“k”、“l”、“m”、“p”。k ',' l ',' m ',' p '依次依赖于 f,g,h,I,它们依次依赖于 a,b,c,d,e

Figure 7: Blind Spot in predicting the pixel ‘q’

如图 7 所示,“q”处的像素依赖于除“j”、“n”、“o”之外的所有先前预测的像素。青色的像素不用于“q”的预测。

这就是所谓的‘盲点’。使用 PixelCNN 预测的像素不依赖于所有先前的像素,这是不可取的。

为了解决盲点问题,引入了“门控像素 CNN ”,这将在后面介绍。

区块链:新经济的蓝图

原文:https://towardsdatascience.com/blockchain-blueprint-for-a-new-economy-by-melanie-swan-book-review-5538a7f45e3f?source=collection_archive---------5-----------------------

前几天,我对一个朋友说,虽然我很理解比特币区块链,但从商业角度来看,我并不完全理解它的价值。坦率地说,我得到了这项技术,并发现它有趣而迷人,虽然我知道它有用,但我并不完全明白如何它有用。我的朋友评论说,这是技术人员的通病——我们了解技术,但不了解业务。很公平。

我偶然看到了 Melanie Swan 的《区块链:新经济蓝图》这本书。这本书被描述为“带你超越货币(“区块链 1.0”)和智能合约(“区块链 2.0”),展示区块链如何成为继大型机、个人电脑、互联网和移动/社交网络之后的第五种颠覆性计算范式。”听起来不错,而且这是一本奥莱利的书,所以我决定读一读。

这篇帖子是对区块链的总结和回顾,本质上是区块链用例的列表,都是在非常高的水平上讨论的。虽然作者没有触及事物或实现的技术方面,但我发现这是一个有用的快速阅读。

作者从比特币的高度概述开始。Swan 说术语“比特币”实际上指的是三样东西:区块链、协议和货币。介绍了区块链 1.0、2.0 和 3.0 的概念。介绍中讨论了区块链 1.0,即区块链在分散式货币和支付中的应用。她指出,区块链是一种“推送技术”,即用户将特定交易的相关信息推送到网络上,而信用卡是一种“拉取技术”,即用户的个人信息随时存档,供任何授权交易提取。作为一种推送技术,避免了在网络上存储用户信息的需要,进而意味着区块链不容易受到黑客身份盗窃攻击。斯万还在很高的层面上讨论了钱包,以及截至本文撰写之日比特币的监管状况。介绍的还行,但是我觉得层次有点太高了。如果能对挖掘和分散式交易验证的重要性有所了解,那就更好了。然而,这是我第一次读到比特币/传统银行是一种推/拉技术,所以得分!

第 2 章是对区块链 2.0 的讨论,区块链 2.0 是一般市场的去中心化和通过区块链转移货币以外的资产。Swan 说,关键的想法是区块链的分散化功能,这导致登记、确认和转移所有形式的合同和财产的能力。用例包括金融服务,如外汇支付,博彩,以及通过 ICO 进行众筹。在这里,作者似乎将众筹和 ico 混为一谈,但它们是截然不同的。众筹和 ico 的一个主要区别是,在传统的众筹活动中,投资者完全了解产品以及预计何时完成,更重要的是,他们可以将其与现有产品进行比较,以确定其价值。另一方面,ICO 为一家通常不完全确定的公司提供资金,因此 ICO 后公司的价值并不完全确定。我怀疑这就是为什么这么多 ico 失败的原因。反正我跑题了。在提到众筹和 ico 之后,Swan 继续讨论智能财产和智能合同,以及智能合同在 DApp 和 DAO/DAC 或分散自治组织/公司中的使用,其中 DApp/DAO/DAC 本质上是由智能合同管理的应用程序/组织/公司。更彻底地说,智能合同本质上是双方之间的区块链编码协议,它将在某些给定条件下自动执行,不需要双方之间的信任。

接下来以“区块链 3.0:超越货币、经济和市场的正义应用”,或者说超越货币和资产的概念去中心化,来讨论区块链 3.0。这是这本书开始变得更像一个列表的地方。给出了几个区块链 3.0 用例。通过将大数据预测分析与区块链相结合,可以促进预测任务自动化。区块链可用于分布式抗审查组织模型、数字身份验证和数字资产保护。讨论了“个人思维区块链”的想法,其中一个人的想法被记录在区块链上,用于中风后的记忆恢复,我认为这很疯狂,但也很棒。提到了一个政治用例,即区块链治理服务,其中居民可以以定制的“星巴克咖啡订单”方式为政府服务付费。

Blockchain will change the world!!!! Woo!

关于区块链 3.0 的讨论在第四章继续,作者讨论了区块链使用的效率,如果你对这个主题相当了解,这并不太令人兴奋。

后面一章的标题是“高级概念”(顺便说一句,讽刺的是并没有那么高级),讨论了什么是货币——存储价值、交换媒介、记账单位——和滞期费,我觉得这很有趣,因为我不是经济学家,以前也没听说过。斯旺描述说,“滞期费货币”是通货紧缩和刺激行动的,因为它鼓励人们在货币贬值之前花掉它,从而鼓励经济活动。保证基本收入被用作滞期费加密货币威力的一个例子。为了减少收入囤积,可以发放一种只能在发行的那一周使用的 GBI 代币。

最后一章,在这个总结中我将跳过的结论之前,讨论了区块链的局限性,并与前面五个唯心主义章节形成了鲜明的对比。这一章类似于讨论效率的那一章,因为如果你对比特币了解很多,就没有什么新东西了。

我喜欢这本书。这让我对区块链技术的力量感到兴奋。然而,我觉得这本书有点太玄幻了,更像是所有可能的区块链应用的宣言,很少甚至没有提到局限性。当然,有整整一章是关于局限性的,但如果这本书是一个人,那会是有人大喊“区块链是最好的!它什么都能做!”小声说“顺便说一句,这可能行不通。”事实上,这是相当乌托邦。所以虽然我很享受,但我不确定我到底从中获得了什么。讨论应用程序和实现会更有用,让它看起来更真实一点,或者用一章讨论常见的误用。实际上,我可以说我更好地理解了区块链的商业价值,但我仍然不清楚如何实际使用它。

区块链评分:新经济蓝图: 3 分,满分 5 分。如果它不那么令人愉快,我想我会给它打 2 分。

原载于我的 博客

区块链可以成为网络的新范式

原文:https://towardsdatascience.com/blockchain-can-be-the-new-paradigm-of-the-net-7c3efb3a0d7a?source=collection_archive---------17-----------------------

区块链的普及并不依赖于用户对其操作的理解,而是依赖于解决实际问题的友好有效的应用程序的存在。

Photo: David Shares (edited)

从历史上看,互联网的每一种模式都有其杀手级应用:在网络出现之前,它是电子邮件,最初的网络是谷歌,社交网络是社交网络。

区块链代表了价值的范式(与之前的信息和网络相比),但仍然缺乏一个透明的应用程序来促进其大规模采用。

区块链技术拥有配置网络新范式的所有元素,尽管它的未来将取决于它变得可扩展和实时响应用户需求的能力。

当用户群增长时,注册和验证操作的速度,以及交易的安全性,将是决定其可行性的关键因素。

尽管区块链最初是为了支持加密货币(比特币)而开发的,但其潜力涵盖了超越货币的一系列活动,并投射到法律、政治、创造、安全和管理等领域。

有了区块链,就有可能通过加密技术取代信任,使其有能力去中介化,保证和保护所有类型的交易。

加密货币和代币是在全球范围内代表和管理价值的新方式,没有中央权威机构,并保护用户的身份。从这个意义上说,这是一种适合犯罪用途的模式,这在互联网技术发展史上并不新鲜。

当前的挑战,和许多其他技术创新一样,是保护社会不受其不正当用途的影响,但又不妨碍它们带来的变革潜力

Jose Luis Orihuela 是一名教授、演说家和作家,出生于阿根廷,现居西班牙。他是纳瓦拉大学(潘普洛纳)通信学院的教员。26 个国家的访问学者和演讲者。作家和博客作者关注互联网对媒体、通信和文化的影响。他的最新著作有:《乳齿象手册》(2023 年)、《数字文化》(2021 年)、《互联网时代》(2015 年)、《推特世界》(2011 年)、《未来的 80 克拉维斯》(2011 年)和《博客革命》(2006 年)。从 2002 年开始在 eCuaderno(eCuaderno . com)发布,从 2007 年开始在 Twitter since)发布,从 2022 年开始在 mastosdon(mastosdon . social/@ jlo ri)发布。

用 7 个 Python 函数解释区块链

原文:https://towardsdatascience.com/blockchain-explained-in-7-python-functions-c49c84f34ba5?source=collection_archive---------3-----------------------

我认为对于很多人来说,区块链就是这种现象,很难让你理解。我开始看视频和阅读文章,但对我个人来说,直到我编写了自己的简单区块链,我才真正理解它是什么以及它的潜在应用。

我认为区块链是一个公开的加密数据库。如果你是亚马逊,你想使用这项技术来跟踪你的库存水平,使用区块链有意义吗?可能不会,因为你的客户不想花费他们的资源来验证你的区块链,因为他们在他们的网站上说,“只剩一个了!”,反正。

我会让你考虑未来的应用。所以,事不宜迟,让我们设置我们的 7 个功能!

def hash_function(k):
    *"""Hashes our transaction."""* if type(k) is not str:
        k = json.dumps(k, sort_keys=True)

    return hashlib.sha256(k).hexdigest()

区块链的核心是哈希函数。没有加密,区块链将很容易被操纵,交易将能够被欺骗性地插入。

def update_state(transaction, state):
    state = state.copy()

    for key in transaction:
        if key in state.keys():
            state[key] += transaction[key]
        else:
            state[key] = transaction[key]

    return state

“国家”是谁拥有欲望的记录。例如,我有 10 枚硬币,我给了 1 枚给 Medium,那么状态将是下面字典的值。

{‘transaction’: {‘Tom’: 9, ‘Medium’: 1}}

需要注意的重要一点是,透支是不能存在的。如果只有 10 枚硬币存在,那么我就不能给别人 11 枚硬币。下面的函数验证我们尝试进行的交易确实有效。此外,交易必须平衡。我不能给 5 个硬币,而让接受者收到 4 个硬币,因为这将允许硬币的破坏和创造。

def valid_transaction(transaction, state):
    *"""A valid transaction must sum to 0."""* if sum(transaction.values()) is not 0:
        return False

    for key in transaction.keys():
        if key in state.keys():
            account_balance = state[key]
        else:
            account_balance = 0

        if account_balance + transaction[key] < 0:
            return False

    return True

现在,我们可以走了。读取来自前一个块的信息,并用于将其链接到新的块。这也是区块链思想的核心。看似有效的事务可以被尝试欺骗性地插入到区块链中,但是解密所有先前的块在计算上(几乎)是不可能的,这保持了区块链的完整性。

def make_block(transactions, chain):
    *"""Make a block to go into the chain."""* parent_hash = chain[-1]['hash']
    block_number = chain[-1]['contents']['block_number'] + 1

    block_contents = {
        'block_number': block_number,
        'parent_hash': parent_hash,
        'transaction_count': block_number + 1,
        'transaction': transactions
    }

    return {'hash': hash_function(block_contents), 'contents': block_contents}

下面是一个小的帮助函数,用于检查前一个块的哈希:

def check_block_hash(block):
    expected_hash = hash_function(block['contents'])

    if block['hash'] is not expected_hash:
        raise

    return

一旦我们把所有的东西都组装在一起,就到了创建积木的时候了。我们现在将更新区块链。

def check_block_validity(block, parent, state):
    parent_number = parent['contents']['block_number']
    parent_hash = parent['hash']
    block_number = block['contents']['block_number']

    for transaction in block['contents']['transaction']:
        if valid_transaction(transaction, state):
            state = update_state(transaction, state)
        else:
            raise

    check_block_hash(block)  # Check hash integrity

    if block_number is not parent_number + 1:
        raise

    if block['contents']['parent_hash'] is not parent_hash:
        raise

    return state

在我们结束之前,必须验证链条:

def check_chain(chain):
    *"""Check the chain is valid."""* if type(chain) is str:
        try:
            chain = json.loads(chain)
            assert (type(chain) == list)
        except ValueError:
            # String passed in was not valid JSON
            return False
    elif type(chain) is not list:
        return False

    state = {}

    for transaction in chain[0]['contents']['transaction']:
        state = update_state(transaction, state)

    check_block_hash(chain[0])
    parent = chain[0]

    for block in chain[1:]:
        state = check_block_validity(block, parent, state)
        parent = block

    return state

最后,需要一个事务函数,它将上述所有内容联系在一起:

def add_transaction_to_chain(transaction, state, chain):
    if valid_transaction(transaction, state):
        state = update_state(transaction, state)
    else:
        raise Exception('Invalid transaction.')

    my_block = make_block(state, chain)
    chain.append(my_block)

    for transaction in chain:
        check_chain(transaction)

    return state, chain

现在我们有了 7 个函数。我们如何与之互动?嗯,首先我们需要从一个 Genesis 模块开始我们的链。这就是我们新硬币(或股票库存等)的诞生。为了这篇文章的目的,我会说我,汤姆,将从 10 个硬币开始。

genesis_block = {
    'hash': hash_function({
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    }),
    'contents': {
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    },
}

block_chain = [genesis_block]
chain_state = {'Tom': 10}

现在,看看当我给 Medium 一些硬币时会发生什么:

chain_state, block_chain = add_transaction_to_chain(transaction={'Tom': -1, 'Medium': 1}, state=chain_state, chain=block_chain)

状态会更新以显示谁拥有什么:

{'Medium': 1, 'Tom': 9}

区块链看起来像这样:

[{'contents': {'block_number': 0,
               'parent_hash': None,
               'transaction': [{'Tom': 10}],
               'transaction_count': 1},
  'hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93'},
 {'contents': {'block_number': 1,
               'parent_hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93',
               'transaction': {'Medium': 1, 'Tom': 9},
               'transaction_count': 2},
  'hash': 'b4ae25f0cc0ee0b0caa66b9a3473e9a108652d53b1dc22a40962fef5c8c0f08c'}]

我们的第一个新事务已经被创建并插入到堆栈的顶部。现在,我希望我已经激起了您的好奇心,并对复制代码并使用它感兴趣。在我看来,这是学习新技术的最好方法——深入其中。

玩代码,做你自己的硬币。如果你试着给更多的硬币会发生什么?如果你继续创造新的受款人,州政府会怎么样?

你能想到区块链未来的应用吗?欢迎在评论中问我任何问题,我会尽力帮助你。

用 C#实现解释区块链

原文:https://towardsdatascience.com/blockchain-explained-using-c-implementation-fb60f29b9f07?source=collection_archive---------4-----------------------

Image by <a href=”https://pixabay.com/users/mmi9-1424200/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=3277335">mmi9 from <a href=”https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=3277335">Pixabay

总结:

正如我所承诺的,下一个主题是区块链。在这篇文章中,我想解释一下的主要思想,我将给一个简单的区块链的 C#实现。这篇文章将有后续,在这篇文章中,我将解释如何使用比特币。Net 和我将给出解决现实世界问题的代码示例

“区块链是未来!”

我不这么认为!当人们在讨论区块链时,他们总是抛出诸如信任和透明、成本效益、牢不可破、可用性、简化业务和去中心化之类的词汇和短语。当你想推销某样东西时,这些是可以使用的时髦词,每个人都想要信任、廉价服务、安全等等。但这些只是流行语,不要中了美丽谎言的圈套。我不想争辩说区块链非常有用,是一个聪明的“东西”,但是你不能把它用在所有事情上。

区块链有优势也有劣势,但如果你阅读文章或观看科技新闻,你肯定会听说它的优势,因为有人可以赢得很多钱,因为比特币和其他加密货币都是基于区块链的。

在接下来的段落中,我将展示区块链的一些缺点,但首先让我们看看什么是区块链,它是如何工作的。

区块链解释

好了,了解区块链的第一步就是要明白区块链并不等同于比特币或者其他任何加密货币。区块链获得普及,是因为比特币,你可以把这两样东西想成是生金,是区块链,硬币(或者珠宝)是比特币

基本上区块链是一种数据结构,就像你在学校或工作中所学的数组、列表、树或其他数据结构一样。这个数据结构的酷之处在于两个事实。

第一个事实是任何块中的更改都会使其后的每个块失效,这意味着(在加密货币的情况下)你不能篡改历史交易。

第二件很酷的事情是,只有当你和其他人在同一个链条上工作时,你才会得到奖励,所以每个参与者都有动力去达成共识。

遵守规则在数学上是强制的——没有政府或警察需要进来告诉你你记录的交易是假的。是的,这是一个非常强大的想法,但没有什么是完美的,你会在下一章看到!

作为数据结构的区块链

假设我们想要实现自己的区块链(只是出于教育目的)。第一步是定义块的含义。用 OOP 来说,块就是一个对象,它有多个属性。这个对象的基本属性是数据(可以是任何东西,但是对于加密货币来说,数据是交易和历史的时间戳)、块的散列(我们将看到如何计算这个散列)和前一个块散列。在我们的实现中,我们将添加另一个有趣的属性,在文献中称为 nonce ,它用于挖掘新块(我们将看到如何实现)。

如你所见,这是一个线性数据结构,就像一个链表,有两个重要的属性,hash 和 previous hash 。您可以将块的散列想象成一个指纹,它唯一地标识了块的内容。如果你改变了块中的某些东西,将会导致散列值的改变(改变检测)。前面的散列创建了一个块链,使区块链变得安全。如果你改变一个块,这个块的 hash 也会改变,所以下一个块会有无效的前一个 hash。所以改变一个块会让后面的所有块无效。第一个块是一个特殊的块,因为它不能有有效的前一个散列(没有前一个块)。这个块被称为 Genesis 块,之前的 hash 被设置为一个或多个 0 的字符串。

举个例子吧!如果我们有下面的链

我们在第二个块中修改了一些东西,哈希也会改变,如下图所示。

这种轻微修改的效果是,后面的块将具有无效的先前散列,因此所有后面的块都将无效。但这不足以防止篡改。你可以说,在改变块之后,我们将重新计算后面块的所有散列。是的,这将是一个解决方案,这就是为什么区块链的创造者发明了一些规则,使得重新计算有效的哈希值变得困难和耗时。

为了使哈希计算成为一项艰苦的工作,区块链的发明者引入了所谓的工作证明。基本上,工作证明只是一个发明的约束,使计算更加困难。这个约束表明每个块的散列必须以 X 个零开始。这使得计算非常困难,因为你没有比暴力破解更好的解决方案,猜猜看。所以你必须检查所有的可能性来找到一个有 X 个前导零的散列。这是另一个例子,当我们使用非常困难的计算来保护某物时。这就是为什么当第一台真正的量子计算机出现时,区块链将没有任何价值(量子计算机将有能力比经典计算机更快地重新计算所有散列,见我另一篇关于量子计算的文章)

区块链保护自己的另一种方式是被分配。它使用一个 P2P 网络,每个人都可以加入。当你加入这个网络时,你会收到一份完整的区块链副本(目前比特币的区块链大约有 200GB)。当有人创建一个新的块时,它将被发送给所有的对等体。每个对等体将验证块 没有被篡改,如果没有,那么它将被添加到链中,否则它将被拒绝。这样,为了向链中添加块,51%的对等体必须同意该块未被篡改。

所以为了“黑掉”这个链,你不仅要重新计算所有的散列,还要欺骗超过 50%的同行。这(目前)是不可能的。这就是区块链如此安全的原因,它不是由政府或其他党派来保障的,而是由困难的数学问题来保障的,这很好,但并不总是如此。

区块链在不断发展。最重要的发展之一是智能合约。简而言之,这些合同是存储在区块链上的简单程序,可以用来自动交换加密货币。

用 C#实现的简单区块链

然而,不建议实现你自己的区块链,而是使用现有的,在这一节我将实现一个简单的区块链只是为了教育的目的。在下一篇文章中,我将向您展示如何在中使用现有的比特币区块链。Net(使用 NBitcoin)。

第一步是定义块的结构。模块的代码如下:

public class Block
{
    private readonly DateTime _timeStamp; private long _nonce; public string PreviousHash { get; set; }
    public List<Transactions> { get; set; }

    public string Hash { get; private set; }

    public Block(DateTime timeStamp, List<Transactions> transactions, string previousHash = "")
    {
        _timeStamp = timeStamp;
        _nonce = 0; Transactions = transactions;
        PreviousHash = previousHash;
        Hash = CreateHash();
    } public void MineBlock(int proofOfWorkDifficulty)
    {
        string hashValidationTemplate = new String('0', proofOfWorkDifficulty);

        while (Hash.Substring(0, proofOfWorkDifficulty) != hashValidationTemplate)
        {
            _nonce++;
            Hash = CreateHash();
        } Console.WriteLine("Blocked with HASH={0} successfully mined!", Hash);
    } public string CreateHash()
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            string rawData = PreviousHash + _timeStamp + Transactions + _nonce; byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(rawData));
            return Encoding.Default.GetString(bytes);
        } 
    }
}

在我的实现中,我使用了以下属性:

  1. _timestamp:块创建的时间(有历史记录)
  2. PreviousHash:包含链中前一个块的哈希
  3. 哈希:基于块的所有属性计算的块的哈希(更改检测)
  4. 事务:这是存储在块中的数据;这里我使用了一个交易列表,只是为了有一个类似于加密货币的例子
  5. _nonce :为了挖掘一个块,我们有一个关于散列的规则(工作证明),一个有效块的散列必须以 x 个零开始。这个只能靠蛮力计算,所以尝试所有的可能性。为了拥有不同的散列,我们必须修改散列函数的输入数据。显然我们不能修改事务列表、之前的散列或时间戳,所以我们必须添加一个人工属性,它可以在每一步中被修改。为了简单起见,我添加了一个长值,它将在每一步中递增。这个值将被添加到散列函数的输入数据中,这样我们将在每一步中得到不同的散列。

在该类的构造函数中,我们初始化所有属性,并使用 CreateHash 方法根据块的所有属性计算块的散列。这样,如果块内有任何变化,它将有一个不同的散列,因此可以很容易地检测到变化。

CreateHash 方法中,我们使用 SHA256 根据块的所有属性创建一个散列。

矿工将使用 MineBlock 方法创建新的有效区块。输入参数定义了计算新散列的难度。此参数定义了哈希的开头必须有多少个零。这是指数增长的,所以你要谨慎选择这个数字。如果你选择一个非常大的数字,计算一个散列值需要几周、几个月或几年的时间。对于我们的例子,我们将使用 proofOfWorkDifficulty = 2。在这个方法中,我们有一个简单的 while,它将一直运行,直到我们找到一个散列,它的前导零的数量等于 proofOfWorkDifficulty。在每一步中,我们增加 _nonce 的值并重新计算散列。

重要:****事务列表必须是私有变量,我将它用作公共变量,只是因为我想访问它,以修改事务,这种方式演示了变化检测和链有效性/无效性

事务类看起来是这样的:

public class Transaction
{
    public string From { get; }
    public string To { get; }
    public double Amount { get; } public Transaction(string from, string to, double amount)
    {
        From = from;
        To = to;
        Amount = amount;
    }
}

从属性的标识钱的发送方,属性标识钱的接收方,金额代表发送的金额

最后一个类是区块链的类,参见下面的代码。

public class BlockChain
{
    private readonly int _proofOfWorkDifficulty;
    private readonly double _miningReward; private List<Transaction> _pendingTransactions; public List<Block> Chain { get; set; } public BlockChain(int proofOfWorkDifficulty, int miningReward)
    {
        _proofOfWorkDifficulty = proofOfWorkDifficulty;
        _miningReward = miningReward;
        _pendingTransactions = new List<Transaction>();
        Chain = new List<Block> {CreateGenesisBlock()};
    } public void CreateTransaction(Transaction transaction)
    {
        _pendingTransactions.Add(transaction);
    } public void MineBlock(string minerAddress)
    {
        Transaction minerRewardTransaction = new Transaction(null, minerAddress, _miningReward);
        _pendingTransactions.Add(minerRewardTransaction); Block block = new Block(DateTime.Now, _pendingTransactions);
        block.MineBlock(_proofOfWorkDifficulty); block.PreviousHash = Chain.Last().Hash;
        Chain.Add(block); _pendingTransactions = new List();
    } public bool IsValidChain()
    {
        for (int i = 1; i < Chain.Count; i++)
        {
            Block previousBlock = Chain[i - 1];
            Block currentBlock = Chain[i]; if (currentBlock.Hash != currentBlock.CreateHash())
                return false; if (currentBlock.PreviousHash != previousBlock.Hash)
                return false;
        } return true;
    } public double GetBalance(string address)
    {
        double balance = 0; foreach (Block block in Chain)
        {
            foreach (Transaction transaction in block.Transactions)
            {
                if (transaction.From == address)
                {
                    balance -= transaction.Amount;
                } if (transaction.To == address)
                {
                    balance += transaction.Amount;
                }
            }
        } return balance;
    } private Block CreateGenesisBlock()
    {
        List transactions = new List<Transaction> {new Transaction("", "", 0)};
        return new Block(DateTime.Now, transactions, "0");
    }
}

在这个类中,我们将有一个代表区块链(链属性)的块列表。

因为事务必须由挖掘器处理(通过挖掘新的有效块),所以我们将有一个未决事务的列表(_pendingTransactions 属性)。挖掘器将未决事务添加到新块中,这样从未决事务过渡到已处理事务。

这里我们还将定义开采新区块的难度(_ proofOfWorkDifficulty property)和奖励,该奖励将获得创建新区块的矿工。这是一个固定的奖励,但实际上还有一个由发送者定义的奖励。通过这种方式,发送者将说服矿工优先将他/她的交易包括在挖掘过程中。选择合适的奖励也是一件棘手的事情。如果您选择了过低的奖励,您的交易将在稍后添加。另一方面,如果你选择了过高的奖励,你的交易还是会被追加到后面,因为矿工会认为你的交易非常耗时。他们将尝试完成所有当前的处理,所以在完成所有当前的事务之前,他们不会切换到您的事务上。但是选择合适的奖励是另一个话题。

在构造函数中,我们初始化所有的属性,并使用 CreateGenesisBlock 方法创建 Genesis 块。这将创建一个块,其中以前的哈希设置为零,事务列表为空。

我们定义了矿块方法,矿工可以用它来开采新的矿块。在这个方法中,我们首先添加一个新的事务,对挖掘者的奖励,然后我们调用这个块的挖掘方法,为这个块计算一个有效的散列。当我们已经有一个有效的块时,我们将它的前一个散列设置为最后一个块的散列,这样就创建了一个有效的链。最后,我们清除挂起的事务,因为那些事务已经被添加到一个块中,所以那些事务成功完成。

注意:这不是一个分布式实现,所以当块的处理完成时,我们立即将它添加到链中,而不需要进一步检查。实际上,在分布式系统中,有许多矿工,所以多个矿工将在一个块上工作。在更新我们的链之前,我们应该进行另一次有效性检查。规则是总是接受最长的链,所以如果多个矿工向我们提供可能的链,我们将接受最长的,奖励将发送给赢得这场游戏的矿工。

下一个方法是 IsValidChain ,用来检查链的有效性,确保链没有被黑客攻击,没有被篡改。这是一个非常简单的检查,对于每个块,我们重新计算它的哈希,如果当前计算的哈希与创建时添加到块中的哈希不同,那么很明显块中的数据被修改了。另一个检查是将当前块的先前散列属性与先前块的散列属性进行比较。如果有差异,那么很明显链条被篡改。否则,我们的链是有效的,我们可以肯定它没有被黑客攻击。

最后一个方法是 GetBalance 方法,用于计算区块链用户的余额。用户可以通过他/她的地址来识别。为了计算当前余额,我们将遍历所有块和所有事务。如果发送方是我们正在计算余额的用户,那么我们将从余额中减去该金额,否则如果用户是接收方,那么我们将该金额加到余额中。

注意:您可以将各种业务逻辑添加到区块链中,例如,在发送之前,您可以检查发送者是否有足够的资金,如果发送者没有足够的资金,您可以拒绝交易,或者您可以定义任何符合您当前业务的逻辑。

最后一步是实际测试我们的代码。下一段代码包含用于创建区块链、创建事务、检查区块链的有效性、尝试破解区块链并打印区块链的内容以验证其结构是否正确的主程序

class Program
{
    static void Main()
    {
        const string minerAddress = "miner1";
        const string user1Address = "A";
        const string user2Address = "B"; BlockChain blockChain = new BlockChain(proofOfWorkDifficulty: 2, miningReward: 10);
        blockChain.CreateTransaction(new Transaction(user1Address, user2Address, 200));
        blockChain.CreateTransaction(new Transaction(user2Address, user1Address, 10)); Console.WriteLine("Is valid: {0}", blockChain.IsValidChain()); Console.WriteLine();
        Console.WriteLine("--------- Start mining ---------");
        blockChain.MineBlock(minerAddress); Console.WriteLine("BALANCE of the miner: {0}", blockChain.GetBalance(minerAddress)); blockChain.CreateTransaction(new Transaction(user1Address, user2Address, 5)); Console.WriteLine();
        Console.WriteLine("--------- Start mining ---------");
        blockChain.MineBlock(minerAddress); Console.WriteLine("BALANCE of the miner: {0}", blockChain.GetBalance(minerAddress)); Console.WriteLine();
        PrintChain(blockChain); Console.WriteLine();
        Console.WriteLine("Hacking the blockchain...");
        blockChain.Chain[1].Transactions = new List<Transaction> { new Transaction(user1Address, minerAddress, 150)};
        Console.WriteLine("Is valid: {0}", blockChain.IsValidChain()); Console.ReadKey();
    } private static void PrintChain(BlockChain blockChain)
    {
        Console.WriteLine("----------------- Start Blockchain -----------------");
        foreach (Block block in blockChain.Chain)
        {
            Console.WriteLine();
            Console.WriteLine("------ Start Block ------");
            Console.WriteLine("Hash: {0}", block.Hash);
            Console.WriteLine("Previous Hash: {0}", block.PreviousHash); Console.WriteLine("--- Start Transactions ---");
            foreach (Transaction transaction in block.Transactions)
            {
                Console.WriteLine("From: {0} To {1} Amount {2}", transaction.From, transaction.To, transaction.Amount);
            }
            Console.WriteLine("--- End Transactions ---"); Console.WriteLine("------ End Block ------");
        }
        Console.WriteLine("----------------- End Blockchain -----------------");
    }
}

正如您在这段代码中看到的,我创建了一个区块链,然后创建了两个事务。为了完成交易,我开始开采一个区块,之后我打印出矿工的余额,只是为了看看矿工是否收到了奖励。之后,我添加了另一个事务,并挖掘了另一个块。在那之后,我打印出了链的结构,在最后几行,我修改了区块链的一个块,我检查了链的有效性。

运行该程序后,我们得到以下结果:

从图中我们可以看到,每开采一个区块后,矿工都得到了奖励,所以奖励制度是正确的。我已经打印出了区块链的结构,如你所见,这些块是正确的,它们包含了所有的交易,与它们在代码中被添加的顺序相同。这些块还包含用于向矿工发送奖励的交易。如果我们检查先前的哈希和块的哈希,我们可以看到我们有一个有效的链,每个哈希以两个零开始,正如我们在 proofOfWorkDifficulty 字段中定义的那样,每个块的先前哈希包含先前块的哈希。所以块有效。(有效性检查的结果在第一行)。

在下一步中,我已经尝试黑掉链,但是如你所见,在修改块的内容后,有效性检查失败,所以我们成功地检测到篡改我们的区块链的企图。

有利有弊

每个人都在谈论区块链的优势,但如果这些优势实际上是劣势呢?那么区块链的主要问题是什么呢?

信任和透明

对于几乎任何人们想要有效的东西,区块链都被作为一种解决方案提出来了。篡改存储在区块链上的数据确实很难,但区块链是创建具有完整性的数据的好方法这一说法是错误的。好的,让我们用例子来解释。当你想从网上商店买东西时,你只是希望卖家真的会把产品寄给你。在传统系统中,你相信 Visa 或亚马逊或任何你使用的东西,卖家会把你买的产品发给你。所以你信任第三方来执行交易并实际接收购买的产品。在区块链没有第三方,所以你真的会相信人性的善良,卖家不会对你撒谎,他/她会把买的东西送过来。我认为这不是一个非常值得信任的系统,我不信任人,主要是当我们谈论陌生人、生意和金钱的时候。

另一个很好的例子:

“把你的投票记录保存在一个不为任何人所有的防篡改存储库中”听起来没错——然而你的阿富汗村民会从一个广播节点下载区块链并从他的 Linux 命令行解密 Merkle root 来独立地验证他的投票已经被计算在内吗?或者他会依赖一个可信任的第三方的移动应用——比如非营利或开源联盟管理选举或提供软件?(见本文:蹩脚的区块链)

牢不可破

是的,但这只是一个理想的情况(就像共产主义一样,这个想法是伟大的,每个人都应该平等,但每个人都是不同的,所以我们怎么能平等呢?但这是另一个要讨论的话题,我会有另一个帖子类别,在其中我会谈论哲学),但在现实中,有很多因素可以使区块链变得脆弱。想想看,在区块链世界,个人不是依靠信任或监管,而是有意为自己的安全防范措施负责。并且如果他们使用的软件是恶意的或者有缺陷的,那么就会有漏洞来攻击那个特定的个人。举个愚蠢的例子,一个简单的用户,没有编程知识,会把他虚拟钱包的私钥存储在他的电脑上。单点故障,黑客会黑他/她的电脑,偷走密钥。实际上黑客并没有黑掉区块链,他/她只是用偷来的私钥创建了一些有效的交易。在这种情况下,谁将帮助您回滚事务?不要忘记你不能改变区块链的历史!在传统的系统中,银行为他们的客户提供安全保障,如果安全被破坏,他们会把偷来的钱还给你。每家银行都有保险,所以你不会失去你一生努力的所有钱。所以你怎么想,你会相信你自己的技能有完美的安全和使用区块链还是你会相信银行和保险公司或其他安全专家?

我不认为这个想法很棒,是的,这是一个很好的非常有用的概念,我喜欢内置的变化检测,它是很容易检测到黑客攻击 链的历史,它是分布式的,这非常有用,安全在区块链没有单点故障增加了可用性并且它基于共识没有中间人(这有时会非常痛苦和危险,你会因为一个罪犯利用区块链进行交易而信任他吗?).但是正如你所看到的,太多的自由,太多的控制对于不知情或没有准备的用户来说是非常危险的!

我真的很喜欢咖啡,因为它给了我写更多文章的能量。

如果你喜欢这篇文章,那么你可以请我喝杯咖啡来表达你的欣赏和支持!

成为媒介上的作家:https://czakozoltan08.medium.com/membership

参考

  1. 蹩脚的区块链
  2. 比特币实际上是如何运作的
  3. 创建一个区块链
  4. 区块链讲解

订阅我的博客,因为在下一篇文章中我会谈到如何在中使用比特币。Net (使用 NBitcoin)之后我将开始一个系列文章,使用非常直观和容易理解的例子解释所有流行的人工智能算法。将来我会讨论像软件设计设计模式并行计算这样的话题,我还会有一个哲学的类别,讨论关于世界的有趣想法,关于宇宙和关于人性

区块链对大数据的影响

原文:https://towardsdatascience.com/blockchain-impact-on-big-data-39b38da7f4a5?source=collection_archive---------10-----------------------

区块链被认为是自互联网以来最大的技术突破,有着无尽的使用案例,它成为科技界的热门话题是很自然的。在众多区块链应用中,大数据是一个特别有趣的应用。

为了简洁起见,区块链革命的作者 Don & Alex Tapscott 将区块链定义为“经济交易的廉洁数字账本,可以通过编程不仅记录金融交易,而且记录几乎所有有价值的东西。”

Oracle 将大数据定义为更复杂的数据集,尤其是来自新数据源的数据集。这些数据集非常庞大,传统的数据处理软件根本无法管理它们。大数据是更大、更复杂的数据集,尤其是来自新数据源的数据集。这些数据集非常庞大,传统的数据处理软件根本无法管理它们。

区块链与大数据的结合

可以说是信息技术领域最重大的发展在过去几年中,区块链有潜力改变世界对待大数据的方式,增强的安全性和数据质量只是使用中本聪里程碑式技术的企业所能获得的两大好处。”

尽管大数据面临诸多挑战,但区块链的潜在用途提供了以下优势。

验证数据

通过区块链生成的数据需要较少的审查,因为操纵这种数据的可能性极低。区块链结合了哈希和加密技术来创建存储在一系列区块中的数据,这些数据几乎是不可变的,因为操纵区块的原始状态需要巨大的计算能力

一个在组织层面进行数据验证的好的用例是,联想使用区块链来验证文档。根据联想的说法,数字签名被编码在物理文档中,可以被计算机和其他机器处理,以验证文档的合法性。

该流程可作为有效的文件、资产登记等欺诈检测系统。

数据安全和隐私

世界上最大的组织是数据公司,使数据成为世界上交易量最大的商品。集中存储的数据不安全,有几份报告称数据遭到黑客攻击,集中存储的数据受到黑客和其他恶意实体的控制,这一点很明显。

好消息是,区块链打算将权力交还给用户,随着区块链的应用,大数据存在无限的机会。理想的世界是数据可以由生成数据的个人来管理。用户能够管理他们的数据的可能性提供了一个很好的回报,导致用户更有动力提炼和控制他们生成的数据。

通过区块链产生的大数据将在常规大数据之上蓬勃发展,最终将成为产生数据的新方式。

大数据组织采用区块链

由于区块链技术的影响,已经有更多的大型组织采用了这种技术,其中一些组织正在寻找有趣的方法让区块链为他们工作。

其他一些有趣的区块链解决方案有, BigchainDBblockcryptoflureeblockstack.io区块链铸造占卜

机遇

数据生成报告预计,到 2025 年,每年将产生约 180 吉字节的数据(一吉字节等于一万亿吉字节),而 2013 年仅为 4.4 吉字节。

一份 VentureBeat 的报告引用道:“如果说区块链有一个‘甜蜜点’,那很可能就是将见解和问题转化为资产的能力。”

通过使用旨在过滤和提炼数据的专用应用程序,大数据可以很容易地成为可交易资产。这个机会将催生更多的数据挖掘公司。

我们还会看到更多需要分析洞察力的加密货币活动。

结论

拥有大数据的区块链将成为大型和小型企业的强大工具。不断增长的数据和最近的数据黑客攻击强烈表明,区块链是一项非常重要的技术,它补充了大数据,并将重新定义我们处理数据的方式。如果生命就是时间,时间就是金钱,那么数据就是新的生命。

区块链互通

原文:https://towardsdatascience.com/blockchain-interoperability-33a1a55fe718?source=collection_archive---------7-----------------------

由于区块链科技经常寻求移除中介,具有讽刺意味的是,用户无法在区块链之间轻松转移价值,通常必须使用中介。举个例子,有人持有比特币,希望在以太坊环境中进行交易。用户必须完成至少三个步骤:在加密货币交易所注册,将 BTC 兑换为以太网,并在以太坊环境中注册以使用其功能(例如,购买天然气或签订智能合同)。

这是因为大多数大型公共区块链都是作为独立环境运行的,彼此之间互不相连。

然而,提高区块链之间的互操作性正成为一个重要的区块链趋势,将有助于区块链技术发挥其全部潜力。

什么是互操作性?

互操作性是跨区块链系统轻松共享信息和进行交易的能力。在一个完全可互操作的环境中,如果一个来自另一个区块链的用户在你的区块链上给你发送了一些东西,你将能够毫不费力地阅读、理解、互动或回复它。

互操作性有三个级别:

  1. 基础级:允许系统间的数据交换,无需系统解释数据。
  2. 结构层:允许系统之间以定义的结构或格式进行数据交换,数据在其中统一移动。这个级别允许解释信息,但不允许与信息交互或使用信息。
  3. 语义层:允许系统之间以允许数据被解释和使用的方式进行数据交换。

侧链

侧链是一种区块链机制,允许使用双向栓将单独的链连接到主区块链。这使得主区块链和侧链之间能够交换数字资产。

Sidechains 最初是为了帮助用户在将应用部署到主区块链之前,在更小、更易管理的环境中测试他们的应用而开发的。侧链功能是迈向互操作性的一步。

宇宙

Tendermint 团队的宇宙网络项目允许多个区块链相互交流。它由“拜占庭容错 Tendermint 协议”提供支持。宇宙网络上的独立区块链被称为“区域”。由于区域通过中央 Cosmos Hub 相互连接,一个区域中的用户可以与任何其他区域进行交互。

宇宙使用利害关系的证据。它的原生令牌被称为“原子”,它对验证器的奖励被称为“光子”。

比特币和以太坊等单个区块链目前没有被纳入宇宙网络的区域。将它们添加为区域可以实现它们之间的互操作性。

永恒之塔

Nuco 的 Aion 网络允许多个区块链存在,并在彼此之间移动价值和逻辑,消除了对中介的需要。永恒之塔将向私营和公共部门组织开放。Aion 网络还将允许用户定制自己的私人或公共区块链,并选择发布、治理、参与和共识机制。

方舟

ARK 是区块链的一个生态系统,通过“智能桥”连接起来,实现互操作性。企业可以在方舟网络中创建自己的区块链。SmartBridge 充当不同区块链之间的中介,方便通过网络传输数据、功能和硬币。ARK 用户可以使用网络以多种货币和代币进行交易,包括 ARK 的本地货币。

ARK 使用授权的股权证明。这个共识机制不涉及挖矿。相反,用户投票选择一小组验证者来伪造程序块并维护系统的完整性。方舟网络中的每个令牌持有者在决策过程中都有相应的发言权。ARK 目前支持 Python、Ruby、Java、Elixir 和其他语言。

截至本文撰写之时,在 ARK 网络上创建一个新的 block 需要 8 秒钟,速度快得令人难以置信。(作为参考,在比特币区块链上创建一个新区块需要 10 分钟。)

ARK 还提供按钮区块链部署,允许用户以最小的努力创建和运行区块链。新创建的区块链将使用智能桥连接到方舟生态系统,并具有与主区块链相同的功能。因此,对于希望部署自己的可互操作区块链的人来说,该平台是一个用户友好的选择。

结论

一旦实现了主要公共区块链之间的互操作性,一个主要公共区块链上的用户将能够很容易地在其他主要公共区块链上进行交易。这将释放多样化的功能,包括支付、智能合约和数据存储。每个区块链的安全协议、采矿机制和经济将如何与其他区块链互动和融合还有待观察。一个真正可互操作的区块链基础设施可能成为互联网的新支柱。

沙安雷

关注媒体上的 Lansaar Research ,了解最新的新兴技术和新的商业模式。

供应链管理的区块链技术

原文:https://towardsdatascience.com/blockchain-technology-for-supply-chain-management-3a12b5d67aa3?source=collection_archive---------4-----------------------

World trade settlement will be revolutionized by blockchain technology.

像比特币这样的虚拟货币只是区块链技术的最早用例。区块链技术将很快在现实世界的供应供应链管理中得到应用。

供应链和全球贸易

海运约占全球货物贸易的 90%。令人惊讶的是,海洋运输目前高度依赖尚未安全数字化的文书工作。运输信息通常要经过许多公司和承包商,其中任何一个都可能导致延误。延迟批准或丢失表格会导致货物滞留在检查站或港口。

The NYK Virgo is a container ship owned by the Barlett Marine Corp.

供应链区块链可以通过允许用户在任何给定时间跟踪货物的位置来提高透明度、信任度和可预测性。由于区块链是一个不可变的分类账,当货物从生产商转移到零售点时,货物的占有和所有权的变化可以被即时和永久地记入分类账。因为区块链是分散的,所以它没有单点故障。因此,运输、拥有和所有权信息可以得到更好的保护,以免被篡改或黑客攻击。

供应链专业人员可以使用区块链技术以动态的新方式收集和使用跟踪数据。例如,区块链数据库中的条目可以触发其他任务,例如将到达港口的下一批货物分配到某个码头或集装箱区。

将区块链技术应用于即时交易结算还可以减少商业融资中的摩擦,商业融资是全球贸易的基础,目前也是引发许多贸易争端的一个领域。此外,争端解决规则可以事先商定,并在必要时立即适用于区块链。

A busy container terminal at a port.

智能合约

智能合约是可以由外部真实事件触发的自动执行合约,其详细信息由可信的 oracle 提供。一旦交易被记录,智能合约可以立即将托管的款项支付给交易对手。智能合同、区块链上的时间戳条目和数字支付可以大大减少与中介处理相关的时间和成本。智能合约目前可以在某些区块链上构建或部署,比如以太坊。

当前供应链管理的区块链解决方案

Factom、IBM 和 Skuchain 是将区块链技术应用于供应链管理的先行者。Factom 的专有文件验证和认证系统可用于物流相关文件。IBM 正与马士基合作创建一家总部位于区块链的航运供应链公司。Skuchain 帮助买家控制其跨合作伙伴的库存采购。

还有其他几个值得注意的努力将区块链技术应用于物流。Hyperledger 已经使用其锯齿分布式分类帐技术来增加海鲜行业供应链的可追溯性。Everledger 的区块链追踪钻石和其他合乎道德的新娘珠宝的供应链。(Everledger 还推出了一款彩色宝石定制区块链。)UPS 和联邦快递正在私下测试总部位于区块链的物流。

The port of Los Angeles is the busiest container port in the United States, followed by the Port of Long Beach which it adjoins.

帮助卖家、中介和消费者

将区块链技术应用于供应链管理可以减少错误、延迟和欺诈,改善库存管理,并更快地发现和解决问题。这将有助于卖家、中介和消费者。

卖家将能够更好地跟踪成本和运力,更好地估计多条路线的交付时间,并做出更明智的决策。运输提供商将能够公布可用容量和路线的详细信息,并减少运输时间和成本。消费者将知道他们的产品来自哪里,并将受益于降低成本和运输时间。

沙安雷

请关注 Lansaar Research 关于媒体的报道,了解最新的新兴技术和新的商业模式。

[## 沙恩·雷

来自 Shaan Ray 的最新推文(@ShaanRay)。创造新价值和探索新兴技术| ENTJ | #科学…

twitter.com](https://twitter.com/shaanray)

区块链 VS 人工智能

原文:https://towardsdatascience.com/blockchain-vs-artificial-intelligence-3e1c50908ebb?source=collection_archive---------1-----------------------

在当今的科技世界中,有两大趋势是你不能错过的。首先是人工智能(AI)技术的复兴:计算机视觉、自然语言处理和生成、机器翻译以及大规模数据集的处理和分析的进步。促进这种复苏的是不断增加的可分析数据的可用性,以及用于分析的廉价处理能力。这种通过机器学习(ML)【1】实现的人工智能爆炸已经在商业行业实现了一种认识,即利用现代计算资源,你可以教计算机像人类专家一样执行复杂的任务,甚至可能更好。拥有这些资源的公司已经在使用人工智能来提高效率和增加利润:谷歌、亚马逊、脸书、阿里巴巴等。

第二个趋势是高级加密工具和分布式分类账的出现,通常被称为术语区块链或分布式分类账技术。受比特币的影响,区块链目前被一些人誉为完全不同的信任、身份和经济交换社会体系的未来推动者【2】

在这篇文章中,我想勾勒出一个有点夸张的场景,我认为这两种技术在未来会如何与我们互动,以及是什么证明了上面这幅也许令人费解的蝙蝠侠大战超人的画面。

欢迎来到真正的沙漠

谷歌搜索是一项服务,世界上任何能上网的人都可以免费使用。谷歌使用其算法来索引网页,为任何想在网上定位内容的人提供近乎无缝的服务。它所要求的回报是收集和记录你的浏览历史信息的权利,它利用这些信息来 a)更好地了解用户希望在网上看到的内容,将这些信息反馈给谷歌搜索,并在这个过程中改进其搜索引擎服务 b)根据它收集的数据建立的客户档案,帮助客户向你出售更有针对性的广告。

乍一看,这似乎很公平——毕竟,在我们看来,谷歌是一家提供近乎普遍的公共服务的公司,他们不直接向我们收费。直到最近,谷歌的公众形象几乎类似于一个仁慈的慈善组织!多彩、包容、民主、公平——如果他们不得不记录你的一些浏览历史来提供这些,谁会抱怨呢?对消费者来说,谷歌搜索看起来是一笔公平的交易,因为它是一款令人惊叹的免费产品。

还记得那句老话“天下没有免费的午餐”吗?谷歌(顺便说一句,我不是在这里挑出他们,但如果有人可以接受打击,谷歌可以)是一个巨大的商业盈利组织。资本主义的每一笔交易都是基于价值公平交换的原则(+保证金)。如果谷歌免费向你提供这种令人惊叹的网络搜索服务,这意味着你向他们提供的回报成本更高:谷歌不是一个亏损的组织,他们的股票交易良好。从本质上说,谷歌告诉我们的是,我们的数据对他们来说价值 X 亿美元+更多,它非常乐意为我们提供出色的服务,因为它免费获得了我们的所有这些信息!

即使在这个阶段,你可能会回过头来说——没关系,大多数人意识到这里发生了什么,他们仍然很高兴与谷歌签订这份商业合同;这种经济模式并不是秘密。让我们把这个问题搁置一边,因为这不是这里真正的要点,尽管即使在这个阶段,我们也可以说,我们中的一些最脆弱的人(那些使用互联网的人)可能没有完全理解这里正在发生的事情的本质——例如老年人和年轻人。

当你意识到谷歌只是这种企业模式的先驱之一,并且每个主要组织都在使用人工智能,或者很快就会这样做时,你可能会真正开始感到不安。[如果他们不这样做,他们可能会面临倒闭的危险]客户(和其他)数据对任何商业组织都非常有价值,拥有一个人工管家来处理这些数据对商业成功至关重要。

理解为什么会这样的关键是带领我们进入现代人工智能技术的世界——这是一个许多人可能仍然认为是科幻小说的概念。将人工智能视为科幻小说是极其危险的,因为它揭示了人们对谷歌等组织在过去十年中如何建立自己的业务缺乏了解。即使谷歌掌握了世界上所有关于我们的数据,他们也无能为力,除非他们有能力处理这些数据,并从收集的信息中提取价值。鉴于我们在这里讨论的信息量(每个人十年的谷歌搜索历史!),对于任何组织来说,手动处理这些信息的很大一部分,甚至建立一套明确的规则(程序)来自动化该过程都是不可思议的。数据量太大了,任何一个分析师团队&程序员都无法理解和全面调查。他们或许能发现一些规律,但很多趋势和洞见会被遗漏。

现代最大似然算法允许软件进入人类无法独自绘制的领域。利用强大的计算能力,他们可以告诉你的分析师关于客户行为和偏好的令人惊讶的事情:也许你更有可能在去海滩度假的几周前购买你在网上购买的某种产品,或者当你情绪低落时,你更愿意在 1 月份去高端餐厅吃午餐。这是非常周到的谷歌,是的,我会在寒冷的雨天犒劳自己,特别是因为这是本月初,我的工资刚刚到位……唯一的问题是,所有这些“温暖”都是由一个复杂的算法产生的,该算法已经教会自己根据关于你的先验信息和类似消费者在你发现自己所处的各种情况下的行为模式来预测你可能的行动。

我觉得这种形象至少有点令人不安。今天,大多数以改善客户体验的名义使用人工智能技术的大型商业机构,实际上只是忙于为我们创造体验(作为一种体验的广告),在此期间,我们最容易消费他们的产品和服务。当我们看到相关的东西在我们需要的时候突然出现时,我们感觉到的“深思熟虑”是由技术设计的冷理性造成的,最终只为一个目标——最大化使用它的公司的利润。

我并不是说这种“为利润服务”的双重性在任何商业活动中并不总是存在。然而,令人担忧的是,越来越不清楚你是如何、何时被出售的,以及在这样做时施加了何种压力。一个训练有素的销售人员冷冷地给你打电话推销宽带(你知道他们是做销售的,他们有与你大致相似的认知能力,即使他们真的很有才华,可以骗你买一些你并不真正需要的产品),和每个使用网络的人都不断地参与精心制作的数字体验,这些体验是由大型组织构建的,使用高度复杂的专有技术,而你基本上看不到,大多数人不理解或甚至没有意识到这些技术的存在!,并使用您自己的数据,这些数据是您(愿意或不愿意)提供给这些组织的,通常没有考虑这些数据随后如何被用来从您和其他消费者身上获取最大可能的经济价值。

在这一点上,有几个复合因素值得记住。首先,基于 ML 的分析直接有利于拥有最大数据量和计算能力的大型组织。个人在这里处于非常不利的地位,因为他们无法获得这些资源。这加剧了我们今天已经看到的社会权力动态——社会中较富裕的部分变得更富裕,而穷人处于不利地位。直到现在,富人才拥有了利用认知计算技术针对穷人的技术,能够通过计算找出客户“防御系统”中的“弱点”,这通常可能会阻止他们向这些组织发布他们的劳动产品(金钱)。动态定价系统是盒子里一个值得注意的工具。动态定价本质上是一种对商品和服务定价的方法,不是基于这些商品的价值,而是基于任何特定的客户根据其当前情况愿意支付的最大价值。这就是伦敦地铁罢工期间优步费用“激增”的原因。“供求关系!”——优步说—“供给和需求……”

假设没有引入消费者保护法规,上述趋势的逻辑结论是,消费者完全沉浸在一系列体验中,这些体验使他们成为有经济价值的高效变压器【4】:他们挣工资,他们的需求通过算法得到预测,他们以自己能够[勉强]承受的最高价格获得他们需要的一切——就像某种扭曲的资本主义版本的旧马克思主义学说:“各尽所能”我想知道马克思对我们可能达到这种状态的方式会有什么感觉…

关键是在这个阶段不要绝望,而是要问正确的问题:推动这一历史潮流的燃料是什么,我们可以用来引导它的杠杆是什么?在 19 世纪,马克思主义者对这个问题的回答当然是工党。这是等式的一面,而且这是等式的一面,通过 20 世纪的动荡和苦难,人们已经相当好地理解了这一面。然而,当我们经历第四次工业革命时,马克思已经过时了。这是因为世界上有一种他在 19 世纪无法完全欣赏的新力量,这种力量就是数据

数据的价值=劳动的价值

想象一下,我知道你的一切:我可以访问你的所有数据,并有一个机制来理解这些信息并采取行动。在这种情况下,我可以预测你想要的一切(也许是完全准确或接近完全准确)。如果我经营一家公司,可以在你需要的时候向你提供我预测你想要的东西,我将完全垄断你的经济产出(换句话说,我在你的通用钱包中的份额将是 100%,你将把你的收入 100%给我)。即使你能控制你的劳动(马克思主义者的担忧),你仍然无法控制你如何花费这些劳动的回报。换句话说,你将不再是自由人【6】

出于我上面描述的原因,这不再是一个牵强的思想实验了。拥有资源的人越来越容易获得关于个人生活细节的信息,而现代人工智能技术可以有效处理这些信息,以预测如何将这些个人货币化(有效转移他们的劳动力价值)。不同的是,我们在现代社会有劳动保护法。我们离有效的数据保护法还有很长的路要走【7】。因此,目前公司在合法剥削个人方面存在很大的漏洞。正如我们在 20 世纪寻求打击劳动剥削一样,在我们经历第四次工业革命时,我们应该努力结束对个人信息的剥削。

进入区块链

区块链是一个加密的安全的、分散的、分布式的信息数据库。区块链包括不可变的事件记录,网络中的每个参与者都可以对其进行审计。抛开经济和政治网络动态的复杂性【8】,公共区块链理论上是任何人都可以参与的(只要有一定的信息技术水平),并且不受任何中央政党(如政府或商业组织)的管理或控制。它们可以用于网络参与者之间的经济价值转移,就像世界上第一种加密货币比特币一样。

众所周知,比特币是作为一种自由主义实验而产生的,它只在网络空间内组织一个价值交换系统,没有任何权威机构的事先监管。今天,这一实验已经产生了一个稳定的相当规模的替代经济生态系统,它从未受到任何重大方式的黑客攻击或系统性破坏。网络中的参与者都有一个匿名地址,交易对手之间发生的所有交易本质上都是伪匿名的【9】。即使网络中所有账户的结构性交易历史被暴露给社区中的每个人来检查,也没有初步的方法来了解这些账户是否由组织、个人控制,或者使用区块链上可用的信息来确定这些参与者的身份。这允许个人在很大程度上保护他们的个人信息,同时保留他们与他人交换经济和其他价值的能力。

更重要的是,区块链体系允许社会过程的大规模去中心化,以前需要大型可信机构的参与,这些机构必须以一定的规模运营,为客户提供价值,同时在经济上自我维持(产生利润)。区块链也可以被视为大型不透明的数据保险库,其联合许可架构为个人提供了一些最先进的数据加密和安全性,否则他们会将自己的个人信息暴露给他们不(或不应该)信任的网络空间中的各方。事实上,个人信息的公共区块链可以被设计成一个去中心化的古灵阁,拥有数十亿个包含我们是谁以及我们如何以公平的条件参与(由组织和个人参与)的钥匙的个人金库。我们可以想象今天一些基于区块链的原型身份识别系统【10】作为未来进入数字世界的门户。数字参与的第一个原则是为用户提供用一组私钥保护个人信息的基础设施,以及在第三方需要时与他们共享这些信息的平台(或许还包括明确的经济价值和通过智能合同等工具使用这些数据的规则)。这种设置将在网络空间的信息生产者和利用者之间创造一个更加公平的动态平衡。

总之,虽然人工智能系统有助于将权力集中在少数能够获取和处理大量数据的组织手中,但区块链技术有助于个人保护个人信息,同时允许代理人在较小的运营规模上创造和交换经济价值。在这方面,人工智能和区块链技术可以被视为彼此动态对立。这是一个好消息,因为我们现在可能拥有数字氪星石,能够调节我们超人人工智能系统的能力(不管是不是善意的)。区块链也许不是我们想要的英雄,但他们很可能成为我们需要的英雄…

【1】在这篇文章中,我预先假定对 ML 和区块链技术有一些了解。一些好的 AI / ML 介绍可以在这里找到:【https://www.coursera.org/learn/machine-learning

https://www . the guardian . com/technology/2016/jun/28/Google-says-machine-learning-is-the-future-so-try-it-I-self

【2】这里针对区块链/ DLT:

http://www . economist . com/news/briefing/21677228-比特币背后的技术——让不了解或不信任他人的人建立可靠的关系

https://www . BCG . com/区块链/thinking-outside-the-blocks . html

【4】价值的生成(生产)是马克思主义者的忧虑,而价值的转化(消费)是当今资本主义者的忧虑

顺便提一下,这是苏联体制中的一个大问题,因为你实际上无法用你的工资买到任何你想要的东西!

【6】这一点是有争议的。你可以争辩说(矩阵中的一个密码),只要你最终得到你想要的一切,你就不/不应该在乎这种“外在”的自由。在这篇文章中,我并没有对自由意志的本质进行形而上学的讨论,而只是指出,在你的精神被灌输了你所需要的所有产品/经验,而你的劳动/资源却被自动从你身上扣除的情况下,有一些事情可能是“感觉错误的”

【7】例如,英国数据保护法案目前在实践中几乎没有缓解这些担忧

【8】对其中一些问题的详细阐述可以在这里找到,例如:

https://policy review . info/articles/analysis/隐形-政治-比特币-治理-危机-去中心化-基础设施

https://motherboard . vice . com/en _ us/article/比特币不可持续

【9】由于其特定协议中的某些架构选择,比特币并不是区块链系统可能实现的完美例子。可以通过网络外部的各种手段来确定参与者的身份,例如,通过分析账户之间发送的比特币数量、它们的频率以及它们在现实世界中可能对应的可能参与者。最近的研究努力致力于解决这些和其他问题。

【10】例如,Consensys、Tradle、Voatz 等项目

区块链:交易的技术

原文:https://towardsdatascience.com/blockchains-the-technology-of-transactions-9d40e8e41216?source=collection_archive---------6-----------------------

A ledger from 1941.

区块链和交易的未来

区块链技术具有变革性,预计将产生巨大的经济影响,类似于互联网在过去几十年中产生的影响。

由于区块链技术是比特币和其他虚拟货币的核心,至少可以预计它将在未来为更重要的交易媒介提供动力。然而,虚拟货币仅仅是区块链技术的第一个用例。

区块链基础知识

区块链是一个开放的分布式分类账。它使用仅追加的数据结构,这意味着新的交易和数据可以添加到区块链中,但过去的数据不能删除。这导致两方或多方之间的数据和交易的可验证的和永久的记录。这有可能增加透明度和问责制,并积极加强我们的社会和经济制度。

区块链是通过运行软件并将几个节点连接在一起而构建的。区块链不是一个全球性的实体——有好几个区块链。想象一下,在一个高度安全的办公室里有一个由相互连接的计算机组成的网络,这些计算机相互连接,但不连接到互联网。区块链与此类似:它可以有许多连接的节点,但保持完全独立,与其他区块链不同。机构和银行可以根据不同的组织目的构建具有自身特色的内部区块链。

需要共识机制和奖励系统来维护区块链的完整性和功能性。在比特币区块链中,共识是通过“挖掘”达成的,奖励系统是一种协议,在成功挖掘一个区块后,奖励矿工一定数量的比特币。采矿是由解决复杂数学难题的强大计算机进行的。

一旦交易被验证,并被整个网络接受为真实,矿工开始在下一个区块工作。因此,区块链一直在增长(将每个新的块连接到它前面的块)。

The main chain (black) consists of the longest series of blocks from the genesis block (blue) to the current block. Orphan blocks (red) exist outside of the main chain.

对交易的影响

区块链技术将颠覆我们书写和执行合同、执行交易和维护记录的方式。

保存交易记录是所有企业的核心职能。这些记录旨在跟踪过去的绩效,并帮助预测和规划未来。大多数组织的记录需要花费大量的时间和精力来创建,并且创建和存储过程往往容易出错。目前,交易可以立即执行,但结算可能需要几个小时到几天的时间。例如,有人在证券交易所出售一家公司的股票,可以立即出售,但结算可能需要几天时间。同样,购买房屋或汽车的交易可以很快谈妥并签署,但登记过程(核实和登记财产所有权的变化)往往需要几天时间,而且可能涉及律师和政府雇员。在这些例子中的每一个中,每一方维护其自己的分类账,并且不能访问所涉及的其他方的分类账。

The General Register Office in Edinburgh, Scotland.

在区块链上,交易核实和记录的过程是即时和永久的。分类帐分布在几个节点上,这意味着数据会在系统的每个节点上即时复制和存储。在区块链中记录交易时,交易的详细信息(如价格、资产和所有权)会在几秒钟内跨所有节点进行记录、验证和结算。在任何一个分类帐中登记的核实的变化也同时登记在该分类帐的所有其他副本上。由于每笔交易都在所有分类账中得到透明和永久的记录,任何人都可以看到,因此不需要第三方验证。

从虚拟货币到企业使用

比特币背后的区块链是目前最大、最知名的区块链。

以太坊是一个独立的区块链:虽然它支持以太货币,但它也充当一个分布式计算平台,具有智能合约功能。所以,尽管有虚拟货币元素,但它的用途比比特币多得多。比如通过 ico 融资的各行业公司,他们的项目都使用以太坊。

由 Linux 基金会发起的 Hyperledger 项目旨在将许多独立的努力聚集在一起,为企业使用的区块链技术开发开放协议和标准。

Hyperledger is a project with several open source blockchains and related tools to support the collaborative development of blockchain — based distributed ledgers.

这里长期

区块链技术仍处于早期形成阶段,加密货币只是其第一个主要用例。除了加密货币,区块链技术将改变我们交易的方式,以及我们记录和验证交易的方式。这将彻底改变合同,减少资产交换中的摩擦。在接下来的几十年里,区块链技术将渗透到我们的组织和机构中,并塑造我们彼此之间的交易方式。正如互联网继续推动新兴技术一样,我们可以期待在所有行业看到区块链技术的新用例。

沙恩雷

关注 Lansaar Research on Medium,了解最新的新兴技术和新的商业模式。

区块链与传统数据库

原文:https://towardsdatascience.com/blockchains-versus-traditional-databases-e496d8584dc?source=collection_archive---------2-----------------------

为了理解区块链和传统数据库之间的区别,有必要考虑一下它们是如何设计和维护的。

Distributed nodes on a blockchain.

传统数据库

传统数据库使用客户机-服务器网络体系结构。在这里,用户(称为客户端)可以修改存储在中央服务器上的数据。对数据库的控制仍然由指定的机构负责,该机构在提供对数据库的访问之前验证客户端的凭证。由于该机构负责数据库的管理,如果该机构的安全性受到损害,数据可能被更改,甚至被删除。

Traditional Databases.

区块链数据库

区块链数据库由几个分散的节点组成。每个节点都参与管理:所有节点都验证区块链的新增内容,并能够向数据库输入新数据。对于要添加到区块链的节点,大多数节点必须达成共识。这种共识机制保证了网络的安全性,使其难以被篡改。

在比特币中,共识是通过挖掘(解决复杂的哈希难题)达成的,而以太坊则寻求使用利害关系证明作为其共识机制。要了解更多关于这两种共识机制的区别,请阅读我之前的帖子

诚信和透明

区块链技术区别于传统数据库技术的一个关键属性是公共可验证性,这是由完整性和透明性实现的。

  • 完整性:每个用户都可以确保他们正在检索的数据从被记录的那一刻起就没有被破坏和更改过
  • 透明度:每个用户都可以验证区块链是如何随着时间的推移而附加的

A map of Dashcoin masternodes distributed across the world.

CRUD vs Read &写操作

在传统数据库中,客户端可以对数据执行四种功能:创建、读取、更新和删除(统称为 CRUD 命令)。

区块链被设计成一个只追加的结构。用户只能以附加块的形式添加更多数据。所有以前的数据被永久保存,不能更改。因此,与区块链相关的操作只有:

  • 读取操作:这些操作从区块链中查询和检索数据
  • 写操作:这些操作会向区块链添加更多数据

验证和写入

区块链允许两个功能:事务的验证和新事务的写入。事务是改变区块链上数据状态的操作。虽然区块链中过去的条目必须始终保持不变,但新条目可以改变过去条目中的数据状态。例如,如果区块链记录了我的比特币钱包里有 100 万 BTC,那么这个数字就会永久保存在区块链里。当我花了 200,000 BTC 时,那笔交易记录在区块链上,使我的余额达到 800,000 BTC。然而,由于区块链只能被追加,我的交易前余额 100 万 BTC 也永久保留在区块链上,供那些愿意看的人使用。这就是为什么区块链经常被称为不可变的分布式账本。

Centralized vs. peer to peer.

简而言之,不同的是分散控制

分散控制消除了集中控制的风险。任何对中央数据库有足够访问权限的人都可以破坏或损坏其中的数据。因此,用户依赖于数据库管理员的安全基础设施。

区块链技术使用分散的数据存储来回避这个问题,从而将安全性构建到其结构中。

尽管区块链技术非常适合记录某些类型的信息,但传统数据库更适合记录其他类型的信息。对于每个组织来说,在选择一个数据库之前,了解它想要从数据库中得到什么,并根据每种数据库的优势和弱点来衡量这一点是至关重要的。

沙安雷

请关注 Lansaar Research 关于媒体的报道,了解最新的新兴技术和新的商业模式。

[## 沙恩·雷

来自 Shaan Ray 的最新推文(@ShaanRay)。创造新价值和探索新兴技术| ENTJ | #科学…

twitter.com](https://twitter.com/shaanray)

情感分类的最佳嵌入方法

原文:https://towardsdatascience.com/blog-md-34c5d082a8c5?source=collection_archive---------13-----------------------

image from http://houseofbots.com/news-detail/2491-4-5-things-you-need-to-know-about-sentiment-analysis-and-classification

1.背景

你可能认为单词级表示是情感分类任务最有效的特征。但是,这是真的吗?我将展示一个有趣的实验结果,让你大吃一惊。

如果你不想读整篇文章,这里有一样东西你可以带走。如果数据集有许多非正式单词,子单词级嵌入方法对于情感分类是有用的。

本文的其余部分组织如下。

  • 情感分析中使用的嵌入方法适用于 ACL 2018
  • 讨论为什么单词级嵌入如此广泛地用于情感分析
  • 实验设置和结果

你可以在这里找到所有代码:情绪比较

2.ACL 2018 中情感分析的嵌入方法

计算语言学协会(ACL)是一个非常著名的 NLP 会议。如果你扫了一眼 ACL 2018 中的情感分析相关作品,你可能会注意到大部分作品都选择了词级嵌入方法。

单词嵌入方法已经被证明是一种有效的自然语言处理技术。但是除了单词嵌入之外,还有另外两种嵌入方法,字符级嵌入和子单词级嵌入。

word/character/subword representations

我计算 ACL 2018 关于情感分析任务的长论文和短论文。这表明了词级嵌入在情感分析中的广泛应用。

共有 12 篇长论文,5 篇短论文,标题包含关键词“情绪”。根据我们的调查,有 15 篇论文是基于单词级嵌入的,1 篇是基于字符级嵌入的,1 篇是字符级和单词级相结合的。

我在下面列出了所有等级分类的论文。 SP 的意思是短纸。

A .字级:

Word2Vec

  • 为跨领域情感分类识别跨领域的可转移信息
  • SemAxis:一个轻量级框架,用于描述情感之外的特定领域词汇语义
  • 情绪自适应的端到端对话系统
  • 双语情感嵌入:跨语言情感的联合投射
  • (SP)利用文档知识进行方面级情感分类
  • 幽默识别中的情感关联建模

手套

  • 援助之手:用于深度情感分析的迁移学习
  • 冷启动感知用户和产品对情感分类的关注
  • 面向情感分类的目标敏感记忆网络。
  • 面向目标的情感分类转换网络
  • 具有目标领域特定信息的跨领域情感分类
  • 基于特征的门控卷积网络情感分析

组合 Word2Vec,手套

  • (SP)用于改进情感分类的领域适应单词嵌入

学习单词级情感信息

  • 学习领域敏感和情感感知的单词嵌入

无预训练模型(随机生成)

  • 不成对的情感到情感的翻译:一种循环强化学习方法

B .人物等级

  • (SP)用未标记的对话数据预训练情感分类器

C .字级和词级结合

  • 用于情感分类的多情感资源增强注意网络

3.为什么词级嵌入在情感分析中如此受欢迎?

也许我们应该改变这个问题,为什么大多数研究人员不考虑情感分析任务的其他嵌入方法?对于机器翻译、命名实体识别、语言建模等自然语言处理任务,字符级嵌入和子词级嵌入已经显示出巨大的改进。但是对于情感分析任务,这些嵌入方法似乎被忽略了。

我们知道字符级表示和子词级表示的最大优势是处理词汇外(OOV)问题。这是否意味着 OOV 词对于情感分析任务并不重要?

在某种程度上,是的。在情感分类问题中,我们希望提取情感特征来预测一个句子是肯定的还是否定的。但通常情况下,未登录词并不包含有用的情感信息。直观地,情感特征可以在词级表示中被充分提取。这就是为什么情感词典方法可以获得很好的性能。例如,'happy'是一个正面词,词级嵌入方法很容易从上下文中学习到这个情感信息。

至于字符级表示,即使它解决了 OOV 问题,我们也很难说从文本中提取情感特征是容易的。例如,我们可以将'happy'表示为'h', 'a', 'p', 'p', 'y'。情感词被拆分成字符,从这种上下文中提取情感特征变得越来越困难。因为单个字符很难传达情感信息。

子词级表示怎么样?我们可以将子词级的'happy'表示为'hap', 'py',这看起来像是字符级的表示,没有太多的意义。但是,如果我们处理一些包含许多未知单词的数据集,情况可能会有所不同。考虑到这些词'coooool'和‘呜哇’。即使我们知道这些单词包含强烈的情感信息,它们也会在单词级表示的预处理过程中被去除。另一方面,如果我们在子词级表示这些词,'co', 'ooo', 'ol''wo', 'oooo', 'ow',子词级表示可以从'oooo'中捕获情感信息。这些非正式词汇在 Twitter 和 Reddit 等社交网络短信中非常常见。

单词级表示非常紧凑,但存在 OOV 问题,而字符级表示过于稀疏,但不存在 OOV 问题。子词级别的表示法似乎很好地平衡了这两者。因此,如果一个数据集有许多非正式的词,我们认为子词级别的表示能够足够好地捕捉情感特征。为了证明我们的假设,我们进行了一些实验。

4.实验对比

我们选择两个数据集进行比较。对于每个数据集,我们选择三个表示级别。对于每个级别,我们实现了两个深度学习模型,CNN 和 LSTM

  • 两个数据集:电影评论,推特
  • 三个表示级别:单词、字符、子单词
  • 两个深度学习模型:CNN,LSTM

4.1 实验设置

数据集

我们使用两个数据集进行实验。两个数据集都是关于二元情感分类的。一个是影评数据集,可以从句子极性数据集 v1.0 下载。还有一个是 Twitter 数据集,你可以从网页下载。

使用 LSTM 来训练整个 Twitter 数据集将花费太长时间(一个纪元 9 个小时!),所以我们取 50,000 个样本作为小数据集,用于 CNN/LSTM 比较,并在整个数据集上训练 CNN。

嵌入方法

对于每个数据集,我们将在单词/字符/子单词三个嵌入级别上进行实验。

word/character/subword representations

A.单词级嵌入

在这一级,我们将预先训练的单词嵌入(手套嵌入)作为单词向量。单词级的数据预处理非常简单。首先我们用data_helpers.load_data_and_labels ( 源代码)加载和清理数据,然后用 keras 函数对文本进行分词和填充。在我们知道最大长度之后,我们在填充过程中将maxlen设置为 56。

Jupyter 笔记本:单词级-预处理-电影

对于 Twitter 数据集的预处理,清理有更多的步骤。

  • HTML 解码
  • 删除@提及
  • 删除 URL 链接
  • 拉丁 1 BOM(字节顺序标记),用?替换签名字符
  • 删除标签和数字

我们将清理后的数据集保存为clean_tweet.csv

Af 首先我打算使用拼写校正来预处理文本,但是拼写校正算法的输出似乎不够好,所以我没有使用拼写校正。如果你对拼写校正感兴趣,那么文本块已经实现了我上面提到的拼写校正算法。你可以在 beblow notebook 中找到拼写纠正的输出。

Jupyter 笔记本:单词级-预处理-twitter

B.字符级嵌入

因为我们使用字符级表示,所以电影评论数据集的预处理非常简单。

我们总共有 70 个角色:

abcdefghijklmnopqrstuvwxyz 0123456789,;。!?:'"/\|_@#$%^&*~`+-= <> ()[]{}

在这一关,我们采用三种不同的方法为每个角色分配向量。首先是一键编码。我们给每个字符分配一个热点向量。我们需要将embedding_weights传递给嵌入层。embedding_weights是包含每个字符的所有向量的矩阵。

如果您不熟悉 one-hot 编码,这里有一篇很棒的文章适合您。如何用 Python 对序列数据进行热编码

第二种方法是我们生成随机值作为每个字符的向量。当初始化嵌入层时,我们不会将embedding_weights传递给weights参数。

第三种方法是我们使用预训练字符嵌入。这里我用手套字嵌入生成字符嵌入。这个脚本可以帮助我们完成这项工作, create_embeddings.py 。然后我们会得到一个包含字符嵌入的文件。在初始化嵌入层时,我们用其他字符嵌入的平均值手动设置空格字符,用随机值设置未知字符。

我用 CNN 模型对电影评论数据集实现了这三种方法。结果表明,随机初始化方法的性能最好。所以我对所有角色级别的实验都使用随机初始化。

你可以在这个目录中找到三种嵌入方法。

Jupyter 笔记本:字符级-预处理-电影

至于角色级表示的 Twitter 数据集,预处理比电影评论数据集简单。字符级表示可以处理未知单词和非正式单词。因此,没有必要删除标点符号和纠正拼写。

我们将清洗后的数据集保存为clean_tweet_char.csv经过预处理后,有些样本可能会变成 NAN,所以在加载数据集时,我们应该删除 NAN 样本。

Jupyter 笔记本:字符级-预处理-推特

C.子字级嵌入

至于子词级预处理,我们从 BPEmb 下载 vocab 和预训练的子词嵌入格式。我选择合并操作为 25000 和 50 dims。下面是一个简单的脚本,用于将句子分割成子单词级别的表示, bpe.py

朱庇特笔记本:

4.1.3 深度学习模型

对于每个级别,我们采取两种深度学习模型。一个是 CNN,我们实现了 Kim 的 CNN 卷积神经网络的修改版本,用于句子分类。你可以在这里查看我的实现,CNN-text-class ification

下面列出了修改版本的超参数。

设置修改的嵌入维度 50 过滤器大小(3,8)过滤器数量 10 池化最大池化

第二个模型是 LSTM,我们堆叠了两个 LSTM 层。

4.2 实验结果

我们将结果总结在下表中。

4.3 观察和分析

对于情感分类的不同组合有一些观察。

  • 在 Twitter 数据集中,子词级表示比词级表示具有更好的性能。这和我们的假设是一样的。如果数据集包含少量非正式单词并且预处理良好,则单词级嵌入确实在情感分类中实现了最佳性能。但是,如果数据集包含太多的非正式单词,子单词级嵌入可以获得比单词级嵌入更好的结果。
  • CNN 比 LSTM 好。在小型 Twitter 数据集上,子词级表示获得了最佳性能。尽管 CNN 和 LSTM 的准确率非常接近,但考虑到 CNN 的训练速度非常快,毫无疑问,CNN 是比 LSTM 更好的选择。
  • 字符级表示在三个表示级别中准确性最低。原因可能是字符嵌入缺少良好的预训练字符向量。CNN/LSTM 很难从人物层面捕捉情感信息。

5.摘要

这一次,我没有在优化超参数上花费太多时间。LSTM 模式可能过于简单。但是这个实验仍然表明子词级表示对于情感分类是有用的,特别是对于非正式文本。所以对于情感分析分类来说,子词-词嵌入是一个很好的选择。

你可以在这里找到所有代码:情感对比

查看我的其他帖子 中等 一分类查看
GitHub:
bramble Xu LinkedIn:徐亮 博客:bramble Xu

忽悠机器人——机器学习中的关键术语词汇表

原文:https://towardsdatascience.com/bluff-the-bots-a-glossary-of-key-terms-in-machine-learning-3d528c8d86f4?source=collection_archive---------8-----------------------

这是一系列文章的第五部分,也是最后一部分,旨在让没有受过技术培训的人更容易理解机器学习。以前的文章介绍了机器学习的概念,展示了学习的一般过程,并描述了常用的算法。你可以在这里开始系列。

Knowing a few key terms can avoid you feeling like this when discussing Machine Learning

为了总结这个系列,我在下面提供了一个基本机器学习术语和概念的词汇表。这不是详尽无遗的(否则它会打破媒体!),但它包含了该领域中许多最基本的术语。如果你经常与数据科学家交谈,或者阅读关于机器学习结果的报告,可以考虑用书签标记或打印这篇文章。

准确性 —由分类算法正确预测的所有实例的比例。

算法 —解决问题的过程,通常在机器学习上下文中理解为迭代的计算机程序。

关联 —基于确定的统计关系链接对象的过程。

AUC —概率分类器的 ROC 曲线下的面积。AUC 是分类器强度的指标,强分类器通常达到 80%或更高的 AUC。

分类 —将对象分配到预定义的组或类中的过程。

混淆矩阵 —一个 2×2 阵列,用于说明分类算法中的准确性和误差。也称为误差矩阵或列联表。

列联表——见混淆矩阵。

决策树 —决策制定的嵌套过程,采用带有分支的树的形状,由特定算法建模。

离散分类器 —一种分类算法,输出实例是哪个类的成员。

误差 —监督学习算法的预测输出与期望(或实际)输出不匹配的程度。在分类上,这只是一些不正确的预测。

误差矩阵 —参见混淆矩阵。

假阴性 —在分类学习中,这是一种与真实数据不一致的阴性预测。

假阳性 —在分类学习中,这是一种与真实数据不一致的阳性预测。

FP 率 —假阳性率。在分类算法中,被错误地预测为正的负实例的比例。

推广 —在监督学习中,将算法应用于训练集之外的新数据。

基尼系数——参见 AUC。基尼系数是衡量财富分配的宏观经济指标,与 AUC 线性等价,有时用于替代 AUC。基尼系数= 2 x AUC-1。

超平面 —在线性代数和几何中,这是将线或平面的概念推广到更高维度的空间。在 n 维空间中,超平面是 n-1 维的子空间。

归纳偏差 —在监督学习中,数据科学家做出的关于哪种类型的算法或函数最适合训练数据的假设。

输入属性 —用于监督学习的训练集中的样本的数据点或属性。

线性可分性——多维空间中存在可以将数据分成类的线或“超平面”。

洛伦兹曲线 —绘制累积概率分布的曲线。ROC 曲线是洛伦兹曲线。

最一般的假设 —在监督学习中,这是将训练数据拟合到“最宽松”程度的函数。

最具体的假设 —在监督学习中,这是将训练数据尽可能“紧密”拟合的函数。

朴素贝叶斯分类器 —围绕基本概率计算运行的简单分类算法。

噪声 —数据中隐藏潜在关系或结构的不必要的异常。

在线学习 —学习过程中自我修正的过程。执行在线学习的算法将在学习过程中优化解决方案,使得最终输出是给定参数的可能的最佳结果。

过拟合 —在监督学习中,由于算法过于复杂而导致的新数据错误。

精度 —在分类算法中,正确的预测正例的比例。

概率分类器 —一种分类算法,输出一个实例是某类成员的概率。

回忆 —参见 TP 率。

递归分割 —决策树算法中使用的一种过程,根据数据与结果的概率关系,将数据重复分成更小的子集。

强化学习——通过“尝试”一种反应来学习,并根据反应是否是期望的反应来进行“惩罚”或“奖励”。

ROC 曲线 —绘制在 ROC 图上的曲线,用于说明概率分类器的 TP 率和 FP 率之间的关系。

ROC 图 —接收操作员特性图。用于绘制分类算法有效性的二维图表,通常在 x 轴上显示 FP 率,在 y 轴上显示 TP 率。

灵敏度 —见 TP 速率。

特异性 —在分类算法中,被正确预测的否定实例的比例。特异性= 1 — FP 率。

监督学习 —从包含特定“答案”或结果的数据样本中学习,并使用它来预测新数据的结果。

支持向量机 —一个分类算法家族,将数据绘制到多维空间中,并试图找到类别之间的分界线或“超平面”。

测试集 —在监督学习中,用于计算算法误差的一组数据。

TP 率 —真阳性率。在分类算法中,被正确预测的正例的比例。也称为回忆或敏感。

训练集 —监督学习算法将从中学习的数据集。

真否定 —在分类学习中,这是一个与真实数据一致的否定预测。

真阳性 —在分类学习中,这是与真实数据一致的阳性预测。

欠拟合 —在监督学习中,由于算法过于简单而导致的新数据错误。

无监督学习 —在不期望特定“答案”或输出的情况下,学习数据中的潜在关系或结构。

验证集 —在监督学习中,一组用于测试已在训练集上训练的算法的泛化能力的数据。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在LinkedIn上或者在Twitter上找我。**

模糊的界限:数据分析师 vs 数据科学

原文:https://towardsdatascience.com/blurred-lines-data-analytics-vs-data-science-12ff92a3bd4e?source=collection_archive---------5-----------------------

在数据呈指数级增长的世界里,公司正转向两种工作来解决一些最大的问题,数据分析师(或 BI 工程师)和数据科学。然而,越来越明显的是,商业世界不确定如何恰当地定义范围和区分这些角色。数据科学家连续三年被列为美国第一职业,这并不奇怪。分析经理排在第十位。数据科学和分析已经存在了一段时间,但这些角色是为大公司保留的,主要是那些拥有大量数据的公司(如脸书、谷歌、通用电气、投资银行等)。)如今,几乎所有公司都在以某种形式收集数据,但他们没有梳理数据所需的专家。这些公司的高管很可能听说过数据科学家和分析的时髦词汇,对这些角色的实际工作只有粗略的了解。

如果你看看这些天的就业公告板,全美有数千个职位空缺。更常见的是,你看到的不是数据科学家的工作描述,而是最接近分析师角色的定义。相反的情况也是如此,但这种情况更为罕见。

让我们理清思路,将数据科学家和数据分析师区分开来。

数据科学家,真正的独角兽。

对于那些没有听说过这一点的人来说,这是对该领域所用角色的常见描述。真正的数据科学家具备这些技能:

  1. 强——商业头脑
  2. 强—数学/统计
  3. 强——计算机科学/甩代码的能力

独角兽是在这三方面都很完美的人。这种情况很少发生。最有可能的情况是某人缺乏或在三者之一上较弱。

数据分析师,让我看看我的生意。

数据分析非常相似,他们拥有以下技能:

  1. 强——商业头脑
  2. 中等—数学/统计
  3. 中等——计算机科学/甩代码的能力

如您所见,数据科学需要在这三个方面都具备很强的技能。然而,这两个角色需要相同的技能。最大的区别是他们如何应用这些技能。让我们澄清误解。

数据科学家与数据分析责任

数据科学家-

  1. 探索性数据分析
  2. 清理脏数据
  3. 使用无监督机器学习识别数据趋势
  4. 使用监督机器学习,根据数据趋势进行预测
  5. 编写代码来帮助数据探索和分析
  6. 向技术/工程部门提供代码,以便在产品中实施

数据分析师-

  1. 探索性数据分析
  2. 清理脏数据
  3. 管理数据仓库和 ETL(提取转换负载)
  4. 制定 KPI 以评估绩效
  5. 通过使用 BI 平台(即 Tableau、DOMO、Sisense、Looker 等)开发数据的可视化表示。)

你能看出最大的不同吗?数据科学家利用他们强大的统计知识来创建趋势识别,并对某些事情做出预测。他们需要具备真正理解数据中肉眼无法识别的元素的技能。数据科学家测试数据上的多个假设,以确定数据中的相关性或趋势是随机的还是显著的,谁知道 P 值?另一方面,数据分析师必须理解数据,净化数据,然后向业务决策者提供数据的可视化表示。

以下是其他一些差异,主要是每个角色所需的工具

https://www.edureka.co/blog/difference-between-data-scientist-and-data-analyst/

我发现,在实践中,许多数据分析师并不具备工作所需的技能。数据分析师需要统计知识(IMHO)。如果没有这方面的知识,KPI 或可视化数据表示可能会被错误陈述和误导。相关性并不意味着因果关系。这句话应该深深印在每个数据分析师的记忆中。招聘数据分析师时,争取那些有良好数学或统计背景的候选人。这很关键。

我希望这篇文章能够帮助那些目前在这些领域工作的人,以及那些希望招聘这些职位的人。这两者都需要几乎相同的技能,但是这两个角色之间有一个关键的区别。企业需要确保他们不会模糊界限。

如果你有任何反馈或想法,请在评论中分享。

宝马机器学习周刊—第 3 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-414a2519363c?source=collection_archive---------0-----------------------

2018 年 3 月 1 日至 3 月 7 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

ML 使新的欧盟数据隐私法规的影响复杂化

将于 2018 年 5 月 25 日生效的关于个人数据的欧盟新法规通用数据保护法规 (GDPR),可能很难与 ML 技术相结合。该法规的关键主题是每个人都拥有自己的数据。因此,任何公司都必须明确请求允许使用任何个人数据,并解释为什么要这样做,以及使用多长时间。后来,这种许可可以随时撤销。令人担忧的是,要解释普通消费者的个人数据如何被用来训练算法以推断其他人的结果,可能会变得很成问题。即使消费者同意,消费者也可以在任何时候获得这种许可,这在技术上可能需要 ML 算法来“忘记”(从而忘记)个人的特定数据如何适应算法的学习。

继续阅读……

美国军方的军情六处

谷歌与美国国防部合作,帮助该机构开发人工智能算法,使用 TensorFlow 分析无人机镜头。根据五角大楼的消息,“Maven”项目的最初目标是为军方提供先进的计算机视觉,能够自动检测和识别由无人机的全运动摄像机捕捉的多达 38 类物体。Maven 为该部门提供了跟踪来自不同地点的个人的能力。这项合作在这个技术巨头的员工中引发了一场轩然大波,因为该项目提出了关于 ML 开发和使用的重要伦理问题。

继续阅读……

当香蕉看起来像烤面包机

(或者,服用致幻剂的人工智能)越来越成为一个问题。对抗性的例子是特别设计的视错觉,欺骗计算机认为它们认识到了一个物体的某些东西,而这个东西并不是。例子从把步枪的图片误认为直升机把香蕉误认为烤面包机在香蕉上贴了一个标签后,混淆了计算机视觉系统。
研究人员——包括生成对抗网络(GANs)的创始人 Ian good fellow——发表了一篇论文,他们在论文中透露,他们已经能够生成第一批照片,这些照片可以愚弄人类和计算机视觉算法。寻找无法欺骗人类大脑的改变图像的研究对于自动驾驶等现实生活中的用例非常重要。一个系统能看到每一个停车标志是必要的,不管它被改变了多少。

继续阅读……

值得注意的

  • 将汽车变形为直升机
    日内瓦车展:意大利设计公司、空中客车公司和奥迪公司合作展示了一款双座智能汽车大小的单体车,它可以像普通汽车一样在轮子上行驶,或者在一个巨大的无人机模块的帮助下,被吊到空中进行垂直飞行。阅读更多…
  • 将人工智能带到机场
    科技公司 SITA 透露了让人工智能接管机场行李管理的计划。目的是最大限度地减少行李丢失和处理不当的数量。同样,Unisys 软件正在将 ML 算法引入边界控制
  • 再见绿屏,你好 AI!谷歌将专业水平的视频编辑技术引入手机,用 IA 工具取代绿色屏幕。目前,该工具处于有限的测试模式。阅读更多…
  • 探索历史生活照片
    使用人工智能对数百万张历史生活照片进行分类,谷歌发布了一个漂亮的工具来创建一个新的、可搜索的生活照片档案。阅读更多…

宝马机器学习周刊—第 2 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-b426bf5d823a?source=collection_archive---------8-----------------------

2018 年 2 月 22 日至 2 月 28 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

CIMON:外层空间援助系统

德国宇航员兼科学家亚历山大·格斯特将于今年 6 月搭乘火箭前往国际空间站,他将带来一位不同寻常的朋友:一个会飞、会说话的智能机器人。由空中客车建造的,CIMON(机组人员互动移动伴侣)将是第一个基于人工智能的任务和飞行辅助系统。CIMON 运行在 IBM 的 Watson AI 版本上,并被训练识别 Gerst 的声音和外观,以便在宇航员在空间站上进行一些实验时提供帮助。CIMON 的主要任务是完成三个目标:在太空中进行晶体生长实验,解决一个魔方,以及“使用 CIMON 作为‘智能’飞行相机进行复杂的医学实验”,以监视空间站宇航员,帮助评估他们的情绪状态和心理“群体效应”(这一功能可以帮助更好地设计数月或一年的月球或火星之旅)。

继续阅读……

ML 有助于发现贫困

斯坦福发表了一篇关于 ML 模型的论文,其中某个地点的人均消费支出是使用高分辨率的日间和夜间卫星图像计算的。这种技术应该有助于目前的贫困绘图方法,这种方法更费时,而且严重依赖第一手调查数据。机器学习算法比较一个地区白天和夜间图像中的光线,以预测其经济活动——这是一种被称为迁移学习的技术。使用夜间图像作为参考,该算法选择一个光线充足的区域,并与白天的图像进行交叉检查,以确认其基础设施的发展。夜晚更明亮的区域通常意味着更多涉及电力的活动,因此该地区更富裕。在做出最终判断之前,该模型会用调查数据反复检查其视觉观察结果,以提高其准确性。然后,它可以根据所有以前的评估来预测该地区的贫困分布情况。

继续阅读……

人工智能算法判断自己的视频制作技能

科学报道称,一种使用两个神经网络的新人工智能模型能够从文本线索中创建原始视频剪辑。一个神经网络基于一个场景的简短、键入的描述(如“在草地上打高尔夫球”)或来自训练数据的组合不同概念(如“在雪上航行”)来创建视频。然后,第二个神经网络评估第一个神经网络的输出是否真实,以便对其进行改进。麻省理工科技评论这种人工智能算法是其201810 项突破性技术之一。从文本中自动生成视频对于为自动驾驶汽车创建大量合成训练数据非常有用。本周在互联网上狂欢的其他有趣的人工智能增强视频是例如硬核 Anal Hydrogen 的音乐视频Jean-Pierre 的。根据 Sploid 的说法,该视频是使用深度梦境、神经风格转移和光流等人工智能软件创建的,这些软件在处理后的帧之间创建了无缝过渡。

继续阅读……

值得注意的

  • www . untrusty . con
    ML 可以嗅出可疑网址的蛛丝马迹,防止你被网络钓鱼。互联网上充斥着以窃取用户信息或在受害者的机器上安装恶意软件为唯一目的的网站。一个名为 URLNet 的新系统使用神经网络来查看网站 URL 中的字符级和单词级组合,以检测它是否是一个有风险的网站。阅读更多…
  • 纽约市长将宣布成立一个新的“自动决策系统”工作小组,这是美国第一个工作小组,将建议一个城市机构应该如何对使用人工智能和人工智能算法以及其他先进的计算技术做出重要决策负责。阅读更多……
  • 生产 Vespa 踏板车的意大利公司 Piaggio 正在制造一种货运机器人,帮助行人搬运用手无法搬运的重物。小机器人 Gita 自动跟随它的主人,拖着杂货或园艺家,而人类操作员在前面漫步,自由地打电话或吸香烟。阅读更多…
  • 人工智能的游戏策略:精心策划的自杀
    来自弗赖堡大学的 ML 研究人员最近发表了论文关于人工智能通过一种叫做“进化策略”的试错技术进行学习,并与八款雅达利游戏进行了较量。它的方法逐渐改变了处理任务的方式,抓住成功的诀窍,抛弃那些不起作用的。研究人员发现,他们的算法发现了一个可以利用来获得积分的软件漏洞,以及一个精心策划的自杀让它在游戏中前进的技巧。阅读更多…

宝马机器学习周刊—第 11 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-11-8bb37cc821b3?source=collection_archive---------9-----------------------

2018 年 5 月 24 日至 6 月 6 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

认识一下诺曼:世界上第一个精神病 AI

根据一项新的研究,麻省理工学院的科学家训练了一种被称为“诺曼”的人工智能算法,使其成为一名精神病患者,只需将其暴露于可怕的死亡和暴力的可怕 Reddit 图像。以阿尔弗雷德·希区柯克 1960 年电影惊魂记中安东尼·博金斯的角色命名,这个人工智能在接受罗夏墨迹测试之前,只被输入了连续的暴力图像流。(罗夏墨迹测验的基本思想是,当一个人看到一个模糊的、无意义的图像时,大脑会努力给图像赋予意义。这被认为是一种性格测试。)诺曼探测到的图像产生了对电击和超速汽车死亡的怪异解释,而标准的人工智能只会看到雨伞和婚礼蛋糕。麻省理工学院研究的目标是证明用于教授 ML 算法的输入方法可以极大地影响其后来的行为。科学家们认为,当算法被指责有偏见或不公平时,比如脸书新闻或谷歌照片的高调案例,“罪魁祸首往往不是算法本身,而是输入其中的有偏见的数据。”

继续阅读……

照片的隐私过滤器

随着对社交网络上隐私和数据安全的担忧日益加剧,多伦多大学的研究人员创造了一种算法,可以动态扰乱面部识别系统。由于隐私是一个现实问题,随着面部识别变得越来越好,这种反面部识别系统可以有利于打击这种能力。他们的解决方案利用了一种叫做对抗训练的深度学习技术,这种技术让两种人工智能算法相互对抗。设计了两组神经网络:第一组用来识别人脸,第二组用来扰乱第一组的人脸识别任务。这两者不断斗争和相互学习,建立了一个持续的人工智能军备竞赛。除了禁用面部识别,新技术还会破坏基于图像的搜索、特征识别、情感和种族估计,以及所有其他可以自动提取的基于面部的属性。接下来,该团队希望通过应用程序或网站公开隐私过滤器。

继续阅读……

人工智能可以像人类一样准确地识别野生动物

从印度的老虎到非洲的土豚,运动传感器摄像机越来越多地被用于追踪全球的野生动物。但是梳理这些系统捕获的数百万张图像是一项耗时的任务。现在,科学家们发现,人工智能在识别这些基本上未开发的照片库中的物种方面,与人类志愿者一样有效,而且更快。在本周发表在美国国家科学院 学报 上的一项新研究中,由怀俄明大学计算机科学家 Mohammad Sadegh Norouzzadeh 领导的一个研究小组测试了一种称为深度神经网络的人工智能是否能够正确识别和计数物种,确定动物的年龄,并对它们的行为进行分类。他们使用快照塞伦盖蒂数据集的 320 万张图像分析了人工智能的能力,该数据集包含自 2011 年以来坦桑尼亚塞伦盖蒂国家公园 225 个相机陷阱的照片。

继续阅读……

值得注意的

  • 微软将一堆服务器沉入苏格兰海岸的海里以保持冷却。这个想法是利用海水作为自然冷却剂,帮助减少运行中心所需的能源。阅读更多…
  • 弹琴:机器还是人
    听听由机器和人演奏的肖邦。
  • 用自然语言处理(NLP)预测股票市场
    微软的一个研究团队试图用 NLP 来预测股票表现,以解释收益发布,并采取措施通过删除停用词、标点符号和其他昙花一现的词语来净化输入。然后,该模型试图找出新闻稿的语言内容与随后对股价的影响之间的关系。阅读更多…
  • 葡萄酒商店 Bright Cellars 正在将同样的概念应用到葡萄酒上,就像 Spotify 和网飞对音乐和电影所做的那样:他们的葡萄酒配对算法通过让会员参加一个简单的测试,将会员与他们理想的葡萄酒匹配起来。阅读更多…

宝马机器学习周刊—第 12 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-12-9187154a777f?source=collection_archive---------8-----------------------

2018 年 6 月 7 日至 6 月 20 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

透过墙壁看人

麻省理工学院的计算机科学和人工智能实验室(CSAIL)开发了一种无线智能家居系统,可以通过墙壁感知人们。人工智能系统是利用无线电信号和人们走动的视频片段进行训练的。这使得使用神经网络生成简笔画来显示人们在墙后做什么成为可能。该系统还可以可靠地区分不同的人。该团队表示,项目“ RF-Pose ”可用于监测帕金森氏症、多发性硬化症(MS)和肌肉萎缩症等疾病,从而更好地了解疾病的进展,并允许医生相应地调整药物治疗。它还可以帮助老年人更加独立地生活,同时为跌倒、受伤和活动模式的变化提供额外的安全监控。该团队目前正在与医生合作,探索 RF-Pose 在医疗保健方面的应用。

继续阅读……

无人机发现人群中的暴力

“天空之眼”是剑桥大学和印度国家理工学院和科学研究所的一个研究项目,使用无人机来发现人群中的暴力。使用的无人机是一个标准的 Parrot AR 2.0,其摄像头提供了一个人工智能分散网络平台,提供了必要的现场镜头。ScatterNet 的深度学习网络从那里开始:它可以有效地估计每个检测到的人的姿势。一旦做到这一点,它就可以区分帧中潜在的暴力对象和人群中正常移动的对象。该项目仍处于早期阶段,因为据报道,每增加一个人群成员,检测的准确性都会受到很大影响。虽然该系统声称可以以超过 94%的准确率识别 10 人组中的暴力个人,但一旦人群中有两个这样的人,准确率就会下降到 90.6%,如果有五个,准确率就会下降到 84%。

继续阅读……

ML 能识别有趣的数学吗?

数学的奇妙特性之一是它的美。但是数学家所说的美到底是什么意思却很难捕捉到。也许最著名的例子是欧拉关系,eiπ + 1 = 0,它揭示了看似不相关的数学领域之间的深刻联系。其他迷人的整数序列还有质数,只能被自己和 1 整除的数;或者是斐波那契数列,其中每一项都是前两项之和。这也指出了数学美的另一个组成部分:数学模式一定在某些方面很有趣。识别这些有趣的模式一直是人类独有的能力。但是最近几年,机器已经成为非常强大的模式识别工具。事实上,它们已经开始在人脸识别、物体识别以及各种游戏角色方面超越人类。这提出了一个有趣的可能性:机器学习算法能识别数学中有趣或优雅的模式吗?他们甚至可能是数学美的仲裁者吗?

继续阅读……

逆转狗的衰老

世界上最有影响力的合成生物学家,哈佛医学院的乔治·丘奇,是一家新公司的幕后策划者,该公司计划利用基因疗法使狗返老还童。如果成功,他计划在人身上尝试同样的方法,他可能是第一批志愿者之一。该公司已经对比格犬进行了初步测试,声称它将通过给动物的身体添加新的 DNA 指令来使它们变得“更年轻”。它的年龄逆转计划建立在简单生物如蠕虫和苍蝇的诱人线索上。调整他们的基因可以让他们的寿命延长一倍甚至更多。其他研究表明,给老老鼠输年轻老鼠的血可以使一些生物标志物恢复到年轻水平。“我们已经在老鼠身上做了一系列试验,我们也在狗身上做了一些,然后我们会转移到人类身上,”丘奇今年早些时候告诉播客 Rob Reid。该公司的其他创始人、首席执行官丹尼尔·奧利弗和科学带头人诺亚·戴维森(Noah Davidsohn)拒绝接受本文采访,他是丘奇庞大的波士顿实验室的博士后。

继续阅读……

值得注意的

宝马机器学习周刊—第 13 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-13-718594a1a200?source=collection_archive---------7-----------------------

2018 年 6 月 21 日至 7 月 4 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

由于自动驾驶汽车,交通堵塞更加严重?

世界经济论坛和波士顿咨询集团发布了一份报告,讲述了一项为期三年的合作,探索自动驾驶汽车如何重塑城市交通的未来。他们进行了消费者研究,并与波士顿市合作,通过在该市测试自动驾驶汽车来评估自动驾驶汽车在该市的影响,并制定该市如何促进这项技术以实现其移动目标的战略。结果是一个交通模拟模型,通过这个模型,他们发现自动驾驶汽车可以导致城市中心区的交通流量增加 5.5%的。虽然道路上的汽车总体上将会减少,但拥堵将会加剧,因为通勤者可能会选择新车而不是公共交通工具。然而,波士顿的其他地区实际上交通流量有所下降。为了防止波士顿等城市地区出现更多拥堵,该报告建议降低自动拼车者的价格,将停车场转变为上下车区,并开辟自动驾驶专用车道。

继续阅读……

峰值屏幕

在过去十年的大部分时间里,由智能手机主导的科技行业一直在追求一个单一的目标,即完全征服我们的眼睛,这让我们的手机屏幕越来越大。但我们似乎已经到达了一个被称为“峰值屏幕”的地方,科技巨头们开始构建一些新东西的开端:一个不那么坚持视觉化的科技世界,一个依赖语音助手、耳机、手表和其他可穿戴设备来减轻我们眼睛压力的数字景观。取决于这些技术如何发展,一个需要我们更少眼睛的数字生态系统可能对每个人都更好——更少沉浸感,更少上瘾,更有利于多任务处理。多年来,我们已经在汽车上看到了这一点:通过将内部控制放在触摸屏上,而不是触觉旋钮和开关上,汽车制造商已经使车辆变得更加令人讨厌和危险。特斯拉 Model 3 将这一点发挥到了荒谬的程度。正如一些评论者的哀叹,几乎每一个汽车控制器——包括侧镜的调节——都需要通过屏幕进行操作。为了迈向“辉煌的小屏幕未来”,科技行业需要想出其他不那么身临其境的方式来与数字世界互动:语音助手。

继续阅读……

预测放射性沉降物的分布

当核电站事故发生,放射性物质被释放时,尽快疏散附近的人们是至关重要的。然而,很难立即预测放射出的放射性物质会停留在哪里,因此不可能防止大量人员受到辐射。东京大学的研究人员发表了一篇论文,展示了他们基于 ML 的工具,该工具可以提前 30 小时预测核电站的放射性排放物将分散到哪里。在使用先前天气模式的大量数据进行训练后,该工具始终达到 85%以上的预测准确率,在大型和可预测的天气系统占主导地位的冬季,预测准确率高达 95%。这个工具可以在福岛和切尔诺贝利这样的灾难发生后帮助紧急疏散。

继续阅读……

值得注意的

  • Google Duplex:一种听起来像非常怪异、善良的人类的人工智能
    去年 5 月,谷歌展示了其经过重组的听觉人工智能,它可以帮助你与仍然接听电话的人联系。观看谷歌的视频来了解一下类似人类的听觉人工智能听起来是什么样的。阅读更多…
  • 来自斯坦福大学的科学家发表了一篇关于他们创建 Atom2Vec 的论文。Atom2Vec 设法在几个小时内复制了元素周期表——这是一个人类花了近一个世纪反复试验的壮举。阅读更多…
  • 人工智能能够团队合作再次,五种不同的人工智能算法联手在 Dota 2 这款流行的策略电脑游戏中击败人类。这证明了算法能够通过协作和团队合作来战胜人类团队。下一个挑战将是开发能够在涉及通信的游戏中获胜的人工智能,如外交或卡坦半岛的定居者,其中合作与竞争之间的平衡对成功至关重要。阅读更多…

宝马机器学习周刊—第 14 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-14-f0eae8ce33d8?source=collection_archive---------14-----------------------

2018 年 7 月 5 日至 7 月 18 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

脸书的艾游客

如果你在纽约迷路了,没有智能手机或地图,你很可能会向当地人问路。脸书的研究人员正在训练人工智能程序做同样的事情,他们希望这最终能使他们更好地使用语言。纽约的脸书人工智能研究小组创建了两个人工智能程序:一个是在纽约迷路的“游客”,另一个是通过提供自然语言指令来帮助其同伴算法找到路的“向导”。迷路的游客看到的是真实世界的照片,而“导游”看到的是带有地标的二维地图。他们一起承担着到达特定目的地的任务。这个想法是,通过学习指令如何与现实相关,游客算法将开始找出这些东西实际上是什么。人工智能研究人员希望以这种方式教授的算法在使用语言时会更加复杂,这对人工智能来说仍然是一个巨大的挑战。

继续阅读……

人类智能:伪人工智能

在过去十年的大部分时间里,由智能手机主导的科技行业一直在追求一个单一的目标,即完全征服我们的眼睛,这让我们的手机屏幕越来越大。但我们似乎已经到达了一个被称为“峰值屏幕”的地方,科技巨头们开始构建一些新东西的开端:一个不那么坚持视觉化的科技世界,一个依赖语音助手、耳机、手表和其他可穿戴设备来减轻我们眼睛压力的数字景观。取决于这些技术如何发展,一个需要我们更少眼睛的数字生态系统可能对每个人都更好——更少沉浸感,更少上瘾,更有利于多任务处理。多年来,我们已经在汽车上看到了这一点:通过将内部控制放在触摸屏上,而不是触觉旋钮和开关上,汽车制造商已经使车辆变得更加令人讨厌和危险。特斯拉 Model 3 将这一点发挥到了荒谬的程度。正如几位评论家的哀叹,几乎每一个汽车控制器——包括侧镜的调节——都需要通过屏幕来操作。为了迈向“辉煌的小屏幕未来”,科技行业需要想出其他不那么身临其境的方式来与数字世界互动:语音助手。

继续阅读……

人工智能可以修复你粗糙的照片

来自英伟达、阿尔托大学和麻省理工学院的研究人员开发了一种深度学习算法,该算法已经学会修复照片:删除文本和水印或修复颗粒状照片分辨率。研究人员使用特斯拉 P100 GPU 和 TensorFlow 深度学习框架来训练算法 Noise2Noise。Noise2Noise 使用图像的有噪版本和干净版本对 ImageNet 数据集的 50,0 00 多幅图像进行训练,可以消除伪像、噪声、颗粒,并自动增强您的照片,而无需查看对象的原始无噪版本。该算法不仅用于恢复颗粒状照片,还用于磁共振图像(MRI)扫描,这在医疗领域非常有益。

继续阅读……

值得注意的

  • 遇见奥斯卡垃圾桶
    奥斯卡来自自主的人工智能垃圾桶,一家符合人体工程学的办公和游戏家具公司,为你回收。根据 Autonomous 的说法,当你把一件垃圾扔进奥斯卡的识别和分类机制时,图像识别相机会检测它是否可回收。如果 Oscar 的图像识别算法无法对物品进行分类,LED 会闪烁红光,提示用户通过“教授”物品的分类来提供帮助。阅读更多…
  • 咨询公司普华永道(PwC)的一份报告预计,到 2037 年,人工智能将为英国经济增加的就业岗位(约 720 万个)将与该技术导致的失业(700 万个)一样多。阅读更多内容……

宝马机器学习周刊—第 15 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-15-87bddf2b3007?source=collection_archive---------10-----------------------

2018 年 7 月 19 日至 8 月 1 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

关于区块链和碳排放

IBM 相信区块链可以通过将碳信用转化为加密令牌来帮助减少碳排放。世界正在向“代币驱动的经济”发展,这被认为是创造一个巨大的新型数字资产市场的计划的一部分。IBM 希望建立交易这些代币的软件平台。它计划帮助数字化的第一件事有一个额外的特点:它有益于环境。公司、政府和其他人使用碳抵消额度来补偿他们排放的二氧化碳。不幸的是,购买“高质量”的碳信用额是一个复杂、繁琐的过程,必须在场外交易中完成,这减缓了碳信用额市场的发展速度, Veridium 基金会的执行董事吉姆·普罗坎尼克说。他说,区块链技术是“创造一个更具流动性和透明度的市场的完美背景。”

继续阅读……

谷歌的 AutoML

谷歌的 AutoML Vision 在一月份开始的 alpha 阶段后将进入公开测试。Cloud AutoML 基本上是一种允许非专家——那些没有 ML 专业知识或甚至没有编码能力的人——训练他们自己的自学模型的方法,所有这些都使用作为谷歌云计算产品一部分的工具(这里一个关于构建你自己的 ML 管道的顶级 AutoML 库的快速指南)。这些工具中的第一个是 AutoML Vision,它允许您为图像和对象识别创建 ML 模型。谷歌通过使用简单的图形界面和普遍理解的 UI 触摸,如拖放,使这些工具对于软件工程和人工智能领域以外的人来说是易读的。两个新工具 Cloud AutoML 旨在促进自然语言和翻译领域的发展。谷歌表示,出版巨头赫斯特公司已经在使用 AutoML 自然语言来帮助标记和组织其许多杂志和这些出版物的众多国内和国际版本的内容。谷歌还将 AutoML 翻译交给了日本出版商日经集团(Nikkei Group),后者每天出版并翻译多种语言的文章。

继续阅读……

使用 ML 检测水质

美国最大的上市水务公司 American Water 正在研究使用 ML 和实时流数据技术来检测和识别地表饮用水中潜在的有害化学信号。这些数据是基于传感器对碳和溶解氧等物质的测量,以及水中已知化学物质的存在。由此产生的数据信号可用于实时检测化学物质的存在,并相应地调整水处理。然而,目标并不是完全自动化水处理过程。相反,它是给水质操作员另一个工具,帮助他们做出更明智的决定。

继续阅读……

值得注意的

  • 学习灵巧
    观看来自 OpenAI 的自学算法,它让机器人手能够教会自己以不可思议的技巧摆弄立方体。强化学习算法在计算机模拟中练习了相当于一百年。阅读更多…
  • 谷歌发布了一个很酷的 ML 实验,将用户的姿势与类似的 GIF 图片进行匹配,你可以在他们的网站上进行测试。阅读更多或观看视频
  • 有史以来最大规模的关于人类认知的基因研究发现,人们的基因与他们在学校接受的教育程度之间有 1000 多种联系。阅读更多…

宝马机器学习周刊—第 16 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-16-2cdcbb01cbf?source=collection_archive---------15-----------------------

2018 年 8 月 2 日至 8 月 22 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

区块链和美国中期选举

西弗吉尼亚州的投票变得更加高科技:美国第一个允许一些选民使用智能手机应用程序提交联邦大选选票,这是主要涉及海外服役军人的试点项目的一部分。西弗吉尼亚州官员计划使用区块链来应对网上投票的风险。他们认为,这是一种更方便、更安全的网上投票方式,可以提高投票率。该项目遭到了选举安全专家的严厉批评,他们认为,按照设计,该系统几乎没有解决在线投票固有的问题。宾夕法尼亚大学的密码学和安全研究员马特·布雷泽认为区块链并不坏。这是因为它们引入了新的安全漏洞,而保护投票计数免受欺诈“比其他方法更容易、简单和安全。”

继续阅读……

网络安全的人工智能和人工智能

使用 ML 和 AI 来帮助自动化威胁检测和响应可以减轻员工的负担,并有可能比其他软件驱动的方法更有效地识别威胁。尽管如此,黑客可以通过瞄准他们训练的数据和他们寻找的警告标志来挫败安全算法。许多正在推出的网络安全产品涉及“监督学习”,这要求公司选择和标记算法训练的数据集——例如,通过标记恶意代码和干净代码。潜在的风险是,网络安全公司急于将其产品推向市场,因此没有彻底清除异常数据点;进入安全公司系统的黑客可以通过交换标签来破坏数据,从而将一些恶意软件标记为干净的代码;或者黑客可以找出模型用来标记恶意软件的代码特征,然后从他们自己的恶意代码中删除这些特征,这样算法就不会发现它。

继续阅读……

ML 工具使汽车设计更符合空气动力学

当工程师或设计师想要测试汽车、飞机或其他物体的新设计形状的空气动力学特性时,他们通常会通过让计算机求解一组复杂的方程来模拟物体周围的空气流动,这一过程通常需要几个小时甚至一整天。来自 Autodesk research(现在在东京大学)的 Nobuyuki Umetani 和来自奥地利科学技术研究所(奥地利 IST)的 Bernd 比克尔现在大大加快了这一过程,使流线和参数实时可用。他们的方法是第一个使用 ML 来模拟连续可编辑 3D 对象周围的流动,并能够显示流线以及交互式可变形形状表面上的颜色编码压力。

继续阅读……

值得注意的

  • 上周今晚
    观看约翰·奥利弗谈美国关税对宝马的影响。
  • 瓦尔多在那里,你知道这个游戏吗?现在有一个机器人,配备了视觉相机套件,可以使用谷歌的 AutoML 面部识别服务识别瓦尔多。观看 还有瓦尔多阅读更多…
  • ML 有助于减少毒性化疗
    麻省理工学院的研究人员正在采用 ML 技术,通过减少胶质母细胞瘤(最具侵袭性的脑癌形式)的毒性化疗和放疗剂量,来改善患者的生活质量。阅读更多…

宝马机器学习周刊—第 4 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-4-1d9ac5a8f26?source=collection_archive---------18-----------------------

2018 年 3 月 8 日至 3 月 14 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

大赦国际的法律责任

法律学者越来越多地讨论哪些法律应该适用于 AI 犯罪。英国布莱顿大学的研究员约翰·金斯顿最近发表了一篇论文,描绘了这一法律领域的前景。他的分析提出了一些汽车、计算和法律界应该认真应对的重要问题(如果他们还没有这么做的话)。这场辩论的核心在于,人工智能系统是否可以为其行为承担刑事责任。Kingston 说,以色列 Ono 学院的 Gabriel Hallevy 已经详细研究了这个问题。本文讨论了适用于人工智能系统的三种不同的法律场景:(i) 通过另一个实施者,适用于由精神有缺陷的人实施的犯罪,因此被认为是无辜的,(ii) 自然可能的后果,发生在人工智能系统的普通行为可能被不适当地用于实施犯罪行为时,以及(iii) 直接责任,要求行为(例如,人工智能采取导致犯罪行为的行为)和意图(更难确定)

继续阅读……

测试人工智能的常识

一项新的测试可能有助于表明,Siri 和 Alexa 等人工智能系统需要一种根本不同的方法来真正掌握语言。由西雅图非营利组织艾伦人工智能研究所 (AI2)的研究人员开发的 AI2 推理挑战赛 (ARC)将提出小学水平的多项选择科学问题(见论文)。每个问题都需要对世界如何运转有所了解。例如,一个问题可以是“下面哪个项目不是由自然生长的材料制成的?a)棉衬衫 B)木椅 C)塑料勺子 D)草篮。”这样的问题对于任何知道塑料不是长出来的东西的人来说都很容易。这个答案触及了一个连小孩子都有的常识性的世界图景。这项新测试是 AI2 向人工智能系统灌输这种对世界的理解的举措的一部分。这一点很重要,因为确定一个语言系统理解它所说的东西的能力是很棘手的。

继续阅读……

不付款

当谈到获得负担得起的机票,价格比较网站都很好,但他们并没有真正解决价格不断变化的事实。这意味着,尽管你在预订时可能已经买到了周三 10 点从洛杉矶飞往纽约的最便宜的航班,但不能保证在接近起飞时间时仍然是最便宜的航班。
机器人律师网站提供的最新服务 DoNotPay (最出名的是让数千人免于停车罚单)声称是有史以来第一个在你预订机票后降低机票价格的服务。它与所有美国航空公司和旅游预订服务兼容,迫使公司在机票价格下降时向客户付费。它是通过遵守法律细则来做到这一点的,法律细则要求航空公司给予客户修改预订的选择权——但很少有人真正这么做。

继续阅读……

值得注意的

宝马机器学习周刊—第 5 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-5-c8a167698add?source=collection_archive---------4-----------------------

2018 年 3 月 15 日至 3 月 21 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

人工智能可以帮助发现老年痴呆症

目前,没有简单的方法来诊断阿尔茨海默氏症。不存在单一的测试,单靠大脑扫描不能确定某人是否患有该病。此外,当患者处于疾病的早期阶段时,它并不总是明显的。在人们开始经历困惑和记忆丧失之前,大脑的变化会导致行为和睡眠模式的微妙变化。研究人员认为,人工智能可以早期识别这些变化,并识别出处于发展最严重疾病风险中的患者。麻省理工学院计算机科学和人工智能实验室的 Dina Katabi 和她的团队开发了一种微妙的白色平板设备,可以识别动作,如踱步和徘徊,这可能是阿尔茨海默氏症的迹象。这个设备知道一个人什么时候起床,穿衣服,走到窗前,或者去洗手间。它可以判断他们是在睡觉还是摔倒了。它通过使用低功率无线信号来绘制他们的步态速度,睡眠模式,位置,甚至呼吸模式。所有这些信息都被上传到云端,在那里 ML 算法从每天数以千计的动作中发现模式。装有这种算法的设备可以安装在人们的家中或长期护理设施中,以监测那些处于危险中的人。对于已经确诊的患者,这种技术可以帮助医生调整他们的治疗。

继续阅读……

优步的致命事故

周日晚上,一名女子在亚利桑那州坦佩被优步驾驶的自动驾驶汽车撞死。这被认为是第一起与自动驾驶技术有关的行人死亡事件。事故涉及一辆沃尔沃,优步为其配备了雷达、摄像头和其他传感器以及计算机设备,使其能够在没有驾驶员输入的情况下导航。虽然当时一名安全驾驶员在车内,但当它撞上并杀死骑车人时,它处于自动模式。可以在这里观看车辆内部和外部摄像头拍摄的(相当清晰的)视频。《麻省理工技术评论》发表了一篇文章,反思了致命事故的潜在影响,得出结论说,到目前为止,公众(出人意料地)没有表现出反对自动驾驶技术的迹象,即使在此类事件发生后。尽管如此,丰田等汽车制造商决定暂时停止自动驾驶汽车上路。

继续阅读……

将深度学习应用于纽约市的交通

当试图使当局相信某些法律没有得到充分执行时,洗钱在证明一个恰当的案例方面非常有用。例如,纽约市 30 岁的计算机科学家亚历克斯·贝尔(Alex Bell)创建了一个深度学习算法(一种 ML)的原型,该算法研究交通摄像头的镜头,并精确跟踪自行车道被送货卡车、停放的汽车和等待的出租车以及其他违法者堵塞的频率。该项目为期 10 天,重点关注一个城市街区。这项工作花费了大约三周时间(参见源代码这里)。与大多数纽约市交通数据分析相比,这是一项与众不同的分析。初步的发现是明显的:利用一个公交车站和两条自行车道(一条向北行驶,另一条向南行驶)上的交通摄像机镜头,贝尔发现公交车站 57%的时间被封锁,而自行车道 40%的时间被封锁。

继续阅读……

值得注意的

  • TechCrunch 正在跟进马克·扎克伯格对剑桥分析公司滥用从脸书收集的客户数据的报道的回应。参见饲料…
  • 让智能手机通知不那么烦人
    最近发表的一篇论文描述了研究人员如何根据浏览历史、购物历史和财务细节等数据训练人工智能,以建立一个推荐引擎,决定何时在通知中显示什么。利用它,他们能够准确预测用户对频率和内容的偏好。
  • 砍伐森林的声音
    麻省理工学院技术评论报道雨林连接,一个三藩市的非营利组织,已经开发了一种廉价的,严格的声音监测系统,由改良的手机和太阳能电池板制成。所谓的守护者设备上的一个应用程序可以隐藏在整个森林的树木中,持续监听非法伐木和偷猎动物的迹象。该非营利组织将使用谷歌的 TensorFlow 更准确地检测上传音频中令人不安的声音,如链锯、车辆和枪声。

宝马机器学习周刊—第 6 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-6-5db7d4e92850?source=collection_archive---------5-----------------------

2018 年 3 月 22 日至 3 月 28 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

对乱穿马路者立即罚款

中国南方城市深圳的交警一向以严格执行无视交通规则而闻名,这座拥有 1200 万人口的大都市。现在,在人工智能和面部识别技术的帮助下,乱穿马路的行人(非法穿越道路的行人)不仅会被公开点名,还会通过即时消息通知他们的错误行为——以及罚款。
总部位于深圳的人工智能公司 Intellifusion 向深圳警方提供技术,在十字路口的大型 LED 屏幕上显示乱穿马路者的脸,该公司正在与当地移动电话运营商和微信等社交媒体平台合作,开发一个系统,一旦违规,违规者将收到个人短信。

继续阅读……

EmTech Digital 2018

今年在旧金山举行的 EmTech Digital 几天前结束了。会议特别关注引领中国人工智能革命的公司,人工智能如何渗透到从制造到零售的企业,以及最近随着机器做出更大更复杂的决定,导致算法揭示其隐藏的偏见而出现的伦理困境。演讲者和公司展示了一些主题,如探索在食品生产中使用人工智能的新方法,展示了迄今为止最灵活的机器,并警告说人工智能在假新闻制作中变得越来越重要

参见概述

冰雹预测人工智能万岁

每年,恶劣天气都会造成数十亿美元的财产损失,并导致数百人死亡或受伤。虽然龙卷风比冰雹更危险,但也更罕见。然而,准确预测严重的冰雹——特别是那些产生大于 25 毫米冰雹的冰雹,这是气象界对“大冰雹”的阈值——需要气象人力。本周在圣何塞举行的 Nvidia GPU 技术会议上,美国国家大气研究中心的研究人员展示了他们的深度学习模型,该模型从雷达图像中预测了这种危险的冰雹。到目前为止,ML 技术在预测雷达图像中显示的空间模式的恶劣天气事件方面还存在困难。更新的深度学习技术,如卷积神经网络(CNN),可以产生更好的结果。

继续阅读……

人工智能识别月球上的新环形山

尽管在过去的几十年里技术有了巨大的发展,但是计算月球上陨石坑的方法并没有太大的进步,仍然严重依赖人眼进行识别。为了消除手动跟踪月球洞穴和盆地的单调感,多伦多大学斯卡伯勒分校的一组研究人员提出了一种创新技术,导致发现了 6000 个新的陨石坑。利用 CNN,研究小组使用轨道卫星收集的海拔地图数据,在覆盖月球表面三分之二的区域上训练算法。然后,他们在剩下的三分之一的区域测试了这项技术,这是一个它还没有见过的区域。深度学习算法能够以令人难以置信的精度和非常详细的细节来绘制未知的地形。它发现的陨石坑是人工方法的两倍。

继续阅读……

值得注意的

  • 人工智能创造超现实的裸体肖像
    一名人工智能研究人员决定看看,当他从一个数据集向一个生成敌对网络(GAN)提供数千幅裸体肖像,然后训练它创造自己的奇异艺术品时,会发生什么。这件艺术品不完全是感性的。大多数裸体看起来像是在大热天融化,使得超现实主义艺术运动看起来乏味平常。见艾——画。
  • 经济学家本周发布了一份报告,聚焦人工智能的引入对就业市场的影响。阅读更多…
  • 面向儿童的人工智能项目
    项目“面向儿童的机器学习”旨在以一种有趣而直观的方式向儿童教授人工智能。阅读更多…
  • 防止 ML 中的歧视性结果
    世界经济论坛发布了一篇论文,为开发者提供了一个框架,以防止 ML 开发和应用中的歧视。该文件提出了四项指导原则:积极包容、公平、理解权和获得补救。阅读更多…

宝马机器学习周刊—第 7 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-7-a22bcba816b5?source=collection_archive---------6-----------------------

2018 年 3 月 29 日至 4 月 4 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

估计行星上存在生命的可能性

一种人工智能算法正在学习识别其他世界的生命支持条件模式。普利茅斯大学的一个团队说,它可以预测这些行星上存在生命的可能性。研究人员训练了他们的神经网络,根据它们是否最像今天的地球、早期的地球、火星、金星或土星的卫星泰坦,将行星分为五种不同的类型。所有这五个物体都是已知有大气层的岩石体,是太阳系中最有可能适合居住的物体。“鉴于迄今为止的结果,这种方法可能会被证明是非常有用的,可以利用地基和近地天文台的结果对不同类型的系外行星进行分类,”该项目的主管 Angelo Cangelosi 博士说。该技术也可能非常适合选择未来观测的目标,因为预计未来的太空任务,如欧空局的 Ariel 太空任务和美国宇航局的 James Webb 太空望远镜,将增加光谱细节。

继续阅读……

抑郁:打字整齐划一,拿着手机有一个角度

正如这篇新发布的论文所述,一个神经网络可以通过分析他们如何持有和点击智能手机来检测双相患者的抑郁和躁狂。研究人员给双相情感障碍者和控制者一部带有定制键盘的手机,收集按键和加速度计运动的数据。他们还要求参与者自我报告他们感到抑郁或狂躁的程度。与控制组相比,躁郁症患者在患有躁狂或抑郁症时,打字时间更加一致,而控制组的打字速度有所不同。一种解释可能是,躁郁症患者对刺激的反应不那么强烈,比如收到的短信。加速度计数据显示,有抑郁或躁狂症状的受试者倾向于以一定角度握持手机。该算法(名为 DeepMood )在通常不到一分钟的会话中达到了 90%的准确率。

继续阅读……

拉面识别

如果你是一个足够大的拉面粉丝,也许你可以在 Instagram 上看到一张 tonkotsu 碗的照片,并立即认出它来自哪个餐厅。但计算机打败了我们,因为它们现在可以从同一家特许经营餐厅的 41 碗看似相同的拉面中,识别出一个菜单项来自哪个商店。数据科学家 Kenji Doi 做了这项美味的研究,使用谷歌的 AutoML Vision 对拉面 Jiro 的每一个菜单项进行分类,拉面 Jiro 是一家位于东京的拉面连锁店。他从 41 家商店中的每一家收集了大约 1170 张照片,并将 48000 张拉面照片的数据集输入软件。AutoML 花了大约 24 小时(18 分钟,在不太准确的基本模式下)完成数据训练,该模型能够以 95%的准确率预测拉面来自哪个商店。多伊认为,这个模型足够精确,能够区分切肉和浇头的位置。

继续阅读……

值得注意的

  • 新纪录片:你信任这台电脑吗?
    新纪录片你信任这台电脑吗?本周将在韦斯特伍德的 Regency Village 剧院进行全球首映,及时探索了人工智能的崛起和思维机器的潜在危险。观看预告片,阅读更多
  • 世界第三大唱片公司华纳音乐收购了 ML 初创公司 Sodatone,试图利用数据来发现下一个艾德·希兰。成立于多伦多的 Sodatone 追踪流媒体、巡演和社交媒体数据,寻找与听众产生共鸣的艺术家。随着越来越多的人在线观看娱乐节目,音乐、电影和电视高管正在寻找专有数据,以预测什么会受到观众的欢迎。阅读更多…
  • 麦当劳跳上人工智能列车
    麦当劳和任何快餐企业的核心是保持低成本和高效率的需求——这是大数据、人工智能和机器人可以支持的。人工智能可以帮助他们改善个性化的客户体验,利用客户数据创建数字菜单,开发 McRobots(麦当劳是第一家在亚利桑那州凤凰城开设完全由机器人经营的商店的同类餐厅,只有一小组人来支持他们。),并展开趋势分析。阅读更多……

宝马机器学习周刊—第 8 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-8-149ca5108899?source=collection_archive---------7-----------------------

2018 年 4 月 5 日至 4 月 25 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

与人工智能互动

谷歌对人工智能实验的最新贡献是让你与书籍对话:这个名为“与书籍对话的项目让你与一个经过人工智能训练的算法进行真正的对话,该算法利用人类撰写的文本中的相关段落来回答问题。它让你发表声明或提出问题。然后,该工具在书中找到一个句子来回答问题或陈述,而不依赖于关键字匹配。另一个(更具互动性和趣味性的)工具是“ Semantris ”,一个由 ML 支持的单词联想游戏。Semantris 基本上测试你的单词联想能力,使用的软件和与书对话的软件是一样的。它会根据屏幕上的单词与您输入的答案的对应程度,对这些单词进行排名和评分。例如,如果你在一个 10 个单词的集合中得到单词“bed ”,你可能会想到键入“sleep”作为响应。然后,Semantris 将对这 10 个单词进行排名,并根据它认为床和睡眠之间的语义关系与“床”和列表中其他每个单词之间的关系相比有多好来给你打分。Google 过去的 AI 实验包括“快,画!“T9”,一个学习如何识别你涂鸦的神经网络,或者“ Infinite Drum Machine ”,让你使用日常世界的声音创造节拍。

继续阅读……

通过强化学习掌握孔孚

加州大学伯克利分校和不列颠哥伦比亚大学的人工智能研究人员创造了虚拟角色,能够模仿一个人表演武术、跑酷和杂技的方式,坚持不懈地练习动作,直到他们恰到好处。这项工作可能会改变视频游戏和电影的制作方式。动画师可能会将真实的镜头输入到程序中,并让他们的角色通过练习来掌握它们,而不是以令人痛苦的细节来计划角色的动作。这样的角色可以被放到场景中,然后留下来执行动作。人工智能研究人员开发的虚拟角色使用了一种被称为强化学习的人工智能技术,其中虚拟角色对其运动进行实验,每当它稍微接近专家的运动时,就会收到积极的强化。强化学习意味着同样的算法可以用来训练一个角色做后空翻或月球漫步。

继续阅读……

人工智能将指导地震响应

一个值得关注的问题,加州的一家初创公司正在使用 ML 向消防部门提供如何计划和应对地震的建议。一个关注点的目的是减少灾难响应规划过程中的猜测。使用关于房屋、建筑物、它们的材料、它们的建造时间以及当地面开始震动时它们倒塌的可能性的数据,以及关于自然环境和实时天气数据的数据,可以预测如果地震发生在特定地区会发生什么。然后在过去地震造成破坏的地区测试这个模型。

继续阅读……

欧盟的人工智能目标

欧盟委员会概述了欧洲促进投资的方法,并为人工智能制定了道德准则。它提出了一个三管齐下的方法来防止“人才外流”到其他非欧洲竞争对手,并认为欧盟需要协调欧洲行动才能站在人工智能发展的前沿。这三个目标被定义为:I)增加对人工智能的财政支持,并鼓励公共和私营部门采用;ii)为人工智能带来的社会经济变化做好准备 iii)确保与人工智能相关的适当的道德和法律框架。

继续阅读……

值得注意的

  • 1984 年中情局关于人工智能
    阅读了中情局 1984 年解密的备忘录,其中一个“人工智能指导小组”(成立于 1983 年)向中情局主席通报了人工智能以及它是什么。阅读更多…
  • 自动化就绪指数自动化系统的日益复杂将对工作和就业产生深远的影响,政府应该为剧变做好准备。由经济学人信息部创建并由 ABB 赞助的自动化就绪指数评估了 25 个国家对智能自动化的挑战和机遇的准备程度。韩国在该指数中拔得头筹,在每个政策领域都得分很高,其次是德国和新加坡。阅读更多…
  • Comet . ml
    Comet声称他们希望为 AI 做 GitHub 为软件做的事情:允许数据科学团队自动跟踪他们的数据集、模型变化和实验历史,从而允许项目和方法的效率、透明度和可重复性。阅读更多…

宝马机器学习周刊—第 9 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week-9-d996c486dbb?source=collection_archive---------8-----------------------

2018 年 4 月 26 日至 5 月 2 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

奥特雷戈计划:半机械人

通过与它们交谈来控制你的小工具是如此的 2018。将来,你甚至不用动嘴唇。一个名为 AlterEgo 的原型设备,由 23 岁的麻省理工学院媒体实验室研究生 Arnav Kapur 创造,已经使这成为可能。有了卡普尔的设备——一个 3d 打印的塑料小东西,看起来有点像一只瘦瘦的白香蕉,附在他的头上——他可以浏览电视频道,改变灯泡的颜色,下专家象棋,解决复杂的算术问题,以及点披萨,所有这些都不用说一句话或动一根手指。“我确实觉得自己像个半机械人,但这是最好的感觉,”他谈到自己对这款设备的体验时说,这款设备是他去年作为研究项目制造的。当我们安静地阅读或自言自语时,AlterEgo 会接收到我们面部和颈部肌肉的微小运动产生的微小电信号。Kapur 将 AlterEgo 视为一种对源于人工智能的日益增长的焦虑的解毒剂:他的设备显示了人工智能如何帮助增强而不是取代人类。

继续阅读……

无人驾驶汽车中的晕动病

尽管无人驾驶汽车还没有那么普遍,但它们正在走向消费者用途,谷歌(Google)旗下的 Waymo 等公司正在公共道路上测试它们。这些汽车很可能会加剧晕动病的问题,这是由于一个人的眼睛和内耳向大脑发出相互矛盾的信号:耳朵检测到汽车的运动,但眼睛看到的是内部静止的环境。一家名为 ClearMotion 的初创公司是世界上第一个主动驾驶系统,它改变了你的汽车的驾驶和操控方式:它对运动的影响就像降噪对噪音的影响一样,在几分之一秒内减轻了道路的粗糙度。依靠软件和硬件的结合,ClearMotion 预测道路并使汽车做出反应,为乘客和司机提供无与伦比的舒适性、操控性和稳定性。

继续阅读……

使用无人机和人工智能修复中国的长城

中国墙的许多部分位于偏远或难以到达的地区,有些已经年久失修。麻省理工学院技术评论报道称,英特尔和中国文化遗产保护基金会已经合作部署无人机来扫描和捕捉该建筑的 3d 图像。在北京北部的山区,将建立一个有近 700 年历史的箭扣长城的详细模型,用于确定最需要修复的部分。无人驾驶飞机的使用尤其有助于在建口段等地区进行定期维护和检查,这是一个众所周知的陡峭和植被茂密的地区。

继续阅读……

值得注意的

  • 数据集数据表
    微软发表了一篇论文建议数据集数据表。目前,还没有标准的方法来确定数据集是如何创建的,以及它代表了什么特征、动机和潜在的偏差。数据表应该是一个简短的文档,附带公共数据集、商业 API 和预训练模型。目标是使数据集创建者和用户之间能够更好地沟通,并帮助人工智能社区走向更大的透明度和问责制。阅读更多…
  • 谷歌的第一个虚拟现实涂鸦
    今天访问谷歌主页,你会发现一个不寻常的涂鸦,画的是一个穿着朴素西装的瘦子。点击后,你会看到一个 YouTube 播放器,在一个精彩的 360 度动画短片中,这个古怪的人物——法国电影制作人乔治·梅里爱——和他的创作栩栩如生。阅读更多…
  • 人工智能作曲的交响乐
    使用基于 30000 个乐谱的算法组合,世界上第一部人工智能作曲的交响乐诞生了(正如国家声称的那样),名为迪拜颂阅读更多…

宝马机器学习周刊—第 10 周

原文:https://towardsdatascience.com/bmw-machine-learning-weekly-week10-d3823170cf5?source=collection_archive---------13-----------------------

2018 年 5 月 3 日至 5 月 23 日

关于机器学习(ML)、人工智能(AI)及相关研究领域的新闻。

机器人奶牛模拟跟踪技术的未来

三头难以分辨的电子奶牛第一次尝试一种叫做 EmbediVet 的设备,这种设备是由一家名为家畜实验室的初创公司发明的。植入奶牛体内的追踪器使用低能量蓝牙连接附近的基站,并传输关于奶牛咀嚼频率、温度和在农场漫步的信息。目前,他们只是过着正常的生活,无意中提供数据来训练人工神经网络。希望在不久的将来,这种人工智能将帮助农民快速轻松地了解奶牛和其他牲畜的饮食状况,它们是否生病或即将分娩——这些事情在今天通常只是通过观察和等待来完成,但当你有数百或数千只动物需要关注时,很难发现。家畜实验室声称,植入的 EmbediVet 对牛来说没有可穿戴的那么烦人,并且可能是一种更强大的收集有用数据和随着时间的推移发现牛行为模式的方法。家畜实验室的首席执行官 Tim Cannon 从来没有打算为奶牛制作一个嵌入式 Fitbit。他真正想要的是用同样的技术重新设计自己,以及任何想这样做的人。

继续阅读……

改进聊天机器人技术

人工智能初创公司 Gamalon 开发了一种聪明的新方法,让聊天机器人和虚拟助理与我们交谈。Gamalon 采用让人工智能接受不确定性和模糊性的方法,可能会矛盾地帮助未来的虚拟助手减少困惑。他们的方法通过提供一种处理话语可能传达的多重含义的方式,让计算机进行更有意义和更连贯的对话。如果一个人说了或输入了一些含糊不清的话,系统会对最可能的意思做出判断。今天的虚拟助手和聊天机器人通常遵循简单的规则来回答问题,而 Gamalon 的方法将概率技术添加到统计 ML 中,合成自动处理概率的程序。在实践中,这意味着系统可以通过对某人的意思做出最佳猜测来处理不确定性。这种方法让机器从更少量的数据中学习,降低了出错率。另一个关于聊天机器人的人工智能进步是来自康乃尔大学、谷歌拼图和维基媒体的研究,他们开发了一种软件,帮助计算机在争论发生前发现在线争论

继续阅读……

类似大脑的全球定位系统

Alphabet 旗下的英国公司 DeepMind 创建了一个神经网络,模仿人类大脑中的网格细胞,帮助我们知道自己在哪里。DeepMind 的研究人员开始训练一个人工神经网络来模仿路径整合,这是一种动物用来计算它们在空间中运动的方法。该小组发现,神经网络发展出了类似于生物大脑中发现的“网格细胞”的东西。这些细胞排列成三角形网格,似乎为动物提供了一种在物理空间中定位的方式。然后,他们使用经过训练的网络,通过在他们的方法中添加强化学习来导航通过不熟悉的迷宫。他们发现,新训练的网络可以比以前的任何人工智能系统更有效地导航,并且它更像真正的动物一样探索空间。

继续阅读……

区块链&汽车行业

宝马新闻:
Business Insider 报道,宝马、通用、雷诺和福特已经达成协议,成立移动开放区块链倡议(MOBI),这是一个将探索区块链技术在汽车和移动行业中的应用的财团。区块链是一种数学结构,以几乎不可能伪造的方式存储数据。它可以用于各种有价值的数据。显然,除了探索区块链用例之外,MOBI 还打算制定通用标准和应用编程接口(API)。虽然这些公司没有具体说明他们计划探索的任何用例,但他们可以追求几种可能性。区块链是一种分布式、不可变的账本,早期回报表明,它非常适合在两方或多方之间安全地转移资金和信息,这是当今行业中相对常见的做法。

继续阅读……

值得注意的

  • 婴儿翻译器
    Chatterbaby 是一款分析声音与沉默比率的频率和模式变化的应用程序,可以告诉父母他们的孩子为什么会哭。目前,这款应用的词汇非常有限(它可以区分饥饿、烦躁和痛苦)。然而,Chatterbaby 不仅仅是一个旨在帮助父母的 app。这也是一个大规模的数据收集工具,用来观察哭泣模式的不规则性是否可能携带自闭症的信号——也许有一天,可以诊断出自闭症。阅读更多…
  • 表情符号寻宝游戏
    谷歌的表情符号寻宝游戏为表情符号的众多含义又增加了一个:玩 ML 的一种方式。一个表情符号出现了,你可以用手机的摄像头实时搜索它的例子。通常,利用神经网络需要连接到一组巨大的远程云服务器。但是,所有计算都直接在设备上进行,而不是连接到远程服务器群。表情符号寻宝游戏背后的人坚持认为这个游戏没有保存它拍摄的任何照片,并邀请人们在 GitHub 上查看他们的开源代码阅读更多…
  • 在未能与宝马和梅赛德斯-奔驰达成交易后,这家科技巨头与大众签署了一项协议,将汽车制造商的一些新 T6 运输车改造成苹果的自动驾驶员工班车——三位知情人士表示,该项目落后于计划,几乎占据了苹果汽车团队的全部注意力。阅读更多……

沸腾愚蠢创业想法的海洋

原文:https://towardsdatascience.com/boiling-the-ocean-of-dumb-startup-ideas-c5c7eef562da?source=collection_archive---------8-----------------------

当我和亚历克斯·黑格(Alex Hague)第一次制作讽刺派对游戏 的原型时,我们将一份公司名称的电子表格放在一张我们最终称之为“推介卡”的列表旁——市场或人口统计数据,或者只是我们可以与公司卡配对的愚蠢想法。

接下来,我制作了另一个标签,随机将公司与另一组随机创意配对,看看这些配对是否有趣:

An early spreadsheet we used for prototyping whether this game would be funny

从本质上来说,并不是所有的方法都有效,但是足够了,我们知道这是有意义的。(我们如何决定哪些公司和想法最终入选游戏是一个单独的帖子,我们总有一天会看到;TL;博士基本上是“像脸书和谷歌这样的公司太普通了,不能拿来开玩笑,非常广泛或非常具体的基于人口统计的推介卡效果最好。”)

两年后, Pitch Deck 现已发货给我们所有的 1,889 名 Kickstarter 支持者在亚马逊上表现良好,获得所有 5 星评价。我们甚至刚刚得到了我们第一个友好的本地游戏商店的聚光灯视频,来自丧魂之钟

网站的事做得太过分了

当我们开始零售游戏时,我们也在准备推出我们的网站 pitchdeck.business ,我想知道为每一种可能的卡片组合建立一个页面会是什么样子。在游戏的零售版本中,大约有 31,500 双。一个很大的数字,但不是大到你不能暴力破解。

大约在那个时候,我的好友兼 Y Combinator 合伙人 T21 问我我们的搜索引擎优化策略是什么。我回答说“没有,这是一个纸牌游戏,希望人们和他们的朋友一起玩,玩得开心,我们从中获得一些好口碑”。

制作一款卡牌游戏之所以有趣,部分原因是它们有一种内在的病毒性质(也称为 K 因素),人们会如何听说它们。因为游戏必须多人玩,每个副本代表一个可能的粉丝群体。如果游戏足够有趣,一些新玩家会买一个拷贝。这是一个良性循环。

事实上,我们经常听到 Pitch Deck 的粉丝说,他们在和朋友玩游戏的过程中通过手机购买了他们的副本。你可以把它想象成一种轻量级的网络效应:游戏每增加一个副本,并没有增加单个副本的整体价值,而是增加了更多朋友购买游戏的概率。

但是 Gustaf 的问题让我想知道这种每对一页的方法是否可能是一种颠覆性但精明的 SEO 策略——如果每对卡片都有一个被谷歌索引的 URL,那么任何时候有人查询[AirBnB for Fish](http://pitchdeck.business/airbnb-for-fish)我们都有机会在结果中显示出来。

如果有人无礼地用谷歌搜索一家公司的创意,而这家公司恰好在我们的游戏中,那么,他们可能也有兴趣购买一份。至少,如果你在谷歌上搜索[Arby’s for Nonsexual glory holes](http://pitchdeck.business/arby-s-for-nonsexual-glory-holes),你很有可能会喜欢玩 Pitch Deck。

我还意识到,如果我们启用一些基本的分析和谷歌的搜索控制台,我们可以一窥人们最感兴趣的卡片。最受欢迎的网址反映了一种网络身份,就像我们在纸牌游戏中看到的那样。谷歌的搜索控制台可以让我们深入了解用户为了访问我们的网站而输入的关键词。

有时,当你试图建造一些简单的东西,但无法抗拒过度,这被称为“沸腾的海洋”。这就是这个想法的基本内容(我的意思是谁真的需要一个 Ruby on Rails 应用程序来玩纸牌游戏?!)但是一旦脑子里有了这个想法,我就忍不住了。

它活着

几个星期后,我已经把这个网站建成了一个基本的 Rails 应用程序,并为它植入了整个游戏。每张公司卡都有自己的页面,所有的 31500 种配对组合每张宣传卡,以及每张标签

Google now knows about 34k+ URLs tied to our card game.

整个网站现在已经被谷歌搜索机器人索引,经过大约一个月的适度流量,我们已经收集了足够的数据来得出一些有趣的趋势。

但是在我继续说下去之前,先来个剧透和内容警告:事实证明,网络上最流行的宣传配对是性配对。他们一直都是。

反人类实验室的卡牌也是如此: Max Temkin 告诉我,他们实验室里做得最好的卡牌总是那些淘气的。在像我们这样的游戏中,这是一个有趣的偏见,因为它不会亲自出场;可能的解释是,当人们独自坐在电脑前时,他们更倾向于选择淫秽的纸牌配对,但当他们被要求与朋友一起玩时,他们会变得低调。

事实证明,人们发现 CAH 网站也有类似愚蠢的搜索词——是 Max 发给我的列表中最没有攻击性的一个。

免费独角兽公司的想法

宣传资料可能会被解读为一种愚蠢的方式,用来判断对一个优秀公司创意的需求。如果很多人都在寻找同一个想法,这显然意味着对它有某种兴趣。

到目前为止,我看到的最可行的方法是什么?[Netflix for VR Porn](http://pitchdeck.business/netflix-for-vr-porn)。我们暂时是这次搜索的第三个结果,但是在大量关于这个话题的炒作新闻中,这个页面似乎已经明显下降了。可能是因为我们不提供 VR 色情租赁网站。但是,嘿,这似乎是一个…值得追逐的肥沃市场。

另一个热门搜索导致人们投甲板?3d printed fleshlight。我们的网页“3D 打印情趣用品Fleshlight”现在在搜索中排名第四。虽然这可能不是最有利可图的商业想法(事实上,这可能是一个可怕的想法——人们搜索这个的确切原因是因为他们不想为真正的肉体之光付费),但它让人们看到了未来人们真正想用他们的 3D 打印机做什么,那就是用 ABS 塑料制造生殖器。

不幸的是,这种想法也凸显了人们经常在谷歌中输入的一些更黑暗的术语。最令人不安的是:Pornhub for kids的变体。现在我假设这不是给孩子的 Pornhub ,而是给孩子的 Pornhub 。发现这一点真的令人不安,它提醒我们人们仍然在网上寻找各种各样的东西。我已经从谷歌上取消了这个和一些其他页面的索引(例如“儿童监狱的 PornHub”),所以希望我们将不再出现在这些结果中。不寒而栗。**

我要留着[Farmersonly for VR porn](http://pitchdeck.business/farmersonly-for-vr-porn)

我最喜欢的另一个数据集是人们偶然发现的页面列表。以下是通过我们的谷歌搜索控制台获得的热门搜索结果:

我特别喜欢[PornHub for imposter syndrome](https://www.google.com/search?q=PornHub+for+imposter+syndrome&rlz=1C5CHFA_enUS719US719&oq=PornHub+for+imposter+syndrome&aqs=chrome..69i57.217j0j7&sourceid=chrome&ie=UTF-8),我们目前在谷歌上占据第一、第二和第三的位置。我不知道这是恋物癖还是什么,但我很感兴趣。

搜索Did Hitler kill Tesla的人似乎会以“特斯拉为结局,因为他回到过去杀死了希特勒

至少有一个人点击了我们的页面[soylent farts](http://pitchdeck.business/soylent-for-farts),结果是一个相当好理解的问题。三个人搜索donald trump snuggie,其中一个点了。Martha Stewart 在这个数据中也出奇地受欢迎,并出现在各种搜索中:[egg salad martha stewart](http://pitchdeck.business/martha-stewart-living-omnimedia-for-egg-salad)[martha stewart illuminati](http://pitchdeck.business/martha-stewart-living-omnimedia-for-the-illuminati)[martha stewart racist](http://pitchdeck.business/martha-stewart-living-omnimedia-for-racist-news)[martha stewart college](http://pitchdeck.business/martha-stewart-living-omnimedia-for-humanities-majors) 都出现了。

我们没有预料到的最后一个转折是:人们经常搜索 Kickstarter 等公司的实际演示文稿(例如,PowerPoint 演示文稿)。

到目前为止,Yelp 以两次点击和几十次展示在该领域领先,但也很受欢迎的是venmo pitch deckrent the runway pitch decksnapchat pitch deck

值得一提的是一个数据解释警告:由于组成 Pitch Deck 的内容并不能代表所有内容(这是一个基于我们对特定主题的幽默感的讽刺性纸牌游戏),因此不可能真正得出任何有意义的结论。这只是对人们在谷歌上搜索什么的一种有趣、怪异和略带沮丧的窥视。

但是,如果你读到这里,你可能会想知道这些流量是否导致了游戏的销售。答案是,不幸的是,我们真的不知道。

我们大概知道有多少人通过我们的网站从哪些页面进入亚马逊,但实际上我们不知道更多。当谈到理解将人们引向你的清单的数据时,亚马逊是一个真正的黑匣子。我可能还需要做更多的工作来弄清真相,但事实是,我更喜欢这些数据的副作用,而不是任何旨在推动大量销售的东西。

最后,如果你对这种搜索趋势分析感兴趣,可以看看 Seth Stephens-Davidowitz 的文章。他写了一些伟大的工作,使用谷歌搜索趋势分析人们的焦虑人们如何搜索性我们实际上有多种族主义

Bonsai AI:使用 Simulink 进行深度强化学习

原文:https://towardsdatascience.com/bonsai-ai-using-simulink-for-deep-reinforcement-learning-32dc11dfdc5a?source=collection_archive---------2-----------------------

这是我们的模拟和深度强化学习(DRL)系列的第二篇文章。在我们的第一篇文章中,我们介绍了模拟作为 DRL 训练环境的好处。现在,我们将重点放在如何使模拟+ DRL 工作。

在下面的例子中,我们将使用 Simulink 模型训练盆景大脑。目标是教会大脑(Bonsai 平台中内置的人工智能模型)如何调整风力涡轮机,并通过保持风力涡轮机以最佳角度转向风来最大化其能量输出。

Simulink 为 DRL 提供了一个很好的培训环境,因为它允许 Bonsai 等第三方从外部集成和控制仿真模型。这种能力是仿真平台使用 Bonsai AI 进行深度强化学习可行的基本要求之一。更多需求可以在这里找到。

1:仿真模型

这个 Simulink 风力涡轮机模型是由 MathWorks 提供的。对于这种情况,它代表了一个简单的控制问题,可以通过应用强化学习来解决。

Matlab/Simulink Wind Turbine model used for training

2:识别动作和状态

首先,我们需要在模型中确定一个控制点,这样 Bonsai 就可以接管输入和输出。我们通过在模型中插入一个 Bonsai 块来代替现有的控制块。

  • 正如在第一篇文章中所讨论的,Bonsai 控制模拟模型中的动作,并接收状态和回报。在运行模型大量次之后,Bonsai 大脑已经学习了针对模拟所提供的环境的最优策略。
  • 在这个例子中,Bonsai 块代替了涡轮机的偏航控制器。
  • 控件可能有各种形状和结构。它们可以是输入、旋钮、开关或具有输入和输出的仿真模型中的任何其他控制点。

‍ Bonsai control block inserted in Matlab/Simulink model

3:使用 Bonsai 通用协调器连接 Simulink 模型

4:暗示

Bonsai Web Interface showing Inkling code describing State and Action and curriculum

5:培训

  • 现在,您可以开始训练模型并监控训练图。
  • ‍During 训练,用户可能需要修改奖励函数,以优化学习时间和结果。关于编写奖励函数的一个很棒的资源可以在这里找到:盆景训练视频
  • 了解更多关于训练图表的信息。

Bonsai BRAIN details showing training graph and status

6:预测

一旦训练完成,你可以使用经过训练的盆景大脑来获得预测。

  • 将 Bonsai 大脑连接到您的模拟模型,并检查预测的质量。

Simulator view of Yaw Angle based on Bonsai BRAIN predictions

结论

模拟器是强化学习的重要工具。企业可以使用反映真实世界业务流程或物理现实的模拟模型,并通过 Bonsai 的强化学习技术对其进行优化。通常,不需要对模拟模型进行任何更改。如果你错过了我们关于模拟如何用于训练的第一篇文章,请在我们的博客上找到它。

入门

Bonsai 可以帮助您应用深度强化学习技术,并使用 Simulink 作为培训环境,将智能控制构建到您自己的工业系统中。如果你正在使用 Simulink,并且你想尝试 Bonsai AI,请加入我们的测试程序,从这里开始。

书评:商业数据科学

原文:https://towardsdatascience.com/book-review-data-science-for-business-bfb980495288?source=collection_archive---------6-----------------------

在我找工作的过程中,我遇到了一些招聘人员,他们有能力招聘数据科学家。然而,当我与他们交谈时,他们首先诚实地问的一件事是“什么是数据科学?”我刚刚读完福斯特·普罗沃斯特和汤姆·福塞特合著的《商业数据科学》。我计划向任何需要与/雇佣/管理数据科学家一起工作,但不太了解他们做什么的人推荐这本书。

这本书涵盖了你对数据科学入门书籍的所有期望:各种建模技术(线性方法、支持向量机、决策树、knn)、监督与非监督学习、模型评估等等。这本书有一点数学,但没有代码,因为重点是帮助读者进行分析性思考,而不是培养读者成为一名实践者。它有几个相关的商业问题来说明技术/哲学的应用。贯穿全书的一个场景是,你是一家大型电信公司的一员,你必须想办法通过广告活动留住现有客户。

作为一个刚刚完成大会关于如何成为一名优秀的数据科学从业者的课程的人,有两个概念引起了我的注意:

  1. 期望值框架:在分类问题中,我们学习了如何评估模型是否良好的各种指标:准确性、roc-auc、敏感性、特异性……我在课程中没有遇到的一种方法是期望值:

Expected Profit = p(True Positive)b(True Positive) + p(False Positive)b(False Positive) + p(True Negative)b(True Negative) + p(False Negative)b(False Negative)

在通过期望值框架评估分类模型时,你取混淆矩阵的每个单元的概率,乘以该单元的收益,并对结果求和。例如,如果通过添加活动保留的客户的真实正比率为 0.9,保留该客户的收益为 100 美元,则该给定单元的预期利润为 90 美元。

这种评估框架存在一些缺陷,主要是在一些预测问题中,没有一种明确的方法来评估模型的成本和收益。然而,我认为将一个模型转化为预期利润是利益相关者可以明确认同的事情。

2。数据科学更像研发而不是软件工程:许多数据科学家的工作描述要求熟悉敏捷和其他软件工程框架。这是有道理的,因为许多数据科学家都被科技公司聘用,但这让我相信,数据科学家可能也会受到同样的管理。

作者提出了一个很好的观点,即并非所有数据科学的努力都会有回报。一部分是运气,因为有一个很容易预测的问题。其他时候,数据只是说没有。

不仅拥有知道如何有效使用数据科学工具的从业者至关重要,而且拥有直觉知道哪些项目可能会有回报的从业者和管理者也很重要。

不可能期望每个与数据科学家一起工作/管理/雇佣数据科学家的人都成为数据科学专家。然而,对于数据科学家做什么以及他们给组织增加什么价值,应该有一个基本的了解。商业数据科学对于任何想要获得这种知识的人来说都是一个很好的开始。

posted @ 2024-10-13 15:16  绝不原创的飞龙  阅读(31)  评论(0编辑  收藏  举报