我对数据科学的第一个贡献——一个识别尼古拉斯·凯奇图像的卷积神经网络
了解卷积神经网络如何应用于分类愚蠢的图像
在完成了吴恩达教授的流行的在线斯坦福机器学习课程后,我知道是时候进行我的第一个机器学习/深度学习项目了。我想创建一个愚蠢的神经网络,可以识别图像中的尼古拉斯凯奇。我们将使用卷积神经网络(CNN)来识别凯奇先生的图像。请记住,这是我的代码和我对机器学习/深度学习概念的理解的细分。如果您想只查看源代码或只查看。ipynb 文件将被链接到 GitHub 上的这里。
第一步将是导入流行的深度学习库 Keras。Keras 将帮助我们训练 CNN 识别图像
我不喜欢使用我不明白它在做什么的东西,我实际上发现机器学习的数学非常有趣。当我第一次学习数学时,看到数年的微积分课程实际上被用来解决一个问题是很酷的。在后面的代码中,我们将分析在使用每个导入时,每个导入在做什么。
- 顺序模型-顺序意味着可以逐层创建模型。顺序意味着只有一个输入和一个输出,就像流水线一样。层是深度学习网络中的一个单元。层包含权重、激活和偏差。
这个图表有助于解释我们的 CNN 模型将会是什么样子。注意:这只是为了帮助形象化,我们在输出层中只有一个节点,而不是 7 个。
From the paper Real-time Eye Gaze Direction Classification Using Convolutional Neural Network by Anjith George and Aurobinda Routray (https://arxiv.org/abs/1605.05258)
Conv2D:
Conv2D 该层对初始输入图像执行卷积。下面的 gif 有助于说明卷积在做什么。卷积基本上是在初始图像矩阵上通过一个小的“过滤器”或“权重”框,并对图像像素值执行矩阵乘法。在训练期间,这允许我们的网络在图像中识别尼古拉斯凯奇的特征。
Conv2D 参数:
- 在这里的代码中,我们将模型对象创建为顺序 Keras 模型
- 然后我们添加一个卷积层
- 32 意味着我们有 32 个大小为 3x3 的过滤器
- 输入形状意味着它是一个 200x200 的图像,3 意味着它是一个 rbg 彩色图像
- relu 激活函数是一个用于确保我们的值被缩放到特定范围的函数。
- 因此,如果 relu 的输入是<= 0 it will make the value 0, otherwise, if the input is > 0,那么它将只输出输入
- 激活功能被用来模拟我们大脑神经元的活动方式。当神经网络进行计算时,层中的节点可能输出不在特定范围(如 0 和 1)之间的值。激活功能有助于将我们的数字线强制或“挤压”成我们想要的特定输出范围。
最大池:
- 最大池 2d-最大池有时也称为缩减采样。我们从卷积创建的卷积特征矩阵是(初始图像像素矩阵*滤波器矩阵)。池查看该矩阵,并在给定区域中取最大值。下图有助于解释最大池如何对图像进行缩减像素采样。
- 在这里,我们初始化我们的池层,我们创建它的大小为 2x2,就像上面的图表一样
隐藏层:
- 这段代码增加了两层卷积和最大池,以帮助我们的网络更好地找到我们的图像特征。我最初没有在我们的网络中添加这些额外的隐藏层,我有 89%的测试准确率。我添加了这两层,达到了 91%的测试精度。
展平:
- 展平-展平操作采用矩阵或张量,并将其展平为一个很长的 1D 值数组。展平层通常紧跟在最后一个池层之后。展平操作是必要的,因为在我们应用卷积来查找尼古拉斯凯奇的要素后,我们需要将这些值展平到一个长 1D 数组中,并将其馈送到我们完全连接的密集网络层。如果你看看 CNN 图表的末尾,你就会明白我所说的馈入末尾密集层网络的值是什么意思。
密集:
- 密集-密集图层是一种线性运算,其中每个输入都通过权重连接到每个输出(因此有 n_inputs * n_outputs 个权重)。如果你看我们的第一个 CNN 概观图的末尾,那是密集层被使用的地方。
- 我们在这里将单位设置为 64。单位是指密集层中的节点数。单位值始终介于输入节点数和输入节点数之间。选择单位数时,建议使用 2 的幂。
- 我们再次使用 relu activation 函数来避免负值,并将我们的值保持在某个范围内。
辍学:
- 辍学是深度学习和神经网络中使用的一种正则化技术
- 正则化是一种技术,用于帮助网络不过度适应我们的数据
- 过度拟合是指我们的神经网络在训练数据上表现良好,但在测试数据上表现很差。这意味着网络没有很好地概括,这意味着它对以前没有见过的新图像的分类不正确/很差
- 在正式的论文中解释说:“在神经网络中,每个参数接收到的导数告诉它应该如何改变,从而减少最终的损失函数,给定所有其他单元正在做的事情。因此,单位可能会以某种方式改变,以修正其他单位的错误。这可能导致复杂的共同适应。这反过来会导致过度拟合,因为这些共同适应不会推广到看不见的数据。”
- 因此,我们本质上关闭了一层中的一些神经元,以便它们在网络权重的更新(反向传播)期间不学习任何信息。这使得其他活跃的神经元可以更好地学习并减少错误。
输出层:
- 这是输出我们预测的最后一层。我们只让它成为一个单位,因为我们希望它输出 0 或 1。1 是包含尼古拉斯·凯奇的图像,0 是不包含尼古拉斯·凯奇的图像
- 这里我们使用一个不同的激活函数,称为 sigmoid。Sigmoid 用于“挤压”0 或 1 之间的最后一个值。下面是一张 sigmoid 函数的图片,上面有它的方程式。
- 它将我们的输出浓缩成 0 或 1。非常负的输入接近 0,非常正的输入接近 1。
编译我们的模型:
- 这里我们编译我们的模型。我们将会遇到一点数学难题,所以抓紧你的帽子。
梯度下降:
让我们首先分解什么是基本梯度下降。梯度下降是一个最小化损失函数的过程:
- 我们从损失函数曲线上的一点开始
- 我们选择一个学习率,它将决定下降多少步
- 然后我们在这一点上求导,也称为“下降”或梯度
- 我们将下降乘以学习率值
- 我们将初始点移动到曲线上的这个新的(下降*学习率)值
- 我们重复这一过程,直到达到指定的迭代次数或其他停止条件,如收敛于局部最小值
- 下面是一个梯度下降的 gif,有助于可视化的过程:
随机梯度下降(SGD):
- 这里,我们选择使用随机梯度下降优化算法来最小化我们的损失函数。
- SGD 是常规梯度下降的增强版本。让我们看看数学。
常规梯度下降(有时称为批量梯度下降)对于大型数据集来说效率非常低,因为它会查看所有训练示例。下面是批量梯度下降的数学方程。
- Jtrain 是成本或损失函数。这个例子摘自吴恩达在斯坦福大学的机器学习课程。他使用平方误差作为损失函数,我们将使用对数损失函数,因此我们的示例略有不同。
- 然后,我们对每个训练样本进行重复,并计算损失函数的偏导数。
SGD 的数学原理:
- SGD 与批量梯度下降非常相似,但是它在循环过程中计算相对于一个训练样本的梯度,而不是相对于所有训练样本的梯度。
- 因此,如果我们有 20,000 个样本,批量梯度下降将扫描所有 20,000 个样本,然后在每次循环 20,000 个样本后改变我们神经网络的参数。
- 而 SGD 在我们遍历每个例子时会一点一点地调整梯度。所以 SGD 查看单个示例,然后在遍历每个示例时调整我们的参数。以下是新加坡元的数学公式:
二元交叉熵:
- 通过随时间降低损失函数来训练神经网络。
- 损失函数衡量我们的模型与实际发生的情况相比表现有多差。
- 在机器学习/深度学习中,有两种类型的损失函数——一种用于分类,一种用于回归。因为我们正在对图像进行分类,所以我们想要使用分类损失函数。
- 我们选择二元交叉熵或有时称为对数损失作为我们的损失函数,因为我们希望输出在 0 或 1 之间。
- 交叉熵的方程式如下图所示
这篇文章解释了我们为什么使用交叉熵:
- 注意,当实际标签为 1 (y(i) = 1)时,函数的后半部分消失,而当实际标签为 0 (y(i) = 0)时,函数的前半部分消失。简而言之,我们只是将实际预测概率的对数乘以地面真实类。一个重要的方面是,交叉熵损失严重惩罚了那些有信心但却是错误的预测。”
- 因此,换句话说,交叉熵损失随着预测概率偏离实际标签而增加。因此,当实际观察值为 1 时,预测 0.010 的概率将是糟糕的,并导致高损失值。完美的模型的对数损失为 0。
- 下图是交叉熵损失函数的样子:
- 因此,为了用方程阐明我们的上述直觉,请注意,随着预测概率在图上接近 1,对数损失缓慢下降。随着预测概率接近 0,测井曲线损失迅速增加。日志丢失严重惩罚了自信和错误的预测。
指标:
- 我们将参数度量作为“准确性”传递,因为我们使用准确性作为度量来衡量模型的性能。
创建我们的数据:
尼古拉斯·凯奇:
- 我找不到尼古拉斯·凯奇的现有图像数据集,所以我创建了自己的数据集,使用包 google-images-download 批量下载尼古拉斯·凯奇的图像。为了避免重复,我在 500 个图片搜索中指定了两个不同的日期。
- 上面的代码循环遍历我们的数据,并用一个数字和一个 Nicolas cage 的标签标记所有图像。
- 在手动删除了包含其他人的图片或不正确的图片后,我收集了 207 张尼古拉斯·凯奇的图片。
不是尼古拉斯·凯奇:
- 从这个项目开始,我想我可以做一个单类分类神经网络。我只会有一类尼古拉斯凯奇的图像,并把它提供给网络。我想在训练期间,网络会学习尼古拉斯凯奇的特征,并能够在照片中认出他。
- 我最终了解到,网络需要“负面”的例子来帮助它了解 Nic 框架映像和非 Nic 框架映像的样子。因此,我们需要收集随机图像的图像数据集,这些图像不是尼古拉斯·凯奇的。
- 我用这个 python 代码和 picsum 网站生成并保存了 207 张非尼古拉斯·凯奇的随机图像。
- 下一步是创建我们的训练集和测试集目录。
训练和测试设备:
- 因为我有少量的数据,所以我决定只手动创建和组织图像的测试和训练集。在一个有成千上万张图片的项目中,使用 python 来创建目录并使用 for 循环来组织数据会更现实。
- 我决定对我们的数据使用 70/30 分割,因为我们没有大量的数据。所以 70%的数据作为训练数据,30%作为测试数据。
- 因此,我们的训练数据将有 145 张尼古拉斯·凯奇的图像,而我们的测试数据将有 62 张尼古拉斯·凯奇的图像。
- 我在我们的 train 和 test 目录中创建了两个子文件夹,分别名为“class0”和“class1”。类 1 包含我们的尼古拉斯凯奇的图像,类 0 包含我们的随机图像。
- Keras flow_from_directory 按字母数字顺序读取我们的 train 和 test 目录中的文件夹。我花了一段时间才弄明白这一点,因为起初,我的网络将尼古拉斯·凯奇的照片标记为“0”类。这是因为我有两个文件夹:“尼古拉斯凯奇”和“非尼古拉斯”。当时是把“Nicolas_Cage”读成了 0 类。然后我解决了这个问题,看到了我的网络的巨大成果。
图像数据生成器:
这段代码的打印语句和输出为我们提供了:
Found 290 images belonging to 2 classes.
Found 124 images belonging to 2 classes.
{'class0': 0, 'class1': 1}
在这里,我们希望预处理我们的图像,使它们准备好输入神经网络。我们在 Keras 内部使用 ImageDataGenerator 类。该类接收一批图像,并对图像进行缩放和剪切等增强操作。然后,它将增强的数据传递给神经网络。
什么是数据增强?:
- 根据超级有用的网站 pyimagesearch 的说法,数据增强通过应用随机抖动和扰动(但同时确保数据的类别标签不变),从原始样本中生成“新的”训练样本。
- 它本质上创建了与原始训练样本略有“不同”的新训练样本。
- 应用数据扩充的目标是提高模型的概化能力。我们使用增强,因为我们有这么少量的图像,这将有助于我们的模型概括尼古拉斯·凯奇的新图像。下面是一张有用的图片,解释了增强的作用:
参数:
- 重新缩放-我们以 1 的比例缩放图像。/255
- 剪切范围——我们指定图像被剪切或向某个方向移动的范围
- 缩放范围——我们为图像指定一个随机放大的范围
- horizontal _ flip 水平随机翻转输入
- 目标尺寸——是我们输入图像的尺寸,每个图像的尺寸都将调整为 200x200
- batch _ size——我们分批循环我们的图像,因此我们使我们的批量大小为 32 的图像变大
- class _ mode——我们将其设置为“二进制”,因为我们只有两个类来预测尼古拉斯·凯奇是否出现在图像中
拟合模型:
Epoch 1/25
1000/1000 [==============================] - 913s 913ms/step - loss: 0.3476 - acc: 0.8502 - val_loss: 2.2280 - val_acc: 0.5000
Epoch 2/25
1000/1000 [==============================] - 907s 907ms/step - loss: 0.1354 - acc: 0.9564 - val_loss: 0.5738 - val_acc: 0.8629
Epoch 3/25
1000/1000 [==============================] - 904s 904ms/step - loss: 0.0675 - acc: 0.9825 - val_loss: 0.6880 - val_acc: 0.8710
Epoch 4/25
1000/1000 [==============================] - 910s 910ms/step - loss: 0.0170 - acc: 0.9956 - val_loss: 0.7560 - val_acc: 0.8710
Epoch 5/25
1000/1000 [==============================] - 952s 952ms/step - loss: 0.0454 - acc: 0.9893 - val_loss: 0.7865 - val_acc: 0.8710
Epoch 6/25
1000/1000 [==============================] - 908s 908ms/step - loss: 0.0158 - acc: 0.9959 - val_loss: 0.7694 - val_acc: 0.8952
Epoch 7/25
1000/1000 [==============================] - 908s 908ms/step - loss: 0.0833 - acc: 0.9851 - val_loss: 0.7052 - val_acc: 0.8790
Epoch 8/25
1000/1000 [==============================] - 914s 914ms/step - loss: 0.0103 - acc: 0.9977 - val_loss: 0.7506 - val_acc: 0.8952
Epoch 9/25
1000/1000 [==============================] - 909s 909ms/step - loss: 0.0043 - acc: 0.9989 - val_loss: 0.7203 - val_acc: 0.9032
Epoch 10/25
1000/1000 [==============================] - 905s 905ms/step - loss: 0.0035 - acc: 0.9992 - val_loss: 0.7409 - val_acc: 0.8952
Epoch 11/25
1000/1000 [==============================] - 934s 934ms/step - loss: 0.0050 - acc: 0.9992 - val_loss: 0.8968 - val_acc: 0.8952
Epoch 12/25
1000/1000 [==============================] - 1193s 1s/step - loss: 0.0017 - acc: 0.9998 - val_loss: 0.7880 - val_acc: 0.9032
Epoch 13/25
1000/1000 [==============================] - 1189s 1s/step - loss: 0.0017 - acc: 0.9996 - val_loss: 0.7822 - val_acc: 0.9113
Epoch 14/25
1000/1000 [==============================] - 1194s 1s/step - loss: 0.0014 - acc: 0.9996 - val_loss: 0.7832 - val_acc: 0.9032
Epoch 15/25
1000/1000 [==============================] - 1196s 1s/step - loss: 0.0011 - acc: 0.9998 - val_loss: 0.7775 - val_acc: 0.9032
Epoch 16/25
1000/1000 [==============================] - 1195s 1s/step - loss: 8.3008e-04 - acc: 0.9998 - val_loss: 0.8340 - val_acc: 0.9032
Epoch 17/25
1000/1000 [==============================] - 1198s 1s/step - loss: 0.0072 - acc: 0.9988 - val_loss: 0.7819 - val_acc: 0.8952
Epoch 18/25
1000/1000 [==============================] - 1201s 1s/step - loss: 0.0020 - acc: 0.9997 - val_loss: 0.7950 - val_acc: 0.9113
Epoch 19/25
1000/1000 [==============================] - 1202s 1s/step - loss: 0.0011 - acc: 0.9997 - val_loss: 0.7827 - val_acc: 0.9113
Epoch 20/25
1000/1000 [==============================] - 1170s 1s/step - loss: 0.0015 - acc: 0.9996 - val_loss: 0.8283 - val_acc: 0.9032
Epoch 21/25
1000/1000 [==============================] - 906s 906ms/step - loss: 0.0015 - acc: 0.9997 - val_loss: 0.8592 - val_acc: 0.8952
Epoch 22/25
1000/1000 [==============================] - 905s 905ms/step - loss: 0.0010 - acc: 0.9997 - val_loss: 0.8227 - val_acc: 0.9032
Epoch 23/25
1000/1000 [==============================] - 907s 907ms/step - loss: 8.1553e-04 - acc: 0.9997 - val_loss: 0.8221 - val_acc: 0.9113
Epoch 24/25
1000/1000 [==============================] - 934s 934ms/step - loss: 0.0010 - acc: 0.9998 - val_loss: 0.8540 - val_acc: 0.9032
Epoch 25/25
1000/1000 [==============================] - 1189s 1s/step - loss: 7.6795e-04 - acc: 0.9998 - val_loss: 0.8570 - val_acc: 0.9113
- 这段代码使我们的模型能够对尼古拉斯·凯奇的图像进行分类。如你所见,在第 25 个纪元结束时,我们能够达到 99%的测试准确度和 91%的测试准确度。
- 由于我们在训练期间对数据进行扩充,因此我们使用 classifier.fit_generator 函数。classifier.fit 在这里不起作用,因为我们正在对数据进行扩充。
参数:
- training_set —我们传入训练集 ImageDataGenerator,以在训练过程中扩充我们的训练图像
- steps_per_epoch —我们的 fit_generator 无限循环,所以我们指定我们希望它循环多少次
- 次数-定义学习算法在整个训练数据集中工作的次数
- test _ set——我们传递测试集 ImageDataGenerator 来增加训练期间的测试图像
- val _ steps——在每个时期结束时停止之前,测试数据生成器产生的总步骤数(样本批次)
“学习”:
神经网络通过称为反向传播的过程进行学习。喀拉山脉。fit 函数为我们自动执行这个过程,所以我们不必手动编写代码,但是到底什么是反向传播呢?对我理解这一点帮助最大的视频是神经网络揭秘和 3Blue1Brown 的背部道具视频
正向传播:
- 神经网络接受输入并执行一个称为前向传播的过程。为了理解反向传播,我们首先需要理解正向传播的过程。
- 神经网络中连接每个神经元的每一条细线都被称为突触,每一条都有一个“权重”值。下图有助于展示小型网络的可视化示例。
这显然是一个非常简单的神经网络,仅包含一个具有 3 个节点的隐藏层,但是前向传播在更大和更复杂的神经网络上同样有效。它本质上是每次向前馈送前一层输入值,并在我们的输入和权重矩阵加上我们的偏差之间应用矩阵乘法。然后,它应用一个激活函数将我们的值“挤压”到期望的范围内。开始向前传播将输出可怕的预测值。在我们的培训中,您可以看到一个这样的例子,因为我们在第一个时期的测试准确率为 50%。Back prop 将帮助调整我们网络中的权重值,以帮助我们的网络实际学习。
反向传播:
- 神经网络通过最小化“成本”或“损失”函数来学习。当神经网络在前向传播后输出预测时,我们通过查看成本函数来查看该预测有多错误。我们的成本函数是对数损失函数。所以我们用梯度下降来最小化这个函数。
- 在梯度下降过程中,我们对曲线上的点求导。这个导数告诉我们切线的斜率。我们想把损失曲线上的点移到负斜率方向。基本上,我们希望将损失曲线上的点导向负斜率,因为我们希望最小化成本函数。但是我们如何得到这个导数呢?
在令人惊叹的 3Blue1Brown 反向传播视频中解释道,在高层次上,反向传播是确定对我们网络中的权重和偏差进行哪些改变或微小“推动”的过程,这些改变或微小“推动”将导致基于单个训练示例的成本函数最有效、最快速地降低。反向传播是递归的,这意味着输出图层斜率取决于前一图层斜率,而前一图层斜率又取决于整个网络中的前一图层斜率,依此类推。让我们用微积分来看看这意味着什么:
将所有这些放在一起:
- 上述方程被简化为在简单网络的每一层中具有一个神经元。这是计算反向传播中导数的更高级的综合方程。
这基本上与之前的等式相同,但在处理每层中有不止一个神经元的网络时稍微先进了一点,这就是 jk 可迭代索引的来源。
为了让我们的网络运行良好,有必要理解看起来很粗糙的微积分吗?谢天谢地没有,因为 Keras 自动为我们做这个过程,但我认为这是有趣的数学兔子洞。反向传播非常令人困惑,老实说,当我看所有的微积分时,我有时还是会迷路。很多时候,我仍然不得不去回顾它,观看有用的 youtube 视频,试图完善我的理解。
准确度和损耗:
Accuracy
Loss
- 这段代码让我们可以可视化我们的模型准确性和模型损失。代码来自 Keras 文档中解释的这里的。
- 正如我们所看到的,我们的测试和训练精度非常接近第 25 个纪元,我们的模型损失也是如此!
- 我们以 91%的测试准确率和 99%的训练准确率结束了我们的训练,这已经很不错了。
做出预测:
- 正如你所看到的,我们的模特认出了尼古拉斯·凯奇的这些美丽而绝对鼓舞人心的照片。
- 我们的模型也能识别出不是尼古拉斯凯奇的图像,比如岩石的图片或者天空的图片。
- 我对我们网络的结果非常满意。我们的网络甚至能够识别尼古拉斯·凯奇的愚蠢的迷因图片,比如他的脸被编辑到比尔·克林顿的脸上。
结论:
- 在做这个项目的过程中,我学到了很多关于深度学习的知识,并且在创建它的过程中获得了很多乐趣。我在斯坦福上的课是吴恩达教授的很受欢迎的机器学习课。这门课程给了我一个很好的机器学习概念的基础,并向我介绍了神经网络、反向传播、线性回归,甚至支持向量机等概念。但是我知道最重要的学习来自于钻研和创造一个项目。
- 我想我也许可以收集更多尼古拉斯·凯奇的数据,以获得更高的测试准确性,但不管怎样,我对结果很满意,因为模型能够很好地识别我们的模因。
- 如果我将二进制分类应用于不同的数据集,如分类星系和黑洞图像,甚至太空中的星座,这个项目可能会更有趣,但神经网络识别尼古拉斯·凯奇图像的想法似乎太有趣了,太好了,不能错过。
联系人:
资源:
- https://ml-cheatsheet.readthedocs.io/en/latest/
- https://becoming human . ai/building-an-image-classifier-using-deep-learning-in-python-total-from-a-初学者视角-be8dbaf22dd8
- https://www . pyimagesearch . com/2018/12/31/keras-conv2d-and-卷积-层/
- https://towards data science . com/common-loss-functions-in-machine-learning-46 af 0 ffc 4d 23
- https://github . com/fchollet/deep-learning-with-python-notebooks/blob/master/5.2-using-conv nets-with-small-datasets . ipynb
- https://medium . com/Octavian-ai/which-optimizer-and-learning-rate-I-use-for-deep-learning-5a CB 418 F9 b 2
- https://www.charlesbordet.com/en/gradient-descent/#
- https://keras.io
- sendex YouTube—https://www.youtube.com/channel/UCfzlCWGWYyIQ0aLC5w48gBQ
- siraj Raval YouTube—https://www.youtube.com/channel/UCWN3xxRkmTPmbKwht9FuE5A
我的第一个数据科学项目
我为什么要写这篇文章
作为一个在数据科学领域工作了一段时间的人,我收到了不少热情的毕业生的问题,他们问我“如何成为一名数据科学家”或“数据科学家每天都做些什么”。另一方面,我偶尔听到一些声音开玩笑说“数据科学家是 21 世纪最性感的工作”不再是真的了:大多数数据科学家的时间可能会花在繁琐的任务上,如运行 SQL 来提取数据,构建仪表板来做报告,以及(更令人沮丧的)你需要维护它们!他们问我作为一名数据科学家的经历是什么,我对这一现象有什么感觉,以及在最初的声明发表 7 年后,数据科学是否仍然“性感”。许多类似的问题都围绕着这个主题,我认为通过一个关于我的第一个数据科学项目的故事来分享我的个人观点可能会有所帮助。这可以作为一个参考点,希望它也可以激励那些仍然渴望加入该领域的人,或者那些刚刚开始他们的第一份数据科学工作的人,甚至那些已经在该领域工作了很长时间的人。
注意。这不是我作为数据科学家的第一个实际项目,正如你所知道的,开始任何工作,都需要在开始时做一些琐碎的任务,以了解基本知识。这个项目是我 2013 年在 TrueCar,Inc .开始数据科学职业生涯后的第三个月做的。
故事
研究生毕业后,我加入了 TrueCar,开始了我的第一份数据科学家工作。对于那些不知道的人来说,TrueCar 是一个在线购车平台,它提供透明的定价信息(例如,最近的车辆交易价格),因此客户不会为一辆车多付钱。当时,作为一名应届毕业生,我对数据科学团队正在从事的所有项目非常着迷,这些项目几乎涵盖了一家以数据为中心的技术公司运营的所有业务方面:构建定价模型以支持核心产品,用 A/B 测试优化网站等。在第一个两个月的入职期后,我被分配到搜索引擎营销领域工作。
搜索引擎营销(SEM)是搜索引擎巨头,如谷歌,发明的游戏。这个游戏的一个过于简化的观点是:公司决定关键词的竞价价格(例如,“新丰田卡罗拉”是一个 3 个单词长的关键词)。如果用户搜索准确的关键词,并且该公司的出价高于其他竞争对手,它将赢得该位置,并可以将他们的产品信息放在用户将看到的所有搜索结果的顶部。如果用户点击产品链接,该公司就会向搜索引擎巨头付费,通常是第二高的出价。几年来,TrueCar 一直在使用 SEM 来帮助获取客户,系统中已经有成千上万的关键字需要维护,这些关键字是由不同的活动组织的。我分配的项目是报告每个 SEM 活动的表现,并使用 Google 的 AdWords API 自动报告。
我对这个项目非常满意,它是我练习 Python 技能和学习更多 AdWords API 的一种方式,尽管这看起来一点也不“性感”。反正我就开始摆弄 Adwords,写点代码,很快就收集了很多关键词性能数据然后用它们编了一个报告。
有点好奇
在生成第一份活动绩效报告后,我发现“每次转化成本”(CPC)是人们都关心的指标;这并不奇怪,因为这个指标意味着我们为一个转化的客户支付多少钱:越低越好。我还做了一些关于 SEM 行业的研究,并意识到“关键词”是搜索引擎营销的一个重要方面:它们并不平等,两个关键词在“每次转换成本”方面可能有显著不同的表现。当时,我想到了两个问题:1 .哪些关键词性能更好(CPC 更低)?2.我们是否已经在系统中拥有了所有性能更好的关键词?
一些科学,一些算法
手动浏览系统中的所有关键字以获得任何有意义的见解是不可能的,想象一下可能有类似“我真的想买一辆现代索纳塔”的关键字(是的,我刚刚在谷歌中进行了搜索,所以它是其他公司可以竞标的关键字,并且它至少有一个搜索流量)。所以我需要更有策略,在流程中加入一些“科学”成分。我开发的算法或过程如下:
- 第一步。对于所有活动中的每个现有关键词,生成 1 克和 2 克的子关键词。例如,“新丰田卡罗拉”关键字将生成以下 5 个子关键字:“新”、“丰田”、“卡罗拉”、“新丰田”、“丰田卡罗拉”
- 第二步。为每个子关键字分配性能,就好像它们是关键字本身一样。例如,如果“新丰田卡罗拉”有 100 美元的 SEM 支出,导致 10 次点击和 2 次转化;那么所有 5 个子关键词都将具有相同的表现。
- 第三步。按所有子关键词分组,并计算它们各自的成本和转化率,然后我们就可以得到它们的平均每次点击费用,以点击数作为相对大小的参考
- 第四步。按照点击费的表现对所有子关键词进行排序,较低的点击费排在最上面
这肯定不是最好的算法:有相当多的子关键词完全没有任何意义,比如“购买 a”、“the”等。但是,也有一些有趣的子关键词出现在列表的顶部:其中之一是“最佳价格”。这个子关键词的点击费低得惊人,但只有几百次点击。嗯…,这是什么意思?
貌似合理的商业解释
为什么“最优价格”表现更好?融入一些商业知识,一切开始变得有意义:在 TrueCar 上转换良好的人通常有强烈的“找到一笔好交易”的意图,“最佳价格”是在搜索查询中表达他们兴趣的常见方式。从这个角度来看,与“最佳价格”相关的关键词具有较低的 CPC 是有意义的,因为它们的转化意愿(例如,使用 TrueCar 产品)较高。另一方面,我的分析显示,我们只收到有限的点击,由很少的关键字贡献,这表明有机会进一步扩大!
不久,我用几张幻灯片总结了这一发现,以展示这颗“隐藏的宝石”。人们对我的发现有点怀疑,因为特定关键字的样本非常有限,然而,没有人想拒绝用一半的成本获得更多销售的机会,所以我得到了一个绿灯来测试这个想法!为了避免不必要的技术术语和细节,简而言之,我围绕“最佳价格”创建了一组关键词,将所有内容上传到 AdWords,并开始了新的活动。一周后,它收到了大量的点击量,而每次点击费用却大大降低了,每个人都非常高兴。之后,纯粹是执行:通过各种方式产生更多基于“最佳价格”的关键词,我们扩大了多个活动的规模,它们都表现一致:每次点击费用比同行活动低得多。这为公司带来了大量的廉价转换,幸运的是,我的第一个数据科学项目有了一个美好的结局:)
回首
很快,在过去的 6 年里,许多事情都发生了变化。如今,SEM 行业更加智能化,大多数关键字选择都通过各种工具实现了自动化。就在今天,当我搜索“价格最优的丰田卡罗拉”时,有四个返回的 SEM 结果,而 TrueCar 不在其中。所以我知道我对这个特定关键词的洞察力已经过时了。在数据科学方面,这个项目不能被认为是辉煌的:算法是初步的(简单的 n-gram 特征提取),统计数据缺乏一些严谨性(计算 CPC 置信区间的一种非常简单的方法),工程过程相当粗糙(肯定不是我最好的 Python 代码)。然而,我仍然为这个项目感到自豪,因为它让我尝到了数据的价值;作为一名数据科学家,我可以打开它并享受成功。
我对数据科学的思考
现在,您已经了解了我的第一个数据科学项目故事。当然,这只是作为一名数据科学家的成千上万种开始方式中的一种。希望这个故事揭示了“数据科学家”应该具备的三个要素(我认为):
- 良好的数据分析和工程技能:没有这些,你可能会陷入许多步骤(例如,提取 n-gram,自动启动 SEM 活动等)
- 合理的商业意识:数据有助于揭示隐藏的商业知识,所以你最好先了解一些基础知识。
- (最重要的)你的好奇心:这是让你开心的东西,可以将“繁琐”的任务转化为有趣的项目
作为故事的结尾,我想引用我之前关于“数据科学家”的说法:这是大约五年前我的(当时的)数据科学团队接受当地一家报纸采访时所说的话(链接),我认为这句话现在仍然适用。
“成为一名数据科学家需要统计学、编程和商业意识的结合。“能够从数据中探索洞察(通过编程&统计)以满足公司业务需求的是‘科学家’。”
*感谢您的阅读,并随时与那些可能觉得有用的人分享这个故事。文章首发于 LinkedIn(https://www . LinkedIn . com/pulse/my-first-data-science-project-pan-Wu),转载于 Medium。
我的第一个数据科学项目——伦敦的家庭友好型社区
在过去的两年里,我的生活发生了很多变化。我已经决定从神经科学背景转向数据科学,我从美国搬到了英国伦敦。我搬到伦敦是这个项目的灵感来源,因为我很少知道哪些社区被认为是好的,哪些被认为是坏的。所以当我和我丈夫试图找一个地方和我们的两个小男孩住在一起的时候,我们完全没有头绪。我试着用谷歌搜索伦敦的好社区,有不少网站列出了他们对最佳社区的看法。但是所有这些列表的问题是它们看起来像是意见,而不是基于实际数据。来自科学背景的我需要数据来支持这些列表。我们最后做了最好的猜测,我们相当幸运地在一个好的地区结束。
将来,我想避免这种未知,更好地了解伦敦哪些社区是家庭友好型的。好了,我说完了我对这个项目的灵感,让我们开门见山吧。
- 注意这篇文章将而不是代码繁多,如果你想了解更多关于所用代码的细节,你可以在 Github 上查看笔记本,点击这里。(看不到叶子地图,但如果你想看地图,可以在 nbviewer 上粘贴 Github 链接)
数据
对于这个项目,我们从 大都会警察局犯罪仪表板 获取伦敦犯罪数据,并使用犯罪数据集中的纬度&经度从 Foursquare API 获取场地数据。
犯罪数据
Original Crime Dataset
我们首先需要通过删除不必要的行和重命名列来清理犯罪数据。
Clean Crime Dataset
现在我们有了一个干净的数据集,我们可以通过 Geopy 的反向地理编码运行纬度和经度,并找到相应的邮政编码,我们将将它追加到一个新的 postal_code 列。
Example of the dataset with Postal Codes
不幸的是,反向地理编码并不像我们希望的那样清晰。缺少超过前缀的数据点和邮政编码(例如:Index 5 Postal_Code 读作“SW1 H ”),我们将手动清理每个邮政编码,并使用以下代码输入缺少的邮政编码:
Snippet of Code to edit Postal_Code Column
Subset of Dataframe after fixing Postal_Code column
然后我们按照邮政编码将犯罪事件加在一起。这将是我们最终的犯罪数据集,总共有 212 行和 4 列。
Final Crime Dataset
犯罪数据可视化
为了确定伦敦的犯罪分布情况,我们将把数据绘制成箱线图。
Box plot of Crime in London
我们将“正常”的犯罪数量定义为落在方框内的所有值,低犯罪数量定义为低于方框的点,高犯罪数量定义为高于方框的点。
我们现在使用叶子在伦敦地图上绘制点。我们对这些点进行如下颜色编码:
- 高犯罪率= “红色”
- 普通犯罪= “黄色”
- 低犯罪率=“绿色”
Crime Map of London
太好了,我们现在对不同邮政编码(街区)的犯罪有了很好的了解。但在寻找家庭友好型社区时,犯罪并不是唯一要考虑的因素。我们还需要考虑儿童友好型活动。为此,我们使用 Foursquare API。
场馆数据
对于这个项目,我们决定重点关注以下几个类别:
- 公园 ( Foursquare 类别 Id: '4bf58dd8d48988d163941735 ')
- 库 (Foursquare 类别 Id: '4bf58dd8d48988d12f941735 ')
- Lidos(Pools)(four square 类别 Id: '4bf58dd8d48988d15e941735 ')
- 游乐场 (Foursquare 类别 Id: '4bf58dd8d48988d1e7941735 ')
- 电影院(四方分类 Id: '4bf58dd8d48988d180941735 ')
我们创建一个函数来标识场馆,并将该类别的场馆总数附加到当前数据帧的新列中。下面是函数:
Function for identifying the total number of venues in each category
这是最终的数据集:
Final Dataset
k 均值聚类
最后,我们使用机器学习技术 K-Means。选择这种技术有两个主要原因:
- 我们没有标签数据
- 我们知道我们想要多少个集群(3:不友好型、友好型和谨慎型)
对于 K-Means,我们选择希望算法使用的功能,这意味着选择“Crime_Incid”、“Park”、“Library”、“Pool”、“Playground”和“Cinemas”列:
在运行 K-Means 之后,我们将聚类标签插入到原始数据集中,然后使用 Folium 绘制数据以可视化不同的聚类。
Final Map of Family-Friendly Neighborhoods
很快,我们可以看到很多红色变成了黄色,现在地图上有了更多的绿色点。这是个好消息,因为不像大多数人认为的那样,在大城市有家庭友好型社区。
只是为了确保没有隐藏的集群,我们运行肘方法,以确保我们有最佳数量的集群。
Optimal k = 3
我们可以看到,3 是集群的最佳数量。耶!
结果和讨论
这是一个好消息,看到在伦敦有更多的家庭友好型社区,而不是要避免的社区。事实上,有 136 个街区可供选择。下面是一个简单的分类:
因此,对于任何像我自己一样在英国伦敦寻找最佳家庭友好型社区的家庭来说。我建议你从这 10 个开始:
Top 10 family-Friendly neighborhoods
他们的犯罪率并不是最低的,但他们的犯罪率仍然很低&有很多适合孩子的活动。
但是如果你在寻找最安全的社区,那么就从这些开始吧:
Neighborhoods with the lowest crime Incidents
但是我给你一个合理的警告,一些邮政编码没有很好的儿童友好活动。但这可能会引起企业、城市规划者和开发商的兴趣,他们可能想建造这些适合儿童的场馆。
现在,对于我们的警察局长、专员和其他安全人员来说,了解哪些社区可以利用更多的资源来降低这些地区的犯罪率将会使你们受益。对于家庭来说,这些是你应该避免居住的地方。
进一步分析&改进思路
没有哪个数据科学项目是真正完整的。总有优化的空间,因此我列出了一些改进结果的想法
1。添加更多适合儿童的分析场所。
- 公园、操场、图书馆、游泳池和电影院并不是仅有的适合孩子的活动。
2。为每个邮政编码添加边界
- 目前仅使用 1 英里半径来定义邮政编码分配的纬度和经度的边界。这可能会在搜索地点时导致一些不必要的邮政编码区重叠。这也将允许绘制 choropleth 地图。
3。根据邮政编码内的人口标准化犯罪事件。
- 注意,许多要避免的邮政编码位于中心,那里的人口密度很可能大于远离中心的邮政编码。这可能导致犯罪率表面上看起来很高。
4。按预算进一步过滤结果
- 这将有助于更好地迎合各种预算的家庭。伦敦是一个生活成本很高的城市,尤其是在住房方面。根据 Business Insider 的数据,伦敦两居室公寓的平均租金为 2338 美元(1875 英镑),是世界上第六大租金市场。根据平均房价,伦敦在全球最贵的地方排名第八。
结论
很高兴看到大城市可以对孩子友好。很高兴看到我们最终选择的社区被认为是适合孩子的!
孩子是我们的未来,大城市是可以找到机会的地方。因此,重要的是让大城市变得对孩子更加友好。家庭不应该觉得为了抚养孩子他们不得不逃离大城市。
我希望你喜欢阅读这个项目,就像我喜欢为它工作一样。因为这是我的第一个项目,我会喜欢你的反馈,所以请随时与我联系!完整的笔记本可以在 Github 这里 找到,报告可以在 这里 。
我作为数据分析师的第一份工作:期望与现实
我职业生涯中最重要的一课…
在学校呆了将近 5 年后,毕业典礼终于来临了,我已经准备好测试我的技能了。我并不完全确定我想要什么头衔,我只知道我喜欢处理数据和解决复杂的问题。我后来意识到,我想从事数据科学方面的职业,但那是以后的事了。
毕业后不久,我在当地一家公司获得了一份数据分析师的工作。这似乎与我的技能和我对数据工作的热情完全吻合,所以我马上接受了。我已经可以想象自己坐在办公桌前,做销售预测,创建惊人的报告和可视化。
[## 通过我的推荐链接加入 Medium-Andres Vourakis
阅读安德烈斯·沃拉基斯(以及媒体上成千上万的其他作家)的每一个故事。您的会员费直接支持…
medium.com](https://medium.com/@avourakis/membership)
你可以说,我被最终被推到现实世界的欣快冲昏了头脑,我从来没有花一秒钟来放慢脚步,喘口气,并“降低我的期望”。
我作为数据分析师的头几个月很少涉及数据分析,主要是长时间争论数据。这些是我不止一次使用的短语,完美地总结了最初的几个月。
“我在哪里可以再找到那个?”
虽然我接受了分配给我的项目的培训,但是有太多的东西需要理解。我发现自己很难记住每个文件的位置以及我需要遵循的不同流程。缺少可用的文档是一个巨大的挫折,我最终不得不依靠我的同事四处走动。
“那会花太长时间”
最大的挑战之一是无法访问“正确的”基础架构或工具来处理和分析大型数据集。几乎所有的报告公司都使用 Excel,尽管它不能满足我们所有的需求。公司里的每个人都要求更多,我们根本无法满足。
“我们不应该手动操作”
我们的一些日常任务包括从不同的网站下载 CSV 文件和刷新 Excel 报告。这些任务浪费了我们太多的时间,需要自动化。
“我们还不能相信这些数据……”
由于我们的数据是从这么多不同的来源收集的,而且报告并不总是只由数据团队处理,所以很难相信在我们公司会议上不断抛出的数字的准确性。
我的公司发展迅速,我们需要依靠数据来做出决策。问题是,我们当前的基础架构无法满足我们的需求,而且一路上有太多的权宜之计,裂缝开始显现。我的团队由 3 名数据分析师(包括我自己)组成,但在某种程度上,我们还需要扮演数据工程师和数据科学家的角色。我们根本没有预算来引进更多的人才,因此我们需要做好基础工作,以确保我们能够满足利益相关者的期望。
但是尽管我的工作不是我所期望的(至少在最初的几个月),我学到的东西比我想象的要多。我有机会体验从零开始一个项目的真正感觉,并在过程中处理不同的障碍,相信我,有很多。你看,为了将数据转化为见解或预测,需要做大量的工作来准备数据。我记得在学校里学过,但直到我亲身经历后才真正理解。
当我在学校的时候,我从来没有真正花太多时间问类似“我能相信这些数据吗?”或者“存储数据最有效的方式是什么?”。我更加专注于学习数据分析中令人兴奋的部分,比如可视化、预测等等。你可能在互联网上见过的所有流行词汇。
但是这份工作,尽管充满挫折和挫折,却给我上了非常重要的一课,毫无疑问,这一课在我的职业生涯中会非常有价值:
永远愿意做“肮脏”的工作
我不是指肮脏、无用或令人不快的工作(尽管对一些人来说可能是),我指的是那种经常被推到一边的工作,因为它可能不如预测未来那样令人兴奋,或者不如创造可视化那样华而不实。但是毫无疑问,做“脏”工作是处理数据的重要部分。
不管你是一个有抱负的数据分析师还是数据科学家,如果你愿意清理所有的数据,测试它,编写所有的文档,并清理所有的代码,那么你将永远在数据团队中占有一席之地。你不仅会让你的团队走向成功,还会成为他们可以依赖的人。
如果你对我和我的团队如何克服我之前提到的一些障碍感到好奇,那么看看我写的另一篇文章:
[## 当 Excel 不够用时:使用 Python 清理数据、自动化 Excel 等等…
数据分析师如何在电子表格驱动的组织中生存
towardsdatascience.com](/when-excel-isnt-enough-using-python-to-clean-your-data-automate-excel-and-much-more-a154c6bf9b49)
我希望这篇文章对你有用。如果你有任何问题或想法,我很乐意在评论中阅读:)
另外,如果你希望支持我成为一名作家,可以考虑注册成为❤️的一名媒体成员
我第一次开源贡献的痛苦和狂喜
我的第一个开源贡献并不是一帆风顺的,但它肯定是完全值得的
在过去一年左右的时间里,我一直渴望为一个开源 R 包做贡献,但是像许多人一样,我发现处理这个任务的想法令人害怕。
虽然我每天都在一个非常动态和紧密的团队中工作,并且在远程存储库(Git)的世界中,我对这些远程存储库中的协作工作的接触非常有限…我们更倾向于在很大程度上独立完成项目,所以拉请求(PRs)、合并、分叉的概念…嗯,这都有点令人生畏。
以下是旅程中的一瞥,将在本帖中解释:
The journey I took
这篇文章不会是一个详尽的每个接触点的一步一步的指南,而是一个中高层次的总结。
我的孩子,生活本不该是轻松的;但是鼓起勇气:这可能是令人愉快的。——乔治·萧伯纳
记着乔治的话,我想是时候让自己跳进去了。
浏览 Twitter(就像护理新生儿一样),我看到一条关于我在上的一些分析中使用的一个包的推文,不要责怪数据说这个包现在在 CRAN 上直播(一个伟大的成就)。
The tweet that started everything
这很自然地把我带到了 Github 上的仓库,在那里我注意到有一些公开的“问题”,其中之一是为任何回合创建一个梯子的函数。
菲茨罗伊套餐
由 James Day 开发的 fitzRoy 软件包是一个旨在帮助 R 用户提取和分析澳大利亚足球联盟(AFL)男女比赛数据的软件包:
fitzRoy 的目标是提供一套功能,使用户能够方便地访问来自 afltables.com 和 footywire.com 的 AFL 数据。还有一些工具可以处理和清理这些数据。
虽然我肯定没有在这一点上做任何广泛的分析,但我猜想所有 AFL 数据分析项目的大部分都是在这个软件包的帮助下完成的。
直接跳进来
所以,与其考虑做出贡献有多好,为什么不直接联系詹姆斯,主动提出解决这个公开的问题呢…
詹姆斯非常容易相处,而且他很乐于助人(对这个笨手笨脚的傻瓜很有耐心)。
然后是写函数的时候了。就像写函数一样。幸运的是,我已经为一个线性回归模型编写了这个函数,这个模型是我为预测 AFL 主客场比赛的上座率而构建的这里是。这个函数被恰当地命名为return_ladder()
…我是数据科学家,不是诗人。
这个函数做了一些修改,利用包中的get_match_results()
函数返回return_ladder
的起始数据帧。在编写这个函数的时候,我想解决这个需求,即梯子可以在任何回合返回,并且可以在 2011 赛季之前返回,这是另一个 API 已经提供的。
记住这一点,编写的函数接受三个参数,所有参数都可以选择为空,也可以指定:
match_results_df
-使用get_match_results()
提取的数据帧,season_round
-用户想要梯子的季节周期,season
-需要梯子的季节。
如果这些都留空,该函数将返回自 1897 赛季以来每个赛季每轮的阶梯。
编写函数是一回事,它还需要 roxygen 注释,这些注释在函数的帮助文档中返回给用户。哈德利的《R 包》一书很好地解释了这些。
我准备好成为一名贡献者
我已经编写了函数、帮助文档,并使用devtools::check()
检查了包,以确保我没有犯任何会导致包构建失败的错误……没有什么看起来令人担忧(嗯,有一些关于没有全局变量的可见绑定之类的警告,但我确信没有什么可担心的),但对我来说一切都很好。
我的本地更改已提交,公关也已完成,我准备好成为一名贡献者,然后嘭!codecov 失败!!那是什么?!给詹姆斯发了一封电子邮件,我被告知这是因为没有写测试。好的,我会写一些测试…什么是测试?!我如何编写这些测试?!我发现这个帖子真的很有帮助,还有哈德利在 R Packages 书中的测试。
一旦这些测试被编写,我提交我的更改,我准备好成为一名贡献者,然后砰!我已经对我的 PR 中没有的母版进行了更改…好的,所以我需要将母版合并到我的 PR 中——很容易(对于某些人来说,我可能不知道)。谷歌一下,看起来很容易,但是在输入git merge origin/master
之后,我在终端中弹出了这个编辑器:
我最初的想法?这是什么?!
有点谷歌,好吧,这是一个 VIM 编辑器。简单。写一个提交消息,然后一切都会好的…等等?!我如何离开这个屏幕?!再谷歌一下,输入:WQ
之后,我们就可以开始摇滚了。
什么?我是。一.在做什么?!!
好吧,事情看起来不错。我提交了我的修改,所有的检查都通过了,快乐的日子。
你知道我之前写的关于的那一行吗?有一些关于‘全局变量没有可见绑定’之类的警告,但是我确信没有什么好担心的。?好吧,这一直困扰着我,因为正如詹姆斯建议的那样,当试图包含 CRAN 的更新时,这些会引起问题。所以我修改了那些,也更新了男士的小插图。在这一点上,我对自己做了什么有点模糊,但我所知道的是,我一定是把自己织进了一张 Git 网…
我的分叉回购的Master
比我的分支Ladder
晚两次提交,比Origin/Master
早五次提交。什么?我是。一.在做什么?!试错,试错。
成功!
在经历了很多心痛之后(我不能强调有多心痛),最终,我把自己整理好了,创造了另一个公关和…成功!!!
最后,我可以说我已经成功地为一个开源项目做出了我的第一份贡献。我希望这个软件包的用户会发现这个功能很有用,并且像其他任何东西一样,可以找到改进的地方,使它变得更好。
本帖原创,发布在不怪数据博客https://www.dontblamethedata.com。去那里看看一些正在使用的新功能的例子。
我的第一个 Python 小项目,用于在 office 中安全浏览 Reddit
TL;DR:你可以用这个包在命令提示符下浏览 Reddit,假装你在办公室工作。
What you can see in your command prompt when you browse subreddit ‘learnpython’ using braw
人们总是说用有趣的方式学习比用无聊的方式学习更有效。而我相信编程也是如此。这就是为什么当我现在学习如何在 Python 上构建一个项目时,我总是寻找一些有趣的项目来给我工作的热情。几天后,我的第一个小项目完成了,我把它叫做 braw(在工作中浏览 Reddit)。此时,该包只允许阅读文章,但不允许创建新文章或发表评论。这将是我这个小项目的第二部分。
完整的代码在这里:https://github.com/wyfok/braw
准备
Python Reddit API 包装器(praw)是一个用于包装 Reddit 的 Python 包。在我的包中,我将使用它来访问 Reddit 并包装内容。有关 praw 的更多信息,请访问 https://praw.readthedocs.io/en/latest/index.html
为了使用这个 braw 包,首先你需要有一个 Reddit 帐户。你还需要从 Reddit 偏好设置->应用程序(https://www.reddit.com/prefs/apps/)获取你的个人客户端 ID 和客户端密码
名称:给出一个名称
选择脚本
描述:空白
关于 url:空白
重定向网址:http://www.example.com/unused/redirect/uri(脚本中不会用到,只是填充用)
然后在下一页,您将获得您的客户端 Id 和客户端密码
此时,创建一个以 JSON 格式存储这些信息的文本文件并保存它。
{
"user_agent":"user_agent",
"client_id":"the string below personal use script",
"client_secret":"secret"
}
由于这个包需要 praw,所以需要先安装 praw。你可以这样做
pip install praw
下载 braw 包后,打开命令提示符,将目录更改到该文件夹。然后运行 Python,导入 braw。
此时,系统会要求您粘贴该文本文件的路径。如果没有错误信息,这意味着您成功连接 Reddit。但是,如果您看到打印结果显示无法连接到 Reddit,这表示您的客户端信息不正确,或者在连接过程中出现问题。
可用功能
以下是您目前可以使用的功能
- get_top(s_reddit='all ',time='week ',how_many=10)
- get_hot(s_reddit='all ',how_many=10)
- get_new(s_reddit='all ',how_many=10)
如果你是 Redditor,那么你应该熟悉前三个。如果你不是,你可以使用每一个来获得热门、热门或新的 Reddit 帖子。您可以选择所有子编辑“all”或选择特定的子编辑,如“learnpython”。然后,您将获得 id 为的各个帖子的标题列表。
4.获取提交(发布标识)
5.获取评论(帖子标识)
使用带有提交 ID 的“get_submission”函数,可以阅读文章的正文。
您还可以使用带有提交 ID 的“get_comment”函数来检查评论。
6.til(多少=10)
有一个著名的教育性的子栏目叫做“今日学习”,里面有很多有趣的事实。该函数将显示该子编辑中的热门帖子。
7.振作起来(多少=10)
我们都知道工作时会非常沮丧。为什么不休息一下,看一些加油的图片呢?“cheer_me_up”将从子编辑“aww”、“dogpictures”和“catpictures”下载图像,并存储在您指定的本地文件夹中。
(PS:我在这里没有任何侵犯任何版权的意图。我尊重所有人的版权。你也应该。所以成功给你加油后请删除所有照片。)
结局
我真不敢相信在设计这个包的时候里面有这么多的乐趣和刺激。我意识到,在 Python 中,我需要做的事情比我想象的要多得多。我希望你喜欢我的第一个小项目,并发现这个包很有用。不仅在办公室,你还可以在公共场所使用这个包,这样别人就不会知道你在浏览 Reddit。如果你发现任何问题或者你想加入其他功能,请在这里或者 GitHub 中留下你的评论。本帖到此结束,下次再见。
我的第一个 Python 小项目,用于在 office 中安全地浏览 Reddit(第 2 部分)
TL;DR:你可以用这个包在命令提示符下浏览 Reddit (并留下你的评论),假装你在办公室工作。
如果你没有看过我之前关于 braw 的帖子(在工作中浏览 Reddit),请先看看,这样你就可以对我的第一个小项目有个概念。
[## 我的第一个 Python 小项目,用于在 office 中安全浏览 Reddit
TL;DR:你可以用这个包在命令提示符下浏览 Reddit,假装你在办公室工作。
towardsdatascience.com](/my-first-small-project-in-python-for-browsing-reddit-in-office-safely-4d1d6985163a)
正如上一篇文章所说,在一篇文章上留下评论将是这个小项目的第二阶段。现在就在这里。
(PS: W3Schools is a really good place to learn Python, recommended)
完整的代码在这里:【https://github.com/wyfok/braw】T2
新增功能:
1.lcop(在帖子上发表评论)
参数:submission_id
lcop 允许您对提交内容发表评论。您需要提供的只是帖子的提交 id。
由于发表评论需要登录,因此在进行任何操作之前,将首先自动检查用户是否登录。如果用户没有登录,那么程序将询问用户是否想要登录。
有时帖子已经被锁定,不允许任何新的评论。在这种情况下,来自 praw 的 APIException 错误将被引发,因此使用 try exception 来处理。
2.lcoc(在评论上留下评论)
除了在帖子上发表评论,你现在还可以在评论上发表评论。与 lcop 类似,您需要提供评论 id 来引用您想要留下评论的评论。
次要更新
包含函数的文档字符串。
在之前的版本中,我没有包含任何 docstring,后来我意识到这对于一个项目来说是一个非常不好的习惯。所以现在我加了回来
隐藏内部功能
对于一些函数,比如打印标题和正文,用户不需要知道,所以我通过用下划线作为前缀重命名函数名来隐藏它。
结局
这个项目将不断更新以添加一些新功能,例如,下一阶段将把帖子和评论复制到 word 文件中,这样你甚至不需要在命令提示符下阅读它。如果你有一些想法或想法,欢迎在这个帖子或我的 GitHub 中发表评论。
青少年初学者指南
如何使用 Python 和 Tweepy 创建自己的 Twitter 数据集
Photo by Elena Koycheva on Unsplash
分析数据的第一步是找到要分析的数据。Twitter 是一个寻找数据的好地方。
Twitter 的 API 是出了名的有据可查,这使得它成为开始创建你自己的数据集的好地方。
在本教程中,我们将涵盖:
- 创建 twitter 应用程序
- 用 Tweepy 获取推文
- 提取 tweet 属性
创建一个 Twitter 开发者账户和应用
- 在这里申请一个账号。
- 创建新应用程序。填写必填字段。(如果你没有网站,你可以使用占位符。)
- 单击“密钥和令牌”选项卡。创建访问令牌和访问令牌密钥。(消费者和消费者密钥应该已经可见。)
安装 Tweepy
要安装 pip,只需在终端中键入pip install tweepy
。
证明
现在说说好东西。
Tweepy 确实使 OAuth 几乎没有痛苦——但是我不打算撒谎,我几个小时都无法让它工作……然后我终于意识到我的访问令牌末尾有一个空格。🤦♀
现在,为了确保它能正常工作,让我们打印我的流中最近的推文:
成功!我们有一堆随机的推文!但是,这真的不是很有帮助,除非你试图分析你关注的人的推文。
获取用户的推文
Tweepy 有一个有用的方法,可以返回指定用户最近发布的状态。
让我们用这个来看看唐纳德·特朗普今天在推特上发了什么:
现在我们有进展了!我们有 tweet 文本,但这仍然不是非常有用。它只是看起来像一堆随机的文本。
user_timeline
函数返回一个 tweet 对象。从 Twitter 的文档中我们可以看到每个 tweet 对象都有一个很长的属性列表,包括我们上面使用的文本属性。
我们可以编写一个函数来提取我们感兴趣的属性,并创建一个数据帧:
现在我们有进展了。在我们的数据框架中有了一些感兴趣的属性后,我们可以继续进行分析。
Twitter 数据的一些流行用途包括主题建模和情感分析。
更有趣的事情,也许是一个现实世界的应用,可能是试图预测特朗普一周会发布多少条推文。
Predictit.com market for Donald Trump tweets
结论
虽然这是数据挖掘的一个很好的开始,但我们仅仅触及了表面。Twitter 的 API 有更多我们可以探索的方法,更不用说互联网的其他部分了!
期待看到你挖出什么有趣的数据!
我第一次在工业界使用自然语言处理(NLP)
人们经常听说 NLP 有多棒,但是对于很多人来说,很难看到它是如何应用于商业环境的。带着这个目的,我想我会分享我第一次尝试使用 NLP 来解决一个商业问题。
Photo by Jason Leung on Unsplash
商业问题
发布新产品对企业来说可能是一个令人担忧的时期,产品的成功和公司的形象依赖于产品的广告表现。其中一个最大的影响是产品的可靠性,它需要像客户期望的那样工作。为此,监控投诉和退货非常重要。对于汽车或大型已安装设备,更有可能的情况是工程师会被派去维修,而不是产品被退回进行更换。
然后,质量工程师可以处理和阅读这些工程师报告,以便对是否存在真正的故障以及故障类型进行分类。然后,可以对这些结果进行汇编,以生成故障的帕累托图,甚至开始在其他可能的可靠性统计数据中构建可靠性浴盆曲线。
值得花点时间来解释帕累托曲线和浴缸曲线,让你对可靠性工程有个粗略的了解。
帕累托图
您收到了大量关于产品不同类型故障的报告,您如何确定哪些故障需要优先解决?一个有用的工具是制作一个帕累托图,这是一个图表,显示了每种故障类型的故障数量,并结合了一个组合百分比,这样你就可以看到每种故障占总数的多少和百分比。下面我举了一个例子。
Example of a Pareto chart of failures
如你所见,Pareto 非常清楚地表明“轴承”是最常见的故障类型,占所见故障的 60%以上。因此,这将是调查和解决降低总失败率的主要候选方法,在观察期间内用于制定帕累托图。
但这只是特定时间段的快照。通常,主要的故障类型会随着产品寿命而改变,包括制造缺陷(冷焊点、断线等)。)发生在产品寿命早期和接近寿命末期的故障往往由运动部件磨损(如轴承、金属疲劳等)所主导。).
为了考察产品寿命期间的总体可靠性,绘制浴盆曲线是有用的。
可靠性浴盆曲线
设备中的故障通常有三种不同类型:
- “早期寿命”——如果这些故障会发生,它们会在设备使用的早期出现,并且随着时间的推移可能性会降低。例如制造缺陷(如冷焊点)或安装错误。故障率随着时间的推移而降低。
- “有效寿命”——这些故障可能发生在产品寿命的任何时间点。无论一个产品设计得多好,总有一些会不可避免地随机失败。故障率始终保持不变。
- “磨损寿命”——随着设备年龄的增长,这些故障的可能性也会增加。这类故障的一个例子通常与磨损的运动部件有关,如轴承或电机。故障率随着时间的推移而增加。
当这三者加在一起时,得到的故障率图看起来有点像浴缸,示例如下所示:
An example Bathtub Curve showing how three different failure types to give bathtub shape
值得一提的是,浴缸的形状是一个广义的形状,不同的产品往往看起来不同。
最明显的极端是计算机电子产品,它往往表现出尖锐的早期寿命和非常长的使用寿命,磨损几乎可以忽略不计。这是因为一旦避免了任何制造或组装缺陷,部件的大部分固态使它们具有非常可靠的工作寿命。
另一个极端是电动马达系统,它的寿命很早,使用寿命很短或可以忽略不计,磨损更明显。这意味着它看起来更像“V”形而不是浴缸形。
为什么这些很重要?
了解产品的浴缸曲线可以让你做出重要的商业决策。例如,如果您知道您的产品的大多数故障都发生在产品生命周期的早期阶段,那么它的可靠性非常好,您可以做一些叫做“老化”的事情。这是设备运行一段时间的地方,直到它们通过包装和销售之前的早期生命阶段。这意味着客户获得了更可靠的产品,保修成本也降低了,但代价是设备总寿命的损失。事实上,这种做法在电子领域经常发生,在这种领域,故障对最终用户来说是昂贵的,并且是购买设备时的一个主要关注点。
相反地,例如,如果你有一辆由于同步带磨损故障的汽车,你可以预测更换同步带的最佳里程数,这样你就不会过早地更换同步带,扔掉还有很长寿命的产品。这与过晚更换皮带的成本相平衡,因为过晚更换皮带会导致故障和发动机损坏维修次数过多。
这里的关键点是,组成产品的不同组件通常会表现出不同类型的故障率。通过准确地记录失败的类型和来源,企业可以首先利用他们的资源瞄准最大的改进领域。他们还可以设计最佳的维护和保修期,最大限度地降低企业成本,并增强购买者的信心。
Photo by Franki Chamaki on Unsplash
NLP 在这里如何变得相关?
在我们快速进入可靠性工程领域后,我们知道准确了解什么产品出现故障非常重要,以便准确了解设备的行为以及它们是否按预期运行(如果您需要能够检测到可能需要安全召回的问题,这一点非常重要)。
此信息的主要来源之一是服务工程师报告。他们会记下他们正在修理的设备的年代,并徒手输入完成的工作。这些以及被替换的零件将被交给质量工程师进行编译,并要求他们阅读工程师报告文本(其中可能充满缩写、拼写错误,内容长度可能从冗长到突兀),解释问题是什么,然后分配正确的故障标签(或复杂故障中的标签),以便可以正确地用于构建帕累托图和浴缸图。
查看这些报告很快会成为一个巨大的时间池,因为大量的客户群会生成大量的报告,涵盖制造商可能生产的几十种产品。这通常意味着必须对最重要的报告进行优先排序,以便首先处理,留下大量根本不使用的报告,或者在报告出现后需要很长时间才能处理的报告。
有没有一种方法可以减轻质量工程师解释报告的负担,既降低完成这项任务的成本,又增加可靠性统计可用的信息量?答案是使用自然语言处理(NLP)。
Photo by Markus Spiske on Unsplash
NLP 如何增加可用数据
业务问题现在被定义为有太多的服务工程师报告(内容长度和质量不一)需要阅读和分类。这是一个 NLP 实际上完美设计的问题。
通过收集质量工程师之前处理过的大量带有专业标签的报告,我们现在已经为每份报告分配了故障标签。该数据可用于训练机器学习模型,该模型可被馈送来自报告的文本,并给出服务工程师正在描述的故障的预测。这开启了巨大的新功能,因为这意味着可以密切监控更多的产品,因为预先标记的报告可以交给质量工程师进行抽查,并验证机器学习算法仍然很好地完成工作。这还可能意味着,那些根本没有足够资源来处理的大量积压报告现在可以自动处理、使用和完成,而不必大幅度扩大质量和可靠性部门来执行。这是令人兴奋的东西!
模型的基本过程
仅仅将原始文本注入机器学习模型并期望获得很好的结果通常不是一个好主意。通常需要大量的清洁和处理。这些通常概括为:
- 拼写检查
- (可选)行业缩写转换
- 删除停用词
- 删除标点符号
- 词干化或词汇化
- 符号化和转换成数字
为了提供帮助,我将提供一段示例文本:
变压器上的 WI 导致线路上的 fure。障碍已排除,线路已修复,保险丝已复位。
**注意:**这些步骤并不总是适用于所有基于文本的问题,事实上可能会使问题变得更难(例如,你试图预测一个丢失的单词),但对于我们的问题,我们试图获取文本的几个句子,并让算法将其总结为一个失败标签。对于这种问题,这些步骤是可以接受的,并提高了所得模型的准确性,最大限度地减少了对异常值或特定工程师(例如,总是有相同错别字的工程师)的过度拟合。
拼写检查
如果你曾经读过你的医生的处方笺,它们是仓促而潦草的,并且经常充满拼写错误。服务工程师也是如此,他们的年终业绩是根据修复日常故障设备的情况来判断的,而不是根据撰写伟大的文献来判断的。这意味着这些报告是在离开客户站点之前完成的最后一件事,并且完成得很快,以便他们可以重新上路。这很有可能会出现拼写错误。
因为我们的机器学习算法不知道英语,如果它看到单词“fire”和“fure”,它会将它们视为单独的单词(但人类会知道这是一个打字错误)。获得太多这样的拼写,你会在文本中失去算法可以使用的信号,并且它还会开始过度适应那些很少发生的独特拼写错误的边缘情况(这是我们不希望的)。因此,必须通过拼写检查来运行文本,以帮助纠正这些问题,因为我们希望人类阅读的文本同样被我们的算法摄取。
在这一点上,纠正行业可能使用的任何缩写也可能是有用的(例如,WI 表示野生动物影响)。你会发现,人们有时会使用缩写,有时会使用完整的单词,所以将文本合并成一种形式(全部是缩写或全部是完整的措辞)在这里很有用,可以最大限度地提高算法训练的信号。
该报告现在写道:
“野生动物对变压器的影响导致线路着火。障碍物已移除,线路已修复,保险丝已重置。”
删除停止字
英语中充满了单词,这些单词虽然有助于创造可读的句子,但提供的信息却很少。在这种应用中,这些是像“a”、“the”等这样的词。这将来自我们的包装(见下文),作为高度使用的词,但在试图获得故障分类时几乎没有什么意义。
确实存在停用词列表,但有时需要调整,因为并非所有停用词在不同的应用中都是停用词。最终的结果是句子现在读作:
“野生动物冲击变压器导致火线。障碍物已移除,线路已修复,保险丝已重置。”
**注意:**虽然对我们人类来说阅读起来越来越难,但我们正试图将报告提炼为传达算法学习信息的关键词。
删除标点符号
作为人类,标点符号有助于我们阅读,但对于算法来说,它只会被它混淆,因为它会将不同大写的单词(“世界”和“世界”对它来说是不同的)和标点符号视为关键部分。所有的单词都用小写字母表示,并且去掉了标点符号。
“野生动物冲击变压器导致火线阻塞,移除线路,修复保险丝重置”
**注意:**删除标点符号和停用词都将减少机器学习算法必须接受的输入大小,从而减少它需要处理来训练、预测等的数据量。当您开始使用大量文本数据来构建模型时,这些都是非常好的好处。
词干或引理满足
在英语中,单词可以以不同的形式书写,但仍然具有相同的意思。比如“结果”、“结果”、“结果”。所有这些我们可以解释为意思相同,但对于我们的算法来说,它会将它们视为不同的单词,并且必须了解这三个东西的意思相同。我们可以通过选择词汇化或词干化来使生活变得更容易。
词条满足试图将单词返回到词典术语或“词条”(如果是动词、名词等,则由指示确切形式。),但是使用的一种更常见和更简单的方法是词干法。
词干处理的目的是以一种基于规则和系统的方式砍掉单词的结尾,这样同一个单词的不同形式都返回到一个共同的基本形式(不一定是你将看到的那种形式),最常见的算法是、【雪球】和【波特】。
我们将一个雪球词干分析器应用于我们的句子,并得到最终的句子:
“wildlif 冲击变压器导致火线阻塞移除线路维修保险丝重置”
你会注意到,我们保留了单词“transformer ”,因为它是一个在公用事业(它是一件设备)中具有特定含义的单词,我们希望算法将它识别为一个不同于“transform”或“transforming”的单词。这就是获得特定领域的经验非常有用的地方,因此可以确定这样的决定来帮助保存文本中的宝贵信息,否则您可能会意外破坏这些信息。
符号化和转换为数字(单词包)
现在,我们已经为报告中的文本建立了一个清晰和标准化的格式,我们现在需要将其转换为机器学习算法可以解释的形式。我们通过将句子分解成【记号】(或分词)来做到这一点,以便这些可以被转换成算法可以摄取的格式。为此,我们用空格将单词分开,然后统计特定单词在报告中出现的次数。这给了我们一个单词袋模型,它忽略了语法和词序,但保留了单词数。这会产生一个表格,其中每行是每个报告中文本的结果,每列代表报告中出现的唯一单词之一。
这是为训练数据集中的每个报告完成的,当发现新的唯一单词时,添加新的列。
正是这个结果表可以输入到模型中对其进行训练,为了进行预测,只需对数据进行类似的格式化,并将该报告的行输入到模型中。
对于我们的报告示例,单词包表如下所示:
Example of Bag-of-words
**注意:**单词袋模型是以算法可以接收的形式表示文本的更简单的方法之一,但也存在其他类型,如“术语频率-逆文档频率”( TF_IDF ),它根据单词相对于所有文档对特定文档类型的重要性来加权数量计数。这意味着,如果单词“line”被频繁使用,它的权重会大大降低,而“wildlif”不会被降低,因为它只出现在野生动物引发的故障报告中,而不会出现在其余的报告中。
训练模型
我们现在可以使用我们已经处理成单词袋模型的带标签的服务工程师报告来训练我们的模型。常用的经典算法有朴素贝叶斯的支持向量机( SVM )。然后,可以将训练好的模型用于剩余的已标记报告,以验证其工作正常(抑制测试集),并且被认为非常好,因此用于未标记服务工程师报告的大型存储库
结果呢?
Photo by bruce mars on Unsplash
成功!人们发现,即使这种非常简单的文本处理也会产生非常显著的结果,所得到的模型对于包含足够多关键字的报告来说非常好。甚至可以通过重新标记一些训练集,然后重新训练模型,将一个类别分成三个类别。这为企业节省了大量时间,同时也允许将大量数据汇集到更准确的业务决策中。然后,质量工程师可以重新专注于其他更重要的任务,只是对标签进行抽查,以验证模型仍在充分执行其任务。
可以说,商业案例得到了满足,人们对可能发生的事情印象深刻。下一步是调整模型,使其预先标记所有报告,以帮助仍在手工处理报告的质量工程师(这在更多的业务和安全关键领域中进行)。
摘要
只有使用最经典的 NLP 方法,企业才能够释放巨大的数据存储库,并减轻现有资源的负担,使其他任务(NLP 无法解决)得以完成。
我成为了一名自由职业的数据科学家
Photo by Goran Ivos on Unsplash
2019 年初,我开始从事一些数据相关项目的自由职业工作,目的是(a)加强我的数据科学技能,( b)看看除了日常工作外,我还能赚多少额外收入。整个过程耗时约 2 个月,从 2019 年 1 月到 2019 年 3 月。我想和你分享我的自由职业经历,以及两个月后我最终赚了多少钱。
平台选择
我选择 Upwork 作为自由职业平台,这是最大和最有信誉的在线自由职业平台。在这个平台上有大量的机会,它提供了成功交付项目所需的所有工具,例如公共档案、与客户的实时聊天、安全功能、时间表、分析,以及最重要的管理资金和所得税的工具。
设置个人资料
由于完美主义😅,在开始竞标项目之前,我花了一些时间建立了一个全面的平台简介。这是展示我的真实性、专业性和技能的好方法。概要文件通常由以下部分组成:
- 传记:这里你可以对自己做一个简单的介绍。如果你已经完成了平台上的项目,工作和收入统计也将显示在这一部分。
- 作品集:这是你展示自己项目的地方。更吸引人的是,你可以上传情节或截图,并为每个项目添加细节,以便更好地说明。作为一名自由职业的数据科学家,展示数据可视化的作品肯定会有所帮助。我的投资组合中的一个项目如下所示:
- 技能:描述我专长的关键词。
使用连接发送提议
在我建立了令人惊叹的个人资料后,我准备好开始竞标世界各地的项目。如果你持有免费会员账户,Upwork 每月会给你 60 次“连接”。你发出的每一个提议/出价都需要 2 次“连接”。所以,我每个月有 30 次免费投标的机会,这对于我来说已经足够了。此外,我后来发现,来自回访客户的项目成了我工作量的稳定来源,这不需要任何连接,因为我们已经连接上了。
获得我的第一个项目
Upwork 上的项目数量惊人,尤其是与技术相关的项目。作为一名自由职业的数据科学家,我的默认过滤器是“数据科学和分析”下的每个类别。
在发出 10 多份建议后,我在 2019 年 1 月 21 日完成了我的第一个项目,从公共工作板上收集数据。在与客户讨论了项目的细节、确定了可交付成果并接受了最终合同后,我在周末花了几个小时成功地完成了工作。交货 3 天后我拿到了工资。我工作的速度和质量给我的客户留下了深刻的印象。工作完成后,客户给了我一个五星的好评,如下所示。
A 5-star Review from my First Client
作为跟进,同一个客户又给了我几个任务来继续工作,如果你通过高质量的作品来展示你的价值,这在自由职业者的世界里是非常常见的。通过这个项目,我不仅将我的知识和技能货币化,还通过额外的研究学到了新技术。这坚实的第一步成就了我的一周😆。
两个月总收入
我在业余时间做了大约两个月的自由职业项目。这是一次很好的学习经历,但我应该说,平衡自由职业者的工作和日常工作对我来说真的真的很难。我主要在周末工作,由于更重要的家庭事务,我不得不跳过它(那时我已经结婚,有一个 3 岁的孩子和一个新生儿)。如果你真的想在不放弃主要收入来源的情况下把它作为第二收入来源,你应该做好充分准备,可能需要降低期望值。事后看来,我总共交付了 14 个项目,总收入为 760 美元。如下所示,早期项目之间的时间间隔比后期项目要紧得多,因为几周后我就跟不上早期的进度了。
这些项目可以简单地细分如下:
- 数据抓取:10 个项目共 510 美元,每个项目 51 美元。每个项目平均需要 2 到 3 个小时。
- 数据科学教学:3 个项目共 215 美元,也就是每个项目 70 美元。每个项目平均耗时约 1 小时。
- 数据工程:1 个项目共 35 美元,也就是每个项目 35 美元左右。那个单个项目用了不到 1 个小时。
数据抓取对平台有很大的需求。难怪成了我的大源类型。对我来说,教书的时薪最高。我认为这符合人们的期望,因为一小时的教学或辅导需要事先做一些额外的准备。
结论&最终想法
作为一名自由职业的数据科学家,这真的是一次非常棒的经历!到今天为止,我已经离开自由职业 4 个月了。即使我没有订婚,来自个人的项目邀请也不断地冲击着我的收件箱,不幸的是,我没有时间为此而工作。如果你还没有做数据科学家,我强烈建议你尝试一下自由职业,这不仅是为了赚取一些额外收入,也是加强你的数据科学技能的一种方式。没有什么比做真正的项目更好的了!
我的朋友给了我他们的 Tinder 数据…
那是 2018 年 10 月 3 日星期三,我坐在联大数据科学课程的后排。我的导师刚刚提到,每个学生必须为数据科学项目提出两个想法,其中一个我必须在课程结束时向全班展示。我的大脑一片空白,这是一种被给予如此自由支配选择几乎任何东西的感觉。接下来的几天,我集中精力想出一个好的/有趣的项目。我为一个投资经理工作,所以我的第一个想法是去做一些与投资经理相关的事情,但后来我想到我每天花 9 个多小时在工作上,所以我不想我神圣的空闲时间也被工作相关的事情占用。
几天后,我在我的 WhatsApp 群组聊天中收到了以下消息:
这引发了一个想法。如果我可以利用在课程中学到的数据科学和机器学习技能来增加 Tinder 上任何特定对话“成功”的可能性,会怎么样?于是,我的项目思路就形成了。下一步?告诉我女朋友…
Tinder 自己公布的一些 Tinder 事实:
- 该应用拥有约 5000 万用户,其中 1000 万人每天都在使用该应用
- 自 2012 年以来,Tinder 上已有超过 200 亿场比赛
- 该应用每天总共发生 16 亿次刷卡
- 普通用户每天花 35 分钟在这个应用上
- 由于这款应用,每周约有 150 万次约会
问题 1:获取数据
但是我如何得到数据来分析呢?出于显而易见的原因,用户的 Tinder 对话和比赛历史等。被安全地编码,因此除了用户之外没有人能看到它们。在谷歌搜索了一下之后,我看到了这篇文章:
[## 我向 Tinder 要了我的数据。它寄给我 800 页我最深最黑暗的秘密
约会应用比我更了解我,但这些大量的隐私信息只是冰山一角。什么…
www.theguardian.com](https://www.theguardian.com/technology/2017/sep/26/tinder-personal-data-dating-app-messages-hacked-sold)
这让我意识到,作为《信息自由法案》的一部分,Tinder 现在被迫建立一项服务,你可以从他们那里请求你自己的数据。提示,“下载数据”按钮:
点击之后,你必须等待 2-3 个工作日,Tinder 才会给你发送一个下载数据文件的链接。我急切地等待着这封邮件,在我现在的关系之前,我已经是 Tinder 的狂热用户大约一年半了。我不知道我会有什么感觉,回头浏览这么多最终(或最终没有)失败的对话。
感觉过了一段时间后,电子邮件来了。数据(谢天谢地)是 JSON 格式的,所以快速下载并上传到 python 和 bosh,就可以访问我的整个网上约会历史。
数据
数据文件分为 7 个不同的部分:
其中,只有两个对我真正有趣/有用:
- 信息
- 使用
进一步分析,“使用”文件包含关于“应用程序打开”、“匹配”、“收到的消息”、“发送的消息”、“向右滑动”和“向左滑动”的数据,而“消息文件”包含用户发送的所有消息,带有时间/日期戳,以及消息接收人的 ID。我敢肯定你可以想象,这导致一些相当有趣的阅读…
问题 2:获取更多数据
没错,我有自己的 Tinder 数据,但是为了让我得到的任何结果在统计上不完全无足轻重/严重偏颇,我需要得到其他人的数据。但是我该怎么做呢…
暗示一笔不小的乞讨金额。
奇迹般地,我设法说服了我的 8 个朋友给我他们的数据。他们从经验丰富的用户到偶尔“无聊时使用”的用户,这给了我一个合理的用户类型的横截面。最大的成功?我女朋友也给了我她的数据。
另一件棘手的事情是定义“成功”。我决定要么从另一方获得一个号码,要么两个用户去约会。然后,通过提问和分析,我将每一次对话分为成功或失败。
问题 3:现在怎么办?
是的,我已经得到了更多的数据,但是现在呢?数据科学课程侧重于 Python 中的数据科学和机器学习,因此将它导入 Python(我使用了 anaconda/Jupyter 笔记本)并清理它似乎是合乎逻辑的下一步。与任何一位数据科学家交谈,他们都会告诉你,清理数据是 a)他们工作中最乏味的部分,b)占据他们 80%时间的部分。清理是枯燥的,但对于从数据中提取有意义的结果也是至关重要的。
我创建了一个文件夹,将所有 9 个数据文件放入其中,然后编写一个小脚本循环遍历这些文件,将它们导入到环境中,并将每个 JSON 文件添加到一个字典中,关键字是每个人的名字。我还将“用法”数据和消息数据分成两个独立的字典,以便更容易对每个数据集分别进行分析。
问题 4:不同的邮件地址导致不同的数据集
当你注册 Tinder 时,绝大多数人使用他们的脸书账户登录,但更谨慎的人只使用他们的电子邮件地址。唉,我的数据集中有一个这样的人,这意味着我为他们准备了两套文件。这有点痛苦,但总的来说并不太难处理。
将数据导入字典后,我遍历 JSON 文件,将每个相关数据点提取到 pandas 数据帧中,如下所示:
Usage Data with names removed
Message Data with names removed
在有人担心在上面的数据框架中包含 id 之前,Tinder 发表了这篇文章,指出除非你与用户匹配,否则不可能查找用户:
既然数据的格式很好,我设法生成了一些高级汇总统计数据。数据集包含:
- 2 女孩
- 7 伙计们
- 9 参与者
- 502 一条消息对话
- 1330 独特的对话
- 6344 个匹配
- 收到 6750 条消息
- 发送了 8755 条消息
- 34233app 打开
- 94027右刷卡
- 403149左刷卡
太好了,我有大量的数据,但我还没有真正花时间去思考最终产品会是什么样子。最后,我决定最终产品将是一份如何提高网上约会成功率的建议清单。
因此,有了格式良好的数据,探索就可以开始了!
探险
我开始查看“使用”数据,一次一个人,纯粹是出于好奇。为此,我绘制了一些图表,从简单的汇总指标图开始,如下所示:
到更复杂的衍生指标图,如名副其实的“忠诚度图”,如下所示:
第一个图表是相当自明的,但第二个可能需要一些解释。实际上,每一行/水平线代表一个唯一的会话,每行的开始日期是会话中发送的第一条消息的日期,结束日期是会话中发送的最后一条消息的日期。这个计划的想法是试图了解人们如何使用该应用程序同时给多个人发送消息。
虽然有趣,但我真的没有看到任何明显的趋势或模式,我可以进一步询问,所以我转向聚合“使用”数据。我最初开始查看按用户划分的各种指标,试图确定任何高级趋势:
但是没有什么立即引起注意。
然后,我决定更深入地研究消息数据,如前所述,这些数据带有一个方便的时间戳。按照一周中的每一天和一天中的每一个小时来合计邮件数量后,我意识到我偶然发现了我的第一个推荐。
第一个推荐:
周日晚上 9 点是“打火”的最佳时间,下面显示的是我的样本中发送邮件量最大的时间/日期。
在这里,我用发送的消息量来代表每次在线用户的数量,所以这次的“Tindering”将确保你拥有最大的受众。
然后,我开始从单词和字母的角度来看信息的长度,以及每次对话的信息数量。最初,你可以在下面看到没有太多突出的东西……(这里“成功”是红色的)
但是一旦你开始挖掘,有几个明显的趋势:
- 较长的信息更有可能获得成功(在一定程度上)
- 发现“成功”的平均对话消息数为 27 条,中位数为 21 条。
这些观察导致我的第第二和第第三个建议。
第二个推荐:
花更多的时间来构建你的信息,看在上帝的份上,不要用短信……一般来说,越长的单词越好。这里需要注意的是,数据包含了链接**,这些链接被算作长单词,所以这可能会扭曲结果。**
第三个推荐:
当试图得到一个数字时,不要太匆忙。“嘿,你好,你的号码是多少”就你的机会而言,这可能是你能说的最糟糕的话。同样的,不要放太久。你的第 20 到第 30 条信息是最好的。
Average message count of successful vs un-successful conversations
在广泛研究了单词/信息/对话的长度之后,我决定研究情绪。但是我完全不知道该怎么做。在这个过程中,我们已经涉及了一些自然语言处理(单词包,一个热编码,所有需要的预处理等)。以及各种分类算法),但没有涉及情感。我花了一些时间研究这个话题,发现nltk sensitivity . Vader sentimentintensitiyanalyzer会是一个很好的口号。
这通过给用户四个分数来实现,基于输入文本的百分比:
- 积极的
- 中立的
- 否定的;消极的;负面的;负的
- 三者的结合
幸运的是,它还处理诸如单词上下文、俚语甚至表情符号之类的东西。当我查看情感时,没有做任何预处理(小写,删除标点符号等)。)以便不移除任何隐藏的上下文。
我通过将每个完整的对话输入分析器来开始这一分析,但很快意识到这并不真正有效,因为在最初的几条消息后,对话情绪很快倾向于 1,我很难相信 100 条消息的对话在整个时间中都是 100%有信心的。
然后,我将这些对话分解成组成它们的信息,一次输入一条,将分数平均到对话水平。在我看来,这产生了一个更加现实的结果:
将这些数据分为“成功”或“不成功”,我很快发现了一个模式:
这个球座提升了我的第四个推荐。
第四个推荐:
要积极,但不要太积极。
成功对话的平均情绪是 0.31,而不成功对话的平均情绪是 0.20。话虽如此,过于积极几乎和过于消极一样糟糕。
我探索的最后一个问题是关于第一条信息的各种细节对对话成功的影响。对可能产生影响的事情的最初想法是:
- 长度
- 是否使用了名称
- 感情
- 表情符号的存在
- 明确的内容
正如所料,第一条信息越长,对话继续“成功”的可能性就越大。作为延伸,你不仅仅使用一个单词开头,例如不仅仅说“嘿”、“嗨”或“daayyuumm”(真实的例子),你成功的概率会加倍。
更令人惊讶的是,在第一条消息中使用一个名字对“成功率”几乎没有影响。
第一条信息情绪结果是“成功的”对话比“不成功的”对话高大约 0.09,这并不令人惊讶……如果你在第一条信息中侮辱某人,直觉上他们不太可能回复。
分析表情符号是一项我没有真正想过的任务,可能会很棘手。幸运的是,有一个名为“表情符号”的包,它可以自动识别文本中的表情符号。不幸的是,令我沮丧的是,在第一条信息中使用表情符号似乎增加了一个人获得“成功”的可能性。
现在到显式内容** …另一个可能相当棘手的问题,因为没有内置的库可以使用脏话等。(据我所知)。幸运的是我偶然发现了这个:**
我可以向你保证,里面有一些绝对的饼干。
然后,我查看哪些第一条消息包含这个列表中的单词,其中 40 条包含。像往常一样,我发现了一些有趣的边缘案例:
仅供参考,这是一个家伙在谈论他的划船紧身裤…
结果?事实证明,包含明确内容的第一条消息没有一条会导致“成功”
这让我想到了我的第五个也是最后一个建议。
第五个推荐:
发送第一条消息时:
- 积极
- 8 个单词是最佳的
- 使用一两个表情符号
- 不要太露骨
所以总结一下
- 在周日晚上 9 点使用 Tinder 可以获得最多的观众
- 花时间构建信息,不要使用短信
- 准备在第 20 条和第 30 条信息之间询问一个数字或日期
- 要积极,但不要太积极
- 发送除了“嘿”之外的其他信息作为第一条信息,目标是大约 8 个单词,也许使用表情符号,不要太露骨
数据的几个陷阱:
- 我的数据集是一个非常非常小的样本,这使得大部分见解变得毫无用处
- 该数据集偏向于我所知道的那类人,也偏向于男性
- 数据集只包含对话的一方
- 由于用户卸载和重新安装应用程序,消息和使用统计数据不一定一致
- 由于人们说话方式的讽刺/变化,没有一种自然语言处理技术是完美的
对未来工作的几点想法:
- 收集更多数据
- 做更多的工作来确定具有统计意义的结果和观察结果
- 根据话题进行对话分析——什么类型的信息构成了好的和坏的情绪
- 试着调查讽刺
- 调查其他应用程序(Bumble、Hinge 等)。)
- 如果有更多的数据的话,可以进行一些分类分析,因为我们只有大约 70 次成功
- 如果包含更多的数据,请更多地研究性别差异
来自数据的一些有趣的仿真陈述:
- 单人单日最多刷卡次数:8096 次
- 男人更有可能在发送第二条信息之前离开很长时间(大约 7 天)
- 在第一条信息中提问实际上会降低你成功的几率
- 女性平均有 1%的时间向右滑动,而男性大约有 50%的时间向右滑动
- 每打开一个应用,女性刷卡次数是男性的 3 倍
延伸阅读:
- 一篇名为“Tinder 用户活动初步观察”的论文发表了
- 有一个 Tinder API ,但不幸的是,它只针对使用该应用的人,而不是提供某种数据库的访问权限。无论如何,用它来测试某些假设会很有趣。
- Tinderbox 是一款软件,可以通过降维来了解你被谁吸引。如果你真的想自动化这个过程,它还有一个内置的聊天机器人…
感谢您的阅读,对未来工作的任何想法都将不胜感激!
我的手是人工智能
这也是一手相当酷的牌。
看看这个:
My hand!
是我的手。很漂亮的手,不是吗?
现在看看后面:
Don’t be fooled, it’s the same hand, it’s just that it’s been turned around.
很酷吧。
这是一个非常简单的工具:它由五个手指组成,其中一个是拇指。然而,这是一个非常有用的工具。我可以用它做各种事情!
我可以用手弹吉他。
我可以用手拿着一杯啤酒。
我能用我的手写文章。
My hand pretending to write a note.
我能用手烹饪食物。
我能用手开车。
我可以用手玩电子游戏。
My hand picking the best stage in Super Smash Bros.
只要由我的大脑提供动力,我的手就可以用来做各种各样的事情。因此,我的手是一个通用算法的例子,或者,正如行话 biz 中的人们喜欢称之为“通用 AI”。
Told you my hand was cool.
“人工智能”这个术语有无数种定义。对人工智能进行分类的许多方法之一是通过术语“通用人工智能”和“模块化人工智能”。通用人工智能是一种能够执行非常广泛的任务的工具,而模块化人工智能是为一个非常特定的目的而制造的。例如,你可能在好莱坞电影中看到的大多数人工智能都是一般人工智能的例子:无论是终结者*、中的人工智能还是 I 中的机器人,机器人。他们通常看起来或行动起来像人类,并且能够做人类能够做的大多数事情,通常更强、更好、更快。*
好吧。所以艾将军还是挺利索的。
我们应该把它放在电脑里。
My hand, inside of a computer. Tricked ya! It’s not actually inside of the computer, it’s just a photo of my hand displayed on a computer screen.
没人知道怎么做。
How do we get Jacob’s cool hand inside of a computer?
关于艾将军的书不计其数。许多演讲者、许多播客和许多出版物已经讨论并继续讨论这种形式的人工智能,以及它不仅对企业,而且对整个社会的影响,然而人造的通用人工智能实际上并不存在。
嗯。
那我的手是怎么创造出来的?
进化>我的手>人类算法
我的手,顺便说一下,还有我的其余部分,是由进化创造的。你可能以前没想过,进化其实就是一种算法。它是世界上运行时间最长的已知算法,并且运行在最强大的系统上:我们的星球。就像软件在电脑上运行,我的手在大脑上运行一样,进化在地球上运行。
进化论也是机器学习(AI 的一个子类)的五个主要流派之一,其他四个分别是符号主义者(逻辑学家)、连接主义者(神经科学家)、贝叶斯主义者(统计学家)和类比主义者(相似性理论家)。
我们已经知道如何模仿进化。例如,我们可以将进化论应用于经典视频游戏《超级马里奥兄弟》。在这款游戏中,玩家控制着马里奥,试图尽可能地靠近屏幕右侧,克服途中的各种障碍。如果你要训练一个人工智能尽可能有效地击败超级马里奥兄弟,进化论将是一个可以采用的完美算法。产生 100 个不同的马里欧,每个都有一些不同的变量(统计),看看谁能做到最右边。获胜者可以再生育 100 个 Mario——第二代——每一个都继承了获胜者略微改变的 DNA,直到你创造出完美的 Mario。在计算机中使用进化的另一个更实际的例子是垃圾邮件过滤器的创建。许多垃圾邮件过滤器使用基于进化论的算法,其中表示垃圾邮件的单词被配对以产生子术语。
AI learning to play Super Mario Bros. The current generation is listed in the upper left corner. Made by SethBling, reported through Max Plenke.
不管怎样,回到超级马里奥兄弟的例子,我们创造的完美马里奥仍然是模块化人工智能的一个例子。他唯一擅长的就是玩超级马里奥兄弟,他唯一的技能就是能够从左往右走而不被障碍物绊倒。
然而,至少在理论上,进化可以被用来创造一种通用算法,就像机器学习的其他四个学派一样。但是它非常复杂。这需要大量的训练,以及明确定义的程序和流程。更重要的是:它需要一个实际的商业案例。**
我手里的公文包
人工智能是个时髦词。它可能意味着任何事情。但是当你看到今天存在的声称使用“人工智能技术”的实际应用时,他们总是使用某种形式的模块化人工智能。它们是为一个非常特殊的目的而建造的。这就像一只专门为弹钢琴而造的手。
不仅仅是一般的 AI 很难建立,而且也很难证明它的商业价值。在创建人工智能解决方案时,通常最好先制作滑板,然后是踏板车,接下来是自行车,然后是摩托车,然后是汽车,而不是直接制作复杂汽车的各种组件。同样,创造一只擅长做一件事的手有更强的商业理由。您可以看到更清晰的投资回报,并且在销售解决方案时,您有更强的说服力。客户不想要一个庞大的、全面的、难以消化的解决方案,他们想要一个解决他们眼前具体问题的方案。
One of the reasons why my hand hasn’t been put in a computer, is that the business case for hands made for a specific purpose simply has a stronger business case than a hand that can do everything. Photo by Helloquence.
然而,许多伟大的思想家和工程师正在讨论和构建与我的手非常相似的通用人工智能。一些人认为通用算法会非常复杂,可能会有数百万行代码。其他人则持相反的观点,认为通用算法实际上只需要几百行代码。
我的手就是一个很好的例子。如果数据模型和数据足够强大,强大的算法可能会变得异常简单。
就像我冰凉的手。
Wait… You guys have hands too? Photo by William White.
对人工智能感兴趣?这里还有一些你可能会喜欢的文章。
Deepfakes 将成为人类的巨大威胁,AI 创造 deepfakes 和 AI 检测 deepfakes 的竞赛…
medium.com](https://medium.com/swlh/who-is-the-terminator-c5135890651b) [## 人工智能如何让你成为总统
对于那些想要获得更高权力的政治家来说,理解人为的…
towardsdatascience.com](/how-ai-can-make-you-the-president-4756f6b1c0c0)*
我从商业到数据科学的旅程
Image from Pexels
尽管我确信我不会喜欢会计或商业讲师的工作,但我在 2016 年完成了商业硕士学位。完成学业后,我参加了我们州政府机构 KSUM 为期一年的奖学金( TIFP )。
我不知道该选择什么职业,也不知道该朝哪个方向走。我记得我在学士学位的时候学过一些编码,我对学习编码有兴趣。然后我决定试一试。
我开始向代码学院学习。为了找一份前端 web 开发人员的工作,我尝试了 HTML、CSS 和 Javascript。但是没有成功。我找不到任何学习 web 开发的渴望。那时,我开始了解数据科学,这让我印象深刻。尤其是我喜欢编码和统计的混合。这是数据科学最初的驱动因素。
在这篇文章中,我将分享我在过去 9 个月中使用的资源和遵循的方法,以完全相同的顺序开始学习数据科学。
1.Udacity 贝塔斯曼数据科学挑战课程。
在合适的时候,我知道了贝塔斯曼数据科学挑战奖学金。我被选中参加这个项目,并从那里开始了我的数据科学之旅。第一阶段是充满挑战的课程。我必须在 3 个月的期限前完成课程。第一阶段的前 10%的学生获得了 Udacity 的三个纳米学位课程(数据基础、商业分析师、数据分析师)中的任何一个。
在本课程中,我学习了用于描述数据、探索数据、使用统计研究方法、计算简单概率、可视化数据的基本概念,以及 python 和 SQL 的基础知识。我学习了推理统计学,这是挑战课程的选修部分。描述统计学导论和推断统计学导论是 Udacity 的免费课程。我们得到了 SQL 和 Python 的额外材料。
课程开始于 2018 年 5 月,我在 6 月下旬加入了 1 个月。我在两个月内完成了课程,但我无法进入第二阶段。但是完成挑战课程给我的学习方式带来了很多改变。其中之一是我开始定期学习至少 8-10 个小时。
学习贝塔斯曼数据科学挑战赛课程给我的感觉足以让我朝着自己的梦想前进。
我最喜欢这门课程的是来自 Udacity 的专家、社区经理和同行的巨大支持。
2.Udemy 的 Python 3
当我寻找到达目的地的替代方法时,我完成了 Udemy 的“Python 3 课程:从初级到高级”。开始时很有趣,后来开始变得令人困惑。课程开始时的 Python 基础知识很有帮助。
3.数据营
就我个人而言,我喜欢数据营。不管你以前是否有任何编码经验。Datacamp 是计划学习数据科学的最佳在线平台之一。
首先,我报名参加了 Python track 的 Data Analyst。当时我没有信心能够理解机器学习的概念和算法。我认为理解这些对我来说将是一项艰巨的任务,因为我来自非计算机科学背景。我最初决定学习数据分析,我认为在获得一份数据分析师的工作后,我可以开始学习机器学习。
DataCamp 中有 7 个职业轨迹。
- Python 程序员
- 使用 Python 的数据分析师
- 使用 Python 的数据科学家
- r 程序员
- R 的数据分析师
- R 的数据科学家
- 定量分析师
我用 Python 完成了 Data analyst,然后是 r。在完成每条赛道后,我做了 DataCamp 项目库中的一些项目。
我喜欢 Datacamp 的什么地方
- 如果没有经验,这是开始的最佳平台。
- 每个职业轨道中结构合理/设计良好的内容
- Datacamp 提供的足够从零英雄。你可以从非常基本的概念开始,学习复杂的机器学习算法,并开始解决现实世界的问题。
- Datacamp 有很好的项目集合。学完之后,如果你对如何从头到尾解决一个现实世界的问题感到困惑,项目部分会给你实践经验。
- 在每个视频内容之后,您可以在 DataCamp 编码环境中练习您所学的内容。您将逐步了解如何处理给定的数据集。如果你在练习中遇到困难,你可以检查“提示”选项来完成任务,或者你也可以检查答案。
4.卡格尔
获得基本的分析和编程知识以及课程证书是不够的。做真实世界的项目有助于增加我们的知识,并在数据科学领域开始职业生涯。我选择 Kaggle 去寻找数据集来做我自己的项目。
当然,我们可以从 DataCamp 做项目。他们会告诉你如何?但是没有人会一直指导你如何处理数据或者如何转换数据等等。这就是为什么我决定做 DataCamp 之外的项目。我对 2016 自由代码营新编码器调查数据做了探索性的数据分析。然后参加了 2018 Kaggle ML & DS 调查挑战赛。
当我读到 NFL 平底船分析比赛时,我决定继续努力。我没有在这次比赛中提交我的内核,但是我花了一些时间玩数据,学习 NFL,并试图找到解决方案。在我迈向数据科学的旅程中,这是一次很棒的经历。
5.Coursera- IBM 数据科学认证
我在考虑更高级的数据科学课程。我从 Coursera ,IBM数据科学专业和约翰霍普金斯大学找到了两门课程。我决定从 IBM 的课程开始。这个项目由 9 门课程组成,最后包括一个顶点项目。我们可以免费使用这个项目 7 天。由于我没有足够的存款来支付,我想如果我能在免费试用结束前完成这个项目会更好。
当我浏览课程详情的时候,我意识到,不了解机器学习,我是无法用 7 天时间完成课程的。为了解决这个问题,我使用 DataCamp 的 R 和 Python 完成了数据科学课程,然后报名参加了 IBM 数据科学认证项目。我在免费试用期内完成了课程。
从多个平台学习帮助我更好地理清概念。
我还没说完。我口袋里有一张长长的“待办事项”清单。
- 来自 Kaggle 的更多项目
- 数据科学专业—约翰·霍普金斯大学
- 吴恩达的《机器学习》
- 麻省理工学院的分析优势等等。
我就是这样开始我的数据科学之旅的。我学到了很多,还有很长的路要走…
爬网站时我旅途中最好和最糟糕的时刻
一个成为数据科学家的个人分享
如何看待抓取或抓取网站?
许多人可能会将这项技能视为一种自动化工具,或者仅仅是一项通常被人们视为低端技能的技能。
对我来说,你可以把它看作一场战争,只是这场战争发生在互联网上。特别是当你在一个特定的网站上进行例行的网络爬行时,也许最初几次你能够获胜,你会庆祝地狱耶这个网站很容易刮,但你还没有意识到另一方面,也有人可以跟踪你的机器人的可疑活动,然后试图阻止你的机器人爬上网站。
很多时候,人们可能会忽略检索良好数据源的重要性,而是更加重视如何建立一个更准确的机器学习模型。有一个构建机器学习模型的首字母缩略词,叫 GIGO,是**“垃圾进,垃圾出”的缩写。**因此,重要的是要认识到,如果您能够检索到良好的数据源,再加上您已经具备出色的 EDA 和建模技能,您将能够构建更好的机器学习模型。
回到正题,我要和大家分享一下,我从抓取到抓取网站的历程。给你们一些我的背景,我毕业于新加坡南洋理工大学,拥有数学和经济学学位,不是来自技术背景,学习技术技能通常更难,但如果你努力工作,最终你会擅长它。
自动化刮削初体验
它始于我在南洋理工大学统计研究所的一份兼职工作,当我还在大学学习时,我必须去每个网站,复制并粘贴每个页面到 excel 文件。基本上,我被要求从这个网站获取所有与世界排名和各大学分数相关的信息。
兼职之后,眼睛总是感觉很累。这就是我开始刮网站的原因。没什么特别的,我只是用 Python 库 Request 抓取网站,用 BeautifulSoup 解析 HTML 内容。
结果很好,我对此非常感激。刮刀不仅可以保护我疲劳的眼睛,还可以提高我的工作效率。第一次做抓取,我发现用这两个 Python 包来抓取网站真的很容易。
如果你对这个刮刀感兴趣,可以访问我的 github repo 了解更多信息。
数据科学项目的抓取经验
机器学习是我的兴趣。自从我在电通宙斯盾网络全球数据创新中心第一次实习以来,它就激发了我的兴趣。如果有机会见证数字营销中涉及机器学习的项目,我真的对它的力量印象深刻。所以,未来要成为一名数据科学家,我告诉自己要多做一些涉及机器学习的项目。
我决定做一个基于某些因素的租金价格预测的项目,例如,捷运和出租单元之间的距离,房间的大小,单元中浴室的数量等等。所以,我决定爬上房地产大师网站,这是在新加坡寻找出租单位的最受欢迎的网站之一。
这个网站是一个动态网站,需要我建立一个互动的机器人,因此我选择 Python 包 Selenium 和 BeautifulSoup 来抓取网站。起初,我认为我似乎能够建立一个刮刀,并很容易地检索数据,但该网站实现了完全自动化的公共图灵测试,以区分计算机和人类(验证码)。
我意识到爬行并不容易。它涉及到对特定网站的深入了解,以便您能够检索数据。在花了很大的努力去理解被网站屏蔽的可能原因后,我想出了一个模仿人类行为的方法,最终它非常有效。
长话短说,然后我能够应用机器学习模型进行预测,在应用 EDA 创建多个功能后,结果似乎很好。如果我不能为我的机器学习模型获得准确和干净的数据,这将是不可能的。
工作中爬行的经验
毕业后,我在 Shopee 开始了我的第一份工作,担任商业智能职位。我负责每天搜集大约 12 万件商品,用于竞争对手的分析。这是我爬行技能真正大幅提高的地方。我的机器人又一次被验证码屏蔽了,这就是为什么我学习了一个新的 Python 爬行包,Scrapy。这绝对是一个伟大的爬行包。关于 Scrapy 和 Selenium 包的比较详情,请随时访问本网站:https://hackernoon.com/scrapy-or-selenium-c3efa9df2c06
是的,我设法解决了这个问题,但这次我认为我学到了更多的东西,列举如下:
- 维护过去数据的数据库,以便用于分析。
- 建立一个仪表板来监控几个爬虫的性能,这样当问题发生时我就能尽快修改代码。
- 关于如何绕过反抓取措施,或者创建更高效的爬虫的技巧,更多信息可以访问本网站:https://towards data science . com/https-towards data science-com-5-tips-to-create-a-more-reliable-we B- crawler-3 efb 6878 F8 db
- 检索敏感数据的技术,这可能需要您使用 POST 方法。
最终想法
我目前是一名数据科学家,我可以通知你的是,爬行仍然非常重要。我真的希望这篇文章能帮助和启发你解决一些在网页抓取中遇到困难的问题。
感谢你阅读这篇文章。欢迎在下面留下你感兴趣的话题的评论。我将在未来发布更多关于我的经历和项目的帖子。
关于作者
低伟鸿是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。
他提供爬行服务,能够为你提供你所需要的准确和干净的数据。你可以访问 这个网站 查看他的作品集,也可以联系他获取抓取服务。
我的性能分析之旅 2/2 (HAR 文件)
这篇文章主要是解释我最近进行的第二种类型的性能分析。它是这篇文章的后续。
这篇文章主要介绍了 HAR 文件的分析,以及您可以从中检索到什么类型的 KPI。
什么是 HAR 文件?
继 W3C github 帖子之后,HAR 代表 HTTP 存档格式。它是一种 JSON 格式的归档文件格式,用于记录 web 浏览器与站点的交互。这些文件的通用扩展名是**。har** 。
这看起来很有趣,但是它实际上涵盖了什么呢?它涵盖了相当多的指标和信息,这种格式仍在开发中。因此,它可以在未来发展,我的列表将不会是详尽的和/或涵盖信息已被否决从 HAR 文件。
全局对象:
- 创建者:关于创建此 HAR 文件的应用程序的信息
- 浏览器:包含有关创建日志的浏览器的信息
- 日志:这是最有趣的元素,因为它包含以下信息:
- 条目:条目是由页面触发的请求
- 页面:正在请求哪个页面
你现在可能会这样想:“这开始看起来像非常有趣的信息了!为什么你一开始就要费心使用你那愚蠢的性能爬虫呢?我浪费了 1000 万的生命去读那篇文章!”
好吧,这很公平 that 文件检索的问题是,它不像我们用 performance . getentries()JavaScript 控制台检索信息那样容易。
如何检索 HAR 文件分析
你可以阅读这篇来自 box.com 的关于 HAR 一代的好文章。
如果您想通过使用爬虫程序来生成相同类型的信息,您将需要使用中间人技术来生成这些文件。
这在 2015-2016 年不会是一件大事,但现在所有网站都在使用 HTTPS,你需要为你的浏览器生成一个证书,这样你的中间人就有权捕捉和解密这些信息。
正如您现在所能想象的,以自动化的方式实现这一点并不是那么简单。
虽然不是不可能,但是如果我设法实现(这是我的计划),仅仅使用我已经创建的模块将需要一些对其他用户不友好的配置。
让我们推迟这个模块的创建,在浏览器中使用传统的检索方式。;)
条目对象
我之前解释过,嵌套在日志对象中的条目数组是我们真正感兴趣的,以便实现性能审查。
条目对象中最有趣的信息如下(完整列表此处):
- startedDateTime :
请求开始的日期和时间戳(—YYYY-MM-DDThh:MM:ss . stzd) - time:请求的总运行时间,以毫秒为单位。这是计时对象中所有可用计时的总和(即不包括-1 值)
- 计时(对象)
- 阻塞:在队列中等待网络连接的时间。如果计时不适用于当前请求,请使用-1。
- dns : DNS 解析时间。解析主机名所需的时间。如果计时不适用于当前请求,请使用-1。
- 连接:创建 TCP 连接所需的时间。如果计时不适用于当前请求,请使用-1。
- send:向服务器发送 HTTP 请求所需的时间。
- 等待:等待服务器的响应。
- 接收:从服务器(或缓存)读取整个响应所需的时间。
- SSL:SSL/TLS 协商所需的时间。如果定义了该字段,则时间也包括在连接字段中(以确保向后兼容 HAR 1.1)。如果计时不适用于当前请求,请使用-1。
- 请求(对象)
- 方法 : 请求方法(GET,POST,…)。
- url:请求的绝对 URL(不包括片段)。
- cookie:cookie 对象列表。
- queryString:查询字符串列表
- postData:帖子中包含的数据信息
- header size:
从 HTTP 请求消息的开头到正文前的双 CRLF(包括双)的总字节数。如果信息不可用,则设置为-1。 - bodySize :
请求体(POST 数据有效负载)的大小,以字节为单位。如果信息不可用,则设置为-1。 - 响应(对象)
- 状态:200 / 404 / 302/ …
- cookie:cookie 对象列表
- header size:
从 HTTP 响应消息的开始直到(包括)正文前的双 CRLF 的总字节数。如果信息不可用,则设置为-1。 - bodySize :
接收到的响应正文的大小,以字节为单位。在响应来自高速缓存的情况下设置为零(304)。如果信息不可用,则设置为-1。 - cache (object):关于缓存的信息。我建议在检索元素时禁用缓存,因为您想知道页面上请求的所有元素。您可以稍后优化缓存。
你会告诉我有很多信息需要消化,你是对的,因为这只有一页。想象一下,您必须分析几十页或几百页的内容…
对于专业人员,有一些工具可以帮助您分析这些文件,并以简化的方式汇总这些数据。
在我们的案例中,有两个主要问题:
- 我们无法使用那些工具
- 我们不是专业人士:)
第二个评论是半个笑话,因为我们是专业人士,但我们不太了解那些 HAR 文件(我们不是每天都用,也不是每周都用),我的哲学是,当你想了解一些东西时,你需要尽可能多地了解原始信息。这样做将有助于您稍后理解该工具实际上为您做了什么。
(这个评论对任何你想掌握的学科都是有价值的——有时候你不需要掌握,那么快捷键就有用)
分析快捷方式(哈佩模块)
如前所述,这里有大量的数据,为了缩短这篇文章,我将走一点捷径。
在使用 jupyter 笔记本发现数据后,我为我的分析创建了一个新的模块。这个想法很简单,你在所有 HAR 文件所在的文件夹中运行这个模块,它会生成一个。csv 文件”,其中聚集了一些数据。主要是与性能相关的数据。
这个新模块可以在我的 github 账户上获得,它的名字是“ harpy ”。是的,就像神话中的生物,但也因为它是一个 HAR py thon 分析仪。现在明白了;)
在我的其他脚本文件夹:https://github.com/pitchmuc/other_scripts
我很可能会写一篇博文来解释这些方法。
HAR 数据分析
所以你已经在你的文件夹中运行了 harpy 模块,它已经创建了一个。csv”文件。
我们来看看里面是什么,如何解读数据。
import pandas as pd
df = pd.read_csv('summary_blog.csv',delimiter='\t')
df.head()
这应该会给你这样的东西:
查看该列,我们在这里有一个广泛的列表。我创建的 harpy 模块试图在这个数据帧中收集尽可能多的数据。
df.columns
OUT:
Index(['page', '2XX', '3XX', '4XX', '5XX', 'average_bodySize', 'average_headersSize', 'average_responseSize', 'average_totalSize', 'blocked', 'connect', 'cookies', 'dns', 'missing_blocked', 'missing_bodySize', 'missing_connect', 'missing_dns', 'missing_headersSize', 'missing_receive', 'missing_responseSize', 'missing_send', 'missing_ssl', 'missing_wait', 'nb_cookies', 'nb_entries', 'receive', 'send', 'ssl', 'total_bodySize', 'total_headersSize', 'total_responseSize', 'total_size', 'total_time', 'wait'],dtype='object')
如果你熟悉网络连接词汇,你应该不会迷失在这里。
这里我们可以从熊猫的概况数据开始。
df.describe()
当您在处理大型数据集时,如果您想浏览一下这里的情况,这种方法非常重要。
正如你所看到的,我们很快发现在我们发送的请求中没有 bodySize。大多数信息都是由报头发送的。平均响应大小是 3094 字节,但标准偏差是 2592。
这意味着每个请求的 responseSize 差异很大。
最小值和第三个四分位值(474 和 3705)证实了这一点。
数据会给你每个页面发送的请求的数量,你只需要查看“nb_entries”列
df[['page','nb_entries']]
添加更多列以直观地查看是否存在相关性。
您也可以直接询问您的两列的关联状态:
df[['nb_entries','total_time']].corr()
Positive correlation but nothing crazy
为了对数列的分布有所了解,你也可以使用箱线图。
df['receive'].plot(kind='box')
我们来看看箱线图上的这个极值点是什么。
df[df['receive'] == df['receive'].max()] ## This returns you the specific row for this.
我希望这篇文章向您展示了在分析页面性能时可以做些什么。
正如您可能已经注意到的,这些数据与我们在使用我在关于性能分析的第一篇博文中描述的爬虫时检索到的数据是不同的。因此,如果你需要更多数据来证实你的假设,这两种方法可以互补。
我的云计算之旅
为什么我是倡导者,你也应该是。
两周前,我在新加坡参加了 2019 年谷歌云峰会。谷歌每年都会在其主要市场举办类似的活动,宣布其新产品和路线图。这也是一个机会,让人们认识和了解行业的动向。
我特别喜欢领导人交流会议,在那里谷歌分享了它在该地区的见解。他们还主持了一场精彩的互动会议,而每个团队都扮演了一家正在进行数字化转型的全球银行机构的首席技术官。然后,我们面对不同的场景,在这些场景中,我们做出的每个决定都有相关的成本和收益。
Google Cloud Summit 2019 in Singapore
但是我为什么会在那里?
我的云计算之旅
如果几年前你问我什么是云计算,我可能会给你一个茫然的眼神。现在吗?我可以不停地谈论云计算有多棒,以及为什么你应该使用它(如果你还没有使用的话)。
我是越南一家电子商务公司的分析经理。由于本地计算机的海量数据和物理限制,在本地服务器上进行分析变得越来越困难。我们还缺乏用本地系统处理大数据的能力。另一方面,还有许多其他问题,例如开发工作、许可和访问控制等等。
很自然地,我开始寻找解决数据问题的方法。那时,我们可以选择使用开源软件或公共云提供商。我们选择了后者,因为我们希望专注于数据,而不是基础设施。
但是向一个组织介绍一个新的想法是困难的。你经常会面临来自众多利益相关者的阻力。在我的案例中,具体来说,我必须说服我的老板、我的团队和几个安全团队。你需要考虑的事情数不胜数,比如安全性、人才培养和变革管理。换句话说,你试图改变人们日常工作的方式。
你必须走出自己的路,你必须说服人们,你必须成为…一个倡导者。
我成为了组织中的云倡导者。我开始寻找业内人士,学习新东西,召开会议介绍新概念。我推动了一项在公共云上建立数据湖的计划。我们与谷歌云合作来做这件事,它为我打开了许多大门。通过这个项目,我认识了一些非常有才华的人,学到了新的做事方法,也学到了新的概念和技术技能。除了我的项目,我还帮助我们的其他团队也走上了云之路。
我的经验教训
回顾这段经历,我意识到两件事:
- **成为云倡导者开拓新机遇:**如果我不是云倡导者,我今天就不会站在这里。
- **掌控自己的工作:**如果我认为云计算不是我的责任,而是基础架构团队的责任,我也不会来这里。
那么,成为某个事物的倡导者意味着什么呢?
我们退一步来回答这个问题。快速的谷歌搜索给出了倡导者的如下定义:
公开支持或推荐一项特殊事业或政策的人。
成为某事物的倡导者意味着你竭尽全力去推动一个想法、一项事业或一项政策。从你最喜欢的电子游戏到社会经济改革,你可以成为任何事情的倡导者。
Image source: 16 Personalities illustration of an advocate, I’m an INFJ-A by the way.
你很可能已经是一个拥护者了。还记得上一次你向朋友推荐你最喜欢的书或者你刚刚发现的一个很棒的应用吗?你是倡导者!
成为倡导者的好处
这些都不能保证,但如果你是一个倡导者,这里有一些潜在的好处,你可以收获。
- 帮助建立你的个人品牌:如果你倡导某事,人们会因此认可你。如果我一直谈论和使用苹果产品,当你有问题时,你可能会寻求我的帮助。这有助于建立你在这个问题上的个人品牌和可信度。此外,当你帮助别人时,他们往往会回报你。
- **助人为乐:**当我们为陌生人开门或给需要帮助的人一美元时,我们感觉很好。当你向某人主张某事时,你相信你所推动的事情会使另一方受益。简而言之,你在帮助他们,你会感觉很好。
- 拓展你的人际网络:很有可能有像你一样的人也支持同样的事情。你有机会向他们学习,帮助他们,扩大你的人际网络。我们是群居动物,建立关系网从来都不是一件坏事。
- 获得新的机会:你将获得新的机会,比如工作中的晋升,甚至是新的工作机会。你的老板可能会意识到你所追求的东西的好处,给你学习的机会或者派你去参加会议。
如何做一个倡导者?
那么,你怎么能成为某件事的倡导者呢,尤其是在工作中?以下是一些我认为会有帮助的步骤:
- **选择:**第一步,选择推什么。不要追求只对自己有利而对别人无益的东西。一定要推动对每个人都有利的事情。选择自己感兴趣的,或者自己擅长的。
- **相信:**第二步,相信它。如果你不相信你正在推动的事情,人们会很快发现。当你在追求中遇到困难时,信念也能帮助你坚持下去。
- 学习:你试图说服人们为了你和他们自己的利益去做一些新的事情。花时间去了解它,彻底了解这门手艺,这样你才能令人信服。
- **推动:**这是最关键的一步,实际上是推动你的主动权。在你的追求中要深思熟虑,始终如一,坚持不懈。向人们展示这对他们有什么好处,并尽力去做。
- **坚持不懈:**有时候,事情并没有按照计划进行。你的时机可能不对,你似乎无法说服别人,或者你只是运气不好。当面临挑战时,重温第二步。如果你仍然相信你所追求的,那就继续前进。
让我们成为组织中的倡导者
Me and my good friend Joe at Google office in Singapore
在这篇文章中,我简单地分享了我的故事和我学到的经验。我了解到作为一名云倡导者为我打开了无数的机会,我应该对我所做的事情负责。
我还讨论了什么是倡导者和四个潜在的好处:帮助你建立你的个人品牌,通过帮助别人给你带来快乐,扩大你的网络,给你新的机会。
我敦促你在你的组织中成为一名倡导者,并通过选择、相信、推动、和坚持不懈来获得利益!
我从零开始进入数据科学的学习计划
我在大学的时候就开始了,并且一直持续到今天!
早在 2015 年初,当我还在上大学时,我就决定进入数据科学领域。实际上,我最初并没有打算成为一名数据科学家,而是一名quant——本质上是一名金融分析师,在他们的职能中使用高级数学和编码(例如风险管理和算法交易);然而,9 个月的 quant 实习让我意识到,我想将这些技能应用到更广泛的背景中。读了几篇博文后,我得出结论,数据科学是适合我的领域。
来自应用经济学的背景,我觉得我的计量经济学繁重的课程已经给了我一个不错的数学基础;然而,我仍然没有机器学习中使用的模型的背景(例如,神经网络、随机森林)。此外,我在大学的剩余时间里浏览了所有课程,没有发现任何教我们如何编写自己的算法的内容。
差距显然在于我缺乏编码和机器学习模型方面的知识。
在这篇博文的其余部分,我将浏览我用来填补这一空白并实现我成为一名数据科学家的梦想的在线资源的简短列表。
我们开始吧!
概念学习
Courses and books will give the foundation of your data science skills
下面是我推荐你学习的书籍和课程,以了解数据科学是如何工作的。请注意,下面的学习资源是按照我推荐的顺序显示的(基于我的经验和其他人的反馈)。星号(*)表示我本人没有参加过该课程,但其他数据科学家强烈建议在现阶段参加该课程。
- Python for Everybody Specialization—这一系列课程对于想要入门的绝对初学者来说非常棒。为了让你克服学习如何编码的恐惧,最好的方法。
- 吴恩达《机器学习》——这门课给了我理解不同机器学习模型的核心基础。吴恩达激励我从事机器学习的职业。****
- 艰难地学习 Python 3—这本书将为你的 Python 技能(以及一般的编码技能)打下坚实的基础。我怎么强调这本书在通过实践课和精心设计的练习来教授基本概念方面有多棒都不为过。
- 应用数据科学与 Python 专业化 ***** —这一系列课程是将你对机器学习模型的理解与你的编码技能粘合起来的好方法。我个人认识一些人,他们能够在完成这一专业后立即在数据科学领域找到工作,因为到那时,他们已经拥有了一套体面的数据科学技能工具包,可以用来解决现实世界的问题。
- 程序员机器学习入门(fast.ai) —本课程由杰瑞米·霍华德教授,他给出了一个非常实用的关于如何正确使用代码进行机器学习的演练。准备好从头开始学习如何编写随机森林算法吧!
- 程序员实用深度学习(fast . ai)——这两部分课程是最好的资源,既适合 1)试图进入深度学习的有抱负的数据科学家,也适合 2)试图更深入地了解如何在深度学习中获得最先进的结果的更有经验的数据科学家。在第一课中,杰瑞米·霍华德将向您展示如何使用 fastai 库在 ImageNet 数据集中获得最先进的精度。在后面的章节中,您将越来越习惯于直接在 PyTorch 上实现模型。强烈推荐!
实践学习
Real world projects will teach you how to turn your skills into actual value for people
有些人会说,真正的学习只有在你从事具体项目并利用你的数据科学技能解决现实世界的问题时才会发生。以下是推荐的通过应用你的知识获得经验的方法(即边做边学)。
- code signal——当我刚接触编码时,我很难理解如何用我的基本技能来解决现实世界的问题。谢天谢地,CodeSignal(以前叫 CodeFights)有有趣的编码挑战,让我可以与机器人和真人竞争。这让我对用代码解决问题的过程感到很舒服。该网站最初是一个竞争性编码平台,但现在专注于在与科技公司的面试中为开发人员准备编码考试。****
- ka ggle——这是一个数据科学家聚集在一起的平台,1)共享数据和代码,2)竞争训练最能达到目标的 ML 算法(例如,最准确地预测房价)。即使你没有明确地参与竞争,我认为 Kaggle 最大的附加值是从竞争中获得“代码解决方案”。阅读其他更有经验的数据科学家的代码是变得更好的最快方法之一,因为它教你最佳实践,同时让你自己从头开始舒适地阅读和编写 ML 代码。
- 激情项目 —即使你没有数据科学的工作,但想进入这个领域,想一个很酷的项目来执行!确定一个你想解决的问题,甚至是你想做的有趣的事情,然后为此创建一个机器学习模型。如果你决定将它部署为一个可在互联网上访问的应用程序,那就更好了!(例如,我最近开发了一个投资分析工具,让智能交易变得更加容易!).
- 实习/全职 —这个应该很明显。边做边学的最好方法是给自己找一份数据科学方面的工作。冷启动问题是当公司希望你拥有数据科学技能,但你没有工作经验,如何获得这些技能?上面列举的所有步骤应该使您具备必要的技能,能够立即对数据科学团队有用。所以开始工作吧!
结论
这就是我如何获得我今天所拥有的技能,我还有很多要学!这是一个漫长而艰难的旅程,但每一项努力都是值得的。每天,我都很荣幸能从事一个既有趣又有影响力的职业。我在这个职业中感到如此快乐,所以我花时间创建了这个指南,以便更多的人可以进入这个领域。
最后,我给你留下以下信息:
你能否成功进入数据科学领域的最大决定因素是你是否愿意 1)吸取教训,2)在挑战中坚持不懈,以及 3)抓住现有的机会。
感谢您阅读本文,如果您对如何进入数据科学领域有任何进一步的问题,请在下面的中发表评论。也可以通过邮件( lorenzo.ampil@gmail.com)、 twitter 、 linkedin 联系我;然而,期待我更快地回复评论:)
我的机器学习之旅和第一次 Kaggle 比赛
我如何开始数据科学和第一次经历。
Image taken from Pexel Gavin Tracy
旅程的开始
答在担任电子工程师后,我对数据科学领域产生了兴趣。我已经开始搜索关于这个领域的 Moocs。以下是我发现对我的旅程有帮助的列表,
- 机器学习简介【https://www.udacity.com/course/intro-to-machine-learning ud 120
- 机器学习 A-Zhttps://www.udemy.com/machinelearning/
- 机器学习https://www.coursera.org/learn/machine-learning
所有这些课程都解释了核心的机器学习算法。另外,在 Coursera 的机器学习课程中,Andrew NG 解释了这些算法的数学背景。如果你想了解什么是机器学习以及如何使用它,我强烈建议你参加这三门课程。
由于我已经学习了机器学习的基础知识,我已经开始寻找平台来测试我的知识。这是我第一次见到卡格尔。(https://www.kaggle.com)
Kaggle 中有大量的数据集可以测试你的知识。您可以下载数据,也可以使用 Kaggle 内核来编写和测试您的代码。Kaggle 平台最棒的地方在于,它是完全免费的!
我已经开始做一些 EDA,画一些图,运行一些基本的机器学习算法(线性回归,逻辑回归,随机森林等。).但所有这些工作都成了例行公事,我需要一种动力来继续我的旅程。那是我决定参加比赛的时候。
让游戏开始吧…
我花在 Kaggle 上的所有时间都是在看比赛,但从来不敢申请。
我对比赛有偏见,如果你想参加比赛,你至少应该是 10 分中的 8 分。这是一个荒谬的想法。
我第一次申请参加比赛是偶然的。当我阅读比赛规则时,我只需点击“我同意”按钮,然后嘭,我就参加了比赛。
卡苟时间
我参加的竞赛是微软恶意软件预测(https://www.kaggle.com/c/microsoft-malware-prediction/),是关于预测微软机器被恶意软件感染的概率。
数据部分有训练和测试数据。每个都有将近 5 Gb 的大小。数据列包括机器 id 和关于该机器的许多特性。当然,在训练数据中,最后一列包括机器是否被感染。
在第一次恐慌之后,我开始思考如何解决这个问题。
Kaggle 上的所有比赛都有一个讨论页面,人们谈论解决问题的替代方法。还有一个内核页面,人们可以分享他们的代码来激励其他人。
我已经阅读了每一个讨论主题。这非常有帮助。由于我是这个领域的新手,阅读有经验的人的方法帮助我找到了从哪里开始。
我给所有新手的建议是首先阅读人们的经验,不要犯同样的错误。
然后我开始用 Kaggles 内核编码。这是我第一次面对现实生活中的问题。内核计算机的能力不足以读取列车数据。这个问题已经在讨论页讨论过了,并提供了一些解决方案。但是在加载数据后,由于机器学习算法的原因,我会遇到同样的计算能力问题。所以我决定下载数据,在我的个人电脑上工作。
我加载数据;从讨论页选择最著名的机器学习算法,按运行。我还有第二个现实生活中的问题。我电脑的能量也不足以运行这个算法。由于特征(列)的数量以及观察值(行)的数量是巨大的,因此肯定需要特征工程。此外,在 Kaggle 的数据集中,有许多要素缺少值并不常见。但这是现实生活,在现实生活中总会有缺失的价值观。
我把数据页看得更详细了。尝试减少特征的数量,同时将分类数据和非分类数据分开。并对每个数据集分别进行特征工程。
随着我减少特征的数量,我将数据与机器学习算法相匹配。检查混淆矩阵。 **Tadaa!!**我有%54(比抛硬币还好是!)测试集的 Roc Auc 分数。是时候在测试集上运行模型以创建提交文件了。
我试着用我第三次真实生活经历的测试数据来运行这个模型。在此之前,我总是使用一个数据集,并将其拆分为模型的训练和测试数据。但是在现实生活中,如果你做一些特征工程(删除特征,创建新特征,改变数据类型等),你需要分别训练和测试数据。)你应该对测试数据做同样的事情。我艰难地学会了这一点。我试图在测试集上运行我的训练模型,在等待 2 小时后出现错误。然后弄清楚我上面说的情况。我忘了对测试数据进行一些特征工程。
这是我第一次解决现实生活中的问题,对我来说非常重要。然后,我尝试改进我的解决方案,并开始玩功能。现在我已经把分数提高到 60 分了,还有些事情要做。
结论
总之,如果你想在数据科学领域工作,永远不要悲观,永远不要气馁。永远保持动力,渴望新信息,阅读高质量的内容。
希望能在我的其他机器学习经历中看到你。此外,如果你对我的旅程有任何建议,请写下对这个故事的回应。
项目的 Github 链接:【https://github.com/】T2volkansahn/微软-恶意软件-预测
如果你想支持我的工作,这是我的联系方式:https://www.patreon.com/volkansahin
我的开源机器学习之旅开始了
我的新博客,人类学习机器学习,于 1 月 1 日发布
在技术和其他许多领域,过去的研究和发展与现在的实际情况之间有着重要的联系。探索这种联系对学习过程至关重要。历史是一位伟大的老师,尤其是因为,因为事情不会发生在真空中,所以将现在与过去联系起来考虑通常是明智的。
还有第二个同样重要的联系,在今天的现实和明天的可能之间有一个指导性的问号,它可以帮助加速学习过程。为了理解和指导你今天做的事情,你也应该问问你明天可能会做什么。
沿着这条学习之路走下去的好处是,你能够将过去的知识与现在的背景以及未来的潜力联系起来。这是我们在个人生活中都会做的一项练习,相当于“我去过哪里,我是如何来到这里的,我有能力完成什么?”在技术领域,如果你试图以尽可能少保留盲点的方式解决问题,这一过程尤为重要:如果你希望将技术应用于持久的解决方案,你需要知识、背景、好奇心和视角。
这让我想到了为什么我决定推出一个机器学习博客。现在,分布式系统和分散式区块链正在市场上认真探索,我想更好地了解的技术领域之一是机器学习。原因是我们应该开始问,在未来,人工智能软件可能如何访问和分析在区块链永恒存储的数据,以产生新的见解和解决方案,解决我们今天或明天可能出现的商业、社会和其他问题。
作为我努力学习数据和分析之间的交集的一部分,我最近开始了一个关于我一无所知的领域的学习之旅:机器学习。我花了一年的时间在区块链领域学习和工作,并花了几个月的时间自己定期学习密码学,我已经对开源学习之旅的力量产生了欣赏:分享你正在学习的东西、思考的问题和提出的问题。这样做,你不仅学得更快,而且还能和其他人分享加速学习过程的成果。
下面,我交叉发布了我的前三篇每日博客文章,分别来自 一台人类学习机器学习 。感谢您加入我的学习之旅。
- 2019 年 1 月 1 日: 我的开源机器学习之旅开始
- 2019 年 1 月 2 日: 机器学习新人资源
- 2019 年 1 月 3 日: 机器在学习处理文本之前,是否应该先学习处理语音?
2019 年 1 月 1 日:我的开源机器学习之旅开始了
(交叉贴自 我的开源机器学习之旅开始 )
今天早些时候,在 LinkedIn 上,我写了以下内容:
2018 年是学习的一年……2019 年将是双重运用的一年,学习和应用:学习更多关于分布式系统和去中心化区块链的知识,学习机器学习,尝试应用程序,将我的心应用到更明确的目标上,学习将越来越强的好奇心应用到我的任务上,并允许我自己充分探索我的直觉。
一年多以前,我开始学习区块链、分布式总账和密码学。一旦您了解了使这些功能协同工作的基础知识,就很容易对信息的未来感到兴奋。在一个越来越依赖于存储、访问、分发和分析来自集中式、分布式和分散式存储的数据的世界里,重要的后续问题变成了“人类将如何使用数据来制造有助于推进我们社会目标的机器?”
这种想法促使我在两周前考虑未来几年我还应该学习什么,包括机器学习本身。我相信技术可以而且应该被用来做好事,我们应该用我们最好的想法为我们最好的理想服务,我忍不住试图理解现代技术表面领域的如此重要的一块,即机器学习、神经网络、人工智能和我们选择的明天的交集。
正如我在今天的 LinkedIn 帖子中所写的:
在这样一个问题重重的时代,我们不能不怀着极大的喜悦和坚定的信念,致力于减少阻碍人类进步的神秘事物。
在这个博客中,我的目标是“开源我在机器学习方面的学习之旅”,以便我现在的同龄人和未来的人们可以看到人类学习一项有朝一日将为人类体验的许多基础提供动力的技术是什么样的。由于我最近开始阅读机器学习,提出问题,思考未知,这个空间将作为日记,博客和游乐场的一部分,在未来建立和分享我的神经网络。人类学习过程的奇妙之处在于,它一部分是神经科学,一部分是魔法,是我们的生物神经元与联系、想法、死胡同、错误、突破、敬畏、好奇、好奇、记忆、问题以及生活和想象的双重选择压力斗争和角力的结果。有一天,在非常遥远的未来,在我死后很久,人类可能会创造出能够欣赏前面那句话中包含的所有快乐的学习机器。在那之前,我和我们对人类思维、计算机、数据以及如何利用这些数据来训练计算机代表我们做出更好的预测还有很多要学的。
在这个大脑的机器学习之旅中,我会发现什么?
2019 年 1 月 2 日:机器学习新手的资源
(跨贴自 机器学习新人资源 )
学习如何学习新东西总是很棘手的。这有点像在你知道你将获得什么样的知识,书架应该有多长或多高,或者你需要哪些工具来搭建书架之前,弄清楚如何搭建一个书架来放置新知识。
我想有时候最好的开始方式就是,嗯,开始。你可以边做边做,如果需要的话,你可以向别人借工具,或者在需要的时候帮忙做架子。你也要确定什么与你的目标无关,或者远远超出你目前的知识范围,现在没有用。这就是非结构化试错游戏——人类版的强化学习。但首先,你必须开始。
划分起点的一种方法是按分段,即按资源的来源或类型:
- 要读的书
- 要追随的人
- 要学的课程
诸如此类。
学习部分
以下是我目前为止遇到的或者有人向我建议的一些机器学习资源。这份清单没有优先次序,也不详尽。这是一个及时的快照,所以我不期望在未来添加到这个列表中。
书籍
- Gareth James、Daniela Witten、Trevor Hastie 和 Robert Tibshirani 编写的《统计学习介绍及其在 R 中的应用》
- 《统计学习的要素:数据挖掘、推理和预测》 作者:特雷弗·哈斯蒂、罗伯特·蒂布拉尼和杰罗姆·弗里德曼
- 模糊集和模糊逻辑:理论与应用 乔治·j·克里尔和袁波著
- Max Tegmart 的《生活 3.0:成为人工智能时代的人类》
- 机器学习:新的人工智能 作者 Ethem Alpaydin
- 大师算法:对终极学习机的探索将如何重塑我们的世界 作者佩德罗·多明戈斯
- Nexus(Nexus 三部曲第一册) 作者 Ramez Naam(这是榜单上唯一的一本小说)
- 非线性动力学和混沌:应用于物理学、生物学、化学和工程学
- 杰夫·霍金斯和桑德拉·布莱克斯利的《论智力:对大脑的新理解将如何创造出真正智能的机器》
- 我们的数学宇宙:我对现实终极本质的探索
课程
- 通过 Coursera 的谷歌云培训,用 GCP 对你的数据应用机器学习
- “15 小时专家视频深入介绍机器学习”凯文·马卡姆(2014)在 R-bloggers 或data school . io的演讲(强烈推荐该补充资源,其中包括上面R中应用的统计学习介绍作者的课程幻灯片和视频)
- 神经网络和深度学习 作者:吴恩达、基恩·卡坦弗什和尤尼斯·本苏达·莫里 Coursera
- 用于机器学习的神经网络——Geoffrey hint on 2016,科林·麦克唐纳在 Youtube 上的 78 段视频播放列表(Coursera 课程本身似乎不再提供)
长阅读
- “马尔可夫链蒙特卡罗方法、拒绝抽样和 Metropolis-Hastings 算法”Brian Keng(2015)在有限理性
- “马尔可夫链蒙特卡罗模型,Gibbs 抽样,&高维复杂随机问题的 Metropolis 算法”Yogesh Malhotra(2015)在SSRN
- 《马文·明斯基的未来愿景》/杰里米·伯恩斯坦(1981)的《人工智能》,《纽约客》
- 《neural ink 与大脑的神奇未来》蒂姆·厄本(2017)在等一等但是为什么
- “受神经科学启发的人工智能”作者:戴密斯·哈萨比斯、达尔山·库马兰、克里斯托弗·萨默菲尔德和马修·伯特温尼克(2017)在神经元
- 《国际象棋机器的一大步》史蒂文·斯特罗加兹(2018)在纽约时报上发表
- “人工智能进展报告”马文·明斯基和西蒙·派珀特(1971)在麻省理工学院
人
- 彼得·阿比尔 —伯克利强化学习研究员
- Francois Chollet——Keras 神经网络库的发明者
- 莱克斯·弗里德曼——麻省理工学院研究科学家和人工智能播客主持人
- 戴密斯·哈萨比斯——人工通用智能研究公司 DeepMind 的联合创始人
- 安德烈·卡帕西——特斯拉的人工智能总监,专注于自动驾驶感知
- 费-李非——斯坦福大学教授、计算机视觉专家
- 吴恩达 —教授,Coursera 联合创始人,&深度学习专家
- 卡罗尔·雷利——机器人专家,自动驾驶公司 drive.ai 的联合创始人
- 机器人专家,麻省理工学院著名的 CSAIL 实验室主任
杂谈
- 你希望解决的问题类别如何影响你对学习模型、机器学习算法和神经网络的选择
- 某些神经网络计算(如矩阵乘法)的计算费用如何限制您对软件和硬件的选择(即机器学习的 GPU 友好性与 CPU 友好性)
- 您选择学习的编程语言(例如 C++与 Python 或 JavaScript 或 R)对您以后使用的工具和库的影响
- 使用哪些数据集来训练您的学习模型
- 哪些神经网络最适合对某些类型的输入进行预测,例如视频对静态图像对语音对文本
- 与分布式系统和分散式区块链一样,你想要解决的问题和要采用的解决方案组合之间的匹配
花絮
- 莱克斯·弗里德曼的播客 人工智能播客 ,以采访上述彼得·阿比勒和马克斯·泰格马特以及许多其他人工智能和人工智能领域的人为特色
- 生成对抗网络(GANs) 的主题显然是一个热门的研究领域
- 3Blue1Brown 的视频“但是什么是神经网络呢?”是我见过的关于感知机和神经网络结构目的的最好的视频
- “深度学习汽车”是 Samuel Artz 的一个视频,它模拟了 2D 赛道上的汽车。在视频的描述中有一个模拟源代码的链接
- 多伦多计算机硬件公司 Xanadu 正在研究高级人工智能和“光子量子计算”芯片,以实现机器学习的量子应用
- 对于各种神经网络架构的一些优秀的视觉效果和解释,请参见 AI 研究公司阿西莫夫研究所的文章“神经网络动物园前传:细胞和层”和“神经网络动物园”。你也可以阅读安德鲁·奇尔科夫的“神经网络的最完整图表,在向数据科学解释
- 一些神经网络可以在手机应用程序中运行,并捆绑在一个具有特殊扩展名的文件中(例如,)。mlmodel 用于在 iPhone 或上运行 mlmodel 的应用。tflite 针对 Android 设备上运行 TensorFlow Lite 的应用)。因此,举例来说,iPhone 开发人员可以通过使用苹果的核心 ML 框架、核心 ML API 和 MLModel 类将机器学习模型集成到他们的应用中。关键的一点是,一些神经网络在 iPhone 这样的东西上利用 CPU 的有限资源工作,这很神奇,也许是未来在更低功率的物联网设备上运行的神经网络的垫脚石。
- 亚马逊 AWS 机器学习目前支持三种类型的机器学习模型,分别是二元分类、多类分类和回归,每一种都非常适合做不同类型的预测
- 博弈论;复杂性理论;多种统计,以及主要统计理论(如贝叶斯)和相关技术(如回归);线性代数和其他学科似乎是人工智能工作的重要层面。这非常有趣,机器学习技术似乎与分散系统(区块链)有共同之处:为了工作,它们必须借鉴经济学、统计学、计算机科学和数学的原理
- 一些大学不仅提供免费的在线课程,还在机器学习的各个子领域提供付费的证书课程,如麻省理工学院在线的专业教育和斯坦福大学在线的研究生教育
- 关于 Stata 软件中先验分布、似然函数、&、后验概率的简短技术介绍,请参见 Chuck Huber 的视频“贝叶斯统计简介,第 1 部分:基本概念”
- Megan Beck 和 Barry Libert 撰写的麻省理工学院斯隆管理评论文章“机器学习竞赛实际上是一场数据竞赛”提出了关于独特数据对训练商业应用中使用的机器学习模型的重要性的好问题
工具
工具补充说明
- 合作实验室“一个免费的 Jupyter 笔记本环境,不需要任何设置,完全在云中运行”,有很多东西值得喜爱,但特别是附带了杰克·范德普拉斯的书的交互式笔记本版本, Python 数据科学手册:处理数据的基本工具 ,以及谷歌的自定进度网站 机器学习速成班
- 谷歌云平台在其谷歌云培训平台中有优秀的自定进度材料,其中包括 Qwiklabs 的实验室和三个数据和机器学习学习课程:一个面向数据分析师,一个面向数据工程,一个面向数据科学家
- 关于 PyTorch vs TensorFlow 的一个看法,见“tensor flow 和 PyTorch:哪一个的原力强?“作者雅士瓦丹·贾恩
2019 年 1 月 3 日:机器是否应该先学习处理语音,再学习处理文本?
(跨贴自 机器是否应该先学会处理语音再学会处理文本? )
今天我在 LinkedIn 的一个评论里问了一个问题。本质上,我的问题是,在我们教机器学习模型处理文本之前,先教它们处理语音是否有优势。让我告诉你我的推理。
处理自然语言的工具
亚马逊的 Matt Wood 博士最近写了一篇博客文章,宣布 AWS 机器学习可以被开发人员用来在他们的应用程序中建立自然语言处理模型。这依赖于一项名为 Amazon understand 的服务,顾名思义,它可以分析文本并执行阅读理解相关的任务。该服务通过深度学习模型进行训练,能够检测某些单词,对文本语言进行情感分析,甚至按照某些主题对文本进行分类。Wood 博士的声明是关于 understand 的一项新功能:1)根据特定组织的词典进一步定制服务搜索的能力,以及 2)将文档分类到自定义分类(即类别)的能力。显然,这种类型的搜索和分析并不容易做到,这就是为什么使用像 understand 这样的机器学习服务是有用的。这都属于被称为自然语言处理的应用机器学习范畴。
Wood 的博文让我想起了在 Alpaydin 的文字里看到过的一些东西,机器学习 : 单词袋。单词包是一种技术,用于判断文本是否出现在给定的文档中,然后根据其内容将该文档分类。例如,这是用于垃圾邮件过滤的技术之一。
在 Wood 帖子的前一天,AWS 人工智能的 Nino Bice 写了一篇名为“开始使用亚马逊理解定制实体”的帖子。在其中,Bice 描述了 Entities 数据类型现在如何支持特定于组织的“私有的、定制的实体类型”,这些实体类型映射到对该组织重要的单个单词。可以认为这是让机器学习模型更加适应使用由 intensive 的 API 支持的应用程序的公司(或医疗保健等行业)内部使用的语言。该组织的自定义文本数据训练理解的自然语言处理模型,以便在学习模型已经用客户的数据集训练之后,当客户的模型将来暴露于那些文档或文本时,更好地预测如何对文档或文本进行分类。据推测,单词袋技术是在这个过程中的某个地方使用的。
论视觉和听觉的原始性
在这一点上,指出 Alpaydin 书中的一页(第 103 页,图 4.2)是很有帮助的,它描述了一种叫做层次处理的东西是如何工作的。基本上,如果你将一幅文本图像输入计算机,并希望计算机能够识别图像中包含的单词,它会通过使用训练有素的模型来执行分层处理,首先是检测字母的视觉原语,“如弧线和线段”。Alpaydin 的图 4.2 显示了两条曲线如何形成一个 o ,一条垂直线如何形成一个 l ,等等。在分层处理中,机器将处理构成这些图元的像素,然后将这些图元组合成单个字母进行处理,然后确定给定的单词是否有它已经学会识别的字母组合,最后,识别“更抽象的关系,如“book”和[法语中的对等词]“livre”之间的关系”。令人着迷。
我记得当我还是一个小男孩的时候,我就开始学习如何在大的手稿纸上写字母。那些学校例行程序的目标必须是教我们学习、识别和书写字母表中所有字母的所有视觉原语,这可能会提高我们随后学习、识别和阅读字母表中所有字母的能力(我不记得我们是先学习阅读还是先学习书写)。
然而,我们大多数人在学习读或写之前,会先学习做别的事情:我们学习说话。像信件一样,语音也有自己的基本形式,除了它们是口头的(传输时)和听觉的(接收时)而不是视觉的:
Alpaydin(第 67 页):“就像我们认为每个字符图像都是由不同方向的笔画等基本基元组成一样,一个单词被认为是一系列音素,这些音素是基本的语音。在语音的情况下,输入是时间的;单词按时间顺序由这些音素组成,有些单词比其他单词长
作为人类,我们在掌握字母的视觉原语以及它们如何组合起来形成书面单词之前,就开始掌握语音的音素。这就引出了我的问题。
我们的学习机器是否应该先学会听,再去读(或说)?
由于人类在学习读或写之前就学会了听和说,我想知道在训练文本数据上的自然语言处理模型之前,训练语音数据上的语音学习模型是否会有一些计算或其他优势,特别是对于说和写相同的单词,以便提高效率或准确性。我只是还不太了解这两者是如何工作的,所以无法给出答案。
此外,是否存在与用于文档文本分类的单词袋技术等效的语音识别?这种“口语词汇袋”技术可以与书面文本技术结合使用来提高模型的预测吗?
根据我提出的问题:
…是否有一种方法可以获取通常用于训练文本分类模型的书面单词列表,大声说出单词并记录下来,将语音数据通过语音识别算法来训练语音识别 NLP 模型,然后使用结果来训练 Amazon understand 进行文本分类?我问的原因是,在人类学习中,当我们学习阅读单词时,我们可能会将字母的视觉原语与这些字母的口语版本的语音原语联系起来,我认为这加快了阅读和处理单词的能力,因为我们可以说出它们的口语对应物。因此,我想知道在机器学习中,我们是否还在以类似的方式处理事情,在训练过程中将文本的 NLP 与语音的 NLP 结合起来。
有很多值得探索的地方。
进一步学习
[1] 机器学习 作者 Ethem Alpaydin (2016)
[2] 《深度学习》——维基百科
【4】【情绪分析】——维基百科
【5】【自然语言处理】——维基百科
[6] “词袋模型”“朴素贝叶斯垃圾邮件过滤”——维基百科
【7】亚马逊领悟医疗——AWS
【8】【音素】——维基百科
直到下次
这就是我的新机器学习博客上的博客# 1-3,一个人类学习机器学习。如果你喜欢你读过的内容,那么在 LinkedIn 上添加我,将我的博客加入书签或者添加到你最喜欢的 RSS / Atom 阅读器,并与他人分享这篇中型文章(或原始链接)。
如果你喜欢我的作品,并想把我列为投稿人,向你的媒体刊物投稿,请告诉我。
最后,如果你是一家初创公司或科技公司,需要一名自由撰稿人来完成你的区块链、机器学习或其他项目,请在 LinkedIn 上给我发消息,在 alexoblockchain@gmail.com 发邮件,或者在这里留言。我目前正在接受客户。
感谢阅读。
我的熊猫小抄
给我的数据科学家同事的提前圣诞礼物🎄🎁
My wishes for you.
被困在付费墙后面?点击此处阅读我和朋友的‘礼物’链接。
上周我在训练一个神经网络,首先我需要在一个内部连接中合并两个数据帧。经过几次测试。合并(),。concat(),。join() 很快我意识到我需要回到我的备忘单,而不是在我自己思考之前:我在训练神经网络,但我不记得如何正确合并我的数据框架,这怎么可能呢?
是啊,我记性很差。令人高兴的是,1。我知道这是可能的,因为我以前做过,2。我手边有我的熊猫小抄。
今天,作为提前的圣诞礼物,我整理了它,我将与你分享我的笔记本-宝石。它包含了我从开始学习 pandas 开始就收集的样本代码和函数,为我节省了很多关于堆栈溢出的时间。
我们开始之前的一个建议:
您可以为该页面添加书签,或者克隆存储库以方便使用,但是 不要复制粘贴代码。 键入所有你曾经记得的执行任务的正确方式。 输入代码中有一个值。它练习编码肌肉记忆 到最终,代码没有小抄。
If you can’t visualize the notebook complete click here: https://gist.github.com/brendahali/2b8f6f218492a94cb74eea5043d64867
或者从这里的存储库中派生并克隆最新的文档:https://github.com/brendahali/python_cheat_sheets
我应该在我们的备忘单中包含什么命令吗?分享给我我再补充。
继续分享知识,我的朋友和…圣诞快乐!
我的便携式 Ubuntu 18 深度学习设置
简介
从我去年的早期文章开始,重点是在家里拥有一个 DIY 服务器,这是更新的指南,将更加关注使用游戏笔记本电脑的便携式深度学习。
动机
我希望有一个便携式深度学习硬件,在加载到云或 DIY 服务器之前,我可以随身携带进行实验。
笔记本电脑规格
我的笔记本电脑是宏碁 Predator Helios 300
安装和设置
Ubuntu 18.x 安装 -从官方网站获取最新的 Ubuntu 18.04.1,我得到的是最新的 LTS 版本,而不是 18.10
-到目前为止,在宏碁 Predator Helios 300 上安装没有问题,一切正常,但记得在 BIOS 中禁用安全引导。迄今为止 UEFI 工作正常。
-最后从软件&更新的附加驱动程序下安装 NVIDIA 二进制驱动程序。
MicroK8s (Kubernetes)安装
——只需遵循 microk8s
的官方安装指南——我们可以通过以下命令打开 gpu 和注册表
microk8s.enable gpu dns dashboard registry
gpu 将与笔记本电脑 Nvidia 一起开箱即用,注册表是将在本地运行的 docker 注册表
-请注意,我们只为 kubectl 创建别名,而不是 docker one,因为 docker kubernetes 不能很好地工作,需要在 kubernetes 部署环境中运行
-最后,请参考kubernetes wiki来创建一些样本用户,因为我们需要用户令牌来稍后登录仪表板
Docker 安装
比使用 kubernetes docker
更容易官方使用 Docker-从官方指南
安装 Docker-从官方指南
安装 nvidia-docker2 从官方指南
一旦安装了 microk8s 和 docker,我们就可以重启笔记本电脑并使用 Nvidia prime (NVIDIA X 服务器设置)禁用 GPU
它将重新启动,这将为我们提供一个半 nvidia 加载驱动程序环境,我们可以充分利用 GPU 内存,而 X Windows 不会使用它。如果我们选择 Nvidia SMI 作为属性提供商,我们可以使用一些有趣的工具,如
NVIDIA GPU 统计工具
Noticed close to 0% memory
nvidia-smi 命令也可以工作
nvidia-smi command still work even we disable the driver
Tensorflow + Jupyter(Docker-local) 借助 Docker,我们可以轻松部署 tensor flow+Jupyter 设置
docker run -it — rm — runtime=nvidia -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3
Note down the token to login later
The url will be http://localhost:8888
tensor flow+Jupyter(Kubernetes) 要在 Kubernetes 中运行相同的图像,请执行以下命令
microk8s.kubectl run — generator=run-pod/v1 tensorflow — image=tensorflow/tensorflow:latest-gpu-py3
要获得 dashboard 的 kubernetes 令牌,请查找关键字令牌
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk ‘{print $1}’)
Retrieve the token to login later
那我们需要跑
kubectrl proxy
使用本地主机 url 显示管理面板
Note IP in the tensorflow pod, this will be use to access the jupyter from browser
Then click on Logs to look for jupyter login token
一旦我们有了 IP 和令牌,我们就可以使用浏览器访问 jupyter。
结论
像 docker 这样的容器技术甚至在 kubernetes 中也提供了很好的工作流,我们可以在本地进行实验,特别是在游戏笔记本电脑/台式机上,然后再部署到云中。我们也不需要担心安装 CUDA 库,只需要在 Ubuntu 上使用官方的 Nvidia 驱动程序。
Example runtime output with docker container that allow close to 100% GPU memory utilization
we could easily monitor the stats from here while running tensorflow
这种设置的唯一缺点是电池寿命!因为我们有半激活的 nvidia 驱动环境。