定义有效数据科学流程的 3 个步骤
图片来自:https://unsplash.com/photos/pKeF6Tt3c08
在本文中,我将探索如何创建一个定义良好的数据科学过程。
具体来说,我将解释团队的数据科学流程是如何由(1)团队的数据科学生命周期框架(即团队的数据科学流程工作流),(2)团队的协调框架,以及(3)这两个框架的集成组成的。
数据科学流程培训
如果您正在寻找关于如何在项目中有效使用数据科学流程的更深入的解释,请探索来自数据科学流程联盟的培训。
但请阅读下文,快速了解如何定义数据科学流程。
数据科学流程不仅仅是数据科学生命周期
当我向领导数据科学团队的人询问他们的数据科学流程时,许多人会描述一个数据科学生命周期(即他们的数据科学流程工作流——比如首先获取数据,然后清理数据,然后创建一个机器学习模型)。其他人对“作为一个团队工作以完成工作”给出了模糊的回答。
然而,尽管定义生命周期肯定是有用的,但是定义生命周期并不等同于定义健壮的数据科学团队流程。
换句话说,虽然拥有定义良好的数据科学生命周期肯定是团队流程的一个重要方面,但如果只谈论团队的生命周期(即团队的数据科学工作流),就错过了流程的一个关键方面!即团队应该如何协调他们的工作。
定义协作流程
虽然大多数生命周期框架明确指出团队可能需要“循环回到”先前的阶段,但是这些框架并没有定义团队应该何时(或者为什么或者如何)循环回到先前的阶段。因此,如果一个数据科学团队仅仅使用一个生命周期框架,团队本身仍然需要定义如何/何时返回到先前的阶段。
这就是为什么定义团队如何在项目团队中区分工作优先级和交流信息的流程也很重要(我称之为“数据科学协作流程”)。如果没有有效的方法在团队中沟通,团队经常会听到他们的利益相关者/客户认为:
- 生成的模型/洞察没有用(或者他们不信任数据和/或模型)。
- 数据科学团队没有生产力(因为利益相关者不理解做一个完整的机器学习项目需要什么)。
- 数据科学团队没有专注于最高优先级的任务(因为利益相关者没有明确的方式与数据科学团队协调和协作)。
在许多方面,数据科学团队使用的流程类似于 30 年前软件团队的领导方式——团队专注于做什么,而不是如何做。
因此,为了帮助团队定义有效的数据科学流程,本博客的其余部分将解决以下三个关键问题:
- 团队在项目期间可能会使用什么数据科学生命周期(数据科学工作流程)?
- 什么样的框架可以用来帮助团队改进他们的合作方式?
- 数据科学团队应该如何将他们的数据科学生命周期框架与其数据科学协调框架相集成?
1.选择一个数据科学生命周期
(数据科学流程工作流)
CRISP-DM 于 20 世纪 90 年代设计,是描述数据科学项目中步骤最常用的框架。它定义了项目的 6 个阶段:
- **业务理解:**确定业务目标;评估形势;确定数据挖掘目标;制定项目计划
- **数据理解:**收集初始数据;描述数据;探索数据;验证数据质量
- 资料准备(一般是最耗时的阶段):选择资料;干净的数据;构建数据;整合数据;格式化数据
- **建模:**选择建模技术;生成测试设计;建立模型;评估模型
- **评估:**评估结果;审查过程;确定后续步骤
- **部署:**计划部署;计划监控和维护;制作最终报告;审查项目
另一个定义数据科学生命周期的框架是 TDSP (团队数据科学过程),是微软在 2016 年推出的。它定义了数据科学生命周期的 5 个阶段(业务理解、数据获取和理解、建模、部署、客户接受)、4 个项目角色(小组经理、团队领导、项目领导和个人贡献者)以及要在指定项目阶段完成的 10 个工件。简而言之,TDSP 试图使 CRISP-DM 阶段现代化,并引入一些额外的结构(例如,角色)。
还有许多其他生命周期框架,但其中大多数(如 Domino Data Lab 的 框架 )在本质上是相当相似的——即描述数据科学项目中的步骤。
2.选择数据科学协调框架
团队用来帮助协调和区分工作优先级的一种方法是 看板 ,,它帮助团队将工作分成几个部分(每个部分都是一项任务),然后在能力允许的情况下将工作拉出来(而不是在需要时将工作推入流程)。看板提供了一套原则,通过减少他们的在制品,并使团队能够根据需要(基于之前任务的结果)重新确定任务的优先级,来帮助团队变得更加敏捷。简而言之,看板的两个主要原则是:
- 可视化流程——看板直观地展示了通过任务进行的工作,这些任务在指定的工作完成度增加的列中流动
- 最小化进行中的工作——专注于完成进行中的任务,以便可以通过已完成的任务获得洞察力(通知什么可能是有用的未来任务)
然而,尽管有用,看板并没有定义团队如何协调和优先处理要做的事情。因此,一个使用看板的团队需要定义额外的结构来帮助他们,例如,区分任务的优先级。
敏捷协调框架
像 CRISP-DM 在 20 世纪 90 年代定义的 Scrum ,确实定义了一个协调框架(例如,团队如何区分任务的优先级,从而帮助他们决定何时“循环返回”)。事实上,Scrum 是软件开发项目中最流行的团队协作框架,因此,许多人很自然地想到在数据科学项目中使用 Scrum。例如,Scrum 定义了会议、角色、工件和执行迭代的固定持续时间冲刺的过程。然而,在数据科学环境中使用 Scrum 有几个挑战(比如很难估计数据科学任务需要多长时间,这使得定义 sprint 中的内容非常具有挑战性)。
数据驱动 Scrum (DDS)是一个较新的框架,解决了使用 Scrum 时遇到的许多挑战。DDS 利用了最初 scrum 的一些关键方面(比如角色),但是定义了一个更适用于数据科学项目的迭代框架。例如,迭代不是有时间限制的,而是由一小组任务(通常是实验或假设)定义的,这些任务包括创建、观察和分析任务。
3.整合团队的生命周期和协调框架
如果一个数据科学团队(或数据科学团队领导)选择一个生命周期框架以及一个数据科学适当的协调框架,一个明显的问题是“我们如何集成这两个框架”?
实现这种集成的一种方法是将迭代定义为贯穿项目生命周期阶段的一个“循环”。另一种方法是让迭代包含项目生命周期中的一个阶段。
这两种方法都可以独立于团队使用 CRISP-DM、TDSP 或任何其他生命周期框架。
了解更多信息
本文只是简单地解释了什么是适合数据科学团队的数据科学过程。定义和使用一个有效的敏捷数据科学过程当然比阅读这篇文章需要更多的时间、精力和知识。如果您有兴趣更深入地了解这个主题,您可以探索成为 认证数据科学团队领导 。
虽然这需要一些时间和精力,但是定义一个健壮的数据科学过程是值得的。我亲眼看到,通过解决这三个关键问题,人们可以更有效地领导数据科学团队。这种改进是由这样一个事实推动的,即数据科学团队在需要完成的工作(例如,实施机器学习模型)方面将有一个共同的词汇表(在团队内部以及与利益相关方)。它还将提供一种更容易与利益相关者讨论如何对潜在工作进行优先排序以及如何确保从机器学习模型中生成的见解可由客户组织执行的方式。
原载于 2020 年 8 月 31 日 https://www.datascience-pm.com。
预测时间序列的三个步骤:LSTM 与张量流 Keras
Python 中的一个实用示例,提供了有用的技巧
来源: Adobe 股票
在本教程中,我们用 Python 呈现一个深度学习时间序列分析实例。你会看到:
- 如何预处理/转换用于时间序列预测的数据集。
- 当我们的计算机内存有限时,如何处理大型时间序列数据集。
- 如何用tensor flow****Keras神经网络模型拟合长短期记忆( LSTM ) 。
- 还有更多。
如果你想用机器学习技术分析大型时间序列数据集,你会喜欢这个带有实用提示的指南。
让我们现在开始吧!
我们正在使用的数据集是来自 Kaggle 的家庭用电量。它以一分钟的采样率测量一个家庭的电力消耗。
在 4 年内收集了 2,075,259 个测量值。不同的电量和一些分计量值是可用的。但是我们将只关注三个特性:
- 日期:日/月/年格式的日期
- 时间:时间格式为 hh:mm:ss
- 全局有功功率:家庭全局分钟平均有功功率(千瓦)
在这个项目中,我们将预测 10 分钟后 Global_active_power 的电量。
步骤#1:为时间序列分析预处理数据集
首先,让我们处理数据集,为时间序列分析做好准备。
我们通过以下方式转换数据集 df :
- 通过组合日期和时间以日期时间格式创建特征日期时间。
- 将 Global_active_power 转换为数字并删除缺失值(1.25%)。
- 在新数据集中按时间对要素进行排序。
现在我们有一个数据集 df 如下。
接下来,我们将数据集分为训练、验证和测试数据集。
df_test 保存原始数据集中最近 7 天的数据。 df_val 有测试数据集前 14 天的数据。 df_train 有剩余的数据。
相关文章 : 时间序列分析,可视化&与 LSTM
预测本文仅比历史数据提前 1 分钟预测 Global_active_power。
但实际上,我们希望在更长的时间内进行预测,我们将在本文中这样做。
步骤 2:为 TensorFlow Keras 转换数据集
在我们可以拟合张量流 Keras LSTM 之前,还有其他过程需要完成。
让我们一点一点地对付他们!
将数据集分成更小的数据帧
如前所述,我们希望预测未来 10 分钟的 Global_active_power。
下图将问题可视化:使用滞后数据(从 t-n 到 t-1)来预测目标(t+10)。
单位:分钟
在训练模型时遍历数据集是没有效率的。因此,我们希望用代表历史数据和目标的每一行来转换数据集。
单位:分钟
这样,我们只需要使用上述矩阵的每一行来训练模型。
现在挑战来了:
- 我们如何将数据集转换成新的结构?
- 当我们的计算机内存有限时,我们如何处理这个更大的新数据结构呢?
因此,函数 create_ts_files 被定义为:
- 将原始数据集转换为上面的新数据集。
- 同时,将新数据集分成更小的文件,这样更容易处理。
在该函数中,我们定义了以下参数:
- start_index :包含在所有历史数据中进行预测的最早时间。
在本练习中,我们希望从一开始就包含历史记录,因此我们将其默认值设置为 0。 - end_index :被纳入所有历史数据进行预测的最晚时间。
在本练习中,我们希望包括所有历史记录,因此我们将其默认值设置为无。 - history_length :这是前面提到的 n,是每次预测要回顾的时间步数。
- step_size :历史窗口的步幅。随着时间的推移,Global_active_power 不会快速变化。所以为了更有效率,我们可以让 step_size = 10。这样,我们下采样使用过去每 10 分钟的数据来预测未来的量。我们只看 t-1,t-11,t-21 直到 t-n 来预测 t+10。
- target_step :未来要预测的期数。
如前所述,我们试图提前 10 分钟预测 global_active_power。所以这个特性= 10。 - num_rows_per_file :放入每个文件的记录数。
这是将大型新数据集分割成较小文件所必需的。 - data_folder :包含所有文件的单一文件夹。
那是一大堆复杂的参数!
最后只要知道这个函数创建一个文件夹里面有文件就行了。
每个文件包含一个熊猫数据帧,看起来像上面图表中的新数据集。
每个数据帧都有列:
- y ,这是要预测的目标。这将是 t + target_step (t + 10)时的值。
- x_lag{i} ,时间 t + target_step — i 的值(t+10–11,t+10–21 等等),即相对于 y 的滞后值。
同时,该函数还返回数据帧中的滞后数(len(col_names)-1)。稍后为张量流模型定义形状时,将需要此数字。
在应用 create_ts_files 函数之前,我们还需要:
- 缩放 global_active_power 以与神经网络一起工作。
- 将历史记录长度 n 定义为 7 天(72460 分钟)。
- 将历史数据中的步长定义为 10 分钟。
- 将 target_step 设置为 10,这样我们就可以预测历史数据 10 分钟后的 global_active_power。
之后,我们将创建 ts 文件应用于:
- 在文件夹 ts_data 中创建 158 个文件(每个文件包括一个熊猫数据帧)。
- 返回 num_timesteps 作为滞后数。
当函数运行时,它打印每 10 个文件的名称。
ts_data 文件夹大约有 16 GB,我们仅使用过去 7 天的数据进行预测。现在,您可以看到为什么需要将数据集分成更小的数据帧了!
定义时间序列对象类
在这个过程中,我们创建一个类 TimeSeriesLoader 来转换数据帧并将其输入到模型中。
有来自 Keras 的内置函数比如 Keras Sequence,tf.data API。但是它们在这方面效率不高。
在这个类别中,我们定义:
- init :对象的初始设置,包括:
- ts_folder ,这将是我们刚刚创建的 ts_data。
- filename_format ,ts_folder 中文件名的字符串格式。
例如,当文件为 ts_file0.pkl、ts_file1.pkl、…、ts_file100.pkl 时,格式为 ts _ file { }。pkl。
- num_chunks :文件总数(块)。
- get_chunk :这个方法从一个文件中取出数据帧,对其进行处理,为训练做准备。
- shuffle_chunks :这个方法打乱了 get_chunk 中返回的块的顺序。这对于建模来说是一个很好的实践。
这些定义可能看起来有点混乱。但是请继续阅读,您将在下一步中看到这个对象的作用。
定义之后,我们将这个 TimeSeriesLoader 应用到 ts_data 文件夹。
现在对象 tss 指向了我们的数据集,我们终于为 LSTM 做好了准备!
步骤 3:创建 LSTM 模型
长短期记忆 ( LSTM )是一种用于深度学习领域的人工递归神经网络(RNN)架构。
LSTM 网络非常适合基于时间序列数据进行分类、处理和预测,因为时间序列中的重要事件之间可能存在未知持续时间的滞后。
如前所述,我们将基于 TensorFlow Keras 库构建一个 LSTM 模型。
根据我们的指南,我们都知道超参数调整的重要性。但是在本文中,我们只是简单地演示了没有调整的模型拟合。
程序如下:
- 定义输入数据集的形状:
- num_timesteps ,我们在步骤#2 中设置的数据帧中的滞后数。
-时间序列的号为 1。因为我们只使用了 global_active_power 的一个功能。
- num_timesteps ,我们在步骤#2 中设置的数据帧中的滞后数。
- 定义的数量单位,4 单位(单位+2)是 LSTM 的参数数量。
数字越高,模型中的参数越多。 - 定义下降率,用于防止过拟合。
- 指定输出层具有线性激活功能。
- 定义型号。
然后我们还定义了优化函数和损失函数。同样,调整这些超参数以找到最佳选项将是一种更好的做法。
为了在运行之前查看一下我们刚刚定义的模型,我们可以打印出摘要。
可以看到输出形状看起来不错,是 n / step_size (72460 / 10 = 1008)。需要训练的参数数量看起来也很合适(4 单位(单位+2) = 480)。
开始建模吧!
我们分批训练每个组块,只运行一个历元。理想情况下,你可以为神经网络训练多个时期。
在拟合模型之后,我们还可以使用验证数据集来评估模型性能。
与训练数据集相同,我们还创建了一个验证数据文件夹,为模型拟合准备验证数据集。
除了使用验证数据集进行测试,我们还使用最近的历史点(t+10–11)对基线模型进行测试。
下面是详细的 Python 代码。
使用 LSTM 的验证数据集给出的均方误差(MSE)为 0.418。而基线模型的 MSE 为 0.428。LSTM 的表现略好于基线。
我们可以通过超参数调整和更多的纪元做得更好。此外,一些其他重要的时间序列分析技巧,如季节性,也会有所帮助。
相关文章 : 用 Python 调优超参数:完整分步指南
感谢您的阅读!
希望你能在本指南中找到有用的东西。如果你有任何问题,请留言。
在离开之前,别忘了 报名参加刚刚进入数据快讯 !或者通过推特、脸书与我们联系。
因此,您不会错过我们的任何新数据科学文章!
原载于 2020 年 3 月 22 日https://www.justintodata.com。
这是利用在线资源进入数据科学的完整路线图/课程。你是否想学习…
www.justintodata.com](https://www.justintodata.com/how-to-learn-data-science-online-all-you-need-to-know/) [## 什么是冠状病毒死亡率与超参数调整-只是进入数据
我们用 Python 给出了一个深度学习时间序列分析的例子。您将看到:-如何预处理/转换…
www.justintodata.com](https://www.justintodata.com/coronavirus-death-rate-with-hyperparameter-tuning/) [## 如何在 Python 中使用 NLP:一个实用的分步示例——只进入数据
在这篇文章中,我们展示了一个分步的 NLP 应用程序。这是对…的技术解释
www.justintodata.com](https://www.justintodata.com/use-nlp-in-python-practical-step-by-step-example/)
超调 ML 模型时提高效率的 3 个步骤
毫不费力地在不同型号之间切换,不会弄乱代码
动机
你可能听说过“没有免费的午餐”(NFL)定理,该定理表明对于每一个数据都不存在最佳算法。一种算法可能在一种数据中表现良好,但在其他数据中表现不佳。这就是为什么有这么多的机器学习算法可以用来训练数据。
我们如何知道哪种机器学习模型是最好的?在我们实验和比较不同模型的性能之前,我们无法知道。但是试验不同的模型可能会很麻烦,尤其是当您使用 GridSearchCV 找到模型的最佳参数时。
例如,当我们完成对 RandomForestClassifier 的实验并切换到 SVC 时,我们可能希望保存 RandomForestClassifier 的参数,以备我们想要重现 RandomForestClassifier 的结果。但是我们如何高效的保存这些参数呢?
如果我们将每个型号的信息保存在不同的配置文件中,就像下面这样,不是很好吗?
experiments/
├── data_preprocess.yaml
├── hyperparameters.yaml
└── model
├── random_forest.yaml
└── svc.yaml
model
下的每个文件将像这样指定它们的参数
当我们想要使用一个特定的模型(假设是 RandomForestClassifier)时,我们需要做的就是运行训练文件,用model=modelname
指定我们想要训练的模型
python train.py model=random_forest
能够做到这一点帮助我更快地试验不同的模型,而不用担心丢失用于 GridSearchCV 的特定模型的超参数。这篇文章将向你展示如何毫不费力地在不同的模型之间切换,就像上面的 Hydra 一样。
1:添加九头蛇
Hydra 是一个优雅地配置复杂应用程序的框架。我在这里写了如何使用 hydra 进行数据科学项目。除了配置一个配置文件之外,hydra 还使得处理不同的配置文件变得更加容易。
按照这个教程,简单地克隆这个 repo 。这是我们项目的树形结构
.
├── data
├── experiments
│ ├── data_preprocess.yaml
│ ├── hyperparameters.yaml
│ └── model
│ ├── random_forest.yaml
│ └── svc.yaml
├── predict.py
├── preprocessing.py
├── train_pipeline.py
└── train.py
为了访问experiment
中的配置文件,我们将添加hydra.main
作为train.py
中函数的装饰器,如下所示。config_path
指定配置文件的路径,config_name
指定配置文件的名称
这就是hyperparameters.yaml
的样子
YAML 是最容易理解和使用配置文件的语言。如您所见,要访问训练数据,我们只需使用config.processed_data.text.train
在hyperparameters.yaml
中,我们放入了与训练相关的一般信息,如数据路径、GridSearchCV 的得分,而不是特定模型的超参数。我们希望在根据我们使用的型号更改型号的配置时,保持文件静态。
如果我们想用 SVC 开始训练我们的模型,在hyperparameters.yaml
中,我们用
defaults:
- model: svc
步骤 2:配置机器学习模型
现在当我们运行python train.py
时,Hydra 将尝试在目录模型下搜索文件svc.yaml
因此,我们的下一步是在模型目录下创建一个名为svc.yaml
(或者您喜欢的任何其他名称)的文件,如下所示
experiments/
├── data_preprocess.yaml
├── hyperparameters.yaml
└── model
├── random_forest.yaml
└── svc.yaml
我们的svc.yaml
文件将包含模型的名称和用于 GridSearchCV 搜索的超参数
现在当我们跑的时候
python train.py
Hydra 将自动访问模型目录中的svc.yaml
配置并使用svc.yaml
中的参数!
如果您想使用 RandomForestClassifier,创建名为random_forest.yaml
的文件,然后插入关于我们的 RandomForestClassifier 的信息
我们可以在终端中覆盖默认模型,而不是在hyperparameter.yaml
文件中更改默认模型!
python train.py model=random_forest
现在我们在train.py
中的函数可以通过配置访问这些参数。例如,如果我使用svc
模型,这将是我看到的
>>> print(config.model)
SVC>>> print(hyperparameters))
{classifier__C: [.05, .12]classifier__kernel: ['linear', 'poly']classifier__gamma: [0.1, 1]classifier__degree: [0, 1, 2]
}
相当酷!
最后一步:将配置文件放入 GridSearchCV 的参数中
要将字符串“SVC”转换成一个类,请使用eval
*from* sklearn.svm *import* SVCclassifier = eval(config.model)()
现在分类器像普通的 SVC 类一样工作了!
为了将配置文件中的超参数用于值为 Python list 的 Python 字典中,我们使用
现在,您可以像这样在终端的不同型号之间自由切换
python train.py model=random_forest
从现在开始,如果您想要使用一个具有不同超参数的新模型,您需要做的就是为该模型添加配置文件,然后运行
python train.py model=<newmodel>
您的模型无需更改train.py!
中的代码即可运行
但是如果我想在配置文件中使用 Python 函数呢?
有时,我们可能想使用不被 YAML 识别的函数,比如classifier__C: np.logspace(-4, 4, 20)
,而不是写下一些被 YAML 文件识别的特定值,比如列表classifier__C: [.05, .12]
model: LogisticRegressionhyperparameters: classifier__penalty: ['l1', 'l2'] classifier__C: np.logspace(-4, 4, 20) classifier__solver: ['qn', 'lbfgs', 'owl']
放心吧!我们仍然可以通过在字符串周围包装eval()
函数来找到解决这种情况的方法!这将把你的字符串np.logspace(-4, 4, 20)
变成一个真正的 python 函数!
*for* key, value *in* param_grid.items(): *if* isinstance(value, str): param_grid[key] = eval(param_grid[key])
然后将字典中的所有值转换成 Python 列表,这样它们就是 GridSearchCV 的有效参数
param_grid = {ele: (list(param_grid[ele])) *for* ele *in* param_grid}
结论
恭喜你!您刚刚学习了如何使用 Hydra 来试验不同的机器学习模型。使用这个工具,您可以将代码与数据的特定信息分开。
如果你想改变你的机器学习模型的超参数,你不需要回到你的代码。您只需要为额外的模型再添加一个配置文件,并使用
python train.py model=<modelname>
下面是使用 hydra.cc 和 config 文件的示例项目。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如
为建立与他人分享你的发现的环境而感到沮丧?以下是如何让它变得更简单
towardsdatascience.com](/how-to-share-your-python-objects-across-different-environments-in-one-line-of-code-f30a25e5f50e) [## VSCode 中数据科学家的 4 大代码查看器
让 YAML、JSON、CSV 和 Jupyter Notebook 为你工作,而不是与你作对
towardsdatascience.com](/top-4-code-viewers-for-data-scientist-in-vscode-e275e492350d) [## 如何在命令行上创建和查看交互式备忘单
停止搜索命令行。用作弊来节省时间
towardsdatascience.com](/how-to-create-and-view-interactive-cheatsheets-on-the-command-line-6578641039ff) [## 如何有效地微调你的机器学习模型
发现为您的 ML 模型寻找最佳参数非常耗时?用这三招
towardsdatascience.com](/how-to-fine-tune-your-machine-learning-models-with-ease-8ca62d1217b1) [## IBM 联邦学习简介:一种在私有数据上训练 ML 模型的协作方法
在训练来自不同来源的数据时,如何保证数据的安全?
towardsdatascience.com](/introduction-to-ibm-federated-learning-a-collaborative-approach-to-train-ml-models-on-private-data-2b4221c3839)
成功转入繁荣的数据科学职业的 3 个策略
有抱负的数据科学家的 2 个常见陷阱,以及如何通过这些简单的方法避免它们。
完整视频此处
TowardsDataScience.com 大学的面试官。
受访者: Amit Jain 技术主管,ML at Trade Rev
欲了解更多仅限 TDS 的面试,请点击此处查看:
阅读《走向数据科学》中关于 Tds 采访的文章。共享概念、想法和代码的媒体出版物。
towardsdatascience.com](https://towardsdatascience.com/tagged/tds-interview)
你能告诉我们你的专业背景吗?
到目前为止,它已经在许多垂直行业积累了 15 年的丰富经验。我做过团队经理、团队领导之类的工作。在这 15 年的时间里,我的职业生涯分为三个阶段。前 5 年是在电信行业度过的。我在开发 3G 协议栈的算法,用 C,汇编代码等等。接下来的 5 年,我投身于云计算和应用编程。在过去的 5 年里,我磨练了我的后端技能,并将 ML 加入到我的技能组合中。
最近,我于 2017 年 9 月搬到多伦多,并加入 TradeRev,担任 ML 团队的技术主管。
你在 TradeRev 的重点是什么?
TradeRev 是 B2B 领域的二手车在线平台。因此,他们使用 TradeRev 的在线平台,而不是经销商在实物拍卖中拍卖经销商。就像易贝经销商对经销商的汽车交易一样。
机器学习进入画面,给汽车、经销商等带来信心。一些常规用途是推荐系统、价格预测、回归问题和从视频中识别汽车视图的计算机视觉问题。
我在 TradeRev 的角色非常独特。我主要负责 ML 产品的交付。这意味着将研究转化为生产。我领导着 ML 团队,参与了产品生命周期的所有方面。
这始于产品团队对您正在寻找的解决方案的构想。然后与数据工程师和数据科学家合作,构建原型,到处选择 AWS 服务,然后将原型转化为完善的解决方案。我们的技术栈是 python、Scikit-Learn、Tensorflow 和其他普通库。
另一项重要的工作是在数据科学中引入软件最佳实践,例如机器学习领域的 CI/CD、模型监控(我们如何实际建模我们的模型)、单元测试等。
你能谈谈你的团队使用 ML 在 Trade Rev 上产生的商业影响吗?
将研究带入生产的一件重要事情是理解 ML 实际上是如何对业务产生影响的。推荐系统就是一个例子。这是很基本的事情;根据我以前的经历,我对哪些新项目感兴趣?
因此,基于汽车经销商以前的历史(他对购买什么汽车感兴趣),我们可以帮助客户销售团队通过 ML 算法只锁定特定的经销商(专注于 10 家经销商,而不是 100 家)。这可能会减少完成交易的时间。这是在生产中使用 ML 算法的一个非常直接的影响。
对于像你这样背景(软件工程)的人来说,你有什么建议要转到数据科学行业吗?
我有 3 个具体的建议。
- 清楚了解数据科学中的各种角色。他们是产品经理、SDE、ML 工程师、数据工程师、研究员、数据科学家、商业分析师等等。询问你对哪个角色感兴趣,你拥有哪些相关技能。此外,将领域专业知识与机器学习技能结合起来。
- 确定技能差距。如果你的目标是职业生涯的一部分,找到你的技能差距,参加适当的数学、编码等课程。
- 专注于 ML 的应用方面。假设你有一个住房数据集,你想预测一些东西。使用现有的库看看你能找到什么。获得对你所构建的东西的反馈。
您谈到了领域专业知识。它在机器学习中的作用是什么,有多重要?
我的观点是,这里没有灵丹妙药。ML 只不过是统计、数学和新的库。这是一种古老的技术,有新的库,新的框架,有更多的数据和计算能力(简而言之)。
假设你没有某个领域的专业知识,你只知道工具。在这种情况下,把这种情况想象成马拉松而不是短跑。对于马拉松来说,你需要有自己的基础——所以要学习新的跑步技术或什么的。但问题是你有没有毅力,也就是说你有没有该领域专业知识的基础。
因此,让我们以药物发现为例(考虑到冠状病毒季节)。对于一个在 Tensorflow 或 Scikit-Learn 方面是专家,但对分子一无所知的人来说——我不认为这个人能在药物发现方面创造奇迹。但是如果另一个人在这个领域有专业知识,两个人可以一起获得更大的成功。当然,有些独角兽拥有所有的技能,但平均来说,如果我们建立一个拥有不同技能的团队,团队的成功率会提高。
对于你关于药物发现的观点,我确实看到很多人在没有真正理解生物领域的情况下就把他们的模型贴在了网上。这似乎很危险。
是的,我看到的是许多人孤立地看待这件事。它更应该是一种用 ML 构建产品的整体方法。在金融领域,如果这个人没有任何经济学背景,并且在股票市场上建立模型,而明天股票市场表现怪异,那么 ML 单独不起作用。
您经常提到模型生产,我经常听到这是数据科学项目生命周期的最后一部分。能不能多讲讲这个话题的重要性,新人如何学习?
对此我想引用吴恩达的话。他说“我们知道 ML 的工作原理。现在是时候将它投入生产并实现货币化了。”但我看到的是,数据科学家通常专注于 Jupyter 笔记本和超参数。
我要说的是不要有如此狭隘的方法。考虑业务环境——ML 如何适应业务。ML 是商业的一部分,就像推荐系统一样。推荐系统不是业务,而是业务的一部分。
另一部分是思考 ML 发布到产品中意味着什么。例如,您的现场数据可能与训练/测试数据具有不同的分布。因此,如果你没有这种心态,如果明天出现一些错误,预测变得偏离,并且变得难以修复,那就麻烦了。这就引出了一些问题,比如“你如何改进你的训练?你如何改进你的 API?”
完整的采访,请点击查看视频:
**
获得数据科学领域工作的 3 个宝贵建议
找到正确的关注领域可以帮助你脱颖而出
在 Unsplash 上由 Helloquence 拍摄的照片
一年半前,我在一家医疗保健管理机构担任数据分析师。厌倦了整天在 excel 电子表格中辛苦工作,并看到了将我正在做的大量手工工作自动化的机会,我发现 Python 和 data science stack 是改善我处理每周项目的方式的有效工具。
快进到大约 6 个月后,我发现了一个数据科学训练营,它接受来自学术界或以前在数据领域工作过的个人的申请,并有在学生完成项目后安排他们的记录。是的,失业几个月的机会成本,以及堆积如山的账单,感觉就像是几个月内无法承受的负担。但是一旦我有了必要的专业知识,这是一种让我现在的收入翻倍的方法。
以下是我毕业后在数据科学领域找工作时遇到的一些小技巧:
1)通过项目快速获得经验,并真正投入其中。
这一步非常重要。人们喜欢淡化项目,因为大多数招聘人员不会在简历上看到这些项目,但最终它将决定或破坏你熟悉在该领域取得成功所必需的工具的能力,并在面试中讲述你与他们共事的经历。如果你决定参加训练营,导师会帮助你形成你的任何想法,但最终还是要靠你在课外投入尽可能多的时间,使用多种工具来提升你的经验和技术能力。即使你不在训练营中,(也许你正在完成一门在线课程或自己学习),尝试新工具不仅拓宽了你解决各种问题的方法,还展示了知道如何更聪明地工作,而不是更努力地工作,以取得成果。项目还可以强化新学到的概念(即机器学习算法),并加深你对何时使用某些方法的理解。
拥有显示如何解决问题或可视化解决方案的 python 脚本,以及编写高级 SQL 查询的额外练习,将很好地适用于任何给定的业务。(提示:数据科学家主要使用这两个最重要的工具)
从头开始构建项目几乎总是需要使用 Python 和 SQL。但是如果不行,想办法在你的解决方案中实现它。如果您查询一个大规模数据集,并在完成任何转换之前将整个数据集加载到 Python 的内存中,那么在处理 100GB 的数据(需要一台超级计算机来处理内存中的数据)时,您无法证明您可以在业务环境中工作。因此,找到任何数据集,即使只有几百行,在将必要的部分加载到 Python 之前,先在 SQL 中执行小的转换。你可以在面试中谈及这段经历,让你在竞争中占得先机。如果你想查看潜在的数据集,我会说一定要看看 Kaggle,浏览数以千计的免费公开数据集。如果你在这个过程中停滞不前,你也可以找到很棒的数据集的文章,这提供了另一个学习机会。
在一天结束的时候,你希望拓展自己的视野,加入任何有能力做出贡献的团队。因此,即使你发现了别人没有使用的新东西,学习如何使用它,并在适当的时候将这种深度的信息带到桌面上,可以转化为即时的信任和认可。
2)非常非常擅长理解 ML。
是的,我指的是机器学习!几乎每个组织都在寻找有解决问题经验的人,并且可以用多种方法解决问题。我讨厌白板问题,面试中问这些问题的做法正在慢慢被淘汰,取而代之的是统计学和数学中更多的理论问题。像说明如何计算联合概率这样简单的事情可以找出知道如何很好地实现机器学习的人与已经学会如何将一堆模型扔向一个问题以查看什么返回最佳准确性或最低 MSE(均方差)的人。一旦你去参加现场面试,即使了解回归的基本知识也会大大提高你获得工作的机会(它给我的同行创造了很多机会,也破坏了很多机会)。
我训练营的几个同事分享了一些资源,虽然很有帮助,但往往会偷工减料,没有对某些主题进行深入的解释。我相信长且慢是理解机器学习高级话题的关键,推荐 ISLR(统计学习入门)作为一个很棒的起点,甚至是面试前的打磨点,来提振你的信心。此外,如果你是一个音频/视频学习者,社区会强烈推荐吴恩达的机器学习课程。一旦你打下了基础,你就可以开始进入更高级的话题,比如深度学习。
即使你不是所有方面的专家,精通回归(线性和逻辑)和决策树的基础知识可以成为学习更高级算法的坚实基础。如果你发现任何特定的算法与你之前遇到的问题有关,专注于真正了解这些算法,并能够提供更深入的解释,这可能是面试中紧张时期的一个很好的依靠。如果你在简历上写下项目,你使用的每一个算法都必须是你知道如何很好解释的东西,否则你会被发现看起来像个骗子!专家和冒名顶替者之间的界限非常模糊。
3)网络将有助于吸引你的应用。
一天坐下来申请数百份工作似乎是获得成功的一种方式。你的分析头脑可能在想,“如果我只是申请一千份工作,这只是一个数字游戏,最终会有一份得到,对吗?”
错了。申请如此多的工作岗位可能会让你的简历到处移动,但这不会让你出现在招聘经理面前。这就是为什么你必须尽你所能利用你的关系网,尽可能地获得每一个推荐。这是几乎可以保证你发送的大部分简历至少会被人审查一次的唯一方法,即使你的简历不符合他们所有的内部标准,你甚至可以在最初的电话筛选中受益。
一旦你进入了电话面试阶段,就要做真实的自己,用你的能力让自己成为一个有吸引力的候选人。那些东西是随着经验和时间而来的。除了不断重复你的方法并对你所知道的保持自信,没有简单的快速解决方法。
但是为了达到这个关键的第一步,你必须首先让别人注意到你。唯一的方法就是和社区里的人交朋友,建立关系网。参加任何一个聚会看起来像是人们常说的一条建议,但实际上对你没什么用,除非你和在这个领域工作的人接触并寻求建议。仅仅要求推荐通常会让你得到奇怪的眼神。如果你真诚地从人们那里寻求关于他们的经历和工作的信息,他们会更倾向于继续对话,这最终会让你获得推荐。
参加训练营可以极大地帮助建立人脉,因为公司通常倾向于从他们过去挖掘并取得成功的人才库中招聘人才。训练营的职业生涯日最初只会让一部分人被录用,但这仍然是一个很好的机会来了解招聘者在寻找什么,这样你就可以计划你的方法来有效地引起注意。
在一天结束时,这些提示将有助于指导您在数据科学领域找到工作的核心领域。无论你处于什么样的经验水平,通过这些简单的步骤,你都能更好地准备找到你一直想要的职位。只要确保永远不要怀疑自己和自己的知识。自信有助于向招聘经理和招聘人员展示你已经准备好为他们的组织带来成功。
使用 Python 学习自然语言处理的 3 个超级简单的项目
单词云、垃圾邮件检测和情感分析的简单代码示例
什么是 NLP?
从事数据科学工作并有技术写作背景的我被自然语言处理(NLP)领域所吸引。理解语言的机器令我着迷,我经常思考,如果亚里士多德有机会,他会使用哪些算法来建立一个修辞分析机器。如果你是数据科学的新手,进入 NLP 可能看起来很复杂,尤其是因为该领域最近有如此多的进展。很难知道从哪里开始。
项目和数据
这三个超级简单的项目将向您介绍自然语言处理中使用的概念和技术。
字云
情感分析
垃圾邮件检测
这些项目使用的数据是垃圾邮件数据集,可以在我的 GitHub 中的所有代码中找到:
[## bendgame/nlpBeginnerProjects
permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/bendgame/nlpBeginnerProjects/blob/master/NLP_beginner_projects.ipynb)
机器能理解什么?
虽然计算机实际上很擅长寻找模式和总结文档,但它必须先将单词转换成数字,然后才能理解它们。这种转变是必要的,因为机器“学习”归功于数学,而数学在文字上不太管用。在将单词转换成数字之前,它们通常会被清除掉特殊字符和标点符号之类的东西,并被修改成更统一、更易解释的形式。
项目一:词云
清洗单词通常被称为预处理,这是项目 1 的重点:单词云。
导入依赖项和数据
从导入依赖项和数据开始。数据存储为逗号分隔值(csv)文件,所以我将使用 pandas 的 read_csv() 函数将其打开到 DataFrame 中。
import pandas as pd
import sqlite3
import regex as re
import matplotlib.pyplot as plt
from wordcloud import WordCloud#create dataframe from csv
df = pd.read_csv('emails.csv')df.head()
df.head()
探索性分析
在做任何事情之前,最好对数据进行快速分析,以消除重复的行并建立一些基线计数。我使用 pandas drop_duplicates 来删除重复的行。
print("spam count: " +str(len(df.loc[df.spam==1])))
print("not spam count: " +str(len(df.loc[df.spam==0])))
print(df.shape)
df['spam'] = df['spam'].astype(int)
df = df.drop_duplicates()
df = df.reset_index(inplace = False)[['text','spam']]print(df.shape)
删除重复之前/之后的计数和形状
什么是词云?
词云是可视化文本数据的一种有用方式,因为它们使理解词频变得更容易。在电子邮件文本中出现频率更高的单词在云中显得更大。词云使识别“关键词”变得容易
词云示例
注意在单词云图片中,所有的文字都是小写的。没有标点符号或特殊字符。那是因为文本已经被清理了,以便于分析。使用正则表达式,很容易通过循环来清理文本:
clean_desc = []
for w in range(len(df.text)):
desc = df['text'][w].lower()
#remove punctuation
desc = re.sub('[^a-zA-Z]', ' ', desc)
#remove tags
desc=re.sub("</?.*?>"," <> ",desc)
#remove digits and special chars
desc=re.sub("(\\d|\\W)+"," ",desc)
clean_desc.append(desc)#assign the cleaned descriptions to the data frame
df['text'] = clean_desc
df.head(3)
注意,我创建了一个空列表 clean_desc ,然后使用一个 for 循环逐行遍历文本,将其设置为小写,删除标点符号和特殊字符,并将其追加到列表中。然后我用 clean_desc 列表中的数据替换文本列。
停止言语
停用词是最常见的词,如“the”和“of”将它们从电子邮件文本中删除可以突出更相关的常用词。去掉停用词是常用的技巧!一些 Python 库,比如 NLTK,预加载了一个停用词列表,但是从头开始创建也很容易。
stop_words = ['is','you','your','and', 'the', 'to', 'from', 'or', 'I', 'for', 'do', 'get', 'not', 'here', 'in', 'im', 'have', 'on', 're', 'new', 'subject']
请注意,我包含了一些与电子邮件相关的词,如“回复”和“主题”由分析师决定应该包含或排除哪些单词。有时候包含所有单词是有益的!
构造单词 Could
方便的是,有一个 Python 库用于创建单词云。它可以使用 pip 安装。
pip install wordcloud
当构建单词云时,可以设置几个参数,如高度和宽度、停止单词和最大单词。甚至可以对其进行整形,而不是显示默认的矩形。
wordcloud = WordCloud(width = 800, height = 800, background_color = 'black', stopwords = stop_words, max_words = 1000
, min_font_size = 20).generate(str(df1['text']))#plot the word cloud
fig = plt.figure(figsize = (8,8), facecolor = None)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
使用 matplotlib 和可以保存和显示单词云。show() 。这是所有记录的结果,不管它是不是垃圾邮件。
通过分割数据框和制作两个词云来进一步推动练习,以帮助分析垃圾邮件和非垃圾邮件中使用的关键词之间的差异。
项目 2:垃圾邮件检测
这是一个二元分类问题,因为电子邮件可能是垃圾邮件(1),也可能不是垃圾邮件(0)。我想建立一个机器学习模型,可以识别电子邮件是否是垃圾邮件。我将使用 Python 库 Scikit-Learn 来探索记号化、矢量化和统计分类算法。
导入依赖项
导入转换和建模数据所需的 Scikit-Learn 功能。我将使用计数矢量器、训练 _ 测试 _ 分割、集成模型,以及一些度量标准。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn import ensemble
from sklearn.metrics import classification_report, accuracy_score
将文本转换为数字
在项目 1 中,文本被清理。当你看一个词云时,注意它主要是单个的词。单词越大,出现的频率越高。为了防止单词云输出句子,文本要经过一个称为标记化的过程。这是把一个句子分解成单个单词的过程。单个的单词被称为记号。
使用 SciKit-Learn 的 CountVectorizer() ,可以很容易地将文本主体转换为计算机可以传递给机器学习算法的稀疏数字矩阵。为了简化计数矢量化的概念,假设您有两个句子:
狗是白色的
猫是黑色的
将句子转换为向量空间模型会以这样的方式转换它们,即查看所有句子中的单词,然后用数字表示句子中的单词。
狗猫是白的黑的
狗是白的= [1,1,0,1,1,0]
猫是黑的= [1,0,1,1,0,1]
我们也可以用代码来展示这一点。我将添加第三句话来说明它计算令牌。
#list of sentences
**text = ["the dog is white", "the cat is black", "the cat and the dog are friends"]**#instantiate the class
cv = CountVectorizer()#tokenize and build vocab
cv.fit(text)print(cv.vocabulary_)#transform the text
vector = cv.transform(text)print(vector.toarray())
字数的稀疏矩阵。
注意在最后一个向量中,你可以看到一个 2,因为单词“和出现了两次。 CountVectorizer 正在对记号进行计数,并允许我构建包含单词到数字的转换的稀疏矩阵。
词汇袋法
因为该模型没有考虑单词的位置,而是将单词混合起来,就像它们是拼字游戏中的瓷砖一样,这被称为单词袋方法。我将创建稀疏矩阵,然后使用 sk-learn**train _ test _ split()**拆分数据。
**text_vec** = CountVectorizer().fit_transform(df['text'])X_train, X_test, y_train, y_test = train_test_split(**text_vec**, **df['spam']**, test_size = 0.45, random_state = 42, shuffle = True)
注意,我将稀疏矩阵 text_vec 设置为 X,将df[’ spam ']【T26]列设置为 y。
分类器
我强烈建议尝试几种分类器,并确定哪一种最适合这个场景。在本例中,我使用的是 Scikit-Learn 集合中的**GradientBoostingClassifier()**模型。
**classifier** = ensemble.GradientBoostingClassifier(
n_estimators = 100, #how many decision trees to build
learning_rate = 0.5, #learning rate
max_depth = 6
)
每个算法都有自己的一套参数,你可以调整。这就是所谓的超参数调整。浏览文档以了解模型中使用的每个参数的更多信息。
生成预测
最后,我们拟合数据,调用预测并生成分类报告。使用class ification _ report(),很容易构建一个显示主要分类指标的文本报告。
classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)print(classification_report(y_test, predictions))
分类报告
注意我们的模型达到了 97%的准确率。通过调整超参数、探索不同的分类器和尝试不同的矢量器来进一步推动练习!
项目 3:情感分析
情感分析也是一种分类问题。这篇文章本质上反映了一种积极的、中立的或消极的情绪。这被称为文本的极性。也有可能衡量和说明文本的主观性!有大量的资源涵盖了情绪分析背后的理论。
该项目没有构建另一个模型,而是使用一个简单的开箱即用工具来分析名为 TextBlob 的情感。我将使用 TextBlob 向 DataFrame 添加情感列,以便可以对其进行分析。
什么是 TextBlob?
Python 2 和 3 的 TextBlob 库建立在 NLTK 和模式之上,试图简化一些文本处理任务。它提供了分类、词性标注、名词短语提取、情感分析等工具。使用 pip 安装,并查看安装指南。
pip install -U textblob
python -m textblob.download_corpora
文本 Blob 情感
使用情感属性,TextBlob 返回一个名为元组的表单情感(极性,主观性)。极性是范围[-1.0,1.0]内的浮点数,其中-1 为最大负值,1 为最大正值。主观性是在【0.0,1.0】范围内的浮动,其中 0.0 非常客观而 1.0 非常主观。
blob = TextBlob("This is a good example of a TextBlob")
print(blob)blob.sentiment#Sentiment(polarity=0.7, subjectivity=0.6000000000000001)
应用 TextBlob
使用列表理解,很容易将文本列作为 TextBlob 加载,然后创建两个新列来存储极性和主观性。
#load the descriptions into textblob
email_blob = [TextBlob(text) for text in df['text']]#add the sentiment metrics to the dataframe
df['tb_Pol'] = [b.sentiment.polarity for b in email_blob]
df['tb_Subj'] = [b.sentiment.subjectivity for b in email_blob]#show dataframe
df.head(3)
TextBlob 使生成极性和主观性的基线情感分数变得非常简单。为了进一步推动这一训练工具,看看您能否将这些新功能添加到垃圾邮件检测模型中,以提高准确性!
包扎
尽管自然语言处理看起来是一个令人生畏的话题,但基础部分并不难掌握。有大量的库使得开始探索数据科学和 NLP 变得容易。完成这三个项目:
词云
垃圾邮件检测
情感分析
您将探索对文本数据应用预处理、标记化、矢量化和特征工程的具体示例。
如果您有兴趣学习更多关于数据科学或编程的知识,请查看我的其他文章!
[## 在 SkLearn 中使用 FunctionTransformer 和 Pipeline 预测 Chardonnay 评级
一个将函数转换成可用的管道代码,然后通过传递数据帧来预测葡萄酒评级的例子…
towardsdatascience.com](/using-functiontransformer-and-pipeline-in-sklearn-to-predict-chardonnay-ratings-9b13fdd6c6fd)
谢谢大家!
- 如果你喜欢这个, 在 Medium 上关注我 了解更多
- 通过订阅 获得完全访问权限并帮助支持我的内容
- 我们连线上LinkedIn
- 用 Python 分析数据?查看我的 网站
打击数据科学偏见的 3 个切实步骤— ClosedLoop.ai
我们都希望我们的算法是公平的,但有时,很难知道如何开始。
图片由皮克斯拜的 Gerd Altmann 提供
当我们想到偏见时,我们往往会想到它最明显的表现方式。当前的时代精神暴露了被动接受不公正所造成的危害。作为一名数据科学家,你有责任朝着公平的方向前进。通常,驱动力必须来自作为实践者的你。可能很难知道如何处理这个问题。我将重点介绍三种具体方法,通过这些方法,您可以努力消除数据科学决策中的偏见。
1.以有意义的方式衡量公平
在提到机器学习模型时说出“准确性”这个词,数据科学家就会凭空解释为什么这不是正确的指标。他们将继续列举六种更好的量化有效性的方法。令人怀疑的是,同样的语义战士也精通在 ML 模型中测量公平性的方法。我们希望我们的模型是公平的,就像我们希望我们的模型是有效的和高性能的一样。因此,我们衡量公平。你对一个模型的报道反映了你的优先考虑,衡量公平应该是优先考虑的。
衡量模型的公平性可能具有挑战性。为了避免在我们的模型中引入偏见,许多数据集将不包括人口统计信息。这是好心导致坏结果的一个很好的例子。您应该记录人口统计信息,即使它从模型中保留。没有这些信息,就不可能衡量您的模型在这些线上的表现。如果您的公司没有记录这些信息,请考虑倡导代表这样做。
一旦你有能力衡量公平性,你就需要选择正确的度量标准。在之前的一篇文章中,我讨论了一种用于量化医疗保健中的偏见的指标,称为群体利益平等,并深入探讨了为什么我认为这是医疗保健背景下最合适的衡量标准。如果您在算法中发现了偏见,提供了一个很好的描述,说明了如何使用 SHAP 分数来量化决策存在偏见的原因。
2.不要让你的数据变得奇怪
社会科学领域的研究人员经常在归纳他们的理论时遇到问题。一个原因是,他们在大学生身上进行实验,而大学生代表了社会的一小部分。对这些数据集的描述很奇怪:西方的、受过教育的、工业化的、富裕的、民主的。如果你只是想预测这些群体,这样的现象是可以的。当你试图将社会理论应用到世界其他地方时,关于规范的潜在假设就失效了。我们使用的大多数数据集对个人如何生成数据都有类似的假设,这往往会导致不平等。
这种影响在医疗保健领域尤其糟糕。富人和穷人使用卫生系统的方式存在明显差异。例如,较穷的人使用流动服务乘车去正常的约会。当你从未缺少汽车时,这是很难预料的。通常,主题专家(SME)会敏锐地意识到这种现象。与 SME 合作对于集思广益解决这种影响是非常有价值的,尤其是在特征工程阶段。
那些没有被数据记录下来的东西是一个更大的挑战。医疗专业人员知道,决定你健康的很大一部分因素是基于你的家庭和工作环境。与财富和邮政编码相关的健康因素的几个例子是获得健康食品、接触有害化学物质和容易进入绿色空间。解释这些影响是困难的,但往往是理解为什么一个群体在公平性方面表现不佳的关键。
3.关注真实世界的效果
伟大的数据科学家与其他人最大的区别之一是他们理解他们的模型如何影响现实世界的能力。这一点之所以如此重要,是因为理解预期用途会影响到你如何定义你所预测的群体,以及你如何定义你的结果。虽然关注预期结果会让你成为一名优秀的数据科学家,但考虑非预期结果会让你成为一名伟大的数据科学家。
例如,您可以考虑建立一个模型来预测一个人是否会因心脏病发作而住院。一个合理的步骤可能是将你的人群限制在那些先前被诊断患有心脏病的人群中。以这种方式过滤人口是一把双刃剑。虽然它会使您的模型更加精确,但它也会过滤掉那些以前没有诊断过的人。如果一个人定期检查,更有可能记录下心脏病发作的情况。通过排除那些有不寻常使用模式的人,你最终建立了一个模型,将资源导向那些已经得到最好治疗的人。
从事数据科学工作的最大好处之一是医疗服务提供商和患者的利益一致。医疗保健提供者希望预测严重的医疗并发症,以便可以应用干预措施。举个例子,如果你注意到一个人有跌倒受伤的风险,干预措施可能是给他们一个踏凳。这非常简单而且非常有效。双赢。医疗保健中许多已知的不平等是有影响的。积极参与 SME 应该指导您的建模工作,以帮助使这些工作更加有效。你的模型有潜力让人们更健康,帮助底线,并创造一个更公平的医疗保健计划。这是一个很大的双赢局面。
原载于 2020 年 9 月 18 日https://closed loop . ai。
每个数据科学家都应该知道的 3 种文本距离
无论您是刚刚开始研究数据科学,还是已经在这个领域工作了很长时间,您都需要了解这三种文本距离
在之前的一篇文章中,我描述了每个数据科学家都应该知道的三个距离。那些距离几何距离:从一个点到一个点。在这篇文章中,我谈论从一个文本到另一个文本的距离度量。
测量从一个文本到另一个文本的距离和从一个点到另一个点的距离是不同的。
如何定义两个文本之间的距离?
解决方案 1 —汉明距离
汉明距离根据位置比较两个字符串中的每个字母。所以单词 1 的第一个字母与单词 2 的第一个字母相比较,等等。
汉明距离纯粹基于位置来比较两个字符串中的每个字母。
要计算两个字符串之间的汉明距离,需要比较字符串中每个位置的字符。不相等字符的个数就是汉明距离。
汉明距离的一个优点是进行这种位置比较非常快速和简单。另一方面,批评者认为它不能考虑到两个字母数不相等的字符串。另一个批评者是太严格了,比如“*abcdefg”*和“*bcdefgh”*被认为完全不同,而 7 个字符中有 6 个是相同的。
解决方案 2 — Levenshtein 距离
Levenshtein 距离是将一个字符串转换成另一个字符串所需的运算次数。所以每一次编辑都需要在 Levenshtein 距离上加 1。
Levenshtein 距离是将一个字符串转换成另一个字符串所需的运算次数。
三种类型的操作很重要:
- 插入/添加一个字符算作一个操作
- 删除一个字符算作一次操作
- 替换一个字符算作一个操作
要计算 Levenshtein 距离,您需要确定将一个字符串转换为另一个字符串所需的编辑操作(删除、插入或替换)的数量。
Levenshtein 距离要直观得多。当汉明距离表示’ abcdefg ‘和’ bcdefgh '完全不同时,在 Levenshtein 距离中它们相对相似。
另一方面,Levenshtein 距离确实需要更多的时间来计算,并且算法不太简单。
解决方案 3 —余弦距离
余弦距离与前面讨论的度量有很大不同,因为它考虑了两个文档之间的距离。它通常用于自然语言处理。
余弦距离适用于文档的矢量表示。
余弦距离或更常用的余弦相似度的核心思想是对文本进行矢量化:将文本转换成数字数据。最简单的方法是使用字数矢量器:
步骤 1:获取组合文本文档中的所有独特单词
文本矢量化的第一步:获取所有文档中的独特单词
第二步:通过字数统计为每个文档制作一个向量
文本矢量化的第二步:通过计算每个句子的字数来获得矢量
步骤 3:使用余弦相似度计算向量之间的相似度(相似度与距离相反)
相似性的公式是通过计算你的两个向量的点积除以 a 的范数乘以 b 的范数来计算的。
余弦相似性公式
为了计算这个,我们可以使用 Python 中的 scikit 学习库。对于当前示例,它给出了以下结果:
这意味着:
- 句子 1 和句子 2 的相似度是 0.816…
- 句子 1 和 3 的相似度是 0.369…
- 句子 2 和 3 的相似度是 0.452…
所以 1 和 2 最相似,那么 2 和 3 最相似,1 和 3 最不同,和预期完全一样。
结论
在本文中,我分享了 3 种计算文本数据距离的方法,从非常基本到相对复杂。
我希望这对您有所帮助,并祝您在数据科学之旅中好运!敬请期待更多;)
成为数据科学家的 3 个惊人理由
意见
作为一名数据科学家,积极看待日常工作生活。
目录
- 介绍
- 自由
- 影响
- 增长
- 摘要
- 参考
介绍
我想暂时停止撰写更多基于技术和事实的文章,来讨论我喜欢的数据科学工作的三个要点。有很多文章对作为一名数据科学家持否定态度,也有一些文章赞同一些观点,但在这篇文章中,我想把重点放在我个人经历的优点上。也许这些好处或快乐也会是你所经历的。我将讨论的主要话题是在日常工作中作为数据科学家的自由,对你工作地点的影响(业务,以及作为数据科学家你将能够获得的成长。请继续阅读,了解更多作为数据科学家的乐趣。
自由
Pablo Heimplatz 在Unsplash【2】上拍照。
在我工作过的大多数公司,数据科学团队都是分开的,有时与工程和产品部门分开(数据科学家可以期望与之合作的两个主要部门,或者是的一部分)。因为数据科学的角色不仅仅是工程或产品,所以你会发现自己有点孤军奋战。对我来说,这个结果是有利的。当你或者一个更小的团队是一个紧密团结的团队的一部分时,你可以专注于几个项目,而不是像软件工程师或者产品经理那样,最多 10 个项目。在你的角色中,自由的好处当然是值得拥有的。你可能有更少的会议,更多的时间专注于你的项目,并且有能力与更少的了解你的项目并且可以合作的人一起工作。
以下是我作为数据科学家享受自由的主要原因:
- 研究能力
- 独立工作的能力
- 能够在较小的团队中协作
- 更少的会议(有时)
- 远程工作是一个简单的过渡
影响
接下来,是我在工作中感受到的影响。在每家公司,无论是我的还是我们团队的数据科学项目都是一个重要的项目,它给整个公司带来了巨大的变化。有时候,一个数据科学项目可以成为一家公司的主要产品——比如网飞和他们的推荐系统,他们的很多业务都围绕着为消费者推荐服务(现在他们有了自己的节目和电影的附加产品)。虽然数据科学项目可能需要相当长的时间,但它们通常会产生一些影响,这当然会给你的日常工作带来成就感。
以下是我作为数据科学家喜欢 impact 的原因:
* be the cause of change in a company* apply your knowledge directly to the business* sometimes your project is the business itself* sense of accomplishment
增长
Francesco Gallarotti 在Unsplash【4】上拍摄的照片。
最后,不仅要有能力在你的公司里获得相当大的发展,在职位方面,还要有能力成长为一个人。有时,角色会变得相当停滞不前,但在数据科学中,有几个不同的子职位可以让你移动。
这些职位包括但不限于:
- 数据科学家 I、II、III 和高级数据科学家
- 数据科学经理
- 计算机视觉工程师
- 机器学习工程师
- 自然语言处理工程师或科学家
- 人工工程师或科学家
- 数据工程师
- 有时甚至是软件工程师
因为数据科学家的角色涵盖了工程和产品的许多方面,如软件、编码、编程、产品管理、商业分析和商业智能,所以你可以找到自己的位置,朝着更专业的角色努力(或成为多面手并征服它们)。
就个人成长而言,数据科学需要批判性思维,独自工作,但也需要与需要沟通和推理技能的利益相关者和高层管理人员合作,所有这些都可以应用于数据科学之外。
摘要
如您所见,作为一名数据科学家,有许多令人愉快的好处。我讨论了角色本身的自由、影响和成长。还有无数其他专业人士。欢迎在下面发表评论,描述和讨论你喜欢成为数据科学家的一些原因。
概括起来,这三个原因是:
freedomimpactgrowth
感谢您的阅读!我希望您喜欢我围绕我喜欢成为数据科学家的三个主要原因展开的讨论!
参考
[2]由 Pablo Heimplatz 在 Unsplash 上拍摄的照片,(2017)
[3]照片由 Levi XU 在 Unsplash 上拍摄,(2016)
[4]Francesco Gallarotti 在 Unsplash 上拍摄的照片,(2016)
我们可以从挥杆时机分析中学到的 3 件事
对美国职业棒球大联盟数据进行新型分析的机会可能很快就会到来。我们可以这样准备。
人们很容易认为我们目前正在追踪棒球比赛中的一切,但这是不真实的。尽管我们随时都有大量与棒球位置相关的数据,但在我们的数据收集中,仍然有很多游戏的方面被完全忽略了(据我所知)。在我看来,一旦我们开始跟踪它,分析的首要方面就成熟了,那就是与每次挥杆是早了、准时了还是晚了相关的数据,我将这些数据称为挥杆计时数据。
虽然我们几十年前就知道挥杆时机会影响球是否被击中,但是这方面的信息却没有公开的数据。在棒球的数据革命中,每次挥杆的时间都没有被记录下来。一个可能的原因是,很难判断一次挥杆是太早、太晚还是准时,但这并没有阻止我去尝试!
有了一点样本数据和一些想象力,我开始挖掘一个全新的棒球分析领域,这可能是 MLB 球队竞相寻找鹰眼数据最佳新用途的军备竞赛的重要组成部分。
抽样资料
为了这个项目,我观察了 2020 年来自 5 个不同击球手的总共 160 次挥杆,并尽最大努力将每次挥杆标记为早挥杆、准时挥杆、晚挥杆或检查挥杆。收集这些数据是为了让我们知道,利用全面的挥杆时机数据,我们可以回答什么样的问题,而不是用而不是来确定地回答这些问题。
我选择了五名具有不同进攻特征的样本球员,观看了他们 2020 年的每一次(截至 8 月 13 日),根据他们的时机将他们分组,早,准时,晚,或检查。这些击球手是:
DJ LeMahieu: 高产量,低气味(第 88 百分位 xwOBA,第 99 百分位气味率)
**埃迪·罗萨里奥:**低产量,低排名(第 22,第 87)
**小费尔南多·塔蒂斯:**高产,高人气(第 87,21)
迈克·祖尼诺:产量低,气味大(第 0,第 6)
最大 Muncy: 平均产量,平均气味(第 52,52)
通过选择一组不同的击球手,我能够从这种分析中扩展我可以提出的问题类型!不再赘述,下面是我认为可以用全面的挥杆时机数据来回答的最有趣的问题。
#1.为什么打者挥棒不中?
打棒球很难。但是为什么呢?在我看来,击球有三个主要组成部分:时机、力量和枪管位置。你需要这三个人来进行艰难的接触。如果你的挥杆只有两个主要部分,你可以预期会有微弱的接触。
作者图片
正如你所看到的,我相信不是所有的气味都是同样产生的,这里我将命名和描述两种主要的气味。
一个1 型挥杆 是一个具有力量和良好时机的挥杆,但是球棒打错了地方。这种味道是由于打者误算了球越过本垒板时在好球区的位置。在 8 月 7 日对阵雅各布·朱尼斯的比赛中,罗萨里奥在一个高速球下挥棒。他的挥杆既有力又准时,但是球下太远,导致了 1 型挥杆。(视频)
相比之下,2 型挥杆 是一种具有力量和良好杆身位置但时机不好的挥杆。这种味道是由于打者错误估计球何时会越过好球带造成的。当击球手挥棒太晚或太早时,就会出现这种情况。7 月 24 日对阵玄柳镇,迈克·祖尼诺的变速球太早了。(视频)
祖尼诺有很好的桶放置,因为他的球棒的路径与球的路径相交(因为两者是重叠的),但他挥棒太早,所以他的球棒错过了球。
我的理论是有两种截然不同的气味。当球的移动与打者预期的不同时,就会发生第一种类型的波动。当投球速度比打者预期的慢或快时,就会发生第二种类型的喷击。第三种气味是遵循前两种气味定义的气味,这是典型的非常丑陋的气味。
拥有全面的挥杆时机数据可以从本质上证明或否定这个理论,并帮助我们更好地理解为什么打者会挥杆。
#2.不同的击球手有不同的气味特征吗?
根据目前的公开数据,我们可以量化哪些投球类型给每个击球手带来了最大的麻烦,但看一下时机可以让我们对为什么击球手在某些投球中挣扎有另一层理解。
2009 年至 2010 年间,何塞·包蒂斯塔将自己从第四外野手转变为全垒打联盟的领导者。在这部 [ESPN 特写](http://between 2009 and 2010)(我强烈推荐)中,包蒂斯塔提到他在 2009 和 2010 之间增加了一个腿踢,这有助于改善他在本垒板的计时。
本质上,包蒂斯塔将这十年最大的球员发展成功故事之一归功于固定他的挥杆时机,这是我们目前没有衡量的。有多少其他玩家目前正因为未被发现的可修复的计时问题而苦苦挣扎?
我的理论是每个击球手对他的时机都有一定的倾向。以下是这种数据能够为我们提供的时间配置文件的量化示例,有助于我们诊断和了解我们的攻击者:
作者图片
在这张图上,长条的高度代表快速球的总击球次数。塔蒂斯的最多,莱马约的最少。这是重要的信息。在快速球方面,曼西最擅长守时,罗萨里奥通常会迟到。也非常重要!
比如说,曲线球的气味特征呢?
作者图片
我们可以看到 Tatis 从弧线球中吸取了最多的东西(尽管更大规模的分析可能应该着眼于吸取率,而不是原始吸取)。当罗萨里奥打出弧线球时,他总是很早。当祖尼诺打出弧线球时,他总是很准时。有意思!
从更大的画面来看,我们可以很容易地看到,我们的打者在这个赛季对快速球的打击比曲线球更多,打者通常在快速球上的打击晚,在曲线球上的打击早,但这并不总是如此。类似的图表和趋势可以针对所有音高类型和许多不同的场景进行分析。
我们还可以回答关于联盟范围内趋势的问题,比如那些把握好时机的球员在他们不击球的时候是否更有效率:
作者图片
回答问题:是的,样本数据中存在正关联!(不,这个趋势不应该在这个时候推广到联盟!)
在我看来,挥杆时机变量可能有很多预测能力,可以帮助我们更好地预测击球手可能会如何前进。但不管是不是这种情况,能够可视化击球手的时间配置文件有机会成为一个有价值的球员评估工具。
#3.其他因素如何影响挥杆时机?
有这么多的变量会影响一个板块的表现,那么哪些变量会影响挥杆时机呢?之前的推销?板外观的间距数?
我听到一些传闻说,如果一个打者连续两次看到球,他就更有可能有好的投球时机。挥杆时机分析可以测试这一点!但更广泛地说,我们将能够更好地理解后续音高之间的相互作用。当先前的球是一个缓慢的曲线时,打者是否更有可能在一个高快速球上迟到?当打者投出一个快速球后,投手接下来应该投哪个球?
目前,我们可以整天推测这些问题的答案,并尝试估计音高如何相互作用。有了全面的挥杆时机数据,我们基本上可以确定。
在我的样本数据中,我制作了一些有趣的图表:
作者图片
我发现我们的打者样本最常见的是在一个接一个的快速球投出时迟到,但也有相当一部分时间是准时的。请记住,你在上面看到的每一个观察都是一种暗示。在这些数据中,快速球之后的慢速球最常引发晚期挥杆。这一切都符合我们现有的理解,这是一个好迹象!
此外,我们可以看看打者在投球区看到的投球越多,他们是否更有可能准时:
作者图片
通过跟踪紫色柱的高度,我们可以看到,在这个样本中,击球手不太可能在盘子出现时准时。但是联盟的其他人都是这样吗?我们不知道,但我们会用摆动计时数据!
结论
希望这篇文章激发了你的想象力,并让你相信从挥杆计时数据中可以学到很多关于棒球比赛的知识(尤其是击球手和投手的互动)。这篇文章只关注了 MLB 队 3 周比赛中 5 名 MLB 击球手的挥杆和失误。想象一下,我们可以从所有比赛中所有击球手的挥杆计时数据中学到多少东西!
摆动时间数据目前还没有公开(据我所知),但如果鹰眼能够像宣传的那样发挥作用,它可能在不远的将来可用。如果是这样,团队将有很大的机会比他们的竞争对手更好地使用这些数据来获得竞争优势,就像任何大型的新数据源一样,甚至很难知道从哪里开始分析。但读完这篇文章后,我希望团队能够从这个潜在的改变游戏规则的话题开始。
感谢您的阅读!如果您有任何意见或问题,请在 Twitter 上告诉我: @Moore_Stats
来自 baseballsavant.com 的数据和视频
任何人都可以建立的 3 个时间序列模型
艾萨克·史密斯在 Unsplash 上拍摄的照片
最近接受了预测时间序列数据的挑战,我自学习机器学习以来第一次深入研究时间序列预测的细节。
这是我发现的。
—时间序列预测与通常的机器学习模型完全不同。
您的数据是不同的格式,您的数据清理过程是不同的,并且所使用的模型没有在其他任何地方使用过。似乎时间序列本身就是一种不同的技术。斯坎达的帖子完美地描述了这一现象。
因此,在花了几个小时钻研时间序列之后,我决定写这个简单的指南来帮助你建立你的第一个时间序列模型。
在这篇短文中,我将使用卡格尔·M5 预测比赛数据。
由于数据由沃尔玛中各种商品的销售数据组成,我将只关注单个商品的销售数据。
# Reading various csv into dataframe
sales_train = pd.read_csv("sales_train_validation.csv")
date = pd.read_csv("calendar.csv")# filter to get single item
single = sales_train[sales_train["id"]=="FOODS_3_090_CA_3_validation"].iloc[:,6:].T.reset_index().copy()datetime = date[["date","d"]].copy()single = pd.merge(left=single,right=datetime,left_on="index",right_on="d",how="left")# Data processing to prepare for modeling
single.drop(["d","index"],axis=1,inplace=True)
single["date"] = pd.to_datetime(single["date"])
single = single.rename({"date":"ds",single.columns[0]:"y"},axis=1)[["ds","y"]]
ts= single.iloc[-98:,:].copy()
对于培训和测试分割,我决定使用过去 3 个月(84 天)的数据来预测未来 2 周(14 天)的销售数量。
# use past 3 months (84 days) data to forecast the next 2 weeks
duration = 14
train = ts.iloc[:-duration,:].copy()
test = ts.iloc[-duration:,:].copy()
绘制数据,
# Visualization
plt.figure(figsize=(12,12))
plt.plot(train["ds"],train["y"],label="Train")
plt.plot(test["ds"],test["y"],label="Test")
plt.title("Time Series Forecasting")
plt.legend()
现在来建造我们的第一个模型。我要介绍的第一个算法是持久性算法。通过预测下一个时间步长与前一个时间步长的值相同,这种方法是获得时间序列数据基线预测的简便方法。
这意味着 t+1 的值就是 t 的真实值。
用代码实现它,
## Persistence algorithm
pred= []
for i in range(duration):
pred.append(train.iloc[-1,1]) # add test data to train
train = train.append(test.iloc[i])
这就是结果。
看起来很准确吧。但是外表是会骗人的。让我们来计算均方根误差(RMSE),这是时间序列预测中使用的一个常用指标。
from sklearn.metrics import mean_squared_error
rmse = np.sqrt(mean_squared_error(pred,test["y"]))
print("RMSE:",rmse)
41.2 的 RMSE,现在记住这一点,因为这是我们基线模型的误差。
接下来,我们转到时间序列预测的统计方法。ARIMA 是该领域许多从业者使用的一种常见和流行的预测方法。算法的细节不是这里的重点,但是你可以在这个详细的指南中找到更多关于 ARIMA 的信息。
首先,如果你还没有下载 pmdarima 包,请确保下载到你的机器中。这是 auto-arima 包,我们将使用它来获得模型的最佳参数。
需要注意的另一点是,该包只需要值的一维输入。
# Split into train and test set
duration = 14
train = ts.iloc[:-duration,:].copy().set_index("ds")
test = ts.iloc[-duration:,:].copy().set_index("ds")
使用自动 arima 建立模型并进行预测。
import pmdarima as pmmodel = pm.auto_arima(train,start_p=0,start_q=0,test="adf",max_p=3,max_q=3,error_action="ignore",suppress_warnings=True,seasonal=False)# prediction
pred = model.predict(duration)
看剧情…
预测值几乎形成一条直线。然而,如果你计算 RMSE,你会发现你的模型提高了 36.7 的 RMSE。
我们要看的最后一个模型是由脸书的数据科学家团队开发的一个包,名为 Prophet 。对于那些对使用的算法感兴趣的人,你可以在这里找到论文。
prophet 模型所需的数据格式非常具体。它需要一个名为‘ds’的日期列和一个名为‘y’的值列,这解释了为什么需要在前面的预处理阶段重命名我们的列。
一旦数据格式正确,您就可以开始训练模型了。
from fbprophet import Prophet
model = Prophet()
model.fit(train)
预测是通过一个特殊的函数来完成的,这个函数为未来的日期创建数据帧。
# Making prediction
future = model.make_future_dataframe(duration,include_history=False)
pred = model.predict(future)
pred = pred[["yhat","yhat_lower","yhat_upper"]]
几行代码所能实现的东西非常惊人。这款车型的 RMSE 只有 22.5,比之前的任何一款车型都要好。
这就是你要的,3 个时间序列模型,你可以快速的建立来探索你的数据。
快乐学习!
首次机器学习项目的 3 个技巧
帮助构建成功顶点项目的实用工具和技术。
自从我的顶点团队完成我们的森林火灾管理机器学习项目以来,已经过去了几个月。这是一次很棒的经历,最终让我们赢得了 2020 年安大略省软件工程顶点竞赛!随着学校开学,学生们开始新的项目,我认为分享一些在这个项目中帮助我的技巧是有用的。
总的来说,我从涉及机器学习的顶点工作中获得的最大收获是,90%的工作都是让数据屈服(或者与数据成为朋友,这取决于你的观点)。
理解干净数据、探索性数据分析、数据争论的重要性对我们项目的成功绝对至关重要。我认为这一点在课程工作中经常被忽视,这会导致人们对这样一个项目中所涉及的工作有一种扭曲的看法。因此,这里有一些工具和技术(有例子)帮助我的团队与数据保持健康的关系,并使项目更加愉快。
1。与 Google Colab 的合作
Google Colab 是一款来自 Google Drive 的用于编码和运行 Jupyter 笔记本(常用于机器学习项目)的工具。与本地 Python 脚本甚至本地 Jupyter 笔记本相比,使用 Google Colab 有两大优势。
首先,Colab 让你可以使用免费的云图形处理器,这可以真正加快你的工作流程。第二,使用 Colab 允许在 Google Drive 上存储数据(每个帐户最多有 15GB),这使得在数据争论上的合作更加容易。为了利用这些功能,我们的团队在 Google Drive 上使用了一个包含我们的 Colab 笔记本的共享文件夹,以及一个包含 gzipped csv 文件的共享数据文件夹,这些文件由一些笔记本输出,由其他笔记本用作输入。由于 Google Drive 文件夹是共享的,所以每个人都可以很容易地访问团队其他成员产生的最新数据。
下面是一个使用 Google Colab 笔记本从共享文件夹导入 gzipped csv 的示例:
如果你正在使用大的 csv 文件,我建议使用 gzip 压缩来存储它们,因为 pandas 包可以在一行代码中快速地解压缩和读入文件。
在我们的项目中,我们有 15 个活动的笔记本文件,它们有不同的相互依赖关系,因此有一个明确的位置来存储数据是非常有帮助的。
2。使用 aiohttp 加速数据采集
温度、风和湿度都对森林火灾是否会发生以及是否会蔓延有重大影响。由于这些值在一天中变化很大,我们必须从加拿大各地的气象站获得几年来的每小时数据。
对我们来说幸运的是,加拿大政府(加拿大环境和气候变化部)拥有加拿大数百个气象站的历史每小时天气数据,有些数据甚至可以追溯到 1866 年!他们甚至提供了完全免费的 API 来批量下载历史天气数据。
下载每小时数据的 API 要求用户指定站 ID、年份和月份。因此,如果我们想要过去 10 年中 150 个站点的数据,这将意味着 150x10x12 = 18,000 个 API 调用。按顺序执行这些调用需要很长时间,所以我们使用 aiohttp 包并发地执行 API 调用。
上面的代码可以用来获取任何类型的 csv 数据。
3。矢量化
在特征工程中,我们的团队假设绝对湿度可以提供额外的信息,有助于森林火灾的预测。绝对湿度可以从温度和相对湿度中导出,使用一个特殊的公式导出这里是。
下面是代码中的公式:
有几种方法可以将它应用于熊猫数据框中每小时的天气数据。我们可以遍历数据帧中的每一行,计算绝对湿度:
**%%timeit -n 3** abs_humidity_list = []
for index, row in df.iterrows():
temperature = row['Temp (°C)']
rel_humidity = row['Rel Hum (%)']
abs_humidity = calculate_abs_humidity(temperature, rel_humidity)
abs_humidity_list.append(abs_humidity)
结果: 3 次循环,3 次最佳:每次循环 8.49 秒
虽然上面的代码完成了这项工作,但是它为每一行计算一次函数。为了更快获得结果,可以使用熊猫应用功能:
**%%timeit -n 3** abs_humidity_series = df.apply(lambda row:
calculate_abs_humidity(row['Temp (°C)'], row['Rel Hum (%)']),
axis=1)
结果: 3 次循环,3 次最佳:每次循环 1.9 秒
即使这样更快,pandas apply 函数基本上仍然是一个循环。为了真正实现快速计算,我们希望将create _ ABS _ weather函数应用于同时的所有温度和相对湿度对。在我们的大多数项目笔记本中,我们的团队为此使用了 numpy 的 矢量化 功能:
import numpy as np**%%timeit -n 3** abs_humidity_np = np.vectorize(calculate_abs_humidity)(
df[‘Temp (°C)’],
df[‘Rel Hum (%)’])
结果: 3 次循环,3 次最佳:每次循环 34.2 毫秒
不错的进步。然而,在这篇文章的写作过程中,我发现使用 numpy 的矢量化仍然不是真正的矢量化。事实上,我们无法使用calculate _ ABS _ weather进行真正的矢量化,因为在该函数中,我们使用了 math.exp ,它一次只能对一个数字进行操作,而不能对一长串数字(向量)进行操作。
幸运的是,numpy 有一个等效的指数函数,它作用于向量, np.exp, 因此,如果我们对原来的calculate _ ABS _ weather函数做一点小调整,去掉指数函数,我们会得到:
突然间,我们有了一个可以接收整个熊猫数据帧列的函数:
***%%timeit -n 3**
calculate_abs_humidity_np(df[‘Temp (°C)’], df[‘Rel Hum (%)’])*
结果: 3 次循环,3 次最佳:每次循环 5.64 毫秒
真正的矢量化!
你可能会说,“矢量化真的那么重要吗?节省 8 秒钟似乎没什么大不了的。”对于小数据集,我同意它不会产生巨大的差异。作为参考,上面的示例使用了过去 10 年来自单个气象站的每小时数据,结果为 78,888 行(仍然相对较小)。
但是,如果我们想计算同一时期 100 个气象站数据的绝对湿度呢?现在,如果您正在遍历每一行,您将不得不等待 13 分钟,这就是矢量化开始产生重大影响的地方。矢量化还有一个额外的好处,就是可以让代码更加简洁易读,所以我建议尽可能养成使用它的习惯。
最终注释
顶点项目中使用的最终森林火灾预测模型是在包含超过 1600 万行的数据集上训练的(每行包含过去 10 年中某一天 20x20 公里网格的信息)。组装该数据集被证明是项目的关键部分,通过使用以下工具,整个过程变得更加简单:
- Google Colab——方便分享和协作数据
- 用于快速获取大量数据
- 向量化函数 —用于对具有数百万行的数据集执行高效操作
我已经将所有示例代码包含在一个笔记本文件中:https://github . com/ivanzvonkov/examples-3-tips-for-ml-projects/blob/master/example-notebook . ipynb。
我希望您有机会在您的下一个项目中尝试这些工具!
如果你想查看实际的顶点工程库,你可以在这里找到:https://github.com/ivanzvonkov/forestcasting。
感谢阅读,感谢所有反馈!
从数据科学文章中获取更多信息的 3 个技巧
阅读在机器学习中的作用
本·怀特在 Unsplash 上的照片
数据科学作为计算机科学、统计学和许多其他学科的交叉学科,对学生来说有几个障碍。其中之一就是知识的获取。
除了获得过去几十年的基础知识,数据科学的一个关键挑战是跟上每天发布的最新技术。所以,三点是每一个数据科学家和想成为数据科学家的人必须认真考虑的。
1.你不能什么都读
首先,你必须承认不可能阅读所有发表在数据科学网站或学术期刊上的文章。
每天都有大量关于数据科学和机器学习的文章发表。由于我们每个人每天只有 24 小时可以支配,我们应该问自己到底如何利用这些时间来最大限度地提高我们的学习进度。最好的办法就是找到符合你目前问题的文章,仔细阅读。偶尔,偶然选择和阅读一篇文章也会有所帮助。这允许你以新的视角,以新的创造性方式解决当前的数据科学问题。
您可能还会发现,使用媒体和数据科学时事通讯来选择您的阅读材料很有帮助。《月刊》和《每日文摘》帮助你追踪 TWDS 的最佳文章。确保您的时事通讯偏好和您的兴趣保持最新。
2.笔记和草图
第二点,对技能和工具的理解应该是机器学习学生的核心。因此,不仅要读一篇文章,而且要做笔记和画提纲。
试着从一篇文章中记录下你的结论。此外,你还应该把你的发现画下来。除了 PC 上的笔记之外,您还可以使用 Medium 的突出显示和注释功能。
3.落实!
最后,尝试将新获得的能力应用到自己的项目中。
光读书并不能让你成为数据科学家。在您自己的项目中实现并重现本文中描述的功能和过程。通过这种方式,你可以从你阅读的文章中产生可持续的知识,这将对你产生最显著的长期附加值。这也是扩展你的 GitHub 投资组合的一个很好的方式,因此雇主将能够更快地看到你在多大程度上真正处理了数据科学问题。
结论
仔细选择你的阅读材料。上面的提示将帮助你选择。此外,尝试将新获得的能力应用到自己的项目中。这是您从阅读数据科学文章中获得最大收益的方式。
从任何领域过渡到数据科学的 3 个技巧
没有确定的路径
凯勒·琼斯在 Unsplash 上拍摄的照片
自从我上次投递邮件已经有两年了。坦率地说,我并不想念它,事实上,我成为一名邮递员的想法对我来说似乎是荒谬的。但这确实发生了,在转到伦敦市政厅的邮件收发室之前,我先在皇家邮政工作,皇家邮政是英国的邮政服务和信使。
由于没受过什么教育,也没有网络指导,我蹒跚着进入了数据科学领域。虽然我还有很多东西要学,但我现在可以回顾过去,自豪地说,我已经完成了我说过要做的事情,尽管机会对我不利。
之前,我写过许多关于学习数据科学的文章:
学会学习的有效策略
towardsdatascience.com](/how-to-learn-faster-for-data-scientist-cfd96d317ce6) [## 当你试图成为一名数据科学家时感到沮丧的原因
将最优秀的人与众不同的隐藏技能
towardsdatascience.com](/the-reason-youre-frustrated-when-trying-to-become-a-data-scientist-2d2b8b402811) [## 学习数据科学的 3 个阶段
了解学习的 3 个阶段,以及我们如何将其有效地应用于数据科学学习
towardsdatascience.com](/3-stages-of-learning-data-science-9a04e96ba415)
然而,我从未直接回答过“我如何成功过渡到数据科学的问题?“这正是你将从这篇文章中学到的(根据我的经验)。
利用你的差异成为你的优势
如果你目前在一个没有直接转化为数据科学的领域,你是非常独特的,你可以利用这一点。这并不是说在相关领域(或学术界)工作的人不独特,相反,我的意思是,你的独特之处在于,你没有遵循一条直接的道路,所以你必须展现出很多个性,才能在就业市场上与有这种经历的人竞争。
为了让你的不同成为你的优势,你必须能够以一种让招聘经理和公司满意的方式包装你的经历。你可能没有学术或经验来支持你,但不可否认的是你有勇气,但你必须将这种勇气包装成有形的东西。
“当你来自一个完全不同的世界时,你总会遇到更有趣的事情”
想想看,如果你看到有人从零开始制造一辆汽车,而他们并没有沿着一条直线的道路进入汽车制造,但这辆车和其他人一样好,甚至更好,你不会对他们是如何做到的感到好奇吗?知道资源有限、没有传统教育/经验的情况下,他们有足够的弹性去寻求解决方案,你难道不乐意让这个人加入你的团队吗?没错。
这里的关键是包装你的不同之处,在你的简历上写“我有很多勇气”或“我愿意学习”是没有意义的,因为这些都是通用的东西,我个人认为应该是一个技术领域的人所期望的。
超越骗子综合症
最近,我开始注意到,冒名顶替综合症并不仅仅适用于那些没有“资格”成为数据科学家的人,因为我遇到过一些学习数学、计算机科学、统计学等的人,他们也有同样的遭遇。事实上,我曾和数据科学家交谈过,他们说感觉自己在作假。
“要成功地从你的职业转向数据科学,你必须克服在你耳边低语说你不够好的心理障碍。”
冒名顶替综合症会让你停滞不前、绝望并质疑自己。然而,过渡到数据科学的一部分是关于识别使你有资格担任你想要的角色的品质和经验。对我来说,成为我效力过的每一个足球队的队长让我有信心发表意见,而作为一名邮递员,我培养了极其彻底和密切关注细节的能力,这在我试图编写算法时(例如在《从头开始的算法》系列中)或在我进行错误分析等时对我有所帮助。
另一个克服冒名顶替综合症的方法是说服自己,你有勇气把事情搞清楚。我个人认为最好的方法是做自己的端到端项目。
找一个曾经在你船上的人
你可能很高兴知道你不是世界上第一个从另一个领域转向数据科学的人。找一个以前做过的人,听听他们是怎么做的——这不是一个人的推销。
这个人不一定要和你来自同一个领域。我还没有看到另一个前职位的人变成数据科学家,但我并没有期待这一点。我只是在寻找一个已经完成转变的人。
“听到走上你这条路的其他人的声音会给你带来渴望和激情”。
我从我收听的播客中注意到一个有趣的趋势(在 我如何了解数据科学 中了解更多信息),许多人并不认为他们已经走上了数据科学的明确道路,他们几乎是跌跌撞撞地来到这里的。这绝对有道理!
数据科学是一个非常新的领域,目前还没有很好的定义。不同的公司对什么是数据科学家有不同的看法,因此许多人觉得他们所走的道路似乎是非线性的。你不是第一个,也不会是最后一个,但你绝对应该站在前人的肩膀上。
包裹
转行比换雇主更困难和可怕。然而,我相信这些前兆在我的过渡阶段帮助了我,并且对任何试图过渡到数据科学的人都有很大的好处。
如果你认为我错过了什么,请留下回复或在 LinkedIn 上与我联系…
[## Kurtis Pykes -数据科学家-自由职业者,自由职业者| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有 3 个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
你需要保存数据科学项目范围的 3 个技巧
如何以数据科学家的身份与企业交流
永远不要花时间去构建一个与最初的提议相去甚远的巨型应用。并为此受到责备。
作为一名数据科学家,你希望得到一份能让你做酷事情的工作——大数据、大机器(或者像成年人一样的云)和深度神经网络。当你意识到你的模型、你的项目经理的时间表和你的利益相关者的期望之间的不匹配时,现实很快就来了。
您的项目离最初的范围越来越远,而您离完成还有很长的路要走。演示是在星期二,你眼睛流泪,手心冒汗。
照片由agrêBarros上Unsplash 。作者通过 AdobeSpark 添加的引文。
“那不在要求里!”—几乎每个开发人员
之前,我写过关于与业务利益相关者一起定义数据科学范围的重要性。通过引导企业从他们认为他们需要的到他们真正想要的,它可以省去很多麻烦。不幸的是,有一个明确的目标是不够的。业务需求一直在变化,昨天重要的事情不是今天紧迫的事情。谁知道明天会怎样?
这篇文章旨在讨论 3 个技巧(还有一个额外的!)来管理不断变化的数据科学项目范围。为了说明这一点,让我们从一个非常熟悉的例子开始。
建立一个客户流失模型,他们说
作为一个连续场景,让我们假设你公司新产品的保留率很低。你的老板比尔让你建立一个客户流失模型,找出是谁取消了他们的订阅。您花了一周时间收集需求,又花了两周时间清理数据,现在您终于准备好开始工作了。
直到。
范围蔓延:让我们包括一些新的数据源…
老板比尔认为社交媒体在预测客户行为方面至关重要。这可能是真的,这是可以做到的,但你的时间表没有改变,你没有得到更多的报酬。
范围蔓延示例。由作者创建。
对你来说不幸的是,比尔说你项目的部分预算来自用户参与团队。如果他们的数据没有被使用,这是一种侮辱。所以现在你必须这么做。哦,等等,我有没有提到数据是如此稀少,无论如何都很可能会被丢弃。
然后。
范围变化:让我们完全改变我们的假设…
有时,当这些“额外的特性”在项目中表现得太深入时,它就变成了一个范围变更。例如,夜间运行的批处理过程与实时预测有着根本不同的架构。
范围变更示例。由作者创建。
让我们在这里暂停一下,回想一下这是什么时候发生在你身上的。看看下面三个与范围蔓延或范围变更相关的选项。如果你能回到过去选一个,你会怎么做?
这里(或永远)没有正确或错误的答案,考虑到时间表和预算的灵活性,这些都是可以采用的好方法。与其试图重新定义或盲目地完成改变,我建议的是问更多的问题**。**
范围变更问题发生在我们当中最优秀的人身上。尽管不是所有的范围变化都是不好的(有些是有害的),但是它们确实给我们带来了不必要的压力。让我们深入探讨一下有望挽救你一些白发的建议。
技巧 1:知道谁是你的项目干系人
一旦我们得到了一个明确的项目纲要,我们当中的问题解决者就很自然地投入到开发模式中。这些是我们通常采取的步骤:
1⃣ 与拥有我们所需数据的团队对话
2⃣ 火车模型
3⃣ 与将帮助我们部署模式的团队交谈(比如数据工程和基础设施团队,如果你还没有足够幸运与他们一起工作的话)
酷,但是这里出了什么问题?
看看下面复杂的组织结构。大多数数据科学项目在组织内都有多个接触点。需要管理的不同数据源,由具有不同需求的部门提供的联合预算,以及具有我们需要的洞察力的支持业务职能。
简单机器学习模型的复杂组织接触点。由作者创建。
如果没有牢牢抓住众多的利益相关者,你就会意识到…
❌:你的生命周期价值计算是不正确的,因为你不知道定价团队给了在正式发布前注册的客户折扣。
❌:你创建的产品满意度指数是 NPS 的一个糟糕的代理,因为你不知道产品团队在把它传递给关系管理团队之前会多次转换它。
❌:最重要的是,你没有搞清楚谁是你的型号的用户。一线呼叫中心员工需要在短时间内访问预测。或许,他们也不太在乎精度,想优化召回。
通常,范围的改变是由于在开始时没有涉及正确的涉众。
如果我们知道关系管理团队为项目提供资金,我们会包括他们关心的指标——无论是 NPS 还是转发次数。如果我们知道呼叫中心的员工是我们的用户,我们会包括一个强大的模型解释器,这样他们就可以在客户放下电话说“不,我不需要新的手机合同,这是本周第三次了”之前优化电话的前 3 秒钟。
所有这些涉众都有需求,随着时间的推移,这些需求会逐渐融入到项目中。在项目早期绘制出利益相关者矩阵是在整个项目生命周期中管理他们的好方法。
项目利益相关者矩阵示例(利益相关者的位置因项目而异)。由作者创建。
有很多关于利益相关者分析的好材料,但是要点是:
不要寻求让每个人都满意。
根据这些风险承担者对项目成功的重要性对变更请求的类型进行分类。
否则,你将会耗尽时间和预算。
提示 2:使用非常具体的句子来传达问题陈述
一个项目通常有多个接触点,功能请求可能会飞来。你需要通过创造一个非常具体的句子来记住你项目的目标。****
使用一个非常具体的句子来记住目标和包含的范围
每次收到请求时,你可以很快决定它是否与你想要达到的目标一致。
例如,你可以有一个模糊的句子说:
含糊不清且不具体的问题陈述示例
然而,客户保持是一个宽泛的说法。主动取消是唯一的客户流失类型,还是套餐降级和过期订阅也包括在内?我们的目标仅仅是合同客户,还是我们更关心高价值或高影响力的客户?
以下三个句子是提炼问题陈述的更好例子:
精炼的问题陈述示例
这有助于将句子分成四部分:
🔍识别/洞察**:是有人监督还是无人监督的问题?是分类问题还是回归问题?**
❓ 我们试图优化的指标是什么:主动取消的数量,或呼出电话的转换率?
🙋♀:我们的目标客户是谁:所有合同客户还是有资格升级的高价值客户?
🕰 应该在什么时候进行预测:当客户打电话进来时,是否需要快速的预测时间,或者是否可以是一个每夜批处理的过程来创建第二天的呼出电话列表?
如果你不能缩小你的句子,那么你很可能需要把你的项目分成几个阶段。对于流失模型,您可以从识别客户群开始,并将结果用作主动取消模型的输入特征。
技巧 3:定义明确的成功标准
在模型培训期间,许多想法被抛出,并由多个团队成员进行测试。度量越简单,我们就越容易快速确定我们的努力是否朝着正确的方向前进。
我们的大脑更容易理解 F1 的分数,而不是试图平衡精确性和回忆性。不比较区域 A 和区域 B 之间的 F1 分数,更容易理解两个区域之间的加权 F1 分数。
一个精心选择的度量标准可以确保你不会乱搞和调优不必要的东西
看到 0.1%的精度收益很有趣,但投入往往不实际。
有时,当您有多个度量标准(比如说 n 个度量标准)无法组合时,您应该选择 n-1 个满意度量标准和仅仅 1 个优化度量标准 :
👍满意度度量:足够好的度量。通常有一个阈值,如模型大小小于 5MB 或运行时间小于 1 秒。
🚀优化指标:最小化或最大化的指标。通常没有界限,比如我能得到的最高精度(理论上是 100%,但你明白我的意思)。
只有一个优化指标是比较多个实验的关键。如果我们使用上面的例子:
👍满意度指标**:评分速度低于 2 秒。这使得呼叫中心代理能够根据客户流失的可能性,快速决定是否要为该客户提供更好的交易。**
🚀优化指标:预测取消的 F1 分数。需要一个平衡的观点,所以我们要确保为可能流失的客户提供好的交易,但不要给那些可能不会流失的客户太多好的交易。
吴恩达在他的书《机器学习的渴望》中讨论了选择单一指标的想法。我鼓励数据专业的每一个人去读这本书。他还在 Coursera 上发布了关于这个主题的结构化机器学习项目课程(以及更多)。
好处:使用路线图来跟踪和展示进展
项目一直在运行,没什么大不了的。重要的是当你告诉你的利益相关者你还没有完成,在你应该完成的那天。企业想要的只是知道你有一个计划——并且你在积极地跟踪它。
安迪·比厄斯在 Unsplash 上的照片。
“除非做出承诺,否则只有承诺和希望;但是没有计划。”~彼得·德鲁克
除了传统的软件项目之外,数据科学项目还面临着许多挑战:不确定的结果、准确性或相关性的不确定性、不透明性、公平性问题。这些使得 AI 很难被决策者和上层管理人员接受。
我们总是回避给出数据科学项目的时间表,这是可以理解的。但是这产生了两个问题:
- 缺乏透明度使商业变得非常可怕,所以他们对你的一举一动都进行微观管理。
- 比起交付商业价值,你太容易陷入研究一些无关紧要的新技术了。
制定一个路线图,让你和你所依赖的每个人都负起责任。
路线图示例。由作者创建。
路线图至少需要包括以下 4 项:
****1⃣你要做什么:你要做的实际任务,比如评估环境准备情况,整合输入数据,或者创建基线模型。这些应该是小的冲刺阶段(比如 2-6 周),所以如果超过了,很容易增加风险。
****2⃣他们能得到什么:并不是你做的每件事都能直接转化为企业可以利用的成果,但重要的是要努力让你的任务适合他们可以消费的东西。例如,在整合输入数据后,可以很容易地组合一个快速幻灯片或仪表板来传达您的结果。企业可以玩仪表板,询问结果,甚至可能帮助您创建一两个功能。
3⃣他们什么时候能得到它:给出任务完成的估计日期。想象一下,你登上一架飞机,飞行员告诉你他不确定你什么时候能到达目的地——可变风速等等。承诺一个你认为合理的日期,并尽早提出问题以控制期望。
****4⃣保护以防出错:在大型项目中,每个人都必须一起工作,向利益相关者强调这种依赖性是很重要的。要么他们可以帮你追着团队给你你需要的数据,要么他们让你再有一周的时间完成。
最后…
不要害怕寻求帮助。
除非你问,否则你永远不知道他们会说什么。令我惊讶的是,当我向一位前客户解释说他可以更快地得到他需要的结果时,他决定雇用另外两个资源。
如果你喜欢这篇文章,我以前也在这方面发表过类似的文章:
感谢阅读 ⭐在中、 LinkedIn 上关注我,或访问我的网站。此外,如果您想要对您的机器学习部署框架进行评估,请通过电子邮件向我们发送位于 Melio Consulting 的。
3 种类型的数据科学工程师面试问题
自信地完成数据科学工程师面试
我的背景主要是软件工程和数据科学。当我开始寻找数据科学方面的工作时,面试官注意到了我在软件方面的经验。许多受访者没有软件背景,但来自数学、物理或信号处理领域。在我的采访中,我经常在三个主要领域看到问题:数据接收和清理、可伸缩性和研发。
1.数据接收和清理
数据接收和清理是任何数据科学工作中的两个基本主题。在数据科学领域工作时,你会非常关注你称之为基础事实的数据源,你如何吸收这些数据源,然后你用什么方法来清理数据。
数据摄取
数据摄取可以有多种形式,根据您所工作的团队,问题可能会有很大的不同。假设你想成为一名数据工程师。在这种情况下,您将需要良好的数据库概念基础知识,并回答关于如何与新数据库交互或开发新数据库的更有针对性的问题。您可能会遇到的问题类型包括:
- 数据体验 —解释你处理过的数据类型以及你是如何存储这些数据的?比如你用过多少图像数据?你是如何存储和使用这些图像的?面试官想了解你对哪种类型的数据有经验。
- 数据量 —这是一个常见的问题:你处理过的数据量有多大?面试官想知道你是否处理过大型数据集,特别是如果职位描述中提到处理大数据。
- 大数据摄取 —您能对大型数据集执行 ETL 吗?在执行 ETL 时,您使用过哪些工具和技术?
- 数据库类型 —不同数据库类型之间的主要区别是什么,比如 NoSQL 与 SQL 数据库?您何时会使用每种类型的数据库?
- 合并 —你会如何合并两个数据集?
- 联接—SQL 中有哪些不同种类的联接,在什么情况下会使用每种联接?
在任何问题中,一定要大声说出解决方案。解释你到目前为止的经历,并诚实地说出你所不知道的。
数据清理
在我做过的每一次采访中,数据清理并不是一个被提及的话题,但是在某些情况下,它是被提及的。所以,我相信准备这些类型的问题是有好处的。最值得注意的一个案例是,采访者在白板上展示了一个微小的数据集。
以样本假数据集为例—图片来自作者。
查看一个数据集,如上所示,面试官问—“你如何清理这个数据集的每一列? “这项任务的目标是讨论你在数据集中看到的问题,以及你将如何处理每个案例。当你审视这样一个问题时,请考虑:
- 列名 —它们是否一致,如果不一致,如何创建兼容的模式?
- 字符串列——哪些价值观让你印象深刻?你如何清除这些价值,为什么?如果缺少值,您会如何处理这些数据?
- 日期 —是否使用了一致的日期格式?如果不是,你应该使用什么格式,为什么?如果日期不完整或错误会怎样?
- 数字——你觉得哪些值应该删除或清理?如果数据缺失,您会估算缺失点还是将其留空?
当你在做这样的例子时,试着一栏一栏地讲述你的决定。解释您将经历的清理数据的过程以及您根据您的信息做出的任何假设。如果你没有 100%的把握,可以提问。如果您不知道他们想对缺少信息的列或行做什么,您可以推荐一些您可以考虑的想法,并询问他们的想法。这种类型的问题是衡量你将如何处理数据清理问题的一种方式。我发现这是我在面试时收到的最难忘的问题之一,因为它引出了一些非常吸引人的对话。
在这样的例子中,您会考虑数据清理的其他哪些方面?
2.可量测性
从摄取和清理开始,另一个常见的问题是可伸缩性。采访者希望了解两件事,(1)您如何利用他们当前的流程和规模分析来运行大数据,以及(2)您如何将代码带入生产状态。
- 并行化 —您需要了解如何并行化大量数据,以快速生成分析结果和可视化。我经常看到的一个焦点领域是如何将处理和重现结果的速度提高 10 倍?
- 软件开发流程 —根据访谈情况,编码和开发可能不会关注讨论。假设你作为一名软件开发人员加入了一个数据科学团队。在这种情况下,对话可能包括如何生产代码、开发更严格的流程以及引入 CI/CD 管道。能够谈论你在这方面的技能,并解释它们如何为团队提供价值。解释这些类型的过程和开发实践可以做些什么来确保一个更健壮的分析集。
- 自动化 —如何自动化流程以加快分析速度?我们如何以 10 倍的速度重现结果?当讨论团队已经在工作的方法以及他们将如何利用你的软件技能来扩展过程时,自动化通常会在访谈中出现。
如果您来自软件背景,可伸缩性和自动化是讨论的基本话题。软件工程师拥有开发生产代码、使用 CI/CD 管道和自动化流程的经验。让你的技能在这里大放异彩,并解释它们如何对数据科学团队有价值。
3.研究与开发
最后一个面试领域更宽泛,因为它将研发作为一个整体来看待。在与数据科学团队的许多工作面试中,您将浏览您所从事的项目和您所做的分析。
- 关键成就——知道你在简历、求职信、LinkedIn 或申请中做了哪些研究工作。只在你的简历上写你知道你能说好的内容。你想在这里展示你最好的作品,与面试官一起讨论。
- 合作 —了解你在研究项目中的角色,并解释你是如何与他人合作完成这项工作的。这个项目的总体成果是什么?这项工作完成后,流程是如何改进的?
- 万无一失 —研发的另一个方面是,并非每个项目都能带来生产就绪的解决方案。学会识别运行不佳的实例,并能够快速排除故障。在面试中解释这一点有助于面试官理解你的项目管理和批判性思维技能。他们希望看到你能在这种环境下工作。
数据科学就是研究和开发新的流程和方法来推动商业价值。了解如何在 R&D 团队中工作以推动有价值的行动将非常有帮助。
最后的想法
数据科学面试因公司而异,但一些常见的问题是数据接收和清理、可扩展性以及研发。面试你的团队想知道你能处理各种数据源,并有效地清理数据以用于分析。他们想知道您是否以及如何扩展他们的流程,并使用大数据和自动化流程。最后,他们希望看到你能在快节奏的研究环境中发挥作用。
你们在面试中讨论过哪些常见的问题或领域?
如果你想阅读更多,看看我下面的其他文章吧!
当我参加大学讲座时,最常被问到的问题是“我需要具备什么技能?”
towardsdatascience.com](/top-8-skills-for-every-data-scientist-79e6b1faf3e1) [## 每个数据科学家都应该阅读的 3 本编程书籍
用 Python 掌握数据科学的编程和架构
towardsdatascience.com](/3-programming-books-every-data-scientist-should-read-badbb7a64c4a) [## 创建用于熊猫分组的自定义聚合
Pandas groupby 是一个函数,您可以在数据帧上使用它来分割对象、应用函数以及组合…
towardsdatascience.com](/creating-custom-aggregations-to-use-with-pandas-groupby-e3f5ef8cb43e) [## 数据可视化的前 3 篇文章
如果您想更好地构建数据可视化,这些文章很有帮助。
towardsdatascience.com](/top-3-articles-for-data-visualization-956a08a54b04) [## 不要太骄傲而不愿寻求帮助
如果你被一个 bug 卡住了或者感到不知所措,你可以寻求你需要的帮助。
towardsdatascience.com](/dont-be-too-proud-to-ask-for-help-76f21d16f318) [## 理解分析开发生命周期
将您的分析从摇篮带到坟墓。
towardsdatascience.com](/understanding-the-analytic-development-lifecycle-2d1c9cd5692e)
3 种类型的序列预测问题
在实现序列预测模型之前了解您的问题。
[ 来源
序列预测是一种流行的机器学习任务,它包括基于先前观察到的符号序列来预测下一个符号。这些符号可以是一个数字、一个字母、一个单词、一个事件或一个对象,如网页或产品。例如:
- 文本中的一系列单词或字符
- 客户购买的一系列产品
- 在日志上观察到的一系列事件
序列预测不同于其他类型的监督学习问题,因为它要求在训练模型和进行预测时必须保持数据的顺序。
序列预测是一个常见的问题,在现实生活中发现各种行业的应用。在本文中,我将向您介绍三种类型的序列预测问题:
☝Predicting 下一个值
✌️Predicting 一个类标签
👌预测序列
☝Predicting 的下一个价值
在许多应用中,猜测序列的下一个元素是一个重要的问题。序列预测模型学习识别顺序输入数据中的模式并预测下一个值。
时间序列预测
时间序列是指有序的数据序列,其中观察序列在时间维度上是连续的。时间序列预测是对序列中接下来发生的事情进行预测。因此,时间序列预测包括根据历史数据训练模型,并使用它们来预测未来的观察结果。
但是时间序列预测和回归问题有什么不同呢?有两件事:
- 时间序列是时间相关的,是按时间排序的。但是回归可以应用于无序数据,其中目标变量依赖于特征所取的值。
- 时间序列寻找季节性趋势。例如,一天中的电力需求在夜间会下降,而在夏季,航空乘客的数量会增加。
你可以尝试在航空乘客数据集上用 LSTM 或 ARIMA 建立你的时间序列预测模型,或者试试这个 TensorFlow.js 演示。
网页/产品推荐
你有没有搜索过什么东西,接下来看到的每一个广告都和你搜索的内容有关?
例如,在看完电影《复仇者联盟 4:终局之战》后,我在寻找某些场景的解释。从那时起, Google Discover Feed 开始向我展示围绕漫威电影宇宙的内容,甚至直到今天。
尽管看起来 Google Discover Feed 是在推荐一组网页,但每个网页都是一个单独的输出。
同样,我们可以将这个想法应用于产品推荐。如果我们用所有过去的交易训练一个顺序预测模型,我们也许能够预测客户的下一次购买。
✌️Predicting a 级标签
序列分类使用带有一些序列输入和类别标签作为输出的标记数据集来训练分类模型,该分类模型可用于预测未知序列的类别标签。
序列分类应用的一些例子:
文本分类。给用自然语言写的文档分配标签有许多现实世界的应用,包括情感分类和主题分类。
异常检测。研究人员探索在 4 个不同的时间序列数据集中检测异常行为,1)心电图,2)航天飞机马洛塔阀门,3)电力需求和发动机传感器数据集。
基因组研究。研究人员一直在对蛋白质序列进行分类。这项工作可能有助于发现广泛的蛋白质功能。
健康信息学。研究人员使用 LSTM 将心电图信号分为五个不同的类别,以识别患者的心脏状况。这允许端到端学习,在没有任何专家干预的情况下提取与 ECG 信号相关的特征。
脑机接口。我们从脑电图中提取大脑信号,解码用户操作辅助设备的意图。
👌预测序列
序列到序列学习(Seq2Seq)是关于训练模型来转换一个输入序列并输出另一个序列。像所有的监督学习一样,Seq2Seq 模型是用对的数据集训练的,但是输入序列和输出序列可以有不同的长度。
该模型由两个 LSTMs 组成;一个将充当编码器,它编码输入序列并产生内部状态表示。这些表示对输入序列的“含义”进行编码,并作为解码器的输入,解码器负责生成目标序列。实际上,Seq2Seq 模型的训练是通过“强迫”解码器生成完美序列并因生成错误序列而惩罚它来完成的。
机器翻译
“有一只白猫”,翻译过来就是“一只白猫”Seq2Seq 模型将我们从序列长度和顺序中解放出来,这使它成为语言翻译的理想选择。在神经机器翻译之前,机器翻译是基于规则的,专注于逐字关系,使用上下文无关语法。
2013 年, Sutskever 等人推出了用于机器翻译的 Seq2Seq 架构,而 Cho 等人提出了编码器和解码器架构。在过去的几年里,这方面的发展非常活跃。当前为谷歌翻译实现的最先进的机器翻译是基于注意力和转换的。
图像字幕生成
根据图像中观察到的内容自动生成自然语言描述吸引了许多人工智能领域的研究人员。这是具有挑战性的,因为它结合了计算机视觉和自然语言处理的知识,涉及到物体检测以推断图像中的物体和物体的关系,并学习语法以生成文本描述。
Vinyals 等人介绍了一种端到端的神经网络,由视觉卷积神经网络和随后的语言生成递归神经网络组成。
在这个模型中,编码器是一个卷积神经网络,用于提取图像中的特征。解码器是一个递归神经网络,主要用于生成文本描述。与机器翻译类似,当前的技术水平使用注意机制,其中网络注意输入的部分,并将有限的信息处理资源分配给那些重要的部分。
3 个被低估的应对缺失价值观的策略
实施、理解和学习如何使用 3 种强大的方法(包括深度学习)来估算数据。
我相信每个数据科学家/ ML 从业者都面临过数据集中缺失值的挑战。这是一个常见的数据清理过程,但坦率地说,是一个非常容易被忽视的过程。但是,有效的缺失值策略会对模型的性能产生重大影响。
出现缺失值的原因
缺失值出现的原因通常是特定于问题域的。但是,大多数情况下,它们发生在以下场景中:
- 代码错误:数据收集方法遇到了一个错误,一些值没有被正确获取(例如,如果您要通过 REST API 收集数据,并且您可能没有正确解析响应,那么值将会丢失。)
- 不可用:对于给定的观察,没有足够的数据可用(例如,如果有一个名为“学院”的特征,但是该观察(人/运动员等)没有上过学院,那么显然该值将为空。)
- **故意 NaN 插补:**这可能发生在 Kaggle 等编码竞赛中,其中部分挑战是处理缺失值。
照片由 GeeksForGeeks
您应该处理缺失值的原因是因为许多 ML 算法需要数字输入值,并且不能对缺失值进行操作,因此如果您尝试运行缺失值的算法,它将会响应一个错误(scikit-learn)。然而,一些算法,如 XGBoost,将基于训练损失减少来估算值。
缺失值的处理方法:
有两种方法可以用来处理丢失的值:
- 插补:使用某种方法填充数据
- 删除:删除缺失值的行
虽然没有真正的"最佳"选项,但是通常 估算数据比删除数据更好,因为不这样做可能会导致大量信息丢失,以及更有可能对数据进行欠填充的模型。
然而,请注意,有时删除行可能是更好的选择,因为它创建了一个更健壮的模型,并且可以加速训练。
好吧,我知道你可能很想得到深度学习法(我知道,太神奇了!).所以,事不宜迟,让我们来了解一下技术!
策略 1: KNNImputer
图片来自维基百科
这种方法基本上使用 KNN,一种机器学习算法,来估算缺失值,每个值是在样本附近找到的 n_neighbors 个样本的平均值。
如果你不知道 KNN 是如何工作的,你可以看看我关于它的文章。但本质上,KNNImputer 将执行以下操作:
- 测量新样本和第 N 个最近样本之间的距离(由N _ neighbors参数指定)
- 基于其最近的邻居,它将把第 N 个最近的非空邻居的平均值作为缺失值。
KNNImputer 在行动
让我们看一个使用 KNNImputer 的简单例子:
import pandas as pd
import numpy as np
from sklearn.impute import KNNImputerdf = pd.read_csv('[https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'](https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'))
我们将使用著名的泰坦尼克号数据集作为我们的示例数据集。
接下来,我们检查哪些要素缺少值:
df.isnull().sum()OUT:
passengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
使用这种方法,我们可以看到哪些值需要估算。
df = df.drop(['PassengerId','Name'],axis=1)
df = df[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare", "Age"]]df["Sex"] = [1 if x=="male" else 0 for x in df["Sex"]]
在这里,我们删除了一些不需要的特征,并快速地对我们的性特征进行一次性编码。
注意:通常人们会做一些特性工程和转换,但这不是本文的目的,因此我跳过这一部分。然而,在一个正常的项目中,您应该总是正确地检查和清理您的数据。
接下来,我们实例化我们的 KNNImputer,并给它一个 n _ neighbours 值 5。
imputer = KNNImputer(n_neighbors=5)
imputer.fit(df)
现在剩下要做的就是转换数据,以便估算值:
imputer.transform(df)
这就是你要的。KNNImputer。scikit-learn 再次使这个过程变得非常简单和直观,但是我建议在 Github 上查看这个算法的代码,以便更好地理解 KNNImputer 真正做了什么。
KNNImputer 的优点:
- 可能比平均值、中间值或众数更准确(取决于数据集)。
KNNImputer 的缺点:
- 计算开销很大,因为它存储在内存中的整个数据集中。
- 对异常值非常敏感,因此估算值可能会导致模型无法尽可能好地运行。
- 您必须指定邻居的数量
策略 2:通过链式方程进行多重插补(小鼠)
照片可以从栈中找到
这是一种非常强大的算法,其基本工作原理是选择一个具有缺失值的要素作为目标变量,并利用回归模型根据数据集中的所有其他变量来估算缺失值。
然后,它以循环方式重复这一过程,这意味着将针对所有其他要素回归每个缺失值的要素。
有点迷惑?没错。这就是为什么它的…类比时间!
用类比的方法理解老鼠
假设您的数据集具有以下特征:
- 年龄
- 性别
- 身体质量指数
- 收入
而每个特征,除了性别,都有缺失值。在这个场景中,鼠标算法将执行以下操作:
- 对于每个缺少值的特性(年龄、身体质量指数、收入),您用一些临时的“占位符”来填充这些值。这通常是要素中所有值的平均值,因此,在这种情况下,我们将使用数据的平均年龄填充缺失的年龄,使用身体质量指数的平均值填充缺失的身体质量指数,等等。
- 返回到缺少一个要估算的要素。因此,如果我们选择估算年龄,那么年龄将是一个缺少值的要素,正如我们在上一步中估算其他要素一样。
- 回归所有(或部分)要素的年龄。为了使这一步起作用,删除 age 可能包含的所有 NaN 值。本质上我们是在拟合线性回归,年龄是目标特征,其他特征是独立特征。
- 使用之前拟合的回归模型来预测缺少的年龄值。(**重要提示:**当年龄稍后被用作独立变量来预测其他特征的缺失值时,观察值和预测值都将被使用)。随机成分也被添加到该预测中。
- 对所有缺失数据的要素(在本例中为身体质量指数和收入)重复步骤 2-4
当鼠标算法完成了从 1 到 5 的所有步骤时,这就是所谓的**循环。**通常,鼠标需要用户浏览数据 5-10 次左右。
一旦我们到了最后一个周期,我们输出一个估算数据集。通常,我们希望在数据集的 5 个副本上运行该算法,然后将池我们的结果放在一起。完成此操作后,我们可以分析结果并报告综合结果。
老鼠在行动
虽然这些步骤可能看起来漫长而困难,但多亏了我们的朋友 scikit-learn,实现 mice 就像做馅饼一样简单:
import numpy as np
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputerdf = pd.read_csv('[https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'](https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'))df = df.drop(['PassengerId','Name'],axis=1)
df = df[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare", "Age"]]df["Sex"] = [1 if x=="male" else 0 for x in df["Sex"]]
注意:确保在导入迭代估算器之前导入enable _ iterative _ inputr函数,因为该特性被归类为实验性的,否则将导致导入错误。
现在让我们调用实例化 IterativeImputer 类:
imputer = IterativeImputer(imputation_order='ascending',max_iter=10,random_state=42,n_nearest_features=None)
这里需要注意一些事情:
max_iter :返回插补数据集之前要进行插补的周期数
**插补 _ 顺序:**特征插补的顺序。
可能的值:
升序
从缺失值最少的特征到最多的特征。
降序
从缺失值最多的特征到最少的特征。
罗马
从左到右。
阿拉伯文
从右向左。
随机
每轮随机下单。
n_nearest_features :用于估计每个特征列缺失值的其他特征的数量。特征的接近度由绝对相关系数决定
random_state: 为使您的结果可重复而设置的随机种子
接下来,我们只需将它与数据相匹配,并对其进行转换!
imputed_dataset = imputer.fit_transform(df)
鼠标的优点:
- 非常灵活,可以处理二进制和连续值
- 通常比简单的均值/众数/中位数插补更准确。
鼠标的缺点:
- 计算量很大,因为它存储数据集并循环 N 次。
- 对于大型数据集可能会很慢
策略 3:利用深度学习进行插补
由计算机科学维基拍摄的照片
这可能是现有的最强大和最准确的插补方法。它本质上利用 MXnet 的深度神经网络来预测缺失值。它非常灵活,因为它支持分类变量和连续变量,可以在 CPU 和 GPU 上运行。
行动中的深度学习归因
我们正在使用的库名为 datawig 。来安装它。只需运行:
pip3 install datawig
在您的终端/命令行中。
import pandas as pd
import numpy as np
import datawigdf = df.drop(['PassengerId','Name'],axis=1)
df = df[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare", "Age"]]df["Sex"] = [1 if x=="male" else 0 for x in df["Sex"]]
现在,我们将实例化 datawig 的 SimpleImputer 类:
imputer = datawig.SimpleImputer(
input_columns=['Pclass','SibSp','Parch'],
output_column= 'Age',
output_path = 'imputer_model'
)
这里需要注意一些参数:
- input_columns :包含我们想要估算的列的信息的列
- output_columns: 我们要为其估算值的列
- 输出 _ 模型:存储模型数据和度量
接下来,我们将估算值与我们的数据进行拟合,估算缺失值并返回估算数据框架:
# Fit an imputer model on the train data
# num_epochs: defines how many times to loop through the network
imputer.fit(train_df=df, num_epochs=50)# Impute missing values and return original dataframe with predictions
imputed = imputer.predict(df)
这就是深度学习的估算方法。
深度学习插补的优势
- 与其他方法相比相当准确。
- 它具有可以处理分类数据的功能(特征编码器)。
- 它支持 CPU 和 GPU。
深度学习插补的缺点
- 在大型数据集上可能会很慢
- 一次只能估算一个特征
- 您必须指定输入和输出列
结论
总而言之,我们必须承认,没有一种有保证的策略可以永远适用于每一个数据集。有些方法可能对一个数据集非常有效,但对另一些数据集则很差。
因此,检查您的数据,看看您应该如何输入值,以及使用什么策略总是好的。确保对不同的插补方法进行交叉验证,看看哪种方法最适合给定的数据集。
我希望你喜欢这篇文章,非常感谢我所有的追随者,他们让我保持不断的动力和求知欲!我希望你今天学到了一些新东西,请继续关注,因为我还有更多内容要发布!
照片由普里西拉·杜·普里兹在 Unsplash 上拍摄
终身学习需要的三个视角
获得数据科学和 MBA 硕士学位后的升级课程
作为一名最近的数据科学毕业生,我一直感到一种健康的毕业焦虑。用不确定的事物代替熟悉的事物。应对工作的高压。弄清楚“我这辈子要做什么?”这些是一些主题,但是我不想谈论它们,尽管它们都很重要。在我的毕业焦虑中,最突出的线索远没有那么明显,更长远,而且令人惊讶地被以前的学生忽略了:我们思考和对待终身学习的方式。
为了让我正在穿越的交叉点有意义,我决定描述三个从根本上改变了我思考学习方式的观点。没有一个要点是技术性质的,更不用说特定于任何内容领域。这是故意的。数据科学专业人员面临着在职业生涯中获得大量“什么”的问题,工具和技术的选择将不断发展。不变的(也是更难遇到的)是我们必须在持续的数据科学教育中坚持的高层次观点。
1。你的答案的质量取决于你的问题的质量
我曾经开玩笑地告诉自己,伟大的数据科学家和平庸的数据科学家之间的唯一区别是一个人在谷歌上搜索他们的问题的熟练程度。这个笑话的核心(以及与现实世界相似的部分)是:伟大的问题胜过伟大的证据。Roger Peng 写了关于这一点,他描述了数据科学家如此努力地优化一种方法,却忽略了构建适当问题的陷阱。这是一个听起来非常像金锤偏见的盲点,发生在很大程度上是因为数据科学家(包括我自己)喜欢闪亮而复杂的工具,不幸的是,这些工具更多的是掩盖而不是明确问题。
我在商学院也见过同样的“证据胜于问题”现象。我们倾向于使用相同的通用框架:一个细分竞争的矩阵,一个增长盈利能力的树形图,一个显示需求弹性的定价模型。所有这些都擅长简化外部世界,但它们的应用在实践中要微妙得多。我相信,所需要的是“提问”技巧中的例外主义——涉及、探索和阐明个人或部分人群的隐藏需求。虽然我很感激我从研究生院带走了这么多有启发性的框架,但我教育的最大价值是学会了如何利用问题的惊人力量。
提出伟大的问题有两点值得注意:有提出问题的创造力和有提出问题的勇气。那么,今天我们能做什么来提出更好的问题呢?当我回顾我的研究时,设计思维是我为提高我所提问题的质量而做的最有价值的一件事。虽然在设计思维领域有很多伟大的金块,但最大的想法是移情 *。*同理心使你(一个局外人)能够近距离接触到你正在为其设计解决方案的人,无论是顾客、客户还是同事。首先,你不仅要熟悉被问到的问题类型,还要熟悉实践者坚持设计思维过程的方式。
逐步完成设计思维过程就是遇到了无拘无束的提问艺术。我数不清有多少次我不得不拒绝相信“我明白了”或“我有解决办法”的诱惑。知道你需要问题是一回事,但是给提问过程带来纪律和耐心是完全不同的另一回事:前者只是触及表面,而后者挖掘出深刻的洞察力。当你不断改进和强化被问到的问题时,纪律就以反复面试的形式出现了。耐心来自于不断挖掘每个观察背后的“为什么”。结果是对利益相关者以及他们思考、感受和行为的环境有了深刻的理解。这种理解能够在当下产生可操作的洞察力,并为未来开启更高形式的学习。我们不是通过对算法和框架的死记硬背,而是通过对我们需要问的问题的高度感知来达到目的。
就像我以前的教授常说的:
“错误问题的正确答案仍然是错误的答案。”
**那又怎样:**听。重新表述你所听到的。换一种方式问。重复一遍。
2。力量和弱点是有条件的替代品:力量因自我而变弱,弱点因真实性 而变强
我两年前下的一个决心是变得擅长用数据讲故事(这是我想要强化的优势),而不是构建伟大的预测模型(这是我选择搁置的弱点)。当我回顾这些技能的演变时,我发现我的数据叙事愿望是正确的:一位客户对我从他们的数据中获得的见解感到高兴,一位教授称赞我对商业机会的介绍,一位学生误认为我是专业的推动者。这里很容易看出强项叙述:先天实力×毅力=超级能力。不太明显的是一对条件变量,它们让优势成为你的弱点,让弱点成为你的优势。
第一个变量是自我,它警告我们最好的属性也是我们的致命弱点。我曾经参加过 USAFacts 数据可视化挑战赛,这是一个全校范围的比赛,似乎正合我的胃口,如果获胜,将有机会见到世界上最有影响力的商业领袖之一,前微软首席执行官史蒂夫·鲍尔默。和四个同学一起,我花了几个小时在数据中寻找正确的故事——如果说实话,我有点狂妄自大:我是一名正在接受培训的数据科学家,在一个充满数据的竞技场上与几十名 Excel 爱好者竞争。如果你听到我说我从未期望过获得高分,那一定是在撒谎。
第二天,在一次练习中,我的团队的可视化被教授和同学提名为比赛中“不要做什么”的示范展品:它提供了太多的信息,包含了过多的华而不实的干扰,并且未能清楚地传达预期的信息。过度自信削弱了我。我不需要更多的说服,它会再次得到我,如果它不加检查。
第二个变量是真实性,它建议你将自己的弱点与透明度结合起来。现在,我并不是说要以脆弱的精神在屋顶上尖叫你的弱点。然而,我学到的是,对你自己和你的同事开放你希望改进的地方。关于弱点,有两点需要记住:
- 首先,我们不必全心全意地忽视它们。有时,我可能需要建立一个预测模型,这将有助于达到令人满意的熟练程度,而不是停留在功能失调的无能水平。
- 第二——这与传统观点相反——当你以正确的态度对待你的弱点时,它们很有可能成为你的优势。
我从未想过有一天我会在我天生不擅长的方面变得“比一般人更好”,但在我之前的人已经找到了实现这种阶跃变化的途径。在学校的最后一周,一名校友回到课堂,分享了他在一家财富 50 强公司担任首席执行官和董事长的经历。他用 20 分钟的时间反思了自己是一个多么平庸的学生,甚至详细描述了几十年后仍萦绕在他心头的一次糟糕的课堂演讲的记忆。所有这些都是为了强调,今天的明显弱点(在他的例子中,是管理沟通)不一定会阻碍你明天成为行业的领导者。这是一个有着令人印象深刻的资历的人,他当时说得如此雄辩,却放弃了他的过去的如此不同的画面。这种不和谐非常吸引我,他的建议在我脑海中形成了一个关于终身学习的具体教训。套用他的话:
“我把弱点和真实联系在一起。早期,人们因为我擅长什么而尊重我——以至于当谈到我缺乏什么时,他们会支持我的缺点,这要归功于信任的基础。承认并公开自己的弱点是克服它的关键。”
那又怎样: 保持谦逊。保持开放。
3。管理自我是成功的基石——在数据科学、商业和生活中
在运营管理中,有一个常见的案例是这样的:
你正在创建一个产品,并且正在考虑增加哪些功能。你的选择是快速交货 ,或者 廉价生产 。选择两者的任意组合,因为同时满足这三个条件的可能性很低。
想要便宜又快速?去吃麦当劳,但别指望米其林星级质量。模型提醒你,每一次努力都需要你权衡取舍,做出决定。在思考了所有这些之后,我受到启发,为我自己的个人困境画了以下图表:
双学位爸爸问题
目标是在这三方面都做得好。但我该如何在备受追捧的文本分析培训和高度实用的小企业咨询之间做出选择呢?我可以和我的儿子们共度几个晚上来换取几个小时的数据可视化竞赛吗?答案似乎不言自明,但对我来说,它们是经常发生的事情,也是困惑和遗憾的共同来源。
作为研究生选择学习重点和作为专业人士选择工作重点没什么区别。真的很难。面临无数请求的数据科学家必须平衡哪些是新颖的,哪些是重要的,哪些是对公司可行的。危机中的总经理必须知道现在做什么决策,以后做什么决策,把什么事情委托给别人。如果成功是由学习使能的,而学习是由时间支配的,那么时间是由什么力量委托的呢?我什么都不知道,只知道我自己的失望表明我没有足够深入地思考我最重视的事情,以及我可能将它们结合起来的方式。
在我寻找答案的过程中,研究生院提供了一个意想不到的指南针:文学。在亚里士多德和本杰明·富兰克林的书中,我发现了创造更好学习习惯的方法。在像大卫·布鲁克斯和 T21 这样的同龄人中,我找到了定义和衡量我成功的蓝图。不久之后,我开始每天花一个小时进行反思,在那里我会列举每天的想法和活动,以便辨别哪些是重要的,哪些是可以放弃的。在研究生院尝试这一切,起初感觉就像在泳池跳水,对如何狗刨式游泳只有模糊的概念。然而,渐渐地,救生衣分两批出现:
- 目的明确(去掉不重要的东西)
- 创造性重组(在现有材料中寻找联系)
目标明确通常能为投入的时间带来最大的回报,尤其是在工作和生活方面。虽然你肯定不需要一个硕士学位来找到你的目标,但在一段漫长的艰难时期,有必要关注你的“为什么”并确定你的原则。对我来说,研究生院并没有定义我的目的,但这是一个奇妙的揭示它的迫使机制。
我发现的第二个想法叫做创造性重组。我曾经认为,管理自己就是尽职尽责地使用强大的规划工具——创建主列表、按日历工作、同步虚拟助理。没过多久,我就意识到这些工具更适合于取得小的进步,而不是想出重塑自我管理的方法。对我来说,改变游戏规则的策略源于重新定位,这是一种来自创新研究的技术,它问“我身边有什么,通过合并它们我能利用什么机会?”
例如,在研究生院的最后一个季度,我首先阐明了我需要追求的学习成果:能够在真实的应用医疗保健问题中设计和实现一系列机器学习算法。这听起来很简单,但这种专注是我发现在我的生态系统中有哪些“重组体”的一个重要原因:将我与医生联系起来的教授*,医生非常了解医院面临的业务问题,这可以提供大量的数据。业务和数据科学元素已经在等待了,当它们合并在一起时,它们开辟了一个学习里程碑,否则单独追求会更加困难和耗时。我只是需要更多的关注和创造力。这是一个强有力的警钟,我相信它将在未来几年激励和维持我的数据科学学习。*
那又怎样: 明确你的目的,制定指导原则,并坚持下去。
收尾思路
如今,自学数据科学并不缺乏资源。虽然这种丰富可以提升终身学习的努力,但它也会以三种微妙的方式侵蚀这些努力:
- 当我们强调证据多于问题时
- 当我们屈服于优越感时
- 当我们错误分配时间和精力时
因此,在您开始学习新的数据科学课程之前,请记住,加快学习曲线不仅仅是以附加的方式收集技术。这也是关于用更高的视角来复合学习的效果。我们朝着这个方向前进,将注意力转移到(1)对我们面临的问题有更细致的理解,(2)对队友真诚坦诚,以及(3)清楚地意识到我们为什么选择钻研一个想法。
为了更好地了解你的用户,你必须知道的 3 个变量
用户、顾客或受众:多少,多少,多久一次?
迈克·什切潘斯基在 Unsplash 上的照片
T 根据产品或服务的不同,它们有不同的名称,无论我们谈论的是用户、客户或受众,媒介或网络平台,还是衡量的方法。但无论你是否拥有一家餐厅、一个应用程序或一个电视广播频道,你都必须了解它们。
别担心,你不需要成为数学家就能理解它们。
餐馆的模型
每个人都去过那家很受欢迎的餐馆,那里总是挤满了食客,很难找到座位。你猜这是一个成功,你甚至私下想有一个这样的企业。
但客户数量是一个不完整的衡量标准。如果每个顾客只是要一杯咖啡会怎么样?你可以为客户创造完美的体验,一个伟大的环境,卓越的服务,但这可能不是你的服务或产品的目标。
所以,在餐馆里,顾客的数量不足以衡量成功。你需要知道他们在这上面花了多少钱。
让我们假设这家餐馆有大量的顾客,每个人的平均消费也不错。这个概念很棒,每个人都想了解这家餐厅。在最初的几周,也许是最初的几个月,餐馆里挤满了顾客。但是突然,有一天你从它面前经过,发现它是空的。发生了什么事?
再说一次,你为顾客创造了最好的体验,一个很棒的环境,优质的服务,但是出于某种原因,顾客不会再回到餐厅。
因此,在一家餐馆里,顾客数量和消费金额不足以衡量成功与否。你需要知道他们来餐馆的频率。
网站、应用程序、服务或产品也是如此。
1.到达
你需要知道你有多少用户、客户或受众。为此,您需要定义用户、客户或受众的含义。
在餐馆里,这似乎是显而易见的。每个支付最低金额的人。但要小心,因为你可以有一个人谁支付,但一个或多个来与她或他吃饭。你应该衡量食客。
用户可以是使用你的应用的人。但在这些时候,下载是不够的,所以你可以将你的用户定义为订阅者,或者基于应用程序中的一些交互。
对于电视和视频来说,观众通常是根据最少消耗的秒数或分钟数来定义的,但在电影中是根据门票来定义的。
在广告和媒体中,你使用词语 受众到达 意味着在给定的时期内,不同的人至少接触过一次媒体的总数。
在社交媒体营销中,您使用了术语社交媒体接触,它指的是在社交平台上接触过特定内容的用户数量。
无论我们谈论的是用户、顾客还是受众,你都必须知道你接触了多少人。
2.平均花费
一旦你定义了你的顾客,你需要知道他们在你的餐馆消费了多少。在这种情况下,你必须考虑到每一个用餐者,而不仅仅是付钱的人。一般来说,这被称为每位顾客的平均花费,在餐饮业中被称为每位用餐者的平均花费。
在某些情况下,您希望增加客户数量。但是一旦你有了足够多的顾客(你的桌子都坐满了),你就想增加每个顾客(或用餐者)的平均消费。
在电视、音频或视频等媒体中,交换的货币是时间。你可能听说过注意力经济。嗯,衡量你的产品或服务得到多少关注的唯一方法是通过观众花在它上面的时间。
如果你提供一个 60 分钟长的播客或视频,每人平均花费 30 分钟,你说你的内容有 50%的保真度*。*
一旦你有了用户或观众,你希望他们在你的产品或服务上花更多的时间。
一些在线服务或应用程序也是如此。在 web analytics 中,保真度被称为页面平均停留时间。但在大多数 web 和 app 案例中,时间并不是度量的统一,因为它没有太大意义。
你还记得你的用户旅程或者你的用户流吗?还是你的营销漏斗?嗯,你通过它建立某些互动,你衡量你的用户走了多远。例如,在游戏中,你有关卡或阶段。在登录页面上,您可以在行动号召之前执行一些步骤。
在 web analytics 中,除了在页面上的平均时间,你还有每个用户的会话数,每个会话的平均时间…所有这些都是同一个概念的变体。
然而,无论你衡量的是金钱、时间还是行动,这都是一个试图衡量与你的目标相关的用户行为的变量。或者换句话说,用户做什么。
3.频率
在餐馆里,如果你把每个顾客的账单或购买作为你的第一个衡量标准,你将无法识别顾客和他们的行为。例如,在一周内,你可以有一百张账单或购物单。但这并不意味着你有一百个顾客。有些顾客可能每天早上都来吃早餐,有些则一周来几次。
识别客户有助于测量重要的变量,如回头客的百分比。不管顾客已经回头客多少次,你的顾客中有多少是回头客?15%, 20%, 50%?**
但最重要的是,你可以计算出购买频率,即你的客户在给定时期内返回的平均次数。
对于一家餐馆,你可以用几周或几个月的时间。例如,你的顾客每月来你的餐馆两次。请记住,我们谈论的是平均值。你有几乎每个工作日都来的大客户,也有永远不会回来的客户。
在实体店的情况下,你如何识别顾客而不是账单或购买?你见过那些“顾客忠诚卡”吗?忠诚度计划的优势之一是你可以从中获得数据。
在媒体和广告中,频率也是一个人接触内容的次数。这在广告中很重要,因为为了传递广告信息,观众需要不止一次地看到它。根据内容的不同——从简单的品牌信息到带有说明的具体促销活动——活动可能需要或多或少的频率。
在网站和应用上,你有回头客或用户。你可能在社交网络或订阅服务中听过“活跃用户”这个词。有时用户数量不够,您希望将用户定义为在给定时间段内使用过该服务或登录过该服务的人。
与餐馆的例子及其购买与客户的情况类似,在 web 和应用程序中,您可能有很多视图、下载或任何定义的交互,但识别实际用户很重要。某些视图、下载或交互可以由同一用户多次完成。
变量有变化
这只是对了解你的用户的 3 个基本变量的介绍。考虑到一旦你有了这些变量的数据,你就可以测量它们的变化或片段而不仅仅是平均值。
例如,你可以根据不同种类的顾客或用户花了多少钱,他们来的频率,或者任何有用的人口统计学分类,比如流派,年龄,学者等等。一个目标是一个特定的人口统计。要不要多卖给青少年?嗯,你把青少年定义为你的目标,开始衡量他们的行为。
或者你可以找出你的重度用户,并试着了解他们相对于轻度用户的特征。当你开始玩数据的时候,天空就是极限。
外卖食品
了解你的用户、客户或受众是提供更好的服务、产品、内容或体验的基础。这是适用于任何类型企业的三个基本变量。
下一次,尝试使用餐馆示例作为参考:用餐者的数量、每个人的支付金额和返回频率。
在某种程度上,这些变量对于任何一个拥有餐馆或商店的人来说都是直观的。但在其他层面上,如果我们理解并利用它们,它们可以为我们的决策提供大量信息。