解决文本分类问题的一些机器学习最佳实践
优采云 发布时间: 2020-08-08 11:13第2步: 浏览数据
建立和训练模型只是整个过程的一部分. 如果您能够提前了解数据特征,那么对于后续的模型构建(例如更高的准确性,更少的数据和更少的计算资源)将大有裨益.
加载数据集
首先,让我们将数据集加载到Python中:
def load_imdb_sentiment_analysis_dataset(data_path,seed = 123):
“”“加载IMDb电影评论情感分析数据集.
#个参数
data_path: 字符串,数据目录的路径.
seed: int,随机数的*敏*感*词*.
#返回
一组训练和验证数据.
培训样本数量: 25000
测试样本数: 25000
类别数: 2(0负,1负)
#个引用
Mass等,
从以下位置下载并解压缩归档文件:
〜amaas / data / sentiment / aclImdb_v1.tar.gz
“”“
imdb_data_path = os.path.join(data_path,'aclImdb')
#加载训练数据
train_texts = []
train_labels = []
对于['pos','neg']中的类别:
train_path = os.path.join(imdb_data_path,'train',类别)
对于已排序的(os.listdir(train_path))中的fname:
如果fname.endswith('. txt'):
以open(os.path.join(train_path,fname))作为f:
train_texts.append(f.read())
train_labels.append(0if category =='neg'else1)
#加载验证数据.
test_texts = []
test_labels = []
对于['pos','neg']中的类别:
test_path = os.path.join(imdb_data_path,'test',category)
对于已排序的(os.listdir(test_path))中的fname:
如果fname.endswith('. txt'):
以open(os.path.join(test_path,fname))作为f:
test_texts.append(f.read())
test_labels.append(0if category =='neg'else1)
#随机排列训练数据和标签.
random.seed(*敏*感*词*)
random.shuffle(train_texts)
random.seed(*敏*感*词*)
random.shuffle(train_labels)
返回((train_texts,np.array(train_labels)),
(test_texts,np.array(test_labels)))
检查数据
加载数据后,最好一一检查它们: 选择一些样本并手动检查它们是否符合您的期望. 例如,对于示例中使用的电影评论数据集,我们可以输出一些随机样本来检查评论中的情感标签和情感是否一致.
“一个十分钟的故事必须讲两个小时. 如果没什么大不了的话,我会起身离开的. ”
这是在数据集中标记为“否定”的注释. 显然,审阅者认为这部电影很拖拉,很无聊,与标签相符.
采集关键指标
完成检查后,您需要采集以下重要指标,这些指标可以帮助表征文本分类任务:
样本数: 数据集中的样本总数.
类别数: 数据集中的主题或类别数.
每个类别中的样本数: 如果是平衡数据集,则所有类别应收录相似数目的样本;如果它是不平衡的数据集,则每个类别中收录的样本数量将有很大的差异.
每个样本中的单词数: 这是一个文本分类问题,因此应计算样本中收录的单词中位数.
单词频率分布: 数据集中每个单词的频率(出现次数).
样本长度分布: 数据集中每个样本的分布
步骤2.5: 选择模型
到目前为止,我们已经对数据进行了汇总,并且对数据的关键特征也有了深入的了解. 接下来,基于第二步中采集的各种指标,我们将开始考虑应使用哪种分类模型. 这也意味着我们将提出以下问题: “如何将文本数据转换为算法输入?” (数据预处理和矢量化),“我们应该使用哪种类型的模型?”,“我们的模型应该可行的是什么参数配置?”……
由于数十年的研究,数据预处理和模型配置的选项现在非常多样化,但实际上有很多选项带来了很多麻烦. 我们手头只有一个特定的问题,它的范围也很广泛,那么如何选择最好的呢?最诚实的方法是一个接一个地尝试过去,消除弊端,留下最好的方法,但是这种方法是不现实的.
在本文中,我们尝试简化选择文本分类模型的过程. 对于给定的数据集,我们的目标只有两个: 准确性接近最高,而训练时间则是最低的. 我们使用总共12个数据集,针对不同类型的问题(尤其是情感分析和主题分类问题)进行了大量(〜450K)实验,交替测试了不同的数据预处理技术和不同的模型架构. 这个过程有助于我们获得影响优化的各种参数.
下面的模型选择和流程图是上述实验的总结.
数据准备和模型算法构建
计算比率: 样本数/每个样本的平均单词数
如果上述比率小于1500,请对文本进行分段,然后使用简单的多层感知器(MLP)模型对其进行分类(下图的左分支)
a. 使用n-gram模型对句子进行分段并将单词转换为单词向量
b. 根据向量的重要性得分,从向量中提取出前20,000个单词
c. 建立MLP模型
如果上述比率大于1500,则将文本标记为序列,并使用sepCNN模型对其进行分类(下图的右分支)
a. 对样本进行分词,然后根据词频选择前20,000个词
b. 将样本转换为单词序列向量
c. 如果比率小于1500,使用预训练的sepCNN模型进行词嵌入,效果可能很好.
调整超参数以找到模型的最佳参数配置
在下面的流程图中,*敏*感*词*框代表数据和模型的准备阶段,灰色框和绿色框代表过程中的每个选择,绿色框代表“推荐选择”. 您可以将此图片用作构建第一个实验模型的起点,因为它可以以较低的计算成本提供更好的性能. 如有必要,您可以在此基础上继续进行迭代改进.
文本分类流程图
此流程图回答了两个关键问题:
我们应该使用哪种学习算法或模型?
我们应该如何准备数据以有效地学习文本和标签之间的关系?
其中,第二个问题取决于第一个问题的答案,而我们预处理数据的方式取决于所选的特定模型. 文本分类模型可以大致分为两类: 使用单词排名信息的序列模型和将文本视为一组单词的n-gram模型. 序列模型的类型包括卷积神经网络(CNN),递归神经网络(RNN)及其变体. n元语法模型的类型包括逻辑回归,MLP,DBDT和SVM.
对于电影评论数据集,样本数/每个样本的平均单词数约为144,因此我们将建立一个MLP模型.