如何将 Salesforce 与 Python 集成
使用 Python 构建轻量级 Salesforce 数据集成管道
如果您是一名 B2B 开发人员,正在开发一个产品,最早的产品开发阶段之一就是创建一个数据集成管道来导入客户数据。
在本文中,我将向您展示如何利用 Singer 的 tap-salesforce 从 salesforce 提取数据。在这里,我将带您了解如何使用 target-csv 解析来自 Singer 的 JSON 输出数据,并使用一个简单的 Python 脚本将其标准化。
来源: unDraw
笔记
这些例子的代码可以在 GitHub 这里上公开获得,还有我将带你浏览的信息的描述。
这些示例依赖于几个开源 Python 包:
- tap-salesforce: 歌手点击从 salesforce 提取数据。更多关于 GitHub 的信息。
- target-csv: 一个 Singer 目标,将输入的 JSON 数据转换成 csv 文件。更多关于 GitHub 的信息。我们将使用 hotglue fork ,它使用更新的依赖关系。
- 歌手发现:一个从歌手目录中选择数据流的开源工具。更多关于 GitHub 的信息。
- pandas: 一个广泛使用的开源数据分析和操纵工具。更多关于他们的站点和 PyPi 的信息。
- gluestick: 一个小型开源 Python 包,包含由 hotglue 团队维护的 ETL 的 util 函数。关于 PyPi 和 GitHub 的更多信息。
事不宜迟,我们开始吧!
步骤 1:设置我们的环境
创造虚拟
Singer taps 之间往往会有很多依赖冲突——为了避免依赖地狱,我强烈建议在虚拟环境中运行这个示例。
# Install JupyterLab if you don't have it already
$ pip3 install jupyterlab# Create the virtual env
$ python3 -m venv ~/env/tap-salesforce# Activate the virtual env
$ source ~/env/tap-salesforce/bin/activate# Install the dependencies
$ pip install tap-salesforce git+[https://github.com/hotgluexyz/target-csv.git](https://github.com/hotgluexyz/target-csv.git) gluestick pandas ipykernel singer-python==5.3.1 https://github.com/chrisgoddard/singer-discover/archive/master.zip# Make our venv available to JupyterLab
$ python -m ipykernel install --user --name=tap-salesforce# Create a workspace for this
$ mkdir salesforce-integration# Enter the directory
$ cd salesforce-integration
这些命令可能因您的操作系统和 Python 版本而异。关于 Jupyter 的 venvs 的更多信息,请查看这篇关于数据科学的文章。
步骤 2:配置歌手抽头
获取 OAuth 凭证
首先,您需要 Salesforce OAuth 凭据。Salesforce 已经很好地记录了这个过程,所以我假设你可以遵循这个指南。
创建歌手点击配置
现在我们必须创建一个歌手配置。这将指定我们的 OAuth 凭证和一些特定于 Singer 的设置。他们的示例配置具有以下格式:
{
"client_id": "secret_client_id",
"client_secret": "secret_client_secret",
"refresh_token": "abc123",
"start_date": "2017-11-02T00:00:00Z",
"api_type": "BULK",
"select_fields_by_default": true
}
填写您的凭证,并将其保存到本地目录中名为config.json
的文件中。
跑步歌手发现
从 Salesforce 获取数据的第一步是找出实际可用的数据。Singer taps 提供了一个 discover 命令,它打印一个描述所有这些内容的 JSON 对象。让我们现在运行它:
# Do the Singer discover and save to catalog.json
$ tap-salesforce --config config.json --discover > catalog.json
如果成功,您的 catalog.json 应该如下所示:
# Check discover output
$ less catalog.json
{
"streams": [
{
"stream": "UserProvisioningRequestShare",
"tap_stream_id": "UserProvisioningRequestShare",
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"Id": {
"type": "string"
},
...
告诉辛格我们想要什么
在这里,我们想要选择我们实际想要同步的对象。为此,我们将使用之前下载的 singer-discover 实用程序。
# Switch singer-python version to meet singer-discover dep
$ pip install singer-python==5.4.1# Build our selected catalog
$ singer-discover --input catalog.json --output properties.json
这将启动一个交互式实用程序来选择您希望从 Salesforce 获得的流(对象)。我将选择引线(空格)并按回车键。这将提示您选择特定字段的选项。我将接受默认值并按 enter 键。
潜在客户流的选定字段
这将为您提供以下输出
? Select fields from stream: `Lead` done (55 selections)
INFO Catalog configuration saved.
运行歌手同步
现在,我们最终可以使用我们生成的文件从 Salesforce 获取数据,使用以下命令:
# Get Lead data from Salesforce and save as a CSV
$ tap-salesforce --config config.json --properties properties.json | target-csv > state.json
这将输出两个文件:
- 包含来自 Salesforce 的数据的 CSV(类似于
Lead-20210128T125258.csv
) - 一个 JSON 文件
state.json
告诉tap-salesforce
它最后同步了什么。这可以在未来反馈给 tap-salesforce,以避免再次同步相同的数据。
终于!我们已经从 Salesforce 获取了数据!不算太坏,对吧?如果你想在生产中使用它,你必须自动化创建properties.json
的过程,并且很可能将所有这些粘贴到 Docker 容器中(非常类似于 hotglue 和 Airbyte 的工作方式)。
步骤 3:标准化数据
您可以在 Jupyter 笔记本中直接阅读这一部分(随意复制并尝试您自己的转换)。
https://github.com/hotgluexyz/recipes/blob/master/src/salesforce.ipynb
看数据
先来看看tap-salesforce
给了我们什么。
来自 Salesforce 的销售线索 CSV
不算太坏,对吧?让我们将数据加载到 Jupyter 笔记本中,并稍微整理一下数据。对于本文,我将保持它非常简单,但是如果你想了解其他 ETL 操作,请查看我的 TowardsDataScience 文章。
发射 Jupyter
让我们发射 Jupyter
# You may have some issues in Jupyter if you don't do this
$ pip install prompt-toolkit==3.0.14# Deactivate the virtualenv
$ deactivate# Start Jupyter Lab
$ jupyter lab
这应该会在当前目录下启动 Jupyter 并打开浏览器。
JupyterLab 开始了
如果所有设置命令都有效,您应该在笔记本部分看到 tap-salesforce 可用。让我们用 tap-salesforce 内核创建一个新的笔记本。我将把我的名字命名为salesforce.ipynb
加载数据
让我们使用 gluestick 和 pandas 库来加载数据并查看一下。我们这里的目标是能够容易地操作 tap-salesforce 的输出。
熊猫数据框架中的数据预览
清理数据
现在我们有了熊猫的数据框架中的数据,你可以随意转换它。当然,你不局限于使用 Pandas——你可以使用 Spark,或者任何其他你喜欢的基于 Python 的数据转换工具。
示例最终数据
结论
后续步骤
这实际上只是数据集成管道的起点。如果你想更进一步(在云上编排,将它连接到你的产品上),值得看看像 hotglue 和 Meltano 这样的工具,它们都旨在使数据集成对开发者来说更容易。
考虑
我最近在 TowardsDataScience 上发表了一篇关于打造 Singer 的利与弊的文章。我建议在决定建立你的歌手管道之前,先看看 Airbyte 。
未来,你可以随意查看开源的热熔胶配方以获取更多样本。感谢阅读!我很乐意回答下面的任何评论或问题。
如何将 Python 类集成到 Plotly Dash 仪表板中
Dash 中面向对象编程的简要教程
乔尔·菲利普在 Unsplash 上的照片
介绍
在开发 Python 应用程序时,使用类和通用面向对象编程(OOP)概念可让您定制和加工代码,从而实现最大的灵活性和可用性。
尽管您可以很好地使用 Python,并且从不担心声明自己的对象,但是这样做可以使您的代码和应用程序更上一层楼,并且总体上使您成为一个更有意识和更全面的开发人员。
如果您以前从未使用过 Python 中的类,并且希望了解更多,请在下面找到我以前的一篇文章,在这篇文章中,我给出了一个项目的概述,您可以从这些项目开始,以发展关于类如何工作的基础知识。
💔-useful-projects-to-learn-python-classes-cf0076c36297>
在本文中,我将提供一个将灵活的类对象嵌入到一个简单的 Plotly-Dash python 应用程序中的例子。 Plotly-Dash 是一套面向用户界面的库和框架,用于各种数据可视化用例。
应用概览:项目回收跟踪
描述
下面提供的用于本教程的示例应用程序是一个简单的 Dash 应用程序,名为项目回收跟踪器;该应用程序的目的是提供一个估计时间的图形概览,以摊销为任何特定项目支付的货币价值。
在这个例子中,我很想知道我需要多长时间才能收回对一辆全新自行车的 425 美元投资,假设定期两周使用一次,平均机会成本为 4.8 美元(相当于我没有使用/拥有我的自行车时一次典型乘坐的公共汽车/地铁票的成本)。
该应用程序将初始成本、使用价值和使用频率作为输入,并以图形方式呈现摊销图/时间线,同时提供估计收回投资所需时间的文本结果。
在这种情况下,我需要在将近一年(45 周)后,或者 89 次骑行后归还我的自行车!
现在,您对这个应用程序的上下文更加熟悉了,让我们看看如何在 Python 后端潜在地利用 Python 类来定义并使用我们的跟踪器功能。
我们的物品回收追踪应用程序(来源:作者)
代码概述
我们的简单应用程序使用了两个 Python 脚本:
- Payback_Calculator.py: 您可以在其中定义我们自己的回报跟踪器类对象及其功能的脚本
- Payback_Application.py: 运行和渲染 Plotly Dash 应用程序的脚本
现在让我们从类实例化到应用程序呈现,一步一步地检查这两个脚本。
1)定义我们的定制类:回报跟踪器
类实例化和属性
Python 中的类用 class 关键字初始化,后跟类名。下面的代码创建并命名了一个 Payback_Tracker 类。
在实例化时,Python 类使用内置的 init() 函数来赋予类属性。属性是可以附加到给定类实例的类对象属性,这取决于它的定义和您计划对类及其对象的使用。
这个 Python Tracker 类在实例化时接受 5 个显式给定的属性( name、initial_cost、usage_benefit、frequency、period )加上 3 个其他属性,如下所述:
名称:类对象实例的名称(即“bike”)
initial_cost :表示所需前期投资的项目成本
usage_benefit :使用该物品所提取的机会成本的货币价值
频率:该物品在一段时间内的使用频率
**未偿余额:**剩余的待摊销货币价值。在实例化时,即初始投资时,它等于 initial_cost
周期:使用周期参考(即“每日”、“每周”、“每月”或“每年”使用)
Tracker 实例还初始化了三个附加属性,当项目被所有者“使用”和分期偿还时,它将利用这三个属性来跟踪相关的对象信息:
**balance _ history:**outstanding _ balance值的集合,跟踪器使用这些值来跟踪项目的回报历史。初始化为一个列表,第一个 outstanding_balance 值作为初始值。
**pay back _ counter _ period:**自使用开始后经过的周期数。初始投资时初始化为 0。
usage_total: 记录在任何给定时间项目使用的总货币等值。(即,在购买该物品并使用 2 次后,使用收益为 4 美元,一段时间后的使用总价值为 24 美元=8 美元*)
类方法
使用类方法,您可以通过自定义功能来丰富我们的跟踪器,并通过该类的典型函数(方法)来定义其行为,从而很好地利用您的类属性。
我们的 Payback_Tracker 类有三个方法:
get_result(): 给定对象的 initial_cost , usage_benefit,frequency 和 period ,返回估计的使用次数,或 period 属性中定义的 period。
来源:作者
**generate _ balance _ history()😗*以降序(从项目的初始投资价值开始)返回一个摊销值列表,它表示有待偿还的初始项目的价值。随着使用量线性减少。
来源:作者
get_balance_history(): 返回按照*generate _ balance _ history()*方法生成的摊余值列表
来源:作者
get_balance_data(): 返回项目的 balance_history 的数据帧格式版本
这个 Payback_Tracker 类现在有了自己的属性和方法,给定它的输入,它可以计算一个项目的分期偿还历史和时间表。
现在让我们通过将对象嵌入到我们的 Plotly-Dash 应用程序中来实现这一切!
2)将回报跟踪器类嵌入到应用程序的功能中
回收跟踪器应用程序位于 **Payback_Application.py 中。**该脚本有三个主要部分,如下所述。
- 包导入和 Dash app 创建
首先,让我们导入必要的包来运行我们的 plotly-dash 应用程序(第 1-11 行);然后,我们的应用程序的实例可以用相关的破折号和初始化。服务器方法(第 13–15 行)。
注意这个脚本是如何从payroll _ calculator . py中导入我们的 Tracker 类的,这样就可以访问 payroll _ Tracker 类实例及其方法的定义(第 11 行)。
2。应用程序的 HTML 布局(带有一些内置的 CSS 格式)
接下来,我们的 HTML 组件可以作为一个列表定义到 app.layout 变量中。也可以参考上面这张 app 前端的图片,以供参考。
主要组件(嵌入到主容器 < div > 元素集合的开头)有:
- 一个 H1 表头,设置 app 的标题(“项目回收期计算器”)
- 一个 < div > 元素,包含 app 的描述,带有标题和副标题
- 一个附加的 < div > ,带有一个标题(表单图例)和三个段落 < p > 标签,提供用户输入字段周围的图例信息。
- 另一个 < div > 包含输入字段,供用户填写变量 Payback_Tracker 类将使用该变量来计算投资回报所需的估计时间:项目名称、初始成本、使用收益和频率,以及相关周期。这些元素被编码为 dash 应用程序中的输入元素,以便后端能够引用用户的输入,并将这些值存储为我们的类将在下一步中使用的变量。
- 布局以包含我们的数据输出图的 < div > 标记(id=’ output_graph ‘)和一个 < div > 标记(id=’ output_tex t ')结束,该标记将通过调用用户输入变量上的 get_result() 类方法来呈现输出
已经用一些额外但重要的内嵌 CSS 设计了我们的页面元素,现在你可以进入应用程序的主要功能部分了。
3。调用我们的 Payback_Tracker 类来启用应用程序的功能
我们的应用在 Dash 中的功能是由一个且只有一个函数实现的,这个函数叫做 generate_graph() 。该应用程序使用一个**Python decorator来定义该函数将使用的输入和输出组件。**
我们的 5 个输入组件来自输入元素,这些元素在前面的部分中被定义为布局的一部分,并由它们在 HTML 中的 ID 字段引用。它们在 generate_graph() 函数中作为参数传递,并对应于 Payback_Tracker 类的 5 个关键属性( name、initial_cost、usage_benefit、frequency、period )。
还定义了 2 个输出元素,分别是‘Output _ graph’和‘Output _ text’HTML 元素,它们将用于返回和呈现函数的输出。
*然后定义函数体。在用户用他/她的 5 个输入元素填写表单后,这些元素作为输入参数被传递给 generate_graph() 。然后,该函数使用这 5 个属性(第 11 行)创建一个名为 object_ 的 Payback_Tracker 类实例,并对这些输入连续调用*generate _ balance _ history()和 get_balance_data() 方法,将后者的结果存储在一个 data 变量中(第 13 行)。
使用这些数据,然后通过 plotly.express (px)库(第 15-18 行)创建一个条形图(存储在 fig 变量中)。
该函数返回两个 fig 变量,将其嵌入到两个输出元素( output_graph’ )的第一个中,然后还将调用 get_result() 方法的结果嵌入到 ‘output_text’ 元素中。
因此,每当用户填写表单时,5 个输入字段都被类用来:
- 创建该类的一个实例
- 在其属性上调用其方法
- 使用 generate_graph() 函数捕获输入,处理方法并将结果(图条形图条形图加上 get_resul t())呈现到 Dash HTML 布局中,每次用户修改表单中的输入字段时重复此工作流。
通过这种方式,您已经能够与 Dash 元素交互并通过您的自定义类处理它们,然后通过 generate_graph() 函数将可视化输出呈现给用户!
我们简单的应用程序的功能现在已经完成。
摘要、代码库、有用资源和后续步骤
我希望这个简单的例子可以作为一个有用的例子,说明如何潜在地利用您自己的类对象来用 Dash 创建数据可视化元素!
感谢阅读!
代码回购:https://github.com/edoard0/Item-Payback-Calculator
参考文献:
访问我的免费数据科学资源清单 这里
**https://edo-romani1.medium.com/membership **
如何解读模型:PDP 和 ICE
确定每个特征对模型输出的贡献。
M 模型的可解释性变得越来越有价值。然而,当处理具有复杂关系的大型模型时,解释并不总是一件容易的事情。
部分相关图(PDP)显示了不同特性对输出的边际贡献。它们用于显示单个特征或两个特征的贡献。
部分相关图也与个体条件期望(ICE)图高度相关。ICE 图显示了每个数据实例的预测变化。
这些图是模型不可知的,这意味着不管基础模型如何,它们都可以显示改变一个或两个特征如何影响模型的输出。
对于价格预测等任务,了解每个要素的 PDP 趋势对于理解模型如何使用新数据进行预测至关重要。理想情况下,这些 PDP 图应该可以解释和理解,以推动决策制定。
PDP 和 ICE
两个图使用相同的机制来模拟预测变化。但是,如果 PDP 观察到一个或两个特征的总体趋势,ICE 图会显示更细粒度级别的变化。
这些图可以并行使用,以了解预测的整体趋势,并检查有问题的个案。因为 PDP 显示了总体水平上的输出变化,所以丢失了特定实例的较小变化。因此,最好是看两种变化。
当预测任务是回归模型时,输出中显示的变化直接是预测中的变化。然而,在分类期间,输出变化是类别的预测概率的变化。
对于 PDP,为了估计部分函数,使用蒙特卡罗方法用训练数据计算平均值:
部分相关函数(作者图片)
例子
为了展示每一种方法,并浏览对图的解释,我使用了“鲍鱼”数据集。
这个数据集是在开放数据共享公共领域奉献和许可(PDDL)下许可的。
https://datahub.io/machine-learning/abalone#readme
该数据集的目标是确定鲍鱼的年龄。通常,这是通过切开球果,给球果染色,然后用显微镜计数球果的数目来完成的。不幸的是,用这种方法测量年龄非常耗时、有创且费力。
相反,使用八个特征,可以有效地预测年龄。这些特征是性别、长度、直径、高度、总重量、去壳重量、内脏重量和壳重量。该数据有 4177 条记录和八个特征。
PDP 和 ICE 图都可以从 sklearn 中的同一个包中生成。
from sklearn.inspection import plot_partial_dependence# PD Plots
plot_partial_dependence(model, X, [feature_name])
部分相关图(图片由作者提供)
相关图基于梯度推进树回归模型。
在图中,显示了“无壳重量”和“整体重量”的模型行为。鲍鱼的年龄预测值随着去壳重量的增加而降低。而对于“整体重量”,此特征的增加会增加预测年龄,但对于低值,预测不会改变。
此外,特征值的百分位数显示在每个图的底部。每个显著的黑色标记代表该特征的百分位数,增量为 10。
# ICE Plots
plot_partial_dependence(model, X, [feature_name], kind='individual')
部分相关和个体条件期望图(图片由作者提供)
接下来是高度的 PD 图和 ICE 图。在 PD 图中,随着数值的增加,趋势不再是线性的。一旦身高超过 0.3,身高就不再对整体年龄预测有贡献(用 0 的部分相关性指定)。
在 ICE 图中,这种模式在所有实例中都是一致的。身高越低,预测年龄越小。然而,当高度增加时,预测增加,直到高度超过阈值。
高度的分布导致了这种奇怪的行为。作为参考,最大值为 1.13,但在第 75 百分位,该值仅为 0.165。
这些图试图在每个特征的值的范围内建模。但是当大多数特征值集中到值的子集时,模型不能很好地学习这个范围。
因此,当新实例的高度值在此范围内时,我们无法确定。
from sklearn.inspection import plot_partial_dependence# PD Plots, 2-dimensional
plot_partial_dependence(model, X, [(feature_1, feature_2)], kind='both')
部分相关图(图片由作者提供)
最终部分相关性图观察到两个特征对最终输出的相互作用。这里显示了“整体重量”和“去皮重量”。
最终输出值的变化用轮廓的颜色显示,每个特征的先前行为仍然存在。
“整体体重”的增加一旦超过先前定义的阈值,预测的年龄就会增加。对于“去皮重量”,预测值随着值的增加而降低。所以对于这两个特性,并没有太多的交互。
结论
部分相关图和个别条件期望图是开始理解你的模型的好方法。此外,它们易于实现并适用于每种模型。
两个图都允许用户更好地理解他们的模型和暴露不一致的趋势以及不规则的模型行为。
这些图取决于监督学习任务中使用的基础模型。然而,它们揭示了整体和单个实例级别的模型行为。因此,它们允许你有效地解释你的模型。
如果你有兴趣阅读关于新颖的数据科学工具和理解机器学习算法的文章,可以考虑在 Medium 上关注我。
如果你对我的写作感兴趣,想直接支持我,请通过以下链接订阅。这个链接确保我会收到你的会员费的一部分。
https://zjwarnes.medium.com/membership
如何迭代熊猫数据框架中的行
讨论如何在 pandas 中迭代行,以及为什么最好避免(如果可能的话)
介绍
对 pandas 数据帧进行迭代绝对不是一个最佳实践,你应该只在绝对必要的时候,并且当你已经尝试了所有其他可能的更优雅和更有效的选择时,才考虑这样做。
遍历熊猫对象一般慢。在许多情况下,不需要手动迭代这些行,并且可以避免
— 熊猫文档
在今天的文章中,我们将讨论如何避免在 pandas 中遍历数据帧。在选择迭代方法之前,我们还将浏览一份“清单”,您可能每次都需要参考它。此外,我们将探讨在没有其他选项适合您的特定用例的情况下如何做到这一点。最后,我们将讨论为什么在迭代熊猫对象时应该避免修改它们。
真的需要遍历行吗?
正如 pandas 官方文档中所强调的,通过数据帧的迭代是非常低效的,并且通常可以避免。通常,pandas 新成员不熟悉矢量化的概念,也不知道 pandas 中的大多数操作应该(也可以)在非迭代环境中执行。
在尝试遍历 pandas 对象之前,您必须首先确保以下选项都不符合您的用例需求:
- 迭代矢量化 : pandas 提供了丰富的内置方法,其性能得到了优化。大多数操作都可以使用这些方法中的一种来执行。此外,您甚至可以查看一下
numpy
并检查它的任何功能是否可以在您的上下文中使用。 - **将函数应用于行:**一个常见的需求是将函数应用于每一行,比如说,一次只能应用于一行,而不能应用于整个数据帧或序列。在这种情况下,最好使用
[apply()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html#pandas.DataFrame.apply)
方法,而不是遍历 pandas 对象。要了解更多细节,你可以参考 pandas 文档的这一部分,它解释了如何将你自己的或另一个库的函数应用于 pandas 对象。 - **迭代操作:**如果您需要执行迭代操作,同时性能也是一个问题,那么您可能需要考虑 cython 或 numba。关于这些概念的更多细节,你可以阅读熊猫文档的这一部分。
- **打印一个数据帧:**如果你想打印一个数据帧,那么只需使用
[DataFrame.to_string()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_string.html)
方法,以便将数据帧呈现为一个控制台友好的表格输出。
迭代数据帧的行
如果以上选项都不适合您,那么您可能仍然希望遍历熊猫对象。您可以使用iterrows()
或itertuples()
内置方法来实现。
在查看这两种方法的运行之前,让我们创建一个示例数据帧,我们将使用它进行迭代。
import pandas as pd df = pd.DataFrame({
'colA': [1, 2, 3, 4, 5],
'colB': ['a', 'b', 'c', 'd', 'e'],
'colC': [True, True, False, True, False],
})print(df)
*colA colB colC
0 1 a True
1 2 b True
2 3 c False
3 4 d True
4 5 e False*
[**pandas.DataFrame.iterrows(**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html#pandas.DataFrame.iterrows)**)**
方法用于将 DataFrame 行作为(index, Series)
对进行迭代。请注意,该方法不会跨行保存dtypes
,因为该方法会将每一行转换为Series
。如果您需要保留 pandas 对象的 dtypes,那么您应该使用itertuples()
方法。
for index, row in **df.iterrows**():
print(row['colA'], row['colB'], row['colC'])*1 a True
2 b True
3 c False
4 d True
5 e False*
[**pandas.DataFrame.itertuples()**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html#pandas.DataFrame.itertuples)
方法用于以命名元组的形式迭代数据帧行。一般来说,**itertuples()**
预计会比**iterrows()**
快。
for row in **df.itertuples**():
print(row.colA, row.colB, row.colC)*1 a True
2 b True
3 c False
4 d True
5 e False*
关于 Python 中命名元组的更多细节,你可以阅读下面的文章。
迭代行时修改
在这一点上,重要的是要强调你不应该修改你正在迭代的 pandas 数据帧或系列。根据 pandas 对象的数据类型,迭代器可能返回对象的副本,而不是视图。在这种情况下,向副本中写入任何内容都不会达到预期的效果。
例如,假设我们想要将colA
中每一行的值加倍。迭代方法不会奏效:
for index, row in df.iterrows():
row['colA'] = row['colA'] * 2print(df)
*colA colB colC
0 1 a True
1 2 b True
2 3 c False
3 4 d True
4 5 e False*
在类似的用例中,你应该使用apply()
方法。
df['colA'] = df['colA'].apply(lambda x: x * 2)print(df)
*colA colB colC
0 2 a True
1 4 b True
2 6 c False
3 8 d True
4 10 e False*
最后的想法
在今天的文章中,我们讨论了为什么在处理 pandas 对象时避免迭代方法是重要的,而更喜欢矢量化或任何其他适合您特定用例的方法。
pandas 提供了一组丰富的内置方法,这些方法针对大型 pandas 对象进行了优化,您应该始终优先选择这些方法,而不是其他迭代解决方案。如果您仍然想要/必须迭代一个数据帧或系列,您可以使用iterrows()
或itertuples()
方法。
最后,我们讨论了为什么必须避免修改正在迭代的 pandas 对象,因为这可能不会像预期的那样工作。
成为会员 阅读媒体上的每一个故事。你的会员费直接支持我和你看的其他作家。
你可能也会喜欢
如何用人工智能加入并赢得黑客马拉松
我参加黑客马拉松的故事以及我如何学会以高比率获胜
图片来自 Unsplash
黑客马拉松是我去年的生活。每个周末熬夜到凌晨 4 点,在时间紧迫的情况下构建高级项目会产生无与伦比的肾上腺素激增。虽然无论结果如何,黑客马拉松都是令人愉快的,但没有胜利就不一样了。奖品和奖品有助于证明周末的辛苦工作和睡眠不足。然而,获胜并不容易,学习如何做到这一点需要很长时间。结果很多新黑客就泄气了,不继续了。对我来说幸运的是,情况并非如此,因为我能够很快制定出帮助我成功的策略。
黑客马拉松对于任何有抱负的 AI/ML/DS 学生和工程师来说都是很棒的。它们是练习技能和学习新领域和框架的好方法,比如 PyTorch 和 TensorFlow。有一种误解,认为黑客马拉松主要是关于应用开发,而不是关于人工智能,然而,正如我在本文后面讨论的那样,事实远非如此。因此,如果你有兴趣以一种高效的方式提高你的人工智能技能,那就试试吧。事实上,我从一次黑客马拉松中学到了大部分人工智能技能,我在那里开发了一个皮肤癌诊断应用程序。因此,即使你没有人工智能经验,黑客马拉松也是一个很好的入门方式。
我的努力最近被大联盟黑客突出了,因为我被选为前 50 名黑客之一(你可以在这里找到我的简介)。鉴于最近的新闻,在这篇文章中,我想谈谈我参加黑客马拉松的经历,希望你能了解到任何背景的人都可以参加黑客马拉松。在文章的后半部分,我将给出 5 个技巧和窍门来帮助你赢得黑客马拉松。希望这些对您有所帮助,如果您有任何想法或其他建议,请告诉我。
我是如何加入黑客马拉松的
我最初加入黑客马拉松社区是在 2019 年初,当时我是高中一年级学生。一月份,我和一个朋友发短信聊到她在一个会议中心参加的一个编程活动。它被称为“黑客马拉松”,你有 24 小时的时间来构建一个完整的应用程序,解决社会中的一个问题。当时我知道基本的 Java 和 Python,但从未开发过应用程序。她花了一整天的时间描述她的黑客马拉松经历和她的应用程序,在我知道之前,已经是凌晨 3 点了。与编码伙伴一起通宵达旦地开发一个应用程序的想法很吸引人。
在接下来的几周里,我在谷歌上快速搜索了一下,想弄清楚内置的是什么语言的应用程序,结果发现 IOS 应用程序是用 Swift 构建的。于是在没有任何其他知识和研究的情况下,我开始学习 Swift 两个半月,为一次黑客马拉松做准备。我试图说服几个朋友参加黑客马拉松,但只有一个人接受了。幸运的是,一个有很多 CS 背景的同学联系了我们。我和他一点都不熟,但是因为我太想参加黑客马拉松了,所以我们组队了。
五月中旬,我们报名参加了两次黑客马拉松,我很高兴能够测试我的新技能。不幸的是,这些黑客马拉松最终都被取消了,所以严格来说,我在 4 个月后的 9 月份加入了黑客马拉松。我们去了一个名为 Omnihacks 的黑客马拉松,它是在旧金山市中心的一所贸易学校举办的。
我们被大肆宣传;我们打包了睡袋,还带了零食以防万一,然后在 12 月 15 日的早上,我们坐火车去参加黑客马拉松。一旦我们发现主题是医疗保健,我们决定创建一个 IOS 应用程序,允许盲人患者用 OCR 阅读处方。我们决定将这个应用程序命名为 Tickbird ,因为 Tickbird 是帮助犀牛穿越世界的鸟类。整个经历是一个爆炸,因为我们一天的大部分时间都在闲逛,参加了一些关于 ML 的研讨会,并为自己囤积了零食和食物。作为周末的圆满结束,我们获得了十佳奖和第二个最佳移动应用,从那以后,我就迷上了它。这款应用对我们的第一次破解来说也出奇的好,经过一些结构上的改动后,我们甚至可以在应用商店买到它。那个周末是我的黑客马拉松生涯的开始,现在一年半过去了,我是一个经验丰富的老手,我很高兴我决定参加那个黑客马拉松,甚至不知道它是什么。
如果你对参加黑客马拉松有任何担心或恐惧,我的经历希望对你有所启发。当我开始时,我没有任何应用程序开发或人工智能经验,但出于纯粹的好奇心,我尝试了一下,并能够很快变得非常成功。相信我,这是一个伟大的时刻,所以如果你还在高中或大学,我建议你参加黑客马拉松。尤其是如果你是一名人工智能开发人员,你不需要太多的应用开发经验,因为我几乎没有。第一次尝试一下,然后从那里开始。在最坏的情况下,你会有一个免费食物和商品的有趣周末。
取胜的 5 个技巧和建议
1.找到一个值得信赖和忠诚的团队
这是最重要的提示。在所有其他提示中,这是第一位的。拥有一个值得信赖并致力于团队发展的团队是你获得长期成功的基本素质。
一年前,我遇到一个来自西雅图的黑客,他每个周末都会和随机的队友一起参加黑客马拉松。我对他最大的建议是在每次黑客马拉松中找到可靠的朋友,而不是新的队友。用一个新的团队来重置每一次黑客马拉松都是一个巨大的挫折。你必须学会如何与他们合作,以及他们擅长什么,这意味着没有长期改善的机会。即使你不认识熟悉 CS 或者开发的人,你也可以随时教他们。在当今这个资源如此丰富的世界,任何努力工作的人都可以很快成为黑客马拉松团队中的重要角色。尤其是对于人工智能,有大量的视频和文章教授如何编写基本的人工智能模型,这意味着你基本上可以与任何感兴趣的人组成一个团队。
如果你想在黑客马拉松上长期成功,能够在没有任何争议或冲突的情况下分割工作是关键。当你和那些只想提升自己的人一起工作时,会有关于谁扮演什么角色的问题。这造成了一种有害的环境,没有人希望团队中的其他人成功。团队合作是巨大的,不仅在黑客马拉松中如此,在许多其他领域也是如此,比如体育或研究。
在几次黑客马拉松后,我找到了一个新团队,因为我的第一个团队永远不会在同一页面上。我和学校里最好的朋友一起合作,虽然他们没有太多的经验,但我们能够快速提升。我们都希望彼此进步,关心我们的集体成功。寻找一个团队可能是黑客活动中最具挑战性的部分之一,通常对新黑客来说是一个巨大的威慑。如果你记得这篇文章的任何建议,这应该是它。只要和你认识的忠诚的人一起工作。
我和我的团队在黑客攻击时玩得很开心,提高了我们应用程序的效率和质量(图片由作者提供)
2.网络应用而非移动应用
我的前四个黑客马拉松项目中有两个是移动应用。前面说过,我学的第一门基于应用的语言是 Swift,而不是 HTML/JS/CSS。这是一个很大的错误,因为据我所知,在移动应用上构建用户界面比在网络应用上要困难得多。这是因为允许使用通过 Bootstrap 构建的 web 应用程序模板。然而,这些类型的模板并不存在于移动应用程序中,或者至少是免费的。UI 是你的 hackathon 项目的主要组成部分——它吸引了人们对项目的注意。一个 UI 糟糕的项目通常是一个糟糕的项目,因为它给人一种黑客没有太多经验的印象。
Web 应用程序也更加通用,可以包含其他组件,最著名的是人工智能。我在步骤 5 中深入探讨了为什么人工智能应用程序是必须的,但现在,你应该知道的是,使用人工智能甚至其他技术比使用 web 应用程序更容易。您可以使用其他后端框架来托管您的模型,比如 PythonAnywhere 或 Heroku。然而,对于移动应用程序,你必须学习如何使用 CoreML 将你的人工智能集成到移动应用程序中,这是一个麻烦,并且经常不能正确工作。
创建 web 应用程序最重要的原因是,它允许评委现场测试您的应用程序。只有一个视频演示,法官想知道该应用程序使用起来感觉如何。对于一个移动应用程序,法官没有办法测试它。幸运的是,有了 web 应用程序,它可以很容易地通过 Netlify、Heroku 或 Github Pages 等免费服务托管在互联网上。现场测试给评委带来了一种信心,让他们更加欣赏你的申请。从移动应用程序切换到 web 应用程序是我和我的团队所做的最重要的改变之一,因为它给我们带来了明显的成功。
移动用户界面看起来不漂亮——字体甚至不匹配(图片由作者提供)
3.关于实施的想法
我经常看到新团队犯的一个大错误是,他们太专注于让他们的应用程序功能化。作为初学者,他们认为他们必须开发全功能的应用程序,因此想出了一个简单的主意。然后,他们最终会花费黑客马拉松的大部分时间用 Firebase 构建一个认证系统,而不是拿出独特的功能。
这是一个巨大的错误,因为没有法官关心应用程序是否有认证系统。黑客马拉松的目标很容易被误解。因为它被称为 CS 活动,所以人们认为代码是最重要的。然而,黑客马拉松更多的是关于企业家精神和想法。有一个简单的原因:24 小时根本不足以构建一个功能性的应用程序。任何黑客马拉松裁判都知道这一点。真正令人印象深刻的不是这个应用是否有效,而是这个应用是否有潜力以独特的方式改变社会。只要应用程序不是完全伪造的,法官知道,如果团队愿意,他们可以花更长的时间让它发挥作用。那么这款应用将会在真实的市场中有价值。然而,一个在 24 小时内完全实现的低劣想法在任何市场上都不值钱。
这对人工智能开发者来说尤其重要,因为在如此短的时间内完全实现一个完整的模型是非常困难的。通常,光是训练一个模特就需要几个小时。人工智能开发人员也可能认为他们需要建立精确的模型,但这也是不正确的。大多数法官明白模型不会是准确的,但他们会被一个强有力的概念所打动,即使它并不完全像预期的那样工作。
我早期的一个项目有一个登录页面作为主要特征(图片由作者提供)
4.展示事项
每次黑客马拉松结束后,我都会浏览一下项目库,看看我要竞争的项目。既然有这么多项目,我就快速浏览一下他们的视频演示和文字介绍,看看项目好不好。如果报道很短,没有描述性,或者视频质量很差,没有脚本,我会跳过它。我还没有看到其中一个项目获胜。
现实是法官也是这样想的。要评判的项目那么多,也就是说不是所有的项目都能拿到满分的评审。因此,如果一个项目的描述写得很差,没有太多的技术细节,或者如果演示文稿有许多口吃,看起来像是一次完成的,他们为什么应该期待这个项目是好的呢?印象很重要,不仅是在黑客马拉松中,在日常生活中也是如此。作为一名人工智能开发人员,请确保将您的人工智能知识用于您的优势。你可能已经知道,能够向人们解释人工智能是非常令人印象深刻的。即使您无法在黑客马拉松期间完成模型的构建,您也可以绘制一个图表并解释实现的方式。这会让评委们惊叹不已,让你们看起来是最棒的团队。
虽然我们不能完全实现我们的模型,但是我们画了一个计划实现的图表(图片由作者提供)
确保在你的黑客马拉松期间,你分配了足够的时间来准备一个强有力的演示,详细说明你的项目的所有技术细节和你正在解决的问题。想到这么多伟大的、技术上复杂的项目仅仅因为演示糟糕而没有得到认可,这是令人难过的。然而,这是生活的一课,你展示自己和你的工作的方式就是一切。简而言之,这个项目看起来有多好就有多好。这是双向的,如果你的项目不是很好,你可以给它加油,让它看起来很棒。
我在第一次黑客马拉松上展示 Tickbird(图片由作者提供)
5.人工智能是新的元素
这是有原因的。2019 年底 2020 年初左右,几乎所有获奖项目都变成了 AI 项目。我在研究 2019 年获奖项目的时候,大部分获奖项目都没有使用 AI。但出于某种原因,就在我开始学习和使用人工智能的时候,其他人也开始学习和使用人工智能,到 2020 年夏天,任何想要获胜的项目都必须使用人工智能。这得益于 AI 教育和资源的广泛民主化。AI 是迄今为止黑客可以使用的最先进和技术最先进的框架或工具,所以如果你不使用它,你将无法竞争。
如果你不了解人工智能,我不认为这是真的,因为你正在研究数据科学,这不应该被阻止。这里有很多资源,包括所有关于 TDS 的文章,您可以将其作为学习的基础。花几个黑客马拉松做一些别人做过的基本的初级人工智能项目。虽然你可能不会赢,但你会获得重要的经验和学习机会,这将为你在不久的将来取得巨大的、持续的成功奠定基础。
我所有的项目(除了 Tickbird)都使用 AI(图片由作者提供)
最后的想法
对于任何参与 CS 或 AI 的人来说,黑客马拉松都是一项令人愉快的活动。周末和其他人一起创造惊人的项目,不仅可以获奖,还可以帮助你的职业追求,这是所有人工智能开发者都应该做的事情。即使你没有经验,也不要被吓倒,因为我完全不知道自己在做什么。虽然这个社区可能有些有毒和竞争,但如果你和你欣赏的人一起工作,你会很开心。所以,如果你不是黑客,试试看。如果你是一个初学黑客,看看我的技巧和故事,这样你也能成为一个赢家。感谢阅读。
如何走工程师之路——第一幕:VS 代码容器
或者,如何设计出你的 Kaggle 开发环境:一部两幕剧
安托万·佩蒂特维尔在 Unsplash 上拍摄的照片
我的整个 Kaggle 工作,包括本文中讨论的内容,都发表在这里。
简介和动机
我是一名软件工程师,不久前决定开始新的挑战,成为一名数据科学家。作为其中的一部分,我开始参加 Kaggle 上的比赛(到目前为止我只参加了两次)。然而,在开始时,我遇到了一个相当麻烦的上升阶段。前两次比赛的大部分时间,我都在搭建我的开发环境。我只是无法忍受所有那些手动和重复的任务:下载数据集,硬编码路径,通过网站手动提交,最重要的是迷失在模型的所有输入和输出中(即跟踪版本)。
所以,我已经决定,如果我花一些时间在一开始就把事情做好,也就是说,采取软件工程的方式,我会为自己节省很多时间。
这是一个两幕的故事:
- Act 1 是我用本地开发容器设置的 VS 代码,以模仿 Kaggle 内核。
- 第二幕是我设置 Google Colab 独立运行,但与 Kaggle 合作。
在第一幕结束时,你将能够在 Kaggle 上进行本地开发和训练,而无需任何手动步骤。第二幕将在下一篇文章中介绍。
第 1 幕—VS 代码中的本地集装箱化环境
在我参加的第一场比赛(一个图像分类问题)中,我只是通过在线使用 Kaggle 内核开始,因为我的笔记本电脑没有 GPU,训练模型需要花费我很长时间。
然而,很快内核就不够了:
- 首先,我想跟踪 GitHub 上的所有东西,所以我最终会在本地下载所有东西,提交等等。,每次我做出改变。在工具之间切换是不可接受的。
- 其次,我希望能够调试我的代码。我相信调试是一个强大的工具,这只是一个事实——对于那些喜欢使用 Vim 输入代码的人来说是一个“眼中钉”。
VS 代码远程概述:容器
如果你不想一遍又一遍地做设置步骤,容器是一个很好的工具。它们允许您定义一次配置步骤,并且可以在任何时候使用该环境。或者,更好的是,使用其他人预先定义的,例如 Kaggle。
你可以在这里找到关于如何使用 VS Code: Remote extension 在容器中工作的大量信息。
获取 Kaggle 容器图像
他们网站上的 Kaggle 内核正是以这种方式工作的——他们有一个预定义的容器映像,可以为每个用户的笔记本加载,从而隔离他们的环境。
对我们来说幸运的是,他们的照片被公开了。
- 这里他们有关于他们的 Python 图像的信息。
- 你可以偷看他们的 Dockerfile 里面,看看他们在里面安装了什么。
- 这些图片被发布在谷歌容器注册表的 CPU 专用或 GPU 上
配置 VS 代码
- 首先你需要安装 VS 代码远程开发扩展包。
- 其次,创建
.devcontainer/devcontainer.json
文件来存储您的环境定义(更多信息):
{
"name": "Kaggle Dev CPU",
"image": "gcr.io/kaggle-images/python", // Remember to pull latest before rebuilding.
"extensions": [
"ms-python.python",
],
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"python.pythonPath": "/opt/conda/bin/python"
},
"devPort": 8888,
"shutdownAction": "none"
}
- 运行 VS 代码命令
Remote-Containers: Rebuild and Reopen in Container
。 - 你的 VS 代码窗口标题现在应该显示
... [Dev Container: Kaggle Dev CPU] - ...
。
模拟 Kaggle 环境
即使现在我已经用 VS 代码完成了开发,由于 GPU 的原因,我仍然希望在 Kaggle 上进行培训。而且,我再次希望必须做最少的手动任务来从本地运行切换到 Kaggle。所以,我决定在本地模拟 Kaggle 环境,这样脚本/笔记本甚至不会知道其中的区别。
我已经运行了同一个容器,所以我只需要模拟文件夹位置:
/kaggle/input
:数据集映射到的文件夹。/kaggle/working
:存储输出的文件夹(以及笔记本/脚本的当前工作目录)。
要实现这一点:
- 在方便的地方创建
input
和working
文件夹。我在我的工作区中选择了data/
文件夹。 - 在
devcontainer.json
中为容器创建映射:
"mounts": [
"type=bind,source=${localWorkspaceFolder}/data/input,target=/kaggle/input",
"type=bind,source=${localWorkspaceFolder}/data/output,target=/kaggle/output",
],
上面的配置从路径/kaggle/input
下的容器内我的本地工作区文件夹中映射了data/input
文件夹——就像它在 Kaggle 上一样。它还映射了一个额外的文件夹data/output <-> /kaggle/output
,这样笔记本就可以在容器之外保存数据。
- 创建一个脚本
.devcontainer/setup.sh
,它将在容器创建后由 VS 代码执行:
#!/bin/bash
mkdir /kaggle/working
不要忘记使它可执行:chmod +x .devcontainer/setup.sh
。
并告诉 VS 代码运行它(在devcontainer.json
):
"postCreateCommand": ".devcontainer/setup.sh",
从 Kaggle 获取数据集
起初,我会简单地手动下载数据集(到一个文件夹data/input
),并给它们起一个与 Kaggle kernel 相同的名字。然而,当我开始使用不同的附加数据集或附加库等时。,我开始寻找 Kaggle 是否有一些 API 或工具来自动化这个过程。幸运的是它做到了。
所以,我决定设置 VS 代码任务(你可以在这里了解更多)来运行下载数据集、文件等的命令。:
- 按照这里的描述获取您的 Kaggle API 凭证。
- 我把
kaggle.json
放在我的工作区文件夹中(确保把它添加到**.gitignore**
!): - 然后,我们需要确保它在容器的主目录中,以便能够在其中运行(不必切换到本地模式)。
添加一个名为.devcontainer/setup-mounted.sh
的脚本(这个脚本将在代码挂载后运行):
#!/bin/bash
# Set up a link to the API key to root's home.
mkdir /root/.kaggle
ln -s /workspaces/kaggle/kaggle.json /root/.kaggle/kaggle.json
chmod 600 /root/.kaggle/kaggle.json
并告诉 VS 代码在附加到容器后运行这个脚本:
"postAttachCommand": ".devcontainer/setup-mounted.sh",
- Kaggle API 设置完成后,添加 VS 代码任务(在
.vscode/tasks.json
):
"tasks": [
{
"label": "kaggle dataset download",
"type": "shell",
"command": "kaggle datasets download ${input:userName}/${input:datasetName} -p ${input:datasetName} --unzip --force",
"options": {
"cwd": "/kaggle/input"
},
"problemMatcher": []
}
]
上面的任务将把格式为<username>/<dataset name>
的数据集下载到目录/kaggle/input
中,就像在 Kaggle 内核中一样。
运行特定于环境的逻辑(如有必要)
如果您的机器上只有 CPU,并且只能运行 2 个时期的训练,这可能是有用的,但是当在 Kaggle 上运行时,您希望运行完整的训练(例如,30 个时期)。
为此,我使用了一个只能在 VS 代码中设置的环境变量。
- 告诉 VS 代码在
devcontainer.json
中定义这个环境变量:
"containerEnv": {
"KAGGLE_MODE": "DEV"
},
- 在代码中使用它来检查您是否正在本地运行:
import os
DEVMODE = os.getenv("KAGGLE_MODE") == "DEV"
print(f"DEV MODE: {DEVMODE}")
EPOCHS = 2 if DEVMODE else 30
这一步是我最不喜欢的,因为我必须在每台笔记本上重复这一步…然而,这只是在创建笔记本时进行的,所以仍然比每次希望在不同环境之间切换时都必须手动完成所有事情要好得多。
额外的
您可以为您的工作启用许多有用的扩展。在devcontainer.json
中:
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
// Editing/dev process
"streetsidesoftware.code-spell-checker",
"wayou.vscode-todo-highlight",
"janisdd.vscode-edit-csv",
"davidanson.vscode-markdownlint",
// VCS helpers
"donjayamanne.githistory",
"eamodio.gitlens"
],
并且不要忘记一堆对你的 VS 代码环境有用的设置(比如格式化和林挺你的代码)。
整个设置
您可以参考这些文件:
- 。devcontainer 文件夹。
- 。vscode 文件夹。
- cassava_inference.py —示例 python 脚本。
进一步的改进
一些我没有做过的事情,但是在 Kaggle API 中是可能的:
- 它允许上传笔记本并运行它们(阅读更多),所以你不必手动进入网站。
- 它还允许提交竞争(将在法案 2 中涉及)。
- 它还有其他一些可能对你有用的功能,比如列表排行榜等。
摘要
按照本文中描述的步骤,可以在本地机器上建立与 Kaggle 上非常相似的开发环境,并增加了版本控制系统和调试的额外功能(以及使用 IDE 的其他优势)。
这可以通过几个步骤来实现:
- 配置 VS 代码在 Kaggle 容器中开发。
- 设置类似 Kaggle 的目录结构,映射到本地机器的存储。
- 使用 Kaggle API 下载数据集和更多。
- 使用环境变量在代码中包含特定于环境的逻辑。
我希望这个设置可以帮助你在参加 Kaggle 比赛时减轻工作负担。
如何走工程师之路?第二幕:谷歌实验室
或者,如何设计出你的 Kaggle 开发环境:两幕剧。
由 Unsplash 上的 krakenimages 拍摄的照片
这是该剧的第二幕,你可以在这里阅读第一幕。
我的整个 Kaggle 工作,包括本文中讨论的内容,都发表在这里。
序言/介绍
在故事的第一部分,我描述了如何为 Kaggle 设置带有容器的 VS 代码。对我来说,使用系统的方法是最重要的,不管是工程工作还是数据科学。因为这个信念,我在 Kaggle 比赛中的提升在很大程度上是为了将来节省时间。
在本文中,我将描述在我参加的第二次比赛中,我是如何改进我最初使用 VS 代码进行开发的方法的。如题所示,我转到了 Google Colab,但尽管如此,我仍然希望有适当的设置。
以前方法的缺点
在第一场比赛中,在用 Kaggle 容器设置了 VS 代码之后,我在 Kaggle 上进行本地开发和培训。我尽最大努力减少在不同环境间切换的重复性工作。然而,还有一些其他问题:
- 我仍然不得不在两种环境之间切换。
- Kaggle 不允许使用数据集的特定版本(例如,当训练 5 倍时,我必须下载每一个并上传所有数据作为集合的数据集)。
- 包含依赖项是一件痛苦的事情——我不得不再次上传它们,作为一个数据集,然后映射它们的位置。
在本文中,我将描述我如何使用 Google Colab 来克服所有这些麻烦,并获得一些额外的好处,如更好的 GPU 和更好的运行时。
第 2 幕——谷歌与 GitHub 的 Kaggle 合作实验室
Google Colab 是一个为您的数据科学工作获取免费 GPU 的好方法。只需支付少量额外费用,你就可以获得配备 V100/P100 GPU 的 Colab pro,这比你在 Kaggle 上获得的 T4 GPU 快几倍。它还有其他不错的功能,比如映射 Google Drive 文件、使用 GitHub 等等——如下所述。
我选择这将是对 Kaggle 在训练速度和易用性上的改进,并且我不需要在本地开发。随着更多的研究,看起来我甚至不需要离开 Colab 环境,在里面做任何事情(有点像不离开我的公寓)。
在 Google Drive 中为 Colab 设置 GitHub
我做的第一件事是确保我仍然可以使用 Git,并且不必在环境之间切换。
糟糕的方法:你可以直接从你的私人或公共回购中打开文件,编辑它并提交回来,正如这里的所描述的。但是,有几个问题:
- 提交仅针对一个笔记本,即 Colab 仅在一个笔记本的上下文中工作。
- 由于上述原因,您不能拥有依赖关系。
好消息是,Colab 允许你安装你的 Google Drive 。一旦它被映射,它就是运行 Colab 的 VM 实例上的一个常规文件夹。
那么,为什么不克隆你的 GitHub repo 呢?
- 创建 GitHub 个人访问令牌来代替您的密码— link 。
- 准备一些临时的笔记本,姑且称之为
terminal.ipynb
,存储在你的 Google Drive 中,并与你的驱动器进行映射:
from google.colab import drive
drive.mount("/content/drive")
- 在 Colab Pro 中,您可以打开一个终端实例— link 。
- 在任何 Colab 中,您都可以从笔记本单元格中运行终端命令:
%%bash
cd /content/drive/MyDrive/
git clone https://<username>:<PAT>@github.com/<username>/<repo name>.git
cd <repo name>
至此,您已经将所有代码 git 克隆到您的 Google Drive 中,并且您可以在其中打开任何笔记本。我还在笔记本中设置了一些代码来使用 Git,但是我最终只使用了终端命令。
唯一的缺点是,你必须在每个笔记本的开头映射 Google Drive,但我认为这相对来说没什么问题。
try:
from google.colab import drive
drive.mount("/content/drive")
%cd /content/drive/MyDrive/Colab\ Notebooks/kaggle
except:
print("Not in Colab")
我为自己创建了一个模板笔记本,我复制它作为任何其他笔记本的基准。
注意:一个额外的很酷的技巧,不需要每次都给你的驱动器 Colab 授权,你可以像这里描述的一样为每个笔记本设置自动挂载。
为 Kaggle 设置
下一步是设置 Kaggle ( /kaggle/input
、/kaggle/working
)和 Kaggle API secrets 等所需的所有目录。这个设置必须在每个笔记本的开头完成,所以它必须作为脚本导入和函数调用。
您不能在 Colab 中真正编辑 Python 脚本,但是您可以让您的笔记本写入文件:
%%writefile setup_colab.py
def setup_colab_for_kaggle():
...
在该脚本中,让我们执行必要的设置:
- 映射和/或创建目录:
kaggle_dir = Path("/kaggle")
drive_content_dir = Path("/content/drive/MyDrive/kaggle")
(kaggle_dir / "working").mkdir()
target_content_dirs = ["input", "output"] + ([] if local_working else ["working"])
for content_dir in target_content_dirs:
(kaggle_dir / content_dir).symlink_to(drive_content_dir / content_dir)
- 设置 Kaggle API 令牌。将你的
kaggle.json
文件上传到你的硬盘上(我把它放在了 repo 文件夹中,虽然你也这样做,确保把它添加到**.gitignore**
)。
drive_sources_dir = Path("/content/drive/MyDrive/Colab Notebooks/kaggle")
kaggle_config = Path.home() / ".kaggle"
(kaggle_config / "kaggle.json").symlink_to(drive_sources_dir / "kaggle.json")
- 您可以使用相同的方法来设置 Weights & Biases API 键或任何其他键。
- 在该文件中有任何其他设置代码。
现在,每台笔记本只需导入代码并运行设置功能:
from setup_colab import setup_colab_for_kaggle
setup_colab_for_kaggle(check_env=False, local_working=True)
使用我的脚本,输出将告诉我们最终的设置:
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
/content/drive/MyDrive/Colab Notebooks/kaggle
Content of Drive Kaggle data dir (/content/drive/MyDrive/kaggle): ['/content/drive/MyDrive/kaggle/input', '/content/drive/MyDrive/kaggle/working', '/content/drive/MyDrive/kaggle/output']
Content of Kaggle data dir (/kaggle): ['/kaggle/working', '/kaggle/output', '/kaggle/input']
Content of Kaggle data subdir (/kaggle/input): ['/kaggle/input/vinbigdata']
Content of Kaggle data subdir (/kaggle/output): ['/kaggle/output/vbdyolo-out']
Content of Kaggle data subdir (/kaggle/working): []
Content of Kaggle config dir (/root/.kaggle): ['/root/.kaggle/kaggle.json']
Loaded environment variables from .env file: ['WANDB_API_KEY'].
酷,在这一点上,所有的设置都是模仿 Kaggle 内核的设置,以及前一篇文章中描述的本地环境,所以笔记本在两个环境之间切换时不会知道区别(如果你想知道的话)。但是,让我们将它设置得更好,这样我们就根本不用切换了。
从 Kaggle 获取数据
首先,我会将数据下载到本地,然后上传到我的驱动器,最后它会被映射到正确的位置,如上所示。然而,这并不太实际,最重要的是——Colab 从 Google Drive 中访问文件非常慢。事实证明,每次将数据集下载到 Colab 虚拟机的本地存储中要快得多。在你的笔记本上有:
!kaggle competitions download vinbigdata-chest-xray-abnormalities-detection -f train.csv -p {INPUT_FOLDER_DATA} --unzip
!kaggle datasets download xhlulu/vinbigdata-chest-xray-resized-png-1024x1024 -p {INPUT_FOLDER_PNG} --unzip
通过 Google Drive 训练有效网络 B3 的一个时期需要大约 1 小时,而下载 8GB 需要大约 8 分钟,训练一个时期需要大约 15 分钟。速度提高了 4 倍,不错!
版本化数据集和模型
这一节将阐明为什么我们需要设置 Kaggle API 令牌。
由于我对 Kaggle 竞赛的方法是系统的和有条理的,我开始思考如何组织我使用的数据和产生的模型。有点像模型和数据的 Git。事实上,我发现有数据版本控制和其他一些工具。然而,对于 Kaggle 比赛,更简单的方法就可以了。一种选择是只存储在文件夹中,但这不是很整洁,数据可能会丢失,而且很难给每个版本附加注释。所以我选择把所有东西都作为 Kaggle 数据集偷走。
这可以像在每个笔记本末尾上传文件一样简单:
- 将您想要上传的文件放在一个文件夹中(比如说,
yolo_pred/
文件夹包含 YOLO 预测和yolo.pt
文件)。 - 创建
dataset-metadata.json
文件——由 Kaggle API 解析和理解的东西:
with open(Path(folder_path) / "dataset-metadata.json", "w") as f:
json.dump({
"title": dataset_name,
"id": f"{user_name}/{dataset_name}",
"licenses": [{ "name": "CC0-1.0" }]
}, f, indent=4)
- 使用 Kaggle API 命令在笔记本执行(如模型训练)结束时上传文件:如果是第一次:
!kaggle datasets create -p {OUTPUT_FOLDER_CUR} -r zip
否则:
!kaggle datasets version -m "{version_message}" -p {OUTPUT_FOLDER_CUR} -r zip
- 现在,在您的后处理中,您可以下载特定版本(特定的训练模式及其输出)用于提交:
!kaggle datasets download "username/dataset-name" -v {yolo_version} -p {version_data["path"]} --unzip --force
剧透:虽然,这在官方 Kaggle API 中不起作用——见下一段。
修复 Kaggle API 以满足我们的需求
作为一个偏离主题的话题,我需要在 Kaggle API 中添加/修复一些特性。推动这一点是因为在某一点上,我不能重现良好的结果,我获得了一些早期版本。那时,我已经对所有的东西进行了版本控制,并且记录了所有的设置,所以这几乎是不可能的……但是它正在发生。然后我注意到我选择的任何版本都得到了相同的结果。结果是,嗯,Kaggle API 默默地忽略了我的版本请求,总是下载最新的版本。
因此,他们的 GitHub repo 提到他们欢迎改变,因此我决定自己解决问题(我非常需要竞争的功能)。
- 首先,我需要确保 Kaggle 会下载一个特定的版本。我的 PR 在这里。
- 第二,我已经准备好了,所以我做了一些修正,使得比赛中的一个文件可以正确下载(整个数据集大约 200GB,我只下载了带有火车标签的
.csv
文件,并从另一个数据集获得了大约 8GB 的相同图像)。我的 PR 这里。
不过,很明显,将变更加入 Kaggle API 的过程很慢(他们有一个私有的回购协议,一些开发人员必须去合并变更……)。所以,这两个改动都暂时在我这里的分叉。
您可以从您的 Colab 笔记本上安装带有我的补丁的 Kaggle API,如下所示:
!pip install -U git+https://github.com/Witalia008/kaggle-api.git@witalia-main
臣服于 Kaggle
对于我参加的特定比赛,提交的只是一个.csv
文件,所以我只需在我的后处理笔记本的末尾运行以下命令:
!kaggle competitions submit \
vinbigdata-chest-xray-abnormalities-detection \
-f {WORK_FOLDER}/submission.csv \
-m "{submission_message}"
然后检查提交的结果:
!kaggle competitions submissions vinbigdata-chest-xray-abnormalities-detection
整个设置
您可以参考具有完整实现的文件:
- setup-colab-for-ka ggle . ipynb—包含使用 Git 的代码以及 setup-colab 逻辑的笔记本。
- setup_colab.py —设置脚本(由上述笔记本产生),包含映射目录、配置密钥等功能。
- template-colab-ka ggle-nb . ipynb—需要设置的模板笔记本,我将它用作其他笔记本的基础。
- vbd-yolov5.ipynb —下载数据集、训练模型并将输出存储为数据集的示例笔记本。
- vbd-postprocess-yolo . ipynb—示例笔记本,它下载以前笔记本输出的多个版本作为数据集,集成它们,并提交给 Kaggle。
进一步的改进
这种方法的问题实际上是失去了 IDE 的全部功能(比如,调试,或者处理笔记本之外的其他文件格式)。笔记本电脑中 pdb 的调试能力有限,人们可以通过终端用 Vim 或 Nano 编辑文件,但这不是很好。但我听说有一种方法可以将 VS 代码连接到 Google Colab ( link ),所以我一定会尝试一下,也许会有续集。
结语/总结
本文中描述的设置是对 Kaggle 开发环境的进一步改进,只需几个简单的步骤,就可以下载数据、进行数据科学工作、存储模型/输出并提交给竞赛,而无需离开 Colab 笔记本。
这可以通过以下步骤实现:
- 安装 Google Drive 并通过终端命令操作。
- 像在本地机器上一样克隆 Git repo 和跟踪文件。
- 在每个笔记本的开头创建一个脚本来运行设置命令,以模拟 Kaggle 环境、设置 API 键等等。
- 使用 Kaggle API 将数据集和比赛数据从笔记本下载到 Colab VM。
- 使用 Kaggle API 将模型版本及其输出存储为数据集。
- 使用 Kaggle API 直接从笔记本提交竞赛。
我希望你会发现这个设置很有用,它可以让你花更少的时间来配置一切,而花更多的时间来解决 Kaggle 比赛。祝你好运:)
如何在没有专有数据的情况下启动人工智能项目
AI 创业公司有个鸡&蛋的问题。下面是解决的方法。
几年前,我了解到银行每年因信用卡诈骗损失数十亿美元。更好地检测或预测欺诈将具有难以置信的价值。所以我考虑说服一家银行分享他们的交易数据的可能性,希望建立一个更好的欺诈检测算法。不足为奇的是,没有一家大银行愿意分享这样的数据。他们觉得最好雇佣一个数据科学家团队在内部解决这个问题。我的创业想法很快夭折了。
尽管围绕人工智能有着巨大的创新和创业机会,但对创业者来说,闯入人工智能可能是一项艰巨的任务,因为他们甚至在开始之前就面临着先有鸡还是先有蛋的问题,这是现有公司不太可能应对的问题。我相信具体的策略可以帮助企业家克服这一挑战,创造成功的人工智能驱动的企业。
AI 创业中的鸡和蛋的问题是什么?
今天的人工智能系统需要在大数据集上进行训练,这对企业家来说是一个挑战。拥有相当大客户群的老牌公司已经拥有了一系列数据流,他们可以从中训练人工智能系统,开发新产品并增强现有产品,生成额外的数据,并冲洗和重复(例如,谷歌地图拥有超过 1B 的每月活跃用户和超过 20 的数据))。但对于创业者来说,对数据的需求带来了一个先有鸡还是先有蛋的问题——因为他们的公司还没有建成,他们没有数据,这意味着他们不能那么容易地创造一个 AI 产品。
此外,数据不仅是人工智能入门所必需的,它实际上是人工智能性能的关键。研究表明,虽然算法很重要,但数据更重要。在现代机器学习方法中,与具有更多或更少数据的相同算法之间的性能差异相比,各种算法之间的性能差异相对较小( Banko 和 Brill 2001 )。
有几种策略可以帮助企业家解决这个先有鸡还是先有蛋的问题,并获取他们进入人工智能领域所需的数据。
研究表明,虽然算法很重要,但数据更重要。
克服先有鸡还是先有蛋问题的 5 种方法
- 从提供一种没有人工智能也有价值的服务开始,这种服务产生数据
虽然数据确实需要先于人工智能产品,但数据不需要先于所有产品。企业家可以从创建一项服务开始,这项服务不是基于人工智能的,而是解决客户问题并在此过程中生成数据。这些数据稍后可以用于训练一个人工智能系统,该系统可以增强现有服务或创建相关服务。
例如,脸书早期没有使用人工智能,但它仍然提供了一个客户希望加入的社交网络平台。在这个过程中,脸书生成了大量数据,这些数据反过来被用于训练人工智能系统,这些系统帮助个性化新闻订阅,并使运行极具针对性的广告成为可能。尽管一开始并不是人工智能驱动的服务,但脸书已经成为人工智能的大量用户。
类似地,insur tech 初创公司 Lemonade 最初没有数据来在第一天建立复杂的人工智能能力。然而,随着时间的推移,Lemonade 已经建立了人工智能工具来创建报价、处理索赔和检测欺诈。今天,他们的人工智能系统处理 96%的索赔的“第一份损失通知”,并在三分之一的案件中管理完整的索赔解决方案,而没有任何人工参与。这些人工智能能力是使用多年运营产生的数据构建的。
2.与拥有专有数据集的非科技公司合作
企业家可以与拥有专有数据集但缺乏内部人工智能专业知识的公司或组织合作。这种方法在很难创建一种产品来生成您的 AI 应用程序所需的数据(如关于患者测试和诊断的医疗数据)的情况下特别有用。在这种情况下,您可以与医院或保险公司合作,以获取匿名数据。
相关的一点是,你的 AI 产品的训练数据可以来自潜在客户。虽然这在医疗保健和金融等受监管行业更难做到,但制造业等其他行业的客户可能更愿意接受这一点。作为回报,你可能需要提供几个月的人工智能产品的独家使用权,或者提前获得未来产品的功能。
这种方法的一个缺陷是,潜在的合作伙伴可能更喜欢与老牌公司合作,而不是那些不太知名和不太受信任的小公司(尤其是在后 GDPR 和剑桥分析时代)。因此,业务发展将会很棘手,但这种策略仍然是可行的,尤其是当知名科技公司尚未追逐你想要的合作伙伴时。
家族企业中的企业家可能已经从他们现有的企业中获得了大量潜在的数据。这也是一个很好的选择。
3.众包你需要的数据
根据所需数据的种类,企业家可以通过众包获得数据。当数据可用但没有被很好地标记时(例如互联网上的图像),众包可能是获得这种数据的特别合适的方法,因为标记是一项非常适合由众包平台上的大量个人快速完成的任务。亚马逊 Mechanical Turk 和 Scale.ai 等平台经常被用来帮助生成带标签的训练数据。
例如,考虑谷歌对验证码的使用。虽然它们服务于一个重要的安全目的,谷歌同时使用它们作为一个众包图像标签系统。每天“数百万用户是谷歌分析预处理团队的一部分,他们免费验证机器学习算法。”
一些产品的工作流允许客户在使用产品的过程中帮助标记新数据。事实上,主动学习的整个子领域都集中在如何交互式地查询用户以更好地标记新的数据点。例如,考虑一个生成风险警报的网络安全产品和一个工作流,在该工作流中,运营工程师解决这些警报,从而生成新的标记数据。类似地,像 Pandora 这样的产品推荐服务使用 upvotes 和 downvotes 来验证推荐的准确性。在这两种情况下,您可以从 MVP 开始,随着客户提供反馈,MVP 会随着时间的推移而不断改进。
4.利用公共数据
在你下结论说你需要的数据不可用之前,再仔细看看。公开可用的数据比你想象的要多。甚至出现了数据市场。虽然公开可用的数据(以及由此产生的产品)可能不太容易防御,但您可以通过其他服务/产品创新来建立防御,例如创建卓越的用户体验,或者像 Zillow 一样大规模结合离线和数字数据(该公司大规模使用离线公共市政数据作为其创新的在线房地产应用的一部分)。人们还可以将公开可用的数据与一些专有数据结合起来,这些数据可以随着时间的推移生成,也可以通过合作、众包等方式获得。
加拿大蓝点公司使用各种数据来源,包括公开数据,以便在正式报告之前发现新出现疾病的爆发,并预测下一次爆发将蔓延到哪里。BlueDot 使用“官方公共卫生组织的声明、数字媒体、全球机票数据、牲畜健康报告和人口统计数据”,以及其他数据来源。这家公司在 2019 年 12 月 30 日检测到新冠肺炎疫情),比世卫组织的报告早了 9 天。
除了数据之外,还可以选择使用公开提供的预先训练的 ML 模型,这些模型可以根据您的迁移学习需求进行定制。迁移学习包括使用为一项任务开发的模型作为另一项任务的起点。例如,在数百万幅图像上训练的深度学习模型可以是更特定领域的图像识别模型(例如,识别花)的起点。这种方法通常用于图像识别和自然语言处理,可以显著减少对新数据的需求。
公开可用的数据比你想象的要多。甚至出现了数据市场。
5.反思对数据的需求
诚然,商业世界中大多数实用的 AI 都是基于机器学习的。并且该 ML 的大部分是监督 ML(这需要大的标记训练数据集)。但是,许多问题可以通过其他不依赖于数据的人工智能技术来解决,例如强化学习或专家系统。
强化学习是一种 ML 方法,其中算法通过测试各种动作或策略并观察这些动作的回报来学习。本质上,强化学习使用实验来弥补标记训练数据的缺乏。谷歌围棋对弈软件 Alpha Go 的最初迭代是在大型训练数据集上训练的,但下一个迭代 AlphaZero 是基于强化学习的,没有训练数据。然而,AlphaZero 击败了 alpha Go(alpha Go 本身击败了围棋世界冠军 Lee Sedol)。
强化学习广泛应用于在线个性化。在线公司经常测试和评估多个网站设计、产品描述、产品图片和定价。强化学习算法探索新的设计和营销选择,并根据用户的反应快速学习如何个性化用户体验。
另一种方法是使用专家系统,这是一种简单的基于规则的系统,通常将专家日常使用的规则整理成文。虽然专家系统很少能在复杂任务(如医疗诊断或图像识别)中击败训练有素的 ML 系统,但它们可以帮助打破鸡和蛋的问题,并帮助您开始。例如,虚拟医疗保健公司 Curai 使用来自专家系统的知识来创建临床简介,然后使用这些简介作为 ML 模型的训练数据(以及来自电子健康记录和其他来源的数据)。
需要明确的是,并不是每一个智力问题都可以被视为强化学习问题,或者通过专家系统的方法来解决。但是当训练数据的缺乏阻碍了有趣的 ML 产品的开发时,这些是值得考虑的。
企业家最有可能开发出一致的专有数据流,如果他们开始提供一种没有人工智能也有价值的服务,并产生数据,然后用这种数据来训练人工智能系统。然而,这种策略需要时间,并且不一定适合所有情况。根据初创公司的性质和所需数据的种类,与拥有专有数据集、众包(标签)数据或利用公共数据的非科技公司合作可能会更好。或者,企业家可以完全重新思考对数据的需求,并考虑采取强化学习或专家系统的方法。
Kartik Hosanagar 是沃顿商学院的教授,企业家( Jumpcut Media 和 Yodle 的创始人),著有A Human ’ s Guide to Machine Intelligence,Wharton ’ s AI for Business Initiative的负责人。推特:@khosanagar。
鸣谢:感谢沃顿商学院人工智能商业倡议研究助理莫尼莎·古拉巴尼(Monisha Gulabani)所做的大量研究、编辑以及构思和生成上述数字。感谢 Zetta Venture Partners 的 Jocelyn Goldfein 提供的许多有用的建议,以及沃顿商学院学生 Anirudh Viswanathan 的反馈。感谢 Quentin Demersay 建议将公开可用的 ML 模型(以及迁移学习)添加到策略列表中。所有的错误都是我自己的。
如何知道用哪种统计检验进行假设检验?
何时使用哪种检验——T 检验、卡方检验、方差分析
统计学是数据科学和机器学习不可或缺的一部分。统计学是数学的一个分支,指的是以数学方程的形式将变量之间的关系形式化。它试图找到变量之间的关系来预测结果。统计学是关于,包括收集分析,解释,介绍和组织的研究。
有很多统计测试来衡量变量内部或变量之间的关系。在一个数据科学项目中,数据科学家的脑海中经常会出现一个问题,即对于什么样的数据或变量以及何时使用哪种统计技术。在本文中,您可以了解对几种类型的统计测试的基本理解,以及何时以及如何对您的数据集使用它们。
单样本测试与双样本测试:
一个样本测试是一个统计过程,考虑一个列或特征的分析。它可以是百分比分布分析(分类变量)或均值分析(连续变量)。
另一方面,双样本检验是比较或计算两个随机变量之间关系的统计过程。
单一样本测试:
如上所述,单样本检验涉及一个随机变量的假设检验。
- **均值的单样本 T-检验:**对于一个数值或连续变量,您可以使用均值的单样本 T-检验来检验您的总体均值是否不同于一个常数值。例如,一家跨国公司有兴趣测试他们员工的平均年龄是 30 岁。他们可以使用单样本 t 检验来得到结果。
Here, t-stat follows a t-distribution having n-1 DOF
x̅: mean of the sample
µ: mean of the population
S: Sample standard deviation
n: number of observations
- **比例的一次样本 T 检验:**一次样本比例检验用于估计总体的比例。对于分类变量,可以使用比例的单样本 t 检验来检验类别的分布。
p̂: Observed probability of one certain outcome occurring
*p0*: hypothesized probability
*n*: number of trials.
双样本测试:
在假设检验中,双样本检验是对两个随机变量的数据进行的,每个随机变量都来自一个独立的总体。该测试可用于测试两个样本之间的统计显著性差异。
一旦你弄清楚了随机变量的用途和数据类型,基本上有 3 大类数据类型组合:
- 两个连续变量
- 一个连续变量和另一个分类变量
- 两个分类变量
两个连续变量之间的统计检验:
当您的实验试图找出两个连续变量之间的关系时,您可以使用相关统计测试。
皮尔逊相关:
皮尔逊相关是一种统计技术,用于测量两个线性相关变量之间的关系程度。其系数的取值范围在[1,-1]之间,是否 1 表示正相关,-1 表示负相关,0 表示不相关。
斯皮尔曼等级相关性;
两个随机变量之间的 Spearman 秩相关等于两个变量的秩值之间的 Pearson 相关。它可以用来度量两个连续随机变量之间的单调关系。其系数的取值范围在[1,-1]之间,是否 1 表示正相关,-1 表示负相关,0 表示不相关。
一个连续变量和另一个分类变量之间的统计检验:
t 检验:
当您的实验试图进行比较或找出一个分类(有两个类别)和另一个连续变量之间的差异时,您需要进行双样本 T 检验,以找出两个变量之间的显著差异。
方差分析:
当您的实验试图进行比较或找出一个分类(两个以上的分类)和另一个连续变量之间的差异时,您可以使用 ANOVA(方差分析)测试。
两个分类变量之间的统计检验:
卡方检验:
当您的实验试图进行比较或找出两个分类随机变量之间的差异时,您可以使用卡方检验来测试统计差异。
结论:
(图片由作者提供),何时使用何种统计技术
在本文中,我们讨论了统计技术,以及何时使用何种检验来推导随机变量之间或之内的关系或结论。使用上面讨论的统计技术,您可以评估一个变量对另一个变量的影响。
两个连续变量之间的相关性用来衡量它们之间的关系。所有其他统计检验都可以用来比较两个随机变量,p 值可以用来接受或拒绝零假设。
参考资料:
[1]统计解决方案:https://www . Statistics Solutions . com/correlation-Pearson-Kendall-spearman/
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一小部分会员费,不需要你额外付费。
https://satyam-kumar.medium.com/membership
感谢您的阅读
如何用人工智能标注文本分类训练数据
用零射击变压器模型标注你的训练数据。然后,使用标记的数据微调一个小的监督模型
作者图片
没错!使用我上个月提出的方法,在没有人工标注器的情况下标注文本分类训练数据是可能的。然后,您可以使用标记的数据来训练监督模型。那么,先有什么——“先有鸡还是先有蛋”,或者类似地,“带人工智能标签的训练数据还是监督模型”?但是这个谜题有一个解决方案——那就是零射击模型。
零镜头文本分类模型需要两个输入:文本和一组标签。然后,他们输出每个标签的分数。因此,他们可以将文本分类为任意类别,而无需任何微调。目前,在 Hugging Face 的模型分发网络上有可用的大型零镜头文本分类转换器模型,只需几行代码就可以实现。
在本文中,我将首先从较高的层面简要概述该系统,以及我为展示其功能而进行的实验的结果。我已经发表了一篇完整的文章,更深入地涵盖了这两个方面,你可以在我的网站上找到,或者发表在走向数据科学上。然后,我将继续讨论如何通过重现我上一篇文章中描述的主要实验来用 Python 代码实现这个系统。
过程
整个系统非常简单。系统的输入是未标记的文本数据和标签列表。然后,输出是一个小的监督模型,将文本分类到给定的标签中。该过程中的关键组件是一个大型零镜头文本分类模型。该模型从未标记的数据集中获取文本片段,并输出每个标记的分数。具有最高分数的标签被分配给该段。最后,新标记的案例用于微调小型监督模型。
作者图片
实验总结
我做的主要实验显示了有希望的结果。首先,我使用了一个名为斯坦福情感树库 V2 (SST2*) 的二进制文本分类数据集。然后,使用名为“ facebook/bart-large-mnli 的零镜头文本分类模型对各种数量的训练案例进行标注,对评测案例的准确率为 88.19%。接下来,新标记的训练案例用于微调朴素贝叶斯文本分类模型。下面是朴素贝叶斯模型在 SST2 评估数据集上的精度。经过 8000 个训练样本,取得了 76.03%的准确率。
【The SST2 数据集是 胶水 数据集的一部分,该数据集属于cc-by-4.0许可证
最终,朴素贝叶斯模型实现了与最流行的零镜头文本分类转换器模型大致相同的准确性,该模型可在 Hugging Face 的模型分发网络上获得,名为“typeform/distilbert-base-un cased-mnli”但是当然,与 Transformer 模型相比,朴素贝叶斯模型只需要运行所需资源的一小部分。
意义
实验表明,在没有标记数据的情况下,训练一个小的监督文本分类模型是可能的。因此,通过使用这种方法,可以在没有人工标注器的情况下对训练数据进行标注。然后,带标签的训练数据可以用来微调一个更小的模型,更容易在生产中使用。这为使用监督模型打开了大门,这些模型在过去由于缺乏标记的训练数据而无法训练。
履行
下载零射击模型
首先,我们将使用 Hugging Face 的 Transformers 库来加载一个零镜头文本分类 Transformer 模型。让我们开始安装吧。
pip install transformers
然后,我们将为我们想要的模型导入并创建一个管道对象。在这种情况下,我们将执行一个名为“零任务分类”的任务,我们将使用一个名为“facebook/bart-large-mnl”的模型我还包含了自动检测和使用可用 GPU 的代码。
from transformers import pipeline
import torch
# Check to see if a GPU is available
device = -1
if torch.cuda.is_available():
device = torch.cuda.current_device() task = "zero-shot-classification"
zero_shot_model = "facebook/bart-large-mnli"
zero_shot_classifier = pipeline(task, zero_shot_model, device=device)
做预测
我将简要讨论如何使用零炮模型进行预测。对于这些例子,我们将预测我自己创建的电影评论的情绪。首先,我们需要定义我们将使用什么标签。因此,我们将标签设置为“阳性”和“阴性”记住,在我们的模型开始预测之前,不需要微调。
labels = ["positive", "negative"]
positive_text = "Wow I loved that movie so much!"
我们现在可以向分类器提供标签和文本来产生预测。
positive_prediction = zero_shot_classifier(positive_text, labels) print(positive_prediction)
结果:{'sequence ':‘哇,我太喜欢那部电影了!’,‘标签’:[‘正’,‘负’],‘分数’:[0.9640112519264221,0.03598877415060997]}
输出是一个有三个键的字典:序列、标签和分数。序列键包含输入的文本。标签键包含按分数顺序排列的标签。最后,scores 键包含从最高到最低的分数,其中所有分数的总和等于 1。
我们可以隔离顶部标签,如下所示。
positive_result = positive_prediction["labels"][0] print(positive_result)
结果:阳性
数据
让我们讨论如何收集数据,然后我们可以标记并用于训练一个小的监督模型。为了简单起见,我们将使用 ss T2——我在过去的文章中描述的实验所用的相同数据集。该数据集可在 Hugging Face 的数据集分发网络上获得,包含被标记为“正面”或“负面”的电影评论。
我们将从安装拥抱脸的数据集库开始。
pip install datasets
现在,我们将导入一个名为“load_dataset”的函数顾名思义,它允许我们从拥抱脸的网络中获取数据集。它需要三个输入,数据集的名称、数据实例和分割。在这里,数据集是一个更大的数据集“glue”的子集因此,load_dataset 函数的第一个和第二个参数分别是“glue”和“sst2”。然后,对于 split 参数,我们将指明是否希望下载训练或验证数据以及实例的数量。
from datasets import load_dataset # Loading 8000 training cases
train_data = load_dataset('glue', 'sst2', split="train[:8000]")
# Loading all 872 validation cases
eval_data = load_dataset('glue', 'sst2', split="validation[:]")
我们来探究一下数据。train_data 和 eval_data 对象都属于“Dataset”类型,这是一个可迭代的对象,其中每个事例都包含一个字典。字典包含三个关键字:句子、标签和 idx。句子关键字包含特定案例的文本。然后,标签键指示格是“正”还是“负”,其中整数“1”指示格是正的,而“0”指示格是负的。最后,在 idx 键下,每个都包含自己唯一的整数值。
for i in range(0, 2):
print(eval_data[i])
print(eval_data[i]["label"])
print("-------------")
{ ‘句子’:“这是一次迷人的、常常令人感动的旅程。",’ label’: 1,’ idx’: 0}
1
— — — — — — -
{ ‘句子’:‘不屈不挠的凄凉和绝望’,‘标签’:0,’ idx’: 1}
0
— — — — — — -
标记和格式化数据
我们可以为训练数据生成自己的标签,而不需要使用零镜头模型的人工注释器。下面的代码迭代训练案例,对于每一个案例,它都使用零命中率模型来生成预测。结果保存在元组列表中,其中每个元组的第一个索引包含案例的文本数据,第二个索引包含字符串形式的标签。这种格式与我们即将训练的 TextBlob 朴素贝叶斯分类器所需的格式相匹配。
train_cases =[]
labels = ["positive", "negative"]
for case in train_data:
result = zero_shot_classifier(case['sentence'], labels)
label = result["labels"][0]
result = (case['sentence'], label)
train_cases.append(result)
我建议你用一个叫 tqdm 的 Python 包给循环添加一个进度条。只需对上面的代码做一些小的修改,就可以实现这一点。
# In terminal
pip install tqdm# Python code start
from tqdm import tqdmtrain_cases =[]
labels = ["positive", "negative"]
for case in tqdm(train_data):
result = zero_shot_classifier(case['sentence'], labels)
label = result["labels"][0]
result = (case['sentence'], label)
train_cases.append(result)
仅此而已,我们只是用了一个 AI 模型来标注我们的数据!我们使用的零炮模型对同一数据集的评估数据的准确率为 88.19%,因此尽管不完美,但该训练仍可用于训练监督模型。
让我们将评估数据转换成适当的格式。我们将使用实际的标签,因为这样可以更好地表明最终模型的准确性。
eval_cases = []
for case in tqdm(eval_data):
label = "positive" if case["label"] else "negative"
result = (case['sentence'], label)
eval_cases.append(result)
训练朴素贝叶斯分类器
现在让我们使用 TextBlob 创建一个朴素贝叶斯分类器。这种分类器使用“传统的”NLP 技术,并依靠概率进行预测。它比变压器模型等深度学习方法需要的资源少得多。我们可以使用名为 TextBlob 的 Python 包轻松创建一个朴素贝叶斯分类器。TextBlob 构建在著名的 Python 包 NLTK 之上,使其更易于使用,在 GitHub 上获得了 7000 多颗星的好评,下载量超过 1000 万次。
pip install textblob
我们现在可以从 textblob 包中导入一个名为 NaiveBayesClassifier 的类,如下所示。
from textblob.classifiers import NaiveBayesClassifier
但是,在我们开始训练分类器之前,我们需要从 NLTK 下载一个名为“punkt”的标记器。记住,TextBlob 是建立在 NLTK 之上的,所以有时候,我们在使用 TextBlob 的时候,必须从 NLTK 下载特定的资源。另外,当安装 TextBlob 时,NLTK 也会被安装,所以不需要 pip 安装 NLTK。让我们导入 NLTK,下载 punkt。
import nltk
nltk.download('punkt')
从这里开始,我们可以用一行代码创建和训练一个分类器,如下所示。
classifier = NaiveBayesClassifier(training_cases)
就是这样!我们现在已经成功地训练了一个朴素贝叶斯分类器,而没有任何先前的标记数据!
评价
我们现在可以用如下所示的一行代码来评估模型,以确定它在评估集上的准确性。
accuracy = classifier.accuracy(eval_cases)
print(accuracy)
结果:0.7603211009174312
就这样,我们的模型有 76%的准确率!
分类
让我们讨论如何使用朴素贝叶斯分类器进行预测。下面的代码检索任意文本的顶部标签。
prob_dist = classifier.prob_classify("I loved this movie") print(prob_dist.max())
结果:阳性
我们也可以得到任何标签的分数。分数介于 0 和 1 之间,其中 1 具有高确定性,0 具有低确定性。所有分数的总和为 1。
print(prob_dist.prob("positive"))
结果:0.907443066804341
结论
我希望你在将来的应用中继续使用这个建议的方法。通过使用这种建议的方法,您可以绕过使用人工注释器来标记数据——这将节省您的时间和潜在的金钱。
有用的链接
上一篇文章更侧重于过程、实验和后续步骤。
订阅我的 YouTube 频道,了解关于本文所述过程的最新内容。
Colab: 包含了本文中使用的代码。
原载于 2021 年 7 月 28 日https://www . vennify . ai。
如何用 Matplotlib 标注图的值
标注地块的简单指南
Matplotlib 使用起来可能有点棘手。我尤其难以在我的图上显示数据点的值。起初我认为这应该是一个简单的任务,但我发现它并不像我预期的那么简单。因此,在这篇文章中,我会解释你如何做到这一点,并且尽可能的简单易懂。
让我们从创建几个随机数据点开始。
import numpy as np
import matplotlib.pyplot as pltx = np.arange(1, 21)
y = np.random.randint(20, size=20)
print(x)
print(y)
>>>[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
>>>[9 13 19 8 13 3 19 17 12 4 7 0 3 9 14 0 11 17 6 10]
创建一个从 1 到 20 的 NumPy 数组。第一个数字包含在内,最后一个数字不包含在内。
np.random.randint(20, size=20)
生成 20 个 0 到 20 之间的随机值,(0 包含 20 不包含)。如果你自己运行代码,你会得到不同的值。
接下来,我们可以简单地绘制数据。这部分用 Matplotlib 很容易。只需调用plot()
函数并提供你的 x 和 y 值。调用show()
函数可视化输出图形。
plt.plot(x, y)
plt.show()
作者创作的情节
为了让它更有趣一点,让我们修改一下情节。我认为这将是一个伟大的添加一个主要标题,对坐标轴的描述,并增加大小。
plt.figure(figsize=(8,8))
plt.plot(x, y)
plt.xlabel("x values", size=12)
plt.ylabel("y values", size=12)
plt.title("Learning more about pyplot with random numbers chart", size=15)
plt.show()
可以使用plt.figure(figsize=(12, 8))
设置地块的大小。注意,先调用 figure
再调用 plot
很重要,否则会得到不希望的结果。另外,请注意,绘图的大小是以英寸而不是像素来度量的。
轴上的标签和标题可以使用xlabel()
ylabel()
和title()
简单设置。这三个函数中的 size 参数决定了标签的字体大小。
代码片段的结果如下。
作者创作的情节
我们仍然缺少数据点本身的 y 值。我们可以通过在一个循环中添加表示每个 x 坐标的 y 值的文本来引入它们。但是在这之前,我们首先需要在开头添加一行额外的代码。新添加的代码行用粗体书写。
**fig, ax = plt.subplots(figsize=(12,8))**
plt.plot(x, y)
plt.xlabel("x values", size=12)
plt.ylabel("y values", size=12)
plt.title("Learning more about pyplot with random numbers chart", size=15)
**for index in range(len(x)):
ax.text(x[index], y[index], y[index], size=12)** plt.show()
第一行调用了plt.subplots()
,它为我们创建了两个对象,并将它们存储在fig
和ax
中。fig
对象用于修改图形,但我们不会在本文中进一步探讨。对象是一个支线剧情,我们可以用它来给剧情添加文本。
ax.text()
允许我们在给定位置添加一个文本到绘图中。前两个参数代表文本的 x 和 y 坐标。第三个参数是文本应该具有的实际值,最后 size 参数决定了文本的字体大小。
通过循环浏览range(len(x))
,我们创建了 20 个文本。数据中的每个 x 坐标一个。我们在下面看到上面代码片段的结果。
作者创作的情节
提示:如果你认为图上的值很难读取,因为它们直接在绘制线的上面,你可以简单地在
ax.text()
中的 y 位置参数上增加一点。
我认为通过增加 x 和 y 刻度的频率来匹配 x 的实际值和 y 的可能值,可以进一步提高图形的可读性。这可以通过将 x 值作为参数添加到plt.xticks()
并将列表中的值 0 到 19 作为plt.yticks()
的参数来实现。此外,作为情节的最后一笔,我还想添加网格线。这是通过调用如下所示的plt.grid()
来实现的。
fig, ax = plt.subplots(figsize=(12,8))
plt.plot(x, y)
plt.xlabel("x values", size=12)
plt.ylabel("y values", size=12)
plt.title("Learning more about pyplot with random numbers chart", size=15)
for index in range(len(x)): ax.text(x[index], y[index], y[index], size=12)
**plt.xticks(x, size=12)
plt.yticks([i for i in range(20)], size=12)
plt.grid()**
plt.show()
作者创作的情节
就是这样!现在,您知道了如何通过添加解释性标签来提高绘图的可读性。
Matplotlib 允许你用你的情节做很多事情,比我在这里提到的要多得多。在这篇文章中,我介绍了一些我一直在努力正确工作的小事情。希望你觉得有用。
感谢阅读。
如何在 6 个月内找到一份数据分析工作
在不到六个月的时间里从零到英雄
数据分析师是世界上最受欢迎的专业人士之一。这些人在数据的帮助下帮助公司做出明智的商业决策。
现在有很多关于数据科学的炒作。
但是,数据科学的准入门槛非常高。这是一个竞争非常激烈的领域,来自不同教育背景的每个人都想进入。
在数据分析领域找工作比在数据科学领域容易得多。
大多数数据科学职位要求你拥有定量领域的研究生学位。然而,我认识的大多数数据分析师都来自完全不相关的背景,也没有技术学位。
数据分析技能可以通过在线课程和训练营轻松获得。学习曲线不像数据科学那样陡峭,而且可以在更短的时间内学会。
即使您之前没有编程或技术经验,也可以在短短几个月内获得成为数据分析师所需的技能。
在这些资源的帮助下,我在短短六个月内获得了一份数据分析的实习工作。
在做了 3 个月的实习后,我收到了一份加入该公司的数据分析师的邀请。
在这篇文章中,我将描述我学习数据分析的步骤。我花了大量的试验和错误来寻找这些资源,并为自己创建一个路线图。
如果你遵循这些步骤,你可以在几个月内学会获得入门级数据分析工作所需的技能。你甚至可以比六个月做得更快,这取决于你每天花在学习上的时间。
第一步:学习 Python
要进入分析领域,你首先需要学习一门编程语言。Python 和 R 是这个领域中最常用的两种语言。
如果你刚入门,我强烈建议学习 Python。它比 R 界面友好得多,也更容易上手。Python 也有大量的库,使得像数据预处理这样的任务变得容易得多。
Python 的应用也比 r 更广泛,如果你将来要进入 web 开发或机器学习这样的领域,你不需要学习一门新的语言。
在线课程
a) 2020 完整 Python 训练营:从零到 Python 中的英雄上:
如果你是一个完全没有任何编程经验的初学者,请参加这个课程。本课程将带您了解 Python 语法的基础,您将了解变量、条件语句和循环。本课程由何塞·波尔蒂利亚教授,他是 Udemy 上最好的讲师之一。
一旦你理解了 Python 的基础和语法,你就可以开始学习如何用它来分析数据。本课程将带您了解特定于数据分析的库,如 Numpy、Matplotlib、Pandas 和 Seaborn。
学完这两门课程后,你将对 Python 及其在分析领域的使用有一个基本的了解。然后,我建议继续进行语言实践。
编码挑战网站
要获得实践经验,请访问 HackerRank 和 LeetCode 等编码挑战网站。我强烈建议 HackerRank。他们面临不同难度的编码挑战。从最简单的开始,然后一步一步来。
当你开始从事分析工作时,你每天都会面临编程问题。像 HackerRank 这样的网站会帮助你提高解决问题的技能。
每天花大约 4-5 个小时解决 Python HackerRank 问题。这样做大约一个月,你的 Python 编程技能就足够好去找工作了。
第二步:学习 SQL
SQL 技能是获得分析工作的必要条件。您的日常任务通常包括从数据库中查询大量数据,并根据业务需求操作数据。
许多公司将 SQL 与其他框架集成在一起,并希望您知道如何使用这些框架查询数据。
SQL 可以在 Python、Scala 和 Hadoop 等语言中使用。这取决于你工作的公司。但是,如果您了解用于数据操作的 SQL,您将能够轻松地掌握其他 SQL 集成框架。
我上了 Udacity 的这门免费课程,学习数据分析的 SQL。DataCamp 也有一个流行的用于数据分析的SQL赛道,你可以尝试一下。
步骤 3:数据分析和可视化
你需要知道如何分析数据,并从中获得洞察力。知道如何编码或查询数据是不够的。你需要能够用这些数据回答问题,解决问题。
要学习 Python 中的数据分析,可以上我上面提到的这个 Udemy 课程。你也可以在 DataCamp 继续数据分析师职业生涯。
从数据中获得见解后,你应该能够展示这些见解。利益相关者需要根据你提出的见解做出商业决策,所以你需要确保你的陈述清晰简洁。
这些见解通常在数据可视化工具的帮助下呈现。可以使用 Excel、Python 库或 Tableau 等商业智能工具来创建可视化。
如果你想成为一名数据分析师,我建议学习 Tableau。它是最常用的报告工具之一,受到大多数雇主的追捧。
这个由基里尔·叶列缅科教授的 Udemy 课程是学习 Tableau 的最佳资源之一。
步骤 4:数据讲述和演示
照片由 Dariusz Sankowski 在 Unsplash
完成前三个步骤后,你已经具备了获得数据分析领域入门级工作的所有必要技能。
现在,你需要向未来的雇主展示这些技能。如果你没有技术背景,你需要向招聘人员展示你有成为分析师的必要技能。
为此,我强烈建议建立一个数据分析组合。在 Tableau 中构建仪表板,使用 Python 分析 Kaggle 数据集,并就您新磨练的技能撰写文章。
你可以看看我的作品集网站这里。
这里有一些数据分析项目的例子,你可以在你的投资组合中展示:
- 创建新冠肺炎世界地图仪表板
- 从 Spotify 收集音乐数据,找出顶级表演艺术家
- 使用 LinkedIn 数据来确定薪资最高的地区
在简历中展示这样的项目会让你在潜在雇主面前脱颖而出。
确保围绕你创建的项目讲述故事。记录下你创建这个项目的每一步,并写一篇关于它的文章。你甚至可以创建自己的博客并发表这些文章。
这增加了你的文章落入他人手中的机会,也就是说有更高的机会被潜在的雇主看到。
结论
如果你想进入数据行业,数据分析是一个很好的起点。与机器学习等领域相比,它的准入门槛较低。
如果你喜欢讲故事和创建演示文稿,你会喜欢在分析领域工作。你的日常工作将包括向非技术人员解释技术概念,你需要努力提高你的沟通技巧。
请记住,数据分析是一个领域,人们花了一生的时间试图学习。即使是成为分析师所需的个人技能,也可能需要一生的时间来学习,因此不可能在短短几个月内掌握。
这篇文章只针对那些试图在数据分析领域找到一份入门级工作的人。
按照上面的步骤,我在 6 个月左右的时间里找到了一份分析工作。即使你以前没有数据经验,每天花 5-6 个小时,你也能做到。
教育是你可以用来改变世界的最强大的武器——纳尔逊·曼德拉
如何在 2022 年找到一份数据科学工作
提高数据科学职位就业能力的 7 项技能
如何在 2022 年找到一份数据科学的工作?照片由 Unsplash 上的 Prateek Katyal 拍摄
在本文中,我将介绍一些有助于你在 2022 年获得数据科学工作的事情。如果你满足了所有这些要求,我相信你会很快找到一份数据科学的工作。
不久前,我写了一篇类似的文章,列出了【2020 年必备的数据科学技能。我觉得我离得并不远。但是数据科学领域在不断变化,现在似乎是推出新版本的时候了。
但是数据科学不是已经死了吗?
我看到一些文章像病毒一样传播,说“数据科学已死”。
也许转换到数据科学的黄金时期已经过去了,但你仍然可以在 2022 年找到一份数据科学的工作。外面有很多工作,我相信进入(技术)数据工作对你的未来仍然是一个很好的选择。
最大的变化之一是现在有许多竞争的职位。数据科学职位的工作规范仍然因公司而异。
一些较新的职位头衔更多的是技术性职位:
- 具有机器学习技能的软件工程师
- 机器学习工程师
- ML 操作
其他一些人正在将数据科学工作放在已经存在的位置上,例如:
- 具有机器学习技能的数据分析师
一些公司希望只雇佣那些精通数据工程的多才多艺的候选人,以便被考虑数据科学职位。
你应该什么都知道吗?
很少有人能深刻掌握所有这些话题。所以,不,你不需要知道所有这些就能找到工作。然而,如果你有时间,提高技能可以大大增加你在就业市场找到匹配的机会。
在这篇文章中,我将列出一些额外的技能,如果你还没有的话,你可以通过这些技能来训练自己。如果你想在 2022 年最大化获得数据科学工作的机会,我希望它能让你很好地理解你需要做什么。
我不包括更标准的技能,如统计学、机器学习和 Python,因为我认为它们是基本的,而且你几乎可以在任何数据科学培训中找到它们。
工作中的数据科学家。克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片。
1.软件工程技能
许多软件工程师已经转向数据科学专业。这增加了数据科学家掌握软件工程技能的必要性,即使你最初不是来自软件背景。
以下是一些你在申请数据科学工作时可能会被测试或质疑的技能。
数据结构和算法
数据结构和算法是软件工程学位的基础。然而,在数据科学学位中,它不一定存在,否则它可能有点多余。
数据结构和算法越来越成为数据科学家面试的技术测试的一部分。原因是越来越多的数据科学职位需要编写生产代码,并将您自己的模型发布到生产环境中。
互联网上有很多数据结构和算法的培训资源。
测试和编写单元测试
编写测试和单元测试曾经是开发人员和软件工程师的领域。2022 年,许多数据科学职位要求他们的候选人能够为自己的代码编写测试。
如果你还没有掌握这个,你可以从学习 PyTest 开始,这很容易。
Pytest。来源:https://docs.pytest.org/en/6.2.x/
你也可以研究一下 测试驱动开发 并从现在开始使用它来提高你在这一点上的技能。
完美无缺
为了从事数据科学家的工作,许多公司还要求你在使用 git 时完美无瑕。该工具过去主要面向开发人员,但如今也成为许多数据科学家角色的必备工具。
你可以查阅一些资源来开始使用 git(git 简介和git 基础知识分步指南,或者直接转到高级 git 使用。
饭桶。来源:http://git-scm.com/downloads/logos
码头工人和集装箱
Docker 是另一种曾经被认为对数据科学家有利的技术,但它很快变得非常重要。Docker 容器允许您解决许多环境设置问题,对于任何希望在本地机器之外的任何地方使用其代码的数据科学家来说,它都是一个很好的工具。
你可以从这里的 Docker 开始。
码头工人。来源:https://www.docker.com/company/newsroom/media-resources。
摆脱笔记本电脑环境
许多数据科学家目前正在研究笔记本电脑环境。如今,很多事情都可以在笔记本上或从笔记本上完成。但是,如果你在其他环境中没有一个坚实的环境,面试官可能会很挑剔。能够展示编写独立软件或构建 Python 包的经验对你的工作申请来说是一个巨大的附加值。
2.机器学习工程和 MLOps 技能
机器学习工程师的角色是数据科学家和软件工程师的结合。MLOps 是相当于 DevOps 的机器学习。
使用自动化 CI/CD 和精心设计的云架构将自己的模型投入生产的能力对于在 2022 年找到数据科学工作来说是一个真正的附加值。
部署
部署模型不一定很难,但这是很多数据科学家没有接触过的东西。要么他们的工作更多地停留在分析方面,要么可能他们公司中有专门的角色来做这部分工作。
我强烈建议您对部署模型所需的技能进行培训,包括架构知识、CI/CD 知识、安全性问题、模型速度/性能问题、监控等。
API、微服务和架构
理解 API 和微服务是如何工作的是这方面的第一步。一旦您理解了如何将您的模型工件转换成服务,您就已经开始理解部署了。
像 AWS 这样的云提供商提供很好的培训和认证,可以帮助你提高这方面的技能。
CI/CD
我建议的第二步是研究 CI/CD。一旦你理解了如何建立一个 API 并以这种方式传递你的模型的预测,将会有很多额外的工作需要去做以使它更健壮。
自动化 CI/CD 管道有助于您更好地管理部署管道。毕竟,如果您将您的模型交付到生产环境中,那么您正在为依赖它的应用程序制造风险。你必须确保一切都彻底完成。
在这些艰难的内容中加入一点动力。照片由你好我是尼克在 Unsplash
3.数据工程技能
数据工程是目前最受欢迎的工作之一。如果你想最大化你的就业能力,拥有数据工程技能将是你最好的选择。
随着许多公司现在拥有数据科学团队,数据质量和可访问性问题成为新的热门话题,数据湖建设和云迁移项目正在各地进行。
有大量的文章列举了数据工程技能,所以我在这里就不赘述了。我觉得这篇文章给出了一个很好的列表,但是还有很多其他的列表。
4.使用多种编程语言
你掌握的编程语言越多,你不满足公司要求的可能性就越小。许多招聘人员只是有一个检查列表,没有任何经验的任何一个复选框会直接阻止你的申请。
您可能需要了解的一些编程语言(当然除了 Python 之外)有:
不同的语言通常要求不同类型的职位。例如,Spark 和 Scala 经常被问到大数据环境中的职位,而 R 和 SAS 可能被问到更多的分析角色,而 Rust 或 Golang 则是你将编写生产代码的工作。
5.深度学习专业知识
在更容易的时候,只要知道如何把一个 scikit 学习管道放在一起,就可以找到一份工作。今天,这远远不够,因为招聘人员将扫描你的简历,寻找深度学习和关键词,如、 NLP 、声音分析等等。
张量流。来源:https://www . tensor flow . org/extras/tensor flow _ brand _ guidelines . pdf
要想应聘很多数据科学的职位描述,掌握 Tensorflow 和 Pytorch 是必须的。期待接受这方面的技术测试,因为计算机视觉和 NLP 已经成为许多领域的重要用例,而几年前它们在简历上只是一个小小的加分项。
当然,这也很大程度上取决于你申请的领域。
如果你正在寻找更多关于深度学习的介绍教程,你也可以查看文章这里或者这里。
6.记得你的数学课吗
数据科学以数学为基础。拥有强大的数学背景是在数据科学领域取得成功的必备条件。
在工作面试和技术测试期间,不要惊讶于偶尔手工计算概率,或者在相对较短的时间内做代数、优化甚至更复杂的任务,而招聘人员正在观察你做什么。
如果解决数学问题不是你每天都要做的事情(很多人都是这样),那么在参加数据科学技术面试之前练习大量的例题将是一个好主意。
7.成为领域专家
领域专长仍然是求职的一大优势。如果你申请的是你非常熟悉的领域的数据科学工作,你将更有可能成功。
将此作为你成为数据科学家的敲门砖是一个好主意。
布雷特·乔丹在 Unsplash 上的照片
结论
总之,是的,你可以在 2022 年找到一份数据科学家的工作。如果你是从零开始,或者正在进行转换,这可能需要一些工作。
如果你还在犹豫,我建议你花些时间去寻找最适合你的工作。数据科学不是工作机会的金矿:我建议只有当你真的喜欢它时才进入它。你也可以查看目前正在流行的许多其他 IT 工作的职位描述。
我希望这篇文章能给你一些启示,让你知道如何在 2022 年为数据科学工作进行培训。感谢您的阅读,请继续关注更多数学、统计和数据科学内容!
如何获得你的第一份数据科学自由职业
任何人都可以遵循的 6 个简单步骤。
马库斯·斯皮斯克在 Unsplash 上的照片
在当今世界,由于疫情的种种不确定性,以及它如何改变了我们对世界的看法,尤其是我们过去对工作文化的看法,自由职业变得比以往任何时候都更有吸引力。许多人已经意识到,他们不需要去办公室或在公司工作来谋生;事实上,我们大多数人意识到,出于各种原因,自由职业是一个更有吸引力的选择。
作为一名自由职业者,你可以完全掌控自己的时间、工作内容、工作地点以及你认为自己的技能值多少钱。不幸的是,这些好处淹没了许多开始学习新技能和尝试从事自由职业的人。不久前,我也是这些人中的一员,试图开创一个自由数据科学家的职业生涯并不容易。
开始总是最难的,但这并不意味着它们是不可能的。无论事情从远处看起来有多难,一旦你付出了努力,采取了一些认真的步骤,那么看起来如此困难的事情就会变得容易处理。
这篇文章将带你了解我在尝试——老实说,在奋斗——开始自由职业生涯时采取的一些步骤。我还想说,不管你想从事什么样的自由职业,这些步骤仍然适用。因此,无论你是想成为一名自由职业的数据科学家、网站开发人员、技术作家还是导师,遵循这些步骤都有望帮助你实现目标。
第一步:确定你将提供的技能
一旦你下定决心成为一名自由职业者,你首先需要花些时间想想你到底想提供什么。数据科学是一个巨大的领域,你可以提供很多东西,从数据清理到模式发现,再到应用机器学习和人工智能算法,或者更高级的主题,如大数据和数据挖掘。您也可以更喜欢创建可视化和仪表板。
不管你想提供什么,你都需要清楚地陈述你的优势和劣势。接下来,列出你喜欢做的数据科学的各个方面,并围绕这些方面打造你的品牌。同样,你可以利用你以前的经验来帮助你完成这一步,即使这些经验不是自由职业者的经验。
第二步:对你期望的项目类型有一个清晰的愿景
第二步与第一步密切相关;我建议你同时做这两件事。当你确定你将提供的服务类型,并清楚地列出你的技能时;你在某种程度上构建了一幅你将在网站上寻找或从客户那里接受的项目类型的图片。
如果你是一个初学者,你可能不清楚你的技能可以准确地应用于什么类型的项目。在准备过程的这一阶段,你可以做研究,寻找什么样的项目,公司和客户想要什么,并尝试将一些类型的项目与你在步骤 1 中列出的技能相匹配。
</7-types-of-gigs-you-can-do-as-a-freelance-data-scientist-5b81f3c203af>
第三步:建立网上形象。
自由职业是一个竞争激烈的领域;你将面对来自世界各地的数据科学家,而不仅仅是来自你所在的城镇、城市或国家。这就是为什么你需要建立自己的品牌,创造你的在线存在。这种存在将帮助你找到客户,并帮助客户验证你的可信度。
建立网上存在有不同的方法;最直接的选择是创建一个投资组合网站。作品集网站是一个你可以讲述你的职业故事的地方,你学到了什么,你建立了什么,以及你是如何建立的。你也可以把你的 LinkedIn 个人资料作为你的投资组合。这些投资组合需要包含以前的工作样本,一些博客,可能还有一些以前的客户或主管的证明。
第四步:在现有平台上做功课
所以你知道你的技能,知道你想做什么项目,并建立一个强大的投资组合。现在,你准备开始问我在哪里可以找到自由职业者的工作。今天,你可以在许多网站上找到数据科学自由职业者的工作,但有些网站比其他网站的可信度更高。你需要知道你没有被骗。
总的来说,你可以通过以下三种方式找到自由职业者的工作,要么联系客户,要么客户直接联系你,要么你可以浏览自由职业者的网站并投标。这一步最重要的是确保你找到的工作不是骗局。一个可以帮助你发现合法工作的资源是 FlexJobs 。
</5-new-data-science-books-that-you-should-consider-reading-c90aec1d5b0d>
第五步:社交,交流,建立关系网
当你开始你的自由职业之旅时,与你所在领域的其他自由职业者联系,并建立一个职业网络,对于拥有一个成功和繁荣的职业生涯是至关重要的。要联系其他自由职业者,你可以试试在线社区,比如 LinkedIn groups 或 T2 自由职业者联盟。
加入一个自由职业者社区将在你的旅程中以各种方式帮助你,从寻找客户到帮助建立小时工资或只是对经常发布的项目类型有一个大致的了解。另一种寻找客户的方法是询问你现有的关系网,宣传你的技能。
第六步:迈出第一步
如果你已经走了这么远,那么你是认真地想要建立一个稳固的自由数据科学职业生涯。现在,你已经准备好迈出第一步,尝试找到你的第一份工作。第一步是去像 Upwork 、to tal、 Codementor 或 AngelList 这样的自由职业网站,开始浏览演出。
尝试获得第一份工作的一个重要建议是,优先考虑经验而不是报酬。因为你需要向客户证明你是认真的和有技巧的,你可以很容易地证明你的技能,浏览演出,投标,不要害怕提供更低的价格或一些免费的额外服务。记住,在开始的时候;你在建立一个品牌。你建得越好,你将来得到的报酬就越多。
外卖食品
我们都追求自由,选择的自由,工作的自由,时间的自由。我们都想在工作的时候控制自己的时间,在休息的时候控制自己的时间,去度假。所以这种自由的时间是我一生中最优先考虑的事情。因为,如果我有这种自由,那么我也有选择在哪里工作的自由,我不必被束缚在一个特定的地点,这对我这样的人来说很重要。
</5-python-books-to-transfer-your-code-to-the-next-level-a5af0981e204> [## 5 本 Python 书籍,让你的代码更上一层楼
towardsdatascience.com](/5-python-books-to-transfer-your-code-to-the-next-level-a5af0981e204)
但是,开展自由职业可能不是最容易的事情,你知道你有技能和能力,但你是客户成功的可能性。你可能像你说的那样好,然后这是一个双赢的局面,或者你可以振奋自己的能力。这就是为什么获得第一个项目或客户是成功的自由职业生涯的重要一步。
一开始,你可能会以低于你认为它的价值的报酬工作,因为你在建立你的声誉,一旦你出名了,你就可以得到合理的报酬,客户会很乐意这样做,因为他们买的是质量。所以,我的建议是,诚实、透明、有耐心,并且努力工作、持之以恒,你也可以在科技数据科学领域拥有成功的自由职业生涯。祝你好运。
如何获得你的第一个自由职业客户/项目
网络和数据科学自由职业项目登陆综合指南。
自从我辞去全职数据工程师的工作,开始全职从事自由职业,已经有将近 3 年的时间了。当我忙于获得我的第一个客户或新项目时,我的职业发展出现了急剧的上升。
除了成长和金钱,我还能找到我真正感兴趣的地方。更不用说,努力实现你的想法会给你带来巨大的快乐。
关于我的职业,我经常遇到的一个问题是
你是如何获得你的第一个自由职业项目的?
因为每个人都知道得到第一份工作可能是最难的。这篇博文和视频(底部)只是关于建立一个策略来开始你的自由职业生涯。
为什么是自由职业者?
如果你有时间,谁不想建立一个副业收入?也许你想攒钱买下一辆车,或者你想休息一年。这就是自由职业的用武之地。
更不用说,你可以成为“你自己的老板”,穿着短裤在海滨别墅工作,同时,你可以赚到无限的钱。你掌控着自己的成长。
所以,给你!
五步迭代,直到你的第一个项目落地
正如信息图(标题图片)所示,你只需遵循这五个步骤中的每一个,直到你得到第一份工作。这里有五个步骤可以帮助你建立自由职业生涯:
- 将您的技能确定为一项服务
- 定义你的理想客户或市场
- 建立您的投资组合和档案
- 向客户推销你的服务
- 捕捉结果/差距,分析每一步的结果,调整方法以保持增长。
步骤 1 —将您的技能识别为服务
简历中的技能部分简单地列出了你在技术和技巧方面的知识,但是你必须确定在现实世界中你能用这些技能做什么。
让客户明白你能为他做什么。
你的技能可能是:
- Web 开发
- 平面设计
- 数字营销
- 数据分析
您的服务可以是:
- 构建高性能的端到端网站和 web 应用程序。
- 为网站、视频和海报创作美丽的插图和数字艺术作品。
- 帮助个人和中小企业在网上推广他们的产品和服务。
- 处理数据以发现模式并回答重要的以业务为中心的问题,从而做出明智的决策。
信息图表列出了每个步骤的注意事项。
大多数人都很难迈出第一步。他们不确定是否准备好了。我相信你永远不会准备好。开始吧!
以下是 Gumroad 创始人 Sahil Lavingia 的推文:
在本文的其余部分,我将重点关注 web 开发和数据科学服务,但是您可以将这些原则应用到您必须提供的几乎任何服务中。
温馨提示:
- 寻找那些从自由职业中获得成功的人。研究并复制他们的过程。
- 学会使用正确的短语——告诉他们你是做什么的,为什么你比其他人更好。
第二步——定义你的理想客户或市场
整篇博文基本上都试图回答**“如何获得你的第一个客户?”**
没有客户就没有自由职业,但这并不意味着你应该向任何人伸出援手或推销你的服务。这对你没有好处,反而会增加你的挫败感。
你从第一步就有了自己的定位,做一些研究,看看谁需要这种服务。
一些客户的例子可能包括:
- 网络开发——本地商店、健身教练、机构、酒店、创作者(现在很热门)
- 数据分析—数据驱动的初创企业/组织
- 开发 ML 模型和应用程序(DevOps)—平台即服务和软件即服务组织。
哪些人不是理想的客户(至少对第一个客户来说):
- 特许经营企业
- 跨国公司,为客户秘密运营的戒备森严的公司(ZS、安永、德勤等)。)
亲提示:
- 寻找个人所有的网络开发企业。
- 对于数据科学项目和机会,首先要确保你很好地掌握了你的基础知识。使用像 codementor 这样的平台来帮助学生完成他们的项目。
第三步——建立你的投资组合和简介
在确定你的定位和目标客户后,是时候建立我们的商店了,在这种情况下,可以是你的投资组合网站(强烈推荐)或 LinkedIn、Upwork、Toptal、AngelList 等平台上的个人资料。
作品集网站
这里要注意的一件重要事情是,你希望有人信任你的业务。
你如何让别人信任你?
你可以从讲述你的职业故事开始。投资组合网站就是这样做的一种方式。如果你还没有故事要讲,那就为自己创作一个故事,也就是说,用网上常用的主题建立一个样本网站,或者你可以提议为一个潜在的客户免费做一个项目。
大多数人会把投资组合网站误认为是在线简历。
投资组合网站不适合你,而是适合你想要锁定的客户。它应该通过以下方式展示您的服务:
- 工作样本— 您创建的网站/应用、报告、会议演讲(如有)等。如果你没有任何样本,创建几个!开发仪表板/网站,托管它们,并展示你可以交付高质量的工作。
- 推荐信/推荐信— 让你以前的同事/老板/客户给你写一封推荐信。
**提示:**如果你以前没有在任何地方工作过,为潜在客户做 1-2 个免费项目,然后请他们写一份推荐信。我已经做了 2-3 个免费的项目,有人把我介绍给另一方。 - 写博客— 这对我来说很有效。这是建立你信誉的一种方式。博客应该包含相关和真实的内容,通过这些内容,客户可以了解他们的业务。从赠送开始!
博客帖子的创意示例:
- 如何通过网站接触到更广泛的受众
- 您的仪表板/报告应该包含什么类型的业务指标
轮廓
除了拥有一个网站,你还需要在 LinkedIn 这样的专业平台上社交,寻找潜在的客户,工作想法,发布更新,宣传自己。
开发作品集网站的原则也适用于社交媒体档案。
一份好的个人资料可以增加你获得机会的几率,原因有很多:
- 这表明你对待工作有多真诚。
- 它可以显示你的工作样本和技能的熟练程度,以提供你的利基服务。
- 如果你有一位真正的同事/合伙人/前老板写的推荐信或推荐信,这会增加你的可信度。
自由职业平台
除了 LinkedIn,还有许多平台拥有完整的自由职业生态系统,客户可以发布他们的需求,自由职业者可以竞标这项工作。
寻找自由职业项目/工作的几个主要平台包括:
- 向上工作
- 顶部总计
- AngelList(针对初创公司的工作)
那么,在这些平台上建立自由职业的成功秘诀是什么呢?
我要说的是,你必须正确理解一份档案的不止一个方面,而是多个方面。您的成功依赖于以下几点:
- 您对平台上列出的技能的熟练程度。
- 你的个人资料整理得有多好。
- 你对这份工作的提议。它告诉客户你有多适合广告上的工作。
- 最后,运气!如果你把前三个方面做对了,它的作用就很小,也很少。
这里有一些建立有吸引力和真实的个人资料的建议
- 回顾你有兴趣申请的项目。记下这些客户用来描述他们需求的关键词和技能。将这些技能(优势)添加到您的个人资料中,可以将您与相关项目联系起来。列出最多 10 项技能。
- 上传一张专业的图片和一份简短的简历,描述你的专长/服务。
- 突出你作品集里最好的作品。
- 如果你有的话,列出你的证书。为您的个人资料增加权重。
- 与你的技能保持一致,完成个人资料的所有部分,简洁明了,并链接校对每一部分。
步骤 4 —向客户推销(外展)
是时候进入正题了,销售符合客户需求和预算的服务的人赢得了机会。
但首先,你需要让客户向你求婚。这是你需要提高知名度和拓展力的地方。
有许多方法可以做到这一点:
- 在 LinkedIn 这样的平台上接触客户——这正是我的优势所在!
- 使用自由职业平台——up work(一般)、Toptal(工程师)、codementor(如果你是专家)和 AngelList。
- 如果你想领先一步,使用 Google Adwords (为你的服务做广告)或创建一个脸书小组,在你的领域、你的实际位置(城市/州)等地方销售服务。
我的方法(不一定对你的小众有利!):
- 我做了大量的研究,寻找与我的定位相匹配的组织。我主要用 LinkedIn , Twitter ,谷歌搜索(浏览)也是一样。
- 我已经根据入围公司的领域(金融科技、医疗保健、教育科技)对它们进行了分类,并创建了一个模板** 消息(类似于一封求职信),以配合他们正在进行的项目以及我自己的想法。**
- 我曾经在每个领域发送我的作品样本,如果没有任何东西可以展示,我会在那个领域开始一个新项目,并向他们发送我的 GitHub repo,告诉他们我在做什么。
2016 年,我通过 Udacity 找到了第一个自由职业客户。因为我是他们的校友之一,他们推出了一个新平台。我的提议符合客户的需求,我被录用了。我认为自己在这方面是幸运的。
从那以后就变得容易了:
步骤 5 —捕捉、分析和协调
你可能会在一天、一个月或六个月内完成你的第一个项目,这个过程中不可或缺的一部分就是不断改进。
你可能会在第一次尝试中失败,但利用这次失败来做得更好。
捕获:
- 你联系的项目/客户的数量。有多少人回应、感兴趣、拒绝或继续。
- 为什么你的提议被拒绝了?向客户征求意见。
- 在你所处的领域取得成功的人,他们在做什么不同的事情?
- 你所在的领域有什么新东西?大家都是怎么操作的?
分析:
- 项目需求和您的投资组合之间的差距——看看缺少了什么。
- 了解你获得的每个数据点,找出你有更多机会转化的客户类型。
- 创建一个单独的客户类别,你必须在他们的需求和你的专业知识之间架起一座桥梁。
点化:
- 开始从事新的项目来获得新的技能或者掌握你已经掌握的技能。
- 重组、润色你的个人资料,使之符合客户的需求。
- 重写建议书,强调他们的需求和您的服务,以及您的工作样本和数字/统计数据(如果适用)。
如果你每天花 2 个小时写建议书和向客户推销,那么至少花 3-4 个小时来完善你的技能。只有当你每天都有好奇心去学习和建立的时候,你的策略才会奏效。
坚持这些原则,你将会得到你的第一个自由职业客户。
你还在等什么?我们开始吧!
你也可以在我的 YouTube 频道上观看这个话题的视频:
如果您想分享您的客户登陆策略/过程,请随时回复本博客或评论视频。
如何在 Google Cloud 上快速启动 GPU 实例
如何在 Google Cloud 上非常快速的启动一个带有 Jupyter 笔记本界面的 GPU 实例?
汤姆·巴瑞特在 Unsplash 上的照片
在本文中,我将向您展示在 Google Cloud 上启动 GPU 实例的最快和最简单的方法。具体来说,我将演示如何在 Google Cloud 上启动一个连接到 GPU 的 Jupyter 笔记本界面。
使用和访问 GPU 进行深度学习项目是必不可少的。深度学习模型只有在 GPU 上训练,才能在合理的时间内训练出来。然而,GPU 很难获得,拥有一个也很昂贵,所以大多数人都指望基于云的 GPU 服务来训练他们的模型。对于许多初学者来说,使用 GPU 的第一个地方是 google Colab,这是一个免费的类似 Jupyter 笔记本的服务,提供免费的 Nvidia Tesla K80 GPUs 供使用。然而,Google Colab 的问题是它在免费帐户中的限制:你最多只能训练你的模型 12 个小时,并且你只能使用有限的内存。升级到 Google Colab premium 并没有提供更多的优势,除了训练模型的时间更长,训练模型的内存更多。为了获得更大更快的 GPU 和更多的内存和计算能力,人们经常使用基于云的 GPU 服务,如谷歌云、微软 Azure 和亚马逊网络服务。
谷歌云是使用 GPU 训练模型的一个很好的简单方法。在这篇文章中,我将解释如何快速建立一个 google cloud 帐户,并使用它提供的 GPU 服务。请注意,我是在 2021 年 2 月写这篇文章的,因此 Google Cloud 的早期/未来版本可能会略有不同,不一定与本文中介绍的细节一致。
第一步是创建一个谷歌云账户。你可以使用你的 Gmail/google 账户来完成这项工作。一旦你建立了你的账户,你应该像这样。
确保您激活您的帐户成为付费帐户。即使他们提供 300 美元的免费信用,你仍然必须升级你的帐户成为付费帐户,因为这是你被允许使用 GPU 的唯一方式。即使你将账户升级为付费账户,你仍然可以在付费前使用谷歌提供的 300 美元免费信用。
在您启动 GPU 实例之前,您需要确保您的配额设置为 1 或您想要使用的任意数量的 GPU。配额实际上是对您可以使用的 GPU 数量的限制。
要增加您的配额,请在搜索栏中搜索配额,然后单击所有配额。一旦你这样做了,你的屏幕应该看起来像这样。
现在,使用 filter 按钮,屏幕左上角有三个横条的那个,来过滤结果。首先,选择“限制名称”,然后选择“GPU(所有区域)”。您应该有一个这样的屏幕:
单击“所有配额”按钮,您应该会看到一个显示全球配额的页面。选择此项,然后选择编辑配额。您应该有一个这样的屏幕:
将 GPU 限制更改为您想要的 GPU 数量。我一般只需要一个 GPU。添加简短描述,并提交您的请求。你增加配额的请求通常会在几个小时内或者最多 1-2 天内得到答复。
需要记住的重要一点是你的项目需要的 GPU 内存量。如果您的模型或输入非常大,那么您可能会使用大量的 GPU 内存,在创建实例时增加 RAM 并不能解决这个问题。根据我的经验,有一种方法可以增加你的 GPU 内存:增加你使用的 GPU 数量。这个图表显示了每种类型的 GPU 有多少 GPU 内存。这是一个固定的数字,不能改变。不增加你的 GPU 内存将导致 CUDA 内存不足的错误,所以如果这个问题适用于你,你一定要解决它。
如果您的配额增加请求获得批准,您将收到一封电子邮件通知您。现在,你可以启动 Jupyter 笔记本了。
回到你的仪表板。选择导航菜单,并在导航菜单上选择人工智能平台->笔记本电脑。
完成后,选择 Create New Instance。您可以选择使用 Google 预先制作的笔记本,或者创建一个自定义实例。通常,我只是做一个定制的笔记本,因为它允许更多的灵活性。
您可以随意调用您的实例,并且可以选择您想要的任何区域。但是,不同的地区可能有不同的可用 GPU,因此请确保选择包含您要使用的 GPU 的地区。
现在,您可以定制您想要使用的任何环境/库(Pytorch/Tensorflow)、您想要的 RAM、您想要使用的 GPU 以及您想要使用的 GPU 数量。请确保该数字不大于您指定的配额。您将在边上看到您选择的相应 GPU 的成本。我个人喜欢使用 Nvidia V100,因为它是用于深度学习的最好的 GPU 之一,所以我的成本是每小时 1.877 美元。
选择创建实例。您现在有一个工作笔记本可以使用了!为了启动实例,请选择要使用的笔记本并启动。
从现在开始,您的 Jupyter 笔记本应该已经启动并开始工作了。您可以定期上传、下载和保存文件。
当您使用完 GPU 时,请确保停止使用,否则,您将继续被收费。
我希望你觉得这篇文章很容易理解,并学到了一些新东西。如果你有任何问题,请在评论中提出。
如何在变色龙云上启动虚拟机
在变色龙云上启动虚拟机的分步指南
凯西·霍纳在 Unsplash 上的照片
在本文中,我将解释如何在变色龙云上启动一个虚拟机实例。在我的情况下,我的机器是 Nvidia K80 GPU。
什么是变色龙云?
变色龙云是和 IBM、阿里巴巴、Google、AWS、Azure Cloud 一样的云计算平台。与变色龙的主要区别在于,如果你有使用许可,它是免费使用的。
与传统的云计算平台不同,变色龙主要用于研究目的,它由美国国家科学基金会资助。所有有权使用变色龙的会员都可以免费使用它的机器。只有学术机构的教师,联邦机构如 R&D 国家实验室中心和研究所,以及国际研究机构才有资格创建关于变色龙的项目。这并不意味着只有低于这个标准的人才能使用变色龙。这意味着任何符合该标准的人都可以创建一个项目,并且可以将任何其他人添加到该项目中。因此,如果你在一个符合上述任何标准的人的指导下做研究,那么你可以要求他们创建一个变色龙项目,你可以加入到那个项目中,并且你可以开始免费使用变色龙机器。
入门指南
当你加入一个项目后,你就可以开始使用变色龙上的机器了。chameleon 上的机器实际上分布在两个主要位置:德克萨斯高级计算中心(TACC)和芝加哥大学(加州大学)。您可以在任一位置探索和使用机器。在本文中,我将使用 TACC 的 Nvidia K80。
要选择地点,登录你的账户,进入 chameleoncloud.org 的,然后进入实验- > CHI@TACC(或 CHI@UC,以你正在使用的为准)。
作者图片
一旦你在那里,它应该看起来像这样:
作者图片
保留
与传统的云计算平台不同,您不能随时启动实例。变色龙使用预订系统,用户必须事先预订机器。您可以通过转到预订->租赁,然后选择主机日历来查看主机日历(基本上是一个显示谁在何时使用实例的日历)。您必须查看主机日历,以了解哪些资源何时可用。它看起来会像这样。
作者图片
要查看哪些特定机器可用,请选择节点类型并选择您的机器类型,在我的例子中是 Nvidia K80 GPU。
作者图片
您可以查看每台机器何时可用,或者某台机器当前是否可用。需要记住的重要一点是,如果一个节点当前已经被使用,您就不能保留它,或者当其他人已经保留它时,您也不能提前保留它。
您可以通过转到预订->租赁并选择创建租赁来预订机器。将弹出一个窗口,看起来像这样
作者图片
租赁名称可以是您想要的任何名称。如果您希望尽快开始租赁,您可以将开始时间留空,变色龙将尝试保留您的节点,默认租赁持续时间为 1 天。租期限于 7 天。但是,如果资源可用,活动租赁在其结束时间 48 小时内最多可以从请求之时起延长 7 天。变色龙会在你租期结束前 48 小时给你发邮件提醒。
创建密钥对并关联 IP 地址
在启动实例之前/之时,您必须创建一个密钥对并关联一个 IP 地址,以便正确启动您的机器。要创建密钥对,请转到计算->密钥对,然后选择创建密钥对。将弹出一个类似这样的窗口。
作者图片
您的密钥对名称可以是任何名称,并将您的密钥类型选择为 SSH 密钥。创建完密钥对后,应该会生成并下载一个名为 .pem 的密钥文件。
在启动一个实例之前/之后(什么时候启动并不重要),您应该创建一个浮动 IP 地址,并且需要在启动实例之后将它分配给实例。
要创建浮动 IP 地址,请转到“网络”->“浮动 IP”并选择“将 IP 分配给项目”。将弹出一个如下所示的窗口:
作者图片
描述是可选的,可以是您想要的任何内容。选择分配 IP。在您启动实例之后,我将展示如何为您的实例分配 IP。
启动实例
预订开始后,您可以在租赁给您的节点上启动一个裸机实例。
转到计算->实例并选择启动实例。将弹出一个窗口,看起来像这样:
作者图片
实例名可以是您想要的任何名称,同样的事情也适用于描述。对于预订,选择您创建的预订。
启动实例之前的下一步是转到源代码。
作者图片
此时,您必须选择您想要的图像。您必须向下滚动图像列表,选择您想要的图像。我使用的是 Nvidia K80 GPU,所以我会选择 CC-Ubuntu18.04-CUDA10。
作者图片
下一步是转到 Flavor 并选择您想要的节点/实例的类型。选择裸机。
作者图片
下一步是转到密钥对并选择您在上一节中创建的密钥对。转到密钥对,找到您在上一步中创建的密钥对并选择它。我把我的密钥对命名为 i_extraction,所以这就是我的窗口的样子
作者图片
一旦完成了所有这些,您就可以启动您的实例了。单击窗口右下角的“启动实例”。您的实例大约需要 10 分钟来加载。您可以通过查看 Compute -> Instance 选项卡来查看它是否已经完成加载并正在运行。
一旦装载了实例,就必须关联前面创建的浮动 IP 地址。转到网络->浮动 IPs。在面板右侧的操作下,选择关联。将弹出一个窗口,并将您的 IP 地址与您的实例相关联。
访问您的实例
我使用的是 Windows 10,因此本指南将介绍如何在 Windows 10 上访问您的实例。对于任何其他系统,请遵循本指南来访问您的实例。注意,对于 windows 用户,你也可以跟随这个视频通过 SSH 登录并访问你的实例。
如果您在没有安装 Linux 子系统的 Windows 上,您必须使用 SSH 客户端。我个人认为这种方法相对容易通过 SSH 登录到您的实例。下载一个像 Bitvise 或者 Putty 这样的 SSH 客户端(我用的是 Bitvise),你的屏幕应该是这样的。
作者图片
转到客户端密钥管理器->导入,并导入下载的密钥对 pem 文件。为此,您必须将文件类型更改为所有文件。在主机旁边的空白处,键入与您的实例相关联的 12 位 IP 地址。在端口旁边,键入 22。在用户名旁边的空白处,键入 cc。这是大多数变色龙实例的默认用户名。在 Initial method 旁边的下拉列表中,选择 public key。一旦你这样做了,一个新的名为 Client Key 的下拉菜单就会出现。在此下拉列表中,选择您刚刚附加的客户端密钥,对于我来说,这是 Global 1。选择登录。现在,您已经通过 SSH 登录到您的实例。此时,您可能会遇到几种不同类型的错误。如果是这样,请检查您的实例是否已经实际启动,您的密钥对是否正确,以及您是否填写了正确的 IP 地址。在某些情况下,您可能已经做了所有正确的事情,但是 chameleon 只是没有将密钥对与实例相关联,它可能无法启动实例。在这种情况下,我建议您删除实例并重新启动它。您可以通过转至“计算”->“实例”并在“实例的操作”下的下拉列表中选择“删除实例”来终止实例。
在 bitvise 中,如果您已经成功登录到您的实例,在窗口的左侧,您将会看到如下内容:
作者图片
新的终端控制台是你可以访问你的终端和运行代码,新的 SFTP 窗口是你可以从你的电脑上传文件。
我希望你觉得这篇文章简单易懂,内容丰富。如果你有任何问题,请在下面的评论中提出。