如何将您的数据科学想法转化为受资助的项目
技术、数据科学、学习
为你的数据科学想法和项目寻找资金的一些建议。
作者图片
所有的数据科学家心里至少隐藏着一点数据科学的想法。然而,由于时间限制或缺乏资金,他们不会将想法转化为项目。
在这篇文章中,我提出了一个将你的想法转化为数据科学项目的策略。所采用的方法基于以下步骤:
- 写一份项目建议书的草稿
- 搜索合作伙伴和协作者(可选)
- 寻找资金
- 根据出资方模板修改项目草案并提交
1 .撰写项目建议书草稿
资助项目的第一步包括撰写项目初稿。在写完整的草稿时,尝试回答以下问题:
- 我的项目涵盖哪个主题?
- 我的项目解决了哪个问题?
通常,一个项目建议书,由以下几项组成:
- 摘要
- 项目目标
- 类似项目
- 项目架构
- 工作计划
- 对社会的影响
- 项目参与者的描述
- 甘特图
1.1 摘要
摘要是对项目的概述。如果你的项目涉及数据科学,总结应该包含与数据科学相关的最重要的关键词,比如机器学习、数据分析、数据可视化、人工智能等等。
为了构建一个成功的提案,该项目还应该处理至少一个与数据科学相关的热门话题,例如由 ODSC -开放数据科学撰写的有趣文章中描述的那些话题。
总结应恢复项目的所有部分,包括背景描述、目标、对社会的影响等。
1.2 项目目标
你的项目至少要解决一个问题,否则不会资助。例如,作为一名数据科学家,你可以提出一种新的机器学习算法,实现一个新的有趣的仪表板来讲故事,或者建立一个数据新闻故事。无论如何,你的项目目标应该非常明确。
一般来说,在撰写本节时,您应该关注两种目标:
- 总体目标,例如提供一个用于讲故事的仪表板
- 具体目标,比如利用拟议中的仪表板来了解蚂蚁随时间推移的行为。
这一部分应该非常清楚,不应该出现歧义。
1.3 类似项目
到目前为止,你已经描述了你的想法。但是,你应该看看你的周围,看看你的想法是否已经被其他人实施了。如果你的答案是肯定的,那就不要浪费时间去写你的提议,相反,要努力为你的想法增加附加值。
您可以通过在搜索引擎上搜索您的总体/具体目标来搜索类似的项目。如果你没有找到任何东西,这并不意味着没有类似的项目,你的想法。很有可能你在以错误的方式寻找。搜索,再搜索,直到你找到至少 2-3 个类似的项目。
为了执行你的搜索,你也可以看看社交网络。例如,你可以利用 Twitter 作为扩展你知识的地方。此外,你可以在谷歌学术搜索,正如我在之前关于如何从数据科学项目撰写科学论文的文章中所描述的。
一旦建立了类似的项目,你可以阅读它们,以获得一些额外的想法,这些想法可以用来丰富你的提案。无论如何,你应该写一段话,描述相关的项目。
1.4 项目架构
现在你可以详细描述你的想法了。尝试建立一个图表,描述它。例如,您可以将项目的每个元素表示为一个组件。在机器学习管道的情况下,您可以为管道的每个元素添加一个组件(数据清理、数据分析、数据测试、数据生产等等)。
这一部分不应该描述用来实现你的项目所采用的技术,比如 Python 或者 R 软件,而是描述一般的概念,元素是如何连接的。
1.5 工作计划
工作计划部分应该描述项目将如何组织。通常项目被组织在工作包中,如下所示:
- 项目管理——与项目管理相关的所有方面,包括如何管理资金的分析
- 建筑设计
- 架构的每个元素一个工作包
- 传播和利用——如何推广项目
1.6 对社会的影响
对社会的影响常常被低估,这是项目建议书最重要的部分之一。事实上,如果一个项目不能为社区带来任何好处,它就是无用的。
在这一部分,你应该描述为什么一般的社会或特定的社区可能会利用你的项目。
例如,在新的在线新闻分类系统的情况下,对社会的影响可能是根据每个用户的兴趣为他们提供更好的新闻建议。
1.7 行为者的描述
一个好的项目建议书应该描述谁来实施它。在这里,你应该包括一份 10 行的简历摘要,重点是实施项目所需的技能。
此外,该部分应包括项目所有其他合作伙伴(参与者)的简短简历(如果有)。你可以在这篇文章中进一步了解如何为你的项目寻找合作伙伴。
1.8 甘特图
甘特图代表您的项目时间表,包括期限。换句话说,它描述了在项目生命周期中如何实施工作计划。
有许多工具可以实现甘特图,比如本文中描述的那些工具。
2 搜索合作伙伴和协作者
到目前为止,你已经写了一份项目草稿,可能有 5-10 页。现在是时候寻找合作伙伴了。首先,你应该确定你要找的伴侣的类型。例如,你可以搜索具有文本分析或数据可视化技能的人。无论如何,试着为每个期望的个人资料和他们在项目中的相关角色写 3-4 个句子。
下一步是在你的同事中或通过你喜欢的社交网络传播这种声音。例如,你可以探索 Twitter 话题,找到一些符合你要求的人,采用我在之前的文章中描述的策略,用 Twitter 扩展你的知识。
或者,您可以利用特定的网站进行合作伙伴搜索,例如欧盟委员会提供的合作伙伴搜索网站,以及本文中描述的网站。
一旦确定了一些潜在的合作伙伴,你可以通过解释你的想法来联系他们。你不必分享项目的完整草稿,只需分享摘要即可。然后,如果合作伙伴同意加入您的项目,您可以与他们分享完整的草案。
*您可以决定不向您的项目添加合作伙伴。*提醒一些项目电话需要至少三个合作伙伴,来自三个不同的国家,因此我强烈建议寻找合作伙伴。
3 寻找资金
寻找资金是最困难的部分,因为它需要不同参与者之间的激烈竞争。无论如何,你可以通过很多渠道获得资助:
- **国家或国际层面的呼吁:**几乎所有国家都会定期发布项目呼吁。例如,欧盟委员会有一个名为融资&招标机会的门户网站,专门用于项目融资。一般来说,在这种类型的招标中很难找到资金,因为竞争非常激烈,而且拟议的项目应该对社会产生很大影响。所以,我建议甚至不要尝试这条路,除非你有一个非常好的想法和一个强大的合作伙伴。
- 基金会的呼吁:基金会也定期发出项目呼吁。通常这类电话是指满足基础要求的小型项目。基金会的例子有大众基金会和与银行有关联的基金会。
- **筹款:**最后,但同样重要的是,你可以尝试筹款选项,通过普通人的自愿捐款来筹集资金。有很多平台是为了筹款而存在的,比如 GoFundme 。
你可以尝试所有建议的渠道,注意为每个选择的渠道修改项目建议书的标题。
4 根据出资方模板修改项目草案并提交
一旦选择了适合您的合适渠道,您应该下载与通话相关的所有文档。你应该仔细阅读它。阅读时,尽量突出最重要的关键词和句子,比如人工智能、机器学习等的新视角。
至少读两遍电话,试着理解电话需要什么。现在你可以修改你的提议草案了,为了包含所有高亮句子的释义。
让你的合作者参与撰写项目建议书的最终版本。
再次阅读您的建议,并最终在截止日期前提交给电话!
米妮·迪法在 Unsplash 上的照片
摘要
在本文中,我描述了一个简单的策略,将您的数据科学想法转化为一个受资助的项目。
最困难的部分是寻找正确的渠道来获得资助,但有了一点经验,你会找到适合你的方式!
感谢您的阅读!你可以在这篇文章中读到更多关于我的信息。
相关文章
https://betterhumans.pub/6-tips-for-extending-your-knowledge-with-twitter-af2bc8c16bdb https://alod83.medium.com/the-death-of-semantic-web-or-new-challenges-e7e8860d9b06
离开前再说一句…
你可能有兴趣阅读我在第集的新故事,名为小女孩和小丑:
卡特琳娜·奥尔米 第一次被带到马戏团的时候才七岁。她有两只蓝眼睛,大如天空,深如大海。金色卷发披在她的肩上。她看起来几乎像一个公主。卡特琳娜·奥尔米是个非常漂亮的小女孩。很好,很好。可能有点太敏感了。 但她有一颗宽大的心 *。*每个母亲都喜欢的女儿。
那天晚上,她和父母一起去看马戏,继续阅读
新到中?您可以每月订阅几美元,并解锁无限的文章— 单击此处。
如何理解具有集成梯度的深度时间序列分类器
作者图片:电机数据的两个实例
时间序列分类是一个常见的问题,可以在许多领域和环境中看到,例如,对于金融产品的给定时间序列,预测客户是否会购买。
然而,由于特殊的时间维度,理解分类器为什么做出决定并不总是一件容易的事情:决定标签的不是时间线上的单个点,而是整个时间线。但是所有的时刻都重要吗?它们的重要性相同吗?对于预测来说,今天比昨天更重要还是星期二比星期天更重要?
在本文中,我试图给出我的解决方案来解释时间序列分类器。本文主要由两部分组成:
- 在第一部分中,我将为一个经典的时间序列分类问题建立一个 CNN 模型。
- 在文章的第二部分和主要部分,我将使用综合梯度来解释模型的预测。
请在这里查看笔记本中我所有的代码。
CNN 模型作为时间序列分类器
我建立的模型考虑了来自本教程的一个例子。
数据集
给定的数据集由电机数据组成,其中每个实例都是电机传感器捕获的发动机噪声测量值的时间序列。该任务的目标是预测发动机是否有特定问题。关于数据集的更多细节,你可以看看这篇的论文。
本文开头的图显示了这个时间序列中的两个实例:类 0 表示不存在问题,而类 1 表示存在问题。此外,我给出了下图:所有三条曲线都属于同一个 0 类(没有问题的类),因此您可以看到,要想知道时间序列可以被标记的原因并不简单:
图片作者:同一类的三个时间序列 0
CNN 模型
时间序列与其他正常特征的一个重要区别是时间线上的每个点都不是独立于预测的。一个时刻一个点不仅应该包含该时刻的信息,还应该包含过去的一部分信息。这需要提取时间序列的特征(平均值、标准差、最大值等)。在观察窗口内)。我们将使用以下代码构建一个 1D CNN 模型来进行分类,而不是进行特征提取:
from keras import models
from keras import layersinput_layer = layers.Input(shape=(x_train.shape[1],1))
conv1 = layers.Conv1D(filters=64, kernel_size=3, padding="same")(input_layer)
conv1 = layers.BatchNormalization()(conv1)
conv1 = layers.ReLU()(conv1)
conv2 = layers.Conv1D(filters=64, kernel_size=3, padding="same")(conv1)
conv2 =layers.BatchNormalization()(conv2)
conv2 = layers.ReLU()(conv2)
conv3 = layers.Conv1D(filters=64, kernel_size=3, padding="same")(conv2)
conv3 = layers.BatchNormalization()(conv3)
conv3 = layers.ReLU()(conv3)
gap = layers.GlobalAveragePooling1D()(conv3)
output_layer = layers.Dense(1, activation="sigmoid")(gap)
model=models.Model(inputs=input_layer, outputs=output_layer)
下面我给出一个情节作为模型的总结。可以看到,模型中有三个 1D 卷积层。
作者图片:CNN 模型摘要
在 3601 个实例上训练并在另外 1320 个实例上测试,该模型在具有早期停止的 220 个训练时期之后达到 0.9697 的 val_binary_accuracy。
IG 解释的时间序列预测
作为解释者的 IG
现在让我们深入一点。如何才能理解模型?为了解释 CNN 分类器,我将使用综合梯度作为工具。我想你对 IG 很熟悉。如果没有,请查看我的上一篇博客,在这篇博客中,我简要介绍了 IG,并展示了一个关于它的实现和限制的例子。
简而言之,IG 将系数概化为线性表达式,其输入要素的值用于测量该要素如何使模型的输出不同于基线输出。在这个例子中,基线被简单地选择为一个时间序列,所有的点都是 0。下面是 IG 的定义。
图片 bu 作者:IG 的定义
根据上述定义,IG 是通过沿着从基线到输入的直线路径累积梯度而获得的。实际上,借助于张量流的自动微分,梯度的计算可以很容易地用下面的代码得到:
def compute_gradients(series):
with tf.GradientTape() as tape:
tape.watch(series)
logits = model(series)
return tape.gradient(logits, series)
结果
为了说明 IG 如何帮助我们理解我们在上一章中建立的模型,我在测试数据集中选择了两个时间序列,它们分别被预测为 1 类和 0 类。图中的曲线显示时间序列,而颜色显示 IG 值的绝对值:颜色越深,IG 值越大。换句话说,曲线上的深色部分对预测的贡献更大。
作者图片:具有 IG 值的类 1 中的时间序列
作者提供的图片:具有 IG 值的 0 类时间序列
结论
我们可以从这两幅图中观察到一些有趣的事情:
- 一个单独的点不能导致预测。在时间线上总是存在一个点的邻域,其中所有点对预测具有相似的贡献值。
- 对于预测来说,时间线上的一些点(间隔)远不如时间线上的其他点重要。
- 即使我们没有导致预测的提取特征的量化值,我们仍然可以对 CNN 分类器的输出有很好的视觉直觉。例如,该值的局部最小值或最大值对预测没有大的影响。
如何卸载 PostgreSQL 13.3 并通过 Brew 重新安装
关于删除通过安装程序安装的 PostgresSQL 并通过 brew for macOS Catalina 重新安装它的分步指南
马库斯·斯皮斯克在 Unsplash 上拍摄的照片
这是给谁的?
对于任何需要完全卸载 PostgresSQL 13.3 的人,该版本是通过安装程序安装的。
本文将涵盖三个主题:
- 如何卸载 PostgreSQL 13.3
- 如何通过 brew 重新安装 PostgreSQL
- 测试它是否工作:创建数据库、用户和授予特权
- 如何卸载 PostgreSQL 13.3
第一步:打开你的终端。检查安装的版本和位置。在我的例子中,它安装在/Library/PostgreSQL/13/bin/psql
下
# check version
$ postgres --version
postgres (PostgreSQL) 13.3# locate where it is installed
$ which psql
/Library/PostgreSQL/13/bin/psql
第二步:根据uninstall-postgres.app
是否安装,我们有两种解决方案。
解 2A:
改变目录运行uninstall-postgres.app
这个应用程序位于bin
文件夹的上层目录,在我的例子中是/Library/PostgreSQL/13
。
# change directory$ cd /Library/PostgreSQL/13
$ open uninstall-postgres.app
如果卸载窗口提示,您可以按照本指南上的【在 Mac 上卸载 PostgreSQL】一节进行操作。
然而,这个解决方案对我不起作用。我收到一条错误消息:
$ open uninstall-postgres.appThe file /Library/PostgreSQL/13/uninstall-postgres.app does not exist.
在网上尝试了许多其他方法后,虽然似乎都没有结果,但我注意到一个有趣的模式,即→对于同一功能,有些人会使用 **postgres**
,而其他人会使用 **postgresql**
。出于绝望,我意外地发现了解 2B。
解 2B :
改变就好→
$ open uninstall-postgres.app
到
$ open uninstall-postgresql.app
。
这是一个很小的变化,但它的工作!🤩
# change directory$ cd /Library/PostgreSQL/13
$ open uninstall-postgresql.app
卸载窗口提示!如果这也适用于你,你可以遵循本指南中的【在 Mac 上卸载 PostgreSQL】一节,直到图 8。
重要提示:在你按照上面的指南,一直到图 8,我们还没有完成!为了删除所有 Postgres 相关文件,您需要执行步骤 3。
步骤 3:删除 Postgres 相关文件
# change to home directory
$ cd ~
$ sudo rm -rf /Library/PostgreSQL
$ sudo rm /etc/postgres-reg.ini# some people also suggested to remove sysctl.conf
# but I don't seem to have this file in my environment
# so I ignored it. You can try if you'd like
$ sudo rm /etc/sysctl.confrm: /etc/sysctl.conf: No such file or directory
🎉🎉🎉万岁!我们成功卸载了 PostgreSQL 13.3!!
2。如何通过 brew 重新安装 PostgreSQL】🍺
我需要卸载 PostgreSQL 的原因是,当我需要创建一个测试数据库时,我不能使用我的同事正在使用的代码。我们怀疑通过安装程序安装的 PostgreSQL 和通过 brew 安装的 PostgreSQL 是有区别的。长话短说,这是真的至少在我的情况下,它解决了问题。
通过 brew 安装 PostgreSQL 非常简单,它有两个步骤:
# 1\. update brew
$ brew update# optional: run brew doctor (I did this.)
$ brew doctor# 2\. install postgresql
$ brew install postgresql
至此,我们可以通过运行下面的命令来启动 PostgreSQL。
$ brew services start postgresql
运行之后,它告诉我们已经成功启动了postgresql
==> **Successfully started `postgresql` (label: homebrew.mxcl.postgresql)**
现在,让我们测试一下它是否工作。
3。测试:执行三项任务—创建数据库、用户和授予特权。
第一步:启动 Postgres
# 1\. launch postgres
$ psql postgrespsql (13.3)
Type "help" for help.postgres=# ls
postgres-# help
Use \? for help or press control-C to clear the input buffer.
postgres-# \q
您可以使用命令\l
查看所有可用的数据库。比如这是我能看到的。
# note: postgres=# is a prompt, not part of the command
# the command is \l, which lists all databasespostgres=# \l
第二步:我创建了一个名为discovery_db
的数据库,你可以根据自己的目的命名这个数据库。
postgres=# create database discovery_db;# use \l to check again
postgres=# \l
现在我们有 4 排,discovery_db
列在最上面。整洁!
第三步:创建一个带密码的用户。
postgres=# create user discovery_db_user with encrypted password 'discovery_db_pass';
第四步:将所有权限授予我们刚刚创建的用户。
postgres=# grant all privileges on database discovery_db to discovery_db_user;
现在,我们再检查一遍→
在输出Access privileges
中,我们可以看到discovery_db_users
拥有与所有者wen
(我)相同的特权😊).
最后,我们可以用内容退出 postgres \q
。
postgres=# \q
关键要点:
- 如果您遇到 Postgres 问题,并且您在网上找到的博客帖子似乎对您不起作用,请尝试修改命令
postgres
到postgresql
,反之亦然。 - Postgres 有许多不同的版本。如果你不能运行其他人的代码,完全卸载 Postgres 并重新安装可能比调试几天更容易。
- 我意识到一旦有了新版本的 Postgres,这篇文章可能会过时,但我认为它至少可以作为 PostgreSQL 13.3 + MacOS Catalina 系统的定时解决方案。
如何通过添加 NLP 的味道来解锁强大的计算机视觉应用
结合 NLP 和计算机视觉的深度学习模型
图片来自 Pixabay
什么是剪辑?
计算机视觉中的自监督学习在学习图像的不同表示方面显示出巨大的潜力。
这是一种神经网络可以学习表示的方法,这些表示可以在以后用于不同的任务,如图像分类和对象检测。
从数据集学习表示的另一种方法称为 剪辑 ,由 OpenAI 开发。
这种方法使用(图像,文本)配对来学习图像编码器和文本编码器。这意味着它结合了自然语言处理和计算机视觉。
我觉得这很酷!
一旦学习了这些编码器,它们就可以在零射击设置中用于完成不同的计算机视觉任务。
剪辑工作原理的高级概述
在下图(左侧)中,我们看到了如何使用(图像,文本)配对来学习两个编码器。一个是文本编码器,另一个是图像编码器。这就好像我们试图将语言映射到视觉,反之亦然。
然后,这两个编码器可以用于一次性设置,以预测图像包含的内容,例如,如下图右侧所示。
剪辑高级概览图(来自原纸[1])
为什么剪辑令人印象深刻?
ResNet-50 在来自 ImageNet 的 128 万个人群标记的训练样本上进行训练。它通过纯监督达到了很高的 top-1 精度。
CLIP 通过不使用这 128 万张图像中的任何一张图像达到了相当的准确性!
CLIP 也达到了与 InceptionV4 相当的前 5 名精度。后者是在一个纯粹的监督环境中接受培训的。
仔细想想,这太不可思议了!
我测试了 CLIP 深度学习模型
使用 OpenAI 提供的开源代码,我给 CLIP 了下面这张图片,是我从股票图片网站 Unsplash 得到的。
WALL-E(来自 Unsplash)
这张图片是一个名叫瓦力的机器人,它曾出现在同名电影中。
我通过给 CLIP 一个包含句子“a robot”的句子字典来测试它。
作者制作的图像
标签问题:[[5.436 e-04 3.622 e-04 4.041 e-04 9.985 e-01]]
夹子答对了!它给了这个标签最高的概率。
然后我给它除了“一个机器人”还加了“瓦力”这个词。
作者制作的图像
标签问题:[[1.329 e-05 8.881 e-06 9.756 e-01 2.443 e-02]]
瞧,它也做对了!
事实上,我保留了两个句子:“一个机器人”和“瓦力”,它给了后一个标签最高的概率!
还记得吗,CLIP 在纯监督环境下既没有被训练识别机器人,也没有被训练识别瓦力。但它仍然能够一次性识别出它们。这太不可思议了!
不仅仅是这样!通过给这个模型贴上“瓦力”和“机器人”的标签,我试图了解 CLIP 对这个图像到底了解多少。我认为“wall-e”这个标签太具体了,但显然这个模型非常强大!
如果要我在其他具体案例上测试,请告诉我!
结论
在本文中,我们了解了自然语言处理和计算机视觉的结合是如何产生一些令人难以置信的结果的。CLIP 是一个深度学习模型,展示了这一点。我们看到了 CLIP 如何在一次性设置中使用,并且仍然做出正确的预测。这是深度学习的未来吗?
参考
[1]亚历克·拉德福德等.从自然语言监督中学习可转移视觉模型
作者制作的图像
我是一名机器学习工程师,致力于解决具有挑战性的计算机视觉问题。我想帮助你学习应用于计算机视觉问题的机器学习。以下是方法。
- 通过帮助您了解该领域的最新动态。我几乎每天都在 LinkedIn 和Twitter上分享一些小帖子。那就跟我去吧!
- 给你一份我的https://nourislam.ck.page/dc3e8b7e12时事通讯上那些琐碎帖子的每周摘要。所以订阅吧!
- 通过在 Medium 上写关于机器学习不同主题的文章。所以跟我来吧!
- 给你一份免费的机器学习工作清单,帮助你检查你需要学习的所有要点,如果你计划在 ML,特别是在计算机视觉方面的职业生涯。你可以在这里 得到核对表 。
5.最后但同样重要的是,通过与你分享我的 免费入门张量流课程 ,它有超过 4 小时的视频内容,你可以在那里问我任何问题。
此外,如果您有任何问题或者您只是想聊聊 ML,请随时在 LinkedIn 或 Twitter 上联系我!
如何上传广告数据到谷歌大查询
来源: Unsplash
了解如何在一个集中的数据仓库中比较和分析您所有营销渠道的广告表现,以及如何轻松地将您的广告数据上传到 GBQ。
如果你像许多营销人员一样,你可能会使用各种数字营销渠道开展活动——不仅包括谷歌广告,还包括脸书、Instagram、Twitter、LinkedIn 等等。没有钱可以浪费,你的目标是从每项营销投资中获得最大收益。为此,您需要清晰、全面地了解客户在所有渠道和设备上的旅程。
在这篇文章中,我们将探讨如何将所有的东西放在一起,并将所有的营销数据上传到一个数据存储中(例如 Google BigQuery ),从而描绘出一幅广告活动绩效的美好画面,并提高所有多个广告渠道的投资回报率。
全渠道营销分析已经成为任何规模和行业的组织的关键工具。然而,大多数营销人员将时间浪费在日常活动上,比如手动组织数据。 OWOX BI 为您耗时的营销常规提供解决方案。有了 OWOX BI,来自付费活动的广告数据将被自动拉入 Google BigQuery。您可以根据自己的需要存储多长时间,根据需要创建详细的报告,了解付费营销计划的真正价值,并更好地利用您的广告支出。
当今数字营销的挑战
今天的客户旅程比以往任何时候都更加复杂。数字说明了一切:根据 Salesforce 的《2020 年关联客户状况报告,72%的消费者使用多种沟通方式来开始并完成一笔交易。从 Z 世代到沉默一代,63%的消费者使用多种设备开始并完成一笔交易。最重要的是,62%的消费者表示,他们更喜欢个性化的产品或服务,而不是标准的“一刀切”的报价。
图片由作者提供
单个客户的旅程可能需要几分钟到几个月的时间。它可能发生在一个渠道中,也可能跨越多个接触点和设备。举个例子:用户可以首先通过智能手机上的脸书广告访问你的网站,然后在初次互动几天后,通过笔记本电脑上的搜索广告注册并购买。在当今多渠道、多设备的环境下,消费者只需点击一下鼠标,就能离开你的品牌,转向竞争对手。
如果你像大多数营销人员一样,你可能正在努力与你的客户保持联系,并让他们通过互联网参与进来。你需要数据——这不用说。像大多数营销人员一样,你可能已经在筛选无数的活动报告,努力发现客户行为的趋势和模式,确定制胜策略,并优化你的营销策略。你留意一些选择的指标,其余的只是堆积在广告平台上,从未真正被分析或使用。
但是这里有一个警告:如果你不关注价值,你就会落后于。
据 Gartner 称,大多数营销分析团队仍然将大部分时间花在组织数据、运行即席查询和生成报告上,而不是实际使用他们的数据来为他们的营销决策提供信息。结果呢?Gartner 报告称,超过一半的高级营销领导对其分析投资的结果感到失望。
自动化日常活动将使您能够专注于对您的组织真正重要的事情,例如提取隐藏的见解并利用它们做出更好、更明智的营销决策。
尽管如此,在你的数据中寻找洞察力之前,你必须在一个地方收集和合并它。最广泛使用的解决方案是 Google BigQuery,这是一个完全托管的无服务器数据仓库,是 Google 基础设施的一部分。
BigQuery 有什么特别之处?
全渠道营销的主要障碍之一是数据存储在彼此不容易沟通的孤岛中。如果你使用许多不同的平台开展付费营销活动,你就会知道密切关注每个活动并试图将所有营销活动的数据整合在一起是多么困难。
这就是 Google BigQuery 的用武之地。
Google BigQuery 是一个无服务器的、可扩展的数据仓库,具有内置的查询服务。它为营销人员提供了一个集中的位置来进行高级数据驱动的营销,而不需要广泛的技术技能、对 It 的依赖或大量的资金投资。
然而,BigQuery 有一个很大的问题——它不能与非谷歌服务集成。
您需要第三方连接器来整合来自非 Google 数据源的接触点。也就是说,如果你想从你的网站、CRM、ESP 或广告平台如脸书广告到 BigQuery 获取数据,你需要一个像 OWOX BI 这样的服务来帮你完成繁重的工作。
图片由作者提供
接受挑战:6 种自动上传常规数据的方法
您可以通过多种方式将您的广告数据上传到 Google BigQuery。主要任务是找到一种适合您的业务的方法,需要最少的努力,节省最多的时间,并提供可靠和准确的结果。
让我们来看看将数据上传到 Google BigQuery 的方法:
- **从 CSV 或 JSON 文件上传数据。**您可以手动将包含广告数据的 CSV 或 JSON 文件直接从 Google 云存储、Google Drive 或您的计算机上传到 Google BigQuery。
- **用 Google Sheets 上传数据(OWOX BI BigQuery Reports 插件)。**你可以使用免费的 OWOX BI BigQuery Reports 插件从 Google Sheets 上传数据。你可以直接从 Google Sheets 或者从 Chrome 网上商店安装这个插件。
- 从谷歌云存储上传数据。 谷歌云存储让你安全地在线存储和传输数据。你可以在谷歌云帮助中心了解数据下载限制和云存储权限。
- **从谷歌广告和谷歌广告管理器等其他谷歌服务上传数据。**要从各种 Google 服务上传数据,首先需要配置 BigQuery 数据传输服务。在您可以使用它之前,您必须选择或创建一个数据项目,并且在大多数情况下,为它启用计费。
- 用big query API下载数据。有了云客户端库,你可以使用你最喜欢的编程语言来使用 Google BigQuery API。
- **使用第三方工具上传数据。**例如,通过 OWOX BI Pipeline ,您可以自动从广告服务以及呼叫跟踪和 CRM 系统中收集数据。这使您能够快速、轻松地从您选择的源中获得现成的完整数据集。
这些方法各有利弊,以及它们最适用的业务挑战。然而,为了跟上现代世界的步伐,最好通过尽可能自动化和简化流程,为你不能委派的任务节省时间和精力。
对于大多数企业来说,最佳决策是选择一个以最快、最简单的方式满足其需求的单一服务。那么,让我们来看看将你的广告数据上传到 Google BigQuery 的最佳方式之一。
BigQuery 和 OWOX BI:释放数据价值的正确组合
OWOX BI 是一个全面的商业智能系统,旨在促进营销分析和决策。借助 OWOX BI,营销人员可以自动集中各种来源的不同数据,并使用这些整合数据来:
- 分析他们的营销努力
- 创建自动化报告
- 揭示客户与组织互动的新见解
- 优化您的营销投资以获得更好的投资回报。
您不必编写一行代码,不必四处寻找连接器,也不必手动准备数据。OWOX BI 会处理好一切。
现在,OWOX BI 和 Google BigQuery 到底能帮你做什么?
汇集来自多个系统的数据
只有在将数据整合到一个集中的位置后,它才变得可操作。您需要做的第一件事是有效地整合您的数据,以便您可以轻松地处理、分析和提取来自所有这些众多客户接触点的见解。你需要知道你信任你的数据,并且你在比较苹果和苹果。
图片由作者提供
OWOX BI 提供了一套连接器,可以自动将你所有营销平台的原始数据,包括 LinkedIn 、 Twitter 、 Instagram 和脸书拉至 BigQuery。结果是一个随时可用的数据集,每天自动更新。此外,您将能够将这些数据与来自其他接触点的数据联系起来,包括来自您网站的原始实时数据以及来自您的 CRM、呼叫跟踪和电子邮件营销系统的数据。你唯一要做的事情就是全力以赴,专注于将数据付诸行动。
处理海量数据
BigQuery 是谷歌云平台的一部分,这意味着你可以获得谷歌的云计算和存储能力。您可以在这里存储万亿字节的数据,包括所有的历史数据,并在几秒钟内对数十亿行进行查询。
减少重复性的工作
在传统场景中,营销人员必须手动在广告服务之间来回切换,以提取数据快照并将其组织到报告和仪表板中。通过 OWOX BI 和 BigQuery 实现这些过程的自动化消除了执行常规数据更新的麻烦,并确保您可以随时获得最新的数据。如果您的广告账户发生变化,OWOX BI 还会追溯性地刷新 Google BigQuery 中的成本数据。
永远不要失去对历史数据的控制
大多数营销平台都对你可以存储多少数据或可以访问这些数据多长时间有限制。有了 Google BigQuery,你可以将来自所有营销平台的数据保存任意长的时间,并对其进行分析,以捕捉不太明显的趋势,这些趋势只有在很长一段时间后才会变得可见。OWOX BI 可以用您的 ad 帐户中的历史数据填充您的 BigQuery 数据集,因此您可以立即开始工作。
进行全面的数据分析
使用 BigQuery 中的数据,您将能够创建原始数据中没有的定制指标和维度,创建任意参数组合,将定制过滤器应用于您的报告。
如果您不喜欢编写 SQL 查询,OWOX BI 可以满足您的需求。您可以使用 OWOX BI Smart Data 中的报告构建器,用自然英语询问您的数据问题,并根据您的数据以组织有序的报告形式获得答案,其中包含您需要的具体指标。
图片由作者提供
可视化数据
通过将 BigQuery 连接到您最喜欢的可视化工具,或者将您的报告导出到数据可视化服务,如 Google Data Studio ,来创建可操作的数据可视化。为此,您不必使用多个数据源:一个 BigQuery 连接器就足够了。
如何用 OWOX BI Pipeline 将广告数据上传到 Google BigQuery
要设置数据收集,您必须在要收集数据的项目中拥有 BigQuery 数据编辑器和 BigQuery 用户角色。一旦这些角色出现在您的项目中,请按照以下步骤将您的广告数据上传到 Google BigQuery:
- 在 OWOX BI 仪表板中,单击创建管道。
图片由作者提供
2.选择要连接的数据源。
图片由作者提供
3.选择 Google BigQuery 作为目的地。
图片由作者提供
4.提供您广告帐户的访问权限。
5.提供对您想要存储导出数据的 Google BigQuery 帐户的访问。
6.选择一个 Google BigQuery 项目并创建一个想要上传数据的数据集(或者选择一个现有的数据集)。
7.指定标记要上载成本数据的期间的开始日期,并选择要将成本数据转换为的货币。
8.点击创建管道。
搞定了。Google BigQuery 会自动收集数据,你可以从你选择的来源获得现成的完整数据。
最后的想法
在数据产生价值之前,需要对其进行收集、处理、分析并付诸行动。借助 Google BigQuery 和 OWOX BI,营销人员可以轻松摆脱手动任务和分散的电子表格,转向成熟的商业智能系统,在该系统中,您可以自动聚合来自多个接触点的数据,并将其转化为有价值的见解。
毕竟,您收集的数据的价值完全取决于您驾驭这些数据并从中做出决策的能力。
如何上传和嵌入交互式绘图可视化
Plotly 是一个很好的交互式数据可视化工具,但是它的 Chart-Studio 服务仅限于 500KB 的上传。
由作者创建
今年我分享了很多我用 Plotly 制作的互动情节。有一段时间,Plotly 的 chart-studio 服务对我来说是一个很好的解决方案,我可以上传我的绘图,以便我可以将它们嵌入到文章或演示文稿中。然而,Chart-Studio 在他们的自由层上有一个相当激进的 500KB 大小限制。除了昂贵的商业计划之外,chart-studio 没有一个透明的选项来支付更大的上传量。
我想一定有更好的方法来分享我制作的交互式网络地图,果然有!在这篇文章中,我将向你展示如何上传一个交互式 Plotly 地图到 Datapane,并将其嵌入到任何网站上。
图表工作室
看看下面描绘阿拉斯加积雪变化的图。我用 Matplotlib 和 Cartopy 创建了它,它们可以很好地将数据投影到底图上。然而,静态地图不允许查看者查看数据值或缩小以获取位置的上下文。此外,虽然像这样的动画地图很有趣,但我认为网络地图上的滑块可以让读者更好地了解随着时间的推移而发生的变化。
由作者创建
制作一个互动版本将意味着我不必在数据可见和观众了解我们在地球上的位置之间做出选择。当我为博客帖子等设置创建地图时,我喜欢使用交互式地图,因为我不会在那里解释背景信息。我倾向于用静态地图来展示,因为我可以向观众提供任何需要的背景。
我们可以很容易地使用 Plotly 重新创建这个交互的情节。但是,有很多数据点,远远超过了 500KB 的 Chart-Studio 限制。但是我们马上会处理这个问题。首先,下面是我用 Plotly 翻拍剧情的代码:
由作者创建
Plotly 剧情截图(作者创作)
下面是这段代码创建的一个屏幕截图。看起来很好!然而,当我使用 chart-studio 上传它时,我得到了以下错误:
import chart_studio.plotly as pypy.plot(fig, filename = 'swe_map_test', auto_open=True)
Plotly 图表工作室大小限制(由作者创建)
如果你有一个只有很少数据点的图,你也许可以摆脱 500KB 的限制。为了让我写的几篇文章的图表符合我的要求,我会随机挑选一些数据。然而,我最近发现了另一个工具 Datapane,它的空闲层有一个更高的大小限制。
数据面板
Datapane 是一种用于创建由数据帧、绘图和文件组成的报告的服务。您可以在 Python 中创建它们并将它们发布到 Datapane。他们还提供了一个免费层,比 Chart-Studio 有更高的上传大小限制。太棒了。
用 Datapane 创建报告非常有用,但是在这篇文章中,我们将重点介绍如何使用 Datapane 来嵌入用 Plotly 和 Altair 制作的交互式绘图。创建一个报告只需要几行代码。
首先,使用 pip 安装 Datapane:
pip3 install datapane
现在您可以创建一个 Datapane 帐户,并通过终端/命令提示符登录:
datapane login --token=[your_token]
现在我们都设置好了,我们可以继续发布我们的数字!
import datapane as dp report = dp.Report(dp.Plot(fig))
report.publish(name="SWE Study Area", open=True)
一旦您运行这个代码,一个新的窗口将会打开,您的绘图将会上传到 Datapane。我们可以通过粘贴“分享”按钮中的 URL 将情节直接嵌入到这篇文章中:
由作者创建
您可能需要进入设置,并将图“可见性”更改为“公共”。由于某些原因,在最新版本的 Datapane 上,在 Python 中设置可见性给我抛出了一个错误。
现在我们有了一个用 Plotly 构建的交互式网络地图,我们可以把它嵌入到任何地方。最棒的是,这个图比我能够通过 Chart-Studio 上传的要大得多,这意味着我可以开始上传更多的网络地图,而无需支付昂贵的订阅费。
在 GitHub 页面上托管
我尝试的 Chart-Studio 的第一个替代方案是用我的情节创建一个 GitHub Pages repo,并通过 iFrame 嵌入它。我在几个地方读到过这种方法,我真的很喜欢它,因为 GitHub Pages 的限制很少。然而,许多网站,比如我们目前所在的网站,不支持手动插入 iFrames。这意味着在 GitHub 页面上托管情节对我的用例不起作用,因为我不能将它们插入到我的文章中。不过,我将向您展示如何做到这一点,因为这是在您自己的网站上嵌入的一个很好的解决方案。
创建 HTML 文件
首先,我们需要使用 Plotly 来导出我们绘图的 HTML 文件。
import plotly.io as pio
pio.write_html(fig, file='index.html', auto_open=True)
这将使用生成的 HTML 文件在浏览器中打开绘图。
设置 GitHub 页面
使用 GitHub 页面托管您的绘图有三个步骤:
- 使用自述文件创建新的存储库
- 上传新的 HTML 文件
- 转到“设置”选项卡,向下导航到“页面”,在“源”下选择您的主/主分支
由作者创建
现在你可以去https://wino6687.github.io/swe_viz_1/看剧情,但是我不能把它放在这里。
包扎
希望这能帮助你找到一个免费的 Chart-Studio 的替代品,它没有 500KB 的上传限制。Datapane 使嵌入图变得非常简单,并且它们与许多网站接口良好。
资源
如何从脸书上传数据到谷歌大查询
来源:沉积照片
在脸书广告档案和网络分析系统中,你可以分析广告表现的基础。对于广告渠道少的小企业来说,这就足够了。
脸书是全球最受欢迎的社交网络,每月活跃用户超过 26 亿。毫不奇怪,它已经成为许多商家的强制性促销渠道。超过 700 万的广告客户在这个平台上推广他们的服务。此外,脸书拥有另外三个最大的社交媒体平台 : Instagram、WhatsApp 和 Facebook Messenger。
脸书和 Instagram 在广告商中受欢迎的另一个原因是接触受众的低价格和准确锁定受众的能力。
脸书收集什么数据
脸书为企业和营销人员提供广告宣传工具:脸书广告经理、脸书像素和脸书分析。
默认情况下,广告管理器提供关于覆盖范围、浏览量、点击量、广告成本等信息。如果你在网站上安装了脸书 pixel,并设置了事件跟踪功能,你就可以通过点击广告来了解用户的行为。
你可以在任何设备上跟踪你的广告给你的网站带来的所有类型的转换,并查看你想要的行为花费了多少。脸书报告显示你所有的点击,注册,订单,购买等。
存储在脸书广告档案中的数据只能告诉你一个来源的有效性。但是,如果一个用户从有机流量中找到你,然后回到你的网站,点击脸书上的链接,并在收到电子邮件后进行购买,会怎么样呢?在这种情况下,你如何评价脸书渠道的有效性?在整合数据之前,您不会知道它如何与其他营销来源交互,以及它们如何影响整体业务。
在大公司,营销不仅限于脸书,销售可以在线上和线下进行。因此,有必要将脸书广告管理器的数据与您的网站、其他广告服务和您的 CRM 的数据结合起来,这样您就可以看到全貌:在广告上花了多少钱,哪些广告渠道更有效,以及财务结果。
为什么要在谷歌大查询中收集脸书的数据?
通过将广告服务的成本数据上传到 Google BigQuery,您可以将成本与网站上的用户活动、呼叫中心的呼叫、电子邮件以及 CRM 系统中的购买订单相关联。这有助于您建立高级分析并评估所有在线和离线营销活动对业务绩效的影响。
上传到谷歌 BigQuery 的营销服务数据可以用于计算你的归因模型,然后 BigQuery 可以将结果传递给系统进行自动投标管理。此外,在谷歌大查询中,你可以根据综合数据和属性计算的结果创建用户受众,然后自动将这些受众发送给广告服务。最后,您可以使用 BigQuery 中收集的数据来构建任何您需要的报告而不受限制。
为什么谷歌大查询而不是其他云存储?
最受欢迎的云平台是亚马逊红移、谷歌 BigQuery 和微软 Azure。与传统的数据仓库相比,它们具有共同的优势:
- 当负载增加时,您不需要维护服务器和连接新的服务器。云存储会自动扩展。
- 云平台比传统存储更快,并自动重新分配负载。
- 进入云存储不需要在电脑上安装服务器。只需打开浏览器,登录云端。
我们选择 Google BigQuery 并推荐给我们的客户,原因如下:
- 谷歌是营销人员数据来源数量的领导者:广告、分析、搜索控制台、YouTube。所有这些服务都与 BigQuery 无缝集成。
- 它能快速处理大量数据。
- 不需要数据库管理员的帮助,很容易上手 BigQuery。只需创建一个谷歌云帐户。
- 您只需为您使用的服务付费。
- 有现成的服务和解决方案可以在不需要开发者帮助的情况下将数据上传到 Google BigQuery。
如何将脸书的数据导入 Google BigQuery
谷歌 BigQuery 没有内置的从脸书广告管理器导入数据的工具。有几种方法可以解决这个问题:手动上传数据,编写自己的脚本,或者使用 OWOX BI 之类的专门服务。让我们仔细看看这些选项。
手动导入数据或使用您自己的解决方案
您可以将脸书广告资料中的成本数据上传到单独的文件中,并通过 BigQuery 界面手动上传。这种方法的缺点是显而易见的:大量不必要的工作,没有自动化。
您还可以编写脚本,从营销服务中上传您需要的数据。然而,您需要不断地监控和支持这些脚本。你还必须花费开发人员的资源来组合来自不同账户和不同日期的数据,检查数据质量,并快速响应广告服务 API 的可能变化。此外,如果脸书广告中的数据发生变化,您需要追溯更新数据,将所有广告来源的成本转换为单一货币,等等。如果你不做这些事情,低质量的数据会导致次优的解决方案,让你的企业损失惨重。
使用谷歌分析将成本数据收集到谷歌 BigQuery 中
使用 OWOX BI,您可以设置从不同广告服务向 Google Analytics 自动导入成本数据,并将成本数据上传到云存储中。如果你使用这种方法,考虑一下谷歌分析的限制:
- 每天最多可将 90 MB 加载到单个数据集中。
- 每个资源每天最多可以下载 50 个文件。
- Google Analytics 可能需要 24 小时来处理上传的数据,并使其在报告中可用。
- 当上传大量数据时,Google Analytics API 可能会出现问题。
- 您上传的参数不能超过 Google Analytics 的成本数据集模式所能包含的参数。
将广告服务的费用直接导入 Google BigQuery
OWOX BI 拥有来自脸书、 Instagram 和 LinkedIn 的直接数据流,你可以通过它将所有活动的原始数据上传到 BigQuery。这些数据方案包含 80 到 200 个参数,这确保了您报告的高粒度数据。
脸书与谷歌 BigQuery 的直接整合有什么好处?
OWOX BI 提供了开箱即用的完整解决方案,您不需要手动做任何事情。该服务以方便的格式收集您需要的所有数据,并监控其质量和相关性。
如果脸书广告中的历史数据发生变化,OWOX BI 会自动更新上传到 BigQuery 的数据。此外,如果有必要,您可以上传您最近六个月的历史数据。这将有助于您评估活动动态。
由于成本数据的导入没有 Google Analytics 的参与:
- 你可以更快地获得数据:费用被直接上传到 BigQuery,你不必再等 24 小时让 Google Analytics 来处理。
- 数据下载没有谷歌分析限制 90 MB 和每天 50 次下载。
- 创建流时,只需指定相同的数据集,就可以将多个 ad 帐户的统计数据下载到单个 BigQuery 表中。
- 来自广告源的数据被编译成 Google BigQuery 中的一方表。这极大地简化了查询的编译和下载数据的分析。
- 成本数据以两种货币上传到 BigQuery。一个字段存储广告服务的原始货币成本。创建流程时,您可以指定将成本数据转换为的另一种货币。转换成本对于必须将不同来源的数据转换为单一货币的报表很有帮助。
如何使用 OWOX BI 设置从脸书广告到 Google BigQuery 的成本数据导入
- 确保你的广告链接有 UTM 标签。
- 在 OWOX BI 主页上,点击创建管道:
图片由作者提供
3.作为来源,选择脸书广告:
图片由作者提供
4.作为目的地,选择 Google BigQuery :
图片由作者提供
如果你在 Google BigQuery 中没有项目, 学习如何开始使用云存储并创建数据集 。
5.选择要从中导出广告费用数据的脸书帐户(或授予对新脸书帐户的访问权限):
图片由作者提供
在任何情况下,OWOX BI 都不会更改您的帐户设置或广告活动!
对于大多数广告平台,OWOX BI 仅请求访问以读取数据。这个访问级别足以让我们获得广告中链接标记的统计数据和信息。但并不是所有的广告服务都有我们期望的这种访问或工作水平。比如使用 OWOX BI 将脸书的原始数据导入 Google BigQuery,需要 ads_management 权限 。
图片由作者提供
6.选择一个已连接的帐户或授予对您要存储导出数据的 Google BigQuery 帐户的访问权限:
图片由作者提供
7.选择一个 Google BigQuery 项目和一个要上传数据的数据集(或创建一个新的数据集):
图片由作者提供
注意! 要设置数据收集,您的 Google 帐户必须被授予目标项目的 BigQuery 数据编辑 和 BigQuery 用户 角色。否则,BigQuery 不会让您上传数据。
图片由作者提供
要检查/授予这些权限,请转到您的 Google 云平台项目中的 身份和访问管理 页面。更多阅读 谷歌文档 。
8.指定管道的设置:
图片由作者提供
- 选择要上传成本数据的起始日期。您可以设置未来或过去的日期。如果您选择过去的日期,请了解历史数据导入的限制。
- 选择默认情况下要应用于导入数据的源/媒体。只有当 OWOX BI 没有接收到实际的 UTM 参数值时,您为 UTM 源/通道指定的默认值才会被写入成本数据表。关于为什么要在管道设置中为 UTM 源/通道指定默认值的更多信息,参见帮助。
**重要!**您可以随时将 pipeline 页面上的源/介质设置更改为除 google/organic 之外的任何值。指定的值将应用于修改后导入的新数据和更新窗口内的历史数据。
图片由作者提供
9.点击创建管道。
搞定了。前一天的数据将在每天 00:00 (UTC)出现在指定数据集中的表中。根据数据量和广告服务 API 的功能,导入数据可能需要 24 小时。表的结构见本条。
如果广告服务中的信息发生追溯性变化,OWOX BI 将在已建立的更新窗口内更新上传到 BigQuery 的所有数据。
关键要点
在脸书广告档案和网络分析系统中,你可以分析广告表现的基础。例如,您可以分析 CTR、CPC、CPA、CR、会话、观看深度、跳出率、RPC 和 ROAS。对于广告渠道少的小企业来说,这就足够了。
然而,如果您与客户有许多接触点,有线下商店,并希望看到完整的购买路径,那么您应该考虑设置高级分析并创建一个自动更新的仪表板,其中包含您感兴趣的所有指标。这将使您随时掌握最新信息,对广告效果进行全面评估,并更快地做出重要决策。
如何使用 Python 向 Google BigQuery 上传数据:3 个步骤
在 Google 的云数据仓库中自动更新 API 数据
图片由像素上的 Anete Lusina 拍摄
Google BigQuery 是一个快速、可扩展的数据存储解决方案,可以轻松地与 Power BI 和 Tableau 等一些顶级数据科学应用程序集成。如果你以前用过 BigQuery,你可能知道它有很多特性。比如,很多功能。这对于新用户来说肯定是令人生畏的,但是如果你坚持下去,你会从这个平台中得到很多有用的东西!
我经常使用 BigQuery 的一个功能是上传数据,以便与其他应用程序共享和集成。与反复编辑和上传 CSV 文件相比,您会发现将一个功能链接到所有应用程序要容易得多!在本文中,我将向您展示如何从 API 中获取数据,并使其易于在各种平台和应用程序之间共享和访问。这应该适用于任何 API,只要您能够输出 pandas 数据帧。
第一步:创建云函数
登录您的帐户后,您要做的第一件事就是转到右上角的“控制台”部分。如果你还没有一个项目,那就按照你的喜好来设置吧。进入控制台后,进入右上角的导航菜单,向下滚动到“云功能”
作者谷歌大查询截图
您需要启用计费来使用此功能,但根据您需要的数据量,此功能不会很贵。云函数可以使用各种语言来做几乎任何事情,从简单的 API 调用到机器学习,所以非常值得!
一旦你进入云函数,点击“创建函数”按钮。名称和区域可以是您喜欢的任何名称,对于触发器类型,我通常将它保存在 HTTP。然后,对于运行时设置,我更喜欢将我的超时设置为最大值 540 秒,内存分配和最大实例数由您决定,但这是我通常使用的:
作者 Google BigQuery 截图
然后点击“保存”和“下一步”,你就可以添加你的自定义 API 了。在您将代码复制并粘贴到 Google 的 IDE 之前,您必须添加一些特定于 BigQuery 的函数。幸运的是,我已经得到了你在第二步中需要的一切!
第二步:添加 BigQuery 特定函数
这些 BigQuery 函数的结构看起来有点复杂,但简单来说,它看起来像这样:
- 功能 1:验证 HTTP 响应
- 功能 2:您的自定义 API 拉
- 功能 3:将数据帧加载到 BigQuery 表中
那么在 python 中这看起来像什么呢?大概是这样的:
如果您已经编写了一个 API 拉脚本,那么您可以将它粘贴到 get_all_data()函数中,然后将整个脚本复制并粘贴到您的 BigQuery 云函数中。就这么简单!在尝试在云中运行 API 调用之前,只需确保它在本地运行即可。
在部署函数之前,要做的最后几件事是确保“入口点”是第一个函数 validate_http,并确保您拥有正在使用的任何库的所有正确的依赖项。这个例子看起来是这样的:
作者提供的谷歌大查询截图
最后,您可以部署您的功能!在您点击部署后,它将运行几秒钟,如果您看到一个绿色的勾号,这意味着您做得对。
第三步:测试并刷新你的表
有很多方法可以让你的新表显示数据,我认为最简单的方法是点击你的云函数,点击“测试”,然后“测试函数”。这将创建一个 BigQuery 表,其中应该包含来自 API pull 的所有数据!要查看该表,只需进入左上角的主菜单,向下滚动到“BigQuery”
作者提供的谷歌大查询截图
在这里,您可以查看数据的模式,查看数据的更新时间,并预览数据集的外观。就这样,您将数据存储在 BigQuery 中!现在你可以将这些数据链接到 Tableau、Google Data Studio、Power BI 或任何最适合你的应用程序。能够从任何地方访问这些数据并将其链接到多个应用程序是非常值得的,您甚至可以通过使用 BigQuery 的“云调度程序”来自动化这个过程。这也可以在主菜单中找到,向下滚动直到看到以下内容:
作者谷歌大查询截图
在这里,您可以决定您希望数据刷新的频率,BigQuery 将自动处理测试过程。这就让你少担心一步了!
最终想法
如果你曾经考虑过使用云数据存储解决方案,我肯定会推荐你使用 Google BigQuery!一开始可能会有很多,但是我认为如果你按照本文中的步骤去做,你应该能够适应它的一些特性。我希望这篇文章能够帮助您更好地理解 BigQuery 以及如何将您的数据上传到云中。非常感谢你的阅读,我希望你有一个伟大的一天!
跟我来!——【https://bench-5.medium.com/】T2
通过使用此链接升级您的中级会员来支持我:https://bench-5.medium.com/membership
如何使用 Airflow 将文件上传到 Google Drive
开发自定义 GoogleDriveOperator
一个可以自动化的常见有用操作是将文档定期上传到 Google Drive 文件夹。例如,这可以是每月上传一次销售数据的 Excel 分析,以便与团队共享。
Airflow provider package apache-airflow-providers-google
提供了允许与 GCP 上的谷歌服务轻松集成的组件。但是,它没有直接提供一个操作者直接上传一个本地文件到 Google Drive。这就是为什么在本文中,我们将学习如何构建我们自己的气流操作符来实现这一点。
我们将分四个连续的步骤来完成这项工作:
- 在 GCP 上配置 Google Drive API 和创建服务帐户
- 在我们的 Google Workspace 上配置全域委托
- 为我们的自定义 GoogleDriveOperator 编写代码
- 测试一个最小的 DAG 上传一个文本文件到我们的 Google Drive 账户
按照这些步骤,我们需要:
- 一个对 GCP 和它所属的谷歌工作区有管理权限的谷歌帐户
- 气流 2.0.x 安装
我在 Docker 上创建了一个公共 GitHub repo 和一个 Airflow 安装以及本文中的所有代码。克隆项目并用docker-compose run
启动它。
1.在 GCP 上配置 Google Drive API 和创建服务帐户
Airflow 通过 Google 云平台上的 Google Drive API 将文件上传到 Google Drive。
转到https://cloud.google.com/并点击控制台。接受条件。迎接我们的是下面的仪表板(可能会因您的组织而有所不同)。
创建新的 GCP 项目
我们将创建一个新的 GCP 项目致力于这一功能。点击选择一个项目,然后点击新建项目。姑且称之为“气流驱动”。选择项目,使名称显示在顶部栏中。
启用 Google Drive API
既然项目已经设置好了,我们可以启用 Google Drive API 了。在页面顶部的搜索栏中搜索“Google Drive API”并选择第一个搜索结果。
点击启用启用 Google Drive API。
创建服务帐户
Airflow 将使用一个 Google 服务帐户来验证 Google Drive API。服务帐户是一种特殊类型的 Google 帐户,代表非人类用户。
从菜单进入API&服务并选择服务账户。
目前此项目中没有服务帐户。点击创建服务账户创建一个。
让我们将服务帐户命名为与项目“气流驱动”相同的名称。
授予服务帐户此项目的所有者角色。
点击完成。服务帐户现在可见。
现在我们有了服务帐户,我们创建一个包含其凭证的 keyfile JSON。Airflow 将使用这些凭证来验证 Google Drive API。转到键选项卡,点击添加键。选择创建新密钥并选择 JSON 格式。
如果您正在使用提供的 GitHub repo ,请将 JSON 密钥文件保存在docker/
目录中。确保将它的路径添加到。gitignore 这样你就不会不小心把你的 keyfile 推给 GitHub 了。不要与任何人共享此密钥!
启用全域性委派
全域委托允许一个服务帐户在 Google Workspace 内代表另一个用户执行操作。这很重要,因为由服务帐户创建或上传的文件对于其他用户来说是不可见的。通过为我们的服务帐户启用域范围的委托,我们将能够以我们自己的 Google 帐户的名义上传文件,以便可以直接访问上传的文件。
转到菜单中的服务账户并点击服务账户的电子邮件。这将打开一个页面,显示服务帐户的唯一 ID。请记下这个数字,因为我们在配置 Google Workspace 时会用到它。
展开“全域委托”下的部分。选中显示启用 G Suite 全域委托的复选框。我们可以输入“airflow.to.drive”作为同意屏幕的产品名称。这个名称并不重要,因为我们不会使用这个特性。点击保存。
GCP 配置现在完成了!
2.在我们的 Google Workspace 上配置全域委托
接下来,我们必须通过我们的 Google Workspace 为服务帐户授权域范围的委托。前往https://myaccount.google.com/。点击右上角的管理控制台。
转到安全,然后转到设置。
在列表底部,打开 API 控件部分。
找到关于全域授权的部分,并点击管理全域授权。
目前,没有条目。点击添加新的。
填写我们在上一部分中记录的服务帐户的唯一客户端 ID,并添加以下范围:https://www.googleapis.com/auth/drive。这将授予具有该特定客户端 ID 的服务帐户对 Google Drive 的完全访问权限。点击授权。
服务帐户现在被授权以 Google Workspace 中任何用户的名义将文件上传到 Google Drive。
Google Workspace 现在已经配置好了!
3.为我们的自定义 GoogleDriveOperator 编写代码
在这一部分中,我们将查看自定义气流操作符的 Python 代码。
像所有气流操作符一样,我们的 GoogleDriveOperator 继承自气流 BaseOperator 类。上传本身是由apache-airflow-providers-google
包提供的 GoogleDriveHook 执行的。操作符接受我们想要上传的本地文件的路径、Google Drive 上的目标文件夹以及 GoogleDriveHook 所需的一些参数。如果参数delete
设置为True
,上传成功后本地文件被删除。将该文件放在plugins/
文件夹中,以便它可以很容易地导入 DAG 模块。
示例 DAG
现在一切都设置好了,我们可以测试 GoogleDriveOperator 并将一些文件上传到我们的个人 Google Drive。
让我们编写一个包含两个任务的最小每日 DAG:
- 使用 BashOperator 在
$AIRFLOW_HOME
的tmp/
文件夹中创建一个包含当前日期的文本文件 - 使用 GoogleDriveOperator 将此文件上传到 Google Drive 上的指定文件夹
此 DAG 将从 2021 年 2 月 10 日到 2021 年 2 月 13 日每天执行。每天都用内容file created on 2021-02-10
创建一个文件,例如my_file_2021-02-10.txt
。然后,这个文件被上传到我们谷歌账户的根目录下的文件夹google-drive-operator
。请注意,delegate_to
参数指定了服务帐户将上传委托给的电子邮件地址。该 Google 帐户将成为上传文件的所有者。
创建气流连接
还有最后一件事要做:我们必须创建由任务upload_file
中的gcp_conn_id
指定的气流连接。启动 Airflow 网络服务器,并转到管理选项卡。打开连接,用以下字段创建一个新连接:
- 连接标识:gcp_conn_id
- 连接类型:谷歌云
- Keyfile 路径: /opt/airflow/ < <您的 JSON keyfile 名称> > >。json ( 或者,我们可以将这个 JSON keyfile 的内容粘贴到 Keyfile JSON 字段中)
- 项目 Id:驱动气流
- 范围:https://www.googleapis.com/auth/drive
运行 DAG
返回到DAG部分并激活 DAG。
执行之后,可以在我们的 Google Drive 文件夹中看到文本文件。
注意,由于域范围的委托,文件的所有者是“我”。如果google-drive-operator
是一个共享文件夹,任何被授权的人都可以访问这些文件。
我希望你喜欢我这篇关于气流和 Google Drive 的文章。欢迎在评论中分享任何有趣的用例或问题!
如何将 Python 包上传到 PyPI
让您的 Python 包在 pip 上可用的分步指南
您编写了一个新的 Python 包,解决了一个特定的问题,现在是时候与更广泛的 Python 社区分享它了。为此,您需要将包上传到一个中央存储库,全球的开发人员都可以访问这个存储库。
在今天的文章中,我们将讨论 PyPI 如何让开发人员与其他希望在自己的应用程序中使用特定功能的人共享包。此外,我们将介绍一个分步指南,帮助您在 PyPi 上上传 Python 包,以便每个 Python 用户都可以使用它。我将使用一个真实的端到端示例,这样所有步骤都非常清楚。
什么是 PyPI
Python 包索引 **,**缩写为 PyPI,是 Python 编程语言的官方软件库。默认情况下,pip
——最流行的 Python 包管理器——使用 PyPI 作为检索包依赖关系的源。
PyPI 允许您查找、安装甚至发布您的 Python 包,以便公众可以广泛使用它们。超过 300,000 个不同的软件包目前发布在索引中,超过 2,500,000 个版本分发给用户。
如何让您的 Python 包在 PyPi 上可用
在下一节中,我们将探索在 PyPI 上发布 Python 包并使其在pip
可用所需遵循的步骤。
步骤 1:确保您已经安装了 pip
如果你使用的是 Python 2 ≥ 2.7.9 或者 Python 3 ≥ 3.4 pip
应该已经安装了。但是,如果出于任何原因您可能需要安装它,只需运行下面的命令(说明适用于 Unix):
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
就是这样!您可以确保pip
现在安装如下。
**$** python -m pip --version
pip X.Y.Z from .../site-packages/pip (python X.Y)
步骤 3:打包您的 Python 代码
我在 GitHub 上创建了一个示例项目,这样可以更容易地演示如何在 PyPI 上发布自己的包。这个项目可以在这个链接上找到——通常你至少需要创建以下文件:
-
**README.rst**
:强烈推荐包含一个 README 文件,您应该在其中概述您的软件包所提供的基本功能。此外,您还可以附上安装说明或使用指南。 -
**LICENSE.txt**
:最好在您打算广泛使用的包中包含一个许可证。有关更多选项和细节,请参考 GitHub 文档的许可存储库部分。 -
**setup.py**
: 这个文件应该放在你的项目结构的顶层目录中。在该文件中,您可以为 Python 项目指定配置。更多详情可参考官方文档。我们的示例项目的setup.py
文件可以在 GitHub 上找到,并且与下面显示的文件相同。 -
**setup.cfg**
:该文件包含setup.py
命令的默认选项。
我们的示例项目的整体结构如下所示
.
├── LICENSE.txt
├── README.rst
├── setup.cfg
├── setup.py
├── src
│ ├── example_publish_pypi_medium
│ │ ├── __init__.py
│ │ └── example
│ │ ├── __init__.py
│ │ └── custom_sklearn.py
├── tests
│ ├── __init__.py
│ └── example
│ ├── __init__.py
│ └── test_custom_sklearn.py
现在我们只需要在 PyPI 上发布我们的包,这样其他用户就可以在他们的本地机器上安装它。注意,我们的示例包依赖于scikit-learn
,这种依赖性在setup.py
文件中被明确指定。因此,当用户使用pip
安装您的包时,指定的依赖项也将被安装。
步骤 3:创建包的源代码发行版
既然我们的源代码是结构化的,并且包含了打包所需的所有文件,我们就可以继续创建源代码发行版了。
源代码发行版—通常称为 sdist —是包含setup.py
文件以及源代码和数据文件(如setup.py
和/或setup.cfg
中所指定)的发行版
您可以通过运行下面给出的命令来创建包的源代码分发:
python setup.py sdist
如果一切按计划进行,应该在新创建的目录dist
下创建一个.tar.gz
文件。在我的例子中setuptools
也增加了一个MANIFEST
文件。
**注意:**如果您碰巧收到类似于以下内容的警告
Unknown distribution option: 'install_requires'
你可以暂时忽略它。
步骤 4:安装麻绳
[twine](https://pypi.org/project/twine/#:~:text=Twine%20is%20a%20utility%20for,and%20links%20to%20additional%20resources.)
是一个实用程序包,用于在 PyPI 上发布 Python 包。
pip install twine
步骤 5:创建一个 PyPI 帐户
为了在 PyPI 上发布一个包,你必须创建一个帐户。你可以通过访问这个链接来实现。这是完全免费的,注册时你只需要提供你的电子邮件地址、用户名和密码。
步骤 6:在 PyPI 上上传源代码发行版
最后,我们现在将使用twine
来上传在 PyPI 上创建的源代码发行版。
twine upload dist/*
系统将提示您输入用户名和密码,您的包将最终在 PyPI 上可用:
twine upload dist/*
Uploading distributions to [https://upload.pypi.org/legacy/](https://upload.pypi.org/legacy/)
Enter your username: YOUR_USER_NAME
Enter your password: YOUR_PASSWORD
Uploading example_publish_pypi_medium-0.6.tar.gz
100%|██████████████████████████████████████████████████████████████| 3.49k/3.49k [00:01<00:00, 2.17kB/s]View at:
[https://pypi.org/project/example-publish-pypi-medium/0.6/](https://pypi.org/project/example-publish-pypi/0.1/)
瞧啊。我们的示例包现在可以在 PyPI 上获得。
使用 pip 安装已发布的包
现在让我们验证我们的包是否如预期的那样工作。
我们的示例项目现在可以在 PyPi 上获得,并且可以通过 pip 安装
正如我们已经提到的,pip
的默认源索引是 PyPI。所以我们的包可以直接从pip
安装。为此,请运行
pip install example-publish-pypi-medium==0.6
该软件包应该成功安装在您的本地计算机上。如果您检查输出,您还会看到scikit-learn
也被安装,因为它是一个依赖项,我们在打包源代码时也指定了它。
最后,我们可以验证该包是否按预期工作:
$ python3
>>> from example_publish_pypi_medium.example import custom_sklearn>>> custom_sklearn.get_sklearn_version()
'0.24.1'
最后的想法
了解如何分发 Python 包并使其广泛可用是很重要的。在今天的文章中,我们讨论了 PyPI 如何被用作包含 Python 包的中央存储库。此外,我们还看到了如何将您自己的 Python 包打包并发布到 PyPI,以便它可以被广泛使用。
但是请注意,强烈建议使用 TestPyPI ,它是原始索引的一个单独的测试实例,允许用户在不影响实际索引的情况下尝试分发工具和流程。一旦您验证了所有的行为都符合预期,那么您就可以使用我们之前研究过的命令将它发布到真正的 PyPI。
你可能也喜欢
https://betterprogramming.pub/11-python-one-liners-for-everyday-programming-f346a0a73f39
如何在量子贝叶斯网络中使用多元分布
量子机器学习实用指南
量子机器学习要不要入门?看看 动手量子机器学习用 Python 。
今天,我们将阐明一个重要的宏观经济问题。“备考会带来更高的就业率吗?”
上学的时候,我一直宁愿打文明也不愿意备考。所以,我会说不。但是我们为什么不更严谨地看待我的信仰呢?让我们来模拟我的信念。完成这项工作的最佳工具是贝叶斯网络。
但是我们为什么不给这个任务增加一点乐趣呢?我们为什么不建立一个量子贝叶斯网络 (QBN)?
“又来了!”你喊?好吧,很公平。我看到你看了我以前的帖子,你已经熟悉 QBNs 了。所以,我们来增加一个挑战。在上周的帖子中,我们了解了量子多内核分布。所以,如果我们把它作为我们 QBN 的一部分不是很好吗?
那么,我们开始吧。
下图描绘了我们今天要建造的 QBN 的结构和 CPT。CPT(条件概率表)包含了 QBN 中变量之间的所有条件依赖关系。因为这些数字都是我编的,所以它们代表了我的信仰。我不是说过我们要塑造我的信仰吗?
作者图片
我们在这里看到了什么?我相信 80%的学生都在准备考试。所以,我是剩下的 20%没有准备的人之一。这个概率分布构成了我们称之为“准备”的变量这是一个有两种可能结果的变量。因此,CPT 有两行。此外,因为 preparation 没有任何父变量,所以我们只有一列值。
这没什么大不了的。我们已经研究过这样的伯努利分布。所以,让我们继续下面的变量——“等级”这是一个有四种可能结果的变量。因此,它在 CPT 中有四行。因为我们有两个可能的输入,所以有两列。这些是从“A”(最好)到“D”(最差)的等级。
我相信,准备考试的学生比那些没有准备的学生取得不同的(更好的)成绩——很可能。但是,当然,你总会看到准备充分的学生不及格(得了个“D”)。你会看到这些幸运儿取得了好成绩,尽管他们没有花下午的时间学习。有时候,我是那些幸运儿之一。
对于“准备”的每一个可能的结果,CPT 告诉我们得到特定分数的可能性。因为我们有四个等级,我们需要八个概率。
最后,我相信成绩影响一个人是否找到工作。不过,我在这里没有提到薪水。但是,让我们假设 90%的 A 级学生找到了工作,80%的 B 级学生找到了工作,只有 30%的 D 级学生找到了工作。
因为这个变量有两种可能的结果,CPT 有两行。但是为了说明其父变量(等级)的四种可能结果,我们需要四列。所以,这张表也需要八个概率。
现在简单的问题是:“这个人群的就业率是多少?
我们从导入将要使用的库开始。我们定义了一个便利函数,它将给定的概率转换成一个量子位旋转角度。详情请看这篇文章。
下一步,我们定义 CPT 的值。对于那些只有两种可能结果(准备和就业)的变量,我们只需要存储一个概率,因为相应的另一个结果的概率是 1。
注释,如 00,表示我们打算分配这些概率的量子态。我们很快就会看到这一点。事先,我们定义了一个量子电路,它有一个量子寄存器和四个量子位。
创建 QBN 时,从父变量开始总是一个好主意。在我们的情况下,这是准备。我们使用 prob_to_angle 函数来指定旋转角度,该角度表示准备就绪的边际概率。R_Y 门相应地旋转量子位,以 0.8 的概率将该量子位测量为 1。
接下来,正如我们在上一篇关于多元分布的文章中了解到的,我们计算了做好准备并获得“C”或“D”等级的概率。
我们将相应的旋转应用于位置 2 的量子位(第三个量子位)。因此,如果学生的等级为 C 或 d,我们说这个量子位为 1。当你再次查找概率的定义时,你会看到这些等级在第一个位置共享值 1(10 或 1 1)。在我们的QuantumRegister
中,我们保留了位置 1 和 2(范围从 0 到 3!)为 Multinoulli 变量。所以,只有当位置 0 代表准备的量子位是 1 时,我们将位置 2 的量子位旋转一个角度,这个角度定义了等级 C 或 d 的概率。
接下来,我们要把这个概率分成 C 和 D 两个值。为此,我们将位置 1 处的量子位旋转一个角度,该角度代表给定 C 或 D 的可能性的等级 C 的概率。但是,我们仅在位置 0(准备)和位置 2 (C 或 D)处的量子位为 1 时旋转量子位。
mcry
(多控
R
Y
R_Y
RY gate)为我们完成了这个任务。我们使用位置 0 和 2 的量子位作为控制量子位(它必须是 1 ),以便 gate 应用。我们使用位置 1 的量子位作为目标量子位。
如果学生有所准备,我们对 A 和 B 年级也做类似的事情。主要的区别是,我们将这部分封装到
N
O
T
NOT
NOT ( qc.x
)门,我们在位置 2 应用量子位。这实质上“选择”了学生成绩不是 C 或 D 的情况。因此,它必须是 A 或 B。而且,由于我们已经将 C 和 D 与 A 和 B 分开,我们不必在这里再次这样做。
这就是我们为那些备考的同学所做的一切。现在,让我们转向那些没有的人。这一次,我们使用非门来“选择”没有准备好的学生。代码的其余部分与我们为准备好的学生所做的类似。我们先把 C 和 D 的成绩从 A 和 b 中分离出来,然后,我们把 C 从 D 中分离出来,A 从 b 中分离出来,最后,我们再次取消选择没有准备好的学生。
最后,我们必须具体说明在给定特定分数的情况下被雇用的概率。在这一点上,我们不再关心学生是否准备好了。这是因为,在我们 QBN,准备对就业没有直接影响。
我们分别选择每个等级,并旋转代表就业的量子位(位置 3 的量子位)。由于如果学生有 D 级,两个控制量子位(位置 1 和 2)都是 1,默认选择这个状态,我们可以直接应用多控 R Y R_Y RY gate。
为了选择 C 级,我们必须将 N O T NOT NOT gate 应用于量子位 1,因为这个量子位的值区分了学生是得到 C 还是 d。
相应地,我们将 N O T NOT NOT gate 应用于量子位 2 来选择 B 级。最后,我们对量子位 1 和 2 应用 N O T NOT NOT gates 来选择 A 等级。
这就完成了我们的 QBN。我们准备好运行它了。首先,我们使用 statevector_simulator 后端来计算所有状态的概率。
我们可以看到每个状态的概率。例如,状态 1011 具有 0.256 的最高概率。在这种状态下,学生是有准备的,因为位置 0 的量子位是 1 (101 1 )。并且,如位置 1 和 2 的量子位所示(1 01 1),该学生得到了 B 的成绩。这些学生也得到一份工作,如位置 4 的量子位所示( 1 011)。
作者图片
我们可以很容易地计算出被雇用的总概率,方法是将位置 4 的值为 1 的所有状态相加。但是相反,我们用量子电路凭经验完成这项工作。
我们使用只考虑我们测量的量子位的qasm_simulator
。因此,我们必须添加一个包含常规位的ClassicalRegister
。一位就足以衡量就业情况。
当我们按照 shots 参数中的指定运行电路 1000 次时,我们将得到以下结果。
作者图片
如果 80%的学生准备考试,70%的学生会找到工作。如果只有 20%的学生准备怎么办?
我们可以为变量指定相应的值,然后重新运行电路。
结果显示,尽管只有 20%的学生为考试做了准备,但仍有 58%的学生找到了工作。
作者图片
那么,我们从这一切中学到了什么?最重要的教训是,我不是职业顾问。所以,请完全忽略你可能从结果中得出的关于准备考试是否值得努力的任何结论。
其次,我们学习了如何在我们的 QBN 中使用多内核分布。尽管它只有四个可能的值,但构建它比使用伯努利分布要花费更多的精力。当然,我们可以稍微简化一下代码。准备网络并不太复杂。实际上,主要的问题将是在你的 QBN 中得到你需要的所有概率。
但这是贝叶斯网络成为如此伟大工具的一个方面。它们明确了你对某个特定领域的所有信念。因此,每当你面临生活中的重要决定时,你可以创建一个(Q)BN 来验证你的信念并观察结果。只要记住结果代表你的信念。这些可能是错误的。
量子机器学习要不要入门?看看 动手量子机器学习用 Python 。
免费获取前三章这里。
如何在 Tensorflow 2.x 中使用已保存的模型
关于保存和重用 Tensorflow 训练模型的教程
作者使用 wordart.com 生成的图像
在我之前的文章中,我写了关于使用 TensorFlow 2.x 的模型验证、正则化和回调。在机器学习管道中,创建一个经过训练的模型是不够的。一旦我们完成了训练、验证和测试,并保留了一部分数据,我们将如何处理训练好的模型呢?在实践中,我们希望导入这样一个经过训练的模型,以便它可以在一些实际应用中有用。例如,假设我在相机图像上训练了一个模型来识别行人。最终,我想使用训练好的模型,通过安装在自动驾驶汽车上的摄像头,对检测行人进行实时预测。此外,训练模型还需要将模型保存为检查点,特别是当您在非常大的数据集上训练模型或者训练时间大约为几个小时时。如果您的训练由于某些原因而中断,比如您的编程逻辑中的缺陷、您的笔记本电脑的电池没电、存在 I/O 错误等等,模型保存也是有用的。
最终,我想使用训练好的模型,通过安装在自动驾驶汽车上的摄像头,对检测行人进行实时预测。
保存和加载模型
在保存模型时,我们可以做几件事情。我们希望在每次迭代(历元)中保存模型权重和训练参数,每隔一段时间保存一次,还是在训练完成后保存?我们可以使用内置回调,就像我们在我之前的文章中看到的那样,在训练过程中自动保存模型权重。或者,一旦训练完成,我们也可以保存模型权重和其他必要的信息。
保存的模型有两种主要格式:一种是原生 TensorFlow 格式,另一种是 HDF5 格式,因为我们通过 Keras API 使用 TensorFlow。
在训练过程中保存模型的例子:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.losses import BinaryCrossentropy
from tensorflow.keras.callbacks import ModelCheckpointmodel = Sequential( [
Dense(128, activation='sigmoid', input_shape = (10, )),
Dense(1)])model.compile(optimizer = 'sgd', loss = BinaryCrossentropy(from_logits = True))checkpoint = ModelCheckpoint('saved_modelname', save_weights_only=True)model.fit(X_train, y_train, epochs = 10, callbacks = [checkpoint])
你可以看到,我使用ModelCheckpoint
类创建了一个对象checkpoint
,它接受一个参数,该参数将被用作保存模型的文件名。由于使用了save_weights_only=True
,所以只会节省权重,不会节省网络架构。最后,我们将callback = [checkpoint]
传递给 fit 函数。
如果我们提供‘saved_modelname.h5
而不是‘saved_modelname’
,那么模型将以 HDF5 格式保存。
为了加载先前保存的权重,我们调用load_weights
函数。
model = Sequential( [
Dense(128, activation='sigmoid', input_shape = (10, )),
Dense(1)])
model.load_weights('saved_modelname')
手动保存模型权重,无需回调
我们也可以通过在培训结束时调用save_weights
来手动保存模型
model = Sequential( [
Dense(128, activation='sigmoid', input_shape = (10, )),
Dense(1)])model.compile(optimizer = 'sgd', loss = BinaryCrossentropy(from_logits = True))model.fit(X_train, y_train, epochs = 10)
**model.save_weights("saved_modelname")**
您还可以分析保存模型的目录:
total 184K
-rw-r--r-- 1 ivory ivory 61 Jan 12 01:08 saved_modelname
-rw-r--r-- 1 ivory ivory 174K Jan 12 01:08 saved_modelname.data-00000-of-00001
-rw-r--r-- 1 ivory ivory 2.0K Jan 12 01:08 saved_modelname.index
在这里,您可以看到保存的实际模型是saved_modelname.data-00000-of-00001
,文件的其余部分包含元数据。
保存整个模型
到目前为止,我们看到我们只保存了模型权重。然而,保存整个模型是非常容易的。在实例化ModelCheckpoint
类时只需传递save_weights_only=False
。
checkpoint_dir = 'saved_model'
checkpoint = ModelCheckpoint(filepath=checkpoint_dir,
frequency = "epoch",
save_weights_only = False,
verbose= True)model.fit(X_train, y_train, callbacks=[checkpoint])
在这种情况下,将创建一个包含以下内容的新目录:
total 128
drwxr-xr-x 2 ivory ivory 4096 Jan 12 01:14 assets
-rw-r--r-- 1 ivory ivory 122124 Jan 12 01:14 saved_model.pb
drwxr-xr-x 2 ivory ivory 4096 Jan 12 01:14 variables
在这种情况下,主模型保存在文件saved_model.pb
中,其他文件是元数据。
最后,我们可以如下使用保存的模型:
from tensorflow.keras.models import load_model
model = load_model(checkpoint_dir)
如果我们想在训练程序完成后保存模型,我们可以如下调用save
函数:
model.save("mysavedmodel")
如果使用model.save(“mysavedmodel.h5”)
,那么模型将被保存为一个单独的文件mysavedmodel.h5
。
保存的模型可用于使用全新的数据集进行预测。
model.predict(X_test)
我的 GitHub repo 在https://GitHub . com/rahulbhadani/medium . com/blob/master/01 _ 12 _ 2021/Saving _ Model _ tf2 . ipynb中给出了一个更具描述性的例子。
确认
这篇文章的动机是作者从 TensorFlow2 Coursera 课程https://www . Coursera . org/learn/getting-started-with-tensor-flow 2/。读者可能会发现这个例子与 Coursera 课程中的例子有相似之处。教师允许使用 Coursera 课程中的代码示例(以其原始形式或经过一些修改)。
如何在 Python 中使用抽象类
什么是抽象类?
抽象类是一个类,但不是可以直接从中创建对象的类。它的目的是定义其他类应该是什么样子,也就是说,它们应该有什么样的方法和属性。
在抽象类中定义(但未实现)的方法和属性被称为抽象方法和抽象属性。所有抽象方法和属性都需要在子类中实现,以便能够从中创建对象。
我们可以通过继承属于[abc](https://docs.python.org/3/library/abc.html)
模块的ABC
类来创建一个抽象类。
from abc import (
ABC,
abstractmethod,
) class BasicPokemon(**ABC**):
def __init__(self, name):
self.name = name
self._level = 1 **@abstractmethod**
def main_attack(self):
...
在上面的代码中,我们创建了一个名为BasicPokemon
的新抽象类。我们通过使用装饰器abstractmethod
指出方法main_attack
是一个抽象方法,这意味着我们期望在BasicPokemon
的每个子类中实现它。
如果你尝试直接从BasicPokemon
创建一个对象会发生什么?TypeError
!
试图从抽象类创建一个新对象,但由于 main_attack 未实现而失败。图片由作者提供。
现在,你会注意到BasicPokemon
的__init__
方法需要一个name
参数,因此上面的代码无论如何都不会起作用。这里需要注意的是,它甚至没有使用__init__
方法来检查这一点。事实上,它有一个尚未实现的抽象方法,因此它失败了!
这就是如何使用BasicPokemon
类。
from collections import namedtuple Attack = namedtuple('Attack', ('name', 'damage')) **class Pikachu(BasicPokemon):**
def main_attack(self):
return Attack('Thunder Shock', 5) **class Charmander(BasicPokemon):**
def main_attack(self):
return Attack('Flame Thrower', 5)
现在我们可以毫无问题地从这些类中创建对象。
创造了一个新的皮卡丘,名叫…乔治。图片由作者提供。
注意,您也可以使用相同的abstractmethod
装饰器创建抽象属性。
from abc import (
ABC,
abstractmethod,
) class BasicPokemon(**ABC**):
def __init__(self, name):
self.name = name **@property
@abstractmethod**
def level(self):
... **@abstractmethod**
def main_attack(self):
...
现在,我们需要在子类中实现属性level
和main_attack
方法。
class Pikachu(BasicPokemon):
**@property**
def level(self):
return 1 def main_attack(self):
return Attack('Thunder Shock', 5)
我们可以只使用 NotImplementError…对吗?
你们中的一些人可能想知道为什么我们不能使用一个普通的类(即不从ABC
继承)并为还没有实现的方法产生一个NotImplementerError
,就像下面的例子。
class NotAbstractBasicPokemon:
def __init__(self, name):
self.name = name
self._level = 1 def main_attack(self):
**raise NotImplementedError()**
上面的代码将让你从NotAbstractBasicPokemon
创建对象,只有当你试图使用main_attack
时才会失败。这通常是不可取的行为。
从 NotAbstractBasicPokemon 创建对象,并在尝试调用 main_attack()时出错。图片由作者提供。
相反,试图从BasicPokemon
创建一个对象会立即导致错误,正如我们前面看到的。
什么时候应该使用抽象类?
在我们在这篇文章中使用的例子中,BasicPokemon
的目的是作为一个的蓝图,为特定种类的口袋妖怪创建其他类。拥有一个每个人都需要继承的抽象类来创建一个新的口袋妖怪有几个明显的好处:
- 避免代码重复。
- 确保其他人实现子类方式的一致性。
- 确保没有人忘记在子类中实现关键的方法和属性。
当你在一个团队中工作,并且你希望其他人重用/扩展代码时,以上几点尤其重要。
结论
在这篇文章中,我们看了 Python 的抽象类,以及它们如何给我们一种方法来描述我们期望子类如何被实现,以及当关键部分没有被定义时如何警告用户(即其他程序员或我们未来的自己)。
https://eminik355.medium.com/subscribe
- 通过 Medium 关注我的更新。
- 通过我的推荐链接加入 Medium 以无限制访问帖子。你的会员费直接支持我和你看的作家。
参考文献
[1]https://docs.python.org/3/library/abc.html
https://realpython.com/python-interface/
更多来自同一作者。
https://medium.com/analytics-vidhya/multi-armed-bandits-part-1-epsilon-greedy-algorithm-with-python-code-534b9e2abc9 https://medium.com/analytics-vidhya/calculating-using-monte-carlo-simulations-337cff638ac5
如何使用亚马逊 Textract 读取发票和收据
自然语言处理
AWS 和 Amazon Textract 入门。
在 Unsplash 上由 Atakan Narman 拍摄的照片
今天,我们将冒险进入 AWS 世界,用 Amazon Textract 玩一玩。我们将拍摄一张发票的扫描图像,并从中提取信息。主要是,我们将:
- 创建 AWS 用户
- 安装 AWS CLI
- 安装和配置 AWS SDK
- 上传到 S3
- 代码!
使用的大部分代码来自 Amazon Textract 开发人员指南。它可以在这里找到:
如果你想跟随我使用的相同文件,请在我的 Github 上查看项目回购。
让我们开始吧!
1.创建 AWS 用户
首先,进入https://aws.amazon.com/console/,点击屏幕右上角的橙色按钮登录。
接下来,使用“Root 用户”选项登录。
输入您的密码。
如果您已经激活了 MFA,请输入它。
您将进入 AWS 管理控制台主页,在这里您将看到最近访问过的服务。
找到屏幕顶部的搜索栏,键入“IAM”以显示可用 AWS 服务的下拉列表。点击写着“IAM”的那个。
然后,您的浏览器将显示 IAM 仪表板。在页面左侧找到“用户”并点击它。
点击屏幕右上角的蓝色按钮“添加用户”。
填写用户名,勾选“编程访问”和“AWS 管理控制台访问”并设置密码。然后,单击“下一步:权限”。
单击“直接附加现有策略”框。
你的屏幕应该看起来像下面的截图。点击“下一步”。
找到屏幕中间的搜索框,输入“textract”。
找到“AmazonTextractFullAccess”并点击左边的复选框。
接下来,在搜索栏中键入“s3”。
找到“AmazonS3FullAccess”并点击左边的复选框。然后,点击“下一步:标签”。
添加标签是可选的。点击“下一步:回顾”。
点击页面底部的“创建用户”按钮。
您应该会看到类似下面的内容:
非常重要!!! 点击“下载。csv”并将文件保存在安全的地方。一定要记下你把它保存在哪里。以后哪里会需要里面的资料。
瞧啊。您应该会看到一个屏幕,确认已经创建了一个新用户。
在屏幕的右上方,找到您的帐户别名(我的是 ecdedios ),点击它会显示一个下拉菜单。最后,点击“退出”。
点击“重新登录”。
这一次,点击“IAM 用户”而不是“根用户”。
键入您的帐户别名,然后单击“下一步”按钮。
键入您刚刚创建的 IAM 用户名,并填写密码。点击“登录”。
如果出现提示,请更改密码。否则,我们就完成了这一步。
2.安装 AWS CLI
要下载 AWS 的命令行界面,请访问https://docs . AWS . Amazon . com/CLI/latest/user guide/CLI-chap-install . html。
在这个练习中,我使用了 AWS CLI 版本 2。
在下一页中,找到您的操作系统并点击它。比如,我点击了“视窗”。
找到能让你下载最新版本的链接,然后点击它。
然后应该会打开一个“另存为”对话框。把文件保存在某个地方。
找到您刚刚下载的文件,双击它启动安装程序。在弹出的窗口中单击下一步。
您应该会在下面看到类似的内容。
完成后,您会在安装窗口上看到确认信息。接下来,单击“完成”按钮。
接下来,让我们确保它安装正确。
启动您的终端,键入以下内容:
aws --version
这一步就到此为止。
3.为 Python 安装和配置 AWS SDK(boto 3)
对于这一步,我们将为 Python 安装和配置 AWS SDK。
如果您想了解更多 Boto3,请查看它的文档:
启动一个终端,键入下面一行:
pip install boto3
让脚本完成它的任务。
完成后,让我们通过键入以下行来进行配置:
aws configure
它会提示您输入凭据。首先,找到您在步骤 1(创建一个 AWS 用户)中下载的文件。
出现提示时,复制并粘贴“访问密钥 ID”,然后复制并粘贴“秘密访问密钥”。粘贴完每一张后,你必须按回车键。接下来,当提示输入“默认区域名称”时,在您的首选区域中键入。
当提示输入“默认输出格式”时,不要输入任何内容。再次按回车键。
就是这样!我们现在已经准备好用 Python 与 AWS 通信了。
4.上传到 S3
对于这一步,我们将上传一个图像文件到 S3 桶。我们将使用这张图片作为我们的输入文档,并要求 Amazon Textract 阅读它。
让我们重新登录 AWS 控制台。
单击 IAM 用户。
键入您的帐户别名。
单击“下一步”继续。
键入您在步骤 1 中创建的用户(非 root)凭据。
此时,您应该会看到 AWS 管理控制台。
找到页面顶部的搜索栏,输入“S3”。接下来,选择服务下的“S3 ”,如下所示。
找到橙色按钮“创建桶”。水桶就像一个文件夹。我们将在里面保存(上传)文件。
填写“Bucket name ”,并选择一个与您在步骤 3 中输入的区域相同的 AWS 区域。接下来,向下滚动页面,您会发现页面右下角有一个橙色按钮。点击它“创建桶”。
您应该会看到一条确认消息,表明已经创建了一个新的存储桶。接下来,单击我们刚刚创建的存储桶名称。
找到橙色的“上传”按钮并点击它。
点击“添加文件”。
从您的计算机中选择一个图像。扫描的发票或收据就可以了。
向下滚动到下一页,找到橙色的“上传”按钮。点击它。
点击“关闭”。
您应该会看到该文件列在“对象”下。
好吧!现在,该编码了。
5.密码
这是我们将要阅读的文件:
现在,让我们启动 Jupyter 笔记本,导入一些项目,并设置笔记本显示设置。
然后,复制并粘贴下面的代码。 重要!!! 不要忘记再次检查第 42 行,确保它与您一直使用的区域相同。
也重要!!! 注意你的文件夹结构,以匹配第 79 行。
下面是代码的作用:
首先,它连接到 S3 并获取我们将输入到 Textract 的对象(图像文件)(第 30–33 行)。然后,它将文件加载到内存中,并将其送入 image(第 35–39 行)。接下来,我们调用 Amazon Textract API(第 41–42 行)。最后,我们调用analyze_expense
来分析图像,并将结果存储在response
中(第 45 行)。
第 48–76 行解析response
,并在图像文件上绘制边界框。第 79 行在本地保存图像。最后,第 81 行返回response
的内容。
对于下一个单元格,复制、粘贴并定制下面的代码,以匹配您的存储桶名称和对象(文件)。
现在我们准备调用上面的函数。
让我们来看看输出:
漂亮!
现在,让我们考虑下面的代码:
我们在上面所做的是过滤响应,以便它只给我们那些置信度值小于 90%的元素。
我们可以说,工作和销售人员是标签,而“技术技能(点)忍者”不是。不出所料,这个元素的置信度只有 39%。
很酷,不是吗?
就这样,伙计们!我们已经成功地进入了 AWS 的世界,并与 Amazon Textract 进行了合作。
谢谢你过来看我的帖子。我希望你学到了新的东西!在我随后的文章中,我们将深入探讨 AWS 及其提供的大量服务。
敬请期待!
如果你想了解更多关于我从懒鬼到数据科学家的旅程,请查看下面的文章:
如果你正在考虑改变方向,进入数据科学领域,现在就开始考虑重塑品牌:
如何使用自回归(AR)模型进行时间序列分析
python 中使用自回归模型进行预测的初学者指南
在处理时间序列数据时,可以使用自回归模型来预测未来值。预测背后的概念是使用以前的数据点来计算未来的数据点。
在这个简短的初学者友好指南中,你将学习如何创建一个自回归模型,并用它来预测未来的价值。
例子
**举个简单的例子,**可以让你知道它是如何工作的:
现在是下午 2 点,我们想预测下午 3 点的值。为了做到这一点,我们可以使用已知的 2pm 和 1pm 的值。从数学上讲,它可能如下所示:
x(t) = b0 + b1x(t-1) + b2x(t-2)
是我们希望对其进行预测的时间。 t-1 是前一个时间点,而 t-2 是向后两个时间点。
b 值是通过拟合数据集的自回归模型得到的权重。
术语
**滞后:**处理时间序列数据时,每个跨时间的数据点称为一个滞后。
**偏差或权重:**上例中的 b 值为权重。它们是描述输入变量和我们预测的变量之间的相关性的值。如果权重为正,也称为正相关,这意味着输入变量与预测变量的移动方向相同。相反,如果权重为负,那么它会向预测变量的相反方向移动。
例如,值为 10 (正值)的输入变量上的权重 -0,7 会将 -7 加到输出值上,从而对其产生负面影响。
如果权重值非常接近 0 ,则表明变量的先前值和未来值之间可能没有相关性,因此无法进行预测。高于 0.5 或低于- 0.5 的值表示强相关。
**自相关:**当输出变量本身与其早期变量之间计算相关性时,预测变量与输入变量之间的关系或相关性称为自相关。
数据集
在本指南中,我们将使用澳大利亚墨尔本的数据集,其中包含了 10 年间的最低日温度。该数据集是由澳大利亚气象局创建的。
如果你想按照这个指南编码,那么你可以在这里找到数据。
寻找自相关
为了找出哪些滞后与预测值有很强的相关性,我们可以使用 statstmodels 模块中的plot_acf()
函数。这将创建一个图表,显示每个先前的滞后对未来滞后的影响程度。
如上所述,高于 0.5 或低于 -0.5 的值被认为具有高相关性,因此在查看曲线图时,我们可以使用这些值作为阈值来决定是包括还是忽略特定的滞后。
下面的代码块创建了这个图,我在
y = 0.5 处添加了一条垂直线,以便于查看哪些滞后符合 0.5 阈值。
请注意,我将 y 轴限制在 0 到 1 的范围内。您通常不应该这样做,因为相关性也可能是负的。我这样做是为了提高图的可读性,只是因为我已经知道所有的滞后都是正相关的。
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
import numpy as npdf = pd.read_csv('australia_temp_data.csv')fig, ax = plt.subplots(figsize=(16,8))
plot_acf(df['Temp'], lags=50, ax=ax)
plt.ylim([0,1])
plt.yticks(np.arange(0.1, 1.1, 0.1))
plt.xticks(np.arange(1, 51, 1))
plt.axhline(y=0.5, color="green")
plt.show()
作者创建的 acf 图
在分析剧情的时候,我们可以看到第一个滞后对我们未来的价值有非常强的相关性。滞后 22 是明显高于绿色阈值线的最后一个滞后。因此,我们现在知道使用 22 个滞后来创建我们的自回归模型。
将数据分成训练和测试数据集
为了能够评估我们的模型,一旦我们训练了它,我们需要一些数据来测试它。因此,我们将使用数据集中的一些最新值作为测试数据。
从上面代码块中的代码继续,我们可以按如下方式分割数据:
df_train = df['Temp'].iloc[:-5]
df_test = df['Temp'].iloc[-5:]
这使得训练集由整个数据集的最后 5 个值组成,并且训练集是直到最后 5 的所有值。
创建和拟合模型
既然我们已经将训练和测试数据分开,并且我们知道在我们的模型中要考虑多少滞后,我们就拥有了创建模型所需的一切。
我们使用 statsmodels 模块(版本 0.13.1)中的AutoReg
类。
如果您使用的是 Google Colab 笔记本,那么您可能没有安装最新版本的 statsmodels。您很可能安装了 0.10.2 版本,而我将使用 0.13.1。要得到这个版本,你可以调用
pip install statsmodels==0.13.1
,然后重启笔记本的运行时间。
from statsmodels.tsa.ar_model import AutoReg
model = AutoReg(df_train, lags=22).fit()
现在已经创建了模型,并对训练数据进行了拟合。接下来,是时候进行一些预测,并通过与测试值进行比较来评估准确性。
预测和评估
forecasts = model.forecast(5).tolist()
test_values = df_test.tolist()
for index in range(len(forecasts)):
difference = forecasts[index] - test_values[index]
print(forecasts[index], test_values[index], difference)
为了进行预测,我们简单地调用模型上的forecast()
函数,并向它传递我们想要预测的滞后量。这将返回一个熊猫系列对象,我们可以使用它的tolist()
函数将它转换成一个列表。
在循环中,我们在测试数据集中的实际值旁边打印预测,以及它们之间的差异。打印结果如下所示。
作者创建的预测值、测试值以及它们之间的差异
为了获得可用于评估模型性能的单个数字指标,我们可以计算两个值列表之间的均方误差。这可以通过使用 scikit-learn 模块中的mean_squared_error()
功能来完成,如下所示。
from sklearn.metrics import mean_squared_error
print(mean_squared_error(test_values, forecasts))>> 1.181958471550279
结果显示,我们的预测平均误差约 1.2 摄氏度。为了直观地了解预测的准确性,我们还可以在同一个图中绘制预测和测试数据。
fig = plt.subplots(figsize=(12,8))
plt.plot(forecasts, color="green")
plt.plot(test_values,color="blue")
plt.xticks(np.arange(0,6,1))
plt.yticks(np.arange(12.5, 17, 0.5))
plt.show()
作者创建的预测和测试数据图
这里我们可以清楚地看到,在滞后 4 时(x 轴上的 3),距离很远。然而,其他预测实际上相当不错。
摘要
在这篇简短的指南中,您学习了自回归背后的重要背景理论,包括一些数学知识和术语。您学习了使用 acf 图来查找用于创建模型的滞后量。接下来,您将数据集分为训练和测试数据子集。最后,您了解了如何进行预测以及评估其性能的一些方法。
我希望你喜欢这个指南,并学到一些有用的东西!
感谢阅读。
学分
1——Jason Brownlee,用 Python 进行时间序列预测的自回归模型,机器学习掌握,可从https://Machine Learning Mastery . com/auto regression-Models-Time-Series-Forecasting-Python/获取,2021 年 12 月 20 日。
如何在 R 中使用和可视化 K-Means 聚类
通过美国传统基金会的 2020 年经济自由指数数据,学习使用和可视化 R 中的 K 均值聚类分析
作者用 K-Means 和 R |图像制作的聚类图图像
目标
- 在 R 中使用 K-均值聚类算法
- 确定正确的集群数量
- 创建集群的表格和可视化
- 从网上下载、提取复杂的 Excel 文件并加载到 R
- 高效地清理、争论和过滤数据
介绍
K-Means 聚类是一种无监督的机器学习技术,对于根据数据集中存在的独立变量的中心将独特的数据分组为几个相似的组非常有用[1]。几个经典的例子是在公司忠诚度计划中对不同类型的客户进行聚类,并将医疗患者分为低、中、高和极端风险类别[1]。
在本文中,我们将使用美国传统基金会免费提供的 2020 年经济自由指数数据集 [2]。我们还将使用一个 R Markdown 文件(。RMD)可通过此链接在我的 GitHub 上下载。我将假设您可以在您选择的机器上下载并安装 R 和 RStudio。
这篇文章的结构是:
- 加载所需的库
- 导入数据
- 清理数据并修复格式问题
- 展示创建 K 均值聚类的几种不同方法
- 展示几种有用的可视化效果,您可以根据需要将它们应用到您的项目中
让我们投入进去吧!
代码
加载库
首先,我们需要将 *tidyverse、FactoMineR、factoextra、*和 readxl 加载到我们的 R 环境中。如果您得到一个关于软件包未被识别的错误,请在您需要的 install.packages() 行之前取消注释(删除#)。
# Install if needed by removing the #
# install.packages("tidyverse")
# install.packages("readxl")
# install.packages("FactoMineR")
# install.packages("factoextra")# Load Libraries
library(tidyverse)
library(readxl)
library(FactoMineR)
library(factoextra)
将您的工作目录设置到包含您的文件并有空间下载. xls 文件的文件夹中也会对您有所帮助。这可以通过 setwd() 命令或使用 RStudio 导航文件菜单到文件夹位置,并使用更多下拉菜单设置工作目录来完成,如下所示:
在 RStudio 中设置工作目录
下载数据
现在我们需要下载数据。网页的链接可以在这里找到,或者如果你想在传统基金会的网站上了解更多的数据,可以在我的 GitHub 的 T2 RMD 文件中找到。单击页面顶部的“下载原始数据”按钮,您应该会得到一个名为 index2020_data.xls 的文件,我们将在项目的其余部分使用该文件。
导入数据
最简单的做法就是导航到有数据的文件夹,点击它,自动调出 readxl 图形界面。为了简单明了,我继续将我的数据重命名为 EFI_data 。这些截图应该有所帮助:
在 RStudio 中导入数据集
RStudio 中的 readxl GUI
更改名称并点击导入按钮后,RStudio 会自动生成一些代码到您的控制台。最好将没有“>”的第一行复制/粘贴到文件中,以便稍后能够快速加载数据。看起来是这样的:
RStudio 中的 EFI_data 控制台输出
代码应该如下所示:
# Import Data
EFI_data <- read_excel("index2020_data.xls")
用代码将数据导入 RStudio
初步查看数据
如果可能的话,在我们做有趣的事情之前,快速浏览一下数据,看看是否有任何明显的问题需要解决,这总是一个好主意。
下面是中间部分数据的截图。让我们看看有什么突出的。
初步看看 RStudio 中的一些 EFI 数据
我想到的是,丢失的数据被标记为“N/A ”,我知道 R 不会喜欢。这些数字看起来也很奇怪,有些又短又甜,而有些则有太多的小数位。此外,我们中的热心人注意到,在数据导入阶段,所有应该是数字的列实际上都是字符。我们还必须解决数据类型问题。
清理数据
首先,让我们摆脱“不适用”的问题。有很多方法可以做到这一点,但我将依靠一个技巧 R 和“相信魔术”一点点。为了避免下面的步骤变得复杂,请相信我,在继续之前,我们应该从 EFI_data 中获取原始的列名。让我们使用这个代码:
# Get original column names
EFI_data_col_names <- names(EFI_data)
接下来,我们将使用 lapply() 函数,并将 gsub() 函数放入自定义*函数()*中,以查找字符串 “N/A” 的任何出现,并将其替换为 nothing。当我们像这样构造函数时,我们依靠 lapply() 的速度来执行调整,这比使用 for 循环要快得多,因为 R [1]是单线程的。在下一步中,我们将依靠 R 将空数据强制转换成正确的 NA 格式。浏览数据,亲自查看结果。
代码如下:
# Fix "N/A" in the data set
EFI_data <- data.frame(lapply(EFI_data, function(x) {
gsub("N/A", "", x)
}))
虽然这个函数在数据本身中做了我们希望它做的事情,但 R 认为自动更改列名是个好主意。又烦又乱,就用这段代码把原来的名字放回去吧:
# Put the right column names back
names(EFI_data) <- EFI_data_col_names
自定义函数的时间到了!
让我们做一个,把所有的字符列都变成数字,并四舍五入到两位小数。我们将在下一步中插入这个自定义函数。
代码如下:
# Create custom function to fix data types and round
to_numeric_and_round_func <- function(x){
round(as.numeric(as.character(x)),2)
}
创建了自定义函数后,我们将使用 mutate_at() 函数来更改除了应该保留文本的四列之外的所有列。
代码如下:
# Mutate the columns to proper data type
EFI_data <- EFI_data %>%
mutate_at(vars(-one_of("Country Name", "WEBNAME", "Region", "Country")), to_numeric_and_round_func)
实际上,我们不需要 Country 或 WEBNAME 来进行实际分析,所以我们现在将通过使用以下代码使它们为空来删除它们:
# Remove Country and WEBNAME
EFI_data$Country <- NULL
EFI_data$WEBNAME <- NULL
k 均值聚类
有两种主要的方法来做 K-Means 分析——基本方法和花式方法。
基本 K 均值
在基本的方法中,我们将做一个简单的 kmeans() 函数,猜测一些集群(5 通常是一个好的起点),然后有效地将集群编号粘贴到每一行数据中,然后就结束了。我们必须首先删除任何丢失的数据,这可以用下面的代码来完成:
# create clean data with no NA
clean_data <- EFI_data %>%
drop_na()
我们还想设置种子,以确保代码的可重复性:
# Set seed
set.seed(1234)
下面是基本 K 均值方法的代码:
# Cluster Analysis - kmeans
kmeans_basic <- kmeans(clean_data[,7:32], centers = 5)
kmeans_basic_table <- data.frame(kmeans_basic$size, kmeans_basic$centers)
kmeans_basic_df <- data.frame(Cluster = kmeans_basic$cluster, clean_data)# head of df
head(kmeans_basic_df)
以下是输出结果:
基本 K 均值聚类方法的前六行
这显示了添加到每一行数据中的簇号。
我们还可以在这里使用 kmeans_basic_table 查看每个集群的属性(中心、大小):
基本 K 均值聚类方法的大小和中心
我们还可以像下面这样浏览在 kmeans_basic_df 对象中带有集群号的每一行数据:
每个国家的基本 K 均值数据和聚类的大视图
对许多人来说,基本的方法将带你到你需要去的地方。从这里,您可以按区域、每个集群的数据或您想要的任何内容绘制图表。
我创建了一个快速的 ggplot() 例子,按区域分解每个集群的计数。我们可以做几十个不同的情节,但这是一个很好的,简单的演示。
代码如下:
# Example ggplot
ggplot(data = kmeans_basic_df, aes(y = Cluster)) +
geom_bar(aes(fill = Region)) +
ggtitle("Count of Clusters by Region") +
theme(plot.title = element_text(hjust = 0.5))
以下是输出结果:
使用 ggplot 按区域绘制聚类计数图
花式 K 均值
第一项任务是计算出正确的集群数量。这是用碎石图完成的。本质上,目标是找到曲线开始明显变平的地方[1]。因为 K-Means 算法有效地最小化了聚类中心和每个数据点之间的差异,所以创建了这种曲线形状,其开始是陡峭的,然后渐进地接近某一水平的平坦线[1]。虽然这不是一个完整的要求,但在使用 scale() 函数或其他归一化技术生成聚类时缩放数据通常是一个好主意,这样可以获得更准确的结果[1]。
我们将使用 fviz_nbclust() 函数创建一个 scree 图,代码如下:
# Fancy K-Means
fviz_nbclust(scale(clean_data[,7:32]), kmeans, nstart=100, method = "wss") +
geom_vline(xintercept = 5, linetype = 1)
以下是输出结果:
确定 K 均值最佳聚类数的 Scree 图
实际上,创建奇特的 K 均值聚类函数与基本的非常相似。我们将只缩放数据,创建 5 个集群(我们的最佳数量),为了简单起见,将 nstart 设置为 100。
代码如下:
# Fancy kmeans
kmeans_fancy <- kmeans(scale(clean_data[,7:32]), 5, nstart = 100)# plot the clusters
fviz_cluster(kmeans_fancy, data = scale(clean_data[,7:32]), geom = c("point"),ellipse.type = "euclid")
以下是输出结果:
K-均值聚类的可视化
这最后一个图确实有助于形象化地显示出这些集群实际上是彼此相似的。有趣的是,用很少的代码就能得到一些非常有趣的结果。
结论
这个项目是为了展示如何使用和可视化 K-均值聚类。这样做的方法不止一种,可以做出无数的情节。像数据科学中的大多数任务一样,大多数时间实际上都花在了查找数据和清理数据上,以便用这些数据做一些有用的事情。希望到目前为止,您对使用 K-Means 聚类有了更好的感觉,并且可以看到我们在这里使用的技术的不同应用。
参考
[1] R .卡巴科夫, R 在行动(第 2 版。) (2015),纽约州谢尔特岛:曼宁出版公司。
[2]美国传统基金会, 2020 年经济自由度指数 (2020),https://www.heritage.org/index/download