Git 在不到 8 分钟的时间里解释了——不仅仅是命令!
一本你不知道自己需要的 git 指南
资料来源:XKCD
虽然花时间学习 git(或写一篇关于它的文章)可能会感觉愚蠢和浪费,但让我告诉你,从长远来看,这是值得的。一旦你明白了它是如何运作的,并且感觉它不像是只会让你的生活变得痛苦的黑魔法,你可能就会开始有点欣赏它了。
抛开所有的承诺,在我们决定像一个没有版本支持的工具一样浏览命令之前,让我们了解一下这里到底发生了什么。
Git 基础设施
git 命令做的事情之一是移动/复制数据。在使用 git 时,有 4 个区域可以存放我们的数据。
- 工作空间,在这里您可以对文件进行修改。
- 该索引,又名暂存区,包含已暂存的文件,即准备提交的文件。如果您在 10 个文件中进行了更改,但只有 5 个与您的工作相关,则您只能添加这 5 个文件。
- 本地存储库包含提交的文件。该区域中的文件将被推送到原点。一旦添加了这 5 个文件,就可以通过一次提交将这些更改复制到这里。
- stash ,一个存储尚未准备好上传但你也不想丢失的文件的地方。
带有基本命令的 git 中的数据流。
此外,git 命令还可以将指针从一个提交移动到另一个提交。它还能够一气呵成地移动数据和指针。等等,我这里说的是什么指针?!
嗯,为了更清楚,我上面画的图是一个过于简单的图。本地存储库不仅仅是您实际项目的单一副本。而是一个提交树——其中每个提交都是您的项目在不同阶段的快照。
让我们看一个例子,其中我们有一个新的 git 项目,有两个文件——ReadMe。 txt 和 BubbleSort 。 cpp 。
然后我们创建一个文件 MergeSort 。 cpp 并修改了 ReadMe.txt 以反映新的状态。现在我们添加这些文件并创建一个新的提交 C2。
提交#2 后的状态。
每当你创建一个新的提交,它将把它附加到最近的提交(一个头在那个时刻指向)。在此过程中,分支指针不会移动。
现在我们对 git 有了一些了解,让我们来看看命令。
git 状态
它显示了你工作空间的当前状态。它将告诉您已暂存、未暂存或未跟踪的更改(新创建的文件,即在您的工作空间中但不在索引和存储库中的文件)。
git 添加
它将工作目录中的更改添加到临时区域。它告诉 Git,您希望在下一次提交中包含对特定文件的更新,用简单的英语来说,这意味着将您的更改从您的工作空间复制到您的索引/暂存区域。
git add <fileName> // To stage[add] individual files.git add -A // To stage[add] all the modified files.git rm --cached <fileName> // To undo an add i.e. remove from [2] but not from [1].Remember to add --cached otherwise the file will be removed from both [1] and [2].git rm <fileName> // Remove from both [1] and [2]
为什么信息很重要。来源:XKCD。
git 提交
它捕获项目当前阶段变更的快照。只有在您暂存了您的更改后,您才能提交它们。这会将索引中的更改复制到存储库中,并创建一个新的提交。除此之外,它所做的是将分支指针移动到最近的提交。由于头部之前指向分支指针,现在它也将指向新的提交。以下选项很有用:
- 修改:它允许你修改最近的提交。如果临时区域中没有文件,它将只让您编辑前面的提交消息。如果一些文件被转移,它将创建一个新的提交来替换最近的提交。如果您必须提交 3 个文件,F1、F2 和 F3。您准备了 F1 和 F2,然后是 git commit -m“添加了 3 个文件”。现在,您意识到您忘记转移 F3,因此它不在“添加的 3 个文件”提交中。要将 F3 添加到之前的提交中,请运行以下命令
git add F3
git commit --amend --no-edit
这将创建一个具有相同消息“添加了 3 个文件”的新提交,包含这两个提交中的暂存文件,并替换原始的“添加了 3 个文件”提交。
git commit -m "<YourCommitMessageGoesHere>"git commit --amend <NewCommitMesg> // Running this command when there is nothing staged lets you edit the previous commit’s message without altering its snapshot.git commit --amend --no-edit // Let's say you accidentally did a premature commit i.e. forget to stage a few files. Once you stage the missing files and run this command, it will replace the latest commit with the newly created one.
git 日志
它显示了提交的历史。查看您已经提交的更改(提交散列和提交消息),或者其他人提交到该分支的更改。
这就是为什么在提交变更时给出有意义和相关的消息很重要,以便了解每次提交中可能发生了什么变更。
git log // Displays a history of commits, with commit hash and commit message.
git 贮藏
它暂时搁置(或隐藏)变更,这样你就可以做别的事情,然后回来重新应用它们。
这一个获取你所有的改变(不包括未跟踪的文件)并且将它们从工作空间移动到你的存储空间。这些更改将不再出现在您的工作空间中。
git stash save "<StashName>" // To move your changes to stash
git stash save -u "<stashName>" // To stash un-tracked files as wellgit stash list // Displays a list of all the "stashes" one has on various branches.git stash apply stash@{x} // Copies all the changes in stash@{x} from [4] to [1]. The changes are now in both [1] and [4].git stash pop // ***Moves*** the changes in stash@{0} from [4] to [1]. The changes will only be present in [1] now.git stash drop stash@{x} // Deletes the stash at position x.
git 差异
它显示了两个文件、git 上两个不同区域甚至两个不同提交之间的区别。
git diff // Shows diff in files between your work-space and index.git diff --cached // Shows diff in files between index and local repository, i.e. your staged changes.
git 分支
git 存储一个分支作为提交的引用。从这个意义上说,一个分支代表一系列提交的顶端
git branch //lists all the branches in your repository.git branch -d <branchName> // Deletes a branch. Safe option, as it won't let you delete a branch with unmerged changes.
git 检验
在更高的层次上,它用于从一个分支转移到另一个分支,或者创建一个新的分支。在非常基础的层面上,它用于从一个提交转移到另一个提交。它只移动头部指针。
git checkout <branchName> // Move to <branchName>git checkout -b <newBranchName> // Create a new branch.git checkout <commitId> // move to a specific commit id.
git 重置
它允许我们将头指针和分支指针都移动到指定的提交。使用该命令时应非常小心,因为它可能会造成不可逆的变化。根据所使用的选项,它还会修改暂存区和工作区中的指针。
复位命令有以下 3 个选项:
- —硬:这是最危险也是最强大的选项。它将修改指向存储库中指定提交的指针。指针也将在其他两个区域中更新—临时区域和工作区。这两个区域中的任何文件都将永远丢失。
- —混合:这是默认选项,在没有明确给出选项时使用。储存库中的指针将被更新为指定的提交。分段索引被重置为指定提交的状态。从临时索引中撤消的任何更改都被移动到工作空间中。
- —软:这只会更新存储库中的指针。临时区域和工作空间中的文件将保持原样。
git reset <commitHash> //Default is --mixed.
注意:
- 当 < commitHash > 之后的任何快照被推送到公共存储库时,您永远不应该使用 git reset**。发布提交后,您必须假设其他开发人员依赖于它。删除其他团队成员继续开发的提交会给协作带来严重的问题。
例如,如果您有 5 个提交, c1、c2、…,c5 。然后进行 git 推送,将所有代码推送到公共存储库。你开始在 c5 上开发,并意识到 c5 中的变化是不需要的,并决定做一个git reset c4
。这是一个坏主意,不应该做。因为一旦你删除了 c5 ,你的本地历史将会与公共存储库中有 c5 的历史不同。您的更改和任何其他成员的更改都将从 c4 分叉,并且需要显式的合并提交来同步您的提交。 - 不要而不是因为与上述类似的原因修改公共提交。
多方面的
- git show :显示提交文件的变化。
- git fetch :从资源库中获取所有的分支。这还会从另一个存储库中下载所有必需的提交和文件。要真正看到工作空间的变化,您需要做一个 git check out*。*
- git push :将本地存储库中的提交上传到远程存储库(origin)。
- git pull= git fetch(分支特定)+ git merge。它将获取头当前指向的分支中的所有提交。一旦所有本地更改都在本地存储库中(HEAD 仍然在我们的原始位置),现在 git merge 将创建一个新的提交,它将包含来自 HEAD 指针提交和我们刚刚获取的最新提交的更改。
git pull 如何工作,来源。
在 git 获取之后,您将会注意到带有远程源/主指针(绿色)的提交链。git 合并将创建一个新的提交 H,将合并来自 G 和 c 的更改。它还将更新本地指针以指向 HEAD 和本地 origin/master 都将指向 H
结论
- 它不仅仅是命令。
- 它由 3 个区域组成——工作区、暂存区和本地存储库。
- 命令将数据从一个空间移动到另一个空间。
- 不同 git 命令的数据移动的简要总结:
git 从一个区域到另一个区域的基本移动的简要总结。
参考
[## Git 教程和培训|亚特兰大 Git 教程
通过这个全面的 Git 培训学习 Git 的基础知识。涵盖了分支、拉请求、合并等更多内容…
www.atlassian.com](https://www.atlassian.com/git/tutorials) [## 关于
Git 的特性真正使它从几乎所有的 SCM 中脱颖而出的是它的分支模型。Git…
git-scm.com](https://git-scm.com/about)
我很高兴你坚持到了这篇文章的结尾。🎉我希望你的阅读体验和我写这篇文章时一样丰富。💖
请点击这里查看我的其他文章。
如果你想联系我,我会选择推特。
自动化项目组合生成的 GitHub 动作
使用 Python 和基本前端的 Dockerized GitHub 动作。
作为任何开发人员,我们都会生成大量代码,并将其推送到 Github 进行备份、管理软件版本、托管项目和其他许多任务。如果我们谈论有多少库是实际的项目,我们在简历/社交媒体中托管和展示,与创建的库的总数相比,这实在是太少了。这些包括分叉的存储库、一些上传的实践代码或一些参考的附加内容。
照片由 Richy Great 在 Unsplash 上拍摄
我已经创建了很多,现在当我必须展示我的项目时,我会对应该包括哪一个或我已经做了什么感到困惑!为了解决这一困境,我想出了一个解决方案,开发一个 Github 动作来自动添加项目,参加黑客马拉松,显示一些 Github 个人资料统计,并可选地显示在媒体和我的网站上写的最新博客,并将其提升到下一个级别,我将该动作分类并免费托管网页!让我们看看我是怎么做到的。
如果你想看看现在的行动,前往这个市场链接!
开发人员创建了数百个存储库,其中几乎没有几个是像样的,并在社交网站上展示…
github.com](https://github.com/marketplace/actions/portfoliofy)
什么是 GitHub Action?
Github action 使您能够自动化和定制软件开发周期,测试和部署集成到您的存储库中的应用程序。这些操作称为作业,可以通过 Cron 作业(基于时间的作业调度程序)根据您的需要安排运行。如果你访问 GitHub action 文档,你可能会混淆两个术语,动作和工作流。这些都是令人困惑的事情,需要在继续之前澄清:
- 动作和工作流之间的主要区别是一个是另一个的一部分。动作是执行特定工作流时触发的事件。
- 动作是在代码环境中执行的任务,而工作流管理这些任务将如何执行,它们的顺序是什么,在运行它们之前要完成的任何依赖/设置,输入,要传递的参数,或定义不同作业之间的依赖关系。
- 根据分配的配置,一个工作流可能有多个按顺序或并行运行的操作。
现在你已经对 Github 的动作有了基本的了解,让我们来编码实际的脚本,它将是这个动作的一部分。
脚本时间!
对于这个项目,我使用 Python,因为它对我来说很容易编码,而且使用 Python 构建的动作更少。该项目需要访问 Github 配置文件数据,尽管 Github API 提供了大部分数据,但对于未经身份验证的用户,它仍被限制为每小时 60 次请求。因此,你需要一个个人访问令牌(设置>开发者设置>个人访问令牌)来认证 Github 的用户,并允许每小时 5000 个请求!
首先,安装 PyGithub 库,解决所有令人头疼的连接、结果分页以及最终获取数据的问题。接下来,我们需要存储 API 返回的数据。我选择字典格式,因为它易于管理和访问属性。初始代码如下所示:
接下来关于存储库,我需要区分项目、黑客马拉松和其他额外的存储库。为了做到这一点,我设置了一个条件,即**在设置这个动作之前,你需要手动分配存储库主题“项目”或“黑客马拉松”**在投资组合中被考虑。如果一个存储库没有被标记,那么它将不会反映在输出中。这种情况将存储库分成不同的两个部分,现在它们被分开存储。
网页建设
Python 脚本提取了所有的信息,但是现在对于这个项目的主要目标,需要一个网页。最初,我想到使用 markdown 文件来做到这一点,但由于 Github 的限制,您不能在 markdown 中使用 CSS(以避免钓鱼攻击)。这是一个主要问题,因为我不想让用户在看到一个简单的纯文本组合后感到无聊或沮丧。因此,我扩展了当前的脚本,以使用之前收集的信息,并将值注入到 HTML 模板中,该模板存储为字符串,并使用 f 字符串进行更改。HTML 模板进行了大量的尝试,以获得一个简单的视图,该视图需要为移动视图进行不同的设置。Github 的所有基本信息都已获得,但还缺少一样东西,一个统计显示。为了显示统计数据,我使用了由 Anurag Hazra 开发的开源 Vercel 应用程序,它可以动态更新统计数据。对于博客更新,我使用了高塔姆克里希纳 R 行动,这是不同的安排,我将在接下来的段落中解释它。动作生成的最终网页是这样的:
图片作者,网页链接:https://kaustubhgupta.github.io/
在所有的混乱之后,这个动作可以生成一个 HTML 文件,在 Github 页面的帮助下可以部署,并且你有了你的免费托管的自我更新文件夹!现在,为了自动化添加新条目的整个过程,我想到了 Github action。
归档和创建行动
我为这个动作选择 docker 图像,因为当我尝试用 Python 创建一个动作的不同方法时,我没有得到任何好的结果。Dockers 帮助隔离环境并运行代码,因为它应该在本地运行。这个动作的 docker 文件看起来非常简单:
我已经从 docker hub 中提取了一个 Python 映像,安装了依赖项,并运行了脚本。
现在是创建动作的时候了。根据 Github docs,您需要在公共存储库的根目录中有一个名为 action.yml 的文件来使动作工作。动作文件包含以下内容:唯一的动作名称、描述、作者姓名、需要从用户处获取的输入,以及要执行哪个文件。在 YAML 格式中,它非常容易配置,因为它遵循分层系统。对于输入,我采用 Github token,对于文件,我提供 docker 文件。现在您的操作已经可以使用了,您也可以在市场上发布您的操作,但这不是强制性的。
使用的最终工作流程
现在是测试这个动作的时候了。正如我前面提到的,动作只是工作流中触发的事件。工作流定义了动作的顺序、运行的系统/环境规范,以及在触发之前或之后需要执行的其他活动。这些文件存储在
.github/workflows folder.
使用此操作的工作流程如下:
你可以根据自己的需求定制工作流程,但是工作中提到的**步骤不能改变。**这个工作流程运行良好,生成了 Github pages 正在使用的 index.html 文件,但是又少了一些东西。问题是博客更新动作还没有集成。我把这一步设为可选,因为不是每个人都写博客。要集成博客操作,在同一个工作流文件夹中,创建一个 YAML 文件,并放入相同的代码:(只需用您的链接更新提要列表)
你可以检查博客文章工作流动作来定制其他因素,只是确保不要过多调整模板参数,因为它可能不会给出好的结果。此操作在每次将内容推送到存储库时运行,由于索引文件将被推送到存储库,此操作将在索引文件生成后立即更新博客部分。
结论
在本文中,我向您介绍了 Github 动作的基本概念、工作流、它们之间的区别、动作的一些脚本、动作所需的文件以及最终在工作流中使用它们。我还讨论了我在这个项目中面临的挑战,以及如何在您的存储库中使用我的操作。如需更详细的说明和完整的源代码,请点击此处的资源库链接:
作为一名开发人员,我们创建了数百个存储库,但其中只有不到 15-20 个能够完成我们部署的最终项目…
github.com](https://github.com/kaustubhgupta/PortfolioFy)
支持这一行动,因为它为我提供了制作更多项目的动力,在 medium 上关注我以获得关于我最新文章的更新,如果你喜欢这一篇,请点击鼓掌按钮!说完了,合十礼!
Linkedin:
[## Kaustubh Gupta -机器学习导师-MAIT 开发者学生俱乐部| LinkedIn
嗨,我是一名 Python 开发人员,能够进行 Web 抓取、Selenium 自动化、数据科学、后端 Web 开发…
www.linkedin.com](https://www.linkedin.com/in/kaustubh-gupta-612767ab/)
GitHub 为胜利而行动
使用 GitHub Actions 进行持续集成轻而易举
威廉·冈克尔在 Unsplash 上拍摄的照片
你用 GitHub 做版本控制吗?你喜欢测试你的代码吗?对许多人来说,问题 1 的答案是肯定的,每个人都应该对问题 2 做出肯定的回答。很好,现在我们在同一页上,让我们来谈谈 GitHub 的行动。
GitHub Actions 是一个自动化工作流的框架。工作流在 YAML 创建,并在 GitHub 存储库上自动运行。下面的链接很好地概述了 GitHub 的动作。
使用 GitHub Actions 在您的存储库中自动化、定制和执行您的软件开发工作流。你…
docs.github.com](https://docs.github.com/en/free-pro-team@latest/actions)
上面的文档很好地介绍了 GitHub 动作和工作流文件语法。本文介绍了几个基本的工作流,用于在 GitHub 项目上添加持续集成。
入门
第一个例子涵盖了 py27hash 存储库中的一个工作流。
对于依赖于旧的散列/迭代顺序的应用程序,这个包有助于简化从 Python 2 到 3 的迁移…
github.com](https://github.com/neuml/py27hash)
所有的 GitHub 库都准备好了 GitHub 动作。下面的截图显示了 GitHub Actions 工作流的位置。
GitHub 操作选项卡
GitHub 将自动运行存储在中的任何工作流文件。github/workflows 目录。例如,py27hash 存储库有一个名为 build.yml 的工作流文件。
下的 build.yml 文件。github/工作流文件夹
工作流文件
下面的代码片段显示了存储在 py27hash 存储库中的 build.yml 工作流文件。
这个构建文件运行在推和拉请求上。该工作流在 Ubuntu Linux 虚拟机上运行,检查代码并运行一系列 Python 单元测试。如果这些都成功了,那么测试覆盖率就被发送到了。
让我们回顾一下下面的语法(记得查看https://docs.github.com/en/free-pro-team@latest/actions以获得更详细的工作流文档)。
设置工作流名称。
name**:** build
设置触发工作流的操作。
on: ["push", "pull_request"]
设置虚拟环境。
jobs:
build:
runs-on: ubuntu-latest
准备构建环境。下面的步骤从 GitHub 中签出代码,并为测试设置 Python 3.6 运行时环境。
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: 3.6
安装依赖项并运行测试。
- name: Build
run: |
pip install -U pip wheel coverage coveralls
python --version
./scripts/tests.sh skipslow
如果测试成功,发送测试覆盖报告给工作服。注意最后一行,秘密。GITHUB_TOKEN ,这是一个内置的,当提交到工作服时验证当前用户。
- name: Test Coverage
run: coveralls
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
这是 GitHub 的另一个优势,我们不需要授权外部服务访问我们的 GitHub 库。
查看工作流状态
下面显示了“操作”标签中的工作流状态。
py27hash 的 GitHub 操作选项卡
正如我们所看到的,对 py27hash 存储库的两次提交触发了 build.yml 工作流。每次运行的详细信息可以通过单击运行找到。下面是一个例子。
GitHub 操作工作流运行详细信息
多种环境
如果我们的项目支持多个平台或版本会怎样?没问题,GitHub Actions 已经处理好了。接下来,我们将回顾作为 txtai 存储库一部分的工作流文件。
txtai 在文本部分建立了一个人工智能索引。txtai 支持构建文本索引来执行相似性…
github.com](https://github.com/neuml/txtai)
构建工作流文件如下:
让我们再次回顾一下工作流语法,只包括这个文件中的新项目。
设置多个环境是通过构建矩阵建立的。下面的配置为 Ubuntu、macOS 和 Windows 建立了构建环境。同样的方法也可以用来测试 Python 的多个版本。
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
默认情况下,每个环境都会运行工作流中的所有步骤。但是条件步骤也可以在每个环境中执行。以下步骤分别为 macOS 和 Windows 安装依赖项。
- name: Install dependencies - MacOS
run: brew install libomp
if: matrix.os == 'macos-latest' - name: Install dependencies - Windows
run: python -m pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
if: matrix.os == 'windows-latest'
其余步骤同上。唯一的例外是测试覆盖只针对单一环境(Ubuntu)。
完成后,将为每个环境创建一个单独的工作流状态部分。只有在所有环境中都成功的情况下,构建才是成功的。
多个构建环境
结论
本文给出了 GitHub 动作的一个非常简短的概述,涵盖了自动化测试的几个基本工作流程。有大量的附加功能可以自动执行部署、标记和其他操作。
与外部构建系统相比,它的性能非常好,并且是一种更简单、更安全的运行持续集成的方式。试一试吧,它一定不会让人失望的!
GitHub Actions —使 ML CI/CD 管道的“一键部署”变得可行
如何用 GitHub 动作为机器学习应用创建 CICD 管道
使用 Canva 设计
如果我告诉你“你可以将构建、测试、交付或部署你的机器学习模型到生产中的过程自动化”会怎么样?
世界上最受欢迎的托管存储库服务, GitHub 通过 **GitHub 操作自动化任务,提供了一种设计和开发我们工作流的集成方式。**通过动作,GitHub 库中发生的事件,如推送、拉取请求、发布等。用作启动工作流的触发器。这些工作流程以 YAML 格式编码。
工作流只不过是我们在将应用程序投入生产时遵循的步骤,包括单元测试、集成测试、构建工件、健全性检查和部署。在本文中,我将向您介绍 GitHub Actions ,并向您展示如何构建您的工作流来部署机器学习应用程序。
让我们开始吧!!
背景
GitHub 知识库(作者提供图片)
在 GitHub 上创建一个资源库,如果你没有帐户,我建议你创建一个。GitHub 上的每个存储库现在都支持 GitHub Actions 特性。
GitHub Actions(作者照片)
点击“操作”。如果我们的库中已经有任何文件,GitHub 会推荐一些预定义的工作流。在这里,我们将创建我们的工作流。点击“自己设置工作流程”。
我们的第一次行动(作者照片)
正如我前面提到的,GitHub 工作流是以 YAML 格式编码的,这里我们定义了作业、步骤和管道。在开始之前,让我们看一下 YAML 文件中使用的属性。下面是一个简单的模板来打印“你好,世界!!"
示例工作流程
我们在任何工作流程中使用的基本属性是:
- 名称— 您的工作流程的名称(可选)
- on — 触发流的 GitHub 事件。它可以是存储库事件(push、pull 请求、release)或 webhooks、分支创建、问题或成员加入存储库。
- 作业— 工作流必须至少有一个作业。每个工作都必须有一个标识符,就像我们执行的任务的名称,比如“构建”、“测试”等等。
- 连续运行— 运行作业所需的机器类型。这些环境被称为跑步者。其中有 windows server 2019,ubuntu 18.04,macOS Catalina 10.15 等。
- **步骤—**所有命令或动作的列表。每一步都有自己的过程。
- 用途— 标识要使用的动作,定义该动作的位置。一个动作可以是上传和下载工件或结帐或配置任何云帐户。你可以在 GitHubmarket place找到各种各样的动作,类别包括持续集成、部署、项目管理、测试、安全等。我真的建议你探索各种行动,我们也可以在市场上发布我们的自定义行动。
- 运行— 在虚拟环境 shell 中运行命令。
- 名称— 步骤的可选名称标识符。
按照您的意愿用步骤和作业配置工作流后,提交管道-YAML 文件。工作流现在将开始运行。现在我们知道了 GitHub 动作的术语,让我们开始构建机器学习应用程序的工作流。
ML 应用示例(作者提供照片)
我开发了一个机器学习应用程序,它将通过从用户那里获取一些输入来预测初创公司的利润。
首先,我用所需的数据集训练模型,测试并验证它。然后我创建了一个 Flask 服务器来服务来自用户的请求。我把项目目录推送到 GitHub。GitHub 存储库应该是这样的:
GitHub 知识库(作者提供图片)
我想创建一个具有以下四个阶段的工作流程。您也可以相应地定义您的工作流程。
- 林挺
- 构建一个 Docker 映像并推送到 Google 的容器注册表。
- 测试—从 Container Registry 下载 Docker 映像并测试它。
- 在云上部署 Docker 映像。
管道(作者照片)
林挺阶段
为了减少错误和提高代码的整体质量,林挺是必要的。如果 lint 工具被有效地使用,它可以通过降低发现错误的成本来帮助加快您的开发。在这个阶段,我们进行单元测试,检查代码风格。
现在我们将创建工作流,如上所示,我们将一步一步地做。
林特舞台(作者供图)
在这个阶段,我们需要定义环境(在我的例子中是 Ubuntu),在那个环境中签出存储库,并安装模型运行所需的所有依赖项或需求。此外,我使用了 Pylint 和 flake8 来检查代码库的编码风格(PEP8)、编程错误,并检查圈复杂度。
构建 Docker 映像
既然我们已经针对某些编码风格测试了我们的代码,让我们构建一个 Docker 映像。如下所示创建一个 Dockerfile 文件
Dockerfile(作者照片)
我们使用一个docker 文件为应用程序构建一个 docker 映像。这个工件(docker 映像)需要存储在某个地方,在那里我们的应用程序的所有不同版本都存在。这将确保您在连续的版本中交付您的软件。我们有各种工具来存储工件,其中很少是 JFrog Artifactory、Amazon ECR、DockerHub、Google 的容器注册表。**
建立一个码头工人形象(作者提供照片)
现在,我将把 docker 图像推送到 Google 的容器注册表中。因此,我们需要设置 GCP 环境,该环境需要密码和 API 密钥等敏感信息。GitHub 允许我们存储秘密,我们可以以变量的形式访问这些秘密。
**${{ secrets.GCP_SERVICE_ACCT_KEY }}**
要创建一个秘密,进入设置并选择秘密。****
设置部分(作者提供照片)
您将被重定向到机密部分。点击“新秘密”。给秘密起个名字,增加价值。点击“添加密码”
创造一个秘密(作者照片)
我已经更新了所有需要的秘密。
秘密(作者照片)
一旦设置好环境,我们的工作将开始构建 docker 映像,并将其上传到 Google 的容器注册表(确保您在 Google 云平台上启用了容器注册表的 API)。
检验阶段
在执行上述阶段之后,我们将在我们的服务中将一个 docker 映像存储在容器注册表中。在这个阶段,我们将下载图像,并针对各种测试用例运行它。在真实的场景中,我们可能会使用不同版本的 docker 映像,并且我们会指定想要发布的版本。因此,我们从注册表中下载图像,而不是使用从上一阶段构建的图像。
测试阶段(作者照片)
软件应用程序或产品的有效性能需要测试。在这里,我们可以通过检查是否返回 200 状态代码(即成功运行的证明)来测试我们的 Flask 服务器。此外,因为我们可以测试和验证我们的机器学习模型,所以计算准确度并给出准确度的阈值水平,并且仅当准确度大于 95%(或任何其他阈值)时,才允许作业继续部署模型。
在云上部署 Docker 映像
一旦测试阶段结束,所有测试用例都通过,我们的下一步就是部署工件或 docker 映像。为了部署 docker 映像,我使用了 Cloud Run。
部署阶段(作者提供照片)
仅此而已!执行此阶段后,应用程序将很快投入生产。
结果
现在我们已经看到了整个工作流,让我们开始创建我们的行动。您可以在此处从复制工作流文件。
创建工作流程(作者照片)
点击开始提交并给出提交消息。提交文件。转到动作部分。您可以看到工作流已经开始执行。****
动作部分(作者照片)
成功运行所有作业后,您将看到以下输出。我们可以检查每个阶段的控制台输出,也可以检查调试日志。
工作流程输出(作者照片)
现在,如果我们转到容器注册表,我们可以查看被推送的工件。
集装箱登记处的码头工人图片(作者提供图片)
转到 GCP 导航菜单上计算部分下的云运行。创建具有给定名称的服务。机器学习模型已经投入生产。您现在可以通过端点访问服务了!
云运行控制台上的端点(照片 b 作者)
最终的应用程序(在我的例子中)看起来像这样:
最终启动应用程序(作者提供照片)
每次您将更改推送到代码时,都会触发此工作流。这是一个基本的管道。您可以构建具有不同阶段的管道——通过 API 调用获取数据、执行功能工程、模型训练、构建或存储模型(工件)、测试,以及部署到生产环境。
完整的代码可以在 GitHub 这里找到。
结论
我们已经看到了建立一个工作流的过程,该工作流使用 GitHub 操作来自动部署机器学习应用程序。它使我们能够创建我们的动作,并组合它们来为任何软件应用程序创建工作流。
如果你有什么建议,我很乐意听听。我很快会带着另一个有趣的话题回来。在那之前,呆在家里,保持安全,继续探索!
如果想联系,在LinkedIn上联系我。
Github Gists 101:让代码共享变得美好
简单代码展示的 5 个步骤
克里斯里德在 Unsplash 上的照片
如果你一直在浏览 Medium,查看技术文章,你肯定见过类似的小窗口,如下图:
具有基本功能的要点
这些被称为 Github Gists。gist 是一种简单的方法,以一种简洁和读者友好的方式与他人分享代码或数据的摘录。在本文中,您将看到显示您创建的函数、对表的查询或一些其他小数据片段的方法(就像对 dataframe 的一瞥)。这些信息由 GitHub 作为存储库托管。使用 gist 具有利用 GitHub 存储库的所有好处,具有轻量级和易于共享的嵌入特性。
它们不仅更干净,而且允许有视觉问题的编码人员有机会使用可访问性选项通读您的代码。
现在,让我们回顾一下基础知识:
1.Github Gists 入门
有两种方法可以到达 Github.com 的 gists 部分。第一种方式是你去Gist.Github.com,它会带你去新的要点创造。或者你可以浏览你的 Github 主页。
Github 主页让你有两种方式到达那里
底部的红色箭头指向我的个人资料图片,是你如何到达你的知识库或 gists。我们暂时忽略这一点,留待讨论编辑旧 gists 时再说。顶部的箭头指向加号,指向创建 repos、gists 或项目——这是我们首先要看的。点击加号后,你会看到一个下拉菜单。
新要点链接允许你创建一个全新的要点
这将把你带到下面的页面。请注意您有几个要填写的字段。
新要点的空白模板
- 描述框 —这将是要点的标题和非正式名称
- 文件名+扩展名 —这将是您命名文件的地方,以防下载。它也是你为你所使用的编程语言声明一个扩展的地方。
- 代码框 —这是您输入/粘贴想要显示的代码/数据的地方。
2.创建代码片段
从这里开始,一切都是即插即用。让我们试着用我们想要展示的一段代码创建一个要点——我正好有一个。
下面我写了一段代码,用来估算我最近完成的一个线性回归项目的数据。它是用来估算一所房子可能拥有的使用浴室的卧室数量和给定房子的居住面积。
我通过 gists.github.com 创建的代码片段
延伸是非常重要的。可以放之类的东西。txt ,。py 或者**。html** 。这将通知读者它是用什么语言编写的——如果还不清楚的话,并允许下载带有适当扩展名的文件。不管你是否延期,要点都会起作用——但是最好的“实践创造更好的工作机会”——保罗·托雷斯 2020。
简单地将代码复制并粘贴到窗口中,然后填写描述和文件名。
我把设置设为公开,这样在网站上搜索就能找到要点。然而,你可以选择制作一个不能被搜索的秘密要点——这些要点仍然可以通过你可以分发的链接来分享。
3.创建 CSV 表格
我们要看的下一个特性是使用 gists 创建表。Gists 不仅用于显示代码片段。您还可以在其中显示数据的小图片。我之所以说小,是因为在本文发表时,除了复制粘贴或手工输入之外,我还没有找到输入数据的方法。
第一步是开始一个新的要点并编辑文件名,使其以结束。csv 。这告诉网站,您将为列索引和单元格输入值,用逗号分隔。确保每个列名由逗号分隔,并且每个后续行的顺序与列名的顺序相同。
确保按照您希望的方式书写单词
看上面的图片,我们可以看到第一行条目是列名。第二行是数据中的第一个观察值。所有条目必须用逗号分隔,并且必须按照第一行中列名的顺序排列。整个表格都是如此。
不要担心单元格的分段或列名的字体——网站会帮你完成。
现在,让我们来看看完成的表。
每个观察值被分割到不同的行中,每个特征被分割到其自己的单元中。正如我们之前所说的,当列名被加粗并放在列的顶部时,字体的格式是自动完成的。
一个非常有用的功能是表格顶部的搜索框。嵌入时无法访问,但它在网站上。您可以搜索该表,它只返回您指定的值。
4.在介质上部署 Gists
现在我们可以谈论向世界展示这些要点了。
就在这里的 Medium 上,只需点击下一段药水上的 + ,点击 < > 选项即可。粘贴要点的网址后,按回车键。
看看这张 gif。
媒体嵌入过程的快速视频
5.查找或编辑以前制作的列表
如果你回到你的 Github 主页,在创建按钮的右边是你的照片。下拉菜单会给你链接到你的个人资料和设置,但更重要的是你的回购,项目和要点。
点击你的要点的链接。
这是您寻找已经创建的回购和 gists 的地方
在这一点上,你将被带到一个列出你所有清单的页面。
我最近更新的三个要点
点击一个,你就可以编辑了。你编辑的任何要点都会更新你在其他地方的嵌入。这是一个非常方便的特性,如果您发现了一个错误或者想要以一种更令人愉快的方式格式化代码。你不需要访问每个嵌入,你只需要更新要点,它就会为你工作。
感谢阅读。我希望这有助于您分发我知道您将编写的漂亮代码。
在 LinkedIn 这里跟我连线。
关于这些 gists 来自的项目的更多信息,请查看我的Github这里。你可以从下面的文章中找到这些要点:
将您的数据带入现实世界
towardsdatascience.com](/using-geopandas-for-spatial-visualization-21e78984dc37) [## 线性回归建模过程
预测金县房地产市场
towardsdatascience.com](/linear-regression-modeling-process-d0a92d2d14b)
GitHub 是你需要的最好的汽车
py caret——Python 中的开源、低代码机器学习库!
你可能想知道 GitHub 从什么时候开始涉足自动机器学习的业务。嗯,它没有,但你可以用它来测试你的个性化 AutoML 软件。在本教程中,我们将向您展示如何构建和容器化您自己的自动化机器学习软件,并使用 Docker 容器在 GitHub 上进行测试。
我们将使用 py caret 2.0(Python 中的开源低代码机器学习库)来开发一个简单的 AutoML 解决方案,并使用 GitHub actions 将其部署为 Docker 容器。如果你以前没有听说过 PyCaret,你可以在这里阅读 PyCaret 2.0 的官方公告,或者在这里查看详细的发行说明。
👉本教程的学习目标
- 了解什么是自动化机器学习,以及如何使用 PyCaret 2.0 构建一个简单的 AutoML 软件。
- 了解什么是容器,以及如何将 AutoML 解决方案部署为 Docker 容器。
- 什么是 GitHub 动作,如何使用它们来测试你的 AutoML。
什么是自动机器学习?
自动机器学习(AutoML)是将机器学习的耗时、迭代任务自动化的过程。它允许数据科学家和分析师高效地构建机器学习模型,同时保持模型质量。任何 AutoML 软件的最终目标都是基于一些性能标准最终确定最佳模型。
传统的机器学习模型开发过程是资源密集型的,需要大量的领域知识和时间来产生和比较几十个模型。借助自动化机器学习,您可以轻松高效地加快开发生产就绪型 ML 模型的速度。
有很多 AutoML 软件,有付费的,也有开源的。几乎所有这些都使用相同的转换和基本算法集合。因此,在这种软件下训练的模型的质量和性能大致相同。
如果你的口袋里没有几十个用例,付费的 AutoML 软件即服务是非常昂贵的,在经济上是不可行的。托管机器学习即服务平台相对较便宜,但它们通常难以使用,并且需要特定平台的知识。
在许多其他开源 AutoML 库中,PyCaret 相对来说是一个新的库,具有独特的低代码机器学习方法。PyCaret 的设计和功能简单、人性化、直观。在很短的时间内,PyCaret 被全球超过 100,000 名数据科学家采用,我们是一个不断增长的开发人员社区。
PyCaret 是如何工作的?
PyCaret 是一个用于监督和非监督机器学习的工作流自动化工具。它被组织成六个模块,每个模块都有一组可用于执行某些特定操作的功能。每个函数接受一个输入并返回一个输出,在大多数情况下,这是一个经过训练的机器学习模型。第二版中可用的模块有:
PyCaret 中的所有模块都支持数据准备(超过 25 种基本预处理技术,附带大量未经训练的模型&支持定制模型、自动超参数调整、模型分析和可解释性、自动模型选择、实验日志记录和简单的云部署选项。
要了解更多关于 PyCaret 的信息,点击这里阅读我们的官方发布公告。
如果你想开始使用 Python,点击此处查看入门笔记本示例库。
👉开始之前
在开始构建 AutoML 软件之前,让我们理解以下术语。在这一点上,你需要的是一些我们在本教程中使用的工具/术语的基本理论知识。如果你想了解更多的细节,在本教程的末尾有一些链接供你以后探索。
集装箱
容器提供了一个可移植且一致的环境,可以在不同的环境中快速部署,以最大化机器学习应用的准确性、性能和效率。环境包含运行时语言(例如 Python)、所有库以及应用程序的依赖项。
码头工人
Docker 是一家提供允许用户构建、运行和管理容器的软件(也称为 Docker)的公司。虽然 Docker 的集装箱是最常见的,但也有其他不太出名的替代品,如 T2、LXD、T4、LXC 和 T5,它们也提供集装箱解决方案。
开源代码库
GitHub 是一个基于云的服务,用于托管、管理和控制代码。假设您在一个大型团队中工作,其中多人(有时数百人)正在对同一个代码库进行更改。PyCaret 本身就是一个开源项目的例子,在这个项目中,数百名社区开发人员不断地贡献源代码。如果你之前没有用过 GitHub,你可以注册免费账号。
GitHub 动作
GitHub 动作帮助您在存储代码和协作处理拉取请求和问题的同一位置自动化您的软件开发工作流程。您可以编写称为操作的单个任务,并将它们组合起来创建自定义工作流。工作流是定制的自动化过程,您可以在存储库中设置它,以便在 GitHub 上构建、测试、打包、发布或部署任何代码项目。
👉我们开始吧
目标
根据数据集中的其他变量,如年龄、性别、体重指数、儿童、吸烟者和地区,训练和选择预测患者费用的最佳回归模型。
👉第一步——开发 app.py
这是 AutoML 的主文件,也是 Dockerfile 的入口点(参见下面的步骤 2)。如果您以前使用过 PyCaret,那么这段代码对您来说是不言自明的。
https://github . com/py caret/py caret-git-actions/blob/master/app . py
前五行是关于从环境中导入库和变量。接下来的三行用于读取数据作为熊猫数据帧。第 12 行到第 15 行是导入基于环境变量的相关模块,第 17 行以后是 PyCaret 的函数,用于初始化环境、比较基本模型以及在设备上保存性能最佳的模型。最后一行以 csv 文件的形式下载实验日志。
👉步骤 2—创建 Dockerfile 文件
Dockerfile 只是一个包含几行指令的文件,保存在您的项目文件夹中,名称为“Dockerfile”(区分大小写,没有扩展名)。
另一种看待 Docker 文件的方式是,它就像是你在自己的厨房里发明的食谱。当你与他人分享这样的食谱时,如果他们按照食谱中完全相同的说明去做,他们将能够复制出同样质量的菜肴。类似地,您可以与他人共享您的 docker 文件,然后他人可以基于该 docker 文件创建图像并运行容器。
这个项目的 Docker 文件很简单,只有 6 行。见下文:
https://github . com/py caret/py caret-git-actions/blob/master/docker file
Dockerfile 文件中的第一行导入 python:3.7-slim 图像。接下来的四行创建一个 app 文件夹,更新 libgomp1 库,并安装来自 requirements.txt 文件的所有需求,在本例中只需要 pycaret。最后,最后两行定义了应用程序的入口点;这意味着当容器启动时,它将执行我们之前在步骤 1 中看到的 app.py 文件。
👉步骤 3 —创建 action.yml
Docker 操作需要元数据文件。元数据文件名必须是action.yml
或action.yaml
。元数据文件中的数据定义了操作的输入、输出和主入口点。动作文件使用 YAML 语法。
https://github . com/py caret/py caret-git-actions/blob/master/action . yml
环境变量 dataset、target 和 usecase 分别在第 6、9 和 14 行声明。参见 app.py 的第 4–6 行,了解我们如何在 app.py 文件中使用这些环境变量。
👉步骤 4 —在 GitHub 上发布操作
此时,您的项目文件夹应该如下所示:
https://github.com/pycaret/pycaret-git-actions
点击**‘发布’**:
GitHub 操作—点击发布
起草新版本:
GitHub 行动——起草新版本
填写详细信息(标签、发布标题和描述)并点击**‘发布发布’**:
GitHub 操作—发布发布
发布后,点击发布,然后点击**“市场”**:
GitHub 行动—市场
点击**‘使用最新版本’**:
GitHub 操作—使用最新版本
保存这些信息,这是您的软件的安装详细信息。这是您在任何公共 GitHub 库上安装该软件所需的内容:
GitHub 操作—安装
👉步骤 5—在 GitHub 存储库上安装软件
为了安装和测试我们刚刚创建的软件,我们创建了一个新的存储库py caret-automl-test,并上传了一些用于分类和回归的样本数据集。
要安装我们在上一步中发布的软件,请单击“操作”:
https://github.com/pycaret/pycaret-automl-test/tree/master
GitHub 操作入门
点击自行设置工作流**,将该脚本复制到编辑器中,然后点击开始提交。**
这是 GitHub 要执行的指令文件。第一个动作从第 9 行开始。第 9 到 15 行是安装和执行我们之前开发的软件的操作。第 11 行是我们引用软件名称的地方(参见上面第 4 步的最后一部分)。第 13 到 15 行是定义环境变量的操作,比如数据集的名称(csv 文件必须上传到存储库)、目标变量的名称和用例类型。从第 16 行开始是从这个存储库上传三个文件 model.pkl,实验日志作为 csv 文件,系统日志作为. log 文件。
开始提交后,点击“操作”:
GitHub 操作—工作流程
这是您可以监视构建日志的地方,一旦工作流完成,您也可以从这个位置收集文件。
GitHub 操作—工作流构建日志
GitHub 操作—运行详细信息
你可以下载文件并在你的设备上解压。
文件:型号
这是最终模型的. pkl 文件,以及整个转换管道。您可以使用此文件通过 predict_model 函数对新数据集生成预测。要了解更多,点击这里。
文件:实验日志
这是一个. csv 文件,其中包含了模型所需的所有细节。它包含在 app.py 脚本中训练的所有模型、它们的性能指标、超参数和其他重要的元数据。
实验日志文件
文件:系统日志
这是 PyCaret 生成的系统日志文件。这可以用于审计过程。它包含重要的元数据信息,对于排除软件中的错误非常有用。
PyCaret 生成的系统日志文件
披露
GitHub Actions 使您能够直接在 GitHub 存储库中创建定制的软件开发生命周期工作流。根据您的客户计划,每个帐户都附带了与操作一起使用的计算和存储数量,您可以在操作文档中找到。
不得违反本协议、可接受使用政策或 GitHub Actions 服务限制使用 Actions 和 Actions 服务的任何元素。此外,操作不应用于:
- 秘密采矿;
- 无服务器计算;
- 使用我们的服务器来破坏、获取或试图获取对任何服务、设备、数据、账户或网络的未经授权的访问(未经 GitHub Bug Bounty 计划授权的访问除外)
- 为商业目的提供独立或集成的应用程序或服务,提供动作或任何动作元素;或者,
- 与使用 GitHub 动作的存储库相关的软件项目的生产、测试、部署或发布无关的任何其他活动。
为了防止违反这些限制和滥用 GitHub 操作,GitHub 可能会监控您对 GitHub 操作的使用。误用 GitHub 操作可能会导致作业终止,或者限制您使用 GitHub 操作的能力。
本教程中使用的存储库:
** [## py caret/py caret-git-操作
py caret-git-动作。在 GitHub 上创建一个帐户,为 pycaret/pycaret-git-actions 开发做贡献。
github.com](https://github.com/pycaret/pycaret-git-actions) [## py caret/py caret-自动测试
自动测试。在 GitHub 上创建一个帐户,为 pycaret/pycaret-automl-test 开发做贡献。
github.com](https://github.com/pycaret/pycaret-automl-test)
使用 Python 中的这个轻量级工作流自动化库,您可以实现的目标是无限的。如果你觉得这有用,请不要忘记给我们 github 回购⭐️。
要了解更多关于 PyCaret 的信息,请关注我们的 LinkedIn 和 Youtube。
如果你想了解更多关于 PyCaret 2.0 的信息,请阅读这个公告。如果你以前用过 PyCaret,你可能会对当前版本的发行说明感兴趣。
你可能也会对它感兴趣:
使用 PyCaret 2.0
在 Power BI 中构建您自己的 AutoML 使用 Docker
在 Azure 上部署机器学习管道在 Google Kubernetes 引擎上部署机器学习管道
在 AWS Fargate 上部署机器学习管道
构建并部署您的第一个机器学习 web 应用
使用 AWS Fargate server less
构建
重要链接
博客
py caret 2.0 发行说明
用户指南/文档 Github
stack overflow
安装 PyCaret
笔记本教程
贡献于 PyCaret
想了解某个特定模块?
单击下面的链接查看文档和工作示例。
基于 Python 的 Github 推荐系统
让我们分析用户相似性,并使用二分图的概念向用户推荐存储库。
使用 Canva 设计。
一个网络或者一个图是节点和边的组合。我们经常把图画成由边组合而成的节点,其中节点代表一些现实生活中的实体,比如脸书的用户,而边代表实体之间的关系,比如脸书的朋友。在我之前的文章中阅读更多关于图表的内容。我们将在本文中使用二分图和 NetworkX 包的概念。
二部图
定义二分图有两个条件。首先,它是一个节点被分成两组的图。第二,一组中的节点不能相互连接;它们只能连接到另一组中的节点。让我们举个例子来更具体地说明这一点。
以亚马逊购物网站为例。客户使用亚马逊网站/应用程序购买产品。假设我们正在为这个模型创建一个图表。让我们将节点分成两组,客户分区和产品分区。边缘表示客户已经购买了特定的产品。在这种情况下,产品不能连接到产品是完全合理的,因为一个产品不能购买另一个产品。顾客也一样。
让我们使用 NetworkX 包创建一个二分图。
如果我们在传入参数data=True
时检查图的节点,我们将看到存储的分区信息。
过滤
NetworkX 没有提供显式的二分图类,我们需要显式地编写代码来过滤掉不同的节点集。这可以使用列表理解来完成。现在,让我们试着从上图中只检索“客户”集。
推荐系统
让我们尝试并理解如何将二分图应用于推荐系统问题。
二分图是协同过滤方法中使用的底层数据结构,这种方法在许多推荐系统如网飞和亚马逊中被广泛使用。
在 Github 上,用户在存储库上互相开发代码。正如文章标题所示,我们将向用户推荐在一个集合中使用高度相似节点概念的存储库。假设我们有一个二分图,如下所示。
用户 1 连接到 repo2,我们想推荐用户 1 可能有兴趣使用的存储库。现在,我们可以尝试分析连接到 repo2 而不是 User1 的所有其他用户。在这种情况下,用户 2 和用户 3 连接到 repo2。此外,请注意 User3 还连接到另一个存储库 repo1。因此,我们可能希望向用户 1 推荐 repo1 进行贡献。像亚马逊、YouTube 和网飞这样的大多数网站使用协同过滤作为推荐系统的一部分,根据相似用户的好恶向用户提供建议。
资料组
我们有一个存储库和用户的邻接表。我们有用户和存储库的编号,而不是名称。根据 NetworkX 文档,邻接表格式由带有节点标签的行组成。一行中的第一个标签是源节点。线中的其他标签被视为目标节点,并与源节点和目标节点之间的边一起添加到图中。例子—
a b c ( 'a ‘是源节点,’ b ‘,’ c '是目标节点)
表示在 a-b 和 a-c 之间有一条边的图。
“u”代表用户,“p”代表存储库。
如您所见,一个用户可以连接到许多存储库,反之亦然。带有单个标签的线表示没有边的节点。我们可以使用下面的命令从上面的文件创建一个图表。
G=nx.read_adjlist("/content/Github.txt")
我们可以注意到有 22,000 个节点(用户+存储库)和 20,000 条边。现在让我们将节点分成 2 组,即用户组和项目组。
现在让我们找出用户节点的数量和项目节点的数量。我们可以通过遍历节点列表、检查二分属性并查找生成的列表长度来完成这项任务,就像我们对上面的 customers 和 product 节点所做的那样。
在执行上述代码时,找到了 10721 个用户节点和 11632 个项目节点。
使用集合交点重叠
我们假设 2 个人,A 和 B,A 连接到 repo2,B 连接到 repo2 和 repo3。如何才能找到 A 和 B 的共享存储库(repo2)?
A_n = G.neighbors(A) will return ['repo2']
B_n = G.neighbors(B) will return ['repo2', 'repo3']overlap = set(A_n).intersection(B_n) will return ['repo2']
交集方法将返回 2 个或更多集合中的公共元素。借助上述逻辑,我们可以找到 2 个用户的相似度得分。
寻找相似的用户
2 个用户的相似性度量=共享项目数/项目总数。
使用上述逻辑,对于给定的用户 A,我们可以通过计算 A 与所有其他用户的相似性度量,并提取得分最高的用户,来找到最相似的用户。
推荐存储库
在上述用户“u4560”的代码中,最相似的用户是“u5453”和“u17446”。现在,如果我们发现“u5453”和“u17446”组合在一起与“u4560”的存储库不同,我们可以将它们推荐给“u4560”。
示例—假设有两个人,A 和 B。A 连接到 repo2,B 连接到 repo2 和 repo3。我们如何才能发现 A 和 B 的存储库之间的区别呢?
B.difference(A)
将返回回购 3。difference()
方法将返回出现在第一组中而不出现在第二组中的节点。
数据集和完整代码可以在 Github 这里获得。
一个脑筋急转弯!
上面哪个是二分图?也试着回答一下节点集!期待您的回复。请务必检查答案,找出正确答案。
结论
在本文中,我们了解了二分图的概念及其在推荐系统中的使用。我们还使用 NetworkX 包创建了一个 Github 存储库推荐系统。推荐系统中使用了更多的指标和方法,这些将在以后的文章中讨论。我希望你今天学到了新东西!
欢迎分享反馈。
GitHub URL 缩写
提示和技巧
使用 curl 和 Python 的 GitHub.com 网址缩写器
图片来自 Pixabay 的 Susanne Jutzeler,suju-foto
GitHub 是最受欢迎的 Git 源代码存储库托管服务。然而,URL 可能会变得很长,因为我们可能会对存储库和文件使用很长的名称。此外,当我们需要在电子邮件和社交网络上与他人分享 URL 时,它看起来会很混乱。
当我们需要与同事分享项目时,短 URL 看起来更好。GitHub 提供了一种服务,可以将这些又长又乱的网址变成更短更干净的网址。答案是 git.io 。
Git.io 是 GitHub 提供的缩短 URL 的服务。
要缩短网址,只需前往https://git.io/并输入你的 GitHub 网址。URL 可以是 GitHub 存储库,甚至是 GitHub 页面的 URL。
注意:这个网址缩写器只能用于 GitHub 网址,不能用于其他网址。
使用 curl 缩短 URL
创建缩短的 URL
您也可以使用curl
命令来缩短 URL:
curl -i https://git.io -F "url=GITHUB_URL"
举例:
curl -i https://git.io -F "url=https://github.com/jimit105/Sentiment-Analysis-of-Movie-Reviews-using-NLP"
Output:
Location: https://git.io/JfzQJ
要获得一个定制的简短 URL,使用参数code
传递定制文本
curl -i https://git.io -F "url=GITHUB_URL" -F "code=CUSTOM_TEXT"
举例:
curl -i https://git.io -F "url=https://github.com/jimit105/Intro-to-Deep-Learning-with-PyTorch" -F "code=pytorch"
Output:
Location: https://git.io/pytorch
缩短的网址将出现在回复标题的Location
字段中。
如果您得到 SSL 错误,那么通过命令传递--insecure
标志来跳过证书验证。
检索完整的 URL
使用以下命令从缩短的 URL 中检索完整的 URL:
curl -i SHORTENED-URL
举例:
curl -i https://git.io/JfzQJ
Output:
Location: https://github.com/jimit105/Sentiment-Analysis-of-Movie-Reviews-using-NLP
使用 Python 缩短 URL
您还可以使用以下 Python 脚本来缩短 URL,并从缩短的 URL 中检索完整的 URL
创建缩短的 URL
import requests
url = 'https://git.io/'
data = {'url': 'https://github.com/jimit105/Intro-to-Deep-Learning-with-PyTorch',
'code': 'pytorch'}
r = requests.post(url, data=data)
print(r.headers.get('Location'))
# Output:
# https://git.io/pytorch
如果在运行上面的脚本时得到了SSLError
,那么在requests.post
方法中添加参数verify=False
来跳过证书验证。
检索完整的 URL
import requests
r = requests.head('https://git.io/pytorch')
print(r.headers.get('Location'))
# Output:
# https://github.com/jimit105/Intro-to-Deep-Learning-with-PyTorch
**注意:**您只能为每个 URL 创建一个缩写 URL。如果 GitHub URL 已经被缩短,则不能创建另一个缩短的 URL。如果您再次尝试缩短相同的 URL,它将返回现有的缩短的 URL。
结论
在本文中,我们看到了如何使用 git.io 来缩短 GitHub 的 URL。该服务仅适用于 GitHub 网站,即您只能缩短 GitHub 网址,而不能缩短其他网址。因此,当你与他人分享缩短的网址时,他们可以相信链接会指向 GitHub 网站(就像 g.co 是谷歌官方网址缩写,它会带你去谷歌的产品或服务)。
参考
资源
本文中使用的所有代码片段都可以在我的 GitHub 页面上找到。
让我们连接
领英:【https://www.linkedin.com/in/jimit105/】
GitHub:https://github.com/jimit105
推特:https://twitter.com/jimit105
GitHub 通向 1.28 亿公共知识库的道路
用硬数字
在 Simiotics,我们写了很多分析代码的代码。GitHub 是世界上最大的源代码主机。这意味着我们要花大量时间分析来自 GitHub 的数据。 镜像 是一个开源项目,有我们的一些代码爬虫。
GitHub 的时间表记录了 GitHub 作为一家企业的崛起。我们将使用由镜像收集的数据,用存储库统计数据来补充这个时间线。我们使用的数据是从 GitHub 的 /repositories API 端点抓取的。您可以使用镜像存储库中的GitHub Jupyter 笔记本运行用于分析的代码。
由 Markus Spiske 在 Unsplash 上拍摄的照片
我们的目标是使用 GitHub 提供给我们的关于公共库的信息来可视化 GitHub 上的库总数是如何随着时间的推移而增长的。
制作这篇博文的大部分工作都是使用 镜像 来抓取 GitHub。使用一个自由层合格的 t2.micro EC2 实例和用一个 GitHub 帐户认证的请求, mirror 花费了大约 10 天来检索关于所有公共 GitHub 存储库的基本元数据。
抓取不需要监督,我们选择等到一个完整的抓取完成后再发布这个分析。为了这篇博文的目的,我们也可以更快地抓取更稀疏的公共存储库集合,但是我们也出于其他原因想要元数据。
这是我们从爬行中构建的可视化。我们用 GitHub 的时间线中有趣的事件来标记图表。
/repositories 端点不返回每个存储库的创建日期。为了获得存储库的创建日期,我们必须查询其特定的 API URL 并读取 created_at 字段。
GitHub 上有超过 1.28 亿个公共存储库。一个 GitHub 帐户每小时只能发出 5000 个所需类型的 API 请求。这意味着检索每个公共存储库的创建日期需要 25600 个小时,差不多 3 年。与此同时,GitHub 用户将继续创建更多的公共库。
相反,我们满足于检索均匀分布的存储库样本的创建时间,并通过它们的 GitHub id 字段的差异来估计样本之间的存储库数量。GitHub 的 /repositories 端点返回的存储库列表为每个存储库提供了一个 id 字段。这是一个整数 ID,似乎由公共和私有存储库共享。虽然还不清楚这些 id 是否按顺序递增,但我们的分析表明它们是递增的。
在爬行 /repositories 端点时,理解这些响应反映了在您做出每个响应时存储库的公共和私有状态是很重要的。旧的存储库更有可能被私有或删除。我们的图表反映了与较晚日期相比,较早日期直方图的块状性。
图片来自模拟/镜像
其他一些有趣的统计:
- 截至 2020 年 2 月 26 日,GitHub 上的公共知识库数量约为 128,411,417
- 截至 2020 年 2 月 26 日,GitHub 上公共存储库的所有者数量大约为 23,298,697
如果你有兴趣复制这个分析,或者如果你想扩展它,GitHub Jupyter 笔记本的崛起是一个很好的起点。我们已经托管了样本存储库的数据集,为此我们收集了完整的存储库元数据作为依据。数据为 JSON 行格式。
在我的 GitHub 系列的下一篇文章中,我将分析编程语言在公共 GitHub 库中的分布。
联系我上 LinkedIn 如有问题,关注我上Twitter。
PyTorch3D 一瞥:一个开源的 3D 深度学习库
在深度学习环境中采取下一步措施脸书人工智能研究所推出了 PyTorch3D 一个为 3D 计算机视觉研究提供深度学习和组件的库。
GIF Src: 将一个球体网格变形为海豚
随着 PyTorch3D 的发布,脸书正在开源 Mesh-RCNN ,它可以检测现实世界图像中的物体,并预测每个检测到的物体的完整 3D 形状。PyTorch3D 将在许多工业深度学习应用中有用,如机器人取放任务或帮助自动驾驶汽车理解周围物体的位置。
PyTorch3D 附带了一个模块化的可区分渲染 API,它提供了许多经常使用的 3D 操作符和损失函数,用于快速和可区分的 3D 数据。这使得开发人员和研究人员可以将这些功能导入到现有的最先进的深度学习项目中。
PyTorch3D 的主要特性
- PyTorch3D 网格用于存储和操作 3D 对象的数据结构
- 它附带了一些对三角形网格的有效操作,如投影变换、图形卷积等。使用可区分网格渲染器
- PyTorch3d 中的所有运算符都是使用 PyTorch 张量实现的
- 与任何现有的 3D 库相比,PyTorch3D 具有处理小批量异构数据的能力
- 它支持 CUDA,因此可以利用 GPU 进行加速
装置
为了安装 PyTorch3D,您需要安装 PyTorch,因为 PyTorch3D 在 PyTorch 之上工作。请参见下面的命令来安装 PyTorch
conda create -n pytorch3d python=3.6
conda activate pytorch3d
conda install -c pytorch pytorch torchvision cudatoolkit=10.0
conda install -c conda-forge -c fvcore fvcore
安装 PyTorch 后,您可以使用下面的任何一个命令来安装 PyTorch3D。
- 来自蟒蛇云
conda install pytorch3d -c pytorch3d
运筹学
- 来自 GitHub
`pip install ‘git+https://github.com/facebookresearch/pytorch3d.git’(add --user if you don’t have permission)`
教程
脸书人工智能研究所提供了一些笔记本教程,让你开始使用 PyTorch3D。看看下面这 4 款笔记本吧。
有用的链接
图沙尔·卡普尔😦https://www.tusharck.com/
免责声明:
- PyTorch3D、PyTorch3D 徽标以及与 PyTorch3D 或网站相关的所有其他商标、服务标志、图形和徽标是 PyTorch3D 或 PyTorch3D 许可方的商标或注册商标。
- PyTorch3d 是在 BSD-3 条款许可下发布的。
全球新冠肺炎预报
正在 Kaggle 上进行的新冠肺炎预报竞赛简介
1.介绍
在这本笔记本中,我们将分析 2019 年 12 月在武汉首次发现的新冠肺炎在全球的传播和发展。截至 2020 年 4 月 13 日,210 个国家报告了 200 多万例病例。我们将尝试预测 2020 年 4 月 15 日至 2020 年 5 月 15 日的发展,这是正在进行的 Kaggle 竞赛的一部分。我认为澄清这一挑战背后的想法非常重要,我认为 Kaggle 团队总结得很好:
我们理解这是一个严峻的形势,绝不想通过预测死亡人数来淡化这场危机对人类造成的影响。我们的目标是提供更好的评估方法,帮助医疗和政府机构在流行病爆发时做好准备和调整。
在笔记本的第一部分,我们将从信息和质量的角度探讨数据。之后,我们将清理数据,并继续进行特征工程。在第三部分,我们将看看不同的预测方法,即线性回归和 ARIMA。最后,在我们为竞赛创建提交文件之前,我们将有一个短暂的停留和回顾。尽管这是一个非常严肃的话题,但我希望我们能一起学到一些东西。保持健康!
2.探索性数据分析
2.1 确诊病例
在开始之前,让我们快速看一下数据结构。我们有两组数据。训练数据集包含六列:
- ID :唯一标识符
- 省 _ 州:特定国家的省和州,如美国的华盛顿州
- 国家地区:德国、法国或西班牙
- 日期:各行的日期戳
- 确诊病例:新冠肺炎确诊病例数
- 死亡人数:新冠肺炎登记的死亡人数
除了“Province_state”列之外,数据集中没有遗漏。4 月初也有一个重叠的日期间隔。我们将修复这些问题,并先看看发行版。
迄今为止,大多数新冠肺炎病例发生在美国。紧随其后的是四个最大的欧盟成员国和中国,中国是第一个新冠肺炎病例出现的国家。
在上图中,我们绘制了前 10 个国家的确诊病例数量以及全球发展线。一个有趣的观察是,这 10 个国家占全球发展的很大一部分(见全球趋势线)。乍一看,曲线似乎变平了,这表明我们正在离开指数增长阶段。
我们创建了两个新变量:差异和增加配额。第一个变量包含 t0 和 t-1 绝对情况下的差异。第二个变量,增加配额,是 t0 和 t-1 之差的商。正如我们所看到的,随着时间的推移,这两种发展都趋于平缓。这可能有两个原因:
- 我们正在进入电晕流行的下一个阶段,并离开指数增长阶段
- 的数据质量不够,只有一小部分的实际感染被计算和统计记录。2020 年 4 月 13 日的奇怪异常值支持了这一论点。
为了更好地了解情况,我们现在检查死亡人数。
2.2 死亡事故
基本上情况与确诊病例相同。2020 年 4 月 13 日,据报道死亡人数超过 119,000 人。大多数死亡病例来自我们之前在确诊病例图表中看到的 10 个州。乍一看,曲线看起来比确诊病例更陡,因此我们将对它们进行比较。
我们的印象是正确的:确诊病例的曲线最近比死亡病例的曲线更平坦,但差异并不巨大。如果确诊病例的增长真的放缓,这种发展是合理的,因为人们不是直接死于电晕,而是后来。
2.3 新冠肺炎的地理分布
动画展示了 2020 年 1 月 1 日至 2020 年 4 月 12 日期间新冠肺炎的传播情况。直到 20.02。除了中国之外,只有一个小点,在那之后,首先在欧洲,然后在美国,最后在非洲有了快速的增长。目前,世界上几乎每个地区都受到 Covid 19 的影响。
2.4 结论
让我们简要总结一下主要发现:
- 全世界约有 200 万确诊病例和 119,000 例死亡病例。确诊病例和死亡人数排名前 10 位的国家占大多数。
- 根据目前的数据,利差似乎在有所放缓。
- 几乎世界上的每个地区都受到新冠肺炎的影响
然而,专家认为,未报告的病例数量要高得多,只有一小部分病例得到记录。因此,我们的观察也可能是因为许多国家的检测能力已经耗尽。我们无法用现有的数据材料回答这个问题。为了进一步的调查,我们必须假定现有的数字反映了实际的发展情况。
3.特征工程
在这一章中,我们将尝试时间序列分析的不同方法和技术。如果你对最终预测感兴趣,你可以直接进入第 4.3 章ARIMA。
3.1 国家、州和日期
在这一章中,我们将以这样一种方式准备数据,以便我们能够用各种统计方法进行预测。为此,我们将清理数据并创建要素。特征工程是时间序列分析中一个非常有趣的因素。如果我们假设想要预测确诊病例和死亡人数,我们将只有州、省和日期作为模型的输入。以有意义的方式推断这些数据似乎太少了,但是在本章的后面会有更多的介绍。让我们首先来看看训练和测试数据集。
正如我们在第一章中已经看到的,有一段重叠的时间。本次比赛的规则规定,只有 2020 年 4 月 1 日之前的数据可以用于公共排行榜。由于这个原因,我们从训练数据中删除数据。稍后,我们将使用所有可用的数据来做出最好的预测。
我们已经注意到我们没有很多可用的功能。先把日期搞得有意义一点。算法不能从日期中读取任何东西,所以我们从中提取各种特征,比如日和周。例如,你可以从组合中读出每周趋势。在德国,我注意到,平均而言,周四和周五报告的病例较多,周六和周日明显较少。这可能与报告过程有关:周六和周日,相关办公室的工作人员较少,而且并非所有病例都得到可靠报告。
此外,我们对州和省使用 SciKit 的 LabelEncoder(),因为大多数算法不能对字符串做任何事情。标签编码器为相应列中的每个不同案例分配一个编号。
3.2 确诊病例和死亡——滞后和趋势
如果我们想要预测未来的数据点,目前只有国家、州和日期是已知的。我们没有关于未来确诊病例或死亡人数的信息。不过,我们确有过去个案数目的资料,我们应该利用这些资料。在时间序列分析中,当目标的先前发展(例如确诊病例)被记录为数据集中的特征时,我们称之为滞后。
此外,可以记录趋势,即短期发展。这可以描述为两个连续数据点之间的趋势为(t0 -t1)/ t1。
4.系统模型化
现在我们有了所有必要的函数,数据也相应地准备好了。我们将尝试两种不同的方法:1)线性回归和 2) ARIMA。我们将从线性回归开始。你可以在 SkyCit 这里找到更多关于线性回归的实现和参数的信息。
4.1 线性回归(不用于提交)
与其他机器学习项目不同,我们不能仅仅通过 train-test-split 函数来抽取随机样本,因为数据点在时间上是相互依赖的。因此我们编写自己的函数。在训练数据集中,我们有截至 2020 年 3 月 31 日的可用数据。这是自 2020 年 1 月 22 日(我们数据集中的第一天)以来的第 69 天。我们将训练我们的数据,直到 2020 年 3 月 31 日,然后我们将看到我们的预测与实际发展有多接近。我们将在以下方面有所不同:
- 使用的滞后数
- 我们包括的培训时间
关于线性回归函数的几点说明:
- 我们为每个国家单独训练算法。如果一个国家有几个州,我们也会针对每个州分别进行培训。由于各州处于新冠肺炎疫情的不同阶段,我们将无法使用针对所有数据点训练的算法做出良好的预测。
- 第一步,我们计算各个国家或州的滞后。通过反复试验可以获得正确的滞后次数。太少的滞后会导致对短期趋势的过度解读,太多的滞后意味着我们没有充分考虑短期趋势。
- 然后我们对目标和滞后进行对数运算。线性回归不适合外推指数趋势。对数允许我们的算法更好地解释和处理数据。
注意:滞后的使用产生了一个新问题。这些只适用于我们的训练数据。所以我们只有第一次预测的可用日志。之后,我们必须将该预测写回到训练数据集中,重新计算滞后,并做出新的预测。必须对每个数据点重复这一过程。
**致谢:**实现的大部分代码来自这个伟大的笔记本。我通常也建议阅读它,以获得关于进一步过程的理论假设。
我现在不会显示所有不同参数的结果。您可以在链接的笔记本中亲自测试它们。在下文中,我们将了解以下参数的结果:
- 确诊病例有 40 个滞后
- 死亡 20 次
- 培训开始日期 2020 年 3 月 10 日
确诊病例位于左侧 Y 轴,死亡病例位于右侧 Y 轴。
德国
西班牙
阿尔及利亚
安道尔
4.2 线性回归-结论
对于德国和西班牙,预测最初看起来不错,但可以看出,实际数字和预测之间的差距正在扩大。我们也研究了阿尔及利亚,作为一个迄今病例很少的国家。在这一点上,预测和实际数字也出现了偏差。我选择安道尔是因为到目前为止这里还没有病例。这个预测完全是荒谬的,会毁了我们在卡格尔的整个成绩。我们可以通过硬编码来拦截这种现象,即没有确诊病例的国家将继续被预测为零。相反,我们将继续使用 ARIMA 方法。
4.3 ARIMA(用于提交)
ARIMA 代表自回归(AR)综合(I)移动平均线(MA)。作为输入提供的数据必须是单变量序列,因为 ARIMA 从过去计算未来的数据点。这正是我们试图用线性回归做的。ARIMA 基本上有三个重要参数:
p:模型的自回归部分。简化一点可以说,模型假设如果昨天和前天有很多确诊病例,那么今天和明天也会有很多确诊病例。
描述差异量的模型的集成部分。如果可用的数据不是稳定的并且包含趋势,ARIMA 可以提取这种季节性。
q ->模型的移动平均线部分。通过形成均线,可以平滑随机效应。
重要提示 : ARIMA 无法考虑任何外部因素。数据点仅基于历史数据进行推断。如果在一个州有夜间外出的禁令,我们的模型将而不是提供良好的预测。
功劳:实现的大部分代码来自这个很棒的笔记本。
确诊病例位于左侧 Y 轴,死亡病例位于右侧 Y 轴。
德国
西班牙
意大利
阿尔及利亚
安道尔
伊朗
俄罗斯
中国—上海
中国—北京
美国—纽约
美国—华盛顿
韩国
加纳
南非
4.4 ARIMA——结论
随着时间的推移,对单个国家的预测看起来更加可信。德国等确诊病例较多、历史较长的国家的数据点可以很好地推断出来。如果报告的数据不稳定,比如在上海,我们的算法将无法做出准确的预测。
实施过程相比线性回归也容易得多。提交给 Kaggle 的第一份测试的均方根误差约为 0.4。第 4 周的比赛今天结束,评估阶段开始。我会补充最后的结果。
5.摘要
首先,我们观察了新冠肺炎周围的发展,清理了数据并做了相应的准备。然后我们尝试了两种不同的方法来预测时间序列:1)线性回归和 2) ARIMA。线性回归的结果非常不稳定,预测似乎也不是特别准确。在 ARIMA,我们取得了明显更好和更可信的结果。最终结果评估可能于 2020 年 5 月 15 日进行。然而,测试期间的提交取得了良好的成绩。
尽管这个话题很严肃,但我希望你能带走一些东西。居家健康!
如果你对数据科学感兴趣并且还没有注册,请随时使用我的推荐链接加入这个社区。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
Python 中的全局、局部和非局部变量
在本教程中,让我们学习 Python 中全局、局部和非局部变量的用法
首先,我不是上图中的那个人。我只是一个仁厚的作家,在这里讲一个 Python 编程中最容易混淆的概念“ 全局、局部和非局部变量 ”。我知道看完标题你会想“ 我为什么还要担心这个 ”。嗯,答案是有时候不知道这些微小的事情会让你付出很大的代价。所以事不宜迟,我们开始吧。
在像 C/C++这样的编程语言中,每次同时声明一个变量时,都会分配一个内存,这种分配完全取决于变量的类型。因此,程序员在创建变量时必须指定变量类型。但幸运的是,在 Python 中,您不必这样做。Python 没有变量类型声明。像 C 中的指针一样,Python 中的变量不合法地存储值;它们使用引用来突出显示内存中的对象。
主题
本文将涉及的主题列表如下:
- 变量 —快速介绍
- 全局变量 —如何摆脱
**UnboundLocalError**
- 局部变量 —如何摆脱
**NameError**
- 非局部变量 —何时以及如何使用它们
另外,在开始之前,我必须告诉你一件事。这篇文章的全部代码可以在我的 GitHub 资源库 下面给出:
permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/Tanu-N-Prabhu/Python/blob/master/Global%2C_Local_and_Nonlocal_variables_in_Python.ipynb)
变量
一个变量更可能是一个 容器 来存储值。现在要存储的值取决于程序员是使用整数、浮点、字符串还是 等 。
变量就像计算机内存中的一个盒子,你可以在里面存储一个值。—阿尔·斯威加特
与其他编程语言不同,在 Python 中,你不需要声明或初始化任何变量。 请阅读 本 。
语法
在 Python 中创建变量的一般语法如下所示:
**variable_name**
= **value**
Python 中的**variable_name**
可以简短如**a, b, x, y, ...**
也可以信息量很大如**age, height, name, student_name, covid, ...**
虽然建议保留一个描述性很强的变量名以提高可读性。
规则
一切都设置好了,命名变量时需要遵循一些规则:
- 变量名必须以字母或下划线字符开头**
- 变量名不能以 号 开头
- 变量名只能包含 字母数字字符 和 下划线。 例如,任何类似这样的都是有效的: A-z,0–9,以及 _
- 变量名 区分大小写 ( 高度 、 高度 、 高度 是三个不同的变量名)
例子
下面给出了一个将值正确初始化为变量的示例:
****# This is a valid and good way to assign a value to a variable
# Let's assign values to variables to calculate the area of a circle****pi** = 3.142 **# I could have also used "math" library**
**radius** = 5 **# Interger value for radius
area_of_circle** = 0 **# Used to store the value of area of circle****area_of_circle** = pi * (radius) ** 2 **# Area = (PI * R^2)**print("The area of the circle is: ", **area_of_circle**)**
上面代码的输出如下所示:
**The area of the circle is: 78.55**
图片示例(快速浏览)
我相信只要看到一幅图片或一幅图像,就能更快地理解这些概念。下面是存储在内存中的变量的图示。
作者 Tanu Nanda Prabhu 的照片
作者 Tanu Nanda Prabhu 的照片
全局变量
相同的旧定义
在 Python 或者其他任何编程语言中,全局变量的定义保持不变,就是“ 一个在函数外声明的变量叫做全局函数 ”。我们可以在函数内部或外部访问一个全局变量。
创建一个全局变量并访问它
让我们用上面的例子来理解在函数内部和外部访问变量的概念。
**pi = 3.142 **# I could have also used "math" library (math.pi)**
radius = 5 **# Interger value for radius**def **circle**():
area_of_circle = pi * (radius) ** 2
print("The area of the circle is: ", area_of_circle)
circumference_of_circle = 2 * pi * radius**# Accessing the global variables outside the function** print("The circumference of the circle: ", circumference_of_circle)
**# Accessing the global variables inside the function
circle**()**
上述代码的输出如下所示:
**The circumference of the circle: **31.419999999999998**
The area of the circle is: ** 78.55****
这就是全局变量的特点。如上例所示,我使用了两个常用变量**pi**
和**radius**
来计算在函数内部声明的圆的面积和在函数外部计算的圆周的面积。对于这两种计算,我们使用相同的公共变量。
详细理解“UnboundLocalError”
现在让我们以同样的老例子为例,尝试将**radius**
更新 2(乘以 2)
**pi = 3.142 **# I could have also used "math" library (math.pi)**
radius = 5 **# Interger value for radius**def **circle()**:
radius = radius * 2 **# Update the radius by (x 2)**
area_of_circle = pi * (radius) ** 2
print("The area of the circle is: ", area_of_circle)**circle()** **# Accessing the global variables inside the function****
现在我知道你可能会喜欢“ 没有必要 ”这个额外的步骤**radius = radius * 2**
我们可以在初始步骤中直接这样做,将半径值指定为 10,即**radius = 10**
。我知道,但我正在尝试引入一个概念。请原谅我。
从上面的代码中可以看出,如果您尝试更新半径,然后执行这段代码,您会感到惊讶。不要激动的说“ 我做了 ”因为你没有,反而会被一个叫做**UnboundLocalError**
的错误提示。更有可能的错误是这样的。
****UnboundLocalError**: local variable '**radius**' referenced before assignment**
这个错误的原因是变量**radius**
是局部的,不能像上面那样更新。在这里,你可以把它变成一个全局变量。现在怎么做。请看下面的代码片段。
**pi = 3.142 **# I could have also used "math" library (math.pi)**
radius = 5 **# Interger value for radius**def **circle()**:
**global** radius **# Making raduis a global variable**
radius = radius * 2 **# Update the radius by (x 2)**
area_of_circle = pi * (radius) ** 2
print("The area of the circle is: ", area_of_circle)**circle()****
现在,当您执行代码时,它会顺利执行。因为现在它被明确声明为全局变量。上面代码的输出如下所示:
**The area of the circle is: **314.2****
考验你长远知识的时候到了。两年前在 栈溢出 中有一个关于**UnboundLocalError**
的问题。 表单 现已停止接受答案,因为已经有大量答案。你可以跳进去,试着回答它,更清楚地理解它。
局部变量
相同的旧定义
在 Python 或者其他任何编程语言中,局部变量的定义保持不变,就是“ 在函数内部声明的一个变量称为局部函数 ”。我们可以在函数内部访问一个局部变量,但不能在函数外部访问。**
创建一个局部变量并访问它
我们在函数内部使用局部变量,并不试图在函数外部访问它们。因此得名本地。但好的一面是,我们可以在函数本身中访问这些变量。
***def **circle**(): pi = 3.142 **# I could have also used "math" library (math.pi)**
radius = 5 **# Interger value for radius**
area_of_circle = pi * (radius) ** 2
print("The area of the circle is: ", area_of_circle)
circumference_of_circle = 2 * pi * radius**# Accessing the global variables inside the function
circle**()***
上述代码的输出是:
***The area of the circle is: ** 78.55*****
这就是局部变量的特点。如上例所示,我使用了两个普通变量**pi**
和**radius**
来计算一个函数中声明的圆的面积。所以访问这些变量不会产生任何问题。但是如果我们试图在函数之外访问它们,会发生什么呢?请参见下面的下一节。
详细了解“名称错误”
让我们使用上面的同一个例子,并访问函数中声明的变量:
***def **circle**(): pi = 3.142 **# I could have also used "math" library (math.pi)**
radius = 5 **# Interger value for radius**
area_of_circle = pi * (radius) ** 2
print("The area of the circle is: ", area_of_circle)
circumference_of_circle = 2 * pi * radius**# Accessing the global variables outside the function** print("The circumference of the circle: ", circumference_of_circle)
**# Accessing the global variables inside the function
circle**()***
***当你执行上面的代码时,会出现一个**NameError**
*的提示。更有可能的错误是这样的
*****NameError**: name 'pi' is not defined***
这个错误的原因是因为我们试图在全局范围内访问局部变量**pi**
和**radius**
,而局部变量只在**circle**()
或局部范围内起作用。有一个办法可以解决,把**pi**
和**radius**
声明为全局或者在函数外声明。任何函数都可以访问它们。
非局部变量
相同的旧定义
在 Python 或任何其他编程语言中,我们经常在嵌套函数中使用非局部变量。现在,我所说的嵌套函数是什么意思?
嵌套函数
通常,嵌套函数是在另一个函数内部声明的一组函数。下面是一个嵌套函数的例子。
***def **circle**():
pi = 3.142 **# I could have also used "math" library (math.pi)**
radius = 5 **# Interger value for radius**
area_of_circle = pi * (radius) ** 2 def **circumference**():
**# Formula for circumference** circumference_of_circle = 2 * pi * radius
return circumference_of_circle print(**circumference**()) **# Calling the circumference function** return area_of_circleprint(**circle**()) **# Calling the circle function*****
在执行这段代码时,您将得到以下输出
*****31.419999999999998
78.55*****
创建一个非局部变量并访问它
现在让我们尝试在**circumference**()
中更新半径 2(乘以 2)。我之所以特别坚持这么做,是因为一旦你写了**radius = radius * 2**
并运行代码,你就会得到**UnboundLocalError**
的提示。看到这里,你会说**global radius**
把它变成一个全局变量,但这次你会得到一个新的错误**NameError**
。而现在你会莫名其妙,不知道该怎么办。有一个简单的方法可以解决这个“ 去读一个非局部变量的定义 ”。每当有嵌套函数时,你需要使用一个**nonlocal**
变量。就这样,问题解决了。下面是创建一个非局部变量并访问它的方法。
**def **circle**(): pi = 3.142 ** # I could have also used "math" library (math.pi)**
radius = 5 **# Interger value for radius**
area_of_circle = pi * (radius) ** 2 def **circumference**(): **nonlocal** radius **# Nonlocal variable**
radius = radius * 2 **# Formula for circumference** circumference_of_circle = 2 * pi * radius
return circumference_of_circle print(**circumference**()) **# Calling the circumference function** return area_of_circleprint(**circle**()) **# Calling the circle function****
执行这段代码时,您将得到如下输出
****62.839999999999996
78.55****
结论
这是文章的结尾,标题为“Python 中的全局、局部和非局部变量 ”。我希望你们通过阅读这篇文章学到了一些东西。通过这篇文章,您学习了如何消除两个重要的 Python 错误,如**NameError**
和**UnboundLocalError**
,这两个错误困扰了您很多年。现在,您可以面带微笑地轻松调试这两个错误,而不会流汗。如果您对本文有任何意见或建议,那么评论区就是您的了。敬请关注更多更新,直到那时再见。保持安全和快乐的编码,下次再见。
Python 中全球变暖 Reddit 帖子的 NLP 探索
我们可以一起为社会意识做出贡献,拯救我们星球的未来和子孙后代。(图片由安德烈亚斯·韦思[ 执照 ]拍摄)
变更数据
全球变暖叙事与社会意识的情感分析
全球变暖正日益影响着我们星球的命运。科学证据表明,我们人类是这场灾难的主要原因之一;而且,需要采取严肃的行动来拯救后代。然而,与许多其他社会问题一样,这些行动的有效性在很大程度上取决于社会对忽视这一事实的不幸后果的认识。然而,评估社会意识需要对当前的叙事有深刻的理解。这是一项复杂的任务,因为社会意识既是对个人的输入又是对个人的输出,这种互动采取不同的形式,如电视、广播、在线视频、报纸和基于网络(目前是互动的主要部分)的媒体,如社交网络。Reddit 是一个受欢迎的在线平台,在这个平台上,许多这样的问题正在被个人讨论。正是通过理解社会意识,我们才能及时采取行动。
全球变暖是科学事实!
全球变暖不仅仅是一个阴谋论;但是,这是一个现实,一个科学事实。这已经被来自全球大气温度观测的时间数据的许多报告所证明。随着开发自然的工业能力的增加,温度上升在过去 40 年中加速了(图 1)。
图一。最近大气温度上升(来源:NASA 报告,2020 年)。(图片通过知识共享- 链接到许可 )
介绍
随着社交媒体成为我们日常对话和互动的主要手段,它们对当前的叙事状态有着重要的见解。全球许多人每天都在网上生成内容。仔细研究这些内容可能有助于我们更全面地了解当前辩论状态的根源,或者设计的政策,如气候法案,是否有效。
通过挖掘社交媒体内容,具体来说是 Reddit,我分析了这些辩论和当前的观点状态。虽然 Reddit 用户的人口代表性仍然是一个争论的问题,但它可能是一个很好的代理,也是一个很好的起点,来研究这个争论。
Reddit 是这些在线资源之一,人们通过帖子和评论来表达他们对特定主题的观点。自然语言处理(NLP)是一个强大的计算语言学工具,它可以帮助我们对社会叙事和意识有一个更全面的理解。具体来说,我们可以推断出这些主体在社会中的情感状态。然而,由于这些信息存在于非结构化的文本格式数据中,为了实现机器学习(ML)算法,首先我们需要将文本文档转换成结构化的格式,例如数据帧。
问题陈述
在【全球变暖】子网站的 reddit 用户普遍感到担忧,而在【阴谋理论】子网站的 Reddit 用户对提出阴谋论更感兴趣。这种对立的观点可能是我们 NLP 分析的一个很好的二元目标,以开发一个训练有素的模型,其中的叙事驱动全球变暖的关注。
建模工作流
在这篇博文中,我将带您浏览 subreddit 帖子的 NLP 分析;工作流程(见图 2)分为不同的连续步骤:1-数据收集,2-数据清理,3-文本矢量化和探索性数据分析(EDA),4-建模,最后 5-基于模型结果的建议。这些帖子来自两个拥有超过 3000 名订阅者的热门博客帖子,即全球变暖和阴谋论。我保持步骤 1-3 的简短,并将更详细地解释第 4 和第 5 部分。对于那些对建模步骤的更多细节感兴趣的人,我邀请你访问我的个人 GitHub 档案中的完整存储库。在这个工作流中,我主要使用了 python 中的 Pandas、 scikit-learn 和 NLTK 库。
图二。NLP 建模工作流。(作者图片)
步骤 1-数据收集
我写了一个 python 函数,通过 pushshift Reddit API 获取 subreddits。下面是一段代码摘录(我再次邀请您访问我的个人 GitHub 库以获得完整的代码集):
函数来读取 Reddit APIs
然后,使用这个函数,我导入了 subreddit API。导入的帖子日期在 2020 年 7 月 1 日之前。然后,我将两个数据集合并为熊猫数据帧,并保存到 CSV 文件中。
步骤 2-数据清理
正如非结构化文本数据所预期的那样,数据清理是任何 NLP 项目的劳动密集型部分。在最初处理丢失的值、调整数据类型和删除不必要的列之后,我清理了文本。为了使这篇博文简单易读,我在这里只列举了与应用顺序相关的清理过程:删除所有非字母字符、字符串(通过正则表达式)操作、删除停用词、词干,最后将标记化的文本元素缝合回数据帧,并将其保存为一个干净的 CSV 文件(图 1)。这里,我只包含了我用来清理 DataFrame 的“text_merged”列的一段代码。
清除文本的功能
步骤 3- EDA 和特征工程
对于这种分析,可以定义两类特征,即数字和文本特征。
数字特征与目标的相关系数相对较低(图 3),表明需要更深入地了解目标预测数据,即文本特征。最初,我设计了一些通用功能。第一个工程特征是 【字数】 【在该特征的另一个变体中,也可以定义字符数】。然后我使用“nltk.vader”工具包,根据预先训练好的模型获得 【情绪得分】 。
图 3:两组帖子得分和评论数量之间的关系。(图片作者)
此外,在 EDA 过程中,我发现了 Reddit 分数和评论数量之间的关系(图 3)。对于评论数量相同的阴谋论标签,得分差异很大,这意味着他们的思维不统一或不团结,但阴谋论 Reddits 之间存在叙事异质性。另一方面,全球变暖在这个意义上似乎更一致,也显示出更多的评论,这意味着更倾向于讨论。因此,我设计了一个交互功能,作为评论和分数的乘积,并将其命名为“反应”,因为它是评论和分数的总数,这两者都是读者对作者的反应:
[Reaction] = [Post score] * [Number of comments]
图 4。目标标签和数字特征之间的相关系数。(图片作者)
对数字特征的检查(图 4)表明,分数、情感分数、评论数量是最相关的特征,反应特征也相对较好。因此,正如我们将在模型部分描述的那样,工程特征在预测目标中是重要的。而与文档长度相关的特征如字数(见图 4)相对不相关,这意味着与目标类别无关。想想 Reddit 帖子的问题,这是有道理的,这意味着两个群体都写了长帖子和短帖子。
文本特征需要预处理,例如在探索和特征工程之前的文本矢量化转换。在这里,我使用 cvec 和 tf-idf(从计算的角度来看是首选)来转换文本(使用大小为 1 和 2 的 n 元文法)。除了“英语”单词之外,它还有助于发现和过滤不太有意义的单词,作为一个新的停用词列表。
以下是两个用户使用最多的词:
['year', 'world', 'peopl', 'like', 'make', 'use', 'think', 'could', 'time']
这表明两个用户都倾向于号召人们去思考!这是一个指向特定时间的世界性问题。通过进一步的建模,我们将看到哪些单词实际上指向了最相关的目标。
此外,我添加了一个新的工程功能,并命名为“单词使用侵略性(WUA)”。这个特征仅仅是两个子编辑使用最多的排名最高的 100 个文本标记(单词)之间的欧几里德距离。
图 5。工程用词攻击(WUA)特征。(图片作者)
它只是每个排名靠前的单词之间的标准化单词距离,在单个:
[WUA] = sum(|Distance between top-word indices|)
较高的 WUA 值意味着排名靠前的单词在整篇文章中被分散使用。
图 6。数字特征和目标标签之间的相关性。(图片作者)
当然,这个新特性可以被重新分解成更有趣的格式,比如非结构化的图形,以包含句子间的关系。基于该图,WUA 具有朝向目标值的高权重因子或系数因子。这显示了将 WUA 添加到模型精度的效率。
第 4 步-建模
基于文本特征的模型评估;
由于目标是基于目标列对 Reddit 帖子进行分类[0 表示阴谋论,1 表示全球变暖],因此这个问题变成了二元类分类问题。对于最初的建模尝试,我只选择了文本列作为 X 变量。全球变暖的目标值(Y 变量)是 1 (0)(阴谋论)。导入数据集的缺点之一是阴谋论 subreddit 的帖子较少。为了使类更加平衡,我引导了属于阴谋论目标的行。基于这个平衡的数据集,基线模型精度为 0.5[目标和非目标类的平均分布]。这意味着一个模型允许的最差精度是 50%!然后,我将变量(X)和目标(y)数据分成测试规模为 25%的训练/测试集:
训练/测试分割
在建模步骤中,我尝试了几种分类模型,包括逻辑回归、随机森林、梯度推进、高斯朴素贝叶斯、k-最近邻、支持向量机和神经网络。对于每个模型,我创建了一个管道和网格,在超参数中搜索测试集上的最佳模型分数。最好的结果来自神经网络。例如,在下面的代码中,我展示了一个模型的管道和网格搜索设计:
ML 流水线和网格搜索设计
对单词进行词干处理,并使用 tf-idf 矢量器而不是 CountVectorizer 在一定程度上提高了准确度(最多 3%)。在几个被测试的分类模型中,它们在测试集上具有高于 96%的精度值和高于 92%的召回值。此外,这些模型似乎稍微超出了测试集(作者的<2% difference). From the text vectorizers, tf-idf seemed to be faster and resulted in better scores.
Figure 7. Confusion matrix result from the designed Random Forest classifier ML model. (图片)
基于文本数字特征的模型评估;
为了进一步讨论和分析文本文档中的发现,我进行了逻辑回归,因为它提供了更多的特征重要性的数字意义,并且我可以更好地看到工程特征对当前变量的贡献。基于该模型,以下特征在确定目标标签时是重要的,根据其重要性列出:得分、字数、情感得分、反应和 WUA。WUA 正相关的事实表明,关注度更高的帖子倾向于使用彼此更分散的热门词汇。
此外,我还使用模型的系数矩阵来描述对选择目标标签(包括负面和正面)最有影响的词的一些时间序列特征。
图 8。逻辑回归系数的系数重要性。只有一个数字特征出现,指出了 NLP 在目标预测中的重要性。(图片作者)
请注意,这些是词干,而不是实际的单词。昌、碳、科学家、冰和停止是预测全球变暖目标的最相关特征(词)。此外,为了观察对某些单词的兴趣趋势,我估计了每个帖子数的标准化单词的累积使用量,如图 9 所示。可以看出,自 2019 年以来,似乎有越来越多的关注趋势,然而,阴谋趋势也有所增加,这令人担忧。
图 9。用词推断社会叙事趋势的近期趋势。(图片作者)
过滤全球变暖话题
气候变化是一个首要问题,远远超出了对温度上升的关注,包括臭氧层状况、污染等问题。
[Global warming] ⊆ [Climate change]
我们使用我们训练的全球变暖模型从气候变化子编辑中筛选出与全球变暖特别相关的主题。因此,输入变量是文本文档,目标变量是从训练好的模型中预测的。该模型预测 20%的气候变化帖子是全球变暖的目标。作为一个例子,下面我展示了两个帖子;一个被确定为全球变暖目标,一个被确定为气候变化的非全球变暖问题:
针对全球变暖:“威德尔海海冰五年减少一百万平方公里”
目标为非全球变暖:‘嗨。我想知道我们可以从新冠肺炎疫情吸取什么教训,并应用到我们的气候行动中。特别是企业和政府。先谢谢了。
推荐
基于本项目中提出的工作流程,我们观察了 NLP 和数字特征如何帮助我们分类和识别全球变暖目标帖子,以推断当前的社会叙事。我们模型的几个含义是:
1-在确定一个帖子是否与全球变暖有关时,我们找到了最相关/最不相关的词。“变化”和“碳”被发现是最相关的词。
2-基于工程特征,全球变暖帖子收到更多反应(反应特征)。此外,全球变暖帖子倾向于使用更分散的流行词汇( WUA 专题)。
3-通过时间序列对最具影响力的词的分析,我们发现,自 2019 年以来,关注和阴谋似乎都有增加的趋势。
4-我们能够从更一般的气候变化子编辑中过滤全球变暖主题。
感谢你阅读我的博文。对更多阅读感兴趣?请查看我的 LinkedIn 和 GitHub 简介。
PS。这篇博文是在这个 NLP 工作流的最初开发过程中准备的。未来的尝试将包括改进的方法和指标。
手套研究论文明确解释
http://cf.ydcdn.net/latest/images/wordfinder-background.jpg
直觉理解和数学推导在手套中的应用。
对于数据科学家来说,阅读和理解研究论文是非常重要的,这些研究论文构成了当前 art 模型的基础,无论是在自然语言处理还是在帮助我们解决许多任务的计算机视觉中。它帮助我们思考和理解研究中的内容,这些研究为我们提供了在数据科学之旅中使用的模型和算法。通常研究论文看起来像是数学密集型的脚本,所以我们倾向于完全忽略它们。在我的系列文章中,我将尽可能简要地解释和总结研究论文和其中的数学知识。
这篇文章是关于斯坦福大学的克里斯托弗·d·曼宁、杰弗里·潘宁顿和理查德·索彻撰写的手套研究论文。我鼓励你在这里观看斯坦福大学的 NLP 课程【https://www.youtube.com/playlist? list = ploromvodv 4 rohcuxmzknm 7j 3 fvwbby 42 z
摘要
- 最近的方法已经成功地使用向量来表示单词的语义和句法含义。但是如何捕捉这些含义仍然是一个黑盒子。
- 这项研究的主要目标是找出一个具有必要参数的模型来表示这些意义。
- 这给出了使用全局对数双线性回归模型的范围,该模型结合了两种建模方法的优点,即 全局矩阵分解 和 局部上下文窗口。
- Glove 通过仅对单词-单词全局共现矩阵中的非零元素进行训练,而不是对整个稀疏矩阵或较大语料库中的上下文窗口进行训练,来输出具有有意义的子结构的向量空间。
- 它在单词类比任务中给出了 75%的性能,并且在 NER 和相似性任务中也优于前者。
介绍
- 经典语义模型将句子或语料库中的单词表示为实值向量。这些可以用作任务中的特征,如问题回答系统、信息检索、文档分类、命名实体识别和解析。
- 在早期,这些向量表示的质量是通过为一些已知单词生成的向量之间的距离或角度来评估的。
- 最近,这些矢量表示不仅通过标量之间的距离来评估,还通过每个维度的差异来评估。这为形成类似“国王之于女王,就像男人之于女人”的类比创造了空间。这迫使模型将意义纳入向量的维度。
- 2 研究中使用的主要建模方法有:
- 全局矩阵分解,如潜在语义分析(LSA)。
- 局部上下文窗口模型,如跳格图。
这两种方法都有一些缺点。
- LSA 有效地捕捉统计信息,但它产生的矢量表示很差,在单词类比任务中表现不佳。
- Skip gram 生成更好的向量表示,并且在单词类比任务中表现更好,但是它不会完全利用语料库中存在的统计信息,因为它们在单独的局部窗口而不是全局共现计数上训练。
- Glove 使用全局对数双线性回归模型来生成有意义的向量表示,这些向量表示在单词类比任务中表现得更好。
- Glove 使用加权最小二乘法来训练全局共现计数,并利用语料库中存在的统计信息。
全局矩阵分解方法
- 这些方法使用矩阵分解方法,通过分解大矩阵来获得低秩近似。这些近似捕捉了语料库中存在的统计信息。
- 根据等级和用于形成更大矩阵的方法,捕获的这种类型的信息会有所不同。
- 例如,LSA 使用 word-document 矩阵,其中行代表单词,列代表文档。根据该单词是否出现在文档中,添加 1 或 0。
- 在另一个例子中,超空间语言模拟(HAL)使用单词-单词矩阵,其中的值表示该单词是否存在于另一个单词的上下文中(即存在)。这是失败的,因为它生成了一个不成比例的矩阵,对频繁出现的单词赋予了更大的权重。提出了各种变换来将不成比例的矩阵转换成平衡的矩阵。
基于局部上下文窗口的方法:
- 这些方法通过聚焦于局部的特定上下文窗口来学习单词表示。
- Skip-gram 和 CBOW 基于局部窗口中存在的两个单词的向量之间的内积。
- 在 Skip-gram 中,目标是在给定单词本身(中心单词)的情况下预测单词上下文(周围的单词)。
- 在 CBOW 中,目标是在给定上下文单词(周围单词)的情况下预测单词(中心单词)。
- 基于窗口的方法的主要缺点是它们是局部的,并且它们不查看全局共现,因此它们不能使用语料库中存在的统计信息。因此,他们没有利用语料库中单词的重复。
手套法
无监督算法利用语料库中单词出现的统计信息。这里的问题是“我们如何从这些统计数据中产生意义,以及产生的单词向量如何表示该意义”
让我们考虑一个在研究中使用的例子。
- 与原始概率相比,该比率能够更好地区分相关的词(固体和气体)和不相关的词(水和时尚),并且还能够更好地区分两个相关的词。
- 这个实验证明了同现概率的比率比个体概率做得更好,并且它们是学习更好的单词向量表示的良好起点。
损失函数的推导:
- 上面的例子可以概括为下面给出的函数。
- 这里的 w 代表语境上的词语 w 条代表语境外的词语。
- 在上面的等式中,可以从语料库中计算 RHS。
- f 可以是任何带有未知参数的函数。我们可以向该函数添加一些约束,以便可以学习参数来对单词向量空间中的概率比中存在的信息进行编码。因为目标是找出多维线性向量空间中表示单词的向量。
- 考虑到上面的说法, w i,wj可以用两个词的向量差来表示。所以通过替换我们得到:
- 在等式 2 中,RHS 是标量,LHS 是矢量的组合。为了匹配这两者,我们需要考虑作为向量的参数之间的点积。这里理想的 F 是一个由神经网络创建的复函数。
- 这里我们需要记住,X 是单词-单词共现矩阵,这意味着单词和上下文单词可以互换,短语“在上下文中”和“在上下文外”只是一种表示。即,基于所使用的上下文,单词可以在上下文中或者在上下文之外。
- 考虑到以上几点,我们必须有一个函数 F,它能使我们互换w<=>wbar 和X<=>X转置 而不失去对称性。
- 为了即使在这种交换之后也能达到对称,我们的函数 F 应该遵循一个群同态。https://en.wikipedia.org/wiki/Group_homomorphism。简单地说,同态函数是保持两个群之间代数结构的函数。
- 使用的缺点是,它对所有单词-单词共现给予相等的权重,这导致噪声,因为一些共现具有较少的信息,应该给予较少的权重。
- 提出了一种克服这一缺点的新方法。即使用加权最小二乘回归模型。
- 这里 f 是一个加权函数,用于减少频繁共现项的影响,这是上面讨论的缺点。函数 f 是用 3 个性质构造的。
- 它应该是一个连续函数,当 x → 0 时消失。
- 它应该是非递减的。
- 对于 x 的大值应该输出相对较小的值。
- 这些规则确保在训练单词嵌入时,罕见或频繁的同现值不会被过度加权。
- 有许多函数满足这些约束,Glove 选择了一个限幅幂律来构成函数。
- Xmax**经过不同值的实验,固定为 100,alpha 固定为 3/4。
- 给出了手套和 Skip Gram 模型之间的比较,这将在 Skip Gram 研究论文的下一篇文章中解释。
模型复杂性
- 从损失函数 J 中使用的加权函数可以观察到,计算复杂度取决于矩阵 X 中非零元素的个数。
- 最坏情况的复杂度由 O(|V| ) 给出,其中 V 是词汇量。
模特培训
该模型用 5 个语料库进行训练。
- 2010 年拥有 10 亿代币的维基转储。
- 拥有 16 亿令牌的 2014 年维基转储。
- 拥有 43 亿代币的 Gigaword 5。
- 2014 年 Gigaword 5 和 Wiki dump 的组合拥有 60 亿个令牌。
- 共有 420 亿个令牌用于抓取 web 数据。
对每个语料库执行以下步骤。
- 使用斯坦福分词器对每个语料库进行分词和小写,构建 400,000 个最常用单词的词汇表。
- 构建一个同现计数 x 的矩阵。
- 选择一个上下文窗口,我们还可以在左右上下文之间进行选择。
- 使用递减加权函数来确保非常远的单词对预期包含关于单词彼此关系的不太相关的信息。
使用以下参数。
- X 最大值 = 100 且α= 0.75
- 使用 AdaGrad 对来自 x 的非零元素的随机样本训练模型。
- 最初,学习率为 0.05。
该模型根据单词是在上下文中使用还是在上下文外使用,为每个单词生成 2 组向量 w 和wbar**。一般使用w***+wbar*给出一些性能提升。**
模型分析
- 向量长度和上下文大小
- 下图有助于我们理解向量维数和上下文大小对模型性能的影响。
- 对称上下文:扩展到目标单词左右的上下文窗口。
- 不对称上下文:只向左延伸的上下文窗口。
- 向量大于 200 维时,性能会下降。
- 小的和不对称的上下文窗口在句法任务上表现出更好的性能,因为句法信息主要是从邻近的局部上下文中提取的,并且它也依赖于顺序。
- 较大的窗口尺寸在语义任务上表现出较好的性能,因为语义信息更加非局部化。
- 语料库规模
- 语料库规模越大的模型在句法子任务上表现越好。这是因为更大的语料库中统计信息的增加。
- 对于语义子任务,该模型在较小的语料库中表现出更好的性能,该语料库可能包含更接近的有意义的词类比。
- 模型在不同语料库的 300 维向量上进行训练。
结论
我试图在这篇文章中涵盖所有的细节。我鼓励您阅读本文,以获得各种任务的所有详细模型性能结果以及其他模型之间的比较。
注意:这篇文章的目的是解释研究论文中给出的术语和数学。所以流程和上下文与论文中使用的非常相似。
资源:
在《手套:单词表示的全局向量》一书中,有一部分(第三页的底部)我不…
datascience.stackexchange.com](https://datascience.stackexchange.com/questions/27042/glove-vector-representation-homomorphism-question) [## 群同态
其中等式左边的群运算是 G 的运算,右边的是 h 的运算。
en.wikipedia.org](https://en.wikipedia.org/wiki/Group_homomorphism)
感谢你花时间阅读这篇文章。希望对你有帮助。如果你有任何疑问,请随时联系我。**
使用 Python 和 scikit 进行线性回归-学习库
机器学习
广义线性回归导论
一般来说,机器学习、统计学和应用数学中最常用的工具之一是回归工具。我说的是回归,但是有许多回归模型,这里我将尝试介绍的是众所周知的广义线性回归。这个复杂词背后的思想非常简单:我们试图拟合的观察值应该是输入解释变量的线性组合。在数学上,观测向量被公式化
其中 x ₖ代表解释向量 k ,而 w ₖ是每个解释变量的权重。此外,由于我们通常需要一个截距,按照惯例,我们设置 x ₀ =1 ,因此权重 w ₀代表截距。
线性回归
作为第一个例子,让我们从一个简单的线性回归开始,它包括最小化误差平方和。误差被定义为预期真实值和通过我们的模型获得的预测值之间的差异
线性模型的成本函数
对于所有 m 点 (xᵢ,yᵢ)
为了说明这个简单的例子,让我们使用令人敬畏的库 scikit-learn,特别是包sklearn.linear_model
简单线性回归
我们在这里使用的模型非常简单,它只是一条线。该模型似乎很好,拟合系数为 w₀ =-0.87998 和 w₁=4.54914 ,但误差不为零(示例中均方差= 15.57)。有时,减少残差的一种方法是用稍微复杂一点的模型来改变模型。在我们的例子中,我们简单地拟合了一个 1 次多项式。如果我们增加多项式次数呢?例如,假设我们将度数增加到 12:
多项式次数的影响
正如我们所见,模型的多项式次数越多,残差就越小。然而,在这个例子中尤其明显的是,误差的减小不一定是更好模型的标志。事实上,假设我们使用一个高次多项式作为我们的模型,误差往往是零(实际上这是因为我们有一个多项式次数等于观察次数)。但是,如果我们增加一个额外的观察,我们的模型肯定会经历一个高残差。
结果是
对于 X=15 的残差为**【57.50465854】
对于** X=15 的残差为**【540.59208041】
对于** X=15 的残差为**【23711.11027247】**
正如我们在本例中看到的,在 x = 15 处添加一个观测值会导致多项式次数的误差增加。这种行为被称为过度拟合,即模型非常适合数据,但往往对新数据表现不佳。我们说它遭受巨大的变化。
为了克服这个问题,我们需要选择正确的多项式次数。例如,我们可以将数据集分成两部分,一个训练集和一个测试集。然后,最佳模型将是在测试集上具有最小残差的模型。然而,有一个聪明的方法来限制过度拟合现象:正则化。
正规化
正则化包括向模型添加惩罚,目标是防止过度拟合。它来源于这样的假设,当多项式的次数增加时(举我们的第一个例子),每个多项式的权重也增加。因此,为了克服过度拟合,我们惩罚高权重的单体。最小化函数现在变成了
正则化成本函数
其中|。|通常是 L1 或 L2 范数,而λ是一个超参数,它可以被调整以调节惩罚敏感性(0 表示没有惩罚,即未规范化的模型)。两种广泛使用的正则化方法是 L1 和 L2 正则化,也称为套索和岭回归。
套索
引用 scikit-learn 库的内容
LASSO 在某些情况下很有用,因为它倾向于使用较少参数值的解决方案,有效地减少了给定解决方案所依赖的变量的数量。因此,套索及其变体是压缩传感领域的基础。在某些条件下,它可以恢复非零权重的精确集合。
套索正则化的影响
我们清楚地看到正规化的效果。当我们增加惩罚时,我们强烈限制每个系数的权重,直到只保留截距。但是如何选择合适的参数呢?在这里,我们再次需要查看在不是训练集的集合上计算的残差。这种方法被称为验证。原则是将数据集分成三部分,比如 80%用于训练集,10%用于验证,10%用于测试。在训练集上训练模型,然后使用验证集来选择超参数。最后,使用测试集来估计模型的真实误差。然而,在小数据集上,这种方法不够有效,因为它限制了可用于训练的数据量。对于这样的小数据集,我们可以应用交叉验证的方法。为此,我们将数据集分成两部分,一部分用于训练,另一部分用于测试。然后,对除了一些 k 样本之外的所有训练集执行训练。所以我们假设训练集由 N 个样本组成。我们对 N-k 个样本执行 N/k 次回归,并计算 k 个剩余样本的验证误差。在所有这些回归之后,验证误差是所有验证误差的平均误差。
在 scikit-learn 库中,有一个类实现了这种方法并找到了最佳的超参数:LassoCV。然后,我们重用前面省略了alpha
参数的代码示例,以强制使用LassoCV
模型:
套索正则化的最优解
根据拉索夫模型,最佳超参数 alpha=4.16e⁻⁴.
里脊回归
岭回归与 LASSO 非常相似,不同之处仅在于正则项中使用的范数的阶数。在 LASSO 中,我们使用一阶范数(L1),在岭回归中,我们使用二阶范数(L2)。这种正则化技术的行为是模型的所有结果权重仍然是非空的,但是最终具有非常小的值,使得它们对预测值的影响非常低。相反,LASSO 通过最终将权重设置为空来增加模型的稀疏性,这使得模型解释更容易。岭回归的主要优点是它与乘法因子无关,倾向于高度相关变量的权重相等,而 LASSO 会选择这个或那个。
我们示例的实现与前面的 LASSO 案例非常相似。我们要做的就是把Lasso
和LassoCV
换成Ridge
和RidgeCV
!
山脊正则化的影响
通过交叉验证:
岭正则化最优解
正如我们所见,最终的模型与套索正则化略有不同。如果我们现在看看权重系数:
两种正则化的回归系数比较
结论
在本文中,我们看到了两种正则化技术,以及在尝试拟合模型时使用正则化的重要性。我们还看到,尽管这两种技术非常相似,但却给出了非常不同的结果。事实上,脊技术包括了所有的解释变量,而套索技术产生了一个稀疏的模型,通常更容易理解。然而,LASSO 在高度相关变量的情况下表现不太好,因为它倾向于在结果中产生高度稀疏。这正是我们在示例中尝试用多项式拟合余弦时看到的情况。每个变量都是高度相关的,因此得到的模型有许多零值作为权重系数。除了脊和套索,弹性网格是另一种结合了 L1 和 L2 正则化的有用技术。它允许学习一个稀疏模型,同时它也保持山脊性质。
结束注释
我们简要地讨论了这个主题,但是和机器学习一样,我们需要几个数据集来训练模型、验证模型和测试模型。我们稍微讨论了一下,很快就看到了如何用交叉验证来处理小数据集。
通过启用 spark UI 对 AWS 粘合作业进行高级监控
启用 spark 历史服务器的 Docker 容器,可用于查看粘合作业的 sparkUI
在 Unsplash 上由 Carlos Muza 拍摄的照片
Apache spark 目前是处理大型数据集时不可或缺的框架。大多数处理大量数据的数据工程师和数据科学家在某些时候会利用 spark 功能。
说到对 spark 的理解,20%由代码语法组成,30%是数据工程概念,剩下的 50%是优化
代码语法包括使用函数和语法,数据工程概念反映了 SQL、高效查询构建和创建优化查询和优化的知识包括集群管理的好坏和以最小无序度运行代码、处理不可避免的小文件、优化连接、处理长时间运行的作业、优化倾斜数据集以及利用完整集群。
语法定义和数据工程概念可以随着时间的推移而学习,但是为了优化集群,您需要可视化您的集群如何响应在其上执行的查询。
SparkUI 用于识别长时间运行作业背后的根本原因,可视化 Dag、 OOM 问题、磁盘溢出、过度洗牌、*倾斜数据集、*以及集群的整体运行状况。
要使用 apache spark,我们需要大型集群,但有时,管理这些集群会带来额外的开销。因此,我们开始使用 AWS EMR 或 GCP Dataproc 在云上利用集群,但同样我们需要管理这些集群并充分利用它们。现在,我们需要能够运行 spark 工作负载的东西,并且只为我们使用的东西付费。这就是 AWS 胶水出现的原因。
Aws Glue 是无服务器的,因此我们不需要管理集群或担心与之相关的运行成本。我们只为使用资源的时间付费,一旦我们的工作完成,资源就会被释放。
每一件好事都是有代价的,所以这里的问题是我们不能在优化方面完全配置我们的胶合工作。此外,我们不能实时查看作业的 spark UI,相反,我们需要运行 spark 历史服务器来查看胶合作业的 Spark UI。
要启用 spark UI,我们需要遵循一些步骤:
- 在粘合作业中启用 spark UI 选项。
- 指定将生成日志的 s3 路径。
- 使用 docker 和 EC2 启动 Spark 历史服务器。
- 访问历史服务器上的 spark UI。
为日志生成启用 spark UI
创建一个新作业,并在 monitoring 部分启用 spark UI 选项,并为日志生成提供一个 s3 路径。
为粘合作业启用 spark UI
EC2 上的 Spark 历史服务器设置
我们现在将创建一个 Spark 历史服务器,从中我们可以看到粘合作业的 DAG 和任务详细信息。
相同的文档是:
Dockerfile 文件
我把阿尔卑斯山作为基本图像,因为我希望这个 docker 容器在尺寸上非常精简。
安装 Java 8、Maven 和 bash shell
RUN apk add --no-cache openjdk8
RUN apk add --no-cache maven
RUN apk add --no-cache bash
获取 spark 2.4 并解压缩,因为它包含了启用历史服务器的类
RUN wget [https://archive.apache.org/dist/spark/spark-2.4.3/spark-2.4.3-bin-without-hadoop.tgz](https://archive.apache.org/dist/spark/spark-2.4.3/spark-2.4.3-bin-without-hadoop.tgz)
RUN mv spark-2.4.3-bin-without-hadoop.tgz spark
RUN tar -zxf spark
RUN rm -rf spark
RUN mv spark-2.4.3-bin-without-hadoop/ spark/
将 pom.xml 复制到用于安装依赖项的容器中,并使用 maven 构建它
COPY pom.xml .
RUN mvn dependency:copy-dependencies -DoutputDirectory = /sparkui/spark/jars/
移除 maven 作为构建现在是成功的,并且也移除了冲突的 jar
RUN apk del maven
RUN rm /sparkui/spark/jars/servlet-api-2.5.jar && \
rm /sparkui/spark/jars/jsr305-1.3.9.jar && \
rm /sparkui/spark/jars/jersey-*-1.9.jar
添加端口号来启用历史服务器,您可以根据您的要求更改它。我们需要将属性添加到 spark-defaults.conf 文件中。
您也可以在这里更改端口号。
RUN echo $’\n\
spark.eventLog.enabled true\n\
spark.history.ui.port 18080\n\
’ > /sparkui/spark/conf/spark-defaults.conf
将入口点添加到 docker 容器,该入口点将启用 spark 历史服务器。
ENTRYPOINT [“/sparkui/spark/bin/spark-class”, “org.apache.spark.deploy.history.HistoryServer”]
现在从这个文件构建并运行 docker 容器。
从 Dockerfile 构建 docker 映像:
要从该 Dockerfile 文件构建映像,请运行以下命令:
docker build -t jnshubham/glue_sparkui .
从 DockerHub 中提取现有图像
您还可以从 docker hub 上获取预构建映像。
要提取图像,请运行以下命令:
docker pull jnshubham/glue_sparkui:latest
通过运行以下命令检查下载的图像
docker images
运行 Docker 容器
要运行容器并启动历史服务器,请运行以下命令:
使用访问密钥和秘密密钥运行容器
$ LOG_DIR="s3a://path_to_eventlog/"
$ AWS_ACCESS_KEY_ID="AKIAxxxxxxxxxxxx"
$ AWS_SECRET_ACCESS_KEY="yyyyyyyyyyyyyyy"
$ docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=$LOG_DIR -Dspark.hadoop.fs.s3a.access.key=$AWS_ACCESS_KEY_ID -Dspark.hadoop.fs.s3a.secret.key=$AWS_SECRET_ACCESS_KEY" -p 18080:18080 jnshubham/glue_sparkui
运行配置了 IAM 角色的容器来访问 s3 bucket
$ export LOG_DIR=s3a://bucket_name/logs_path/
$ docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=$LOG_DIR" -p 18080:18080 jnshubham/glue_sparkui
从 EC2 访问历史服务器
要访问历史服务器,请启用安全组入站规则中的端口 18080 以允许流量。
启用端口 18080 的流量
一旦你有一些成功的日志,打开 ip:18080 打开历史服务器,它将显示粘合工作的 spark 用户界面:
现在,您可以可视化生成的 Dag 和查询性能。您还可以跟踪每项任务所花费的时间,然后对其进行优化。
希望你们都喜欢这篇文章。
更多信息,请访问我的 GitHub 或 dockerhub 。
以小见大
外推小时间序列数据集的方法。
作者图片
当我还是一名大学生的最后一年时,我正在为我的研究论文准备和收集足够的数据集,作为我的最后一年项目。我只是随便浏览了一下互联网,瞧!我很快就收集到了我需要的所有数据集。但当我以为我的船一切顺利时,一个北海巨妖出现了——当然不是海怪,但它需要大量的头脑风暴。我一直在收集的数据集太小,无法处理,我说的是 20 到 30 次定期观察,哎呀。你可能会问,你为什么没有意识到仅仅通过观察数量是不够的?好吧,坦率地说,当我看到“少数”数量的观察时,我确实感到有点担心。但是当我意识到这不足以在我研究的模型中实现时,我受到了打击。
经过几个小时,一本书,一杯咖啡,我终于找到了如何处理这些小数据集的灵感,推断,恰当地。起初,我真的认为我的想法会在模型中引起相当大的错误,但谢天谢地,进展顺利,我完成了我的论文。所以在这篇文章中,我想分享我在处理单变量数据集时使用的方法,以及我为多变量数据集开发的一种新方法。
让我们从简单的单变量数据集开始,该数据集具有误差容限(MOE)
提供了 MOE 的数据集在这种外推方法中非常有用,因为 MOE 是决定外推值精确度的关键因素之一。在这种情况下,我将使用从美国人口普查局的表 S1901 中收集的美国年平均收入。有了 MOE,我们可以很容易地得到每年平均收入的最小值和最大值。知道这些值后,我们根据其年度值,通过从均匀(0,1)分布中产生随机变量来外推,以代表平均收入的标准化值。然后,我们使用最小值和最大值将标准化值转换回实际值,如下所示
作者图片
假设我想外推数据集,因为我想重新创建月平均收入,我将需要每年转换 12 个随机均匀变量。这是真实数据集和外推数据集的并排图比较。
外推的(左),真实的(右),作者的图像
正如我们所看到的,增长的趋势仍然存在,只是更嘈杂,因为现在它有每月而不是每年的价值。如果我们检查统计特性之间的差异
统计属性的百分比差异,按作者分类的图像
差别不大:)
无 MOE 的单变量数据集
这个条件就是我之前提到的问题。我对如何获得我正在处理的数据的周期性变化的信息感到困惑。幸运的是,该解决方案只需要两个主要特征:一个符合数据集分布的时间序列模型和一些随机化的标准化值。
在这个例子中,我将使用每月太阳黑子数据集,您可以在这里 获得 。是的,这已经是一个巨大的数据集,所以不需要外推,我说的对吗?但是,假设你只得到过去 3 年的观察数据,并被告知基于这些数据生成过去 3 年的每日值。
1981-1984 年的每月太阳黑子,图片由作者提供
现在**让我们挑选模型。**从一开始,我们就知道这是一个月度数据集。所以我们为什么不选些简单的呢?我们将使用线性季节性回归模型来拟合数据集。结果如下:
作者图片
那非常合适。现在我们将使用这个结果的估计值和标准误差来推断数据。换句话说,如果我们回头看前面的例子,我们可以使用估计值和标准误差分别作为“平均收入”和 MOE。因为我们要生成每日值,所以这些值将根据一个月中的天数以及估计值和标准误差生成—从现在开始,我使用 95%的置信度。以下是推断的每日价值:
作者图片
有一点马上让人感觉不对劲,那就是原始数据集中缺少下降趋势。我这样做是为了展示根据我们正在处理的数据集选择一个合适的模型是多么重要。根据这一结果,我们可以得出结论,线性季节回归模型并不完全适合这一数据集。此外,通过使用回归,我们立即假设数据集中的状态是稳定的,这使得外推值看起来像是稳定的时间序列。
多元数据集
直到最后一个例子,我花了很长时间才想到一种方法来推断一个多元数据集。然而,这里有一种方法。在最后这个例子中,我使用的是来自 Kaggle 的新德里气候训练数据集。
同样,让我们先研究一下数据集。因为我期待变量之间的相关性,所以我将从变量之间的散点图开始。
作者图片
现在,我的眼睛立即转向压力部分,尽管温度和湿度之间存在明显的负相关性。图中有些东西感觉不对劲,我马上意识到这一定是一些异常值,知道一些值与其他值相差很大。我知道我不是这方面气候知识的专家,所以我打电话给我们最好的朋友和万事通,谷歌,帮我找出气压的正常值,它把我送到这里。结果,数值应该在 1013.25 毫巴左右。因此,根据数据集和网站,介于 990 和 1024 之间的压力值将被视为正常。然后,将根据数据集的分布替换异常值。
你可能想知道,这个例子一定有一个转折,因为已经有很多观察了。你猜对了!(真的很抱歉我的老土笑话试图让你的注意力回来 lol)
这里的难点在于,你实际上已经得到了每个变量的月平均值,你需要将它转换回日值。现在,根据我之前给出的最后两个例子,请回答这个问题
有用吗?这样做可能吗?
把你的答案留到本文结尾,我们来看看。
首先,正如我们之前所做的,让我们看看变量之间的散点图。
作者图片
看起来我们的数据集是相互关联的。以下是我从这个情节中看到的:
- 最明确的关系是温度和压强之间的关系,这是负相关。
- 其余的可能有相当适度的相关性,看起来可能符合二次模型。
考虑到这些,我决定为每一对可能的变量创建一个线性和二次回归模型,然后比较它们的 R 平方值和调整后的 R 平方值。此外,我将为每个变量创建一个线性季节回归模型,因为根据下面的图,它肯定有一个季节模式。
作者图片
在进行回归之前,最好对值进行标准化,因为值的变化是不相似的。这是模型拟合的结果:
作者图片
让我们关注变量之间的关系。排除季节性回归结果(第 1-4 行),最高的 R 平方值是二次模型,其中压力为自变量,温度为因变量。而另一个模型似乎不太适合,尽管散点图显示了相关性。幸运的是,季节模型非常适合所有变量。考虑到这些,我的计划是这样的:
作者图片
现在,你一直在等待的时刻,真实值与外推值的比较(蓝线是外推值)。
作者图片
每个外推值都与实际值吻合得很好,而且与温度的关系也不太坏。但是,我们的百万美元问题还没有答案。为了将数值转换回每日数值,我们需要一点数学知识。
作者图片
其中 n 是样本数。然后,我们可以获得月平均值的方差,即
作者图片
其中 Yj^s 是月平均值的标准化版本。最后,我们用这组等式推导出每日值的标准误差:
耶!😃,图片作者
废话不多说,让我们看看每天的外推值是如何得出的。
作者图片
我的第一反应是“这是什么嘈杂的时间序列?这简直是疯了!”。我不认为我们需要解释什么来回答这个问题,这是一个明确的否定,至少使用这种方法。由于我们使用外推数据进行外推,因此外推值噪音太大,并且仅对短期有效。此外,月平均值不像日平均值那样带有“跳跃”,导致外推的日值无法捕捉到它。
结论
- 这种外推方法只能根据计算中使用的数据集来创建值,并且生成的值将遵循数据集的特征。
- 平稳性假设可能会影响检测“跳跃”的能力。因此,更合适的模型可能是生成更合适的外推值的解决方案。
- 即使外推值是完美的,也不意味着它是总体的完美代表。尽管如此,最好还是得到一个对人口可能的估计描述。
下一步是什么?
我可能不是这方面的专家,但我确实学会了创造性地使用时间序列数据集。尽管如此,我还是想听听你的建议,也许能更好地改进这个方法。所以,下面是我对这种时间序列外推法的 GitHub 回购。近期一定会贴出更多的数据科学或精算项目,敬请期待!
[## nicholasatyahadi/时间序列数据集外推法
有时我们会收到少量数据的数据样本。这个小数量可能会受到周期性的影响…
github.com](https://github.com/nicholasatyahadi/Time-Series-Dataset-Extrapolation)