如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

点击上方关注,All in AI中国

关于如何使用Tensorflow和公共数据集构建预测和应用问题标签的GitHub应用程序的教程。

预告片:构建一个标记问题并将其作为产品发布的模型!

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

从此页面在您的GitHub存储库上安装此应用程序。(https://mlbot.net/)

动机:难以捉摸,完美的机器学习问题

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

找到理想的机器学习问题可能就像寻找宝藏或追逐龙一样

我们作为数据科学家的朋友和同事会将理想的预测建模项目描述为以下情况:

  • 有大量数据,已经标记或可以在其中推断标签。
  • 数据可用于解决实际问题。
  • 问题与您热衷的领域有关,或您想要解决的问题就是您自己提出的,那么您可以成为您的第一个客户。
  • 有一个平台,您的数据产品可以覆盖大量的受众,并提供收集反馈和改进的机制。
  • 您可以用最少的费用和时间来创建它,希望使用您熟悉的语言和工具。
  • 如果产品成功,有一种方法可以将其货币化。

以上列表是有抱负的,数据科学家很幸运遇到了满足所有这些问题的问题(如果我们能找到满足其中一半的问题,作者会感到很幸运!)。

输入GH-Archive和GitHub应用程序:数据遇到机会的地方

今天,我们提出了一个我们认为满足上述标准的数据集、平台和域名!

数据集:GH-Archive

(数据集传送门:https://www.gharchive.org/)

通过从GitHub REST API中摄取大部分这些事件,GH-Archive从GitHub记录大量数据。这些事件以GSON格式从GitHub发送到GH-Archive,称为有效负载。以下是编辑问题时收到的有效负载示例:

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

可以想象,鉴于GitHub上的事件类型和用户数量,有大量的有效负载。值得庆幸的是,这些数据存储在BigQuery中,允许通过SQL接口快速检索!获取这些数据非常经济,因为当您第一次注册帐户时,Google会为您提供300美元,如果您已经拥有一个,那么花费的成本非常合理。

由于数据是JSON格式,因此取消嵌套此数据的语法可能有点不熟悉。我们可以使用JSON_EXTRACT函数来获取我们需要的数据。以下是如何从问题有效负载中提取数据的玩具示例:

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

对于存储在BigQuery上的GH-Archive数据,可以使用示例查询语法。密切注意使用的语法。

有关如何从BigQuery中提取GitHub问题的分步说明可以在本文的附录部分找到,但是,重要的是要注意不仅仅是问题数据,您可以检索几乎任何发生的事情的数据在GitHub上!您甚至可以从BigQuery中的公共存储库中检索大量代码。

平台:GitHub Apps和GitHub Marketplace

GitHub平台允许您构建可执行许多操作的应用程序,例如与问题交互、创建存储库或修复拉取请求中的代码。由于您的应用程序所需的全部内容是从GitHub接收有效负载并调用REST API,因此您可以使用您选择的任何语言编写应用程序,包括python。

最重要的是,GitHub市场为您提供了一种在可搜索平台上列出您的应用程序,并向用户收取每月订阅费用的方法。这是将您的想法货币化的好方法。您甚至可以托管未经验证的免费应用程序,以收集反馈和迭代。

令人惊讶的是,尽管有这些公共数据集,但使用机器学习的GitHub应用程序并不多!提高对此的认识是本文的动机之一。

端到端示例:自动标记机器学习中的GitHub问题

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

自动标记问题有助于组织和查找信息。

为了向您展示如何创建自己的应用程序,我们将引导您完成创建可自动标记问题的GitHub应用程序的过程。请注意,此应用程序的所有代码(包括模型训练步骤)都位于此GitHub存储库中。

第1步:注册您的应用程序并完成先决条件。

首先,您需要设置开发环境。完成本文的步骤1-4。您不需要阅读“Ruby编程语言”部分或步骤4之外的任何步骤。确保设置Webhook秘密,即使该部分是可选的。

请注意,GitHub应用和Oauth应用之间存在差异。出于本教程的目的,我们对GitHub应用程序感兴趣。您不需要过多地担心这一点,但是如果您正在阅读文档,那么最好了解一下两者之间的区别。

第2步:使用python轻松与GitHub API进行交互。

您的应用需要与GitHub API进行交互才能在GitHub上执行操作。在您选择的编程语言中使用预构建的客户端非常有用,以便使生活更轻松。虽然GitHub上的官方文档向您展示了如何使用Ruby客户端,但还有许多其他语言的第三方客户端,包括Python。出于本教程的目的,我们将使用Github3.py库。

作为应用程序与GitHub API连接的最令人困惑的方面之一是身份验证。有关以下说明,请使用curl命令,而不是文档中的ruby示例。

首先,您必须通过签署JSON Web令牌(JWT)来作为应用程序进行身份验证。一旦签署JWT后,您可以使用它作为应用程序安装进行身份验证。在作为应用程序安装进行身份验证后,您将收到一个安装访问令牌,您可以使用该令牌与REST API进行交互。

请注意,作为应用程序的身份验证是通过GET请求完成的,而作为应用程序安装进行身份验证是通过PUT请求完成的。尽管示例CURL命令中说明了这一点,但它是我们在开始时错过的一个细节。

即使您将使用Github3.py库,了解上述身份验证步骤也很有用,因为您可能希望使用请求库自己实现不支持的路由。这就是我们的情况,因此我们最终在Github3.py库中编写了一个名为mlapp的瘦包装器,以帮助我们与问题进行交互,这里定义了问题。

以下是可用于创建问题,发表评论和应用标签的代码。此代码也可在此笔记本中使用。

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

上面的代码在GitHub上创建了这个问题。此代码也可在此笔记本中使用。

您可以在此处查看此代码创建的问题。

第3步:获取并准备数据。

如前所述,我们可以使用BigQuery上托管的GH-Archive来检索问题示例。此外,我们还可以检索人们为每个问题手动申请的标签。以下是我们用于构建所有这些标签的Pareto图表的查询:

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

链接到此查询。此查询生成的数据可在此电子表格中找到。https://docs.google.com/spreadsheets/d/1NPacnVsyZMBneeewvPGhCx512A1RPYf8ktDN_RpKeS4/edit#gid=1679659054

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

来自公共数据集的热门问题标签。有一个非常长的尾巴(这里没有显示)。

此电子表格包含整个帕累托图表的数据。问题标签的长尾不是相互排斥的。例如,增强功能和功能标签可以组合在一起。此外,标签的质量和含义可能因项目而异。尽管存在这些障碍,我们还是决定简化问题并将尽可能多的标签分为三类:使用我们在手动查看前200个标签后构造的启发式方法来进行特性请求、bug和问题。此外,我们咨询了大型开源项目Kubeflow的维护人员,作为我们验证直觉的第一位客户。

我们尝试创建一个名为other的第四个类别,以便对前三个类别中的项目进行负面样本,但是,我们发现信息很嘈杂,因为在这个“其他”类别中存在许多bug、特征请求和问题。因此,我们将训练集限制为可以归类为特征请求、bug或专有问题。

应该指出的是,训练数据的这种安排远非理想,因为我们希望训练数据尽可能地类似于真实问题的分布。然而,我们的目标是以最少的时间和费用构建一个最小的可行产品,并在以后进行迭代,所以我们采用这种方法推进。

最后,我们特别注意去除重复问题。为保守起见,我们解决了以下类型的重复(通过在副本集中任意选择一个问题):

  1. 在同一 repo内以相同标题发行的债券。
  2. 无论标题如何,在其正文中具有相同内容的问题。仅考虑前75%的字符和后75%的字符,就可以删除进一步的重复。

可以使用此链接查看用于对问题进行分类和重复数据删除问题的SQL查询https://accounts.google.com/signin/v2/identifier?service=cloudconsole&passive=1209600&osid=1&continue=https%3A%2F%2Fconsole.cloud.google.com%2Fbigquery%3Fsq%3D123474043329%3A01abf8866144486f932c756730ddaff1%26ref%3Dhttps%3A%2F%2Ftowardsdatascience.com%2F&followup=https%3A%2F%2Fconsole.cloud.google.com%2Fbigquery%3Fsq%3D123474043329%3A01abf8866144486f932c756730ddaff1%26ref%3Dhttps%3A%2F%2Ftowardsdatascience.com%2F&flowName=GlifWebSignIn&flowEntry=ServiceLogin。您不必运行此查询,因为来自Kubeflow项目的朋友已运行此查询,并将结果数据作为CSV文件托管在Google Cloud Bucket上,您可以按照此笔记本中的代码进行检索。原始数据的探索以及数据集中所有字段的描述也位于笔记本中。

第4步:构建和训练模型。

现在我们有了数据,下一步是构建和训练模型。对于这个问题,我们决定借用我们为类似问题构建的文本预处理管道,并在此处应用它。此预处理管道将清除原始文本、标记数据、构建词汇表,并将文本序列填充到相同长度,这些步骤在我们之前的博客文章的“准备和清理数据”部分中进行了概述。此笔记本中概述了完成此问题以解决问题标签的代码。

我们的模型有两个输入:问题标题和正文,并将每个问题分类为bug、特征请求或问题。下面是我们使用tensorflow.Keras定义的模型架构:

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

此笔记本中提供的代码。

关于这个模型的一些注意事项:

  • 您不必使用深度学习来解决此问题。我们刚刚使用了我们为另一个密切相关的问题构建的现有管道,以便快速自我引导。
  • 模型架构非常简单。我们的目标是让事情尽可能简单,以证明您可以使用简单的方法构建真正的数据产品。我们没有花太多时间对不同的体系结构进行调优或试验。
  • 我们预计通过使用更先进的架构或改进数据集,这个模型有很大的改进空间。我们将在本博文的后续部分提供一些提示。

评估模型

下面是一个混淆矩阵,显示了我们模型在三个类别的测试集上的准确性。该模型确实难以对问题进行分类,但在区分bug和特征方面做得相当不错。

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

请注意,由于我们的测试集不能代表所有问题(因为我们只将数据集过滤到了我们可以分类的那些),因此上面的准确度指标应该有所保留。我们通过收集用户的显式反馈来缓解这个问题,这使我们能够非常快速地重新训练模型和调试问题,我们将在后面的部分讨论显式反馈机制。

做出预测

以下是玩具示例的模型预测。此笔记本中提供完整代码。(https://github.com/hamelsmu/MLapp/blob/master/notebooks/Issue_Labeling_Model.ipynb)

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

我们希望选择合理的阈值,这样模型不会向人们发送过多不正确的预测的垃圾邮件(这意味着我们的应用程序在某些情况下可能不会提供任何预测)。我们通过在几个repos上测试我们的系统,并以可接受的误报率与几个维护者协商来选择阈值。

步骤5:使用Flask响应有效负载。

现在你有了一个可以进行预测的模型,以及一种以编程方式为问题添加注释和标签的方法(步骤2),剩下的就是将各个部分粘合在一起。您可以通过以下步骤完成此操作:

  1. 启动一个web服务器,它侦听来自GitHub.com的有效负载(您在步骤1中指定了注册应用程序时GitHub将发送有效负载的端点)。
  2. 验证有效负载是否来自GitHub(由此脚本中的verify_webhook函数说明)。
  3. 如果需要,可以使用GitHub API(您在步骤2中了解到的)响应有效负载。
  4. 将您收到的适当数据和反馈记录到数据库中,以便进行模型再训练。

实现这一目标的一个好方法是使用像Flask这样的框架和像SQLAlchemy这样的数据库接口。如果您已熟悉flask,则下面是代码的截短版本,当GitHub通知已打开问题时,该代码应用预测的问题标签:

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

如果您不熟悉Flask或SQLAchemy,请不要担心。您可以通过Flask、HTML、CSS和Javascript上的精彩MOOC了解有关此主题的所有信息。如果您是数据科学家,本课程是一项非常好的时间投入,因为这将允许您以轻量级方式为数据产品构建界面。我们学习了这门课程,并对此印象深刻。

我们将它作为练习让读者浏览我们的GitHub存储库中的其余部分代码。

收集明确的用户反馈

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

如上所述,通过要求用户对prediction或react对预测作出反应来请求显式反馈。我们可以将这些反应存储在一个数据库中,这样我们就可以重新训练和调试模型。这可能是将数据产品作为GitHub应用程序启动的最激动人心和最重要的方面之一!

您可以在我们的应用主页上看到更多预测和用户反馈的示例。例如,这是kubeflow / kubeflow repo的页面:

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

请安装这个应用程序,它是免费的!

如果您喜欢到目前为止所阅读的内容并希望支持此项目,请在您的公共存储库上安装此应用程序(此应用程序即使安装在此处也不会对私有存储库进行预测),并在进行预测时提供我们的机器人反馈。

结论:构建自己的机器学习驱动应用程序的提示

  • 不要害怕使用公共数据集。您可以做的不仅仅是标签问题。
  • 即使解决方案不完美,也不要害怕快速迭代。构建模型有时是项目的最小组成部分,获得用户反馈非常有价值,因此您不必浪费时间。
  • 尝试咨询至少一个真实的客户或用户,让他们指导和验证决策。
  • 利用机会收集明确的用户反馈。这样您就可以快速改进解决方案和模型。

第二部分和后续步骤

我们未涉及的一个方面是如何大规模地为您的应用程序提供服务。当您刚刚开始时,您可能不需要担心这一点,并且可以在您喜欢的云提供商的单个服务器上提供此服务。您还可以使用像Heroku这样的服务,该服务在下面的资源部分链接的Flask课程中有介绍。

在第二部分中,我们将介绍以下内容:

  • 如何在Kubernetees上部署Flask应用程序,以便可以扩展到许多用户。
  • 使用Argo管道来管理模型训练和服务管道。

我们相信有很多机会可以改进我们在这篇文章中说明的方法。我们想到的一些想法是:

  • 构建不属于标签集的项目的更好标签和负样本。
  • 使用fastai的工具来探索最先进的架构,例如Multi-Head Attention。
  • 在大型语料库上进行预训练并在GitHub上进行微调,以使用户能够预测特定于报表的标签,而不是一组小的全局标签。
  • 使用其他数据,例如有关存储库或打开问题的用户的信息,也许可以学习如何嵌入这些实体。
  • 允许用户自定义标签阈值和标签名称,以及选择要预测的标签。

如何利用机器学习自动化GitHub上的任务以获得乐趣和利润?

编译出品

相关推荐