如何使用机器学习对GitHub问题进行分类

154 阅读11分钟

使用机器学习对GitHub问题进行分类

GitHub问题的分类包括分析GitHub问题并使用模型分配标签。在GitHub中,我们有内置的标签,如:bughelp wantedrevision neededenhancementquestion 。我们也有自定义的标签,人们可以创建。

这些标签可以帮助评审员了解某个GitHub问题的状态和进展。这就保证了我们有一个强化的合作。

在对GitHub问题进行分类时,我们将使用拥有不同GitHub问题的数据集来训练一个机器学习模型。该模型将从数据集中学习并能够进行预测。利用这一预测,该模型将能够对一个给定的问题进行分类并分配标签。

例如,如果一个问题需要修订或增强,它将分配enhancementrevision needed 标签。

在本教程中,我们将使用Scikit-Learn库实现该模型。然后,我们将使用[Streamlit GitHub仓库]测试该模型,看看该模型是否能做出准确的预测。

前提条件

要想轻松跟上,读者应该。

  • 知道[Python编程]。
  • 有一些关于[机器学习模型]的知识。
  • 知道一些[自然语言处理]的概念。
  • 知道如何使用[Scikit-learn]的一些算法来构建机器学习模型。
  • 必须使用[Google Colab笔记本],以方便代码重现。

GitHub问题数据集

我们将使用GitHub问题数据集来训练我们的模型。该数据集包含来自流行的GitHub存储库的GitHub问题以及它们各自的标签。我们需要下载数据集,以便我们能够使用它。

要下载该数据集,请运行以下命令。

!wget https://tickettagger.blob.core.windows.net/datasets/dataset-labels-top3-30k-real.txt

注意:我们将使用谷歌Colab来运行代码片段。

下面是下载的数据集的片段。

Downloaded dataset

从上面的图片来看,我们的数据集是文本格式的。

该数据集是无组织的,没有正确的格式。我们的模型将无法轻易理解该数据集。因此,在使用数据集之前,我们需要准备好数据集,并将其正确格式化。

在准备我们的数据集之前,我们将把数据集加载到我们的工作笔记本中。

加载数据集

为了加载数据集,我们将使用pandas 库。让我们导入pandas ,如图所示。

import pandas as pd

Pandas帮助加载数据集和操作数据。

要加载下载的数据集,请使用以下代码。

df = pd.read_csv("dataset-labels-top3-30k-real.txt",header=None)

要查看我们的数据集的结构,使用下面的代码。

df.head()

数据集的输出如下所示。

Loaded dataset

现在我们来准备这个数据集。

数据集准备

我们将首先从数据集中提取标签。这个数据集有三个标签。enhancement,question, 和bug

要提取这些标签,请使用这段代码。

df_new = df[0].str.split(r'(__label__enhancement)|(__label__bug)|(__label__question)',expand=True)

上面的代码将指定我们数据集中的三个标签。要看到这个带有标签的新数据集,请使用这段代码。

df_new.head()

输出结果如下所示。

Dataset with labels

从上面的图片来看,数据集的列数从04

  • 编号为1 的一列代表GitHub上的问题__label__enhancement
  • 编号为2 的一列代表GitHub上的问题__label__bug
  • 编号为3 的列代表GitHub上的问题__label__question
  • 编号为4 的列代表实际的 GitHub 问题(问题的标题)。

创建数据框架

此外,我们需要通过为每个标签创建单独的数据框架来格式化数据集。这将确保我们有三个数据框架。这些数据框架将把我们的数据集组织成行和列。

要创建这三个数据框架,请运行这段代码。

enh_df = df_new[df_new[1] == '__label__enhancement'][[1,4]]
bug_df = df_new[df_new[2] == '__label__bug'][[2,4]]
question_df = df_new[df_new[3] == '__label__question'][[3,4]]

要看一下这三个数据框架的结构,请使用以下代码。

__label__enhancement dataframe
enh_df.head()

这段代码将输出所有的GitHub问题,标签为__label__enhancement ,如下图所示。

Enhancement label

__label__bug dataframe
bug_df.head()

这段代码将输出所有带有__label__bug 标签的 GitHub 问题,如下图所示。

Bug label

__label__question dataframe
question_df.head()

这段代码将输出所有带有__label__question 标签的GitHub问题,如下图所示。

Question label

数据集准备过程中的下一步是添加描述性的列名。

添加列名

目前,数据框架的列是有编号的。相反,我们需要添加描述性的列名,使其更容易被人阅读。

我们为每个数据框架有两列,其中第一列必须命名为label ,第二列命名为description

label 列代表标签,而description 列代表 GitHub 问题。

要添加列名,请使用此代码。

enh_df.columns = ['label','description']
bug_df.columns = ['label','description']
question_df.columns = ['label','description']

我们已经分别准备好了每个数据框,并正确地对它们进行了格式化。现在我们可以把这三个数据框串联起来。这可以确保我们有一个单一的数据框架,便于模型使用。这个单一的数据框架将被正确地标记,并易于操作。

串联数据框架

要联系这些数据框架,请使用这段代码。

df = pd.concat([enh_df, bug_df, question_df])

要查看这个新数据集的结构,请使用这段代码。

df.head()

输出结果如下所示。

Concatenated dataset

我们还需要从标签中删除前缀__label__ 。这使得label 列更容易阅读。

要删除前缀__label__ ,使用这段代码。

df['label'] = df['label'].str.replace('__label__', '')

删除了__label__ 的新数据集,运行这段代码。

df.head()

输出结果如下所示。

New dataset

最后,我们将把数据集从文本格式转换为CSV格式。

将数据集转换为CSV格式

逗号分隔的值(CSV)数据集很容易被模型使用和理解。

df.to_csv("github-issues-dataset-labels.csv")

该代码将把我们的数据集转换成CSV格式。我们现在需要通过删除止损词和将文本转换为小写字母来清理数据集。

文本清理

文本清理将涉及到删除停顿词并将文本转换为小写字母。

停止词是一种特定语言中的常用词。这些词非常常见,在模型训练期间,它们携带的信息很少。去除停顿词可以使模型专注于最重要的词,在训练过程中为模型增加价值。

我们将所有的文本转换为小写字母,以使它们统一起来。为了进行文本清理,我们将使用NeatText

NeatText 是一个Python库,它的内置功能有助于文本清理。让我们安装 ,如图所示。NeatText

!pip install neattext

在安装了NeatText 之后,让我们使用以下代码导入将用于文本清理的函数。

import neattext.functions as nfx

要删除停顿词并将文本转换为小写字母,请使用以下代码。

df['description_clean'] = df['description'].apply(lambda x: nfx.remove_stopwords(str(x).lower()))

从上面的代码来看,nfx.remove_stopwords 方法将被用来删除停止词。lower 方法将被用来将文本转换为小写字母。现在这个数据集已经可以使用了。

添加特征和标签

机器学习的另一个关键步骤是向我们的数据集添加特征和标签。

特征是在训练过程中作为我们模型的输入的所有列。标签是指在预测过程中作为模型输出的列。

我们的特征将是description_clean 列,标签将是label 列。

Xfeatures = df['description_clean']
ylabels = df['label']

上面的代码将添加特征和标签。下一步是将我们的数据集分成两个。这将确保我们有一个数据集用于训练,另一个数据集用于测试。

数据集的分割

为了分割我们的数据集,让我们导入将用于数据集分割的机器学习包。

from sklearn.model_selection import train_test_split

让我们使用train_test_split ,将我们的数据集分成两个。

x_train,x_test,y_train,y_test = train_test_split(Xfeatures,ylabels,test_size=0.3,random_state=42)

在上面的代码中,我们已经指定了test_size=0.3 。这是用来分割我们的数据集的比例,数据集的70% 用于训练,30% 用于测试。

分割数据集后,我们可以开始建立我们的模型。为了建立我们的模型,让我们导入我们将使用的机器学习包。

导入机器学习包

让我们使用以下代码导入所有重要的机器学习包。

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.feature_extraction.text import CountVectorizer

让我们探讨一下每个导入包的功能,如下所示。

DecisionTreeClassifier

这是一种Scikit-learn算法,我们将用它来建立GitHub问题分类模型。

我们选择使用这种算法是因为它将平衡我们的数据集,提高模型的性能。一般来说,使用DecisionTreeClassifier 算法建立的模型有更高的准确率。

准确率_score

我们使用这个包来获得模型在训练后的准确率分数。这是该模型做出准确预测的概率。

CountVectorizer

这个包使机器学习模型能够理解文本。机器学习模型有一个理解和使用原始文本的问题。然而,机器学习模型在处理数字方面工作得很好。

CountVectorizer CountVectorizer将原始文本转换为数字向量。它确保转换后的数字向量代表原始文本。

我们将使用这些包来建立我们的模型。为了使建立我们的机器学习模型的过程更加容易和快速,我们将使用Pipeline 包。

Pipeline 包将用于建立模型的所有阶段和过程自动化。为了使用Pipeline 包,我们将从Scikit-learn导入它。

导入管道包

我们使用以下代码导入该包。

from sklearn.pipeline import Pipeline

为了使用这个Pipeline 包实现模型构建过程的自动化,我们将初始化构建模型的所有阶段。在初始化这些阶段后,它们将被自动化。

我们有以下两个阶段。

  1. CountVectorizer 将输入的文本转换为数字向量。
  2. 使用DecisionTreeClassifier 算法来训练模型。

现在我们可以使用以下代码初始化这两个阶段。

管线阶段

pipe_dt = Pipeline(steps=[('cv',CountVectorizer()),('dt',DecisionTreeClassifier())])

上面的代码已经按顺序初始化了这两个阶段。在初始化这两个阶段后,我们可以将这个管道装入我们的训练集数据集。该管道将从训练集数据集中学习并获得有用的见解。

管线拟合

我们对管道的拟合如下。

pipe_nb.fit(x_train,y_train)

这个过程将训练我们的模型并产生以下输出。

Model output

我们的模型现在已经使用机器学习管道进行了训练。我们现在可以计算这个模型的准确度分数。

计算准确率得分

准确率得分代表了模型做出准确预测的概率。准确率得分越高,模型做出准确预测的机会就越大。

让我们用下面的代码来计算准确率得分。

pipe_dt.score(x_test,y_test)

运行这段代码后,准确率得分显示在下面的输出中。

0.866

这代表86.6% 。使用这个准确率分数,我们的模型有更高的机会做出准确的预测。我们将使用这个模型来进行预测。

进行预测

在进行预测时,我们要测试我们的模型使用三个标签对 GitHub 问题进行分类的能力。该模型将被用来预测一个给定的GitHub问题是enhancementbug ,还是question

为了测试该模型,我们将使用StreamlitGitHub 仓库,看看该模型是否能做出准确的预测。这个仓库有不同的问题,我们的模型可以预测。

我们可以从仓库中提取一些问题(问题标题),以便模型进行预测。

issue1 = "st.file_uploader returns HTTP code 400 with invalid session_id when deployed on Kubernetes"
issue2 = "Cannot set Plotly theme because Streamlit overrides user values"

在提取了这两个特征后,让我们用模型来进行预测。该模型将分析这些问题并提供每个问题的标签。

我们将使用下面的代码来预测第一个问题。

pipe_dt.predict([issue1])

预测结果显示如下。

array(['bug'], dtype=object)

该模型正确地预测了该问题为StreamlitGitHub仓库中的bug

让我们再做一次预测。

pipe_dt.predict([issue2])

预测结果如下。

array(['enhancement'], dtype=object)

该模型正确地预测了该问题是一个enhancement

利用这两个预测,我们的模型可以做出准确的预测。这个模型可以进一步部署并用于生产,对GitHub问题进行分类。

总结

在本教程中,我们学习了如何使用机器学习对 GitHub 问题进行分类。这涉及到使用模型分析开放的GitHub问题并分配标签。

我们从数据集的准备开始,确保我们正确格式化我们的数据集。在这一阶段之后,我们通过删除停顿词和将文本转换为小写字母来清理数据集。

最后,我们使用干净的数据集来建立我们的模型。训练完模型后,我们用该模型进行预测。我们的模型能够预测一个给定的GitHub问题是enhancementbug ,还是question 。这个模型已经可以在生产中部署和使用了。