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

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

DPACN建筑设计 常用建材

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

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

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

有大量数据,已经标记或可以在个中推断标签。
数据可用于办理实际问题。
问题与您热衷的领域有关,或您想要办理的问题便是您自己提出的,那么您可以成为您的第一个客户。
有一个平台,您的数据产品可以覆盖大量的受众,并供应网络反馈和改进的机制。
您可以用最少的用度和韶光来创建它,希望利用您熟习的措辞和工具。
如果产品成功,有一种方法可以将其货币化。

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

输入GH-Archive和GitHub运用程序:数据碰着机会的地方

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

数据集:GH-Archive

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

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

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

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

对付存储在BigQuery上的GH-Archive数据,可以利用示例查询语法。
密切把稳利用的语法。

有关如何从BigQuery中提取GitHub问题的分步解释可以在本文的附录部分找到,但是,主要的是要把稳不仅仅是问题数据,您可以检索险些任何发生的事情的数据在GitHub上!
您乃至可以从BigQuery中的公共存储库中检索大量代码。

平台:GitHub Apps和GitHub Marketplace

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

最主要的是,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上创建了这个问题。
此代码也可在此条记本中利用。

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

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

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

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

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

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

我们考试测验创建一个名为other的第四个种别,以便对前三个种别中的项目进行负面样本,但是,我们创造信息很喧华,由于在这个“其他”种别中存在许多bug、特色要乞降问题。
因此,我们将演习集限定为可以归类为特色要求、bug或专有问题。

该当指出的是,演习数据的这种安排远非空想,由于我们希望演习数据尽可能地类似于真实问题的分布。
然而,我们的目标因此最少的韶光和用度构建一个最小的可行产品,并在往后进行迭代,以是我们采取这种方法推进。

末了,我们特殊把稳去除重复问题。
为守旧起见,我们办理了以下类型的重复(通过在副本集中任意选择一个问题):

在同一 repo内以相同标题发行的债券。
无论标题如何,在其正文中具有相同内容的问题。
仅考虑前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定义的模型架构:

此条记本中供应的代码。

关于这个模型的一些把稳事变:

您不必利用深度学习来办理此问题。
我们刚刚利用了我们为另一个密切干系的问题构建的现有管道,以便快速自我勾引。
模型架构非常大略。
我们的目标是让事情尽可能大略,以证明您可以利用大略的方法构建真正的数据产品。
我们没有花太多韶光对不同的体系构造进行调优或试验。
我们估量通过利用更前辈的架构或改进数据集,这个模型有很大的改进空间。
我们将在本博文的后续部分供应一些提示。

评估模型

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

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

做出预测

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

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

步骤5:利用Flask相应有效负载。

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

启动一个web做事器,它侦听来自GitHub.com的有效负载(您在步骤1中指定了注册运用程序时GitHub将发送有效负载的端点)。
验证有效负载是否来自GitHub(由此脚本中的verify_webhook函数解释)。
如果须要,可以利用GitHub API(您在步骤2中理解到的)相应有效负载。
将您收到的适当数据和反馈记录到数据库中,以便进行模型再演习。

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

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

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

网络明确的用户反馈

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

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

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

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

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

不症结怕利用公共数据集。
您可以做的不仅仅是标签问题。
纵然办理方案不完美,也不症结怕快速迭代。
构建模型有时是项目的最小组成部分,得到用户反馈非常有代价,因此您不必摧残浪费蹂躏韶光。
考试测验咨询至少一个真实的客户或用户,让他们辅导和验证决策。
利用机会网络明确的用户反馈。
这样您就可以快速改进办理方案和模型。

第二部分和后续步骤

我们未涉及的一个方面是如何大规模地为您的运用程序供应做事。
当您刚刚开始时,您可能不须要担心这一点,并且可以在您喜好的云供应商的单个做事器上供应此做事。
您还可以利用像Heroku这样的做事,该做事不才面的资源部分链接的Flask课程中有先容。

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

如何在Kubernetees上支配Flask运用程序,以便可以扩展到许多用户。
利用Argo管道来管理模型演习和做事管道。

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

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

编译出品