使用 PyCaret 在 Python 中进行 NLP 文本分类
上次更新时间
这篇文章有帮助吗?
上次更新时间
这篇文章有帮助吗?
在本文中,我们将通过两种不同的 Python 方法演示一个 NLP 分类问题
1-传统方法:在此方法中,我们将
使用不同的 NLP 技术预处理给定的文本数据
使用不同的嵌入技术嵌入处理后的文本数据
基于嵌入的文本数据,构建来自多个 ML 家族的分类模型 - 查看不同模型的性能,然后调整一些选定模型的超参数
最后,查看调优后模型的性能。显然,在 Python 中这样做意味着要编写数百行代码,可能需要至少两到三个小时的时间。
2- PyCaret 方法:一种新方法,我们使用一个低代码 Python 库 PyCaret 来完成上述传统方法中的所有工作,但我们编写的代码少于 30 行,并且在几分钟内就能获得结果和洞察。
为了让你了解这两种方法的区别,请看下面的粗略比较表
你可以看到,PyCaret 方法提供了更多解决方案和功能,而且花费的时间和精力更少!
正如你可能已经发现的,这个问题分为两个阶段:对原始文本数据进行 NLP 处理,然后对处理后的文本数据进行分类。
现在让我们开始看看这两种方法!我将在本文底部分享我的代码的 Github 链接。
在预处理之前,我们将把 *Flag *列从分类数据类型转换为数值数据类型。结果数据集如下所示
接下来,在预处理步骤中,我对文本数据执行了以下操作:- 移除 HTTP 标签 - 将大小写转为小写 - 移除所有标点符号和 Unicode 字符 - 移除停用词 - 词形还原(将单词转换为其词根形式,同时考虑与该单词相关的相关词性)
执行完上述所有 5 项操作后,数据集如下所示
在开始嵌入之前,对最常见词和最罕见词进行快速探索性分析可能会让我们了解垃圾短信(Spam)和正常短信(Ham)之间可能存在的区别。
通常,这种探索性分析有助于我们识别和移除预测能力很弱的词(因为这些词出现频率很高)或可能给模型带来噪声的词(因为这些词出现频率太低)。但是,我没有从处理后的文本数据中删除任何其他词,而是直接进入了嵌入阶段。
我在这里使用了两种嵌入技术。a. 词袋(Bag of Words)方法:此方法创建一个术语-文档矩阵,其中每个唯一的词/术语都成为一个列。在 Python 中,我们使用 *CountVectorizer() *函数进行 BoW 嵌入。
b. 词频-逆文档频率(Term Frequency-Inverse Document Frequency)方法:此方法创建一个术语-文档矩阵,其中对矩阵中的每个术语应用一定权重。权重取决于单词在文档和整个语料库中出现的频率。在 Python 中,我们使用 *TfidfVectorizer() *函数进行 TF-IDF 嵌入。
在决定构建哪些模型之前,我将数据分割,其中 85% 的数据(4737 行)用于 训练数据集,其余 15%(837 行)用于 测试数据集。测试数据集允许我们评估模型在未见过的数据上的性能
这里,我构建了来自四个随机决定的 ML 家族的分类模型:随机森林分类器(Random Forest Classifier)、Adaboost 分类器、梯度提升分类器(Gradient Boosting Classifier)、朴素贝叶斯分类器(Naive Bayes Classifier)。
我首先在 BoW 嵌入的数据集上构建了上述模型,然后在 TF-IDF 嵌入的数据集上构建。
使用的模型性能指标有:混淆矩阵(Confusion Matrix)、准确率得分(Accuracy Score)、精确率得分(Precision Score)、召回率得分(Recall Score)和 ROC-AUC 得分。
我在此只分享在 BoW 嵌入的数据集上构建的基础模型(超参数未调优)的结果。我在我的 Github 仓库中分享了在 TF-IDF 嵌入的数据集上的模型性能结果。你可以在下面提供的链接中查看
为了方便起见,我对在 BoW 嵌入的数据集上构建的模型进行了超参数调优。对 *TF-IDF *嵌入的数据集上的模型进行同样的调优需要重复和添加大约 30-40 行代码。
我进一步决定对 *随机森林分类器 *和 *Adaboost 分类器 *模型进行超参数调优,因为这两个模型似乎比其他两个模型表现更好。对于超参数调优,我使用了 Grid-Search 方法。
使用了与之前相同的模型性能指标:*混淆矩阵、准确率得分、精确率得分、召回率得分、ROC-AUC 得分。*结果还显示了调优后的超参数值,以及调优后模型的准确率得分的 10 折交叉验证值。
以下是调优后模型的性能结果
比较两个调优后的模型,AdaBoost 分类器在交叉验证准确率得分上表现更好。
现在让我们探索 PyCaret 方法..!
我们将重复传统方法中执行的所有步骤,但你会注意到这种方法有多么快捷和容易。
在 PyCaret 中执行任何 ML 实验之前,你必须设置一个 PyCaret 模块环境。这使得多次进行的 ML 实验具有可复现性、可扩展性和可部署性。你可以看到,只需要 2 行命令即可完成此操作。
这个函数的优点在于它会自动对你的原始文本数据执行所有 NLP 预处理操作(大小写转小写、移除所有标点符号和停用词、词干提取、词形还原以及其他操作)。整个步骤在 21 秒内完成!
PyCaret 目前只支持主题建模嵌入技术。在本例中,我们将使用潜在狄利克雷分配 (LDA) 技术和*非负矩阵分解 (NMF) *技术进行嵌入。因此,这不会是“苹果对苹果”的比较,因为我们在传统方法中使用了BoW 嵌入和 TF-IDF 嵌入
在 PyCaret 中,嵌入过程要容易得多。你在下面的代码片段中可以看到,我们只需要 2 行代码即可嵌入处理后的数据。默认情况下,nlp 模块的 create_model() 会创建 4 个主题。你可以通过在此函数中传入所需的数值来更改主题数。
使用相同的 2 行代码,但更改模型参数,你可以创建带有NMF嵌入的数据集。
此外,PyCaret 在此阶段还提供了多个图表选项用于探索性数据分析。同样,你只需要 1 行代码即可完成此操作。不过,必须注意的是,探索性数据分析是基于嵌入阶段创建的*主题*进行的。
NLP 之后,整个问题的第二部分是分类。因此,我们需要不同的设置环境来执行分类实验。
我们将在LDA 嵌入的数据集和NMF 嵌入的数据集上构建模型。然而,我们将不得不从两个嵌入的数据集中删除不必要的变量(*SMS、Dominant Topic *等),以便在其上构建分类模型。
我们使用 PyCaret 的 *nlp *模块进行 NLP 操作,类似地,我们使用 PyCaret 的分类(classification)模块处理问题的分类部分。设置分类模块只需要 2 行代码。此外,我们还必须指定目标变量(Target Variable)和训练-测试分割(Train-Test split)比例。
就像在 *nlp *设置中会自动执行预处理操作一样,在 *classification *设置中,PyCaret 会根据数据自动创建新特征并执行其他预处理步骤!
如果你觉得设置 PyCaret 环境和获取自动化特征工程很简单,那么模型构建甚至更简单!你只需编写一个命令即可查看结果!
你可以看到 PyCaret 自动构建了来自 18 个不同 ML 分类家族的基础模型,并按准确率得分的降序排列了最佳的 15 个模型。它进一步指出哪个模型在特定性能指标上表现最佳(指标得分高亮显示为黄色)。
所有这些只需 1 个命令即可完成,结果在大约 1 分钟内就出来了!
我们看到随机森林分类器模型在*准确率*方面表现最佳。让我们调优随机森林分类器模型。
这在 PyCaret 中是一个 3 步过程:创建一个模型,调优它,评估其性能。每个步骤只需要 1 行代码!
调优在 LDA 嵌入数据集上构建的随机森林分类器:
在下面的输入-输出片段中,每个步骤只需要 1 行代码。
要创建一个随机森林分类器模型,你必须传递‘rf’值
你可以观察到调优后模型的指标优于基础模型的指标
PyCaret 提供了 15 个评估图。点击这 15 个标签中的任意一个,选择你想要用于获取更多洞察的评估图。
我重复了相同的过程来调优在NMF 嵌入的数据上构建的模型。这次我对一个*Extra Trees Classifier *模型进行了一些更改。
在设置了新的环境后,compare_models() 的结果显示 *Extra Trees Classifier *模型表现最好,因此我决定对其进行调优。
在这里,我重复了我对 LDA 嵌入数据所遵循的相同步骤:*create_model(),*然后是*tune_model(),*最后是evaluate_model()。你可以观察到,要创建和调优 *Extra Trees Classifier *模型,你必须传递‘et’值。这次我决定在调优超参数时优化 *AUC 值*而不是准确率得分。要这样做,我必须传递*‘AUC’ *值。
可以看出,与传统方法相比,PyCaret 提供了更多选项和功能的解决方案,代码行数更少,执行时间也更短。
我还要指出,比较传统方法的模型性能结果与 PyCaret 方法的模型性能结果并不是“苹果对苹果”的比较,因为两种方法对文本数据使用了不同的嵌入技术。我们将不得不等待 PyCaret nlp-module 的新版本,该版本支持传统方法中使用的嵌入技术。
然而,根据业务问题,重要的是要看到 PyCaret 方法节省的时间和精力以及获得的洞察选项比在传统方法下将评估指标值提高几个小数点更有价值。
这里再次给出粗略的比较表,突出显示这两种方法的主要区别。
感谢阅读本文。祝你学习愉快!
这里的任务是识别给定的短信是垃圾短信还是正常短信。以下是原始数据的一瞥,你可以从这里找到原始数据.* 数据集包含 5574 条短信需要分类。