TowardsDataScience 博客中文翻译 2020(一百六十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用 Tensorboard 增强你的神经网络

原文:https://towardsdatascience.com/boosting-your-neural-networks-with-tensorboard-bc6ce815d55b?source=collection_archive---------40-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如何将你的实验结果形象化

神经网络(NNs)是强大的算法,通常用于深度学习任务。这类算法的美妙之处在于,神经网络是复合的,从某种意义上说,它们由多层组成,可以添加、删除、修改,通常还可以在训练后定制,以便尝试不同的网络配置(如果你想更深入地了解这种算法的功能,请查看我的文章这里)。

这样做的最终目的是获得能够返回高精度的算法。

这就是为什么在训练时对算法中正在发生的事情以及训练后最相关的结果有一个有意义的见解,是机器学习项目管道中的一个关键步骤。带着这个目的,在这篇文章中,我将谈论 Tensorboard

Tensorboard 是一个强大的仪表板工具,可以通过 pip 轻松安装,并且在不使您的代码变得更加复杂的情况下,能够返回一个非常有意义的仪表板,反映您的 NN 性能。

为了向您展示这个工具的强大功能,我将使用 Keras 设置一个图像分类器。

用 Keras Sequential()构建卷积神经网络(CNN)

为了构建我的模型,我将使用一个卷积神经网络,使用 t he Sequential()方法(您也可以使用 Keras Functional API 来实现相同的目的)。

我要解决的任务是机密任务。更具体地说,我下载了时尚 MNIST 数据集(嵌入在 Keras 中),其中包含 10 种不同时尚单品的图片。我们算法的目标将是正确地用相应的项目标记给定的图像。

因此,在开始构建模型之前,我们先来看看数据集。

#downloading necessary packagesimport tensorflow as tf
import datetime
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt fashion_mnist = keras.datasets.fashion_mnist(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()#creating a list of labelsclass_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

让我们检查第一个火车图像及其形状:

plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

train_images.shapeOutput: (60000, 28, 28)

因此,我们的训练集由 60000 张 28x28 像素的图像组成。如果图像是彩色的(RGB)而不是灰度的,我们在上面的张量中也会有第四维,表示通道。

在构建模型之前,我们还需要三个步骤,即:

  • 重塑 4D 物体中的张量(以便它们与 2D 卷积层兼容);
train_images = train_images.reshape((train_images.shape[0], 28, 28, 1))
test_images = test_images.reshape((test_images.shape[0], 28, 28, 1))
  • 一键编码标签集(训练和测试);
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
  • 在从 0 到 1 的范围内重新缩放像素(因为像素的范围是从 0 到 255)。
train_images = train_images / 255.0
test_images = test_images / 255.0

太好了!现在让我们建立一个简单的 CNN,它有以下几层。注意,在本文中,我不打算深入探究每一层和整个结构背后的数学原理。如果你对 NNs 的特性感兴趣,我推荐你阅读这篇文章

#initializing Tensorboard extension%load_ext tensorboard#creating a logs directorylog_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)# number of possible label values
nb_classes = len(class_names) #10model = tf.keras.models.Sequential()model.add(tf.keras.layers.Conv2D(32,(3,3), padding='same', input_shape=(28, 28,1)))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(tf.keras.layers.Dropout(0.25))
model.add(tf.keras.layers.Flatten())model.add(tf.keras.layers.Dense(nb_classes, activation='softmax'))
model.summary()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们训练我们的模型,确保将训练集的 20%作为验证集:

log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)model.fit(train_images, 
          train_labels, 
          validation_split=0.2,
          epochs=10,  
          callbacks=[tensorboard_callback])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意,添加tf.keras.callbacks.TensorBoard回调确保了日志的创建和存储:这在调用 Tensorboard 扩展时是需要的。

用 Tensorboard 可视化这一切

一旦我们的模型被训练好,通过使用%tensorboard logdir logs/fit magic 命令,我们可以可视化我们的结果的一个很好的仪表板:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然,一切都是互动的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如你所看到的,Tensorboard 提供了各种各样的视觉项目,有助于深入了解 CNN 的表现和结构。请注意,在字段中,您可以以互动的方式可视化您网络的整体结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,只需几行额外的代码,我们就成功地将我们的网络变成了一个具有非常有趣的洞察力的可视化仪表板。

我希望你喜欢阅读!如果你对这个话题感兴趣,我建议你阅读文档部分的更多内容。

参考资料:

通过“波束搜索+语言模型”解码提升序列生成性能

原文:https://towardsdatascience.com/boosting-your-sequence-generation-performance-with-beam-search-language-model-decoding-74ee64de435a?source=collection_archive---------11-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://www . shutterstock . com/image-vector/digital-binary-code-matrix-background data-flood-1341680024

波束搜索和 LM 解码的时间、原因和方式

每当涉及图像处理、音频数据分析或自然语言处理(NLP)任务时,深度学习都被证明是一个理想的选择,并显示出出色的成果。基于神经网络的模型架构在理解复杂模式以及生成有意义和现实的数据方面非常出色。虽然基于深度学习的解决方案通常非常有效,但使用更好的后处理技术来使预测更加准确从来都不是一个坏主意。

复杂的问题,如神经机器翻译(NMT),图像字幕生成(ICG)和语音识别(ASR),今天都可以通过深度学习来解决。这些问题被归类为序列生成问题,其中给定一个输入,模型学习生成一些文本序列。如果你看一看显示这些任务最先进( SOTA )结果的研究论文,你可能会发现他们的解决方案利用波束搜索解码器与语言模型融合来提高结果。让我们通过例子来了解更多关于这些解码技术的知识——

更进一步,我们将定义一个示例序列生成问题,并探索后处理(解码)技术。我们将从贪婪搜索解码技术开始,并引入融合语言模型的波束搜索解码来进一步改善整体结果。

示例问题

考虑一个英语文本生成的问题,并假设我们已经训练了一个模型来做这件事。根据问题的性质或解决策略,我们的模型可能是字符级模型或单词级模型。字符级文本生成器模型通过一次预测一个字符来生成文本。类似地,单词级文本生成器一次预测一个单词,多个预测的单词组成一个序列。

假设我们已经训练了一个字符级模型,它通过一次预测一个字符来生成文本。此问题可能与以下任何问题相关—语音转文本、光学字符识别、图像字幕生成等。此类问题通常使用编码器-解码器架构来解决,如下图所示。编码器部分负责获取输入向量(音频、图像或文本……)并产生编码的上下文向量。然后,解码器部分使用该上下文向量,通过一次预测一个令牌(char/ wordbbb)来生成输出序列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://stack overflow . com/questions/45977990/tensor flow-how-to-embed-float-sequences-to-fixed-size-vectors

由于我们的模型是字符级的,它将为输出序列中的每个标记生成所有可能字符的概率分布。换句话说,对于我们的模型预测的每个单词(char),它将生成一个长度为 26 的概率数组(根据英语——a 到 z ),概率将显示特定字符成为输出单词的可能性。

对于一个长度为 10(字符) 的预测序列,我们的模型的输出看起来像这样

output_shape = **10 * 26** output = [[**0.1**, 0.01, 0.03, ... ... ... ... ... (len-26)],
          [0.1, 0.002, **0.6**, ... ... ... ... ... (len-26)],
            ''         ''         ''      ''       ''    
            ''         ''         ''      ''       '' 
          [**0.9**, 0.01, 0.01, ... ... ... ... ... (len-26)]]

要将这种概率输出转换成可读形式(英文文本),我们需要一种解码算法。最简单的解码器是贪婪搜索解码器。让我们写一个贪婪搜索解码器和一个叫做波束搜索解码器的复杂解码器

  • 注意— 序列生成问题不一定涉及文本生成,它可以是任何种类的序列。我们以文本生成问题为例,因为在这篇文章中我们也将讨论语言建模。

贪婪搜索解码器

解码模型预测的最简单方法是将最可能的序列视为输出。贪婪解码器,也称为最佳路径解码器,在每次预测中考虑具有最高概率的标记(字符或单词),并连接所有预测的标记以获得最终的输出序列。这是获得输出序列的简单而快速的方法。但它可能不会总是给你最好的输出。

下面是你如何用 Python 为你的模型写一个贪婪的解码器—

这里模型预测的形状是 5*4 这意味着,模型试图生成一个长度为 5 的序列。由于词汇表中只有四个不同的标记,该模型预测序列中每个标记大小为 4 的概率分布。根据定义,贪婪解码器通过在每个时间步长选择最可能的记号来生成具有最高概率的序列。

波束搜索解码器

波束搜索解码是另一种流行的解码模型预测的方法,它在几乎所有情况下都比贪婪搜索解码器产生更好的结果。与贪婪解码器不同,它不仅仅考虑每次预测最可能的令牌,它还考虑具有更高概率的前 k 个令牌(其中 k 被称为波束宽度波束尺寸 )。虽然波束搜索给出了更好的结果,但是由于计算复杂,它使得整个流水线很慢。

因此,它不只是给你一个输出序列,它给你 k 个不同的输出序列以及它们的可能性(概率)。与只有一个输出序列的贪婪解码器不同,这里有 k 个不同的输出序列,这 k 个序列中很有可能有一个是正确的输出序列。

算法

对于第一个时间步预测,选择 k 个概率较高的令牌,而不是一个(因为在 greedy 中我们只选择一个)。现在更进一步,考虑当前预测的每个记号,并将其附加到所有先前解码的 k 个序列,并继续计算新序列的相应概率。现在根据概率得分从新序列中选择前 k 个序列,并移动到下一个时间步。重复这个过程,直到最后一个令牌。最后,返回 k 个序列及其对应的概率值。

提示: 单词波束搜索 是波束搜索解码技术的另一种变体,其限制或选择仅具有字典单词的输出序列。在大多数情况下,它比普通的波束搜索执行得更好。

用 Python 编写波束搜索解码器—

为什么是对数似然法?

这是因为当有更长的序列时,常规概率会引起问题。例如—考虑由模型生成的长度为 100 的序列。并且序列中每个记号的概率是 0.10 那么输出序列的概率将是所有这些概率的乘积—

Probability of a sequence with 100 tokens would be--
P(sequence) = **p(t1) * p(t2) * p(t3) .............. * p(t100)**
            = 0.1 * 0.1 * 0.1 * .................... * 0.1
            = **10 ^ (-100)** # An extremely small number 

正如我们所见,这是一个非常小的数字。任何编程语言都可能无法比较如此小的浮点数,因为这可能导致下溢。这就是为什么我们计算对数概率而不是常规概率。如果你注意到我们用负对数概率相乘来计算分数(代码中的第 16 行),这是因为概率的对数(0 < 1.0)总是负数。因此我们选择对数分数最小的前 k 个序列。

有 N 个记号的序列的概率是—

**P(seq)** = p(t1) * p(t2) * p(t3) ........ p(tN)### taking log on both sides (calculate **log-likelihood**)**log(P(seq))** = **log(**p(t1) * p(t2) * p(t3) ........ p(tN)**)   log(P(seq)) = log(p(t1)) + log(p(t2)) + .. log(p(tN))**### logarithm of a number < 1.0 will be always negative so  in this ### case log-likelihood of the sequence would be negative.

如果我们在两边取一个的对数,这个乘法就会转换成求和。因此,对数似然的计算而不是真实概率的计算会更快更有效。我们知道一个数< 1.0 的T5【对数】T6永远是负数。所以我们的序列会得到一个负的分数。我们可以通过取该分数的反对数,将该分数(对数似然)转换为原始概率。为了使用波束搜索找到 k 个最佳序列,我们只需要比较某些序列的概率,所以对数似然法就可以了。

++语言模型

现在我们知道,波束搜索解码器给你 k 个不同的输出序列,而不是一个,很有可能这些序列之一是正确的输出。但是我们没有办法确定哪个输出序列是最好的。这就是语言模型发挥作用的地方。

什么是语言模型?

语言模型是给定语言的统计表示。如果给定一个句子中先前出现的单词列表,它应该能够猜出下一个单词。换句话说,语言模型可以确定给定文本序列(句子)的概率,其中序列标记(字符/单词)是从固定词汇表(语言词汇)中提取的。所以,基本上它能给你的句子打分。一个好的分数意味着句子在语境上是正确的,并且属于给定的语言。

语言模型通常在非常大的文本语料库上训练,并且能够理解(学习)给定句子中单词的上下文(共现)。语言模型不一定是单词级别的,我们也可以在字符上训练语言模型。字符级语言模型应该在给定前几个字符的情况下猜测序列中的下一个字符。同样,字符级模型也可以给你一个给定句子的概率(或可能性)。

对文本序列评分的语言模型

考虑一个场景,其中深度学习模型试图生成一些文本(或者考虑一个问题,其中模型试图将语音转换为文本),并且得到的字符概率分布被发送到波束宽度为 5 的波束搜索解码器。假设以下是使用波束搜索解码生成的前 5 个序列。

***Generated Sequences **                  **           Probability (model)**1\. *speech recogniiion is a hald problem* ***0.41*** *2\. speech recog niiion isa hard problem           0.39
3\.* ***speech recognition is a hard problem*** *0.37
4\. spe ech recogniion is a hard problem           0.32
5\. spe ech recogni tion is ahard problem          0.29**

贪婪搜索解码器将给出第一个序列作为输出,因为根据我们的模型,它是具有最高概率(0.41)的序列。但显然(3)是正确的输出,只是概率稍小。

为了找到这 5 个序列中的最佳序列,我们将使用语言模型来检查每个英语序列的可能性。如果我们的语言模型训练有素,它应该给第三个序列一个很好的概率(分数),因为它按照英语是 100% 正确的。

假设根据我们的语言模型,以下是这 5 个序列的可能性。

***Generated Sequences **                  **      Probability  Probability
                                              (model)      (L.M.)**1\. *speech recogniiion is a hald problem* ***0.41*** *0.20
2\. speech recog niiion isa hard problem         0.39        0.40
3\.* ***speech recognition is a hard problem*** *0.37* ***0.70*** *4\. spe ech recogniion is a hard problem         0.32        0.35
5\. spe ech recogni tion is ahard problem        0.29        0.47**

现在,为了选择最佳输出序列,我们将考虑两种概率的加权和—

 ***P(final)** = *Alpha* ***** **P(model)** **+** *Beta* ***** **P(L.M.)***

常量*Alpha**Beta*的值是在验证数据集上调整后决定的。我们选择在验证集上给出最佳结果的值。然后,我们使用这些值在测试集上评估我们的模型。

****注:*有时在计算一个序列的最终得分时,也会考虑序列长度。如果我们不惩罚序列长度的分数,我们的模型将给予更小的序列更多的优先权。因为对于更长的序列,分数会更小(更多概率值的乘积(p < 1.0)会导致更小的分数)。

提示: 据观察,使用 单词级语言模型 在大多数情况下会给出更好的结果。为了能够使用单词级语言模型进行评分,输出序列应该仅限于字典单词。因此,使用词束搜索算法来得出受限制的词束,然后用语言模型对这些词束重新评分,以决定最终输出。

PS: 通常,根据研究论文,当应用波束搜索时,使用非常大的数字作为波束大小(~ 1000–2000)。它提供了更好的结果,但是以速度为代价,因为推理变得非常慢。

原刊此处

很少有研究论文利用波束搜索解码和语言模型来改善结果—

  1. https://papers . nips . cc/paper/5346-sequence-to-sequence-learning-with-neural-networks . pdf
  2. 听、听、拼(https://arxiv.org/pdf/1508.01211.pdf)
  3. 展示和讲述(【https://arxiv.org/pdf/1411.4555.pdf】)
  4. 音序器(https://arxiv.org/pdf/1901.01808.pdf)

图像来源:

  1. **(矩阵图像)https://www . shutterstock . com/image-vector/digital-binary-code-matrix-background data-flood-1341680024
  2. **(LSTM 自动编码器)https://stack overflow . com/questions/45977990/tensor flow-how-to-embed-float-sequences-to-fixed-size-vectors

就这样吧!

感谢阅读,别忘了和我分享你的想法。

在 2020 年推动您的小型企业

原文:https://towardsdatascience.com/boosting-your-small-business-in-2020-6ae3529cbfb0?source=collection_archive---------33-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由Á·阿尔瓦罗·塞拉诺Unsplash 上拍摄

毫无疑问,2019 年是人工智能(AI)年。我们已经听说了很多,但许多人不确定这是否只是最新的时尚,或者是否会持续下去。

如果我们稍微观察一下我们周围世界正在发生的事情,到 2025 年,人工智能产业将在全球范围内增长到 1900 亿美元的产业。23%的企业已经在以某种形式使用人工智能,到 2021 年这一比例将上升至 75%。事实上,根据国际数据公司(IDC)的数据,今天 40%的数字化转型都使用了人工智能服务。

有人可能会说,这适用于大公司,但不适用于小企业。这种假设与事实相去甚远。在这篇文章中,我们将看看人工智能如何帮助小企业,特别是;餐馆,零售商,服务行业和那些在酒店工作的人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由丹金Unsplash 上拍摄

让我们看看餐馆。公司账目已经记录了与原材料采购相关的大部分数据。销售记录可以通过销售点系统获取。此外,如今大多数餐馆都有自己的网站或 facebook 页面。如果将这三条信息结合起来,再加上一些人工智能,餐馆老板就能对未来的经营有一些难以置信的洞察力。该系统可以很容易地计算客流量(即使考虑到季节性、节日等)。),并且它将能够分析客户。它本质上意味着人工智能可以预测;什么时候有人会预订一张桌子,有多少人,他们可能会点什么。这样做的效果是,餐馆老板可以采用一种及时的订购系统,从而减少食物浪费,最终降低约 12%的成本。人工智能甚至可以分析社交媒体上的评论,并对餐厅提出可能的改进建议。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人工摄影Unsplash 上拍摄

谈到零售,大多数商店都依靠冲动购物。为了满足顾客的需求,零售商需要根据顾客的喜好增加库存。然而,过多的库存可能会有问题,因为它可能会导致库存积压。同样,鉴于大部分数据都是可用的,人工智能可以用来帮助零售商提高销售额。聊天机器人可以通过脸书网页回答用户的询问,还可以一周七天、一天 24 小时出售特定商品。在线门户网站,结合有针对性的宣传活动,可用于在线销售无库存商品。剖析客户有助于预测未来的购买。然后它会减少库存订单;从而储存更少的库存,但获得更显著的销售。这种系统还能够预测客户流失,并显著提高现有客户的保留率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

蒂姆·莫斯霍尔德在 Unsplash 上的照片

在服务行业中,时间至关重要。正因为如此,简单的自动化任务可以走很长的路。最基本的是安排约会。想象一下,一家理发店雇佣了四名理发师。每个理发师每个月可以服务大约 375 个客户(假设每个客户 30 分钟,一周工作 6 天)。因此,这家有四名理发师的商店每月总共有 1500 个预约。如果每个预约都是通过电话进行的,并且每个电话持续 1 分钟,这意味着一个理发师每个月花整整三个工作日来安排预约而不是理发。在这种情况下,一个简单的在线系统就可以实现整个过程的自动化!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由菲利奥斯·萨泽德斯Unsplash 上拍摄

酒店业也可以从人工智能中受益,不管你是拥有一家小型 Airbnb 还是一家大型酒店。人工智能系统可以用来分析列表,对评论进行情感分析,并就如何改善这个地方提出建议。自动翻译使与外国人的交流更加容易,因为电子邮件可以被翻译成地球上最常用的语言。分析有助于预测未来趋势和入住率。客户特征分析将有助于为客户提供个性化的独特体验。最后,人工智能可以用来缓解人员招聘和提供足够的培训。

从上面提到的各种例子中可以看出,无论业务规模大小,AI 都在几个用例中使用。2020 年,我们将在不同的经济领域体验到更广泛的人工智能应用,因为人工智能为任何使用它的组织提供了竞争优势。正因为如此,为什么不制定一个新年计划,并开始关注人工智能带来的可能性。

本文原载于【https://www.businesstoday.com.mt】

Alexei DingliProf 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他已经出版了几本同行评审的出版物,并且是马耳他的成员。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

训练营及以后

原文:https://towardsdatascience.com/bootcamp-beyond-7c37bbde521d?source=collection_archive---------35-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Deepart.io 在神奈川的巨浪和我的一幅画之间创建。

“你是如何成为数据科学家的?”

我经常被问到这个问题,我想我终于可以把我的故事写成文字了。我的目的是给你一些我在通往数据科学的道路上和飞跃中学到的经验。总的来说,我认为这是我做过的最好的决定之一。

我的背景🔙

在大学学习计量经济学时,我分析了预测一个人收入的变量,其中最大的因素是…父母的收入。等等,什么?出生在贫困家庭,父母只有 19 岁,我开始解开我对美国梦的概念。这是否意味着我也注定要经历同样的挣扎?进一步挖掘,发现和我一样的人只有 14%大学毕业。有道理,因为我也是全职工作,并没有真正睡觉。此外,我估计大约 5%的其他数据科学家像我一样是经济学本科。这些估计让我相信大约 1%的数据科学家在这方面是相似的。

我强调这些外部因素,因为我认为我在很多方面都非常幸运。我知道这些基本利率,并积极努力消除那些不利的基本利率。

**这是第一课:**了解你的基础利率。考虑到你的背景和具体的挑战,可能性有多大?他们是支持你还是反对你?如果机会对你不利,调查你可以用什么方法来增加你成功的机会。即使显示“不可能”,这并不一定意味着不可能。

进入🥾训练营

我一直热爱数学、逻辑和批判性思维。虽然我当时并不知道,但这些是数据科学的先决条件。然而,我对数据科学的兴奋遇到了旧金山湾区的一个销售角色。我的销售角色允许我在包装消费品领域探索一些饮食分析。但是,我需要出去。

销售轮换计划结束后,我开始承保商业贷款。当时我认为“银行支付更多”,但发现银行业通往分析的道路太长了。在转变为分析师角色之前,我必须承担两年多的贷款——即使是数据科学也不行。大学毕业两年后,我迈出了一大步:数据科学训练营。

被引导到新兵训练营

在 Kickstarter 活动的初步实得分析中获得 a。通过 Dataquest,用训练营的在线必修课程准备我的新生编码技能。我已经准备好参加数据科学沉浸式培训,这是一个为期 3 个月的全日制项目。

第六届数据科学沉浸式团队[DSI-6]是由 9 名斗志昂扬的专业人士组成的团队,他们希望进入一个预计未来 10 年增长 15%的行业。即使我在多年后写下这篇文章,我们大多数人仍然保持着联系。上课时间是 9-5 点,但我们一直呆到校园关闭,周末还要学习。很激烈。很有趣。我申请了私人学生贷款。

这是一个很大的风险,因为我有一些存款,没有安全网,还承担了额外的债务。我计划了 8 个月的消耗率——包括训练营。

**这是第二课:**了解你的项目期间和之后的财务状况。我强烈地,强烈地向你推荐有激励机制的训练营。无论是像 Lambda School 一样占你未来工资的一定比例;像跳板一样 6 个月没找到工作就付 0 美元;或者是低成本、新进入的第四大脑(由吴恩达的人工智能基金支持)。最终,你希望你的训练营项目直接投资于你最初的成功。

从编码到搜索策略💼

每周 80 小时的编码、调试和机器学习结束了。因为相对于你想申请的职位来说,只有一小部分职位在网上发布,所以大部分的求职都是通过申请/网络和大量的“观望”来完成的。在我空闲的时候,我决定和 DSI-6 的一个朋友一起参加一个追逐比赛。Kaggle 是一个竞争平台,一家公司众包一个问题给数据科学家,以达到一个最佳分数(通常在某些味道中误差最低)。经过几周的“申请/网络,等着瞧”之后,我见到了一家商业地产初创公司的工程总监。幸运的是,Kaggle 竞赛的重点是房地产——Zillow 100 万美元的奖金。

在我面试的那天,我粗制滥造了几个模型,把错误率降低到 0.0745(第一名是 0.0732)。然后我从市场街上的菲尔茨冲刺了几个街区,希望 XGBoost 不要花那么长时间。在与首席技术官、主管和首席架构师的演示结束后,我立即得到了一份工作。值得。

这是第三课:建立你的投资组合。找到您真正感兴趣的数据集,并希望了解更多关于特定问题的信息。你必须做出什么样的假设?你是如何清理和重新格式化数据的?你如何生产你的代码?我的训练营顶点预测了风险投资(有目的地概括)然后我预测了房地产价值。旨在让运气和机会相遇。

第三课警告:我建议不要使用 Kaggle,因为它所涉及的工作并不完全适用于“现实世界”的问题。优化单一指标会严重“过度拟合”速度极慢的模型的数据。在我的 Zillow 示例中,我将 3 个计算密集型模型的输出混合到最终回归中。不清楚你在工作中是否需要这样做。

数据科学家✅

这是我能给出的从训练营向数据科学家过渡的三个最重要的经验。

  1. 了解你的基本利率,积极提高你的赔率
  2. 选择一个能直接激励你被雇佣的训练营
  3. 通过让运气和机会相遇来建立你的投资组合

接下来,我要写一写我作为一名数据科学家最初的过山车经历。先睹为快:商业地产创业失败。在那之前,我很想听听你参观数据科学训练营的经历。一路走来,你学到了哪些道理和教训?

美国国家教育统计中心 发现,出生于社会经济地位最低的四分之一人口中,只有 14.2%的人获得学士学位或更高学位。

事实上 工程以“尽管该领域主要由拥有硕士和博士学位的人组成,但仍有大量拥有学士学位的人(26%)担任这一角色。”从第二张图中,我估计大约 15%的人拥有商业/经济学学位。由于肯定有重叠,我将这些百分比的乘积增加到 5%。

根据美国劳工统计局(2020 年 10 月访问) 的数据,信息(数据)科学家市场预计在 2019-2029 年间增长 15%。取决于你何时看到这篇文章,BLS 更新了他们的预测增长,我记得在 2017 年是 20%。

训练营培养不出高素质的数据科学家

原文:https://towardsdatascience.com/bootcamps-dont-make-high-caliber-data-scientists-9cba935602a5?source=collection_archive---------13-----------------------

为什么自学是 2020 年有抱负的数据科学家的出路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据科学家的角色被吹捧为过去几年最热门的职业之一。随着物联网的不断发展,对数据科学家的需求也将增长。

对数据科学家的需求导致了员工招聘策略的转变。需要拥有高等学位才能被考虑担任数据科学家角色的日子已经一去不复返了。事实上,如今四年制大学学位不再是一项要求。

越来越多的雇主开始意识到一个现实,即正规教育不一定代表能力,尤其是在科技领域。

因此,在过去几年中,数据科学训练营的数量激增。世界各地有几十个项目可供选择,每个项目都承诺可以把你变成一名数据科学家。

如果你不熟悉什么是训练营,训练营是一个技术培训项目,向注册学生教授特定的专业。成功完成后,毕业生将获得结业证书,并加入他们的作品集。许多初学者认为这个证书是必要的,以表明他们接受了高水平的教育,然而,这实际上是不正确的。

我将权衡并分享我对参加训练营的一些好处的想法,同时也探索一些不那么明显的缺点。在我看来,2020 年将是自学成才的数据科学家之年。

上诉

训练营可以提供很多东西,因此他们作为一个商业企业取得了全面的成功。这些项目的推介都非常简单:注册并完成我们的数据科学项目,你将很快找到你梦想中的工作

对于任何有兴趣从事数据科学职业的人来说,这有很大的吸引力:

  • 构建你自己的学习的责任从你的肩上卸下来了,你所需要做的就是沿着你面前的路走
  • 在老师/导师/助手的指导下,你将能够创造出可以写进简历的项目
  • 在你参加夏令营期间,你有一个由同学、老师和其他工作人员组成的支持系统。
  • 你将获得结业证书,证明你已经接受了数据科学领域的培训
  • 一些机构为他们的毕业生提供额外的职业支持。
  • 一些机构提供不同的支付项目,包括延期支付直到你被雇佣。

这听起来像一个了不起的交易。数据科学是一个每天都在增长的巨大空间,几乎每周都有新技术出现(感觉上是这样)。尽管网上有几乎无限的免费资源,但作为一名新科学家,要想知道如何组织自己的学习可能会非常困难。这也可以是自我激励和保持学习纪律。

那么…如果可以,你为什么不想参加训练营呢?

的(不那么明显的)缺点和不足

训练营是一个合法的教育选择。许多大学培养出了能够获得各种工作机会的数据科学毕业生。但是,要考虑一些重大的缺点

  • 训练营任务

训练营旨在将学生变成入门级职位的合适候选人,通常是在初创公司或中小型公司。它们并不是为了让你成为一个能轻易在 FAANG 公司( F acebook、 A pple、 A mazon、 N etflix、 G oogle)或优步或 Airbnb 等独角兽初创公司获得职位的候选人。

Bootcamps 会以一种暗示他们的许多毕业生进入顶级科技公司的方式做广告,然而,这是非常不诚实的。在这些顶级职位上工作的毕业生应被视为异类,不应被视为常态

一般来说,能够获得 FAANG 职位的训练营毕业生之所以能够做到,是因为他们的简历上有比简单的结业证书更多的东西。他们可能比普通的训练营学生(普通学生只有 28 岁)有更多的工作经验和更多的正规教育。数据管理、咨询、写作和口语方面的额外经验也是数据科学家非常需要的技能。

永远记住训练营是一个商业企业。虽然训练营可以从技术上声称他们的课程培养出了 FAANG 级别的数据科学家,但事实是他们的课程并不是学生成功的唯一原因。

  • 教育质量

训练营因在短时间内塞进大量信息而臭名昭著,学生们不仅要跟上,还要掌握材料。一般来说,大多数夏令营持续时间在 3 到 6 个月之间,需要全职投入(每周至少 40 小时)。

候选人必须具备以下技能,才能被录用为入门级职位:

  • 精通 Python 或 R (Python 更受追捧)
  • 精通 SQL
  • 精通统计学、线性代数和微积分是一个很好的奖励。此外,候选人应该熟悉利用各种评估指标创建、运行和评估 A/B 测试。
  • 熟练使用 Matplotlib,Seaborn,Pyplot 等进行数据可视化。(Tableau 是一个不错的加分项,但不是必需的)
  • 精通监督和非监督机器学习技术。具有管道开发、模型评估和优化的经验。

这是训练营将提供的大部分课程,是几个月内要塞进去的大量信息。假设你能跟上并达到上述技能的熟练程度,你将勉强有资格成为一名入门级的数据科学家。然而,还有太多太多的东西要学。

这些是大多数雇主寻找的额外技能(当然取决于行业:)

  • 自然语言处理
  • 深度学习
  • 时间序列分析
  • 大数据分析
  • 云计算
  • 生物统计学
  • 机器人和计算机视觉
  • 还有更多!

同样,这是大量的额外学习材料。训练营不可能在短时间内提供无所不包的数据科学教育。这根本不可能,要学的东西太多了。

理论上,毕业后你可以学习额外的技能。你也可以花更多的时间重新学习和掌握核心课程,成为更好的科学家。

但是……如果你需要进行几个月的额外自学,你不是一直自学会更好吗?

  • 货币和机会成本

大多数对数据科学感兴趣的人没有资源或时间参加训练营。

训练营非常昂贵。学费本身就是几千美元,我见过夏令营收费高达 15000 美元。此外,训练营需要至少 40 小时的全职投入,课外时间用于学习、完成家庭作业和参加社交活动。

有些夏令营提供非全日制注册,时间承诺为每周 20 小时。但同样,在注册之前,你仍然需要了解一些耗时的活动,尤其是如果你打算在注册期间继续全职工作的话。当你计算一下,如果你确实参加了一个兼职项目,同时还保持着一份全职工作,那么在训练营的整个期间,你很容易每周工作 60-70 小时。

  • 结业证书对雇主来说是一个微弱的信号

想象一下:经过几个月不懈的努力,你终于获得了结业证书。你开始找工作,却发现雇主并没有排着队与你面谈。为什么不呢?

训练营结业证书只是表明你完成了训练营的课程。这并不意味着你会成为一名有能力的科学家。

完成证书不会成为你获得面试或其他潜在候选人的邀请的理由。说到底,数据科学训练营是非常新的,而且存在的时间还不够长,他们的认证还不足以让招聘经理选择你参加面试或担任某个角色。

让你从人群中脱颖而出的是你简历上的项目,这些项目体现了你在雇主寻找的技术方面的熟练程度。强大的项目组合将让你获得面试机会,在随后的技术评估和面对面面试中表现出色将让你获得梦寐以求的数据科学家角色。营地能提供给你的东西,没有一样是你自己不能提供的。

自学路线

综上所述,我坚信自学路线是最好的,原因有几个。尽管一开始会困难得多(直到你掌握了基础知识),自学成才的数据科学家真的非常非常受雇主青睐:

  • 自考考生表现出很强的职业道德,高度的纪律性和解决问题的能力。
  • 自学向雇主发出信号,表明你是一个自我激励的人。
  • 自学成才的数据科学家比他们的新兵训练营同伴拥有更发达、更多样的技能。此外,自学的学生在他们的作品集里将会有更多独特而全面的项目
  • 自学的候选人也表现出对数据科学的真正兴趣和热情。

现在我确实提到了开始自学之旅是很困难的。这是真的,因为学习如何编码和统计学的基础知识会非常令人沮丧和无聊。但是当你研究完基本面并开始进行第一次分析时,事情会变得容易得多。

从哪里开始我的自学之旅?

下面是我个人在自学过程中使用的免费资源列表,如果你对自学感兴趣的话。

我也鼓励你去看看我写的关于基于项目的学习的文章,看看另外一个学习策略,我发现它在我刚开始的时候非常有用。编码快乐!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我叫 Kishen Sharma,是一名数据科学家,在旧金山湾区工作。我的使命是教授和激励全世界有抱负的数据科学家。

请随时在 Instagram 上与我联系,并在这里查看我的附加内容。你也可以在这里查看我的其他文章

自助估计和实验

原文:https://towardsdatascience.com/bootstrap-estimates-and-experimentation-adf084d7c6e7?source=collection_archive---------58-----------------------

蒙特卡罗估计第一部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

莫里茨·金德勒在 Unsplash 上拍摄的照片

这些天进行的许多数字实验可以用频率统计方法愉快地分析,因为我们期望数据是正态分布的*。然而,有些指标并不那么容易。以一个旨在增加税收或支付发票的实验为例。如果所有发票要么全部支付,要么根本没有支付,这可以用二项式比例检验卡方检验进行分析。然而,发票的某一部分将被部分支付,使得这些测试不合适。即使我们试图比较实际的账单分布,这些很可能是某种形式的指数分布,有许多小额账单和较少的大额账单,如下所示。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那怎么办呢?处理这个问题的一种方法是使用随机抽样统计工具,通常被称为蒙特卡罗模拟*。与评估实验结果特别相关的两个是**(用于确定平均值等统计参数的分布)和 排列测试 ( 用于确定两个分布之间的统计数据是否存在差异,以及这种差异与偶然情况相比有多大可能是真实的)。在这篇文章中,我们将讨论自举。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由克里斯蒂·金Unsplash 上拍摄

自举使用 替换采样 的概念来生成参数的分布。为了说明这一点,假设我们要估计二十朵花的平均高度。如果没有电脑,我们可以这样做:

  1. 测量每朵花,并在一张纸上记录花的 ID 和高度
  2. 计算样本中花朵的平均高度,并写下来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面我们用 Python 生成了 20 朵花的正态分布高度

现在是有趣和(稍微)神奇的部分……

  1. 把纸片放在帽子里,随机选择一张。
  2. 写下你选择的花的高度,然后把纸放回帽子里。
  3. 随机再选一次——你可能会再选同一个!这就是所谓的 抽样替换。
  4. 重复 20 次,以符合原始样本大小。这些应该是一样的。
  5. 再次计算平均值并记下来——这是平均值的第二个估计值。****

如果你重复上述 1000 次,你会得到 1000 个略有不同的平均值,这些平均值是:

  1. 正态分布,
  2. 提供您估计的花朵平均高度的平均值 的 标准误差。

在(非常不优化,但也许更可读?!)Python 我们可以这样做上面的内容:

****#generate a few normally distributed heights for demonstration
N_flowers = 20
flower_heights = np.random.normal(5,size = N_flowers)data_points = flower_heights
number_of_bootstraps = 1000
average_estimate = [np.mean(data_points)]for j in range(0,number_of_bootstraps):
    random_sample = []
    for i in range(0,len(data_points)):
        random_sample.append(np.random.choice(data_points))
    average_estimate.append(np.mean(random_sample))ax = sns.distplot(average_estimate, bins = 100).set_title('Average Flower Heights')
plt.xlabel("Height [cm]")
plt.ylabel("Count")****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们有我们在这个例子中使用的 20 朵花的平均高度分布的 boostrapped 估计。

作为健全性检查,有必要将自举标准误差与我们使用 frequentist 方法从正态分布中预期的标准误差进行比较。标准偏差为σ、样本大小为 N 的正态分布的平均值(SE)的标准误差如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以使用以下公式将上述内容与我们的自举估计进行比较:

****#normal distribution estimate
std_error_mean = np.std(flower_heights) / np.sqrt(N_flowers) -- 0.1983#bootstrap estimate
bootstrap_estimate = np.std(average_estimate) -- 0.1977****

我听到你们有些人在后台嘀咕- 有什么大不了的!如果没有这些乱七八糟的选择,我们本可以做到的。

但是 …如果(而不是花)我们有一些其他非正态分布的样本呢?那么通常具有某种指数分布的钞票呢?

下面显示的账单的含义是什么?对于实验来说更重要的是(我们试图确定两个均值或其他统计参数之间是否存在差异)均值估计的 标准误差 是多少?

****bill_size = np.random.pareto(1,200)
sns.distplot(pareto).set_title("Average Bill Size")
plt.xlabel("Bill ($)")
plt.ylabel("Count")****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这就有点棘手了,不是吗…

让我们尝试使用 bootstrap 技术对此进行估计,但这次让我们稍微整理一下,并使用一个函数…

****def get_bootstrap_mean(data_values, n_bootstraps):
    '''
    data_values: Pandas Dataframe
    n_bootstrapes: Number of bootstrap estimates to calculate
    Return:
    Pandas Dataframe of the mean estimates
    ''' bootstrap_means = []
    for j in range(0, n_bootstraps):
        sample = data_values.sample(frac=1, replace=True).copy()
        bootstrap_means.append(sample.mean())
    return(pd.DataFrame(bootstrap_means))bill_size_experiment_a = pd.DataFrame(np.random.exponential(3,10000) )
average_estimate_a = get_bootstrap_mean(bill_size_experiment_a, 100)ax = sns.distplot(average_estimate_a, bins = 100).set_title('Average Bill Size Experiment Arm A')
plt.xlabel("Bill Amount ($)")
plt.ylabel("Count")****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太好了!但是这对实验来说意味着什么呢?对于实验来说,我们想让自己相信干预确实有效果。例如,假设我们做了一个旨在增加平均还款的实验?我们怎么知道它起作用了?我们可以比较如下的自举平均分布:

****bill_size_experiment_b = 1.1 +pd.DataFrame(np.random.exponential(3,10000) )
average_estimate_b = get_bootstrap_mean(bill_size_experiment_b, 100)****

然后如下所述比较两个直方图(其中 A 和 B 分别是实验组 A 和 B):

****fig, ax = plt.subplots()
for a in [average_estimate_a, average_estimate_b]:
    sns.distplot(a, bins = 20, ax=ax, kde=False)
plt.legend(["A","B"])
plt.title("Comparison of the Bill Bootstrapped Means")
plt.xlabel("Bill Amount ($)")
plt.ylabel("Count")****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一件很棒的事情是,我们现在可以用 t 检验来比较两个均值分布

****t2, p2 = stats.ttest_ind(average_estimate_a,average_estimate_b)****

对于上述情况,我们得到 p~0,即两个样本的平均值相同的概率几乎为零。如果这是两个实验条件的代表,我们可以有把握地假设它们之间存在差异。

这是一种 非常 强大的技术——它可以用来估计任何统计参数的标准误差,不管底层数据是什么分布。此外,得到的估计值是正态分布的,这使得使用标准频率技术进行比较变得容易。

在下一篇文章中,我将描述 排列测试 。这些特别用于确定参数在两个分布之间不同的可能性。

自举置信区间:基础

原文:https://towardsdatascience.com/bootstrapping-confidence-intervals-the-basics-b4f28156a8da?source=collection_archive---------27-----------------------

如何在没有 t 检验和 p 值的情况下计算任何指标的置信区间

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个 AB 测试:在左边,测试组之间没有统计学上的显著差异;在右边,这样的差异存在(图片作者)

如果你是数据驱动型公司的数据科学家、数据分析师或产品经理,你会对你的产品做很多实验,通常,你会做很多 AB 测试。让我们假设你有一个控制组和治疗组的 AB 测试。当分析结果时,您比较测试组中订单/访问/查看的平均数(或任何其他指标)。显然,您可以计算指标的平均值,甚至可以使用 t 检验和 p 值,如果两个平均值之间存在统计上的显著差异。但是通常,他们说不要只看 p 值,要看置信区间。在这篇博文中,我们发现了如何使用自举来计算置信区间。Bootstrapping 是一种很酷的估计置信区间的方法,因为它不依赖于任何数据分布的假设(例如,与流行的 Welch t-test 相比),并且它很容易自己实现(下面我分享了一个我的实现的链接)。

自举定义和原理

bootstrap 是一种估计标准误差和计算置信区间的方法。自举始于 1970 年布拉德利·埃夫隆;它已经存在了 40 多年,因此从那时起,开发了许多不同类型和方法的自举。

尽管有许多变化,所有的引导步骤看起来如下:

  1. 定义 u —从样本中计算出的统计数据(平均值、中值等)。
  2. 替换原始数据样本的样本。让它成为 F* —经验分布。重复 n 次( n 为引导迭代)。
  3. 计算 u* —从每个重采样中计算的统计量。

然后自举原理说:

如上所述,bootstrap 可用于不同的目标:

  • 估计置信区间
  • 假设检验
  • 偏差消除

每个话题都应该有一个单独的帖子,今天我们只关注自举置信区间。

自举置信区间的方法

当我研究这个主题时,我还没有找到一个一次性包含所有 bootstraps 方法的单一来源,每个引用都有自己的类型。最常见的如下所示:

简而言之,这种方法近似于自举均值和样本均值之间的差异。

让我们考虑一个例子(其他方法也是如此):估计基础分布的均值 μ ,给出一个 80%的 bootstrap 置信区间。

经验自举说:

  • 从重新采样开始,替换原始数据 n 次。
  • 对于每个自举,计算平均值 x* 。
  • 计算每个引导样本的δ = x —x(x是原始数据的平均值),将它们从最小到最大排序。
  • 选择 δ.1 作为第 90 个百分位数, δ.9 作为 δ* 排序列表的第 10 个百分位数,得到 80%的置信区间*[x-δ. 1,x-δ. 9】*。

乏色曼的《统计学大全》一书为经验自助法提供了以下数学符号:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 x 是原始数据的平均值, x* 是自举平均值。

2.百分位自助法

bootstrap percentile 方法使用 bootstrap 样本统计的分布作为数据样本统计的直接近似值,而不是计算差值 δ* 。

对于百分位引导:

  • 从重新采样开始,替换原始数据 n 次。
  • 对于每个引导计算平均值 x* ,从最小到最大排序。
  • 选择 x.1* 为第 10 个百分位数, x.9* 为 x* 排序列表的第 90 个百分位数,得到 80%的置信区间 [x.1,x*.9】。*

或者换句话说:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bootstrap 百分位法非常简单,但它依赖于基于特定样本的 bootstrap 分布,该分布很好地逼近了 x 的真实分布(因此,该来源建议不要使用百分位 bootstrap)。

3.正常自举

正常的 bootstrap 方法不是取 bootstrap 均值的百分位数,而是计算这些 bootstrap 均值的置信区间。

  • 从重新采样开始,替换原始数据 n 次。
  • 对于每个引导,计算平均值 x* 。
  • 使用例如学生 t 检验,计算 x* 数组的 80%置信区间:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 x* 是来自 bootstrap 均值的样本均值, se 是 bootstrap 均值的标准差 s, z* 是临界值(从正态 CDF 的分布表中找到)。

当我将这种方法与其他方法比较时,它的 CI 与其他方法相比总是很窄,这让我很困惑。据我所知,这是因为该定义强烈依赖于关于数据正态分布的假设。

过了一段时间,我在乏色曼的《统计学》中偶然发现了这种方法略有不同的措辞。计算仅在一个参数上有所不同,但它会产生巨大的差异。

4.正常区间自举

正常间隔引导重复正常引导的所有步骤,但对 CI 使用以下公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 se_boot 是标准差的 bootstrap 估计值。

除非 x*的分布接近正态,否则这个区间是不准确的。

基本上,这里的公式没有除以 n. 的平方根,我还没有找到为什么要这样做的解释。如果你有任何想法,请在评论中分享。

5.参数自举

参数自举非常接近经验方法,唯一的区别是自举样本的来源。对于参数 bootstrap,我们从参数化分布中生成 bootstrap 样本。它通常用于贝叶斯后验分布的有效计算,而不是用于实验分析,所以我在这里不详细介绍它。

比较方法

正如前面承诺的,在这里你可以找到 Python 实现的所有方法。目标是估计目标度量平均值的 95% bootstrap 置信区间。我尝试了自举方法、自举样本的数量和数据本身的样本大小。

我的主要问题是:哪种 bootstrap 方法会显示更可靠的结果。首先,正态 bootstrap 显然产生了过于狭窄的 CI(因为正态假设)。在样本足够大的情况下,其他 3 种方法通常相互接近。百分位数和经验类型的优势在于,它们从左侧和右侧提供不同的区间(与正常区间自举相反)。通常,它更好,因为它考虑了数据的分布。正如您在下图中所看到的,百分位数和经验值的区间从左侧开始,在人口平均值所在的一侧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

采用不同方法的自举置信区间(图片由作者提供)

在百分位数和经验方法之间选择,我更倾向于百分位数方法,因为它简单。它的结果非常接近于经验方法,同时在计算中要求少一步。

另一个重要的问题是:要做多少 bootstrap 抽样。这取决于数据大小。如果数据点少于 1000 个,合理的做法是将引导数据库数量减少不超过数据大小的两倍(如果有 400 个样本,则使用不超过 200 个引导数据库,进一步增加不会带来任何改进)。如果您有更多的数据,100 到 500 之间的引导数量就足够了(更大的数量通常不会提高 CI 的准确性)。

而不是结论

使用自举应该记住的一个关键的评论是它不能改善点估计,这意味着自举的质量取决于收集的数据的质量。如果样本数据有偏差,不能很好地代表总体数据,bootstrap 估计也会出现同样的情况。因此,请始终记住,在实验过程中收集的数据应该是总体数据的良好近似值。

在这篇博文中,我描述并比较了基本的 bootstrap 方法。实际上,还存在更多的方法(如泊松、高斯、阻塞等)。此外,bootstrap 不仅与置信区间有关,还用于估计中位数的标准误差、75%百分位数、假设检验等。所有这些都是下一篇博文的好主题🙂

参考

原载于 2020 年 5 月 17 日 https://elizavetalebedeva.com

引导前沿的自然语言处理模型

原文:https://towardsdatascience.com/bootstrapping-cutting-edge-nlp-models-baf62405a2b5?source=collection_archive---------24-----------------------

如何在 5 分钟内启动并运行 XLNet 和 Pytorch

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上的 Pietro Jeng 拍摄

什么是 XLNet

XLNet 是基于 Transformers (BERT、RoBERTa、TinyBERT 等)的现代 NLP 语言模型。)XLNet 在各种自然语言理解任务上的结果接近人类的表现。XLNet 可以生成高中生级别的文本,它可以回答简单的问题。它可以理解狗和猫不一样,但它们都是人类的宠物。
总的来说,XLNet 是一个建立在 BERT 进步基础上的模型。

XLNet 解决了 3 大类 NLP 问题:分类、序列标记和文本生成

分类:

分类任务是自然语言处理中最常见的任务类型。分类任务给一段文本分配一个类别。更广泛地说,他们回答一个问题给定一段文本,告诉我该文本属于哪个类别
分类领域中的任务通常会回答如下问题:

这次就诊我们应该使用什么医疗账单代码?(提供访问描述)
这条短信是垃圾短信吗?(文字已提供)
这个用户感兴趣吗?(提供内容和用户简介)

序列标签:

NLP 中的另一类问题是序列标记。在序列标记中,我们试图在提供的文本中找到一些东西。通常,这种类型的任务将包括在所提供的文本中查找人(NER)或查找一个实体的所有共同引用,即,如果在句子*“玛丽跳过一只蟾蜍。* 没动算法会找出的‘它’指的是玛丽,不是蛤蟆。序列标记的另一个例子是检测哪个股票行情自动收录器与一个公司的每次提及相关联—

NVDA 定于 8 月 15 日报告 2020 财年第二季度业绩。

在随后的四个季度中,该公司的 (NVDA) 收益三次超过咤克斯共识预测,一次错过同样的*(咤克斯)**,平均正惊喜为 3.94%。*

文本生成:

XLNet 的第三种也是最后一种用途是文本生成。这里,给定一小段上下文,XLNet 将预测下一个单词。并且它将继续预测下一个单词,直到被指示停止。在下面的例子中,给定的输入,快速棕色* XLNet 将首先预测狐狸,然后整体查看上下文并预测下一个单词跳过等等。*

快速棕色 …

运行 XLNet

现在,让我们来看看如何设置和运行 XLNet。基于 XLNet 操作的 3 种模式—

XLNetLMHeadModel

XLNet 模型,顶部有一个语言建模头(线性层,权重与输入嵌入绑定)——XLNetLMHeadModel

Daulet Nurmanbetov 提供的示例代码

在这个例子中,你可以看到给定一个序列“快速的棕色狐狸跳过了懒惰的* <面具>****<面具>*成为一个

这种类型的 XLNet Head 通常用于 AI 完成人类句子或根据简短问题打出句子的演示。

XLNetForSequenceClassification

顶部带有序列分类/回归头的 XLNet 模型(汇集输出顶部的线性层),例如用于胶合任务— XLNetForSequenceClassification

Daulet Nurmanbetov 提供的示例代码由 Hugginface 的 Transformers 提供

如上所述,使用 XLNet 开箱即用而不先进行微调会给我们带来相当大的损失值 1.19

这种类型的 XLNet 头用于微调一个模型来为我们分类 NLP 任务。即。,我们可以使用上面的代码对文本或段落进行分类。为了做好分类工作,我们将需要标记的数据进行微调,并获得接近 0 的损失值。通常,根据我的经验,只需要 2k–5k 标记的样本就可以得到一个像样的模型。

XLNetForQuestionAnswering

****XLNet 模型,顶部有一个 span 分类头,用于提取问题回答任务,如 SQuAD(隐藏状态输出顶部的线性层,用于计算“span 开始逻辑”和“span 结束逻辑”)。


Daulet Nurmanbetov 提供的示例代码由 Hugginface 的 Transformers 提供

这种类型的 XLNet Head 用于回答问题或从文本中提取一条信息。同样,与上一个 XLNet 方法一样,我们需要为我们的特定任务提供训练数据,这样才能很好地工作。

我们可以用这些模式做什么?

有了上面提供的 3 种 XLNet 模式,我们几乎可以解决任何类型的 NLP 问题。以下是我使用 XLNet 和其他 Transformer 模型解决的一些问题—
—相关性检测
—共指消解

—NER
—序列分类
—文本生成
—下一个单词预测
—问题回答
—释义检测
—文本分类

我还见过 XLNet 被用来执行图形数据库的 关系提取汇总 任务。

结论

在当今时代,任何人都可以在几个小时内开始使用前沿模型。这是激动人心的时刻,因为其中一些模型在一些特定的任务中与人类能力相匹敌。

重要的是,任何开发人员或喜欢代码的个人都可以使用这些模型,比如 XLNet 模型。

这都要归功于持续的努力,让人工智能对每个人都是免费和可访问的。这些模型的纯 GPU 培训成本有时高达 50 万美元。使用运行在 Kubernetes-like 上的分布式计算和 GPU 集群来生产模型训练,需要花费更多的工程和研究时间。****

公开共享模型权重以促进行业研究和应用的趋势确实令人惊讶。

2020 年美国总统选举中估计选民偏好的自举方法

原文:https://towardsdatascience.com/bootstrapping-method-to-estimate-voters-preferences-in-us-presidential-election-2020-d480ef13aef?source=collection_archive---------55-----------------------

替换抽样技术

声明:本文仅用于教育目的。它不反映或推断任何关于选举的事实信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·温克勒在 Unsplash 上的照片

美国总统大选即将来临。美国总统选举以大量使用数据和分析而闻名。从了解选民的人口统计背景到估计不同州的选举结果,从预测选民的偏好到制定营销策略,数据无处不在。所有的政治活动都在数据分析上花费数百万美元来赢得选举。虽然我们之前已经看到不正确的采样技术未能预测选举结果,但我们不能简单地否认数据在美国总统选举中发挥的重要作用。在本文中,我们将尝试使用一种叫做 Bootstrapping 的抽样技术来了解选民在即将到来的总统选举中的总体偏好。

自举:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:Bootstrap 分布与传统抽样分布(图片由作者提供)

在统计学中,抽样分布理论告诉我们,如果我们从一个未知总体中抽取许多样本,样本的均值、中位数、标准差等统计量。从所有这些样本中得出一个分布,称为抽样分布。如果抽样分布遵循一定的规则,抽样分布的统计量就接近于总体均值、中位数、标准差等参数。这意味着即使我们不知道总体参数,我们仍然可以使用抽样分布理论来估计或推断未知参数。现在,开发抽样分布的主要挑战之一是从总体中获得几个样本。很多时候,我们只有一个总体样本,但要估计总体参数,我们需要几个样本。这就是 bootstrapping 方法在从给定样本生成许多数据样本时派上用场的时候。美国统计学家布拉德利·埃夫隆在 1979 年引入了自举法。在本文中,我们将采用不同选举民调的数据,并尝试应用 bootstrapping 来生成许多民调结果样本,以估计支持民主党和共和党的美国人的百分比。bootstrap 抽样分布的一个主要优点是,我们可以计算不同的统计数据,如均值、中值、方差等。从中。此外,分布不需要遵循任何特定的形状。
需要注意的一个缺点是,bootstrapping 方法从现有样本中生成数据。如果在我们的案例研究中给定的投票样本不能代表选举中所有类型的选民,那么 bootstrapping 方法将不会为不在给定样本中的群体生成数据。因此,我们尽可能多地进行民意调查,以代表所有选民群体,这一点非常重要。我们将使用 R 编程语言来做这个分析。

数据可以在这个链接上找到

https://github.com/PriyaBrataSen/US-Election-Poll

现在让我们来看看数据集…

数据:

此分析中使用的数据集包括民意测验结果。总共有 51 个州,每个州都有不同的民调显示民主党和共和党的支持者比例。

df<-read.csv('pres_polls.csv')
head(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:测向数据帧的前 6 行

从上表我们可以看出,这个数据集中有 8 个变量。Day 变量表示调查在一年中的哪一天完成。变量 state 表示完成调查的状态。区域变量描述了每个状态所在的 4 个区域。永远代表该州选举人票。Dem 和 GOP 代表给予民主党和共和党有利回应的人的百分比。日期列表示调查完成的日期,最后,民意测验者是民意测验的名称。

library(dplyr)poll=unique(pull(df,Pollster))
str(poll)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:投票向量中的行数

让我们研究一下 Pollster 变量,看看这个样本中有多少池结果。我们可以使用“str”函数来查看数据集中有多少独特的投票。从输出中,有 233 个唯一的行,告诉我们给定的样本总共有 233 个投票。我们将使用 bootstrapping 来生成 10,000 个样本,每个样本中有 233 个池的结果。对于 10,000 个样本,我们将得到 10,000 个样本平均值,这将得出 bootstrap 抽样分布。由于自举是一种带有替换的重采样技术,一些样本可能多次具有相同的池。

估计选民的偏好:

在本节中,我们将尝试为整个数据集创建 bootstrap 分布,而不考虑地区或州,以获得全国选民偏好的估计值。之后,我们将为美国的四个地区中的每一个地区构建一个引导分布。我们将计算这些 bootstrap 分布平均值的置信区间,以了解偏好水平。

让我们开始吧…

library(boot)
bootmean=function(x,i){mean(x[i])}prefer_country=function(data){
  boot.object=boot(data,bootmean,R=10000)
  boot.ci(boot.object,conf = 0.95,type = 'bca')
}Dem=round(prefer_country(df$Dem)$bca[,c(4,5)],4)
GOP=round(prefer_country(df$GOP)$bca[,c(4,5)],4)c('Democratc party:',Dem)
c('Republican party:',GOP)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:输出(来自 bootstrap 分布的置信区间)

在 R 中,为了计算引导分布,我们首先加载“boot”库。如果我们是第一次运行这个库,我们必须在加载它之前安装它。为了开发 bootstrap 分布,我们首先需要开发一个函数,告诉 R 当我们从给定的样本生成多个样本时,我们想要计算什么统计量。在我们的例子中,我们希望计算从给定样本生成的每个新样本的平均值。因此,我们在第二行创建了一个名为“bootmean”的函数,它主要获取一个向量并计算其平均值。接下来,我们创建了一个函数‘prefer _ country ’,它主要创建 bootstrap 分布,然后计算 95%置信度下的区间。如果我们仔细观察函数内部,可以看到在第一行中,我们使用了 boot 函数创建了一个名为 boot.object 的引导对象。引导函数将获取我们将传递的数据,并从中计算出 10,000 个新样本,因为我们提到 R=10,000。最后,它将计算每个样本的统计数据,并将结果存储在“boot.object”中。这就是为什么在 boot 函数的第二个参数中,我们传递了在第二行代码中创建的“bootmean”函数。在 boot.object 中存储了不同的东西。如果我们想知道存储在其中的东西是什么,我们可以使用 str(boot.object)来查看对象的结构。然而,在我们的例子中,我们感兴趣的是得到双方均值的置信区间。因此,在下一行中,我们使用了 boot。ci 函数计算 95%置信水平下的均值区间。boot 中保存了几种类型的置信区间。对象,但我们希望偏差校正和加速(’ BCA’) bootstrap 区间。因此,我们提到了 type='bca '。

最后,我们为民主党和共和党的数据调用了 prefer _ country 函数,并将结果保存在“Dem”和“GOP”变量中。最后两行打印出了结果。因此,根据我们的 bootstrap 分析,我们可以在 95%的信心水平下,在这次总统选举中,48.01%至 48.86%的美国人倾向于民主党候选人,43.31%至 44.20%的美国人倾向于共和党候选人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:总体偏好水平的置信区间(图片由作者提供)

让我们看看地区层面,以了解双方的置信区间是什么。我们将使用相同的技术,但我们需要计算每个地区的 bootstrap 样本,而不是整个国家。下面是它的 R 代码

lower=c()
upper=c()
region=c()
a=unique(pull(df,Region))prefer_region=function(data){
  for (i in a){
    data_Dem=data[df$Region==i]
    boot.Dem=boot(data_Dem,bootmean,R=10000)
    p=boot.ci(boot.Dem,conf = 0.95)
    lower=c(lower,p$bca[,c(4)])
    upper=c(upper,p$bca[,c(5)])
    region=c(region,i)
  }
  preference=data.frame(region,lower,upper)
  preference}DEM=prefer_region(df$Dem)%>%rename(Dem_lower=lower,Dem_upper=upper)
GOP=prefer_region(df$GOP)%>%rename(GOP_lower=lower,GOP_upper=upper)
inner_join(DEM,GOP,by='region')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:区域层面的置信区间

我们已经开始建立 3 个空向量’下’,‘上’和’区域’。我们将在这些向量中保存引导输出,以开发数据帧。接下来,我们将不同地区的名称保存在向量“a”中,该向量有四个值:南方、东北、西方、中西部。我们将在 for 循环中使用这个向量来过滤特定区域的数据,然后使用过滤后的数据只为该区域开发引导样本。现在,我们已经编写了另一个名为‘prefere _ region’的函数,它从我们的 df 数据帧中获取一列作为输入。在函数内部,我们编写了一个循环,它主要获取指定的列,并针对特定区域对其进行过滤。该循环将从向量“a”中读取地区名称,并以类似于我们对整个国家所做的方式执行自举计算。每次,我们已经计算了间隔,我们已经在“下”向量中保存了下限,在“上”向量中保存了上限。此外,我们将区域名称保存在“区域”向量中。一旦所有区域的计算完成,for 循环结束。现在,我们采用了三个向量“下”、“上”和“区域”,并创建了一个名为“首选项”的数据框。这是我们函数的结尾。在最后三行中,我们主要调用了民主党和共和党的函数,并将结果保存在输出中显示的一个数据框中。

如果我们观察结果,我们可以看到,在 95%的信心水平下,民主党在西部、东北部和中西部地区的平均百分比区间更高。然而,在南部地区,间隔相互重叠。南部地区 46.19%至 47.56%的美国人倾向于民主党候选人,南部地区 45.41%至 46.81%的美国人倾向于共和党候选人。

结论:

从上面的讨论中,我们可以看到如何使用 R 编程语言实现自举。我们能够从 233 个观测值的给定样本中生成 10,000 个样本,每个样本有 233 个观测值。这里重要的一点是,我们试图从国家和地区层面的自举抽样分布中找出区间。它不一定能告诉我们哪个政党将赢得选举,因为这项研究不是在州一级进行的。选举人票因州而异。因此,本研究运用 bootstrapping 方法对选民的总体政治偏好进行了全面的了解。

自举统计。它是什么,为什么使用它。

原文:https://towardsdatascience.com/bootstrapping-statistics-what-it-is-and-why-its-used-e2fa29577307?source=collection_archive---------1-----------------------

比较自举方法和传统方法,并理解它为什么有用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者:特里斯特·约瑟夫

统计学是从数据中学习的科学。统计知识有助于收集数据的正确方法,使用正确的方法分析数据,并有效地展示从数据中得出的结果。这些方法对决策和预测至关重要,无论是预测消费者对产品的需求;利用文本挖掘过滤垃圾邮件;或者在自动驾驶汽车中进行实时决策。大多数情况下,在进行研究时,从人群中收集数据是不切实际的。这可能是因为预算和/或时间限制等因素。取而代之的是,取群体的一个子集,并从该子集收集洞察力以了解更多关于群体的信息。这意味着可以从适当提取的样本中快速且相对便宜地获得适当准确的信息。然而,许多因素会影响样本反映总体的程度;以及结论的有效性和可靠性。正因为如此,我们来说说自举统计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者:特里斯特·约瑟夫

“Bootstrapping 是一种对单个数据集进行重新采样以创建许多模拟样本的统计过程。这个过程允许计算标准误差、置信区间和假设检验”( *Forst)。*自举方法是传统假设检验方法的一种非常有用的替代方法,因为它相当简单,并且减少了传统方法中遇到的一些陷阱,这将在后面讨论。统计推断通常依赖于采样分布和感兴趣特征的标准误差。传统方法(或大样本方法)从总体中抽取一个大小为 n 的样本,该样本用于计算总体估计值,然后进行推断。现在,在现实中,只有一个样本被观察到。然而,有一个抽样分布的概念,它是一个所有可能估计的理论集合,如果人口被重新抽样的话。该理论指出,在某些条件下,如大样本量,抽样分布将是近似正态的,分布的标准偏差将等于标准误差。但是如果样本量不够大,会发生什么呢?那么,就不一定能假设理论抽样分布是正态的。这使得很难确定估计的标准误差,也很难从数据中得出合理的结论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者:特里斯特·约瑟夫

与传统方法一样,大小为 n 的样本是从 bootstrapping 方法的总体中抽取的。让我们称这个样品为 S 。然后,不是使用理论来确定所有可能的估计,而是通过用来自 Sm 次的替换对观测值进行重采样来创建采样分布,每个重采样集具有 n 个观测值。现在,如果取样适当, S 应该能代表总体。因此,通过替换重采样 S m 次,就好像从原始群体中抽取了 m 个样本,并且得出的估计值将代表传统方法下的理论分布。必须注意,增加重采样的数量 m ,不会增加数据中的信息量。也就是说,对原始集合重采样 100,000 次并不比只重采样 1000 次更有用。集合中的信息量取决于样本大小, n ,在每次重采样中保持不变。那么,更多重采样的好处是得到采样分布的更好估计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者:特里斯特·约瑟夫

既然我们已经理解了自举方法,那么必须指出的是,所得到的结果与传统方法的结果基本相同。此外,自举方法将始终有效,因为它不假设数据的任何底层分布。这与理论上假设数据呈正态分布的传统方法形成对比。知道了 bootstrapping 方法的工作原理,一个合乎逻辑的问题就是“bootstrapping 方法是否过于依赖观察到的数据?”这是一个好问题,因为重采样是从初始样本中得到的。正因为如此,假设一个异常值会扭曲重采样的估计值是合乎逻辑的。虽然这是事实,但如果考虑传统方法,将会看到数据集中的异常值也会扭曲平均值并增大估计值的标准误差。因此,虽然认为异常值可能会在重新采样的数据中出现多次并扭曲结果,从而使传统方法更好,但自举方法与传统方法一样依赖于数据。“自举法的优点在于,它是一种导出标准误差和置信区间估计值的直接方法,而且它很方便,因为它避免了重复实验以获得其他组采样数据的成本。虽然不可能知道大多数问题的真实置信区间,但 bootstrapping 是渐近一致的,并且比使用通过样本方差和正态性假设获得的标准区间更准确”( Cline)。

这两种方法都需要使用适当抽取的样本来对总体进行推断。然而,这两种方法之间最大的区别是估计抽样分布背后的机制。传统的方法需要一个满足特定假设的检验统计量来获得有效的结果,这在很大程度上取决于实验设计。传统的方法也使用理论来告诉抽样分布应该是什么样子,但是如果不满足理论的假设,结果就会分崩离析。另一方面,bootstrapping 方法获取原始样本数据,然后对其进行重新采样,以创建许多[模拟]样本。这种方法不依赖于理论,因为采样分布可以简单地观察到,人们不必担心任何假设。这种技术允许对统计数据进行准确的估计,这在使用数据做决策时是至关重要的。

引文:

克莱恩格雷森。使用 r .的非参数统计方法,联合王国,EDTECH,2019 年。

福斯特,吉姆。《统计学中的自举法介绍及实例》。吉姆的统计。https://statisticsbyjim . com/hypothesis-testing/bootstrapping/。访问日期:2020 年 6 月 17 日。

参考文献:

布朗利,杰森。“自举法的简明介绍”。机器学习掌握,2018 年 5 月 25 日。https://machinelementmastery . com/a-gentle-introduction-to-the-bootstrap-method/。访问日期:2020 年 5 月 24 日。

安东尼·库勒萨等人《抽样分布和自助》自然方法第 12 卷,6(2015):477–8。doi:10.1038/nmeth.3414

其他有用的材料:

http://faculty.washington.edu/yenchic/17Sp_403/Lec5-

bootstrap.pdfhttps://web . as . uky . edu/statistics/users/pbre heny/764-F11/notes/12-6 . pdf

http://www . stat . Rutgers . edu/home/mxie/RC papers/bootstrap . pdf

自举与置换测试

原文:https://towardsdatascience.com/bootstrapping-vs-permutation-testing-a30237795970?source=collection_archive---------6-----------------------

入门

使用 Python 进行理论和实验比较

本文的主要目标是从理论上和实验上比较这两种重采样方法,然后在技术上有余地使用其中一种方法的情况下,就何时应该使用每种方法得出一些结论。促使我写这篇文章的原因是,我认为初学者在这个问题上缺乏免费的清晰指南。在一些学习材料中,我甚至遇到了这样的说法,我们可以使用其中任何一个,而没有任何进一步的解释。

文章的主要章节:
1。作为对 bootstrap】的介绍,我们将计算置信区间并分析测试一些假设,然后使用 bootstrap 方法非参数地解决相同的问题。
2。作为排列测试
(也称为显著性测试)的介绍,我们将在与第 1 节相同的数据上使用排列测试来测试假设。
3。我们将开发一个稍微复杂一点的例子,设计几个假设检验,并且
并排比较每个检验的重复统计的 bootstrap 分布和 permutation 分布**。**

我们邀请了一些最好的朋友过来:NumPy,SciPy 和 Matplotlib…熊猫将休息一天,因为我们将使用的数据集相当简单。

import numpy as np
from scipy import stats
from matplotlib import pyplot as plt

1.CI 计算和 HT——通过参数和自举

第一部分,我们将使用 2008 年美国总统选举的结果,来自宾夕法尼亚州和俄亥俄州的“摇摆州”,具体来说,是给定州每个县投票给民主党的选民的百分比(来源:https://www.data.gov/)。

dem_share_PA = [60.08, 40.64, 36.07, 41.21, 31.04, 43.78, 44.08, 46.85, 44.71, 46.15, 63.10, 52.20, 43.18, 40.24, 39.92, 47.87, 37.77, 40.11, 49.85, 48.61, 38.62, 54.25, 34.84, 47.75, 43.82, 55.97, 58.23, 42.97, 42.38, 36.11, 37.53, 42.65, 50.96, 47.43, 56.24, 45.60, 46.39, 35.22, 48.56, 32.97, 57.88, 36.05, 37.72, 50.36, 32.12, 41.55, 54.66, 57.81, 54.58, 32.88, 54.37, 40.45, 47.61, 60.49, 43.11, 27.32, 44.03, 33.56, 37.26, 54.64, 43.12, 25.34, 49.79, 83.56, 40.09, 60.81, 49.81]
dem_share_OH = [56.94, 50.46, 65.99, 45.88, 42.23, 45.26, 57.01, 53.61, 59.10, 61.48, 43.43, 44.69, 54.59, 48.36, 45.89, 48.62, 43.92, 38.23, 28.79, 63.57, 38.07, 40.18, 43.05, 41.56, 42.49, 36.06, 52.76, 46.07, 39.43, 39.26, 47.47, 27.92, 38.01, 45.45, 29.07, 28.94, 51.28, 50.10, 39.84, 36.43, 35.71, 31.47, 47.01, 40.10, 48.76, 31.56, 39.86, 45.31, 35.47, 51.38, 46.33, 48.73, 41.77, 41.32, 48.46, 53.14, 34.01, 54.74, 40.67, 38.96, 46.29, 38.25, 6.80, 31.75, 46.33, 44.90, 33.57, 38.10, 39.67, 40.47, 49.44, 37.62, 36.71, 46.73, 42.20, 53.16, 52.40, 58.36, 68.02, 38.53, 34.58, 69.64, 60.50, 53.53, 36.54, 49.58, 41.97, 38.11]

对于本节和本说明的下一节,我们将使用相同的数据和相同的统计数据来保持示例的一致性,即 PA 和 OH 平均投票百分比之间的差异。

1.1 样品的 EDA

让我们看看每个州的平均值、中值、标准差和样本大小,以及直方图:

print("Mean:\t\t", round(np.mean(dem_share_PA),2))
print("Median:\t\t", round(np.median(dem_share_PA),2))
print("SD:\t\t", round(np.std(dem_share_PA),2))
print("Sample Size:\t", len(dem_share_PA))
plt.hist(dem_share_PA, bins=30, alpha=0.25)
plt.grid()
plt.show()

平均值:45.48
中位数:44.03
标准差:9.73
样本量:67

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

各县的 PA Dem 投票百分比(图片由 Gene Mishchenko 提供)

print("Mean:\t\t", round(np.mean(dem_share_OH),2))
print("Median:\t\t", round(np.median(dem_share_OH),2))
print("SD:\t\t", round(np.std(dem_share_OH),2))
print("Sample Size:\t", len(dem_share_OH))
plt.hist(dem_share_OH, bins=30, alpha=0.25)
plt.grid()
plt.show()

平均值:44.32
中位数:43.68
标准差:9.84
样本量:88

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

各县的选民投票率(T22)

**结论:**分布看起来并不完全正态,但它们可能足够接近于测试参数(分析)解,并且它们稍微正偏(平均值大于中间值,尾部在右侧/正侧更长)。

1.2 置信区间计算

置信度= 90%

1.2.1 CI 通过参数方法计算

(假设总体呈正态分布)

首先,让我们使用正态样本分布(相应地,α/2 在左边,α/2 在右边的 z 分数)来找到下临界值和上临界值(LCV 和 UCV)。在 Python 中,这可以通过使用scipy.stats.norm.ppf()方法来完成,该方法将左侧的 AUC(即百分位等级)作为输入,并返回与所提供的百分位等级相对应的 Z 分数。
注 1 :这是scipy.stats.norm.cdf()方法的逆方法,采用 Z 分数并返回相应的百分位等级。这是用于这种分析的两种最常用的 Python 方法,但是这里的是 SciPy 教程以获得更多信息。
注 2 :如果我们想使用学生的 t 分布而不是正态分布,我们将使用scipy.stats.t类及其方法,它将自由度作为一个附加参数。

# Lower Critical Value
lcv = stats.norm.ppf(0.05)
print("Lower CV:", round(lcv,3))
# Upper Critical Value
ucv = stats.norm.ppf(1 - 0.05)
print("Upper CV: ", round(ucv,3))

下 CV: -1.645
上 CV: 1.645

太好了!现在我们不需要携带这些愚蠢的查找表…
接下来,我们需要均值差异的标准误差(se)。
公式为:sqrt(std(sample_1)^2 / len(sample_1) + std(sample_2)^2 / len(sample_2))

se = np.sqrt( np.std(dem_share_PA)**2 / len(dem_share_PA) + np.std(dem_share_OH)**2 / len(dem_share_OH) )
print(round(se,3))

1.585

最后,我们需要均值的经验差异:

emp_diff_means = np.mean(dem_share_PA) - np.mean(dem_share_OH)
print(round(emp_diff_means,3))

1.158

现在我们准备好分析计算置信区间:

lower_lim_an = emp_diff_means + lcv * se
upper_lim_an = emp_diff_means + ucv * se
print(round(lower_lim_an,3), 'to', round(upper_lim_an,3))

-1.449 至 3.766

结论:
我们以 90%的信心估计,PA 和 OH 的平均票数之间的真正差异在-1.4493.766
(假设样本近似正态分布)
这一结果通过使用在线 CI 计算器进行验证,该计算器使用学生的 t 分布,结果与我们的非常接近,但比预期的要宽一些:(-1.4676, 3.7876)

1.2.2 通过 Bootstrap 方法计算 CI

一般来说,Bootstrapping 和重采样方法非常强大,因为它们对总体分布做了更少的假设(例如,没有正态约束),通常不涉及公式,并且计算相对简单。

关于自举的一些理论:

  • 首先,Bootstrapping 是一种从一个样本中找到抽样分布(至少是近似分布)的实用方法,而不是从总体中抽取多个随机样本。
  • 模拟从一个群体中仅用一个样本抽取多个随机样本,所以它非常依赖这个单一样本尽可能的随机。
  • 与传统的 t 检验不同,Bootstrap 检验不对实际样本所来自的总体分布施加正态性限制。

首先,我们需要计算测试统计的大量 bootstrap 复制。

让我们定义一个可重用的函数,我们可以利用它来产生测试统计的引导复制,调用一些对每个样本进行操作的基本统计函数(预定义的或用户定义的)。
注意在重新采样和计算每个重复之前,我们不会混合来自不同样本的数据。

def boot_diff(sample_1, sample_2, base_stat_func, num_iter):

    # initialize the list for holding the bootstrap replicates
    bs_replicates = []
    # iterate for the specified number of bootstrapping iterations
    for i in range(num_iter):
        # create the resampled sets of data of the original lengths (WITH REPLACEMENT)
        sample_1_bs = np.random.choice(sample_1, len(sample_1))
        sample_2_bs = np.random.choice(sample_2, len(sample_2))
        # compute the BS replicate using the specified base statistical function and append it to the list of BS replicates
        bs_replicates += [base_stat_func(sample_1_bs) - base_stat_func(sample_2_bs)]

    return bs_replicate

为我们的任务生成 BS 复制:

bs_replicates = boot_diff(dem_share_PA, dem_share_OH, np.mean, 100000)

直观地检查测试统计副本的分布总是一个好主意:

plt.hist(bs_replicates, bins=50, alpha = 0.25)
plt.grid()
plt.show()
print("Mean:  ", round(np.mean(bs_replicates),3))
print("Median:", round(np.median(bs_replicates),3))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平均值差异的 Bootstrap 复制(图片由 Gene Mishchenko 提供)

现在,我们可以将np.percentile()函数应用于这个生成的 BS 副本的大集合,以便在一个步骤中获得置信区间的上限和下限。对于下限计算,我们提供 alpha/2 作为该函数的第二个参数,对于上限计算,我们提供 alpha/2 的补码,因为该函数期望将累积百分位数作为第二个参数。
使用百分位数计算得出的置信区间称为 Bootstrap 百分位数置信区间 :

# the lower limit will be the 5th percentile
lower_lim_bs = np.percentile(bs_replicates,5)
# the upper limit will be the 95th percentile (5's complement to 100)
upper_lim_bs = np.percentile(bs_replicates,95)
print(round(lower_lim_bs,3), 'to', round(upper_lim_bs,3))

-1.433 至 3.792

:如果(且仅当)BS 重复分布呈正态且以真实参数值为中心(偏差较小),我们可以用下面的公式计算 Bootstrap t 置信区间 :
BS_stat_mean +/- t * SE

结论:
结果与分析结果(-1.449, 3.766)相当接近,但这里我们没有对样本的分布做任何假设。

1.3 双尾假设检验

首先,我们将检验总体均值之间的真实差异为 0 的假设。测试条件为:

Ho :(平均 PA 投票%)——(平均 OH 投票%) = 0
Ha :(平均 PA 投票%)——(平均 OH 投票%)!= 0
CL:90%
方向 :双尾

1.3.1 通过参数方法的双尾 HT

让我们使用 Z 值方法。
我们需要计算平均值的假设差异的 Z 值。公式为:
Zc = [(sample_mean_1 - sample_mean_2) - (hyp_difference)] / SE
临界 Z 值与上面计算置信区间中的相同:-1.6451.645
SE(标准误差)也可以在计算 CI 时重复使用:1.585
均值之间的假设差异为0

因此,对于计算的 Z 分数(Zc ),我们得到以下结果:

Zc = (emp_diff_means - 0) / 1.585
print(round(Zc,3))

0.731

结论:无法在 90%的置信水平下拒绝 (FTR)零假设,因为0.731的计算 Z 值正好在-1.6451.645的临界值之间。
直觉上,这是有意义的,因为两个样本的标准偏差相对于平均值而言相当大(分别为 21%和 22%),并且比平均值的经验差异大几倍。

:正态分布的这个 Z 值关联的右尾 p 值(AUC 到右边)是0.23239
双尾 p 值是那个的两倍:0.465
因此,如果我们想要使用 p 值方法进行分析,它也会导致 FTR 决定,因为这个 p 值比我们在尾部的拒绝区域之和(每个区域0.05大得多,由我们的总显著性水平10%定义。

1.3.2 通过自举方法的双尾 HT

在比较两组时,使用 bootstrap 方法比使用 analytical 方法的主要优点是,在 BS 方法下,对总体没有正态性限制。此外,我们在这里不仅限于手段的比较。

生成 bootstrapped test statistic 副本的基本过程与上一节 CI 中的过程相同(也没有混合样本总体,以及替换抽样),因此我们将使用相同的函数:

bs_replicates = boot_diff(dem_share_PA, dem_share_OH, np.mean, 100000)

额外的重要步骤 (与查找 CI 相比)是围绕假设平均值确定重复的分布中心:

bs_replicates_shifted = bs_replicates - np.mean(bs_replicates) - 0

让我们确保我们的最终 BS 重复组是有序的(以假设平均值为中心,并且标准误差的 BS 版本接近分析版本):

print("Replicate 25th percentile, mean, 75th percentile:",
      round(np.percentile(bs_replicates_shifted, 25),3), 
      round(np.mean(bs_replicates_shifted)+1e-4, 2), 
      round(np.percentile(bs_replicates_shifted, 75),3))
print("Replicate Std Dev:", round(np.std(bs_replicates_shifted),3)) # the analytical version is 1.585

重复第 25 百分位,平均第 75 百分位:-1.085 ~ 0.0 ~ 1.07
重复标准差:1.595

看起来不错…现在我们可以得到这组 BS 重复数据中平均值的经验差异的百分位数等级:
( scipy.stats.percentileofscore()np.percentile()的倒数)

emp_diff_pctile_rnk = stats.percentileofscore(bs_replicates_shifted, emp_diff_means)
print("Empirical difference of the sample means:", round(emp_diff_means, 3))
print("Its percentile rank among the replicates:", round(emp_diff_pctile_rnk, 2), "% (AUC to the left)")
auc_left = round(emp_diff_pctile_rnk / 100, 4)
auc_rght = round(1 - emp_diff_pctile_rnk / 100, 4)
print("AUC to the left:  ", auc_left)
print("AUC to the right: ", auc_rght)

样本的经验差异均值:1.158
其在重复中的百分位数排序:76.69 % (AUC 向左)
AUC 向左:0.7669
AUC 向右:0.2331

我们现在需要非常仔细地解释这个结果,这取决于我们正在进行的测试类型,以便获得 p 值:

  • 如果我们正在进行左尾测试,我们需要将 AUC 带到左边
  • 如果我们正在进行右尾检验,我们需要将 AUC 向右移动
  • 如果我们正在进行一个双尾检验,我们需要取较小的 AUC 值(因为它总是代表一个尾区域)并乘以 T2

因此,我们正在进行的双尾检验的 p 值为:

auc_tail = auc_left if auc_left < auc_rght else auc_rght
p_val = round(auc_tail * 2, 4)
print("P-value:", p_val)

p 值:0.4662

结论:未能在 90%置信水平下拒绝(FTR) 原假设,因为 p 值远大于0.10的显著性。

1.4 单尾假设检验

这里,我们将测试 PA 和 OH 平均值之间的真实差值小于或等于-2.0 的假设(换句话说,预计 OH 的平均投票百分比至少比 PA 大2.0)。

注意:在陈述这个单尾假设时,为了便于说明,我们保持了与上述例子中相同的均值顺序,尽管陈述这个不等式更自然的方式是“OH mean — PA mean > = 2”。

Ho :(平均 PA 投票%)——(平均 OH 投票%)<=-2
Ha:(平均 OH 投票%)——(平均 OH 投票%)>-2
CL:90%
方向 :右尾(自 Ho 拒绝

1.4.1 通过参数方法的单尾 HT

我们需要计算平均值的假设差异的 Z 值。公式为:
Zc = [(sample_mean_1 - sample_mean_2) - (hyp_difference)] / SE
SE(标准差)可以从计算 CI 中重复使用,也就是1.585
假设平均值之差为-2。我们假设人口的正态分布。
因此,对于计算的 Z 得分(Zc ),我们得到以下结果:

Zc = (emp_diff_means - (-2)) / 1.585
print(round(Zc,4))

1.9926

如果使用 Z 值方法,我们需要计算0.10的右尾 alpha 的上临界 Z 值,该值可以直接与计算的 Z 值进行比较:

round(stats.norm.ppf(0.9),4)

1.2816

如果使用 P 值方法,我们需要找到与计算的 Z 值相关的右尾 P 值。
首先,我们计算左边的 AUC:

# use scipy.stats.norm.cdf(), which is the inverse of stats.norm.ppf()
auc_left = round(stats.norm.cdf(1.9926), 4)
print("AUC to the left:", auc_left)

左边的 AUC:0.9768

因为我们正在寻找右尾下的 p 值,所以我们需要从1 :
中减去这个值(如果我们正在进行左尾测试,我们将按原样取这个 AUC 值)

p_val = 1 - auc_left
print("P-value:", p_val)

p 值:0.0232

结论:拒绝零假设因为:

  • 计算出的1.9926的 Z 值大于1.2816的临界值上限
  • 计算出的0.0232的右尾 p 值小于0.10的右尾显著性

1.4.2 通过自举方法的单尾 HT

生成引导复制的基本过程与之前相同:

bs_replicates = boot_diff(dem_share_PA, dem_share_OH, np.mean, 100000)

额外的重要步骤 (与查找 CI 相比)是围绕假设平均值确定重复的分布中心:

bs_replicates_shifted = bs_replicates - np.mean(bs_replicates) - 2

让我们确保我们的 BS 重复样本总体以假设平均值为中心,并且标准误差的 BS 版本接近分析结果:

print(“Replicate 25th percentile, mean, 75th percentile:”,
 round(np.percentile(bs_replicates_shifted, 25),3), “~”,
 round(np.mean(bs_replicates_shifted)+1e-4, 2), “~”,
 round(np.percentile(bs_replicates_shifted, 75),3))
print(“Replicate Std Dev:”, round(np.std(bs_replicates_shifted),3)) 
# the analytical version is 1.585

重复第 25 百分位,平均第 75 百分位:-3.077 ~ -2.0 ~ -0.94
重复标准差:1.584

看起来不错…现在我们可以得到这组 BS 重复数据中平均值的经验差异的百分位数等级:

emp_diff_pctile_rnk = stats.percentileofscore(bs_replicates_shifted, emp_diff_means)
print("Empirical difference of the sample means:", round(emp_diff_means, 3))
print("Its percentile rank among the replicates:", round(emp_diff_pctile_rnk, 2), "% (AUC to the left)")
auc_left = round(emp_diff_pctile_rnk / 100, 4)
auc_rght = round(1 - emp_diff_pctile_rnk / 100, 4)
print("AUC to the left:  ", auc_left)
print("AUC to the right: ", auc_rght)

样本的经验差异平均值:1.158
其在重复中的百分位数等级:97.55 % (AUC 向左)
AUC 向左:0.9755
AUC 向右:0.0245

解读:
由于这是右尾检验, p 值就是右边的 AUC(非常接近0.0232的分析结果)。
由于我们正在进行单尾检验,我们可以直接将该值与显著性水平进行比较。

结论:拒绝零假设,因为 p 值小于0.10的显著性。

2.使用排列测试的显著性测试

置换检验用于确定观察到的效应是否可以合理地归因于选择样本时引入的随机性。如果不是,我们有证据表明在样本中观察到的效应反映了在人群中存在的效应。置换测试在临床研究等受控环境中非常流行,在这些环境中,需要将接受某种治疗的组与未接受任何治疗的对照组进行比较。

2.1 PT 理论

排列测试时可以用:

  • 当零假设表明两个总体相同时的两样本情形。我们可能希望比较总体的任何基本统计数据。就我们可以选择的统计数据而言,传统测试非常有限。
  • 当零假设表明配对中只有随机差异时的配对情景。这里也可以进行广泛的比较选择。
  • 当零假设表明变量不相关时的两个定量变量情景。通常相关性是最常见的度量,但不是唯一的。

基本上,当有两组数据并且零假设表明它们之间的一些观察到的效应是偶然观察到的时,我们可以执行 PT。

排列测试的一般流程:

  1. 选择一个测试统计量来衡量我们在两组数据之间寻找的效果(这一步在 bootstrap 测试中很常见)。通常这是每个数据集的“基础”统计之间的差异。
  2. 构建如果不存在该效应时该检验统计量将具有的抽样分布(这是排列检验的独特核心)。
  3. 在这个假设分布中找到观察到的(经验的)检验统计值。分布主体中的值很容易偶然出现。尾部中的值很少是偶然出现的,这可能是除了偶然之外的东西在起作用的证据(这在自举中很常见)。

当排列测试时,是否应该使用来代替自举测试:

在双样本检验设置中,我们可以在 bootstrap 检验和 permutation 检验之间进行选择。即使双样本排列测试的测试统计量可能被选择为与双样本 bootstrap 测试相同的(例如,样本均值之间的差异),测试的潜在性质却大不相同:排列测试实际上使用某个狭窄的统计量查看两个样本是否可能假设来自同一个总体,而 bootstrap 测试则专门查看统计量本身,因此排列测试是比 bootstrap 测试更“深入”更普遍的比较,但是(注意!)测试统计可能不会显示出来,这取决于您如何设计它,以及它如何捕捉样本之间的实际差异。

总之,排列测试应用于:

  • 对影响的存在(或不存在)的假设检验(例如,某种影响是否存在,或者是否存在某种积极影响,或者是否存在某种消极影响)。

自举应该用于:

  • 针对特定已知/预期效果的定量假设测试(例如,汽车电池的平均寿命实际上提高了一年或一年以上吗?).
  • 非参数化确定置信区间。

2.2 介绍性 PT 示例

为了介绍这个过程本身,让我们使用同样的双样本场景,我们使用 bootstrap 测试(BT)来测试总体均值之间的差异:

Ho :底层分布相同(均值等特征)
Ha :均值(PA 投票%) —均值(OH 投票%)!= 0

注意 : 这里的检验统计量和替代假设与我们进行的 bootstrap 检验相同,但是零假设必须保持非常通用,这仅仅是由于检验统计量通过排列复制的过程的性质(我们将很快看到为什么)。这里的逻辑是,一旦有足够的证据接受一个相当具体的替代假设,我们就可以拒绝一个非常笼统的零假设,这个零假设是很多东西的合取,包括替代假设的对立面。使用法律类比,在一个刑事案件中,可能只需要从所有可用证据中拿出一条非常具体的证据就可以打破非常普遍的无罪推定。然而,与法律环境不同的是,在排列测试中,我们通常对零假设本身不感兴趣(除非实际的测试目标是知道总体是否相同)。所以焦点转移到了另一个假设上。

让我们定义一个可重用的函数,我们可以利用它来产生一个测试统计的排列副本,调用一些对每个样本进行操作的基本统计函数(预定义的或用户定义的)。

def perm_diff(sample_1, sample_2, base_stat_func, num_iter):

    # initialize the list for the test statistic replicate
    perm_replicates = []
    # iterate for the specified number of iterations
    for i in range(num_iter):
        # concatenate the two samples into one
        samples_app = sample_1 + sample_2
        # permute the entire appended set (making this complete combined resampling WITHOUT REPLACEMENT)
        samples_perm = np.random.permutation(samples_app)
        # create the hypothesized samples by:
        #  pretending that the first len(sample_1) elements is the first sample
        sample_1_hyp = samples_perm[:len(sample_1)]
        #  and the rest is the second sample
        sample_2_hyp = samples_perm[ len(sample_1):]
        # compute the test statistic replicate and append it to the list of permutation replicates
        perm_replicates += [base_stat_func(sample_1_hyp) - base_stat_func(sample_2_hyp)]return perm_replicates

现在,让我们生成置换复制集:

perm_replicates = perm_diff(dem_share_PA, dem_share_OH, np.mean, int(1e5))

让我们简单看一下均值差的假设分布。它应该以零为中心,并且应该近似正常。

plt.hist(perm_replicates, bins=50, alpha=0.25)
plt.grid()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

均值差异的排列复制(图片由吉恩·米先科提供)

现在我们需要从两个尾部得到 p 值,该值与使用该分布的均值的经验差异相关。
注意由于中心极限定理,置换分布在大多数情况下应该是相对对称的,作为一个好的实践,最好直接得到两个尾部下的 AUC。有几种技术方法可以做到这一点:

# looking at the absolute values on both tails and comparing them to the absolute empirical value simultaneously
p_val_2t_a = sum(np.abs(perm_replicates) >= abs(emp_diff_means)) / len(perm_replicates)
print(round(p_val_2t_a, 4))# Get the percentile rank of the NEGATIVE ABSOLUTE empirical value and take it as-is (looking at the left tail)
lt_p_val = stats.percentileofscore(perm_replicates, -abs(emp_diff_means) ) / 100
# Get the percentile rank of the ABSOLUTE empirical value and take the complement of it (looking at the right tail)
rt_p_val = 1 - stats.percentileofscore(perm_replicates, abs(emp_diff_means) ) / 100
# Add the two half-values together
p_val_2t_b = lt_p_val + rt_p_val
print(round(p_val_2t_b, 4))

0.4709
0.4709

结论:FTR (保留)原假设,即县对民主党人有利的投票百分比对 PA 和 OH 的分布是相同的,因为所得的 p 值大于0.10的显著性。

可能值得注意的是,这里的 p 值比使用分析法和自举法(0.465)比较平均值时略大…样本是相似的,所以很难判断结果的这种差异是否真的有意义,但一般来说,较大的 p 值是保持零假设的更强基础。

3.比较 Bootstrap 和置换分布

3.1 工作流程概述

因为在可以使用自举的情况和可以使用置换的情况之间有一些重叠,所以让我们实验性地比较复制的测试统计的相应总体,以便我们更好地理解使用它们的含义。
每次比较将包括以下假设检验工作流程,部分进行:

(1) 陈述高级业务目标,以及我们正在进行的研究与这些目标的关系。在陈述业务目标和当前研究目标时,要尽可能具体。
**【2】**定义可以帮助我们达到研究目标的统计数据(这里我们假设这些样本是我们得到的唯一数据集,但通常这个阶段包括数据发现、EDA 和/或新数据收集设置的迭代过程,视需要和可行而定)。
(3) 设计使用上述统计量来满足上述研究目标的统计推断任务。根据需要创建尽可能多的任务。对于每个假设检验,需要说明以下项目:

  • 要使用的测试统计
  • 根据选定的统计数据陈述的无效假设和替代假设
  • 测试的方向(单尾/双尾)
  • 置信度/显著性水平
  • 要使用的方法(例如参数/引导/排列)

(4) 执行任务。

步骤(1)可能经常看起来琐碎和不必要,但它是选择统计数据和正确设计测试所必需的。在我们的比较中,步骤(1)和(2)将在 bootstrap 和置换测试中共享。
我们不会执行步骤(4)——实际进行测试——所以我们不需要定义置信区间。

我们将重点比较检验统计重复的两种分布和相应的 p 值:

  • 引导复制分布
  • 置换复制分布

3.2 示例设置

研究目标:这是一项关于一种新的教学方法对大学生成绩影响的假想对照研究。它被直接整合到新教学方法的开发和测试过程中。我们的任务是特别关注新方法的效果,通过学生的考试成绩来衡量。这项研究的结论将与其他考虑因素一起,用于决定是否为该科目改用新的教学方法。
研究设置:一个随机组成的“治疗”组在一个学期内接受新的教学方法,另一个随机组成的“控制”组接受同一科目的传统教学方法。每组由 100 名学生组成。教授这门课程的教师必须同时教授两组学生,以便尽可能地消除教学中的人为因素。两组学生的期中和期末考试是一样的。
为每个小组收集的数据是每个学生的期中和期末考试成绩的平均值,满分为 100 分。

让我们生成示例数据:

# draw the raw random data for the control sample from a normal distribution
np.random.seed(5)
cs_raw = np.random.normal(loc=75.0, scale=9.0, size=100)
# "pivot" the right tail around 100 with a multiplier 
# (there should not be many cases)
cs = [score - (score - 100)*1.5 if score > 100 else score for score in cs_raw]# draw the raw random data for the treatment sample from a normal distribution 
# with a slightly larger mean and a significantly larger standard deviation than for the control sample
# (it is expected that there will be quite a few instances here that go over 100)
ts_raw = np.random.normal(loc=78.0, scale=13, size=100)
# "pivot" the right tail around 100 with a multiplier, which caps the score at the max,
# making the right tail much thicker and shorter
ts = [score - (score - 100)*2.0 if score > 100 else score for score in ts_raw]

3.3 样品的 EDA

fig = plt.gcf()
fig.set_size_inches(16,8)
plt.hist(cs, bins=20, alpha=0.15, label = 'control group')
plt.hist(ts, bins=20, alpha=0.15, color='r', label = 'treatment group')
plt.legend()
plt.grid()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对照和治疗样品(由 Gene Mishchenko 成像)

print("Control   mean, 10th, 25th, 50th, 75th, 90th pctiles:", 
      round(np.mean(cs),2), "~", 
      round(np.percentile(cs,10),2), "~",
      round(np.percentile(cs,25),2), "~",
      round(np.percentile(cs,50),2), "~",
      round(np.percentile(cs,75),2), "~",
      round(np.percentile(cs,90),2))
print("Treatment mean, 10th, 25th, 50th, 75th, 90th pctiles:", 
      round(np.mean(ts),2), "~", 
      round(np.percentile(ts,10),2), "~",
      round(np.percentile(ts,25),2), "~",
      round(np.percentile(ts,50),2), "~",
      round(np.percentile(ts,75),2), "~",
      round(np.percentile(ts,90),2))

对照组均值,第 10、25、50、75、90 百分位数:75.82 ~ 67.12 ~ 70.62 ~ 74.43 ~ 81.78 ~ 86.67

**结论:**看起来平均分数提高了大约 2 分,并且相对于对照组,治疗组中的 A 和 B 学生要多得多,但是在低端也发生了一些事情——更多的学生不及格(分数< 70)并且差距更大。
因此,在本例中,我们可以看到潜在的正面影响和负面影响。

3.4 研究用例 1(平均学习进步)

让我们假设我们唯一关心的商业目标是所有学生平均学习成绩的提高。
测试统计:我们认为治疗组和对照组学生之间的平均测试分数
的任何统计显著正差异都是达到商业目标的证明。

自举测试

Ho :均值(治疗组得分)—均值(对照组得分)= 0
【Ha】:均值(治疗组得分)—均值(对照组得分)> 0
方向 :右尾

排列测试

Ho :学生分数分布相同(含均值)
Ha :均值(治疗组分数)—均值(对照组分数)> 0
方向 :右尾

生成和比较复制分布

首先,让我们生成并绘制两个复制分布:

boot_diff_mean_scores = boot_diff(ts, cs, np.mean, int(1e5))
# DON'T FORGET TO SHIFT TO THE HYPOTHESIZED MEAN (0 in this case)
boot_diff_mean_scores = boot_diff_mean_scores - np.mean(boot_diff_mean_scores) + 0perm_diff_mean_scores = perm_diff(ts, cs, np.mean, int(1e5))fig = plt.gcf()
fig.set_size_inches(10,5)
plt.hist(boot_diff_mean_scores, bins=50, alpha=0.15, label = 'boot repl')
plt.hist(perm_diff_mean_scores, bins=50, alpha=0.15, color='r', label = 'perm repl')
plt.legend()
plt.grid()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自助复制和排列复制—均值差异(图片由 Gene Mishchenko 提供)

分布之间没有很大的差异,排列重复分布略宽(对于较大的样本量,分布之间的差异较小,对于较小的样本量,差异更大)。

现在让我们看看 p 值。由于我们正在进行右尾检验,p 值是观察值的百分位秩的补数:

emp_val = np.mean(ts) - np.mean(cs)
boot_p_val = 1 - stats.percentileofscore(boot_diff_mean_scores, emp_val)/100
print("p-value by bootstrapping:\t", round(boot_p_val,5))
perm_p_val = 1 - stats.percentileofscore(perm_diff_mean_scores, emp_val)/100
print("p-value by permutation:\t\t", round(perm_p_val,5))

自举 p 值:0.09773
置换 p 值:0.10201

结论:排列法比自举法给测试过程增加了更多的随机性(这种差异在样本越小的情况下越明显),所以我们得到了一个更保守的答案。这就是为什么排列测试是分类假设测试的更好选择
在这个具体的例子中,如果我们的显著性水平设置为 10%,方法的选择将产生关键的差异,因为 p 值落在它的不同边上(这也是为什么我们应该总是在实施测试之前确定显著性水平,这样我们就不会试图回解)。

3.5 研究用例 2(留守学生)

现在,让我们说,就商业目标而言,大学管理层不仅关心平均学习成果,还关心学生的辍学率和不合格率(当然,尽可能保持这些比率较低)。
假设研究目标、研究设置和收集的数据自始至终都与这一新信息保持一致,我们能做些什么来实现研究目标?

好吧,鉴于这种人工数据集,我们无法测量辍学率(或课程完成率),但在现实生活中,完成课程的学生的考试成绩会得到这种信息的补充…所以让我们专注于分析低端的考试成绩。

我们可能要考虑的每个数据集的**【基础】统计** 是低于下四分位数的平均分数。因此检验统计量将是治疗组的基础统计量和对照组的基础统计量之间的差异。就像平均测试分数的差异一样,这是一个度量,意味着如果它有一个正的符号,它对业务有好处,反之亦然。
让我们定义一个用于计算基本统计数据的函数,我们可以将它传递给boot_diffperm_diff函数:

def low_quart_mean(arr):
    first_percentile = np.percentile(arr, 25)
    filt_arr = [x for x in arr if x <= first_percentile]
    return np.mean(filt_arr)

现在让我们在处理样品和对照样品上测试它…

low_quart_mean(ts)

60.97728174389116

low_quart_mean(cs)

65.93498145550805

从控制样本到处理样本的平均下降 5 个点…这应该很有趣…让我们来设置我们的测试。

自举测试

Ho :均值(治疗组最低分之一)—均值(对照组最低分之一)>= 0
Ha:均值(治疗组最低分之一)—均值(对照组最低分之一)< 0
方向 :左尾

排列测试

Ho :学生分数分布相同(包括分数最低的四分之一的均值)
Ha :均值(治疗组分数最低的四分之一)—均值(对照组分数最低的四分之一)< 0
方向 :左尾

注意:我们有意将替代假设的方向设定为我们在 EDA 过程中所做的初步发现的方向……否则,置换测试在 FTR 结果(未能拒绝零假设)的情况下将不会非常有用,因为零假设非常普遍(在 PT 中也必须如此)。在研究过程中,必须在第一次测试后保留零假设,然后尝试构建一个不同的测试来“打破它”,这是完全正常的,但如果我们有一个基于 EDA 的“直觉”,并且我们认为我们可以在一个测试中做到这一点,为什么不这样做呢?
在 bootstrap 测试中,我们没有这种限制——零假设可以被定义在与替代假设相同的水平上,并且是相反的镜像,因此测试的方向变得任意。
此外,作为一个提醒,除了排列测试中对零假设的限制,排列测试中的替代假设也有一个限制——测量假设数据集之间差异的重复统计必须以 0 为中心,因为方向性在这个过程中丢失了。
Bootstrap 测试对 HoHa 没有这些限制,这就是为什么对于已确认/预期效果的定量测试来说 Bootstrap 是一个自然的选择

生成和比较复制分布

boot_diff_lqms = boot_diff(ts, cs, low_quart_mean, int(1e5))
# DON'T FORGET TO SHIFT TO THE HYPOTHESIZED MEAN (0 in this case)
boot_diff_lqms = boot_diff_lqms - np.mean(boot_diff_lqms) + 0perm_diff_lqms = perm_diff(ts, cs, low_quart_mean, int(1e5))fig = plt.gcf()
fig.set_size_inches(10,5)
plt.hist(boot_diff_lqms, bins=50, alpha=0.15, label = 'boot repl')
plt.hist(perm_diff_lqms, bins=50, alpha=0.15, color='r', label = 'perm repl')
plt.legend()
plt.grid()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BS 复制和烫发。重复——下四分之一差异表示(图片由 Gene Mishchenko 提供)

同样,排列复制似乎分布得稍宽。

现在让我们看看 p 值。因为我们正在进行左尾检验,所以每种情况下的 p 值都是观察值的百分位:

emp_val = low_quart_mean(ts) - low_quart_mean(cs)
boot_p_val = stats.percentileofscore(boot_diff_lqms, emp_val)/100
print("p-value by bootstrapping:\t", round(boot_p_val,5))
perm_p_val = stats.percentileofscore(perm_diff_lqms, emp_val)/100
print("p-value by permutation:\t\t", round(perm_p_val,5))

自举 p 值:0.01304
置换 p 值:0.01651

结论:在这个用例中,重复分布之间的差异甚至比平均值之间的差异更明显,置换法产生了更宽的测试统计分布,并产生了更大的 p 值,这是一个更保守的零假设拒绝标准。

3.6 BT 与 PT —总结

Bootstrapping 是一种更通用的方法,它不局限于具有两组数据的情况,不局限于假设检验,并且在无效假设和备选假设方面限制较少。它应该用于估计置信区间和已知效应的定量假设检验。

置换检验可用于两个数据集(两个样本、配对或一个样本中的两个变量)的设置中,当我们想要确认两个数据集之间存在(或不存在)某种可观察到的效应时,应使用置换检验。

无聊的游戏——一个封闭的数据科学家的沉思

原文:https://towardsdatascience.com/bored-games-c31340859bef?source=collection_archive---------69-----------------------

Python 中探索性数据和回归分析的一个上午

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片作者)

面对现实吧——在本月第十次拿出拼字板后,更多时间呆在家里的新鲜感开始消退。

抛开圣诞节前后的年度高峰不谈,一级防范禁闭已经让人们在网上搜索桌游的人数激增。这与搜索“无聊”的人增多不谋而合。

现在,虽然我不想宣扬虚假的相关性,但我发现在英国封锁期间,人们搜索“无聊”和“桌游”的趋势很能说明问题。受此鼓舞,在几个小时的空闲时间里(大约是我在拼字游戏中选择下一个单词的时间),我想知道我还能找到更多关于英国新的最受欢迎的过去时光的信息。

Kaggle 数据集 来救援了!

简单的搜索让我找到了一个取自 BoardGameArena 的精彩数据集,它提供了超过 100k 个游戏的全部信息!在看到数据集中的可用数据后,我发现自己想要深入的两个领域是年龄分级(“适合 12 岁以上”等。 ) 以及为众多游戏收集的星级财富。我想到了以下问题:

  1. 为年轻玩家设计的游戏是为了玩得更快吗?
  2. 某些游戏发行商在创作高质量、受欢迎的游戏方面是否落后于其他发行商?
  3. 给定这个不同的数据集,我能根据它的特点预测某个游戏将得到的评级吗?

前两个问题可以通过快速的探索性分析来回答,也就是说,直观地检查数据的某些部分,所以让我们开始吧。

为年轻玩家设计的游戏是为了玩得更快吗?

下图是一个方框图,显示了推荐的游戏时间是如何随着游戏的年龄范围而变化的。我还用灰色条显示了每个年龄有多少游戏被分级。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意,随着最小年龄从零开始增加,中值游戏时间(每个框中的橙色线)是如何增加的,然而,在 12 岁以上,建议的游戏时间似乎会减少。

似乎建议的游戏时间随着推荐年龄从零开始增加而增加,但是在 12 岁时达到一个转折点,之后它再次减少。

一个可能的原因是年龄限制的游戏,这里我认为是 15 岁以上,是为晚上/饭后聚会设计的,也许需要更快的游戏。

另一个可能的原因可能是这些年龄范围的样本量减少了,尽管每个范围都有 1000 多场比赛,我现在可以把这个问题放在一边。

某些游戏发行商在创作高质量、受欢迎的游戏方面是否落后于其他发行商?

在我们调查顶级发行商的游戏等级之前。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

排名靠前的出版商按评分从高到低排序。

我们可以看到,虽然大约三分之二的顶级出版商拥有非常相似的评级,但有一些接近图表底部的出版商开始让这一方失望。

让我们简单地关注一下表现最差的出版商。当查看像这样的数据的单个切片时,需要考虑的一个问题是可能有一个被忽略的变量。这是回归分析中突然出现的一个概念,但在这里也适用。想象一下这个场景:

人们喜欢文字游戏,他们通常对它们评价极高。人们不太喜欢角色扮演游戏,对它们的评价也更低。如果某个发行商制作的角色扮演游戏比其他大多数发行商都多怎么办?后续的低收视率是发行商的影响,还是游戏类型的影响,或者两者兼而有之?

像这样同时考虑多种因素,挑出每个变量的真实影响会把我们带到回归分析的领域。

给定这些不同的数据集,有可能根据某个游戏的特点预测出它的评分吗?

要回答这个问题,我们可以用一种叫做线性回归的方法。本质上,我们希望利用我们所知道的关于一个游戏的所有因素(它的类别,它的年龄等级和推荐的游戏时间等等)。)并从中预测该游戏有多受欢迎。这类案件中出现的一个关键问题是:

我们如何知道一个预测是好的呢?

使用我们的案例来构建示例,评估预测是否是高质量的一种常用方法是预测一些游戏的评级,尽管我们手头有真实的评级,但在测试之前,我们没有让模型看到(并从中学习)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一堆我们知道评级的游戏,使用分成训练和测试子集的方法来评估模型质量。(图片作者)

使用这种技术,我们可以创建所谓的 R 统计量。一个介于 0 和 1 之间的数字,它描述了在游戏评分中看到的变化有多少可以通过我们在模型中包括的因素解释——如果我们的模型给出的 R 为零,它在预测评分方面是无用的,如果它给出的 R 为 0.8,它将只使用我们提供的因素解释 80%的评分变化。

在这种情况下,使用:

Year, Minimum Age, Minimum Play Time, Maximum Play Time, Number of Votes, Category, Game Mechanic, Minimum Player, Maximum Players

…我们可以解释大约三分之一(R = 0.33)的评级变化。

让我们考虑一下这个问题。什么是好的棋盘游戏?是创作的年份吗?—也许有一点。是它需要的玩家数量吗?—我玩过一些很棒的双人游戏,也玩过一些很烂的!因此,虽然这些因素可能解释了一点什么使游戏变得有趣,但它们可能没有触及问题的核心——所以我们为什么要期待非常高的 R 值呢?

我想这可以归结为…回归方法不是魔法,它们只能显示关系,如果这些关系一开始就存在的话。

从另一个角度来看,如果你是一个游戏设计师,那么对于一个伟大的游戏来说,仅仅基于这里的因素,并不存在制胜公式

所以我们有了它,有了几个小时的空闲时间和一个免费可用的数据集,我们对游戏如何为年幼的孩子设计有了一些了解,你的下一个游戏可以参考哪些出版商,并看到了使用线性回归预测的一瞥。

无论你是一个现在有更多时间的数据科学家,还是你仍然想知道乐高套装是否真的变得越来越简单,有成千上万的开源数据集正等着你去发现…

你还在等什么?

接下来我要看什么?

在我的分析笔记本中可以找到我下一步要做的技术改变的细节。总的来说,这个快速调查向我展示了在短时间内可能发生的事情,无论这个问题是轻松的还是更深入的,我们对答案的搜索都不一定要以谷歌搜索和假设结束。外面有一整个世界的数据,你的问题的答案可能就在表面之下。

[## Paul stub ley-LinkedIn 自由职业数据和决策科学家

我是一名经验丰富的数据科学家,在个人工作和管理团队方面都有卓有成效的工作经历。

www.linkedin.com](https://www.linkedin.com/in/paul-stubley/)

如果你想联系我,你可以在 LinkedIn 上联系我。如果您想查看完成此分析的 Jupyter 笔记本 ,请在GitHub上查看。google-trends lineplot-race 是使用 【兴盛】 创建的。所有其他图表都是使用Seaborn创建的。封面图片和流程图都是我自己的内容。

【1】这个数据集是 Markus Shepherd 整理出来的,在这里

[2]如果你是盒状图的新手,关注中心的矩形。穿过中间的橙色线显示了中间值——如果所有游戏的评分从最低到最高排成一行,中间值将是列表中间的那个——而矩形的顶部和底部显示了 25%和 75%的界限——因此 75%的游戏评分低于矩形的顶部,但只有 25%的游戏评分低于矩形的底部。通过这种方式,箱线图不仅显示了分布的中心值,还显示了其分布的度量。

冠状病毒封锁期间鲍里斯·自行车在伦敦的使用

原文:https://towardsdatascience.com/boris-bike-usage-in-london-during-the-coronavirus-lockdown-9680a5e52e11?source=collection_archive---------47-----------------------

全球疫情时代的网络分析

点击此处更新截至 2020 年 8 月 9 日的最新 TfL 数据

在冠状病毒疫情期间,围绕公共旅行范围和所用交通方式的数据受到了密切关注——例如,在英国政府的每日简报Citymapper 的移动指数中出现。据我所知,没有人调查过鲍里斯自行车的使用情况。

伦敦交通局(TfL)-通过他们的统一 API开放数据-提供伦敦使用桑坦德循环公共自行车租赁计划(即所谓的“鲍里斯自行车”)的所有旅程的综合数据。在这篇文章中,我试图找出冠状病毒封锁期间人们如何使用这些自行车的行为变化。所有数据都是作者对这个 TfL 数据的分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[来源:unspalsh.com]

我们对每段旅程了解多少?

在 TfL 的数据中,您可以看到每个完整旅程的以下详细信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

骑鲍里斯自行车的一次单独旅行[来源:作者自己的]

我使用 TfL 统一 API 将站点 id 映射到经度/纬度坐标。虽然这些数据非常全面,但不幸的是在可用性方面存在滞后——可用的最新数据截止到 2020 年 4 月底。

鲍里斯自行车在“正常时期”是如何使用的?

首先,利用 2019 年以来的所有旅程,我们需要了解鲍里斯自行车的“正常”用法。左图显示了工作日和周末行为的明显区别。自行车租赁在工作日是双峰式的——当自行车用于通勤时,在工作日的开始和结束时有两个明显的使用高峰。在周末,租用是单峰的——自行车用于休闲旅行或锻炼,租用高峰在下午三点左右。考虑到伦敦的天气,数据中有很多季节性就不足为奇了,如右图所示。夏季月份的使用率明显较高(7 月份的出行量几乎是 12 月份的两倍),但随着人们骑车休闲,周末出行的比例在夏季也有所增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2019 年正常使用情况:周末和工作日呈现不同的使用模式(左图);使用是季节性的(右图)[来源:作者自己的]

在冠状病毒封锁期间,行为发生了怎样的变化?

英国政府从 3 月 24 日星期二(今年的第 13 周)开始实施封锁。下图比较了 2020 年(深蓝色)和 2019 年(浅蓝色)每周的旅行次数,红线显示了 2020 年每周的使用量占 2019 年使用量的百分比。虽然旅行频率通常会增加(随着天气的改善),但从第 12 周(封锁前的一周,政府建议不要社交)开始,使用率急剧下降,并在实施封锁后的第 13 周触底。有趣的是,使用率大幅反弹,截至 4 月底,已达到 2019 年水平的 85%。这与地铁、公共汽车和道路的使用形成对比(如政府每日简报所示)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对比 2019 年(浅蓝色)和 2020 年(深蓝色)的周雇佣量。当宣布封锁时,使用停止了,但后来又恢复了[来源:作者自己的]

自从封锁开始后,使用类型有变化吗?

在封锁之前,使用率可以总结为主要由工作日通勤和周末休闲/锻炼驱动,有两种截然不同的租用制度。下面的左图显示,在封锁期间没有什么不同——每天看起来都像周末。在早上的通勤时间仍然有一个小的工作日高峰,因为一些人仍然在上班。与周末(下午 2 点至 4 点)相比,工作日的使用高峰在一天的晚些时候(下午 5 点至 7 点)。这表明人们在下班后骑自行车进行一天一次的锻炼。

如果你在同一个停靠站开始和结束一次旅行,这是一次纯粹的休闲或锻炼的最清晰的标志。下图显示了这种旅行的频率,增加了 5 倍。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

封锁期间的使用模式表明,自行车主要用于休闲和锻炼目的[来源:作者自己的]

鉴于这种用法的变化,人们会去不同的地方吗?

这些数据可以被认为是图论的一个很好的应用,每个旅程代表一个顶点,每个停靠站代表一个节点。下面的图表将每个停靠站映射为红点,将每个旅程映射为蓝线(仅显示最受欢迎的 4000 条独特路线)。对接站节点的大小对应于在该站开始或结束的旅程的数量;这是按比例缩放的,以便最流行的扩展坞在两个图表上具有相同大小的节点。图中显示了泰晤士河的大致形状(尽管并不完全准确)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

封锁期间的使用远不集中在伦敦市中心的交通枢纽国王十字和滑铁卢[来源:作者自己的]

在封锁之前,你可以清楚地看到伦敦市中心周围的焦点——特别是国王十字车站和滑铁卢附近的两大活动集中地,代表着交通网络的主要枢纽。虽然最繁忙的停靠站位于这些区域,但由于单个停靠站的自行车/停靠站数量有限,而且由于停靠站在这些区域的高度集中,因此没有单个停靠站占主导地位。

相比之下,在封锁期间,网络上的活动分散得多。伦敦市中心的交通枢纽不再占主导地位,使用率也不再集中在最受欢迎的停靠站。

然而,封锁导致一些停靠站变得异常繁忙,尤其是海德公园周围和沿河(威斯敏斯特,南岸)的停靠站。这可以通过查看最受欢迎的车站以及它们占旅程的百分比来看出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

少数车站在封锁期间变得异常繁忙[来源:作者自己的]

通过使用 Python 中的 NetworkX 包,很容易计算一些图论度量。例如,根据扩展坞节点的度中心性来确定扩展坞节点的大小(两个图表中的节点大小相同)强调了锁定前对国王十字车站和滑铁卢车站的关注,以及锁定期间更加统一的网络使用。这个软件包为更有趣的网络分析提供了很大的潜力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

节点大小与对接站的中心度成正比[来源:作者自己的]

有趣的下一步?

当 TfL 发布新数据时,更新分析。尝试通过自行车租赁来确定人们返回工作岗位的程度是很有趣的

更好的制图——如果有一张更准确、更容易辨认的伦敦地图就好了…

更多 NetworkX 分析!

2020 年 6 月 6 日更新:TfL 发布下一批 2020 年 5 月数据

在 2020 年 5 月,封锁程度略有缓解,这也是伦敦天气非常好的一个月。桑坦德自行车的使用率持续上升,每周总骑行次数现在回到(甚至到)2019 年的水平。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

雇佣频率已恢复至 2019 年水平【来源:作者本人】

随着封锁的发展,桑坦德循环的数据可以用来理解行为变化吗?以下热图显示了一年中不同时间(y 轴)的雇佣频率(x 轴上的日期)。颜色越深,在那天的那个时间骑自行车的人就越多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 2020 年的数据中还没有回到通勤模式的证据[来源:作者自己的]

左边的图表显示了整个 2019 年。工作日的特点是上下班时间的使用高峰(如上所述),而周末的使用更多地分布在一天的中间。可以预见的是,在夏季的几个月里,活动量会更大,五月至七月的漫长夜晚鼓励了晚间使用。

右边的图表显示 2020 年至今。在实施封锁之前,使用情况与 2019 年非常相似。3 月下半月的活动明显减少(如上所述),此后几周内,自行车租赁有所恢复。截至 5 月底,没有迹象表明正常的“朝九晚五的通勤模式”回归,活动集中在一天的开始和结束。休闲自行车似乎仍然占主导地位。

随着时间的推移,关注这些数据会很有意思,试图观察更广泛的办公室回报。

截至 2020 年 8 月 9 日更新: TfL 发布下一批 2020 年 6 月和 7 月数据

经过长时间的拖延,TfL 终于发布了截至 8 月 4 日的最新一批数据。在这段时间里,封锁继续放松,酒店行业开始开放,WFH 的指导已经放松,我们现在在外面吃饭来帮助解决问题。这些变化如何反映在桑坦德循环的使用中?

在较高的水平上,使用率仍然很高,与 2019 年的水平非常接近。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

雇佣频率保持与 2019 年水平相当[来源:作者自己的]

然而,最新的热图(左图)显示休闲自行车似乎仍然占主导地位,没有正常“通勤模式”回归的真正迹象。

右边的图表更清楚地说明了这一点;这张图表比较了 2019 年和 2020 年每周工作日上午 8-9 点之间的旅行频率。历史上,这个时间是桑坦德自行车公司活动的高峰期,因为通勤者骑自行车去办公室。尽管鼓励通勤者骑自行车上班,而不是使用公共交通工具,但在此通勤期间的出行量不到 2019 年相应水平的 50%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

休闲自行车似乎仍占主导地位,通勤旅行不到 2019 年水平的 50%【来源:作者自己】

这一最新数据充分表明,迄今为止,重返办公室的步伐一直很慢。

博鲁塔准确地解释了你希望别人如何向你解释

原文:https://towardsdatascience.com/boruta-explained-the-way-i-wish-someone-explained-it-to-me-4489d70e154a?source=collection_archive---------0-----------------------

看看最有效的特征选择算法之一的 Boruta

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征选择是许多机器学习管道中的基本步骤。您丢弃了一堆特征,并且希望只选择相关的特征,而丢弃其他的特征。这样做的目的是通过去除会引入不必要噪声的无用特征来简化问题(听说过 Occam ?).

Boruta 是一种非常智能的算法,可以追溯到 2010 年,旨在自动对数据集执行特征选择。它是作为 R 的一个包而诞生的(这个是最早描述它的文章)。Python 的一个版本 Boruta——叫做 BorutaPy——已经存在,可以在这里找到。

在这篇文章中,我们将看到一些直接的 Python 代码来从头实现 Boruta——我相信从头构建是真正理解它的最好方法——并且,在文章的最后,我们将看到如何使用 borutay 来使我们的生活变得更容易。

1.一切都从 X 和 y 开始

为了看到 Boruta 的行动,让我们建立一个玩具数据集,它具有 3 个特征(年龄身高体重)、一个目标变量(收入)和 5 个观察值。

import pandas as pd### make X and y
X = pd.DataFrame({'age': [25, 32, 47, 51, 62],
                  'height': [182, 176, 174, 168, 181],
                  'weight': [75, 71, 78, 72, 86]})
y = pd.Series([20, 32, 45, 55, 61], name = 'income')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

x 和 y

所以目标是在知道一个人的年龄、身高和体重的情况下,预测他/她的收入。这可能看起来很荒谬(至少在理论上是这样:在实践中,身高已经被证明与薪水有关),但是总的来说,不要受个人偏见的影响是明智的。

在现实生活中,我们必须处理 3 个以上的特征(通常从几百到几千个)。因此,逐一检查并决定是否保留它是不可行的。此外,有些关系(例如非线性关系和相互作用)不容易被人眼发现,即使通过精确的分析也不容易发现。

理想情况下,我们希望找到一种算法,能够自主决定 X 的任何给定特征是否具有关于 y. 的一些预测值

2.为什么是博鲁塔?

一个流行的特征选择算法是 sklearn 的 SelectFromModel 。基本上,你选择一个方便的模型——能够捕捉非线性关系和相互作用,例如随机森林——然后把它放在 Xy 上。然后,从这个模型中提取每个特性的重要性,只保留高于给定重要性阈值的特性。

这听起来很合理,但这种方法的弱点是不言而喻的:谁来决定阈值,以及如何决定?这里面有很大的随意性。

当我第一次遇到这个问题时,我开始寻找一个更健壮的解决方案。直到我找到了博鲁塔。Boruta 是一种基于统计的特征选择算法,即使没有用户的任何特定输入也能非常好地工作。这怎么可能呢?

Boruta 基于两个绝妙的想法。

2.1 第一个理念:阴影功能

在 Boruta 中,特性之间并不竞争。相反——这是第一个绝妙的想法——他们与随机版本的他们竞争。

实际上,从 X 开始,另一个数据帧是通过随机洗牌创建的。这些置换的特征被称为阴影特征。此时,影子数据帧被附加到原始数据帧上,以获得一个新的数据帧(我们将称之为 X_boruta ),其列数是 X 的两倍。

import numpy as np### make X_shadow by randomly permuting each column of X
np.random.seed(42)
X_shadow = X.apply(np.random.permutation)
X_shadow.columns = ['shadow_' + feat for feat in X.columns]### make X_boruta by appending X_shadow to X
X_boruta = pd.concat([X, X_shadow], axis = 1)

在我们的例子中,这就是 X_boruta 的样子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

x _ 博鲁塔

然后在 X_borutay 上安装一个随机森林。

现在,我们将每个原始特征的重要性与一个阈值进行比较。这次,阈值被定义为阴影特征中记录的最高特征重要性。当特征的重要性高于这个阈值时,这被称为“命中”。这个想法是,只有当一个特性能够比最好的随机特性做得更好时,它才是有用的。

重现此过程的代码如下

from sklearn.ensemble import RandomForestRegressor### fit a random forest (suggested max_depth between 3 and 7)
forest = RandomForestRegressor(max_depth = 5, random_state = 42)
forest.fit(X_boruta, y)### store feature importances
feat_imp_X = forest.feature_importances_[:len(X.columns)]
feat_imp_shadow = forest.feature_importances_[len(X.columns):]### compute hits
hits = feat_imp_X > feat_imp_shadow.max()

对于我们的玩具数据集,结果是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一次运行的结果

阈值为 14%(最大值为 11%、14%和 8%),因此有两个特征命中,即年龄身高(分别为 39%和 19%),而体重 (8%)得分低于阈值。

显然,我们应该放下体重,继续关注年龄身高。但是,我们应该相信这次跑步吗?如果只是一次不走运的减肥跑步呢?如果这只是年龄和身高的运气呢?

这就是博鲁塔的第二个绝妙想法发挥作用的地方。

2.2 第二个想法:二项分布

就像机器学习中经常发生的那样(生活中?),关键是迭代。毫不奇怪,20 次试验比 1 次试验更可靠,100 次试验比 20 次试验更可靠。

例如,让我们重复上述过程 20 次。

### initialize hits counter
hits = np.zeros((len(X.columns)))### repeat 20 times
for iter_ in range(20): ### make X_shadow by randomly permuting each column of X
   np.random.seed(iter_)
   X_shadow = X.apply(np.random.permutation)
   X_boruta = pd.concat([X, X_shadow], axis = 1) ### fit a random forest (suggested max_depth between 3 and 7)
   forest = RandomForestRegressor(max_depth = 5, random_state = 42)
   forest.fit(X_boruta, y) ### store feature importance
   feat_imp_X = forest.feature_importances_[:len(X.columns)]
   feat_imp_shadow = forest.feature_importances_[len(X.columns):] ### compute hits for this trial and add to counter
   hits += (feat_imp_X > feat_imp_shadow.max())

这是结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

20 次运行的结果

现在,我们如何设定决策标准?这是博鲁塔所包含的第二个高明的想法。

就拿一个特征来说吧(不管的年龄的身高还是的体重),我们完全不知道它是否有用。我们保留它的可能性有多大?该特性的最大不确定性以 50%的概率表示,就像扔硬币一样。由于每个独立的实验可以给出一个二元结果(命中或未命中),一系列的 n 试验遵循一个 二项分布

在 Python 中,二项式分布的概率质量函数可计算如下:

import scipy as sptrials = 20
pmf = [sp.stats.binom.pmf(x, trials, .5) for x in range(trials + 1)]

这些值看起来像一个铃铛:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征的二项式分布和定位

在 Boruta 案中,拒绝和接受之间没有硬性的界限。相反,有 3 个方面:

  • 一个拒绝区域(红色区域):结束在这里的特征被认为是噪声,所以它们被丢弃;
  • 犹豫不决的区域(蓝色区域):博鲁塔对这个区域的特征犹豫不决;
  • 一个接受区域(绿色区域):这里的特征被认为是预测性的,所以它们被保留。

通过选择分布的两个最极端部分,即分布的尾部来定义面积(在我们的例子中,每个尾部占分布的 0.5%)。

因此,我们对玩具数据进行了 20 次迭代,最终得出了一些有统计依据的结论:

  • 为了预测一个人的收入年龄是预测性的,应该保留,体重只是噪音,应该去掉,
  • 博鲁塔对身高举棋不定:选择权在我们,但在保守的框架下,还是保持为宜。

在这一段中,我们已经实现了必要的代码,但是在 Python 中有一个很棒的(优化的)Boruta 库。

3.在 Python 中使用 BorutaPy

Boruta 可通过 pip 安装:

!pip install boruta

这是它的使用方法:

from boruta import BorutaPy
from sklearn.ensemble import RandomForestRegressor
import numpy as np###initialize Boruta
forest = RandomForestRegressor(
   n_jobs = -1, 
   max_depth = 5
)
boruta = BorutaPy(
   estimator = forest, 
   n_estimators = 'auto',
   max_iter = 100 # number of trials to perform
)### fit Boruta (it accepts np.array, not pd.DataFrame)
boruta.fit(np.array(X), np.array(y))### print results
green_area = X.columns[boruta.support_].to_list()
blue_area = X.columns[boruta.support_weak_].to_list()print('features in the green area:', green_area)
print('features in the blue area:', blue_area)

如您所见,存储在 boruta.support_ 中的特征是那些在某个点上结束于验收区域的特征,因此您应该将它们包含在您的模型中。存储在 boruta.support_weak_ 中的特性是 boruta 无法接受或拒绝的特性(蓝色区域),这取决于数据科学家的选择:这些特性可能被接受,也可能不被接受,这取决于用例。

4.结论

特征选择是机器学习管道中的决定性部分:过于保守意味着引入不必要的噪音,而过于激进意味着丢弃有用的信息。

在这篇文章中,我们看到了如何使用 Boruta 在数据集上执行稳健的、基于统计的要素选择。事实上,做出关于特性的实质性决策对于确保预测模型的成功至关重要。

波士顿 Airbnb 探索性分析

原文:https://towardsdatascience.com/boston-airbnb-exploratory-analysis-75012d987e51?source=collection_archive---------42-----------------------

分析波士顿 Airbnb 房源,寻找成为房东的机会

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

迈克尔·布朗宁Unsplash 上拍照

分析背景

Airbnb,Inc 是一家总部位于加利福尼亚州旧金山的美国公司,是最著名的在线短期租赁公司之一。它专注于住宿交易、寄宿家庭和旅游体验,甚至没有任何真正的国有上市公司。

自成立以来,Airbnb 每年都在持续增长,这对任何有兴趣投资的人来说都是一个有吸引力的市场。随之而来的是,许多关于如何被引导做出最佳决策的问题。

在这个项目中,我们将通过数据分析探索波士顿市的 Airbnb 业务,确定哪些选项可能更有利可图,更值得投资。

数据集

为了找到答案,我们将使用由数据提供的来自 Airbnb 波士顿的文件。世界。该数据集由三个主要文件组成:从 2009 年到 2016 年的房源、评论和日历。

此外,还对有关波士顿市的其他信息进行了外部搜索。

数据探索

波士顿的 Airbnb 房源和旺季

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先,我们将带来一个不考虑上市、旺季和价格变化的总体概述,这将帮助我们了解作为投资者我们可以期待什么。

上面的图表向我们展示了上市公司逐年增长的情况,从中可以观察到自 2009 年以来持续的大幅增长。然而,我们可以注意到增长逐年减弱。

以每年的平均增长作为初始参数,过去五年的增长约为新上市公司的 124%。对比过去几年,我们可以看到分析期内最弱的增长。新上市公司的估计数据显示,2016 年新上市公司的数量增长了 26%左右,与前一年(2015 年)相比增长了 157%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于我们在数据集中没有关于预订的进一步信息,我们将点评数量和最短住宿时间放在了 2009 年 3 月至 2016 年 9 月期间。这个估计向我们展示了一个保守的结果,因为可能会有更多的预订,客人可能会停留更长的时间。

旺季图表明,7 月至 9 月期间是波士顿市最繁忙的时间,尤其是从 2013 年开始到 2016 年这段时间。峰值出现在 2016 年,达到 9.502 人次,同年平均增长约 49%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下图展示了 2015 年 10 月和 2016 年 10 月之间的价格变化。每天最高的平均价格也发生在第三季度,价格在 9 月达到高峰,几乎高出 37%,每天 249 美元。

更显著的价格下降发生在 12 月,此时平均价格相对于峰值下降了约 31%,达到每天 199 美元。观察到的最低值出现在第一学期,每天 188 美元。

如“旺季”图所示,可以观察到第三季度的上升趋势和第四季度的下降趋势,此时低需求相应地降低了价格。

房产类型分析

波士顿 Airbnb 提供许多不同的房屋出租。游客可以选择从整个房子或公寓,直到船,露营车或只是一个负担得起的房间。然而,我们将继续关注那些有更多房源、可能有更多需求的房产。

检查数据集,我们可以找到总共 2880 处房产,其中 7%是公寓,16%是住宅,77%是公寓,分布在 23 个街区。

另一个相关信息涉及哪种属性具有对主机和超级主机的偏好。总主机中有 78%的主机拥有公寓甚至是除其他房产外的公寓,65%的超级主机在其他房产中拥有公寓。

从现在开始,我们必须把重点放在公寓礼仪上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的分析向我们展示了每个街区的客人对房间类型的偏好。

大多数寻找公寓的客人都倾向于租用整个地方,从而产生 1528 套公寓,相当于 70%。私人房间是第二个首选,有 605 个单元,占总数的 28%。与之前的选项相差甚远,合租房间只有 2%的人响应偏好,有 38 个单元。

考虑到整个公寓选项,后湾,南端和芬威肯莫尔是更多的单位数量的街区。如果我们考虑所有的租金选择,奥尔斯顿-布莱顿附近出现作为一个新的选择。无论如何,我们可以看到他们中有相当多的人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的重点表格显示了整个公寓的平均价格,包括每个街区的房间数量。

随着房间数量的增加,价格也会上涨,尽管会有一些异常值。我们还可以观察到,随着房间数量和每日价格的增加,公寓报价下降。除此之外,我们可以意识到,几乎每个社区都有两个房间的财产。

以房间数量来比较日均价格,我们可以看到价格平均上涨了 27%左右。尽管如此,最高的价格差异出现在一居室和两居室之间,第二居室要贵 38%。在多切斯特、米申山和罗斯林代尔,可以找到价格低于 100 美元的工作室。另一方面,Back Bay,Beacon Hill,Roxbury,South Boston,South End e 剧院区的价格普遍较高,在 400 美元以上。

分析距离对价格的影响

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

离市中心的距离对平均价格有很大影响。上面的图表显示了市中心每天的平均价格和距离之间的关系。

数字显示,随着离市区距离的增加,价格会下降。相比之下,如果我们考虑到距离市中心超过 7 公里的地方,每天的平均价格将是 170 美元,而距离市中心不到 1.5 公里的价格平均为 245 美元。

分析下面的图表,我们可以看到距离和入住率之间的关系,其中我们可以看到平均入住率约为 89%,分布在所有街区。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

值得注意的是,一些地区的入住率远低于平均水平,尽管一些礼仪是在靠近市中心的街区。由于这些地区的价格较高,游客可能对价格比对距离更敏感。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一张图探究了入住率、平均价格和每个街区的房产数量之间的关系。正如我们从之前的图表中认识到的,平均价格对入住率的影响比离市中心的距离更大。

对于价格从每天 210 美元到 340 美元的地方,入住率为 85%,略高于距离市中心 2 公里。在一些地方,价格从 138 美元到 200 美元左右不等,相当于 93%的入住率。这些地区距离市中心仅 8 公里多一点。

以房源数量作为参考,我们可以看到市中心附近的公寓相当集中。总共 1528 套公寓中,约 78%位于距离市中心不到 4.1 公里的地方。其余 22%的单元更远,超过 5.7 公里。不出所料,靠近市中心的房产平均价格为 240 美元,远离市中心的为 177 美元。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分析每个街区的评级,我们可以再次注意到,与市中心的物业距离有关的一些联系。

具体检查本地化评级,得分高于 98 分的整个街区(金融区、西区、灯塔山、北端、后湾、南端、芬威/肯莫尔和市中心)中有 39%位于距离市中心不到 4.1 公里的地方。仅分析评分超过 98 分的地方,78%的地方距离中心不到 2 公里。

总体评分和价值评分似乎更受价格的影响。如果我们选择一系列价值和综合评分高于 95 分的最高评分酒店(罗斯林代尔、西罗克斯伯里、海德公园、牙买加平原、查尔斯顿和东波士顿),这些地方的平均价格为每天 180 美元。

最赚钱的领域

结束分析时,我们将带来一些最终图表,向我们展示最有利可图的领域,因此,对可能的投资更感兴趣。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图显示的是从 2009 年 1 月到 2016 年 9 月按街区划分的总收入。

Back Bay、Fenway/Kenmore 和 South End 的总收入最高,分别为 1360 万美元、1060 万美元和 930 万美元。这些价值的总和占所有社区总收入的 40%。

相比之下,收入第四高的社区南波士顿的总收入为 590 万美元,比第三名的南端少 63%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图为我们带来了附近地区的每日收入,根据上图,可以观察到总收入最高的三个地区仍然保持着有趣的定位,尤其是芬威/肯莫尔和后湾。

这三个地区,后湾,芬威/肯莫尔东南端的平均日价格在 222 美元到 307 美元之间。即使是 South End 街区支付的最低值 222 美元,也高于所有街区的平均日收入 214 美元。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,我们可以看到最高的总收入领域支持第一的立场。Back Bay、Fenway/Kenmore e South End 的公寓上市量最高,分别为 220、200 和 180 套。

收集所有三个社区,我们在每个地区拥有整个公寓系列的近 40%,平均每天收费 241 美元。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在每个街区的本地化评级中,我们将 Back Bay、Fenway/Kenmore 和 South End 列为最佳地区评论,从 100 分的最高分中获得 98 分以上的评级。

在总共 23 个地区中,只有 9 个地区得分超过 98 分,只有 5 个地区得分超过 99 分,比如 Back Bay。此外,Back Bay、Fenway/Kenmore 和 South End 距离市中心平均只有 3 公里。

一般结论

  • 在结束分析之前,让我们回顾一下通过这次探索性搜索收集到的主要见解;
  • 第三季度是波士顿市最繁忙的时期。7 月至 9 月也是游览这座城市最贵的时候,价格最高,9 月份几乎达到 31%;
  • 70%的主机和 65%的超级主机有公寓,或在不同的属性,也有公寓;
  • 70%的客人更喜欢租赁整个公寓,而不是房间或合租房间,两室公寓在所有社区范围内的房源数量较多,这表明客人可能更喜欢这类物业;
  • 靠近市中心的街区有最高的每日价格和总收入;
  • 远离市中心的房产每日价格最低。多切斯特、米申山和罗斯林代尔距离市中心 7.7 公里,有 100 美元左右的选择。

最适合主持人的区域

  • Back Bay、Fenway/Kenmore 和 South End 的总收入最高,在 1360 万美元、1060 万美元和 930 万美元之间。
  • Back Bay、Fenway/Kenmore 和 South End 的日均房价加在一起为 270 美元,比所有街区的平均房价高出 25%以上。
  • Back Bay、Fenway/Kenmore 和 South End 的公寓房源也最多,分别为 220、200 和 180 套。
  • Back Bay、Fenway/Kenmore 和 South End 是本地化评级评论中最好的,从 100 分中得到 98 分以上。

希望你喜欢!感谢阅读!

这里 可以访问 用于分析的数据。

使用 PyTorch 从头开始预测包围盒

原文:https://towardsdatascience.com/bounding-box-prediction-from-scratch-using-pytorch-a8525da51ddc?source=collection_archive---------1-----------------------

多任务学习——包围盒回归+图像分类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者点击的图像

对象检测是计算机视觉中非常流行的任务,其中,给定一幅图像,你预测图像中存在的对象周围的框(通常是矩形),并且还识别对象的类型。你的图像中可能有多个物体,有各种最先进的技术和架构来解决这个问题,如 Faster-RCNNYOLO v3

本文讨论了图像中只存在一个感兴趣对象的情况。这里的重点是如何正确地读取图像及其边界框、调整大小和执行放大,而不是模型本身。目标是很好地掌握对象检测背后的基本思想,您可以扩展它以更好地理解更复杂的技术。

这里有一个笔记本的链接,其中包含了我在本文中使用的所有代码:https://jovian . ml/aakanksha-ns/road-signs-bounding-box-prediction

如果你是深度学习或 PyTorch 的新手,或者只是需要复习,这可能会让你感兴趣:

问题陈述

给定由路标组成的图像,预测路标周围的边界框并识别路标的类型。

这些迹象可能属于四个不同的类别:

  • 交通灯
  • 停止
  • 速度限制
  • 人行横道

这被称为多任务学习问题,因为它涉及执行两个任务——1)回归以找到边界框坐标,2)分类以识别路标的类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

样本图像。来源

资料组

我使用了 Kaggle 的路标检测数据集:

[## 路标检测

属于 4 类的 877 个图像。

www.kaggle.com](https://www.kaggle.com/andrewmvd/road-sign-detection)

它由 877 幅图像组成。这是一个非常不平衡的数据集,大多数图像属于speed limit类,但由于我们更关注边界框预测,我们可以忽略这种不平衡。

加载数据

每个图像的注释都存储在单独的XML文件中。我按照以下步骤创建了培训数据框架:

  • 浏览培训目录以获得所有.xml文件的列表。

  • 使用xml.etree.ElementTree解析.xml文件

  • 为每个图像创建一个由filepathwidthheight、边界框坐标(xminxmaxyminymax)和class组成的字典,并将该字典附加到一个列表中。

  • 使用图像统计字典列表创建一个熊猫数据框架。

  • 标签编码class

调整图像大小和边界框

由于训练计算机视觉模型需要图像具有相同的大小,因此我们需要调整图像及其相应的边界框的大小。调整图像的大小很简单,但是调整边界框的大小有点棘手,因为每个框都与图像及其尺寸相关。

以下是调整边界框大小的工作方式:

  • 将边框转换为与其对应的图像大小相同的图像(称为蒙版)。这个遮罩只有背景的0和边界框覆盖的区域的1

原象

边界框的遮罩

  • 将遮罩调整到所需的尺寸。
  • 从调整大小的遮罩中提取边界框坐标。

辅助函数从包围盒中创建遮罩,从遮罩中提取包围盒坐标

函数来调整图像大小,写入新路径,并获取调整后的边界框坐标

数据扩充

数据扩充是一种通过使用现有图像的不同变体创建新的训练图像来更好地概括我们的模型的技术。在我们当前的训练集中,我们只有 800 张图像,因此数据扩充对于确保我们的模型不会过度拟合非常重要。

对于这个问题,我使用了翻转,旋转,中心裁剪和随机裁剪。我在本文中讨论了各种数据扩充技术:

[## 计算机视觉的图像处理技术

图像处理是计算机视觉的一个组成部分。我们几乎总是想调整图像大小,增加数据…

towardsdatascience.com](/image-processing-techniques-for-computer-vision-11f92f511e21)

这里唯一要记住的是确保边界框也以和图像相同的方式变换。为此,我们遵循与调整大小相同的方法—将边界框转换为遮罩,将与原始图像相同的变换应用于遮罩,并提取边界框坐标。

辅助函数用于居中裁剪和随机裁剪图像

变换图像和遮罩

显示边界框

PyTorch 数据集

现在我们已经有了数据扩充,我们可以进行训练验证分割并创建 PyTorch 数据集。我们使用 ImageNet stats 标准化图像,因为我们使用预训练的 ResNet 模型,并在训练时在我们的数据集中应用数据扩充。

列车有效分离

创建训练和有效数据集

设置批处理大小和创建数据加载器

PyTorch 模型

对于这个模型,我使用了一个非常简单的预训练 resNet-34 模型。因为我们在这里有两个任务要完成,所以有两个最后的层——边界框回归器和图像分类器。

培养

对于损失,我们需要考虑分类损失和包围盒回归损失,因此我们使用交叉熵和 L1 损失(真实值和预测坐标之间的所有绝对差的总和)的组合。我用因子 1000 来衡量 L1 损失,因为分类和回归损失都在相似的范围内。除此之外,这是一个标准的 PyTorch 训练循环(使用 GPU):

对测试图像的预测

既然我们已经完成了训练,我们可以选择一个随机的图像并在上面测试我们的模型。即使我们有相当少量的训练图像,我们最终在测试图像上获得了相当不错的预测。

这将是一个有趣的练习,用你的手机拍一张真实的照片,并测试模型。另一个有趣的实验是不执行任何数据扩充,训练模型并比较两个模型。

结论

既然我们已经介绍了对象检测的基本原理,并从头开始实现了它,您可以将这些想法扩展到多对象的情况,并尝试更复杂的模型,如 RCNN 和 YOLO!此外,查看这个名为albuminations的超酷库,轻松执行数据扩充。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值