文本分类:结合不同类型的特征

数据挖掘 机器学习 分类 特征选择 逻辑回归 信息检索
2021-10-07 23:10:52

我要解决的问题是将短文本分类为多个类。我目前的方法是使用 tf-idf 加权词频并学习一个简单的线性分类器(逻辑回归)。这工作得相当好(在测试集上大约 90% 的宏 F-1,在训练集上接近 100%)。一个大问题是看不见的单词/n-gram。

我试图通过添加其他特征来改进分类器,例如使用分布相似性(由 word2vec 计算)或示例的其他分类特征计算的固定大小的向量。我的想法是将特征添加到词袋中的稀疏输入特征中。但是,这会导致测试集和训练集的性能变差。附加功能本身在测试集上提供了大约 80% 的 F-1,因此它们不是垃圾。缩放功能也没有帮助。我目前的想法是,这些特征与(稀疏的)词袋特征不能很好地混合。

所以问题是:假设附加功能提供了附加信息,那么合并它们的最佳方式是什么?是否可以训练单独的分类器并将它们组合在某种集成工作中(这可能会有一个缺点,即无法捕获不同分类器的特征之间的交互)?我应该考虑其他更复杂的模型吗?

2个回答

如果我理解正确,您的模型基本上有两种形式的特征。(1) 您已经表示为稀疏词袋的文本数据和 (2) 更传统的密集特征。如果是这种情况,那么有 3 种常见的方法:

  1. 对稀疏数据执行降维(例如 LSA via TruncatedSVD)以使其密集并将特征组合到单个密集矩阵中以训练模型。
  2. 使用 scipy 之类的东西将您的一些密集特征添加到您的稀疏hstack矩阵中,以训练您的模型。
  3. 仅使用您的稀疏文本数据创建模型,然后将其预测(如果是分类的概率)作为密集特征与其他密集特征结合以创建模型(即:通过堆叠进行集成)。如果您走这条路,请记住仅使用 CV 预测作为特征来训练您的模型,否则您可能会严重过度拟合(如果需要,您可以创建一个相当的类来在一个单一的时间内完成这一切Pipeline)。

这三种方法都是有效的,并且各有优缺点。就个人而言,我发现(1)通常是最糟糕的,因为它相对来说非常慢。我还发现(3)通常是最好的,既足够快又能产生非常好的预测。如果您愿意做一些更广泛的合奏,您显然也可以将它们组合起来。

至于您使用的算法,它们基本上都可以适应该框架。逻辑回归在大多数情况下表现得非常好,但其他人可能会做得更好,这取决于手头的问题以及你对它们的调整程度。我本人偏爱 GBM,但最重要的是,您可以尝试任意数量的算法,甚至对它们的预测进行简单的加权集成几乎总能带来更好的整体解决方案。

线性模型只需将其特征乘以相应的权重即可。例如,如果您有 1000 个稀疏特征,其中每个实例中只有 3 或 4 个处于活动状态(其他都是零)和 20 个全非零的密集特征,那么密集特征很可能会占据大部分稀疏特征的影响只会增加一点价值。您可以通过查看一些实例的特征权重以及它们如何影响结果总和来检查这一点。

解决它的一种方法是远离加法模型。这是几个候选模型。

SVM基于分离超平面。虽然超平面本身就是线性模型,但 SVM 并没有对它的参数求和,而是试图以一种最优的方式分割特征空间。考虑到特征的数量,我会说线性 SVM 应该可以正常工作,而更复杂的内核可能会过度拟合数据。

尽管它的名字,朴素贝叶斯是一个非常强大的统计模型,在文本分类方面显示出良好的结果。它也足够灵活,可以捕捉稀疏和密集特征频率的不平衡,所以你一定要试一试。

最后,在这种情况下,随机森林可能是一种很好的集成方法。随机化将确保将不同类型的特征(稀疏/密集)用作不同树中的主要决策节点。RF/决策树也有利于检查特征本身,因此无论如何都值得注意它们的结构。

请注意,所有这些方法都有其缺点,在您的情况下可能会将它们变成垃圾。将稀疏特征和密集特征结合起来并不是一项经过充分研究的任务,因此请让我们知道这些方法中的哪一种最适合您的情况。