您如何将 SMOTE 应用于文本分类?

数据挖掘 阶级失衡 文本 打击
2021-09-15 23:23:12

合成少数过采样技术 (SMOTE) 是一种用于不平衡数据集问题的过采样技术。到目前为止,我已经知道如何将它应用于通用的结构化数据。但是是否可以将其应用于文本分类问题?您需要对哪部分数据进行过采样?已经有另一个关于它的问题,但它没有答案。我可以从哪里开始学习呢?

3个回答

实际上,NLP 是需要重新采样数据的最常见领域之一,因为有许多文本分类任务处理不平衡问题(想想垃圾邮件过滤、侮辱性评论检测、文章分类等)。但是由于某些原因,SMOTE 在这里似乎存在问题:

  • SMOTE 在特征空间中工作。这意味着 SMOTE 的输出不是合成数据,它是其特征空间内文本的真实代表。
  • 一方面,SMOTE 与 KNN 一起工作,另一方面,NLP 问题的特征空间非常巨大。KNN 在那些巨大的维度上很容易失败。

所以我可以向你推荐两种方法:

  1. 不要关心我认为应该没问题的新合成样本的真实文本表示。您需要平衡分类器的分布,而不是文本数据的读者。因此,将 SMOTE 应用为传统的(但是我通常使用下面的解决方案 2,所以我不保证结果!)并带有一些降维步骤。

1) 假设您想使用 3-NN 将次要类的数据样本加倍。忽略主要类别并仅保留次要类别样本。

2)为特征空间中的每个样本点选择5个最近邻。然后随机选择其中的3个(不是很复杂吗?如果我不想解释原始算法我会说只选择3个邻居!)

3)对于每个维度,计算样本与邻居之间的距离,并将其乘以0-1之间的随机数,并将其添加到该维度中样本的原始值。(这个复杂的段落只是意味着为每个维度在原始样本和那个邻居之间选择一个随机值!)

  1. 但我通常会在文本上进行另一个过采样(更直观),并且有点 SMOTE。

1)忽略主类。获取次要类中所有文档的长度分布,以便我们根据真实文档长度(单词/短语的数量)生成新样本。我们假设我们想让类的大小变成三倍(所以产生k=2 每个原始文件的合成文件)

2) 生成一个序列 n根据该分布的随机整数。它用于确定新合成文档的长度。

3) 对于每个文档:从随机长度序列中选择一个整数,然后 m长度接近整数的随机文档。把所有的令牌m 一组文档并随机选择 n 代币 k次。这些是你的k 新文件。

如果你想添加更多的文本/句子训练数据,你可以使用预训练的词嵌入。预训练模型,例如提供每个字典单词的词向量表示。它还提供了“最相似”的词。

您可以简单地使用例句并通过对每个单词及其最多 TOP_N 个相似单词进行排列来生成新样本。

例如,如果您的句子有 3 个单词,并且您为每个单词选择 3 个最相似的单词,则可以上采样 27 倍。

我有同样的问题。我有多分类问题,大多数不平衡数据集超过 10k,少数为 200。

累了 SMOTE 但后来遇到了像 Kasra Manshaei 提到的问题。

文本/数据增强是我正在尝试的一种方法。您基本上从数据集中获取样本(文本)并用文本中的同义词替换一些单词以创建合成文本。这样你就有了新的合成文本,并且在矢量化之后数据仍然代表原始文本。

参考

nlpaug是一个可以处理文本增强的库。