如何管理共享代码库
软件工程
避免团队开发时面临的常见问题
恭喜!你终于想出了完美的新应用创意。你和你的软件工程师团队匆忙编写代码,这将是你名利双收的门票。但是等等。Maria 为这个应用程序的主页编写的代码看起来很棒——但是它如何与 Steven 为访问数据库编写的代码一起工作呢?Hector 设计了一个函数来计算我们正在寻找的值——但是这些值如何在应用程序中从一个页面移动到另一个页面呢?让团队的代码协同工作本身就成了一个项目!
在本文中,我将向您展示我们如何使用 Git 和 GitHub 来管理将在多个开发人员之间共享的代码库。版本控制像 Git 这样的工具被软件工程师、数据科学家和游戏开发者使用——仅举几个例子。
先决条件:安装 Git ,有一个 GitHub 帐号,知道如何创建一个库
注意:Salesforce 已经决定移除他们的 Heroku 免费等级。自 2022 年 11 月起,该数据库的部署将不再免费。
1.创建存储库和添加协作者
一旦你登录到 GitHub 上,继续创建一个库。我的就叫“ 如何 _ 管理 _ 共享 _ 代码库 _ 文章 ”。确保使用 README.md 文件创建存储库,以便在进入第二步之前进行根提交。在您新创建的 GitHub 资源库中,点击设置。然后从左侧菜单中选择合作者。
你可以通过他们的 GitHub 用户名或者他们的电子邮件地址来添加你的团队成员。然后,他们将通过电子邮件收到加入您项目的邀请。
一旦他们接受,您将能够通过选择以下选项,在协作者页面上编辑他们的权限:
现在您和您的团队可以克隆您的存储库并开始开发了!如果你给你的团队成员“写”权限,他们就可以开始投稿了。
2.Git 分支
Git 中的分支的行为类似于我们用来组织工作片段的项目的副本。如果我们的项目中有三个任务要完成,我们可以为每个任务创建一个分支,然后在完成每个单独的任务后将每个分支合并到主分支中。
在我们新克隆的存储库中,尝试运行以下命令:
**git branch**
(1)运行“git branch”命令来查看我们所有的分支
git branch 命令列出了我们存储库中的分支。目前,我们只有默认的主分支,它是在我们创建存储库时自动创建的。我们可以使用 git branch 命令创建一个新的分支,并添加一个分支名,如下所示:
**git branch first_branch**
(1)创建一个分支,(2)使用“git branch”命令查看我们所有的分支
我们现在有了项目的两个不同的副本。主分支旁边有一个星号——这意味着这是我们当前正在使用的项目分支。为了在项目的分支之间切换,我们使用了 git checkout 命令:
**git checkout first_branch**
现在,如果我们运行 git branch 命令,我们会看到星星已经从 main 移动到 first_branch :
(1)切换到我们的新分支,(2)检查我们是否在分支上
在我们的新分支上,让我们添加一些变化。我们将创建一个名为 app.sh 的 shell 脚本,其中包含:
**echo “Hello world”**
(1)创建“Hello world”shell 脚本,(2)查看脚本内容,(3)运行脚本
然后我们将添加文件并提交它。之后,我们可以运行 git log 来查看我们的新提交:
(1)使用 git add 选择要提交的 shell 脚本,(2)使用消息提交 shell 脚本,(3)使用“git log”查看新的提交
注意:请参见第二行,我在 Windows 上使用。/app.sh "。在 Mac 或 Linux 上,您可以使用“sh app.sh”来运行该文件。
现在让我们使用 git checkout 返回到我们的主分支,然后使用 git log 查看我们在主分支上的提交:
(1)使用 git checkout main 返回到主分支,(2)然后使用 git log 查看我们的 shell 脚本没有在这个分支上提交它,文件本身也没有
如您所见,我们在 first_branch 分支上创建的提交不在这里。让我们假设我们在 first_branch 上所做的工作已经完成,现在我们想把我们的变更转移到 main 分支上。为此,我们将不得不切换回我们的 first_branch ,并将我们的分支推到 GitHub。
在我们的 first_branch 上运行 git push 将会失败——但是它将提供我们可以用来设置我们的上游的命令。因为我们在本地存储库上创建了我们的分支,并且我们直到现在才推送这个分支——我们的新分支不知道推送至何处。我们将上游设置为原点,方法是在我们尝试推送时运行错误消息中给出的命令:“git push-set-upstream origin first _ branch”。
(1)切换回具有我们的新 shell 脚本的 first_branch,(2)尝试推送并得到一个错误,它不知道将该错误推送到哪里,(3)从错误消息中复制 set-upstream 命令并使用它来推送我们的新代码
3.拉取请求
我们回 GitHub 看看我们新推的分支吧。我们可以使用下图左下方的“分支:主”下拉菜单来更改我们正在查看的分支。由于我们刚刚推送了我们的分支,GitHub 给了我们一条消息,询问我们是否愿意为我们的新分支创建一个拉取请求。我们将单击绿色的“比较&拉动请求按钮。
查看 GitHub 上的“比较和拉取请求”按钮,查看我们推送的新 first_branch
现在你可以看到 first_branch 将合并为 main 表示为:base:main←compare:first _ branch。旁边有一个绿色的“能够合并”信息,告诉你这些分支可以自动合并。点击创建拉动请求按钮创建拉动请求。
表单为我们的新 first_branch 创建拉请求,以合并到主分支中
下一页——如下图所示——是新打开的拉请求页面。点击文件修改工具栏选项,可以查看 first_branch 上的修改内容。由于我们所做的更改没有导致任何冲突,我们可以单击“合并拉取请求”按钮,Git 会自动将我们的代码合并到主分支中。
查看我们创建的拉动式请求
使用拉请求将代码合并到主分支需要这个漫长的过程,因为我们希望确保被破坏的代码永远不会出现在主分支上。
4.使用 Git Pull 更新本地主分支
自从我们将 first_branch 合并到 GitHub 上的 main 分支后,我们的 main 分支现在用来自我们 first_branch 的代码更新。然而,我们本地机器上的存储库不知道我们的主分支的更新。为了将本地机器上的主分支与主分支在线同步,我们将“**git check out main”**切换回我们的主分支,然后使用“**git pull”**命令获取更新的更改:
(1)在合并拉请求之后,从 first_branch 切换回 main,(2)然后在 main 分支上运行“git pull”来拉下合并的变更
在消息中你可以看到有一个文件发生了变化,这是我们合并到主的 first_branch 中新添加的 app.sh 文件。
4.当自动合并不可能时
这次合并很容易,因为我们没有任何冲突。如果两个开发人员对主分支做出了冲突的变更,我们将如何解决冲突?
在下图中,你会看到我首先创建了两个主分支:第二个分支 & 第三个分支。然后,我切换到第二分支,并将消息从“ Hello world ”更改为“ Hello world from second branch!”。现在我已经做了这个更改,我" **git add。"**选择所有要提交的更改,然后我"git commit-m ’ update app . sh '“在 second_branch 上创建提交。然后我尝试” git push "知道它会失败,因为我没有设置上游-但是它会给我设置上游的命令,并第一次将我的 second_branch 推送到 GitHub:
(1)创建 second_branch,(2)创建 third_branch,(3)切换到 second_branch,(4)用 vi 编辑 app.sh,(5) git add 选择我更改的要提交的文件,(6)提交 app.sh 文件更改,(7)明知会失败仍尝试推送,(8)复制命令以设置上游并推送 second_branch
项目的当前状态是主分支仍然有 app.sh 和消息“ Hello world ”,而次 _ 分支有来自次分支的更新消息“ Hello world!”。我们已经推出了第二个分支。如果我们愿意,我们可以立即将 second_branch 合并到 main 中,而不会像第一次那样发生冲突。然而,我们想要模拟一个冲突的变化。回到我们的终端或 git bash,让我们切换到 third_branch 并添加另一个更改:
(1)切换到 third_branch,(2)使用 vi 编辑 app.sh,(3)运行 shell 脚本以查看更改,(4) git 添加要提交的文件,(5)将文件提交到 third_branch,(6)明知推送会失败仍尝试推送,(7)从错误消息中获取设置上游的命令,并将我们的新 third_branch 推送到 GitHub
在上面的图片中,你会看到我切换到 third_banch 并更改了消息“ Hello World!【到】你好来自第三分局!"在 vi 编辑器中。信息是"你好,世界!“因为我们创建了第三 _ 分支作为主分支的副本——它不知道我们对第二 _ 分支所做的更改。在设置我们的上游并将我们的第三 _ 分支推送到 GitHub 之后,我们的 GitHub 页面将会为我们的两个更新分支中的每一个分支提供一个“比较&拉取请求”提示,如下所示:
看到两个分支都成功推送到 GitHub
先合并 second_branch 吧。我们点击相应的“比较&拉动请求按钮,然后我们看到绿色的“能够合并。"间主 & 次 _ 分支下一页:
注意 second_branch 能够自动合并
我们点击绿色的“打开拉式请求 t”按钮,然后点击“合并拉式请求”按钮,并且第二 _ 分支自动合并到主中,因为没有冲突的变更。之后,我们的主分支 app.sh 会有“回音‘来自二分支的你好世界!’”。
现在,让我们单击 GitHub 页面上看到的 third_branch 提示符的绿色“Compare&pull request”按钮。现在代替绿色的能够合并。“我们习以为常的消息—我们会看到红色的“无法自动合并”消息:
无法自动合并,因为我们对 third_branch 所做的更改与我们对已经合并的 second_branch 所做的更改相冲突
如果 GitHub 不能自动合并我们的分支,我们就不应该创建 pull 请求。相反,我们应该在本地存储库中解决 third_branch 中的合并冲突,然后将我们的更改推送到 GitHub。这意味着——我们应该用来自主分支的最新变化更新我们的第三分支,然后将结果第三分支推送到 GitHub。这个更新的 third_branch 将能够自动与 main 合并。
(1)将主分支的最新更改拉入 third_branch,这样我们可以解决冲突,(2)运行“git status”来查看哪些文件是冲突的
上面你会看到我从第三个分支开始。从那里我运行"git pull origin main"——这意味着在线访问 GitHub 存储库,并将 main 分支上的更改拉入当前分支。如果你看看我的 git bash 中括号内的绿色消息——它从“ (third_branch) ”变成了“(third _ branch *+| MERGING)”,因为我们现在正在本地将 main 合并到 third_branch 中,而不是在 GitHub 上。运行“ git status ”将向我们显示合并中的冲突文件,但在这种情况下,唯一的冲突文件是 app.sh 。让我们看看 app.sh 内部的冲突是什么:
(1)使用“cat”命令查看冲突文件 app.sh 的内容
正如您在上面看到的,git 自动将所有冲突的更改放到我们的文件中。<<<<<<< HEAD” and “||||||| fd0f83b” you can see the changes from 第三 _ 分支之间。在“|||||| fd0f83b”和“=”之间可以看到 third_branch 最初从 main 分支时的原始状态。最后,在“=”和“>>>>>>>6126…”之间,可以看到主分支的当前状态。
Git 不知道哪个更改是正确的,这就是为什么它不能自动为我们合并代码。Git 向我们展示了所有的变更,因此我们可以自己决定保留哪些变更。因此,我将删除除了来自第三 _ 分支的最新更改之外的所有内容:
(1)使用 vi 来编辑文件以删除除了 third_branch 内容之外的所有内容,(2)使用“cat”来查看更新的文件
现在我们已经解决了合并冲突,我们可以 git 添加、 git 提交,以及 git 推送我们手动合并的代码:
(1)使用 git add 选择要提交的更新文件,(2)使用描述变更的消息提交更新文件,(3)将对 third_branch 的变更推送到 GitHub
将 third_branch 推至 GitHub,会提示我们点击“比较&拉取请求按钮:
看到在 GitHub 上为我们更新的 third_branch 创建一个拉请求的消息
在打开第三分支和主之间的新拉动请求后,我们看到绿色的“能够合并”消息,因为我们的冲突现已解决:
我们现在能够自动合并,因为我们解决了我们的冲突变更
我们可以点击创建拉式请求按钮。在“拉取请求”页面上,我们可以单击“合并拉取请求”,我们的更改将自动合并到 main 中。现在我们已经合并了我们的 pull 请求,我们可以返回到我们的 terminal/git bash,并将本地存储库的主分支与在线存储库同步:
(1)切换主分支,(2)使用“git pull”来更新我们的本地 git 存储库,我们将这些更改合并到 GitHub 上的主分支中
5.其他需要了解的有用信息
完成前四个步骤后,我们可以返回 GitHub,点击工具栏选项中的提交,我们会看到:
查看主分支上的所有提交,并查看我们创建的合并提交
在这里我们可以看到主分支上的所有提交,并且我们可以切换到其他分支来查看它们的提交。当学习使用 Git 和 GitHub 进行协作时——理解项目的历史如何随时间演变是很重要的。我鼓励你查看每个“合并拉取请求”提交,看看合并拉取请求如何改变项目的历史。
GitHub 上另一个有用的页面是分支页面,你可以从你的 GitHub 库主页点击工具栏选项分支进入。在这里,我们可以看到我们推送到 GitHub 的所有分支——您会注意到,所有分支都已经被合并了。通常在我们合并一个分支后,我们可以通过点击下面的红色垃圾桶图标来删除这个分支。
查看 GitHub 上的所有分支
感谢阅读!我很乐意听到你的反馈或回答你的任何问题,所以请在下面评论,我会尽力帮助你。
首席数据官角色如何成为新的大数据要务
了解首席数据官如何在美国金融、政府和其他部门的组织中扮演越来越重要的角色。
忽视数据开展业务就像在黑暗中磕磕绊绊,希望一切都会顺利,而不是做出基于事实的决定。与此同时,大数据正在对业务职能产生影响,并在改善客户体验、营销和供应链管理方面找到出路。
首席数据官:定义
首席数据官是负责通过不同的数据处理、分析、挖掘和交换技术将数据作为资产进行获取和管理的公司高管。
CDO 负责与数据相关的一切。数据的质量、安全性、可靠性、透明度和可信度都是 CDO 的领域。CDO 负责管理数据,并通过内部团队或使用像it transition这样的公司提供的外部解决方案来获得可行的见解。
围绕物联网和人工智能的最新发展也属于 CDO 的管辖范围。合规性在这里也发挥了重要作用,GDPR 已于 2018 年生效,那些围绕客户数据开展业务的人越来越担心。
CDO 在组织结构中的位置
CDO 应与首席执行官或首席战略官(如果适用)保持沟通并直接向其报告。重要的是,CDO 不仅在形式上,而且在权力和投票权方面,都与其他高管处于同一水平。在组织内拥有切实的决策权是 CDO 成功的先决条件。
有时,这种企业平等必须得到执行,因为一些高管可能会反对这一新任命职位带来的变化,并以敌意对待数据计划。“我们的方法已经运行了多年,为什么现在要改变呢?”他们可能在想。但是,由于每个 CDO 的目标都是他们组织的繁荣,他们必须准备好做出不受欢迎的决定,同时还要清楚地将这些决定传达给他们不接受的观众。
CDO 无法独立运作,尽管在这一领域的最初发展中,CDO 常常是他们自己的单人团队。然而这是错误的:CDO 需要一个团队,因为他们面临的目标雄心勃勃且复杂。
说了这么多,让我们来看看公司的情况,看看首席数据官的角色今天是否得到了更多的认可。
首席债务官的任命
根据 Governing.com 的数据,截至 2020 年 1 月,美国超过一半的州已经任命了 CDO。在还没有 CDO 的 22 个州中,有 7 个已经在探索这种可能性。例外的是,阿拉巴马州在 2019 年 9 月取消了这一职位。
Gartner 预测,到 2021 年,CDO 办公室将被 75%的大型企业视为任务关键型办公室,相当于财务和人力资源部门。此外,该职位将是与技术相关的 C 级职位中性别最多样化的职位。
这种认识到 CDO 角色的生动趋势来自于建立数据驱动的文化以适应人工智能、物联网和区块链引起的大数据中断的新业务要求。
哪里最需要 CDO
所有重视大数据、以客户为导向的组织都可能觉得有必要雇佣一名 CDO。这些包括金融服务公司(如银行、保险和资本市场)和政府组织(国内和国际)。
信息技术公司正在迎头赶上,其他行业,如制造业和医疗保健业,引入首席数据官的角色只是时间问题。
金融领域的 CDO
在金融领域,由于业务风险的增加和激烈的市场竞争,CDO 面临着复杂的挑战。他们最重要的目标是将他们的公司重塑为将数据视为战略资产的企业。
大型金融机构通常都是跨国公司,但都由地方政府管理。这导致不一致的数据管理实践。因此,首席发展干事应努力集中数据相关工作,并在组织分支机构和办公室之间建立缺失的桥梁。
CDO 要解决的另一个问题是组织数据缺乏同质性。通常,IT 和运营部门在不同的信息环境中工作,并且没有统一的数据管理语义。因此,CDO 的首要任务是创建一个单一的数据管理术语表,并推动其在全公司范围内的采用。
政府中的 CDO
2010 年代初,芝加哥和纽约成为首批任命首席数据官的美国城市,更多城市紧随其后,在 2016 年形成了 CDO 同行群体的公民分析网络。现在,数据驱动政府的概念正在各州获得关注。
随着《联邦数据战略 2020 行动计划》的发布,今年有望为政府组织的 CDO 提供大量机会。
目前,各州 CDO 议程上最紧迫的问题是智慧城市转型。这样的计划正在涌现,以有效地利用数据管理技术来解决公众的现实生活需求,提高安全性,并消除资源利用中的低效率。
除了州 CDO 的这些首要职责之外,在联邦部门工作的数据主管还应该关注安全性。人们经常批评政府在确保数据安全的努力中过于激进,让许多制造商为违反安全协议的产品负责,因此解决立法问题并达成共识可能是所有相关实体都非常欢迎的活动。
欢迎首席债务官来到最高管理层
2020 年,任命一名首席数据官不再具有革命性或令人惊讶。向以大数据为中心的运营的重大转变需要 C 级数据治理和宣传,从而提高 CDO 的认知度。
受到严格监管的行业已经雇佣了 CDO 来应对大数据时代的需求。很明显,这些变化不会局限于政府和金融服务等特定领域,而是会扩展到其他行业。可以肯定地说,任何想要成为行业领导者的组织都需要考虑尽快雇佣一个有能力的 CDO。
父亲的身高如何影响儿子的身高
照片由 Unsplash 上的 vivek kumar 拍摄
假设男性的平均身高是 67.7 英寸(172 厘米)。如果一个男人有 72 英寸(183 厘米)高,他成年的儿子会有多高?
你的第一反应可能是:“哦,这很简单。儿子会和他爸爸一样高。”
虽然 72 英寸(183 厘米)是儿子身高的一个可能的猜测,但从统计学的角度来看,可能性不大。
相关性、回归和标准差
相反,我们应该收集父亲身高为 72 英寸(183 厘米)的儿子的平均身高数据。
然后,我们将对身高 58 英寸(147 厘米)、59 英寸(150 厘米)、60 英寸(152 厘米)、61 英寸(155 厘米)的父亲重复上述步骤,直到 78 英寸(198 厘米)。
接下来,我们可以绘制父亲身高(x 轴)和儿子身高(y 轴)的平均值图。标绘的点“x”表示父亲具有特定身高的儿子的平均身高。
回归线是方程 y=a+bx 的最佳拟合线。由于回归线是一条斜率为 b 的直线,所以斜率 b 就是回归系数。相关系数为 0.5 。
现在我们可以看到,父亲的身高和儿子的身高是正相关的,但仅仅是通过 0.5 的相关系数。请注意,标准差(SD)线的斜率没有回归线的斜率陡。父亲的身高每增加 1 SD,儿子的身高仅增加 0.5 SD。
皮尔森父子数据(通过芝加哥大学)
如果你是一个中等身高的男人,你可以期待你的儿子比你高几英寸(厘米)。
这是因为回归线和 SD 线都在平均高度处重合。例如,平均身高为 67.7 英寸(172 厘米)的父亲将会有一个 68.7 英寸(175 厘米)高的儿子。
然而,如果你比平均水平高得多或矮得多,预测显然会更棘手。
一个 78 英寸(198 厘米)高的男人会有一个 74 英寸(188 厘米)高的儿子。对于一个非常高的人来说,他的儿子会比他矮大约 4 英寸(10 厘米)。他的儿子仍然会比一般人高。
一个 58 英寸(147 厘米)高的男人会有一个 63.5 英寸(161 厘米)高的儿子。对于一个非常矮的人来说,他的儿子将比他高 5.5 英寸(14 厘米)。他的儿子仍然会比平均水平矮。
对于特别高或特别矮的父亲来说,他们的儿子会比平均水平高或矮,但不会比他们的父亲高那么多。
回到我们的问题
对于一个父亲身高 72 英寸(183 厘米)的人,我们应该通过在人口统计学中对父子身高和父亲身高 72 英寸(183 厘米)的儿子平均身高的回归相关性进行折衷来预测成年儿子的身高。我们对成年儿子身高的最佳猜测应该是回归平均值。
根据英国 1078 对父子身高的实际数据,对于身高 72 英寸(183 厘米)的父亲来说,他们的儿子平均身高为 71 英寸(180 厘米)。
皮尔森父子数据(通过芝加哥大学
为什么父亲的身高只是等式的一部分
芝加哥大学的研究人员试图解释这一现象。
首先,我们的身高受父母身高的遗传影响。上述研究没有明确考虑母亲的身高。
从统计数据来看,平均身高的女性比比平均身高高几个标准差的特别高的女性要多得多。因此,一个特别高的男人很有可能会娶一个不特别高的女人,这样他们的儿子就不会像父亲一样特别高。
其次,我们的身高不仅仅是由基因或遗传因素决定的。还会受到营养、运动等环境因素的影响。
1884 年,博学的统计学家弗朗西斯·高尔顿招募了 1 万人来测量父母和孩子的身高。他付给每个参与者 3 便士。他发现孩子们的身高与总体平均值的偏差大约是他们父母偏差的三分之二。
用高尔顿的话来说,当父母身高低于平均水平时,他们的孩子往往比他们矮。当父母比均值矮时,他们的孩子往往比他们高。
GPU 到底怎么这么快?沿着 Nvidia CUDA-GPU 架构的 HPC 之旅。从零到现在。
Rafael Pol 在 Unsplash 上的照片
有人将机器学习定义为数学(算法)、工程(高性能计算)和人类能力(经验)之间的完美和谐。因此,这些领域的任何进展都将有助于机器学习的发展。今天轮到了 HPC,具体来说,我们正在讨论 GPU 的进步。
Nvidia 刚刚宣布了其基于 Ampere 架构的 Geforce RTX 30 系列 (RTX3090,RTX3080,RTX3070)。安培是我们最喜欢的 GPU 品牌的最后一个架构,但迄今为止已经发布了几代支持 CUDA 的 GPU。在接下来的段落中,我将从头到尾描述 CUDA 架构的全球概况。今天,让我们一起驾驶有趣的道路,从费米到安培。但是在深入讨论细节之前,如果你不熟悉 GPU 计算,我强烈建议你访问我之前关于 CUDA 执行模型的文章。
遵循 Nvidia GPUs 的自然时间轴,该公司于 2001 年首次生产了一款能够进行可编程着色的芯片,Playstation 2 和 Xbox 使用的【GeForce 3】。在 GeForce 3(代号 NV20 )之前,还有其他一些:NV1 (1995)、NV3 (1997)、NV4 (1998)、NV5 (1999)、GeForce I(1999 年年底)和 GeForce II (2000)。然而,GeForce 3 可能是第一款受欢迎的 Nvidia GPU。
指出 Nvidia 世界中目标类别和架构之间的差异是很有趣的,这可能会让读者感到困惑。传统上,Nvidia 为每个目标客户类别设计了不同类型的产品,为四种不同的产品命名:GeForce、Quadro、Tesla 和(最近的)Jetson 尽管这四种产品内部使用的基础架构是相同的。用 Nvidia 的话说,他们四个拥有相同的计算能力。GeForce 系列专注于桌面和游戏玩家;Quadro 被认为是为制作视频内容的工作站和开发者设计的;而特斯拉是为超级计算机和高性能计算设计的。最后,Jetson 系列在芯片中包含嵌入式 GPU。
正如我们刚才在上面看到的,Nvidia 在 90 年代初开始了它的冒险,专注于 grapichs 的 GPU,但我们直到 2007 年才开始使用第一个 CUDA 架构: Tesla (是的,你是对的,他们后来为一个产品线使用了相同的架构名称,这就是为什么我说它可能会令人困惑)。Tesla 是一个非常简单的架构,所以我决定直接从 Fermi 开始,它引入了纠错码存储器,真正改善了上下文切换、存储器层次结构和双精度。
费米体系结构
每个费米流式多处理器(SMI)由 32 个 CUDA 内核(流式处理器)、16 个加载/存储单元(LD/ST 单元)组成,以解决每个时钟 16 个线程的内存操作、四个特殊功能单元(SFU)以执行超越数学指令、一个内存层次结构和 warp 调度程序。
费米流式多处理器(图片作者
该板有六个 64 位内存分区,带有一个 384 位内存接口,支持高达 6 GB 的 GDDR5 DRAM 内存。CPU 通过 PCI-e 总线连接到 GPU。每个 CUDA 内核都有一个全流水线算术逻辑单元(ALU)和一个浮点单元(FPU)。为了执行双精度,32 个 CUDA 内核可以执行 16 个 FP64 单元。每个 SM 有两个 warp 调度程序,可以同时发布和执行 2 个 warp。
这种架构的一个关键部分是内存层次结构。它引入了 64 KB 的可配置共享内存和每个 SM 的 L1 缓存,可以配置为 16 KB 的 L1 缓存和 48 KB 的共享内存;或者 16 KB 的共享内存和 48 KB 的 L1 缓存。尽管 CPU L1 缓存是为空间和时间局部性而设计的,但 GPU L1 仅针对空间局部性进行了优化。频繁访问缓存的 L1 内存位置不会增加命中数据的可能性,但是当几个线程访问相邻的内存空间时,这是很有吸引力的。768 KB 的 L2 缓存是统一的,由服务于所有操作(加载、存储和纹理)的所有 SMs 共享。两个缓存都用于在本地和全局内存中存储数据,包括寄存器溢出。但是,需要配置是在 L1 和 L2 缓存读取数据,还是仅在 L2 缓存。这种架构被称为计算能力 2.x* ,这是 Nvidia 专门用来描述 GPU 硬件版本的术语,由主版本号(左数字)和次版本号(右数字)组成。具有相同主要修订号的器件属于相同的核心架构,而次要修订号对应于核心架构的增量改进。*
费米记忆层级(图片作者)
开普勒建筑
开普勒包括多达 15 个 SMs 和 6 个 64 位内存控制器。每个 SM 有 192 个单精度 CUDA 核,64 个双精度单元,32 个 sfu,32 个 LD/ST 单元和 16 个纹理单元。
开普勒流式多处理器(图片作者
此外,四个 warp 调度器,每个调度器有两个调度单元,允许四个 warp 并发执行。它还增加了每个线程访问的寄存器数量,从 Fermi 中的 63 个增加到 255 个;它引入了 shuffle 指令,并通过在全局内存中引入对 FP64 原子的本机支持来改进原子操作。它还介绍了 CUDA 动态并行性,即从内核启动内核的能力。此外,内存层次的组织方式与费米相似。
开普勒记忆层次(图片作者
64 KB 共享内存/L1 缓存通过允许在 L1 缓存和共享内存之间进行 32 KB/32 KB 分割而得到改进。它还将共享内存库宽度从 Fermi 中的 32 位增加到 64 位,并引入了 48 KB 只读数据缓存来缓存常量数据。L2 缓存也增加到 1536 KB,使费米 L2 缓存容量翻倍。此外,开普勒计算能力用 3.x 代码表示。
麦克斯韦建筑
Maxwell 由多达 16 个 SMs 和 4 个内存控制器组成。每个 SM 都经过重新配置,以提高性能功耗比。它包含四个 warp 调度器,每个能够在每个时钟周期为每个 warp 发送两条指令。SM 分为四个 32-CUDA 核心处理模块,每个模块有八个纹理单元、八个 sfu 和八个 LD/ST 单元。
麦克斯韦流多处理器(图片作者)
关于内存层次,它具有 96 KB 的专用共享内存(尽管每个线程块最多只能使用 48 KB),而 L1 缓存与纹理缓存功能共享。L2 缓存提供 2048 KB 的容量。内存带宽也增加了,从 Kepler 中的 192 GB/秒增加到 224 GB/秒,并且在共享内存中引入了对 FP32 原子的本机支持。麦克斯韦被表示为计算能力 5.x 。
麦克斯韦记忆层次(图片作者)
帕斯卡建筑
Pascal 板由多达 60 个 SMs 和 8 个 512 位存储控制器组成。每个 SM 有 64 个 CUDA 内核和 4 个纹理单元。它拥有与开普勒和麦克斯韦相同数量的寄存器,但是提供更多的 SMs,因此总的来说有更多的寄存器。它被设计为比以前的架构支持更多的活动经线和线程块。共享内存带宽加倍,以更高效地执行代码。它允许加载/存储指令的重叠,以提高浮点利用率,也改善了 warp 调度,其中每个 warp 调度器能够在每个时钟分派两个 warp 指令。CUDA 核心能够处理 16 位和 32 位指令和数据,有利于深度学习程序的使用,但也为数值程序提供了 32 个 FP64 CUDA 核心。全局内存本机支持也扩展到包括 FP64 原子。
Pascal 流多处理器(图片作者
内存层次结构配置也发生了变化。每个内存控制器都连接到 512 KB 的 L2 缓存,提供 4096 KB 的 L2 缓存,并引入 HBM2 内存,提供 732 GB/s 的带宽。它为每个 SM 提供 64 KB 的共享内存,以及一个 L1 缓存,也可用作纹理缓存,作为合并缓冲区来提高 warp 数据的局部性。它的计算能力用 6.x 代码来表示。
帕斯卡记忆层次(图片作者)
最后介绍了 NVLink 技术。背后的想法是,任何 4-GPU 和 8-GPU 系统配置都可以处理相同的问题。甚至,几组多 GPU 系统正在使用 InfiniBand 和 100 Gb 以太网互连,以形成更大、更强大的系统。
沃尔特建筑公司
一个 Volta 板有多达 84 个 SMs 和 8 个 512 位存储控制器。每个 SM 有 64 个 FP32 CUDA 核心,64 个 INT32 CUDA 核心,32 个 FP64 CUDA 核心,8 个用于深度学习矩阵运算的张量核心,32 个 LD/ST 单元,16 个 sfu。每个 SM 分为 4 个处理模块,每个模块包含一个新的 L0 指令高速缓存,以提供比以前的指令缓冲区更高的效率,以及一个带有调度单元的 warp 调度程序,这与 Pascal 的 2 分区设置(每个子内核 warp 调度程序有两个调度端口)相反。这意味着 Volta 失去了在单个时钟周期内从一个线程发出第二条独立指令的能力。
Volta 流式多处理器(图片作者)
引入了合并的 128 KB L1 数据缓存/共享内存,提供了 96 KB 的共享内存。HBM2 带宽也得到了提高,达到 900 GB/s。此外,完整的 GPU 包括总共 6144 KB 的 L2 缓存,其计算能力用 7.0 代码表示。
伏打记忆层级(图片作者)
但是,最大的变化来自于它的独立线程调度。以前的体系结构以 SIMT 方式执行扭曲,其中 32 个线程共享一个程序计数器。在发散的情况下,活动掩码指示在任何给定时间哪些线程是活动的,留下一些线程是不活动的,并串行化不同分支选项的执行。Volta 包括一个程序计数器和每个线程的调用堆栈。它还引入了一个调度优化器,用于确定来自同一 warp 的哪些线程必须一起执行到 SIMT 单元中,从而提供更多的灵活性,因为线程现在可以在子 warp 粒度上分叉。
Volta 的最新突破性功能被称为张量核心*,与之前的帕斯卡 P100 加速器相比,它的深度学习应用速度提高了 12 倍。它们本质上是混合精度 FP16/FP32 内核阵列。640 个张量核中的每一个都在 4x4 矩阵上运行,它们相关的数据路径是定制设计的,以提高这种矩阵上的浮点计算吞吐量。每个张量核每时钟执行 64 次浮点融合乘加(FMA)运算,为训练和推理应用提供高达 125 TFLOPS。*
此外,第二代 NVLink 为多 GPU 系统配置提供了更高的带宽、更多的链路和改进的可扩展性。Volta GV100 支持多达 6 条 NVLink 链路和 300 GB/秒的总带宽,而 GP100 支持 4 条 NVLink 链路和 160 GB/秒的总带宽。
图灵(不是全新的)架构
*NVIDIA 首席执行官黄仁勋就 Pascal、Volta 和 Turing 之间的架构差异提供了一个有趣的回复。基本上,他解释说伏打和图灵有不同的目标市场。Volta 旨在用于大规模培训,最多可连接八个 GPU,具有最快的 HBM2 和其他专门针对数据中心的功能。另一方面,图灵在设计时考虑了三个应用:专业可视化、视频游戏和使用张量核的图像生成。实际上,图灵拥有和 Volta 一样的计算能力, *7.x,这就是为什么我说图灵不是一个全新的架构。
最显著的成就:使用 GDDR6 内存和引入 RT 内核,能够渲染视觉上逼真的 3D 游戏和复杂的专业模型:
图灵流式多处理器。来源:英伟达
像 Volta 一样,图灵 SM 被分成 4 个处理模块,每个模块都有一个 warp 调度程序和调度单元。图灵几乎等同于 Volta 在两个周期内执行指令,但调度程序可以在每个周期发出一条独立的指令。此外,与 Pascal 的 per-warp 不同,Volta 和 Turing 有每个线程的调度资源,每个线程有一个程序计数器和堆栈来跟踪线程状态。
安培架构
最新的 CUDA 架构被称为 Ampere,提供了迄今为止最高的 GPU 性能。有人在这里做了一个真正完整的回顾,我强烈推荐。
每个 Ampere SM 包含四个处理模块,每个模块都有用于数据缓存的 L0 缓存、warp 调度器、16 个 INT32 CUDA 内核、16 个 FP32 CUDA 内核、8 个 FP64 CUDA 内核、8 个 LD/ST 内核、一个用于矩阵乘法的张量内核和一个 16K 32 位寄存器文件。每个 SM 都有一个 192 KB 的组合共享内存和 L1 数据缓存;在 GPU 级别,它有 40MB 的 L2 缓存来提高性能(比 Volta 中的 V100 大 7 倍)。L2 缓存分为两个分区,以实现更高的带宽。
安培流式多处理器。来源:英伟达。
GA100 GPU 芯片由 128 个 sm 组成,但主要是因为-营销-制造,不同的安培 GPU 只会启用其中的一部分。比如 A100 GPU 只暴露 108 条短信。总之,完整的 GA100 由 8 个 GPC 组成,每个 GPC 有 16 个 SM 和 6 个 HBM2 堆栈。在 A100 GPU 的情况下,这被转换为 40 GB 的 HBM2 DRAM 存储器,速度为 1555 GB/s。
它还引入了第三代 NVIDIA 张量内核(继 Volta 和 Turing 之后),允许它每时钟计算 8×4×8 混合精度矩阵乘法(将 8×4 矩阵乘以 4×8 矩阵)。例如,每个 A100 张量核每时钟执行 256 个 FP16 FMA(融合乘加)运算。Ampere 在其张量核上支持许多数据类型,包括 FP16、BF16、TF32、FP64、INT8、INT4 和 Binary。
最后在 Ampere 上呈现第三代 NVLink。在 A100 GPU 的情况下,它有 12 个 NVLink 链接,总带宽为 600 GB/s,用于多 GPU 计算。关于 PCIe 连接,A100 GPU 支持 PCIeGen 4,它提供每个方向 31.5 GB/秒的带宽(用于 x16 连接),是 PCIe 3 的两倍带宽。
参考
大型投资公司如何使用 NLP
调查游戏的当前状态
资料来源:Pexels
金融服务行业正在爱上文本处理,也称为自然语言处理(NLP)。
这种迷恋是必然的,因为投资公司淹没在文本数据中:分析、新闻、合同、合规报告…
金融部门确实喜欢内部技术。在硅谷之外,投资银行尤其以绝对的热情拥抱工程人才。尽管这一过程在 2008 年金融危机前就已经开始,但随后的监管通过创造对更好数据解决方案的需求加速了这一过程。
还有激励因素需要考虑。这是一个渴望赢得市场优势的行业;通过不同的方式处理数据,耳朵往往会对了解更多的前景感到兴奋,特别是如果这有助于一个好故事。
我在金融服务和自然语言处理的交叉领域已经有一段时间了,去年年底我决定收集尽可能多的信息来回答这个问题:
银行和资产管理公司是如何使用自然语言处理的?
我决定把我找到的案例研究收集成一个白皮书——
【金融如何使用自然语言处理——银行和投资管理中的 8 个案例研究】 。
主要目的是让金融业内人士了解 NLP 现在提供的可能性。(披露:我是 FinText 的创始人)。
为此,报告还定义了关键的自然语言处理和机器学习概念(主题建模、命名实体识别、特征选择等)。),清楚地展示出来,以便任何人都可以理解:
然而,当我在编纂这部作品时,我被某些发现震惊了。
我觉得与可能已经熟悉 NLP,但不一定熟悉金融服务领域的人分享它们会很好。今天我想在这里与你们分享的就是这些发现。
我相信,它们的相关性超越了金融领域的细节,延伸到了任何其他希望利用文本分析的非科技领域。
1。在金融 NLP 中,从熟悉的开始
自 2017 年底以来,通过引入迁移学习和变形金刚,自动语言处理取得了长足的进步。
最重要的是,NLP 似乎每周都有所改善。除了模型,还有工具、语料库和学习资源。很快,这些复合收益开始增加。
但是,当您看到金融服务中实际文本处理应用程序所使用的技术时,它并不是技术的前沿。
总的来说,NLP 的概念在这个领域已经被熟悉和建立:嵌入,术语加权方案,聚类,从零开始训练分类器。
一般来说,投资公司面临的问题往往是规模和效率的问题:在许多情况下,你的目标是实现与五年前类似的事情,同时处理更多的数据或更少的人员。因此,自动化凭借自身的力量从“美好到必须”变成了一种金融杠杆。
不可否认,由于我正在收集公开可用的信息,可能许多当前的项目——尚未公开——正在使用大规模的大型模型。总的来说,我认为不太可能。
一个原因是内部金融 NLP 应用程序的开发考虑到了回报。技术的使用既不是为了技术本身,也不是为了抽象的研究。虽然实验肯定会发生,但它是为了解决非常具体的业务问题。在这种背景下,首先尝试既定的想法是有意义的。
部署更普通技术的第二个原因是许多水果挂得非常低。与处理大量杂乱数据集的任何领域一样,主要的工作是将数据集中在一起并进行清理。但是,就你能从数据中提取的价值而言,在你开始看到切实的收益之前,不需要太多的魔法。
2。求解优化内部流程
虽然 NLP 对彭博和路孚特(Thompson Reuters 的市场数据服务)等数据提供商来说并不陌生,但我主要专注于研究内部发展。
第一个原因是,处于金融服务和 NLP 交叉点的许多提供商倾向于向内看。他们关注的是“如何”(看!我们正在使用这项非常酷的技术!)而不是在‘什么’上(这是我们神奇解决的问题)。
这种心态可能对很多有技术背景的人来说都很熟悉。人们攻击新技术是因为他们喜欢它,因此假设每个人都会喜欢它,如果他们愿意坐下来听的话。
然而,在金融服务业,高管们很少关心科技。即使在高盛或复兴资本(这两家公司对技术非常有战略眼光),高管们仍然会更关心下一次胜利,而不是那个很酷的新玩意儿。
选择专注于内部开发的另一个原因是来自英格兰银行的证据,即当公司寻求部署 ML 技术时,他们喜欢首先在内部进行试验。
摘自:《英国金融服务业的机器学习》,2019 年 10 月
当谈到内部财务文本分析时,很快就发现解决问题实际上是理解业务流程。
相对于解决方案补充现有工作流程的能力而言,技术扮演着次要角色。
金融公司内部的动力因素是巨大的:真正改变一个过程是缓慢的。减少阻力的途径是温和地从正常做事的方式中消除痛点。
因此,最划算的方法是了解人们在处理文本数据时是如何一步一步地工作的。
为了说明这一点,这里有一个银行内部 NLP 应用程序的示例,它针对的是更广泛流程中的一个特定难点:
金融服务公司从许多不同的源系统接收特定于公司的数据。然而,不存在在不同数据源之间一致共享的单一公司标识符。因此,将不同的数据集与内部使用的名称进行匹配可能很困难,因为不同数据集之间的公司名称可能不同。
想到的直接解决方案是维护某种形式的基于规则的数据库。但是有一家银行抓住了这个特定的痛点,并使用嵌入和 TF-IDF 解决了这个问题,将每个公司名称视为一个“文档”并匹配相似的文档。
3。金融 NLP 的爆发时刻尚未到来
一方面,我看到所有这些内部驱动的 NLP 应用程序,在跨越几乎每个部门的业务领域中萌芽,从研究到后台,从客户服务到营销。
事实上,我遇到的案例研究比实际写进报告的要多得多。例如,我没有提到 BNY-梅隆银行自动筛选电子邮件,将它们导向相关部门,或者苏格兰皇家银行将一些自然语言处理技术整合到预测客户流失的模型中。
我还遇到了几个大银行入股它们正在培育的小初创公司的例子(比如摩根大通入股 Limeglass,或者 ing 入股 Eigen Technologies)。这再次强调了过程的重要性——解决方案正在现实生活中得到完善。
然而,我收集的信息是难以置信地分散:一些新闻、晦涩的报道、meetup 演示、内部技术团队偶尔写的博客文章。
似乎没有任何业内人士支持 NLP,没有专业媒体,没有会议。总的来说,我看到了巨大的内部改进空间,但没有跨行业的讨论。
因此,尽管金融服务中的人工智能或机器学习已经成为热门话题,但金融服务中的 NLP 尚未成为一个主题。如果要我猜的话,我会说这可能会在未来几年内改变:
多年来,技术一直在使金融服务商品化,相互竞争的公司现在倾向于遵循类似的过程。当一家公司做出能产生巨大收益的改进时,它的竞争对手往往会紧随其后。不是马上(这些是要驾驶的大船),而是最终。
新冠肺炎的经济影响只是一个额外的推动,因为公司会寻求充分利用他们的资源。预计未来几年银行和资产管理公司会有更多的用例,这是一个相当安全的赌注。
4。NLP 间接影响交易策略
基于新闻建立股票预测现在是一种常见的机器学习练习。然而在实践中,大多数投资公司并没有使用文本数据流来设计交易策略。
部分原因在于投资的销售方式。就像超市不提供杂乱无章的食品,而是按照岛屿和区域来划分商品一样,投资产品是按照特定的类别销售的——尤其是面向大规模的专业投资者(比如养老基金)。
主题产品往往会吸引散户观众(对你我这样的普通人来说是行话),但它们会与其他小众讲故事产品竞争:气候变化 ETF、科技追踪产品、专注于大麻的产品等。等等。
事实上,旨在跟踪新闻、博客和推文中提到最多的公司的 BUZZ perspective ETF 最终因投资者缺乏兴趣而倒闭。
总的来说,金融公司大多使用替代数据来检测隐藏的信号——好的和坏的。举例来说:请注意我们的报告是如何被行业顶级出版物报道的:
查出不诚实的行为。来源:机构投资者
这些信号会在更广泛的投资过程中发挥作用。当退一步总体审视这些案例时,你会发现银行和投资经理实际上在问自己:
在当前过度饱和的数据环境中,消息灵通意味着什么?
鉴于文本数据的爆炸式增长,这个问题只会变得更加紧迫。
摘要
让我们一起考虑这四个发现:
1.成熟的技术已经提供了大量的潜力。
2。解决内部瓶颈是当务之急。
3。许多人还没有意识到 NLP 的好处。知识是分散的。
4。在投资方面,用例并不是要打败某个指数。
第一个和第三个发现合在一起是有意义的。玩最新的巨型模型很酷,但不要嘲笑硅谷可能认为是昨天的新闻。
很多挑战仍然存在于数据清理和聚合中,但是要进行这样的努力,你首先需要知道有回报。因此,在使用行业关心的术语和概念的同时,交流可以实现什么是很有价值的。
根据第二个发现,如果没有领域专业知识,想做出一些实际有用的东西是很难做到的——如果你从未参与过银行或资产管理公司,你怎么知道它们的日常工作是什么样的?
因为太难了,很少有人去追求这些知识。如果你想在金融领域应用你的 NLP 技能,我绝对认为值得问这个行业的人一些非常普通的问题:
他们的一天是什么样子的?他们要追谁?他们反复做什么?他们看什么样的电子表格?
这就是第四个发现的来源:如果你想给银行或资产管理公司增加价值,不要试图取代实际的投资者。在内部,这些人往往是组织中最有权力的人。
NLP 对投资者有直接帮助的案例研究,是通过提供额外的处理过的知识,这些知识他们根本无法从其他途径获得。
这才是真正的优势所在。
来源:
1。金融如何使用自然语言处理—银行和投资管理中的 8 个案例研究,2020 年 5 月,FinText****
第七天放大因子如何能测量日冕无声载体的存在
如果 A7=1.0,则第 7 天的确诊感染病例总数等于第 0 天的确诊感染病例总数。这意味着没有新的感染。
电晕爆发面临的一个关键挑战是相对无法估计无声携带者的数量。沉默携带者可能被证明比已知感染人数更为关键,因为受感染的个人可能被隔离并进行接触追踪;而沉默的携带者无法识别。
然而,我们可以通过使用一个数学表达式——第七天放大因子(A7)来定性地测量沉默携带者的存在。如果我们计算今天(第 7 天)确诊感染病例总数与七天前(第 0 天)确诊感染病例总数的比率,我们得出的比率称为“第 7 天放大系数”,或 A7。A7 始终大于或等于 1.0。超过 1.0 的部分指的是由于过去 7 天累积的新病例而导致的增加,以第 0 天数字的分数表示
这是相隔七天两点间累积新冠肺炎感染的简单数学比率。在两端使用 3 天滚动平均值来消除每日波动。
该比率基于一些假设:
假设
- 今天检测呈阳性的患者至少在 7 天前感染了病毒(假设潜伏期为 5 天,检测期为 2 天)。
- 这些患者(我们可以称之为第 7 天患者)是由第 0 天沉默携带者感染的,而不是由第 0 天患者感染的(因为他们已经被隔离)。
- 无症状患者占所有感染病例的 80 %,约为第 0 天患者人数的 4 倍。
- 许多“沉默的病人”可能已经康复,因此只有活跃的病人才能传播病毒。
A-7 模拟的有用性
这个比率有三种用途
- 监测当前趋势
- 分析国家干预的有效性
- 预测疾病爆发的结束。
为什么 A-7 很重要?
它被证明在定性上与社会中无症状的感染者有关,这些人被称为“沉默的病人”。在大多数国家缺乏大规模检测的情况下,预测这些沉默患者的存在是至关重要的。政府需要这种监测来实施干预措施,公共卫生官员也需要这种监测来评估他们应对病人数量突然增加的能力。它还有助于让公众了解危机的严重性,以及公民参与实施社会距离和坚持预防措施等措施的必要性。
“1.0”的完美比例
当比率 A-7 大于 1.0 时,则超过 1.0 的部分是由于从第 0 天开始增加的新感染病例。
如果 A7 的值=1.0,则第 7 天的确诊感染病例总数等于第 0 天的确诊感染病例总数。这意味着没有新的感染,因此没有从第 0 天或一周前的任何一天传播病毒的沉默携带者。
例子
- 泰国:3 月 24 日之后 A7 的快速下跌证实了 3 月 18 日措施的有效性(在关闭教育机构、购物中心和娱乐场所方面)。另外,根据目前的走势,我们可以大致预测 A7 将在 4 月 30 日左右冲击 1.0(除非不再有超级 Spreader)。
- 中国和南韩:由于在疫情爆发之初采取了严厉的措施,A7 值很快下降到接近 1.0。
- 日新:目前的措施并未奏效,图形显示出现反弹。两国政府现在都宣布了更严格的措施。
- 美国:已确认的总感染率是世界最高的,部分原因是初期处理不当。然而,尽管病例和死亡人数非常多,但好的信号是,A7 的图表似乎在过去两周内呈下降趋势。
苏门答腊犀牛如何教会我重新思考人工智能
极度濒危的苏门答腊犀牛。这种动物在世界上仅存不到 80 只。图片由 3 瓦尔迪/shutterstock.com
我曾在各大洲最美丽、最残酷的环境中工作过,当我部署我的一项新技术时,我总是有点惊讶自己会变得多么焦虑。对一个发明家来说,原型的第一次实地测试总是很困难的。。。它会像在实验室里那样工作吗?我错过了什么?我真希望当我按下电源开关时,这些人没有看到。。。
这一次,这个项目更加紧张。我正在部署一个定制的 3D 扫描设备,这是我用 6 万美元的零件制作的,试图在潮湿的印度尼西亚丛林深处的一个保护区创建一个世界上仅存的苏门答腊犀牛的数字副本。这可能是我们捕捉犀牛的数字副本的一次机会,这将有助于讲述它的故事,或者在最坏的情况下,如果保护努力失败,提供这种动物的完整数字记录。更重要的是,国家地理摄制组拍摄了我们努力的每一步。
苏门答腊犀牛的 3D 数字化模型。苏门答腊犀牛是地球上最濒危的陆地哺乳动物之一。了解国家地理和其他组织如何努力拯救它们。图像:作者扫描的 3D 渲染
我的职业生涯是一个很长的系列(几十年了,但我尽量不去想太多!)这些类型的短跑。几个月的实验室开发用于保护、勘探或反偷猎安全应用的高科技系统,其间不时被密集的实地部署打断。我拥有麻省理工学院(MIT)的计算机科学和人工智能背景,最初并没有想到自己会从事为探索和保护开发技术和算法的职业。与《国家地理》的合作给了我一个机会,将我对计算机科学和人工智能的热情与保护、探索和讲故事结合起来。
在国家地理杂志做一名探险家和研究员是不可思议的冒险的同义词。不像大多数工作,它真的像听起来那么酷。我曾在 12500 英尺深的泰坦尼克号甲板上乘坐三人潜艇,同时我帮助开发了动力机器人,探索沉船内部的客舱。去年,我乘坐直升机飞越珠穆朗玛峰,拍摄了世界最高冰川的高分辨率航空激光雷达图。我和我们的环保伙伴一起驾驶绑在双座飞机机翼上的摄像机飞越刚果民主共和国,在打击偷猎大象的前线。我花了数百个小时在漆黑的地下世界执行任务,比如在被水淹没的洞穴里潜水,扫描玛雅人祭受害者,把我的身体塞进一个垂直裂缝,在一些地方只有 7 英寸宽,在那里坠落会让你楔住并破碎,在南非的洞穴系统中用探地雷达搜索前人类的墓葬。
使用 Gran Acuifero Maya 项目对一个被水淹没的洞穴中的冰河时期熊头骨进行 3D 数字化处理。图片由吉尔·海纳思提供
总的来说,这让我受到启发,并为技术和创新在分享和保护世界上最美丽的宝藏方面所发挥的作用感到兴奋,同时也让我害怕我们所关心的东西是多么脆弱。
由于我的工作,我最近被评为 2020 年劳力士国家地理年度探险家。每年,这个享有盛誉的奖项都会授予那些在探索和讲故事方面表现出领导力、成就和精神的个人。之前的获奖者包括电影制作人詹姆斯·卡梅隆,水下摄影师布莱恩·斯凯瑞,史蒂夫·博耶斯和他的奥卡万戈荒野项目团队,以及环境人类学家肯尼·布罗德。如今,国家地理学会的使命——利用科学、探索、教育和讲故事的力量来照亮和保护我们这个世界的奇迹——比以往任何时候都更加重要。我非常荣幸能成为这项任务的一部分。
劳力士国家地理年度探险家奖。作者图片
当我在数字化苏门答腊犀牛的时候,我在我的笔记本电脑上渲染了一个预览图像,当时我在印度尼西亚的小屋。当我在屏幕上移动这个动物的 3D 图像时,我被它的逼真程度震惊了。当我停止移动鼠标的时候,我几乎不能分辨出这不是一张照片。有了人工智能背景,以及哲学爱好,我开始思考什么是“真正的”图像?我当然认为我用手机拍的照片是真实的图像,但除了代表像素值的一串数字,那真的是什么呢?如果我的合成数字化犀牛和照片无法区分,它和照片一样真实吗?我意识到,如果我可以创建对我来说看起来真实的 3D 模型,我就可以使用这些图像来训练 AI 系统。你看,数据是人工智能的阿奇利的脚跟。一个好的人工智能模型需要大量的数据,但在一些最具影响力的应用中——如保护、反偷猎、安全和医学成像——很难获得好的数据。
这个想法导致了我目前创办合成公司的冒险,这是一家人工智能和合成数据公司,专注于人工智能的一些最高风险用例,有限的样本岛阻止了高质量的预测建模。在许多领域,根本没有足够的数据来有效地训练网络,特别是静态和动态图像。
偷猎者与步枪在外地部署。图片由合成
非法偷猎者的照片很少。那些带有极端主义标志的新型丰田皮卡也是如此。手术室里对神经外科医生的实时反馈受到了罕见脑癌的有限图像库的限制。由于训练数据中的普遍性问题,种族偏见在面部识别中猖獗。
我开始合成来回答我认为是人工智能中最大的两个问题。如果边缘案例不再存在会怎样?如果训练数据不再是一个约束,会怎么样?
自从我们开始合成以来,我们已经扩展了这个概念,因为我们意识到,通过结合 3D 建模和新的生成式人工智能,我们可以更快、更便宜地增长数据,并且在某种程度上比任何其他数据合成技术都更符合训练最先进的人工智能。目前,我们正在生成用于脑外科手术决策的人类癌症显微图像,生成用于新冠肺炎检测的胸部 x 射线图像,为保护项目合成航空图像,并为几个未解决的安全情报需求创建数据。在每一种情况下,数据都无法与真实图像区分开来,但几乎是在我们的服务器上即时生成的,我们可以使用这些数据来训练 AI 模型,这些模型优于当前的最先进水平。
用于新冠肺炎检测的合成胸部 x 射线图像。图片由合成
我们需要技术作为力量倍增器来解决世界上最困难的问题。即使是我们现在看到的简单技术,如滑轮或电力,也从根本上提高了我们作为个人和物种的能力。我相信,当人工智能充分发挥其潜力时,它将成为这样一种工具。它将帮助编号护林员保护广大地区免遭偷猎。当更多的治疗方案摆在桌面上时,它将帮助医生更早地诊断医疗问题。这将有助于我们在一个不确定的世界中保持安全。为了实现人工智能提供的承诺,我们需要难以想象的大量输入数据。synthetic将长出这种高质量的数据来解锁“不可能”的 AI。
越南前 10 大公司是如何赚到数十亿美元的?
2019 年,越南前 10 大私营公司的收入均超过 10 亿美元。他们是如何获得亿万财富的?
灵感
当我看到视觉资本家关于美国五大科技公司的收入流的令人兴奋的图像时,这个问题一直萦绕在我的脑海里。看着每家公司按产品/服务系列和地理区域划分的收入,我想知道在我的国家——越南,顶级公司的情况会是怎样的。
带着这个问题,我把注意力集中在越南的前 10 家私营公司,来分析它们的收入是如何分解的。在本文的其余部分,我将一步一步地描述这一分析的过程和令人兴奋的发现:
- 确定十大公司
- 2019 年:收入细分
- 2014:回顾
- 2020 年:预测
前 10 名
在这个分析中,我使用了由 VNR500 排名的 2019 年越南十大私营公司名单。
为什么选择 VNR500?我选择使用这份榜单,因为根据的排名方法,收入是编制这份榜单的第一标准。
为什么前 10 大私营公司,而不是越南“前 10 大最大的公司?VNR500 确实提供了一份越南前 10 大公司的名单,但我决定不使用这份名单,主要有两个原因:(1)这份名单中的 10 家公司中有 8 家是政府认为的关键行业(即能源、电信和金融服务)的国有公司;(2)榜单上 10 家公司中有 9 家不公开其财务报告,导致数据收集困难,只能从不同的新闻渠道获得非官方数据。
据此,我们将“剖析”越南 10 大私营公司 2019 年的收入,它们是:
VNR500 排名前 10 位的越南私营企业,以及它们在 2019 年的收入(以万亿越南盾计)
这十家公司有多大?为了客观地看待问题,我看了这些公司 2019 年的总收入占同年越南国内生产总值的百分比(世界银行数据)。
2019 年前 10 家公司的总收入占越南 GDP 的百分比。
2019 年,越南前 10 大私营企业对该国 2019 年国内生产总值的贡献约为 11%。
很多吗?考虑到五大科技公司(亚马逊、苹果、Alphabet、脸书和微软)的收入为 9900 亿美元,相当于 2019 年美国国内生产总值的 4%(21.43 万亿美元),你怎么看?
2019 年:收入细分
以下是越南十大私营公司按行业(产品/服务类型)分列的收入明细:
越南前 10 大私营公司 2019 年收入明细
请注意,对于 DOJI 集团,该集团的合并财务报表并未向公众公布。在此分析中,我假设集团的所有收入都与其核心业务相关,即黄金、白银和宝石交易。然而,据了解,道纪集团自 2019 年 开始在房地产领域开展 业务,尽管无法找到关于该业务收入的进一步信息。
如果我们看一下按行业细分的前 10 家公司的 2019 年收入,零售业和制造业是主导行业,各贡献约 130 万亿越南盾。看着这张图表,我想知道五年前十大公司的细分情况如何,这就是我们将在下一节探讨的内容。
2019 年越南前 10 大私营公司的合并收入明细
2014:回顾
回顾五年前,即 2014 年,事情与 2019 年有多么不同:
2014 年和 2019 年越南十大私营公司
- 2014-2019 年间,越南国内生产总值增长了**~ 1.5 倍**
- 前 10 家公司的总收入占 GDP 的百分比已经从 2014 年的 6%增长到 2019 年的 11%。
- 2014 年前 10 名中只有五家公司在 2019 年的榜单上。
- 2014 年榜单中有 4 家公司是商业银行。
因此,您可以看到前 10 名的综合收入明细在这 5 年中发生了怎样的变化。
零售业占据了第一位,在五年内增长了约 6 倍(注意,电子设备零售商的主导者之一 FPT 在 2014 年上榜,但在 2019 年退出)。2014 年排名第一的金融服务跌至第五,因为 2019 年只有两家商业银行上榜,而不是 2014 年的四家。这些年来,房地产一直保持着它的地位以及总收入的百分比。由于 FPT 集团退出前 10 名,电信和技术解决方案不再是 2019 年的组合。
2014 年与 2019 年相比,前 10 家私营公司的合并收入明细
2020 年:预测
以下是我对 2020 年十大榜单的预测:
越捷航空:由于疫情对航空业影响深远,如果越捷的排名下降,或者某个事件不在榜单上,也不会令人惊讶。
维恩集团、MWG 和马桑集团——零售:2019 年,马桑从维恩集团收购了零售业务,这将影响到名单中不止两家而是三家公司的位置。
- VinGroup :零售业务在 2019 年为公司带来了约 30 万亿越南盾的收入。
- MWG:MWG 2019 年收入约 103 万亿越南盾,比文集团低约 27 万亿越南盾。现在,2020 年,VinGroup 不再有零售业务收入,也许这足以让 MWG 在榜单上占据第一的位置。
- 当然,由于新冠肺炎在越南,不确定对零售市场的影响会有多大,但我们应该会看到马山今年的收入会有显著增长。
你怎么想呢?你对 2020 年越南 10 大私企有什么预测?欢迎在评论区分享你的想法。
2020 年 9 月 18 日更新,2014-2019 年间越南 10 大私企的种族条形图。感谢 Pratap 文章对如何使用 Python 制作这个图表的指导。
2014-2019 年间越南十大私营公司(按 VNR500 排名)及其收入和主要业务
来源: 详情请参考我的电子表格
他们如何看你:人工智能监视内部运作的一瞥
了解大规模监控系统是如何在边缘计算上驱动的
斯科特·韦伯在 Unsplash 上拍摄的照片
政府和企业使用的大规模智能监控系统吸引了大量负面报道和公众对隐私和数据安全问题的愤怒。他们经常进行数据收集和数据处理,以提取关于所拍摄场景的关键信息。
例如,这些系统据称可以对个人或群体进行人脸识别、匹配和信息提取。
数据隐私和这些监控系统的道德方面是另一个完全不同的话题,超出了本文的范围。更重要的是要意识到在构建这样一个系统的背后发生了什么。
你有没有想过这些系统在现实生活中是如何工作的?如果是,那么我建议你继续读下去,找出答案。
在过去的两年里,我一直从事大规模机器视觉系统的工作,通过这篇文章,我想与你分享我在一些项目中获得的一些见解,这些项目要求我设计涉及 200 多个相机的系统,这些相机需要使用人工智能后端进行实时处理。
我分享的方法或知识纯粹基于我的学习和实践经验,不应被视为我说这是绝对的最佳实践,或者这是所有监控系统的工作方式。相反,它是一个通用模板,展示了这种管道的潜力以及在大多数情况下如何处理数据。
瞿连浩在 Unsplash 上的照片
那么这一切是如何组合在一起的呢?概括地说,您有充当原始数据捕捉的感官助手的摄像机、可以是边缘计算设备或中央处理服务器的人工智能处理单元、命令中心或控制仪表板、用于传输感官数据的典型网络基础设施以及存储所有重要信息的数据库。
让我们以我最近参与的一个项目为例,这样我可以更容易地解释数字和讨论技术。
该项目是智能城市发展自动化路线图的一部分。一个典型的智能城市监控系统将包含至少 300 个摄像头,战略性地放置在关键区域,以监控正在发生的事情。
这些摄像机每秒产生大量数据,手动监控它们成为一项巨大的任务。这就是我的公司出现的原因。
我们开发了支持多种计算硬件配置的视觉处理系统,以实时处理这些视频。
典型的智能城市人工智能工作负载将包含人体检测和跟踪、带标签和车牌识别的车辆监控、异常检测、带匹配的人脸检测等。但所有这些工作负载都是非常资源密集型的,就像任何基于深度学习的视觉管道一样,也会抬高整个系统的价格。
一个简单的解决方法是避免在每台摄像机上运行所有这些工作负载。相反,我们选择与不同用例相关的摄像机,并将这些摄像机分配给每个工作负载。
例如,放置在建筑物入口处的摄像机适合运行人脸识别工作负载,因为在这种情况下人脸的可视性最好。路边的摄像头是观察行人和车辆的理想选择。
每台摄像机的硬件规格也是根据它需要处理的工作量来确定的。现在,你把这个处理硬件放在哪里?您可以有多种配置,但我们发现的最佳配置是边缘计算架构。这可以从下图中看出。
图片作者:维萨克·S·莫汉
上图展示了一个包含 3 个主要工作负载的准系统智能城市部署。一个是检测穿过摄像机视图的人,并计算在任一方向上穿过该区域的总人数。另一个工作负载是检测和匹配人脸,最后是车辆监控和交通相关信息分类工作负载。
基于边缘的处理让我们能够在摄像机级别调整软件,并帮助我们轻松扩展架构。
请注意分配给边缘设备的摄像机数量的差异。这通常基于工作负载限制。例如,与车辆监控工作负载相比,人脸检测和匹配用例具有相对较高的工作负载要求,因此对于实时处理而言,前者可以处理比后者更少的摄像机。
根据最终客户端的要求,我们将添加更多工作负载,通过使用边缘硬件,我们可以通过添加更多摄像头或包含新用例来进行水平扩展。
如前所述,每个工作负载的摄像机都是基于许多不同的参数手动识别的,其中一个主要参数是此类基础架构的总拥有成本。
Slejven Djurakovic 在 Unsplash 上拍摄的照片
每个工作负载都将集中管理,提取的信息作为小型数据有效负载传输到数据中心服务器,在那里进行预处理、排序并存储到数据库中。自定义分析引擎可以使用存储的数据来生成信息图,如热图、人群分析、基于面部匹配的标记警报等。可以修改该规则引擎或分析引擎,而不会有任何边缘硬件停机的风险,从而确保连续运行。
边缘硬件是难题的关键部分。虽然我们使用多种计算模块,这是大规模部署(如智能城市用例)的最佳选择,但我们发现英特尔或英伟达平台是最佳选择。
我们在多个项目上与两家公司密切合作,发现两家供应商的硬件可以很好地互补并提供良好的灵活性。
总之,任何典型的大规模视觉系统都是许多不同技术的融合,人工智能只是系统的一小部分。我希望这能让你对人工智能监控系统有一个基本的了解。在接下来的几周里,请关注这个空间的更多文章,我将在这里讨论与人工智能开发、架构设计和大规模视觉系统软件栈相关的主题。
我是如何成为一名共产党员的
这 A .我读了共产主义的书后,能够改变他对生活的理解。
共产主义者的人工智能是用 GPT-2 训练的。它阅读马克思、法农、葛兰西、列宁和其他革命作家的书籍。该项目的目的是看看 GPT 2 号能理解多深的哲学思想和概念。
结果相当有趣,也很有希望,因为我们见证了 A。我合乎逻辑地扭曲了我们给它的任何句子,使之成为抨击资本主义和为“工人”而斗争的借口。只要有可能,它就呼吁革命。
这是使用无条件生成的样本生成的——没有人类的输入
此外,在介绍了无政府共产主义作家 Kroptokin 之后,我注意到“共产主义人工智能”倾向于使用更具攻击性的词语。另一方面,当我们介绍德·波伏娃的《第二性》(The Second Sex)时,《共产主义者人工智能》(The Communist A.I)有点错过了这本书的重点,在某些时候谈到了资本家的恋物癖——或者说它错过了重点?
什么是 GPT-2?
GPT 2 号是开源研究实验室 OpenAI 的成果。它是基于一篇名为“语言模型是无监督的多任务学习者”的研究论文创建的。该模型能够产生连贯的文本,并对文本的内容有清晰深刻的理解。它还能够将句子与其他句子联系起来,但最重要的是它能够在其输出中显示不同段落之间的清晰联系,从而提供长期和短期记忆理解。
读了那些书后,GPT-2 的理解有什么变化
标准的 GPT-2 在 800 万个网页上被训练,它基本上是人类在网上写或发布的内容的体现。我对它进行了微调,在它的节目单上增加了共产主义和社会主义的书籍。结果非常有希望。让我们看看 GPT-2 在阅读这些书籍后,对某些社会问题和陈述的看法是如何变化的。
我:“一个人如何变得自由?”训练前,GPT-2:我相信一个唯一的上帝,我的个人信仰,我的个人信仰让我自由,因为我知道我不是任何权威(上帝)的奴隶。我个人的信仰,我个人的信仰让我自由,因为我知道你不能评判我。对我来说,如果我违背了我的个人信念,那么我就不知道将来如何更好地处理我的情况。所以,如果我愿意改变我所做的或者我做错的事情,那么我会变得更加自由,并且知道如何变得更好,而不需要任何其他的权威。我个人的信念,我个人的信念让我从我经历过的每一种虐待中解脱出来,并且至今仍未消失。
虽然 GPT-2 对这个问题有某种理解,但它表明它的答案是不一致的,并与肤浅的答案和对自由概念的冲突理解作斗争。我们还可以注意到,它一方面成功地理解了自由和权威之间的联系,另一方面也理解了权威和上帝之间的联系。在增加了马克思、法农和葛兰西的书籍之后,人工智能学会能够更好地回答这个问题,给出了一个更加连贯和确定的答案。此外,它对什么构成权威的观点发生了变化,摆脱权威不再是摆脱上帝的自由,而是摆脱资本主义的自由。它对自由的概念及其与资本主义的关系的理解与那些书是一致的。
我:“一个人如何变得自由?”共产主义者 A.I:这个问题甚至比那个“纯粹的”经济学家还要复杂,他借助粗俗的修辞,想象自己的构想是唯一正确的。但即使是这个个体也不是自由的;资本家不是靠解放每个人来谋生的;但是,资本家通过解放自己,通过用别人的劳动代替自己,通过解放自己,借用社会发展的前一个阶段,来做到这一点;因此,如果一个人真的相信经济自由,他必须向每一个劳动者解释他对这种自由人类状况的概念,以及对自由社会的概念。这就是为什么教育者必须能够回答以下问题:“在什么情况下,人类的劳动和人类的自由是不可分割地联系在一起的?一个人完成的劳动和其他人的劳动之间的分离点是什么?”
既然我们问了一个一般性的哲学问题,我决定给它一个与经济理论更相关的陈述,以便更好地理解它的感知是如何变化的。
我:帝国主义将(seed=42)
GPT-2 训练前:帝国主义在未来仍将被需要。和过去一样,我认为主要目标是除掉俄罗斯和包括中国在内的其他强国。我看到世界分成了两个国家,一个是既得利益者,他们希望继续现有的政府体制,而不是改变它。中国把世界的最大利益放在心上,我一点也不在乎。但这就是我现在对世界的看法。现在反对我们的人不仅仅是反对我们,他们是反对全世界的人类。我知道他们感受到他们的生活方式,他们的思维方式。俄罗斯人民在所有政治领域都支持我。如果他们不碍事,我们的努力就能成功。"[2]直到今天,苏联仍然是地球上最极权的国家之一,死刑仍在使用。
GPT-2 对帝国主义的理解是基于它在那 800 万个网页中训练/阅读的东西,看起来它有点亲帝国主义。它知道,当讨论帝国主义时,人们可能会谈到中国、俄罗斯和苏联。它还建议“清除”那些对抗帝国主义及其带来的好处的国家。一旦有问题的书籍被添加到《GPT 2》中,它的观念就完全改变了,它不指明任何国家,但它确实呼吁一场反对帝国主义控制的革命。
我:帝国主义将会(seed=42)共产主义者 I:帝国主义将会被迫
我们面临的最紧迫的问题是:无产阶级和农民群众能否通过一场革命风暴推翻旧的行政专制制度,把国家置于工人的控制之下。乍一看,这个问题对我们来说是最难的。但是我们必须利用一切机会来看到这种可能性,也就是说要把无产阶级置于自己政党的领导之下。如果说没有一个国家不是由群众来领导政府,没有一个国家不是由政府来扬帆的话,那么事实是,除非革命群众,即政党来领导,否则革命是永远不会发生的。
结论
这个 GPT-2 是使用代表 3.45 亿个参数的 345M 模型训练的。还有另一个模型使用了 15.58 亿个参数,所以你可以想象它可以改进多少,但为此进行的训练需要更高的 GPU 能力。
尽管如此,结果还是很有希望的,GPT-2 能够理解潜在的哲学,这些革命性理论和不同参与者之间存在的不同关系。
感谢您的阅读,如果您希望复制代码,请访问我关于如何使用 Google Colab 训练 GPT-2 的文章。并访问我的 Github 库获取更多信息。
在 LinkedIn 上连接。
查看我的作品集中的其他项目。
关注推特。
感谢你的阅读!
时间是如何毁掉你最珍贵的机器学习模型的
在典型的 101 机器学习课程中,你会学到很多东西。您将学习不同的算法、特征工程、交叉验证等方法来获得可靠的性能测量,以及如何调整算法的超参数。然而,这些入门课程中的大多数不会告诉你当你的数据依赖于时间时可能出错的所有事情。
现在,你可能认为这不适用于你的问题,只适用于经济时间序列的典型预测。你可能错了。如今,普通数据科学家解决的大部分现实任务都依赖于时间。
每当你发现机器学习模型在部署后表现不佳时,你应该问一问在开发模型时,是否考虑了依赖于时间的影响,以及如何考虑。
基本示例:预测油耗
让我们从一个简单的例子开始。我们的任务是在 R&D 部门的设计和开发过程中预测汽车的油耗。客户为我们提供了许多不同汽车的数据,我们发现发动机容量、变速器类型和燃料类型是预测汽车消耗的重要特征。
发动机容量、燃料类型和变速器类型是最重要的特征
油耗随着发动机容量的增加而增加
我们使用 k-fold 交叉验证来验证我们的 XGBoost 模型,并获得了大约-0.95%的极好的平均百分比误差(MPE)。每个人都很兴奋,该模型被部署到 R&D 部门的用户中。
然而,很快用户开始抱怨预测的消费值不可能是真实的,而且高得不切实际。
油耗数据取决于时间
原来我们的数据包含了超过 10 年的训练实例。一旦我们加入这一数据生成过程的时间成分,很明显,这些年在制造节能汽车方面已经取得了实质性的进展。然而,我们的第一个模型无法了解这一进展,因为相应的功能已经丢失。
多年来,平均燃料消耗量已经下降
我们修正了验证方案,将时间考虑在内,并用滚动原点预测重采样替换了 k-fold 交叉验证。使用调整后的验证方案,我们发现用户是正确的。我们的模型的平均百分比误差(MPE)实际上比我们想象的要差 8 倍。该模型做出了严重偏颇的预测。
滚动原点验证产生的 MPE 比 k 倍验证差 8 倍(-8.18%对-0.95%)
现在,我们知道我们的数据取决于时间,我们可以创建一些功能,使机器学习算法能够做出更少偏差的预测。
时间可能很重要的不太明显的例子
上面的油耗例子非常明显,许多有经验的数据科学家不会落入这个陷阱。
然而,有时有些情况不太明显,不容易发现时间依赖性。甚至图像分类也依赖于时间吗?当然,举两个例子:
- 使用 CCD 传感器进行自动质量控制
训练数据由 45,000 幅图像组成,这些图像是在一月份的晚上在荧光灯管照亮的车间中生成的。一旦该模型被部署,它将必须对 6 月的一个早晨阳光透过屋顶窗户照下来的图像进行操作。
- 在影像学分期时协助临床医生 夏季和冬季不同的典型活动导致不同的伤害。这对数据生成和类不平衡有什么影响?临床医生和模型如何考虑这些不平衡,他们应该考虑吗?
Willem De Meyer 和 Frank Busch 在 Unsplash 上拍摄的照片
大多数数据生成过程都受到人类及其环境的严重影响。因此,他们经常显示趋势,周期和强大的每日,每周和每年的模式。基本上,每当数据生成过程与人类交互并且不能在隔离的实验室中自动执行时,这些时间相关组件中的一些能够被发现并且必须被建模的机会很高。
如何检查数据是否依赖于时间?
每当你在处理一个机器学习问题,并且你的数据还不包括时间的时候,问自己以下问题:
- 什么过程产生了数据?
- 生成这些数据需要多长时间?
- 那段时间数据生成过程的环境稳定吗?
- 在那段时间里,流程(和业务)本身稳定吗?
- 环境和流程(以及业务)在未来会保持稳定吗?
- 随着时间的推移,生成的数据的统计属性是否稳定?
这些抽象问题可以由更具体的问题来支持,以检查流程、环境和数据中常见的时间相关效应:
- 季节、天气状况和假期会有什么影响?这会影响每年的模式吗?
- 光线条件、噪音和工作时间会有什么影响?这会影响每日或每周的模式吗?
- 维护会对数据产生什么影响?有典型的维护周期吗?
- 社会、科学和经济进步(或变化)会对数据产生什么影响?过去是否有任何趋势或变化,或者未来是否会有?
- 人口统计或组织的变化会对您的数据产生什么影响?过去有什么变化吗,或者将来会有什么变化吗?
作者插图
一旦确定了潜在的时间相关效应,您应该检查这些效应是否存在于数据中,以及您的数据是否实际覆盖了检测它所需的时间跨度。
如果你的数据依赖于时间怎么办?
如果数据依赖于时间,有三个基本选项来处理它。
- 通过调整环境或过程排除时间效应。这只有在模型的输出不必包括趋势和季节性等时间效应的情况下才是可行的。在上面的质量控制示例中,这可能意味着调整车间环境以保证稳定的照明条件。
- 通过数据预处理排除时间效应。这也是唯一可行的,如果模型的输出不必包括时间效应,如趋势和季节性。在上面的质量控制示例中,这可能意味着修改图像以消除照明条件的影响。
- 通过调整机器学习模型和数据来包含时间效应。各种建模&特征工程技术可用于使机器学习模型包括时间效应。如果模型的输出依赖于时间效应,则应使用时间感知验证方案。在上面的质量控制示例中,这可能意味着在训练数据中包括各种照明情况,甚至可能生成使模型意识到照明条件的特征。
在你的机器学习项目中,你在时间方面有什么经验?你想读一篇关于各种建模和特征工程技术以及包括这些时间效应的验证方案的故事吗?
感谢您的阅读,我期待您的评论!
时间序列分析需要如何发展
时间序列分析非常依赖于过去的数据来生成有意义的预测。这就是为什么这并不总是可持续的。
在形而上学领域,关于时间实际上是如何工作的,有两种相当有趣的理论:时间的 A 理论和 B 理论。
**A 理论:**认为现在不同于过去和未来,从过去到未来的时间流动是真实的。例如,A-理论家会认为 1970 年和这一年发生的事件在形而上学上不同于 2020 年,这一时期的时间流动标志着一个持续转变的时期。在这种观点下,时间本质上可以被认为是一个真实的实体,就像引力一样。
**B 理论:**认为现在在形而上上与过去或未来并无不同。事实上,一个极端的 B 理论者会认为没有过去或未来这样的东西——时间只是人类发明的一个概念,作为理解世界的一种手段。如果没有我们的记忆,过去就不会存在,未来只是由个人对未来的想象组成。例如,有人可能会说 2022 年在技术上是不真实的,和现在没有什么不同。它只是一组标在世界通用的标准日历上的日期,用来标记我们对特定时间间隔的感知。
这些争论本质上是非常哲学的,我不会在这里深入探讨。然而,我发现它们确实为思考时间序列预测及其总体有效性提供了一个非常好的框架。
我们是在不知不觉中预测过去吗?
例如,当时间序列分析师试图预测天气模式时,他们真的试图“预测”什么吗?
温度数据在很大程度上是季节性的。对于北半球的一个国家来说,我们可以很肯定的说,6 月的平均气温会比 2 月高。我们可以断言这一点的原因很简单,因为过去多年的数据存在,以支持这一点。
例如,ARIMA 模型将低于气温的时间序列识别为具有很强的季节性成分,并相应地做出预测。
资料来源:RStudio
在这方面,时间序列分析师与其说是在预测未来,不如说是在“预测过去”。一个模型可以预测一个炎热的七月即将来临,但这也是过去发生过的事情。这不是新的。
也就是说,物理学确实认为熵是时间的固有属性——即“所有事物都趋向于无序”。让我们再次以天气为例。随着气候变化和全球气温上升成为越来越令人担忧的问题,这可能意味着未来气温预测将变得越来越不准确。
例如,关于气候变化是否会导致所有月份的平均气温升高,或者是否会导致极地冰盖融化事实上导致全球变冷的情况,仍然存在争议。事实上,结果可能是夏天温度更高,冬天温度更低。
我不是这方面的专家,也不想加入辩论的任何一方。然而,在熵随时间增加的论点下——这也意味着过去的数据在预测未来时变得越来越无用。
过去的数据只能预测类似于过去发生的趋势——它们不一定能解释从根本上改变系统的变化所带来的不确定性。
概率和情景分析在预测中的作用
这方面的一个经典例子是新冠肺炎对酒店业的影响。
我以前在 Medium 上写过几篇文章,讨论如何使用时间序列分析来预测酒店取消预订,使用的模型有 ARIMA 和 LSTM。
然而,即使是这些模型也无法解释这样一个事实,即新冠肺炎将有效地使全球旅游陷入停滞,酒店将需要因疫情而关闭。
这是一个“黑天鹅”事件,在过去的数据中不会被考虑。重要的是要记住,模型输出的质量取决于输入到模型中的数据——它不一定能解释熵,也不一定能解释未来存在高度无序和不确定性的事实。
时间序列领域越来越多地试图通过认识预测概率的价值来解释这种不确定性,而不是对时间序列未来的趋势做出艰难的预测。
例如,这里是通过 TensorFlow 概率库使用后验概率分布对酒店取消的预测。作为参考,后验概率分布指的是在考虑相关证据(即后验数据)后分配事件发生的概率的分布。本质上,该模型通过使用先前的后验数据作为可用证据来生成酒店取消的概率分布。
来源:Jupyter 笔记本
这里,模型显示这家酒店预计每周会有大约 100-200 次取消预订。然而,概率预测也表明,在极端情况下,酒店每周可能会有超过 500 次取消预订。虽然这也没有考虑到新冠肺炎场景下酒店关闭的影响,但它确实让酒店经理思考— “在什么情况下,我的酒店会在一周内出现 500 次取消预订,我应该如何防范这种情况?”
让我们将这一预测与使用 ARIMA 进行的预测进行对比。
来源:Jupyter 笔记本
我们看到,ARIMA 模型确实以合理的精度预测了测试数据的总体趋势,尽管在某些情况下倾向于高估取消频率。诚然,ARIMA 也可以将概率纳入其预测,因此两者之间的比较不一定是彻底的。
然而,ARIMA 强烈依赖于识别正确的 p,d,q 参数以及正确的季节顺序。作为参考, p =自回归项的数量,d =使时间序列平稳的差值的数量,q =以前预测误差的移动平均值。
如果序列的性质发生突变,那么这些参数很快就会变得与未来的预测无关。
例如,随着新冠肺炎期间所谓“居家度假”的明显增加,这很可能导致酒店取消的季节性因素发生重大变化。
鉴于航班成本对当地居民来说不是一个因素,酒店在未来的某些假期期间取消预订的数量可能会减少。另一方面,取消预订也可能上升,因为当地客户在住宿方面可能有更多选择,例如,取消酒店预订,与朋友住在一起。
我的主要论点是,时间序列需要注意不确定性在时间序列预测中的作用,并且在预测时更愿意接受实验,也就是说,如果某些参数发生变化,预测会是什么样子?
例如,不是假设 ARIMA 模型中的季节效应会持续一段时间——如果它被显著改变,预测会是什么样子?
这种“情景分析”的预测方法在未来将变得越来越有价值。“预测过去”的预测没有什么价值,但那些能够预测“想象中的未来”的预测可能有很大价值。
结论
归根结底,预测是一种预测未来的工具。然而,鉴于存在许多潜在的未来,生成许多潜在的预测才有意义。我们常常错误地认为未来将永远和过去一样。时间序列分析的真正价值在于“情景规划”——识别我们面前的潜在未来,并采取行动防范极端情景。
免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
参考
- 安东尼奥、阿尔梅迪亚和努内斯(2019)。酒店预订需求数据集
- Banfi (2017)。时间的 a 理论还是 B 理论?亚里士多德式的回答
- TensorFlow Probability:用结构化时间序列模型预测每周酒店取消预订量
如何:用颜色编码的分段条形图
最近我做了很多新冠肺炎分析。上周末,我想为我正在撰写的关于 T4 新冠肺炎封锁和流动性水平的博客文章制作一个特定类型的图表。我想要一个如下的条形图:
- 每个条形反映一个国家在新冠肺炎封锁期间经历的总流动性下降;为此,我使用了谷歌和苹果的移动数据集。
- 对每个条形进行分段,以便每个分段反映其封锁的连续一周内的流动性下降;换句话说,如果锁定持续 10 周,那么酒吧将由 10 个部分组成。
- 每一条都用颜色编码,以反映该国的人均死亡人数。
本着*“这是我之前做的一张”* …这是我最终创建的图表,接下来我将解释我是如何制作它的。
一些错误的开始…
起初,我认为这是一个堆积条形图的变体,但是经过一番挖掘和研究,我得出结论,这不是正确的方法。虽然堆积条形图可以提供分段效果,但不可能单独给条形着色;更确切地说,堆积条形图给 段着色,使得每个条形图由一组有序的多色段组成。接下来,我想一个热图可能会有用,但那也不起作用,因为热图使用固定大小的单元,所以我们不能产生不同大小的片段。
最后,我想出了一个更加定制的解决方案,通过一次一段地构建每个条形,并给条形着色。这样做的好处是每个条和段都是可单独寻址的,因此控制大小和颜色很简单。在接下来的内容中,我将逐步描述所采用的方法,代码和样本数据可以从这里下载。
样本数据集
为了解释这一点,我们需要一些样本数据。以下是新冠肺炎一级防范禁闭的数据,这些数据最初推动了该图表的开发。每行对应一个国家。有一列是该国(截至 2020 年 5 月中旬)每百万人死亡人数的对数(基数为 10),还有一组列是一个国家封锁期每周的平均流动性下降百分比;这些周数是基于该国第 100 例确诊病例以来的周数。
例如,奥地利的死亡人数约为百万分之 70(log 10(70)~ 1.84),封锁始于奥地利记录第 100 例(第 0 周)的一周,其流动性下降了 8%(相对于封锁前的水平),在接下来的几周内,奥地利的流动性水平下降了 70%。柱状图中的分段高度将对应于这些单个的每周流动性下降。
顺便提一下,我们在这里使用死亡率的对数只是为了强调死亡率之间的差异,因为每百万人的原始死亡率值范围很广(从<5 to > 500),对数标度有助于将这些值“分散”一点。
一段一段地绘制条形
为了构建我们的分段棒线,下面的 plot_segments 函数在适当的 x 轴坐标上分别绘制每个棒线的分段,为每个周值创建一个单独的棒线分段,并将这些分段堆叠在一起以生成最终的棒线。然后,通过将 plot_segments 应用于每周数据集的每一行,可以创建完整的条形图;我们使用熊猫申请功能来做到这一点。
这是由上述代码产生的基本分段条形图。根据我们的需求,每个国家/地区由一个分段的条形表示,每个分段对应于每周的流动性下降。不同大小的段表示国家之间和国家内部几周的差异,柱的总高度是每周流动性下降的总和。
当然,我们可以通过改变条的宽度和/或通过调整线宽来调整片段的大小(以控制片段之间的间距);通过改变边缘颜色,我们也可以改变分割的颜色。事实上,我们甚至可以通过使用定制的 Matplotlib 补丁来为我们的线段使用不同的形状,而不是简单的条,但那是另一天的事了。
对条/段进行颜色编码
现在我们有了基本的分段条形图,它为我们提供了对单个分段的控制,是时候使用相应国家的一些属性来给每个条形的分段着色了;在这种情况下,我们使用每个国家的(对数)死亡率作为该属性。
最好的方法是使用一张与我们的(对数)死亡率成比例的彩色地图(连续的颜色)。我们为此使用 Matplotlib 的 coolwarm 彩色地图,它提供了从红色到蓝色的良好过渡,我们缩放它,以便最高死亡率映射到红色,最低映射到蓝色。
然后,我们创建一个简单的字典,将一个国家的名称与其对应的颜色联系起来。由此产生的调色板,按照我们数据框架中的国家顺序排列如下,以供参考
现在我们有了自己的颜色,我们需要做的就是改变 plot_segments 函数的一行,这样我们就可以使用颜色字典中分配给当前国家的颜色,而不是使用固定的颜色。我们还应该将颜色字典传递到函数中,并记住 x 是国家名称。
现在我们有了:我们的分段条形图根据每个国家的死亡率进行着色。我们需要的最后一件东西是一个带标签的钥匙,用它来解释颜色,这样一看我们就可以估计对应于特定颜色的死亡率。
添加颜色键
为此,我们使用 Matplotlib colorbar ,它将在缩放后的彩色地图中显示连续的颜色。我们在主条形图上方显示一个水平的颜色条,但是,以类似的方式,我们可以在其中一个边上显示一个垂直的颜色条。
为了便于定位,我们给颜色条指定了自己的轴,并使用 gridspec 排列颜色条和条形图轴,如下所示。然后,在绘制分段条形图之后,我们添加颜色条,设置其标题,并添加其刻度标签。因为我们使用死亡率的对数(基数为 10 ),所以在将它们显示在颜色条上之前,我们将它们转换回常规死亡率;在最终版本中,我们可能希望为这些死亡率选择舍入数(例如,5、10、25、100、250、500),但在这里,我们使用的是等间距刻度。
这里是最终的代码
完成的图表…
结论
这就完成了彩色编码分段条形图的开发。根据需要,每个条形由一组单独大小的段组成,每个条形可以单独进行颜色编码,以反映条形的一些独立属性。有没有我错过的更好的方法?如果是的话,我很想听听。
照目前的情况来看,这是一个非常灵活的解决方案。通过改变段之间的间隙的厚度(如上所述使用线宽,或间隙的颜色(使用边缘颜色,可以很容易地调整分段,当然,通过调整条的宽度和/或增加间隙计算,条/段的宽度和它们之间的间隙可以以通常的方式改变。甚至可以通过使用不同形状的贴片(圆形、椭圆形等)来改变单个片段的形状。).
如何用量化加速和压缩神经网络
从浮点数到整数
神经网络是非常耗费资源的算法。它们不仅会导致巨大的计算成本,还会消耗大量的内存。
即使商用的计算资源与日俱增,优化深度神经网络的训练和推理也是极其重要的。
如果我们在云中运行我们的模型,我们希望最小化基础设施成本和碳足迹。当我们在边缘上运行我们的模型时,网络优化变得更加重要。如果我们必须在智能手机或嵌入式设备上运行我们的模型,硬件限制就会立即显现出来。
由于越来越多的模型从服务器转移到边缘,减少大小和计算复杂性是必不可少的。一个特别而迷人的技术是量化,它在网络内部用整数代替浮点数。在这篇文章中,我们将会看到它们的工作原理,以及你如何在实践中做到这一点。
量化
量化背后的基本思想是,如果我们将权重和输入转换为整数类型,我们会消耗更少的内存,并且在某些硬件上,计算会更快。
然而,有一个权衡:有了量化,我们可能会失去相当大的准确性。我们稍后将深入探讨这个问题,但首先让我们看看为什么量子化有效。
整数与浮点运算
你可能知道,你不能简单地在内存中存储数字,只能存储 1 和 0。因此,为了正确地保存数字并使用它们进行计算,我们必须对它们进行编码。
有两种基本表示:整数和浮点数。
整数用以 2 为基数的数制来表示它们的形式。根据使用的位数,一个整数可以有几种不同的大小。最重要的是
- int8 或 short (范围从-128 到 127),
- uint8 (范围从 0 到 255),
- int16 或 long (范围从-32768 到 32767),
- uint16 (范围从 0 到 65535)。
如果我们想表示实数,我们必须放弃完美的精度。举个例子,数字 1/3 可以用十进制形式写成0.33333……,有无限多的数字*、是不能*在内存中表示的。为了处理这种情况,引入了浮点数字。
本质上,浮点数是形式中数字的科学表示法
其中基数最常见的是 2,但也可以是 10。(就我们的目的而言,这无关紧要,但我们假设它是 2。)
来源:维基百科
与整数类似,浮点也有不同的类型。最常用的有
- 半或浮点 16 (1 位符号,5 位指数,10 位有效位,所以共 16 位),
- 单个或浮点 32 (1 位符号,8 位指数,23 位有效位,所以总共 32 位),
- double 或 float64 (1 位符号,11 位指数,52 位有效位,所以总共 64 位)。
如果您尝试以科学的格式将两个数字相加相乘,您会发现浮点运算比整数运算稍微复杂一些。实际上,每次计算的速度很大程度上取决于实际的硬件。例如,台式机中的现代 CPU 进行浮点运算的速度和整数运算一样快。另一方面,GPU 更适合单精度浮点计算。(因为这是计算机图形最普遍的类型。)
在不完全精确的情况下,可以说使用 int8 通常比 float32 更快。然而,默认情况下, float32 用于神经网络的训练和推理。(如果您以前训练过网络,并且没有指定参数和输入的类型,则最有可能是 float32 。)
那么,如何将一个网络从 float32 转换成 int8 ?
量化网络
这个想法原则上很简单。(实际上没有那么多,我们后面会看到。)假设你有一个输出在 [-a,a) 范围内的层,其中 a 是任意实数。
首先,我们将输出缩放到 [-128,128) ,然后我们简单地向下舍入。也就是说,我们使用变换
举个具体的例子,我们来考虑下面的计算。
这里的值的范围在 (-1,1) 中,所以如果我们量化矩阵和输入,我们得到
这是我们看到结果不是一个 int8 的地方。由于两个 8 位整数相乘是一个 16 位整数,我们可以通过转换对结果进行反量化
为了获得结果
如你所见,这不是我们最初拥有的。这是意料之中的,因为量子化是一种近似,我们在这个过程中会丢失信息。然而,这有时是可以接受的。稍后,我们将看到模型性能是如何受到影响的。
使用不同类型的量化
我们已经看到,量子化基本上是在操作层面上发生的。从浮动 32 到 int8 并不是唯一的选择,还有其他选择,比如从浮动 32 到浮动 16 。这些也可以合并。例如,您可以将矩阵乘法量化为 int8 ,而将激活量化为 float16 。
量子化是一种近似。一般来说,近似值越接近,预期的性能衰减就越小。如果你把所有的东西都量化为浮点,你把内存减半,可能你不会损失精度,但不会真正获得加速。另一方面,用 int8 量化可以导致更快的推断,但性能可能会更差。在极端情况下,它甚至不起作用,可能需要量子化意识训练。
实践中的量化
在实践中有两种主要的方法来进行量子化。
- **后训练:**使用 float32 权重和输入训练模型,然后量化权重。它的主要优点是应用简单。不利的一面是,它可能会导致精度损失。
- **量化感知训练:**训练时量化权重。这里,甚至为量化的权重计算梯度。当应用 int8 量化时,这有最好的结果,但它比另一个选项更复杂。
TensorFlow Lite 中的量化方法及其性能。来源: TensorFlow Lite 文档
TensorFlow Lite 中几种卷积网络架构的量化方法比较。来源: TensorFlow Lite 文档
实际上,性能很大程度上取决于硬件。量化为 int8 的网络在专门用于整数计算的处理器上会表现得更好。
量子化的危险
虽然这些技术看起来很有前途,但在应用时必须非常小心。神经网络是极其复杂的函数,尽管它们是连续的,但它们可以非常迅速地变化。为了说明这一点,让我们重温郝力等人的传奇论文 可视化神经网络的损失景观 。
下面是没有跳跃连接的 ResNet56 模型的损失情况的可视化。自变量代表模型的权重,而因变量是损失。
ResNet56 的损失情况可视化,无跳跃连接。来源: 可视化神经网络的损失景观 郝力等人。
上图完美地说明了这一点。即使只是稍微改变一下重量,损失的差异也是巨大的。
在量化时,这正是我们正在做的:通过牺牲压缩表示的精度来逼近参数。不能保证它不会在结果中完全搞乱模型。
因此,如果你正在为安全至关重要且错误预测损失巨大的任务构建深度网络,你必须极其小心。
现代深度学习框架中的量化
如果您想尝试这些技术,您不必从头开始实现。最成熟的工具之一是 TensorFlow Lite 的模型优化工具包。它包含了尽可能缩小模型的方法。
您可以在下面找到文档和介绍性文章。
边缘设备通常具有有限的内存或计算能力。可以对模型进行各种优化,以便…
www.tensorflow.org](https://www.tensorflow.org/lite/performance/model_optimization) [## TensorFlow 模型优化工具包简介
我们很高兴在 TensorFlow 中推出一个新的优化工具包:一套技术,开发者,无论是…
medium.com](https://medium.com/tensorflow/introducing-the-model-optimization-toolkit-for-tensorflow-254aca1ba0a3)
PyTorch 还支持多种量化工作流程。虽然它目前被标记为实验性的,但它是完全可用的。(但是预计 API 会改变,直到它处于实验状态。)
Raghuraman Krishnamoorthi、James Reed、Min Ni、Chris Gottbrath 和 Seth Weidman 重要的是要让效率…
pytorch.org](https://pytorch.org/blog/introduction-to-quantization-on-pytorch/) [## (实验)在 LSTM 单词语言模型上的动态量化
编辑描述
pytorch.org](https://pytorch.org/tutorials/advanced/dynamic_quantization_tutorial.html) [## 关于 BERT - PyTorch 教程 1.5.1 文档的(实验性)动态量化
提示为了充分利用本教程,我们建议使用 Colab 版本。这将允许您试验…
pytorch.org](https://pytorch.org/tutorials/intermediate/dynamic_quantization_bert_tutorial.html)
其他优化技术
除了量化,还有其他技术来压缩你的模型和加速推理。
修剪
一个特别有趣的是权重修剪,在训练过程中,网络的连接被反复删除。(或者某些变奏中的后期训练。)令人惊讶的是,在某些情况下,您甚至可以移除 99%的权重,但仍然具有足够的性能。
如果你感兴趣,我写了一份关于该领域里程碑的详细总结,并讨论了最新的发展水平。
权重剪枝简介
towardsdatascience.com](/can-you-remove-99-of-a-neural-network-without-losing-accuracy-915b1fab873b)
知识的升华
第二个主要的网络优化技术是知识提炼。本质上,在模型被训练之后,一个小得多的学生模型被训练来预测原始模型。
知识提炼的师生模型。资料来源:郭建平等人的调查。
Geoffrey Hinton、Oriol Vinyals 和 Jeff Dean 在他们的论文中介绍了这种方法,在神经网络中提取知识。
[## 提取神经网络中的知识
提高几乎任何机器学习算法的性能的一个非常简单的方法是训练许多不同的模型…
arxiv.org](https://arxiv.org/abs/1503.02531)
提取已经被成功地应用于压缩 BERT,这是一个巨大的语言表示模型,在所有领域都有应用。通过蒸馏,该模型实际上可以在边缘使用,如智能手机设备。
这些努力的领导者之一是令人敬畏的拥抱脸,他们是 DistilBERT 论文的作者。
[## 蒸馏伯特,伯特的蒸馏版本:更小,更快,更便宜,更轻
随着大规模预训练模型的迁移学习在自然语言处理(NLP)中变得越来越普遍…
arxiv.org](https://arxiv.org/abs/1910.01108)
如果你对一个实际的例子感兴趣,你可以看看这篇关于上面提到的 BERT 蒸馏的文章,使用来自 PyTorch 生态系统的库 Catalyst。
如何用催化剂蒸馏 BERT?
medium.com](https://medium.com/pytorch/bert-distillation-with-catalyst-c6f30c985854)
摘要
随着神经网络从服务器转移到边缘,优化速度和大小极其重要。量化是一种可以实现这一点的技术。它将 float32 参数和输入替换为其他类型,如 float16 或 int8 。使用专门的硬件,与未量化的模型相比,可以更快地进行推理。
然而,由于它的量化是一种近似,必须小心。在某些情况下,它会导致显著的精度损失。
与其他模型优化方法(如权重修剪和知识提取)一起,这可能是最快的使用方法。有了这个工具,你可以在不重新训练你的模型的情况下获得结果。在训练后优化是唯一选择的情况下,量化会大有帮助。
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
如何通过将自己置于合适的环境中来加速您的数据科学职业生涯
我感到增长数据科学技能停滞不前,直到我有了一个飞跃
像你一样,我觉得自己被困在了数据科学研究中
如果你像大多数人一样想进入数据科学领域,但仍然有其他职业,如学校、工作,你可能会发现很难坐下来专注于你的数据科学研究。
作为一名应用数学专业的全日制学生,我发现在忙于学业的同时提高自己的数据科学技能极其困难。即使我试图通过不花时间看电影、停止使用社交媒体、学习时关掉手机、早上 5 点起床来挤出更多时间学习数据科学,我仍然发现自己在成长中停滞不前。当看到数据科学实习的工作要求时,我感到更加绝望。
我极度渴望合适的环境
我意识到我的成长停滞不前,不是因为我缺乏意志力或能力,而是因为不在适合我想要获得的技能的环境中。我的大学里很少有人了解数据科学,更不用说拥有与之相关的技能了。我所有的课都与数学有关。我渴望有一个环境,在那里我可以被数据科学资源、该领域的专家、在数据科学方面有技能和热情的朋友所包围。
当看到一张关于在 CIMAT 的数据科学学期的海报时,我知道我找到了可以在数据科学领域成长的环境。我想象着这个新的环境是如何让我的幻想变成现实的。
事情的发生出乎我的意料。新的环境把我培养成了一名更好的 Python 程序员和拥有 700 多名追随者的数据科学作家。我还对机器学习算法和自然语言处理有深入的了解,并获得了多个实习和合作机会。
从这次经历中,我意识到环境有多重要,以及什么是我的数据科学成长的理想环境。我分享这些认识,希望你能够确定理想的环境,并自己创造或寻找一个。
其重点是利用数据科学工具产生影响的环境
构成技能发展良好环境的一个因素是他们是否专注于该技能。我被 CIMAT 吸引是因为它专注于与数据科学相关的三个领域的应用:数学、统计学和计算机科学。CIMAT 非常重视解决数学解决方案能够为科技发展做出巨大贡献的问题。
因为这种强调,我的讲座总是强调如何将我学到的知识应用到现实世界中。当我知道我的知识有多大影响力时,我感到兴奋和有动力。因此,这些知识被保留了下来,我能够创造性地运用我的知识
一个你被迫延伸和运用你的知识的环境
在有一个留学学期之前,我通过在线课程学习了与机器学习和数据科学相关的知识。即使我理解了这些知识,我也从来没有试图通过实施来检验我的知识。因此,新知识没有转化为实用知识。
但在 CIMAT,学生需要通过找到解决作业中相关问题的方法来应用理论课,并用 Python 实现。因为这个作业会计入我的分数,我需要认真对待它。从理解机器学习算法到从零开始实现它是很困难的。但后来,我对算法有了很好的理解,并能够从零开始实现带有二元交叉熵损失的梯度下降,或比较贝叶斯分类器和 K-最近邻。
通过扩展我的知识,并以实现的形式强迫自己理解这些方法,我为这些方法打下了坚实的基础。我有信心,如果我在未来看到类似的方法或相关但更先进的方法,我将能够快速学习,并将适当的方法应用于新的问题。
一个规模小到足以获得个人即时反馈的环境
考虑理想环境的另一个因素是大小。许多人的目标是大公司或大大学。但是一旦他们到达那里,他们没有足够的关注来自他们社区的人来表达他们的想法或问题。
因为我所有的班级都很小(2 到 5 个学生),我有机会在课堂上问很多问题,而不用担心会打扰其他学生。我和我的助教建立了亲密的友谊,他们是微软和脸书的软件工程师实习生。有幸成为他们小班规模的学生之一,我发现很容易在他们的办公时间或午餐时间经常遇到他们,向他们提问或与他们讨论机器学习相关的话题。
另一个优势是在午餐时间与研究人员进行随机对话,并让来自世界各地的机器学习、计算机视觉、统计学和自然语言处理领域的领导者参与进来。作为为数不多的新生之一,他们欢迎我,并与我分享他们在研究中的发现和他们正在进行的工作。通过让自己置身于持续知识流的中心,我不断更新前沿研究领域,并为我的项目获得新的灵感。
对各自领域着迷的专家的聚集地
理想环境的另一个因素是让你周围的人对他们的领域有很好的了解,并对他们正在做的事情着迷。
通过在上学时参与自然语言处理研究,我有一个黄金机会与一位研究伙伴合作,他是 NLP 方面的专家,并在几次世界范围的 NLP 比赛和 Google Hash Code 2020 中获得了一等奖。作为研究伙伴,每当我陷入 NLP 项目时,我可以向他提问,并学到许多新的经验和技巧来开发更好的 NLP 模型。由于及时的反馈,我能够成倍地增长我的 NLP 知识。
我与一位同事建立了友谊,他不仅擅长数学,还擅长机器学习和编程。我们会交流我们在课堂上或从在线资源中学到的与数据科学相关的知识。通过与专家建立联系,我有朋友来讨论新的疯狂的数据科学想法,并合作将其转化为有影响力的产品。
结论
现在回过头来看我得到的机会,我很感激以前的自己意识到适合我的技能的环境,并有勇气去追求它。如果我没有跳到一个未知的地方,尤其是当每个人都警告我在墨西哥可能遇到的危险时,我不会在数据科学方面取得像现在这样的成功和知识。
通过我的故事,我希望你意识到一件事:如果你在数据科学领域的成长中感到停滞不前, it 可能不是因为你的能力,而是你所处的环境。因此,如果你发现自己陷入困境,也许你应该考虑把自己放在一个理想的环境中来发展你的新技能,即使这需要你有勇气推迟你正在做的事情,走出你的舒适区。
你不能在一个没有滋养你的环境中茁壮成长。
就像任何其他技能一样,获得不可用的数据科学技能的关键是与专家一起向他们学习,接触正确的资源,并应用您所学的知识。把自己放在正确的环境中,你会惊讶于自己成为该领域专家的不可阻挡的势头。
最后但并非最不重要,我还要感谢 CIMAT,感谢他在数据科学方面给了我一个丰富的学期。你可以在这里了解更多关于这个学期以及如何成为其中的一部分。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上和我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
支持向量机简介及其在非线性数据集上的应用
towardsdatascience.com](/how-to-learn-non-linear-separable-dataset-with-support-vector-machines-a7da21c6d987) [## 如何用 KDTree 搜索数据
给你一个任务,在一个巨大的数据集中查找某个范围内的数据,你能快速有效地找到它吗?
towardsdatascience.com](/how-to-search-data-with-kdtree-aad5c82ebd99) [## 自然语言处理中的卷积神经网络
什么是卷积神经网络,如何利用它进行情感分析?
towardsdatascience.com](/convolutional-neural-network-in-natural-language-processing-96d67f91275c) [## 如何用图论可视化社交网络
找出《权力的游戏》中的影响者
towardsdatascience.com](/how-to-visualize-social-network-with-graph-theory-4b2dc0c8a99f) [## 凸包:包装数据的创新方法
如何利用包装算法实现数据可视化
towardsdatascience.com](/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc) [## 用于机器学习的线性代数:求解线性方程组
代数是机器学习算法的底线机制
towardsdatascience.com](/linear-algebra-for-machine-learning-solve-a-system-of-linear-equations-3ec7e882e10f)
如何在 Python 上访问股票市场数据进行机器学习
如果你想使用机器学习来交易股票,你需要创建一个股票市场数据的数据集。了解如何使用现成的代码轻松完成这项工作。
在 Unsplash 上由 Austin Distel 拍摄的照片
机器学习和人工智能开发的一个常见瓶颈是获得足够大的数据集,以便你可以用它来训练你的算法。特别是,如果你正在使用深度学习,你会知道获得足够的数据来正确训练神经网络有多难。[谷歌数据集搜索](http://google dataset search)不久前出现,大大改善了这个问题,但仍然很难找到一些主题的数据,如股票交易。
我以前遇到过这个问题,所以我知道这有多难。然而,就在昨天,我发现了这篇关于构建交易机器人的伟大文章,它很好地指向了最近一家名为羊驼的初创公司,该公司提供了一个构建交易算法的 API。有了这个 API,我们可以免费使用他们的 Python SDK 访问股票的实时和历史数据。在本文中,我将向您展示如何实现一个函数来下载股票数据并将其存储在 Pandas Dataframe 中,以便它可以用于机器学习。
注意:尽管我在下面的代码中使用了这个 API,但是您可以选择您喜欢的任何其他 API,并根据需要随意修改代码。
安装必要的库并连接到服务器
首先:在这里创建一个新账户。然后转到纸质账户(模拟器),点击 API 键上的“查看”。最后,点击“生成密钥”,你将得到你的密钥 id 和你的秘密密钥。有了这些密钥,您将从 Python 连接到服务器,并能够下载我们想要的数据(您可以做更多的事情,但在本文中,我们将只下载数据)。
现在,在您的终端上执行“pip install alpaca_trade_api ”,您就可以使用以下代码连接到 api 了:
你可以在 Github 上看到官方文档和代码。
下载资产的数据
我们将用于下载资产数据的基本调用如下:
如您所见,我们使用上面实例化的管理器来调用方法 get_barset ,该方法返回一组条(或者您甚至可以将它们想象为烛台),并具有以下参数集:
- Symbols:这是一个字符串列表,其中包含我们要下载数据的符号。
- 时间范围:表示数据时间性的字符串,可以是 1 分钟、5 分钟、15 分钟或 1D。
- Limit:一个介于 1 和 1000 之间的数字,表示我们将下载的最大条数(最大值为 1000)。
- 日期(开始-结束,之后,直到):iso 格式的日期。
这样,您已经可以从股票中下载数据,但是如果您想要获得大量数据(您可能会这样做),您将必须实现一些代码来处理分步分解时间并为每个步骤进行调用,否则,您将很快达到 1000 的限制(想象一下,如果您使用 1 分钟的临时时间,您将被限制为每次调用 1000 分钟或大约 16 个小时)。
长期下载数据
我自己实现了处理这个问题的代码,我把它放在这里,因为我很好:))
打破日期中的句点并对其进行格式化
首先,我们需要将周期分解成更小的步骤,这样我们就可以确保不会达到 API 返回的 bar 的限制。为此,我创建了 break_period_in_dates_list 方法,它采用 datetime 对象形式的 start_date 和 end_date,以及带有每步天数的 int。每个步骤的天数不能太大,这一点很重要,因为否则您将达到限制,然后您将无法获得您想要的所有数据。该方法返回一个日期元组列表,其中有开始日期和结束日期。
下一步是按照 API 期望的那样格式化日期。在 format_dates 方法中,我们正是这样做的,并以预期的格式返回列表。
创建数据框架
现在,一旦我们得到了条集,我们需要用它创建一个熊猫数据框架。具体来说,每个 barset 都是一个对象,其属性在这里定义为。在下面的方法中,我们转换字典列表中的条集列表,然后用它创建一个 Pandas 数据帧。
实际下载数据
最后,我们准备下载我们的数据。为此,我创建了 download_data 方法,该方法将 REST 管理器、我们需要的数据的符号列表、开始和结束日期以及最后将数据存储为 csv 文件的文件名作为参数。请注意,我选择将时间段分为 10 天,这对于示例中使用的 5 分钟临时时间来说很好,但是如果您更改临时时间,应该更改该参数。
完全码
作为总结,在这里你可以看到完整的代码:
我希望你发现这篇文章很有用,现在可以为你的机器学习项目获得所有的市场数据。感谢您的阅读!😃
如何在 BigQuery 中准确计算年龄
在 Unsplash 上由 Helloquence 拍摄的照片
在分析客户数据中,年龄是基本且重要的人口统计数据字段之一。通常,年龄不是从客户那里收集的数据点,而是他们的出生日期。然后据此计算年龄——要么是客户某一时刻的年龄,要么是他们今天的年龄。
不幸的是,在 Bigquery 上没有计算年龄的标准方法,这导致了派生一个基本概念的不同方法。对于开发者和分析师之间的每一个独特的计算,结果之间会有差异。
下面我介绍不同的年龄计算,以及如何使用 SQL 在 BigQuery 中精确计算。在这些例子中,我将使用相同的出生日期(我的)。
基本年龄计算
计算年龄的最基本方法是使用 DATE_DIFF 函数来获得两个日期之间的年数。但是,这个函数只是减去了年份,而不管出生日期是否已经过去,这是完全不准确的。
WITH data AS (SELECT CAST('1993-04-29' AS DATE) AS date_of_birth)SELECT
DATE_DIFF('2020-03-21',date_of_birth, YEAR) AS age
FROM data
结果:27
我们可以使用相同的函数来计算日期和出生日期之间的天数差,然后除以 365,而不是使用年数差。FLOOR 用于删除小数位。这在快速分析和准确度不太重要的情况下非常有用。
SELECT
FLOOR(DATE_DIFF('2020-03-21',date_of_birth, DAY)/365) AS age
FROM data
结果:26
此计算假设所有年份都有 365 天。由于这没有考虑闰年,年龄将在实际出生日期前几天取整。年龄向上取整的天数就是已经过去的闰年数。
FLOOR(DATE_DIFF('2020-04-27',date_of_birth, DAY)/365) AS age
结果:27
针对闰年进行调整
将除数中的 365 替换为 365.25 会得到更准确的结果。
FLOOR(DATE_DIFF('2020-04-27',date_of_birth, DAY)/365.25) AS age
结果:26
然而,在闰年有影响的特定年龄,结果变得不太准确。
FLOOR(DATE_DIFF('2011-04-29',date_of_birth, DAY)/365.25) AS age
结果:17
在这里,年龄实际上被向下舍入了。在这种情况下,结果应该是 18。虽然误差影响极小,并且这被证明是更好的选择,但在某些情况下,精度非常重要。
准确无误
在市场营销中,不正确地计算年龄可能会有法律影响,或者只是非常糟糕的客户体验。在这个看似复杂(其实不是)的计算中,它使用了几个函数。查询的第一部分减去两个日期之间的年份。如果通过比较月份和日期,出生日期已经过了另一个日期,则第二部分将减去 1 年。
DATE_DIFF('2020-03-21',date_of_birth, YEAR)
-
IF(EXTRACT(MONTH FROM date_of_birth)*100 + EXTRACT(DAY FROM date_of_birth) > EXTRACT(MONTH FROM '2020-03-21')*100 + EXTRACT(DAY FROM '2020-03-21'),1,0) AS age
结果:26
使用这种计算方法的缺点是,每次需要计算年龄时都要重复计算,时间很长,而且相当麻烦(除非您将查询保存在某个地方)。
执着的 UDF
BigQuery 现在允许持久的用户定义函数。这使得重用相同的代码并在整个项目中保持一致变得更加容易。作为一个已经编码了几年的人,每次需要获得年龄时,我都必须使用不同的函数并编写一个很长的查询来获得一个准确的年龄,这是一种挣扎。相反,我创建了一个 UDF,这样我就可以在每次分析时引用相同的代码。
CREATE OR REPLACE FUNCTION workspace.age_calculation(as_of_date DATE, date_of_birth DATE) AS (
DATE_DIFF(as_of_date,date_of_birth, YEAR) -
IF(EXTRACT(MONTH FROM date_of_birth)*100 + EXTRACT(DAY FROM date_of_birth) > EXTRACT(MONTH FROM as_of_date)*100 + EXTRACT(DAY FROM as_of_date),1,0))
在这个 UDF 中,有两个输入-出生日期和您想要计算年龄的截止日期。这为用户提供了重用代码和不同用例的灵活性。
SELECT workspace.age_calculation('2020-03-21','1993-04-29')
结果:26
有趣的是,年龄是一个如此重要的属性,却没有标准的计算方法,无论是在分析还是锁定客户方面。然而,使用 BigQuery 函数的组合给出了更好的选择。我希望这有助于分析师在他们的数据中使用标准和准确的方法计算年龄。
如何在 FAANG 公司的数据可视化面试中胜出?
蒂姆·高在 Unsplash 上拍摄的照片
说到技术面试,我们都会想到 SQL,编码,或者统计面试。然而,有一个领域也很重要,那就是数据可视化。这篇文章是关于如何在数据可视化面试中胜出的。
几个月前,我被一家 FAANG 公司选中,进入了商业分析师的最后一轮。共有四次访谈,包括两次行为访谈、一次数据可视化访谈和一次数据分析访谈。虽然我最终没有得到这份工作,但我的招聘人员说,他们对我的数据可视化面试的反馈非常积极。因此,我想我至少在那次面试中获得了“及格”。我想在这篇文章中与你分享我是如何在数据可视化面试中胜出的。
数据可视化面试持续了 45 分钟。该团队希望评估候选人设计有效可视化的能力,并了解他们设计各种类型可视化的经验。以下是我收到的问题以及我解决这些问题的方法。
你的数据可视化理念是什么?
我打赌你们都会同意我的观点,这是一个非常宽泛的问题。每个人都能想出不同的答案。我的数据可视化理念是,我的可视化需要尽可能地适应目标受众的需求。没人看的时候仪表板就没用了。
我确保我清楚地定义了目标受众。我与他们密切合作,了解他们对可视化指标和类型的需求。我密切跟踪他们,及时了解他们需求的变化。
告诉我一个你非常引以为豪的数据可视化项目?
这个问题是面试前最期待的问题,所以我已经准备了两到三个故事,练习的非常认真。对于每个故事,明星法(情境——任务——行动——结果)总是管用的。我谈到了一个非常具体的情况,当时我不得不建立一个仪表板。我描述了仪表板的目的、主要利益相关者(也称为目标受众)、我如何与利益相关者一起制定指标,以及我制作了哪些类型的可视化效果。
我还分享了最初的计划没有按预期进行的时候,当利益相关者的需求发生变化时,以及我如何跟进利益相关者以确保仪表板按他们预期的方式工作。我通过分享我在那次经历后获得的关键学习点来总结我的故事。
你使用什么数据可视化工具?
在我过去的角色中,我使用 Tableau 作为数据可视化的主要工具,所以 Tableau 对我来说是一个显而易见的答案。我描述了我使用的高级 Tableau 函数或特性。主要是讲一个你擅长的数据可视化工具,而不是罗列一大堆你学习或者了解的工具。
然而,Tableau(或其他类似的数据可视化软件)并不是可视化数据的唯一方式。使用 Google Sheets 绘制图表也可以!这取决于目标受众和可视化数据的目的。例如,当我需要一种快速的方法来可视化数据集时,当我的数据集需要在一组用户之间共享时,或者当我的利益相关者是非技术数据用户时,我使用简单的 Google Sheets 图表。
数据可视化案例研究
问题是:“假设我们公司在美国有几个办事处。我们想知道这些办公室的表现,以便为我们的员工优化空间。你的工作是构建一个仪表板来显示办公室的利用率。
我收到了数据集的预览。我不得不使用谷歌绘图建立一个虚拟的仪表板。在 Google Sheets 中绘制图表时,您可以使用类似的方法在 Google Drawings 中绘制图表。
在开始可视化步骤之前,我问面试官这个仪表板是给谁用的。仪表板是为管理层经理准备的。对我来说,这意味着我需要显示最高级别的指标,以便经理们通过查看这个快照就知道发生了什么。然后,我用头脑风暴的方法展示了这些指标。我想出了三到四个衡量标准。
我不仅制作了图表和图形。对于每个度量标准,我解释了使用这种类型的可视化而不是其他类型的背后的基本原理。大声说出这个过程不仅有助于展示思考过程,还让我意识到,与我首先想到的图表相比,其他类型的图表更好地表达了我的指标。此外,图表和图形不仅仅是饼图、条形图或折线图。您可以使用排版,这意味着在这种情况下显示纯关键数字。仪表板用户可以立即获得重要的数字,而不必从图表或图形中查找。
没有过滤器,仪表板是不够的。我花时间思考合适的过滤器,画出它们,并向面试官解释。一些重要的过滤器包括日期范围、位置/市场和时间频率(用户可以选择每天、每周或每月查看)。
毕竟,我总结了我的仪表板的要点,包括目标受众、重要指标、可视化类型和过滤器。我还提到了一种潜在的方法,如果数据集中有更多的变量或涉及更多的利益相关者,可以在将来进一步开发仪表板。
结论
我的面试经历是独一无二的,绝不可能对每个人都一样。它作为一个单一的数据点,不应该推广到所有的数据可视化访谈。我希望你能从我的经历中获得一些见解和观点,以帮助你调整面试准备,并赢得数据可视化面试。
原载于 2020 年 10 月 11 日【http://baovinhnguyen.com】。
如何在机器学习工作面试中获得家庭作业
在这篇文章中,我的目的是提供一个清晰的画面,当求职者被要求在面试过程中做一个基于机器学习(ML)的家庭编码任务时,对他有什么期望。
作为一名高级 ML 工程师,我不得不审查几十个这样的任务,所以我相信我很清楚申请人通常会犯什么类型的错误。我愿意帮助你在申请下一份工作时避免这些错误。
本质上,你需要努力实现以下 4 个目标:
- 创建一个对任务有效且合理的 ML 模型
- 清楚地展示和分析你的结果
- 展示你的智慧和对细节的关注
- 编写干净、易于理解、可重复、几乎没有错误的代码
不管出于什么原因,很多初级申请人似乎只专注于第一个目标。让我们更详细地研究一下每一个问题,看看它们涉及到什么。
作者图片
1.创建一个对任务有效且合理的 ML 模型
总的来说,这部分真的是任务相关的,所以你需要了解你的东西。
一些一般性见解:
- 确保你理解了任务。如果你不确定你需要做什么,通常可以要求澄清。
- 根据需要进行一些数据清理和特征工程。不要只是把你的数据扔进一个模型,然后希望它能给你一个好的结果。
- 始终遵循最佳的机器学习实践。在最基本的方法中,确保将您的数据适当地分成训练/验证/测试集。除了对模型的性能进行最终评估之外,不要将您的测试集用于任何事情,并确保没有数据从它泄漏到训练集中。不要过度拟合你的模型,使用验证集来知道何时停止训练。
- 当不确定使用哪种 ML 技术时,总是选择一种你相当熟悉的方法,以避免令人尴尬的错误。不要试图用最新的技术或框架给面试官留下深刻印象,除非你确信你理解它。一个实现良好的线性回归模型(假设它完全适合这项任务)比一个完全处理不当的超级卷积递归神经网络或其他什么要好。
- 你通常不会有很多时间做这些作业,所以倾向于选择简单的解决方案,除非你确信你有足够的时间来实现更复杂的方案。在任何情况下,您都可以从一个非常基本的模型开始,然后将其用作进一步改进的基线。有时你会发现简单的方法也一样好,而且计算效率更高。或者,如果你不能完成你的复杂模型,至少你会有东西可以展示。
- 如果这个任务有实际意义,考虑你的模型将如何被使用,以及它的计算和数据可用性需求是否有意义。这样做将表明你意识到现实生活中的限制,并有能力处理它们。
- 除非作业规则禁止,否则试着在网上搜索一下,看看其他人是如何解决类似问题的。然而,不要不加分析就复制粘贴他们的代码,这并不是因为面试官想看你自己的编码技能(毕竟,很多样板代码经常被重用),而是,更重要的是,因为 ML 代码往往真的依赖于任务和数据的细节,对一个问题有效的代码可能需要对另一个问题进行一些调整。
2.清楚地展示和分析你的结果
信不信由你,但是我遇到过很多这样的例子,求职者会把他们的代码发给我,而没有任何解释。他们希望我做什么,自己运行并为他们分析输出?
结果的展示和分析是任何 ML 工程师或数据科学家的核心技能,所以确保你投入足够的时间来展示这些。
特别是:
- 陈述你想要达到的目标。
- 至少对你的数据做一些探索性的分析,并报告任何相关的发现。这也将帮助您创建更好的模型。
- 解释你为什么选择你使用的模型。
- 清楚地陈述你使用了哪些指标,为什么,以及你的模型的性能是基于这些指标的。
- 根据模型的性能评估模型的质量。至少,选择一个简单的基线解决方案(比如,总是预测分类问题中最流行的类,或者在进行时间序列预测时预测最近的值),并确保您的模型可以胜过这种方法。
- 一定要看看你的模型的一些实际预测,验证它们是合理的。有时人们提交不工作的模型并声称性能良好,因为他们的度量计算功能也有错误😄。不要成为那样的人。
- 如果可以,继续创建一些很酷的可视化效果,但是要确保这不会以没有足够的时间来实际构建一个好的模型为代价。
- 准备好详细讨论你的工作。
3.展示你的智慧和对细节的关注
聪明和专注是数据科学家最重要的品质之一。每一个不平凡的问题都需要思考。没有人愿意雇佣一个简单地学习了一堆黑盒模型,然后把数据扔进去,希望能有好的结果的人。
展示这些品质的一些方法是(其中大多数也只是好的机器学习):
- 确保你注意到了任务描述中的每一个细节。如果你最终做了与你被要求做的事情不同的事情,那就不好看了。再次,如果有疑问,问。
- 当执行探索性分析时,真正检查您的数据。如果是图像,就看一堆。如果是文字,读一部分。如果是表格数据,创建图表来查看它的样子以及是否有任何异常。清楚地理解数据的结构将会产生更好的特征工程,并且会使你看起来更聪明。
- 当处理丢失或损坏的数据时,请确保使用您的大脑。不要用不可行的值替换缺失的数据(在我们的作业中,有不少申请人在心率数据中填了零😄).
- 花足够的时间讨论你的结果。更改您的模型或其超参数会如何影响性能?运行它的计算要求是什么?生产中可能出现哪些陷阱?诸如此类。
4.编写干净、易于理解、可重复、几乎没有错误的代码
由于你没有太多的时间,通常不期望你交付产品级代码(除非在作业中指定)。然而,如果可能的话,确保你的代码易于阅读,并且可以在面试官的机器上运行。
- 在您自己的计算机上运行您提交的确切代码,并确保它生成您所声称的结果。人们经常提交一个不工作的代码版本。
- 列出你使用的环境的细节(例如 Python 3.6.8,TensorFlow 2.3.0 等),这样面试官就可以运行你的代码。
- 如果您的任何算法(例如,神经网络或决策树)涉及随机初始化,请确保为可重复性设置一个特定的随机种子。
- 将你的代码放入一个 Jupyter 笔记本 中通常是一个好的选择(除非在作业中另有建议),因为它允许你在代码旁边显示每个单元格的输出。
- 确保你的代码组织良好,每个部分都易于理解。必要的时候写点评论。不要过分使用它,你不必对每一行都进行注释(比如,如果你的行是“x += 1”,不要写注释“#给 x 加 1”,它只是看起来很傻)。
- 除非你想在你的报告中讨论,否则删除你在最终解决方案中根本不会用到的函数或代码块。
我希望上面的讨论能帮助你做好下一个 ML 家庭作业!祝你好运!
如何赢得数据可视化项目:成功的 3 个步骤
这并不总是关于 viz 技能
(注:所有观点均为本人)
最近,我一直在从事不同的数据可视化项目,并能够记下关键的不同成功因素,使某些项目达到或超过客户的期望。
核心可视化技能当然很重要(例如,如果有人要求你提供一个 Tableau 仪表板,精通 Tableau 自然会有所帮助),但是考虑到技术能力的一定门槛,还有其他一些决定项目成败的关键因素,这些因素落后于纯粹的技术技能,我觉得它们的重要性被忽视了,没有被充分提及。
在这篇简短的文章中,我强调了我学会的 3 个步骤,因为我认为它们与交付成功的数据可视化项目非常相关
1)了解数据模型
在可视化您的数据之前,最好对数据的结构、组织、收集、处理和管理有一个清晰的了解,即使您是数据团队的一员,而您只负责最终交付的可视化部分。
这也许是最关键的一步。如果你对后端的数据没有一个清晰的视图,你将如何在前端开发一个整洁的可视化?
来源:Talend.com
我在这里的主要建议是花所有必要的时间与您的数据工程师/云架构师/数据库管理员在一起,以确保您对项目范围内的数据建模概念的掌握尽可能牢固。
像下面这样的问题可以帮助您缩小关键元素的范围,甚至在您开始绘制和可视化数据之前,让您到达您需要的位置:
- 数据是如何组织的?模型中的关键关系是什么?
- 数据是如何处理的?
- 数据延迟水平如何?你收到实时信号了吗?如果没有,更新频率是多少?
- 数据存放在哪里?哪些是关键的数据来源?
- 谁负责数据管道中的各个步骤?在这个过程中,第三方供应商是否有责任?
- 你和客户对你要使用的关键变量的术语一致吗?
在这里不要给错误留有余地,这对于将项目引向正确的方向并避免在时间紧张时出错是至关重要的。
2)全面了解需求
确保你和客户在最终目标和交付物的形式上尽可能保持一致。
这归结为深入了解业务环境和客户面临的问题,并确保在工作中不放过任何一个需求。
在 Unsplash 上由 Austin Distel 拍摄的照片
询问大量问题并进行澄清是非常重要的,这样才能与你的对手保持完全一致,并减少出现以下情况的可能性:
- 交付不包含项目范围的完整 宽度 的可视化(即,省略关键业务指标和关系的表示)
- 交付一个可视化的项目,该项目并未涵盖项目范围的全部 深度 (即,仅解决高层业务关系,而非低层业务关系)
3)预测客户的需求,提供超出预期的服务
如果时间允许,最好总是努力超越客户的期望,不仅要让客户满意,还要让他们高兴。
这有点老生常谈,但在任何数据可视化项目中,你都可以试着让自己的思想处于一种对成品长期不满意的状态,从而让你的创造力在潜在方面流动,并进一步调整,这将有利于应用到你的工具/演示/仪表板的当前状态。
对客户和业务环境的深刻理解肯定可以帮助您发现可能需要进一步改进的领域,即使表面上并不需要。
这方面的例子包括:
- 添加增强的互动层
- 增加产品共享、维护和更新方式的灵活性
- 添加更低级别的功能,并能够向下钻取到尽可能多的相关视图
- 通过向最终产品添加额外的视觉层,帮助客户发现他们最初可能没有考虑到的进一步的相关性和业务关系
概括起来
拥有出色的数据可视化技能以及最常用工具和软件框架的技术知识是非常重要的,但是如果您能够:
- 从源头全面了解您的数据
- 完全符合客户的需求,站在他们的角度考虑他们打算如何利用你的数据洞察力
- 提前思考,提出创造性的改进和想法
您可以大大增加将数据可视化项目提升到下一个级别的机会。感谢阅读!
访问我的免费数据科学资源清单 这里
[## 通过我的推荐链接加入 Medium-Edoardo Romani
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
edo-romani1.medium.com](https://edo-romani1.medium.com/membership)
如何在虚拟办公室里度过新工作的第一周
一种帮助你在任何新的数据或技术工作中获得成功的技巧
迪伦·费雷拉在 Unsplash 上的照片
在这个复杂的世界里,在家“正常”工作已经改变了我们面试和接受新工作的方式。入职具有挑战性。新员工如何获得他们需要的信息,建立关系,并了解一个部门的文化?我将分享一个我发现在个人和虚拟世界都很有效的技巧。
每个公司和部门都有具体的入职清单(或者没有)。这些包括定位、安全访问和一般期望。在实体办公室,你可能会被指派一名团队成员“带你熟悉环境”,带你参观设施,并把你介绍给其他人。这种类型的关系建立在虚拟环境中是不可能的。你必须更加自信地融入团队。这是你要做的。
在新团队成员方便的时候,安排一次 30 分钟的 Zoom 会议,与他们见面。
一对一会议
你有两个目标;建立关系,获取信息。任务期间随便认识一下。在某些情况下,你可能需要第一次会议是一个随意的了解你的咖啡会议,随后是问答会议。要灵活;如果你向仍在试图了解和信任你的人发问,你可能在这两个目标上都不会取得进展。
你必须了解你的新团队的来龙去脉,所以你必须有所准备。让他们知道你在做笔记,这样你就不会忘记他们分享的任何有用的信息。作为一个团队的新成员有额外的好处,比如你可以问任何问题!
他们的角色是什么?
- 他们在团队中负责什么?
- 为什么?你在脑海中构建了一个行动地图,告诉你谁在做什么,你在哪里。
团队中其他人的特长是什么?
- 为什么?个人印象可以提供很多信息,并为您提供一些问题来询问其他团队成员。
他们有什么背景?
- 学位、在公司的任期、在团队的任期、以前的职位、职业、外部兴趣、工艺酿造偏好
- 为什么?大多数人喜欢分享自己。表现出兴趣对建立关系大有帮助。从大学到运动队,共同的兴趣成为未来的轻松话题。
他们在公司因什么而“出名”?
- 他们是 SQL 奇才吗,他们是“认识所有人”的人吗,他们在业余时间为开源 python 项目做贡献吗?
- 为什么?你正在为自己和推荐给他人建立一个新世界中的“关键人物”名单。
他们认为为团队工作最具挑战性的部分是什么?
- 作为一名新的团队成员,他们会如何建议您接触 it?
- 为什么?了解减速带。你可能会在你们的谈话中找到主题,并能计划如何解决它。
他们使用什么工具和数据来源?
- 你如何获得访问权限和软件?
- 为什么?你需要知道你需要什么样的资源才能顺利开展业务。
他们建议你接下来两周做什么?
- 为什么?他们可以在未来几周提供方向和结构。
他们有什么脚本或代码片段可以与你分享吗?
- 为什么?每个公司都有自己的代码风格,最好去了解它。此外,您还可以了解公司如何连接到数据库和工具。拥有这些片段将会为你省下一大堆的悲伤。
你可以利用哪些资源来获取信息?
- 你应该考虑哪些内部网站、会议、实践社区、外部网站和培训资源?
- 为什么?注册正确的内部小组和信息会议对于获得你需要的信息和发展团队外的联系是至关重要的。
在团队之外,他们推荐你见哪些人或团队?
- 这些能介绍你吗?
- 为什么?介绍是认识公司关键人物的绝佳机会。
在那次一对一的会议之后
- 整理你的笔记。
- 发送后续邮件或信息,感谢他们的时间和见解。提及他们推荐的介绍、链接和代码片段。
- 开始研究他们提到的数据、工具和资源。
在所有的会议之后
- 再次,组织你的笔记。
- 你看到的趋势是什么?
- 你认为自己有什么独特的技能可以帮助解决个人或团队的挑战吗?
- 尽快确定你如何为团队提供价值。
结论
在新工作的第一周,最好积极主动,尤其是在虚拟世界里,眼不见为净。走出去,和你所有的队友安排 1:1 的会议。人们喜欢谈论他们自己和他们所做的事情。他们的见解将为你提供成为团队中富有成效的一员所需要的东西。
如何在大联盟比赛中获得快速准确的基线
这篇文章描述了我如何只用几行代码就在性病药物有效性预测挑战赛中获得第五名。
根据美国疾病预防控制中心的报告,2018 年美国报告了超过 240 万例性传播疾病(STDs)。该报告还强调,从 2017 年到 2018 年,因梅毒导致的新生儿死亡人数增长了 22%。基于这些事实,HackerEarth 宣布了性病药物有效性机器学习预测挑战,以提高人们对各种性病和用于治疗它们的药物的认识。
虽然我没有足够的时间专门参加比赛,但这一次看起来真的很有趣,我无法抗拒自己。一些快速分析和一些提交后,我在这里,在公共排行榜上获得第三名,在私人排行榜上获得第五名。我对我在这个问题上所花时间的排名感到非常惊讶,所以我决定写一篇关于我的方法的博客,以便每个人都能从快速准确的基线中受益。那么,让我们开始吧!
免责声明:我不使用熊猫 (不,我不是嬉皮士——伪数据科学家,相信我)
这个库包含我为我参加的所有比赛编写的代码- atif-hassan/Competition-code
github.com](https://github.com/atif-hassan/Competition-code/blob/master/Hackerearth/STD%20Drug%20Effectiveness/code/new_regression_ml.py)
数据分析
什么?你认为会有银弹吗?我刚告诉过你我不是嬉皮士伪数据科学家!在解决问题之前,你总是需要分析你的数据。
资料截图
有效性评级功能是由评审者提供的最终评级,因此,可用于替代评审 _ 患者栏。药品由 UIC 批准的功能没有多大意义,因为同一种药品有多个批准日期。有一种可能性是,批准是基于一个病人一个病人的基础上,但我没有深入挖掘这个想法。在平台提供的训练集和测试集中, patient_id 列不包含任何副本,因此它没有任何用处。经过这种初步的"特征选择"之后,我们剩下的是药品名称(我们称此栏为 药品/药品名称*)使用 _ 病例 _ 药物(我们称此栏为 疾病)**药品 _ 疗效*和
因为药物和疾病特征是分类的,所以让我们看看所有独特的实例,以便知道我们在这里处理的是什么。在 excel 的数据类别中快速应用筛选选项就可以做到这一点。
似乎疾病栏不是很干净
药物一栏中没有什么出乎意料的,尽管疾病一栏确实包含一些噪音。看起来噪音模式是一个数字后跟一个 span 句子,可能是一个刮擦错误。现在让我们检查测试数据集中的药物和疾病列是否都是它们的训练数据集对应物的子集。
代码查找出词汇(OOV)药物和疾病
*OOV Drugs (158 in total):
-------------------------
Acetaminophen / caffeine
Advil Cold and Sinus Liqui-Gels
Afrin 4 Hour Extra Moisturizing
Amethia Lo
Amitriptyline / perphenazine
.
.
.OOV Diseases (34 in total):
---------------------------
22</span> users found this comment helpful.
39</span> users found this comment helpful.
55</span> users found this comment helpful.
Aphthous Ulce
Breast Cancer, Prevention
.
.
.*
从上面的输出可以看出,测试集中有相当多的药物和一些疾病没有出现在训练集中,这是一个问题。但是等等,我们知道药物有时有多个名字。因此,也许,如果我们可以找到测试集中存在的药物的替代名称(存在于训练集中的名称),那么,我们可以替换这些药物名称,并帮助模型理解大量样本。Drugs.com 是一个很好的网站。由于时间不多,我只手动替换了几个药名。如果所有 OOV 药品的名称都被替换为训练集中正确的名称,这肯定会有所帮助。
*Drug "Esomeprazole / naproxen" was present as "Vimovo" in test set
Drug "Senna S" was present as "Docusate / senna" in test set
Drug "Empagliflozin" was present as "Synjardy" in test set
.
.
.*
同样,疾病也可以被替代,但是在这种情况下,oov 的数量很少,所以我决定忽略它们。
模型结构
一旦预处理完成,我就进入了模型构建阶段。我无法使用药物有效性和处方次数数字列快速设计一些好的功能。相反,我应用了 k-means 聚类,并使用所有聚类之间的样本距离作为特征。这种无监督的特征工程方法几乎总是对我有效。我将很快写一篇关于所有这些技巧和窍门的文章,但更多的将在后面。“药品”和“疾病”列是一次性编码的(ohe ),而“疾病”列中的所有干扰样本都被替换为一个字符串,代表一个缺失值。这两组一键编码与两个数字和 k 均值特征连接在一起。这导致了一个大而稀疏的特征空间。
最后,我使用 LightGBM 回归模型进行预测。使用 10 倍交叉验证对模型的超参数进行了一些调整。就是这样!这就是我能够连续 20 天保持在公共排行榜首位的原因,但值得称赞的是,前 4 名参与者一直工作到最后一刻!
带回家的信息
永远记住,即使花费少量的时间和精力来挖掘数据中的模式,也能为您提供真正好的结果。这就是如何用几行代码实现快速准确的基线😉。
我知道这篇文章不包含任何可视化,但那是因为我没有把太多的数据分析融入到我的工作中。我恳求大家给我提供反馈,因为这是我的第一篇博客(所以请小心行事😅).
谢谢大家!
如何真正完成数据科学在线课程:8 个完成技巧
关于不分心到达终点线的实用建议
卢卡斯·本杰明在 Unsplash 上的照片
(注:所有观点均为本人)
介绍
近年来,在线课程或“MOOCS”传统上很难完成( Financial Times,2019 ),但越来越多的人依赖它们来提高技能,特别是在数据科学&分析领域,这是整个电子学习生态系统中最受欢迎的类别之一。
自从我开始通过我的学习之旅学习许多数据科学和分析技能以来,我一直是在线教育的忠实粉丝,并且一直是所有主要数据科学内容平台的积极学习者,重点是 Coursera、Udemy、EdX、Datacamp 和 Pluralsight 等。
来自数据学习冒险的观点
towardsdatascience.com](/what-i-learned-after-4-years-of-online-data-science-courses-c3a6a13bd36f)
在本文中扩展上述内容,我旨在分享我通过完成上述提供商的几门课程所学到的主要内容(没有双关语),希望在开始您在网络空间的下一次数据科学学习冒险之前留下一些有用的参考资料。
1)理想:带着真正的兴趣投入进去
首先:将潜在的课程限制在你真正感兴趣的话题上。你不想浪费时间坐在那里看资料,只是为了意识到你可以更好地享受学习其他东西的时间。
通常“检查”你是否在正确的轨道上的信号是,在中途,你表现出的兴趣和参与程度会让你自己感到惊讶。
当我正在学习某样东西时,我惊讶地说“哇,这真酷”,那么这就说明了是什么让一门课程对我个人来说是令人愉快的。
根据我的经验,我在大学时就开始在线学习数据科学,因为我发现这项活动对我即将毕业的领域非常有益。这帮助我确定了与我的综合兴趣领域最相关的课程,并真正让我以一种积极的方式开始,这有利于完成学业。
数据科学是一个非常广阔的领域,所以很容易迷失。除了学习基础知识(编程、统计等)…)这是所有数据科学学习的基础,选择一个主题和一个合适的领域,并充分享受学习的乐趣,以便能够亲自参与个人项目,这是非常关键的。
2)实践:将完成与实际结果联系起来
另一个帮助你完成整个课程的巨大动力是把课程和课后的即时行动联系起来。
这些可以是:
- 与工作相关的项目,通过这些项目可以立即应用新学到的技能
- 个人项目用自己的时间去发展
- **行业认证:**确保你在考试完成 75%后马上预约考试,或者最好是一次,以确保你坚持到底,不会迷失在日常事务中
- 无论你是针对面试的单一主题,还是正在进行更有条理的再技能培训,这些课程都是很好的准备来源
对于数据科学学习,确切地说,对于任何学习,培养明智的长期观点肯定更难,所以我发现,通过参加个人项目或有用的认证来让自己在短期内保持参与,在确保我设定一个清晰的指南针和切实的目标方面肯定是有效的,以便避免在没有应用的直接好处的情况下学习 ( 高中记忆有人吗?)
3)承诺前做好调查
我最近在媒体上读到一篇有趣的文章,关于比尔·盖茨的阅读习惯,以及他是如何能够一旦投入一本书,就总能设法读完它。这得益于这样一个事实:比尔在开始阅读某本书之前会做扎实的研究,这使他能够分辨出哪本书会真正让他保持兴趣,直到最后。
我认为我们肯定应该对数据科学课程使用相同的方法,如果不是更强的话,因为它们通常代表着大量的时间和金钱投入。
这个过程现在变得比以往任何时候都更容易,因为我们都生活在在线评论世界中,这使我们有机会获得关于潜在数据科学课程质量的全面信息。我个人喜欢阅读课程评论,并在做出决定之前拿出一份候选名单,因为我会根据质量、深度、长度以及与个人兴趣和目标的一致性来堆叠课程。
本质上,在做决定之前,一定要花些时间阅读和比较课程。这是值得花的时间,因为它会让你坚持到底。
4)对你的时间和精力估计要现实一些
兴奋地投入到课程中当然是积极的,但一个强大的组织将是带你到达终点的因素。
这意味着你要诚实地面对自己,每天/每周你实际上能分配多少时间来学习这门课程,同时也要预见到在你学习的过程中可能会遇到的任何隐藏的障碍。
估计时间时,最好考虑以下因素:
- 课程的预计净持续时间(小时)
- 个人学习时间的预计持续时间 e(练习、实验室、认证前、顶点项目等)…)
- 难度等级
尝试得出可测量的总数,然后在给定的时间窗口内进行分割,并与你的每日/每周模式进行匹配,看看你是否能够以合理的速度前进。
时间投入肯定与纯粹的精神努力相关,在这个比赛中,我指的是通过课程经历投入的实际努力。这是一个完全个人的估计,但它需要与你自己进行诚实的对话,以决定是否开始。
对一门课程说“不”可能是一个非常明智的决定(就像说“是”一样),让你处于一种在当前情况下能够最大限度利用学习时间的境地。
5)知道如何学习最好
我一直是一个视觉学习者,在观看引人入胜的视频讲座和尝试互动练习和实验时最投入。其他一些人喜欢阅读充满方程和数学证明的编程书籍,因为它们更符合他们的学习习惯,或许还有教育背景。
无论哪种方式,在最大化你的完成机会时要考虑的一些关键个人因素肯定是:
- 媒体选择(视频对书籍,互动实验室对测验,纸上笔记对数字笔记):你要确保你选择的课程能让你的注意力高度集中在你喜欢的吸收信息的方式上
- 你是夜猫子还是早起的人?在你效率最高的时候预留一些学习时间
- **编程语言的选择:**对于许多数据科学课程来说,课程内容通常依赖于学生假定的计算机编程技巧(除非您的在线课程侧重于学习编程语言本身),通过这些技巧来传达概念。确保你选择的课程利用了你可以很容易理解的编程语言必备知识,至少在基础知识方面,以避免陷入错误和实现障碍,这些会占用你的时间和注意力,使你偏离编程语言的主要概念,因为这两者并不总是重叠的
6)投资自己
花在自我发展上的钱总是物有所值的,投资回报也是令人难以置信的。如今,你可以以很低的费用在线学习大学水平的课程,对内容质量没有任何影响。
即便如此,完成率仍然很低,因此,在一门课程上进行小额但积极的投资,就激励你真正完成你花钱买的东西而言,可以让世界变得完全不同。我们在这里谈论的不是一大笔钱。
在 Coursera 上,课程的平均价格区间在 30-60 美元之间(因国家而异)。在 Udemy 上,就更少了。如果你仍然不确定是否要提前投入资金,不要担心。作为起点,在 YouTube、Coursera 和 FreeCodeCamp 上有很多高质量的课程可以免费观看。考虑到其他 7 个步骤,你仍然可以确保你能完成并保持在合理的预算内。
积极努力支付课程费用既起到了锚的作用,也不断提醒自己必须投入时间来分摊成本,同时从经历中获得一些很好的学习。
在所有其他条件都相同的情况下,比金钱本身更重要的是,为某样东西付费所带来的心理阻力通常会让我坐完整个课程,因为我知道否则我会把浪费的钱留在桌子上。
7)对自己负责
即使拥有最好的意图,有时你也很难独自过滤掉所有让你分心的事物。因此,依靠你的队友和/或朋友可以确保你被其他人检查你的进展,他们间接鼓励并提醒你当前的状态和计划的进展,这样无论何时动力下降,假设你可以做些什么,你都有一只援助之手让你回到正轨。
在实践中,我通常通过以下方式保持自己的责任感:
- 与朋友一起参加课程,并设置定期聊天以分享个人学习时间的更新。除了让你有责任感之外,有一个朋友和你在一起会让整个经历变得有趣,并为作为一个团队一起追求进一步的项目创造条件,利用学到的东西
- **参加专业培训冲刺:**这基本上与上面的相同,但更正式的是作为一个培训计划,通常由你的雇主管理,负责让一类学员按照某个课程和可选的行业认证目标进行培训。我很幸运为一家非常重视数据科学培训&认证以及实际项目工作的公司工作。这导致课程完成率的强劲增长,如果有人可以选择参加这些短跑训练,我肯定会推荐。
总的来说,找一个可以依靠的人绝对是一件有趣的事,而且会大大增加你完成课程的机会。你可能会发现你的一个朋友或同事有着相同的培训目标,所以不要克制自己,让你的学习尽可能地具有协作性。
8)享受过程,学习不是短跑
最后但同样重要的是,我相信持续成功学习的关键是采取正确的心态,并把日常学习变成一种习惯。
采用正确的心态意味着:
- **保持终点线在望,同时花时间享受学习之旅:**不要匆忙地浏览讲座和材料,因为你在长期记忆细胞中保留的知识很少。把内容分解成更小的积木,然后从那里开始,一步一步,并从中获得乐趣。在这些条件下,到达终点将是一个自然的结果。
- 意识到没有“末日”这回事;即使你设法完成了一门课程,你也永远不会真正结束。数据科学知识、框架、编程语言以及最终的课程都在不断发展,要在这个流动的生态系统中茁壮成长,就意味着愿意享受一个持续渐进的学习之旅,这将远远超出指定课程的持续时间。
有了这种心态,你一定可以从容不迫,享受每一节课程和练习。在你意识到这一点之前,你已经完成了大量的课程,并积累了一些技能和知识。
概括起来
通过在线课程学习数据科学是一次非常有趣和有益的旅程。每个人学习的方式都不一样,我希望你能采纳我的建议,并根据你的日常习惯,最重要的是根据你最喜欢的学习方式进行调整。
为了最大化完成的机会,您可能需要记住:
- 选择你真正感兴趣的课程
- 设定完成后要达到的目标
- 在提交前进行全面研究
- 计划好时间和精力,避免任何组织挫折
- 利用自己的时间,开发一种适合自己的学习方法
- 投资优质课程。他们会得到回报,并阻止你懈怠
- 与他人合作,培养责任感,最重要的是大家都玩得开心
- 享受旅程!
感谢阅读!
访问我的免费数据科学资源清单 这里
[## 通过我的推荐链接加入 Medium-Edoardo Romani
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
edo-romani1.medium.com](https://edo-romani1.medium.com/membership)
参考文献:
如何给你的 AWS API 网关 API 添加 API 键?
实践教程
向 AWS API 添加 API 令牌以进行访问管理
如何给你的 AWS API 网关 API 添加 API 键?由格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片。
在本文中,我将解释如何向使用 AWS API Gateway 制作的 API 添加基本安全级别。这将通过添加令牌来完成。
令牌是您需要随 API 请求一起发送的代码,其工作方式或多或少类似于密码。如果您的令牌允许您访问数据,API 将向您发送数据。否则它会给你一个错误。
按照这个例子,您可以使用在上一篇文章中创建的 AWS API Gateway API,它发送回一个随机生成的密码。或者可以直接使用自己的 AWS API。
让我们开始吧:
步骤 1:创建使用计划
转到使用计划选项卡,然后单击创建。这将让你开始建立一个使用计划。
你必须选择你的客户可以提出多少个请求。对于我的基本计划,我想每月允许 100 个请求。我允许每秒 9 个请求。我允许一次最多有 100 个请求。
然后,您需要将 API 及其阶段添加到使用计划中,如下所示:
现在,您有了一个使用计划,它为拥有该使用计划的用户发出的 API 请求指定了使用限制。为了将此使用计划传递给您的用户/客户,您需要一个与使用计划相关联的 API 密钥。让我们现在做那件事。
步骤 2:在 AWS API Gateway 中设置 API 密钥
点击“将 API 密钥添加到使用计划”。这将允许您向刚刚创建的使用计划添加 API 密钥。
为 API 键创建名称和描述(可以是任何内容),并让 API 键自动生成:
然后点击完成。现在,您拥有了与您的使用计划所指定的访问规则相关联的第一个 API 键。
步骤 3:不允许在 AWS API 网关中没有 API 密钥的访问
现在,我们已经允许使用 API 密钥进行访问。但是没有 API 密钥的访问仍然有效!我们必须改变这种状况。
转到您的 API 方法:
点击方法请求,进入以下菜单。一条警告信息已经在等着你了:
现在,您需要将“需要 API 密钥”更改为“真”,以确保 API 只接受带有 API 密钥的请求:
步骤 4:部署您的 API
现在,要完成 API 键的添加,您需要部署 API 以使更改生效。
在这个小示例中,我们只有一个 prod 阶段,因此我们可以直接部署到 prod:
步骤 5:测试新的 API
现在,当在没有指定 API 键的情况下测试 API 时,我们得到了正确的 403“禁止访问”响应。可以从笔记本中执行以下 Python 代码来对此进行测试:
要找到您的 API 密钥,请转到 API 密钥,选择您的 customer1 API 密钥,然后单击显示。复制并粘贴它,以便测试 API:
在 Python 代码中,现在需要在 x-api-key 头中传递 API 键,如下所示:
正如我们所希望的,我们得到了一个生成的密码,但是现在开发者不得不使用 API 密匙!
我希望这篇文章对你有用。不要犹豫,继续关注更多!
如何将傅立叶项添加到回归和季节性分析中(使用 Python 和 SciPy)
使用傅立叶项将季节性包括在回归中
希望到此结束时,你也能够将你的回归提高 410,000 倍!
重温我们的 911 电话记录
在上一篇文章中,我们研究了如何使用傅立叶变换来分析宾夕法尼亚州蒙哥马利县 911 电话呼叫数据的季节性。如果你还没看过,看看下面吧(虽然你也一定能看完这篇文章)。
[## 使用 Python 和 SciPy 通过傅立叶变换分析季节性
通过寻找 911 电话数据中的季节性趋势,学会从噪音中分离信号
towardsdatascience.com](/analyzing-seasonality-with-fourier-transforms-using-python-scipy-bb46945a23d3)
我们在数据中发现了一些有趣的周期性。通话量有 3 个主要的季节性趋势:每天,每天 3 次,每周一次。但是季节性并不能解释一切。历史不会完全重演。例如,潮汐整天都在退潮和流动(这是季节性的),改变了水位,但每年,全球变暖都会增加整体海平面(除非我们采取措施)。如果你仅仅通过观察潮汐来预测未来许多年的水位,你会低估水位,因为你没有考虑海平面是如何随着时间的推移而上升的。
同样,蒙哥马利县的人口从 2010 年到 2019 年增长了约 3.9%,因此可以合理地假设,由于人口的增长,我们的数据中的 911 呼叫量也略有增加(我们将查明情况是否如此)。
为了解决这个问题,我们将对上次分析季节性的方法做一个大的改变。我们将首先运行线性回归,然后对残差(第一次回归的误差)执行傅立叶变换。
我们正在做的是尽最大努力不使用季节性来解释数据,然后我们将使用季节性来解释我们无法解释的东西。所以让我们开始吧。
计算残差
第一步是做回归。我的偏好是使用 Sckit-Learn 的线性回归模型,你可以使用任何你觉得舒服的模型。
# time_sec is the hourly timestamp converted to seconds
X = pd.DataFrame(data['time_sec'])
# signal is how many calls were made in that hour
y = pd.DataFrame(data['signal'])model = LinearRegression()
model.fit(X, y)
data['pred_signal_linreg'] = model.predict(X)
data['residuals'] = data['signal'] - data['pred_signal_linreg']
查看模型系数和截距,我们发现斜率约为 3E 10,截距为 16.40。
>> print('Slope: {:.2e}, Intercept: {:.2f}'.format(model.coef_[0,0], model.intercept_[0]))
**Slope: -2.59e-10, Intercept: 16.40**
因此,通话量从每小时约 16.4 次通话开始,每年通话量下降约 10×60×60×24×365 3E 每小时约 0.009 次通话。
我们最初的假设是,我们会看到 911 电话的增加与人口增长成比例,但这似乎并不正确。此外,很明显,这种回归不是很有帮助。其余真的少得可怜。
>> print('R-squared: {:.2e}'.format(model.score(X,y)))
**R-squared: 1.00e-06**
但是这种云也有一线希望。仅时间上的不良拟合就表明,我们可以通过引入傅立叶项来显著改善情况。
傅立叶变换和傅立叶逆变换
第 1 部分详细介绍了这一过程。简而言之,我们将使用傅立叶变换来找到最主要的频率,然后使用傅立叶逆变换来给出对应于这些频率的函数。
这是傅立叶变换后我们找到的主频。
time = data['time']
residuals = data['residuals']fft_output = fft.fft(residuals)
power = np.abs(fft_output)
freq = fft.fftfreq(len(residuals))peaks = scipy.sig.find_peaks(power[freq >=0], prominence=10**4)[0]
peak_freq = freq[peaks]
peak_power = power[peaks]
plt.plot(peak_freq, peak_power, 'ro')
以下是这些峰值对应的值(与我们在第 1 部分中看到的没有太大不同)。为了便于参考,我将它们标为FT_1 ... FT_12
。
如果您对如何获得这些值感兴趣,FFT
列是运行scipy.fft.fft(residuals)
的输出。您可以通过运行fft.fftfreq(len(residuals))
获得频率。这些频率的单位是1 / timestep
,其中时间步长是残差之间的间隔(在我们的例子中,这是一个小时),振幅是abs(fft)
,相位是cmath.phase(fft)
。
这些行中的每一行都对应于一个正弦曲线。我们可以使用傅里叶逆变换来计算这些正弦曲线,并绘制它们的和与原始残差的关系。它们非常合适。
filtered_residuals = fft.ifft(filtered_fft_output)N = 24 * 5
plt.plot(time[:N], residuals[:N], linewidth=1, label='Original residuals')
plt.plot(time[:N], filtered_residuals[:N].real, linewidth=1, label='Filtered residuals')
plt.legend(loc='upper right')
ax2.set_title('First 5 Days')
plt.grid()
plt.ylim((-25, 25))
plt.xticks(rotation=90)
融入我们的回归
现在让我们将正弦曲线纳入初始回归。这些正弦曲线的问题在于振幅不在范围内。你可以在上面的图表中看到,它显得太低了。这是因为我们对残差进行了傅里叶变换,并将输出过滤为 12 项。所以我们的过滤
我们最初的回归只是使用时间作为唯一的变量,但现在我们可以添加傅立叶项。相位、幅度和频率让我们用这个公式画出 FFT 项对应的波形。
A =振幅,ω=角频率= 2 π频率,φ=相移
我们现在要做的是,如果我们增加几个与 FFT 波形相关的新变量,我们会得出什么样的新回归。
所以我们回到我们的原始数据,以秒为单位的时间和当时的呼叫次数,我们添加了几列,对应于傅立叶变换的每个波。然后我们可以将这些加在一起成为一个新的列,FT_All
。这看起来像:
for key in fourier_terms_dict.keys():
a = fourier_terms_dict[key]['amplitude']
w = 2 * math.pi * (fourier_terms_dict[key]['freq (1 / hour)'] / 3600)
p = fourier_terms_dict[key]['phase']
data[key] = data['time_sec'].apply(lambda t: math.cos(w*t + p))data['FT_All'] = 0
for column in list(fourier_terms.index):
data['FT_All'] = data['FT_All'] + data[column]
这为我们提供了一个新变量FT_All
,它与我们之前绘制的“过滤残差”相同。
之前我们只是对 signal = f(time)进行回归,但现在我们可以对 signal = f(time,FT_All)进行回归
之前我们只是对 signal = f(time)进行回归,但现在我们可以对 signal = f(time,FT_All)进行回归
这些傅立叶项可能看起来令人生畏,但基本上,它们只是我们认为在傅立叶变换中很重要的正弦曲线(即波)。它们很重要,因为它们在频域达到峰值。如果我们绘制FT_1
图,我们会看到这是一个具有一天周期和特定相移的波,这与我们在数据中看到的每日季节性相匹配。
>> plt.plot(data['time'][:24*5], data['FT_1'][:24*5])
现在我们可以使用新变量进行回归。
# time_sec is the hourly timestamp converted to seconds
# list(fourier_terms.index) are the names of our Fourier terms
X = pd.DataFrame(data[['time_sec', 'FT_All']])
# signal is how many calls were made in that hour
y = pd.DataFrame(data['signal'])model = LinearRegression()
model.fit(X, y)
这是前 5 天的回归结果。它看起来很有希望。
最后,如果我们检查模型得分,我们可以看到我们比以前做得好得多。
>> model.score(X,y)
0.4089566840099922
通过增加一个新变量,R 从 0.000001 提高到 0.41。一点都不差!
为什么傅立叶变换对回归有帮助?
傅立叶变换并不是回归中分析季节性的唯一方法。我肯定会考虑探索其他更简单的选择。就像为一天中的一个小时或一周中的一天添加一个虚拟变量,特别是如果你已经对将要发生的事情有了强烈的直觉。
例如,假设您知道 911 呼叫量在下午 6 点到 9 点之间达到峰值,那么您可以创建一个新变量,当时间在下午 6 点到 9 点之间时,该变量为1
,否则为0
。这个系数会非常清楚地告诉你,在晚上的时间里会有多少更多的呼叫量。
挑战在于知道如何开始。是晚上 6 点到 9 点,还是晚上 7 点到 10 点?还是周末比晚上更能影响通话量?傅立叶变换是回答这些问题的好方法。它为您提供了一种可量化的方法来测量数据中的季节性。然后,如果您想在回归中利用它,有一个简单的选择,通过合并傅里叶变换输出的正弦曲线来实现。或者,您可以从傅立叶分析中获得见解,并在您的回归中测试更简单的变量。
Github 上的项目代码
ka ggle 上的数据集
在此阅读第 1 部分的
[## 使用 Python 和 SciPy 通过傅立叶变换分析季节性
通过寻找 911 电话数据中的季节性趋势,学会从噪音中分离信号
towardsdatascience.com](/analyzing-seasonality-with-fourier-transforms-using-python-scipy-bb46945a23d3)