我们过去的两个案例研究专注于完全不同的领域,但有一个共同的重要组成部分:我们处理的是结构化表格数据。在接下来的两个案例研究中,我们将看到特殊情况,需要采用特定的特征工程技术来实现机器学习。在这个案例研究中,我们将探讨自然语言处理(NLP)领域的技术,这是机器学习的一个分支,专注于处理原始文本数据。
正如在前几章中讨论的那样,非结构化数据非常普遍,数据科学家通常需要在非结构化数据(如文本和图像)上执行机器学习任务。常见的NLP任务之一是执行文本分类或文本回归,其中的目标是仅基于原始文本执行分类或回归。
图5.1包含了三种不同的文本分类示例。第一个示例——“我喜欢这家餐厅!”——是常见的情感分析,其目标是预测文本是积极的还是消极的。第二个示例——LIMITED OFFER, BIG WINNER, OPEN NOW!!!11!!——是一个垃圾邮件分类任务,通常用于电子邮件主题行。最后一个示例展示了家庭自动化系统如何根据语音命令转换为文本来决定用户要求执行的任务。
在深入研究自然语言处理和该领域的特征工程技术之前,我们应该先了解一些基本术语。在本章中,我将把文档称为长度可变的文本片段。文档可以是电影评论、推文、研究论文——实际上可以是任何东西!文档是我们NLP模型的主要输入。当我们有一组文档时,我们称这个集合为语料库(图5.2)。
有无限多的自然语言处理问题,因为作为人类,我们通过语言进行自然交流。我们期望我们的机器学习驱动系统能够解析我们的语言并根据需要执行任务。问题在于机器学习模型无法处理和学习来自长度可变的原始字符串。机器学习模型期望以观察到的形式接收具有固定长度特征向量的数据。为了进行任何形式的自然语言处理,我们需要将文本转换为特征向量的形式,如图5.3所示。
让我们来看一下我们案例研究的数据集。
警告:本章包含一些运行时间较长的代码示例,特别是在后面涉及到自动编码器和BERT时。请注意,一些代码示例可能在本书的最低要求上运行超过一小时。
推文情感数据集
我们在这个案例研究中使用的数据集来自Kaggle竞赛,名为Twitter美国航空公司情感(www.kaggle.com/crowdflower…)。我们稍微修改了数据,以使不同情感类别更加平衡,如下所示。
import pandas as pd ❶
import numpy as np ❶
tweet_df = pd.read_csv('../data/cleaned_airline_tweets.csv') ❷
tweet_df.head() #Bp
和其他章节一样,我们将假设我们对预测模型几乎没有控制权。事实上,每当我们尝试新的特征工程技术时,我们都会将该技术与逻辑回归进行对比,并对单个逻辑回归参数进行网格搜索。提醒自己为什么要这样做,我们的目标是找到将文本表示为结构化数据的最佳方法,我们要确保如果我们的ML管道性能提高,这是由于我们的特征工程工作,而不是我们依赖ML模型的学习能力。
虽然我们的数据集没有太多可以探索的内容,但查看一下数据是个好主意,以了解文本列和响应标签。为此,让我们介绍一个名为pandas profiling的新包。pandas profiling包提供了一个报告,用于快速描述和探索数据,以加快ML工作的分析阶段。它可以为我们提供每列的描述,包括定量和定性数据,以及其他信息,如缺失数据的报告、文本长度的直方图等等。让我们看一下探查工具提供的报告,如下所示。
from pandas_profiling import ProfileReport
profile = ProfileReport(tweet_df, title="Tweets Report", explorative=True)
profile
运行此代码将生成我们数据的报告,其中包含一些关键信息。例如,在“Categories”选项卡中的“text”列的“Toggle Details”下,我们有一个文本长度的直方图,显示了文本长度大致呈正态分布,长度在140个字符左右有一个峰值(图5.5)。
我们还可以看到响应标签情感的分布。它显示了我们的数据在情感方面相当平衡,而且我们的空准确度(分类的基准指标,通过猜测最常见的类别可以达到的准确度)仅占数据的34.9%(图5.6)。这应该很容易超越。我们的目标是创建一个机器学习系统,可以接收一条推文并预测其中的三个类别之一。
在继续之前,让我们将数据集分成训练集和测试集,这样我们可以使用它们来自信地比较我们的特征工程工作。
注意:我们将始终在训练集上训练我们的特征工程系统,然后将它们应用于测试集,就好像测试集是尚未见过的全新数据一样。
作为提醒,我们将按照几乎每个案例研究中的方式将数据拆分为80/20的训练/测试拆分。我们还将为可复现性设置一个random_state(以便获得相同的拆分),并在我们的类标签sentiment上进行分层,以便训练集和测试集具有与整体数据相同的类标签分布。让我们在以下代码中看到这一切。
from sklearn.model_selection import train_test_split
train, test = train_test_split(
tweet_df, test_size=0.2, random_state=0,
stratify=tweet_df[‘sentiment’]
)
print(f'Count of tweets in training set: {train.shape[0]:,}')
print(f'Count of tweets in testing set: {test.shape[0]:,}')
Count of tweets in training set: 3,088
Count of tweets in testing set: 772
现在我们有了训练集和测试集,现在是时候讨论如何通过一种称为向量化的过程将我们的文本转换为ML算法可以处理的形式了。
问题陈述和定义成功
我们在这里进行了另一项分类工作。我们的模型目标可以总结为以下问题:给定一条推文的文本,我们是否可以找到将文本表示为特征并准确分类推文情感的方法?
本案例研究的目标是找到不同的方法将我们的推文转化为可供机器理解的特征,并使用这些特征来训练一个模型。为了更好地确定哪些特征工程技术对我们最有帮助,我们将坚持使用简单的逻辑回归分类器。通过这样做,我们可以更有信心地认为我们管道性能的提升主要是由于我们的特征工程工作。