文本分类中支持向量机的合适类数

机器算法验证 r 分类 支持向量机 多级 e1071
2022-04-03 14:46:54

我正在使用包 e1071 中的 R 和 SVM 进行文本分类。我有大约 30000 个文本文件用于训练,10000 个用于测试。目标是对这些文件进行分层分类。比如我在一级有13个类别,比如体育、文学、政治等,二级有300多个类别。例如,在运动类别下,有子类别,如足球、篮球、橄榄球等。

两种策略可以达到第 2 级的分类。首先是对第 1 级(13 个类别)中的文件进行分类,然后递归地将文件分类到其自己的子类别中。第二种策略更直接,即我们为级别 2 中的所有类别(超过 300 个)分配不同的标签,然后我们用 SVM 训练模型。

对于第二种策略,虽然我已经使用 SVD 到 doc-term 矩阵,将其维度减少到 30,000 * 10。包 e1071 中的svm函数仍然崩溃,给出错误cannot allocate vector of size 12.4 Gb

所以我想问各位大师,大量的类别对于 SVM 是否是一个真正的问题?具体来说,就我而言,哪种策略会产生更好的结果并且在实际中更可行?

3个回答

以下答案是基于我个人对文本分析的见解。

当然,类别数量的增加会显着增加时间,因为你有更大的矩阵维度等等。但这不一定是一个糟糕的方法。此外,第一种策略在我看来有点奇怪,因为猜测子组的结果可能会干扰猜测组的不良结果(某些子类别可能与其他类别或子类别有显着差异,但整体不能)。所以我可能会选择第二种策略。

在第二种方法中,您将需要相当多的计算能力。您得到的错误是您的 RAM 内存已满(如果有,也可以交换)。关于这个问题有几个基本的建议。

  1. 尝试减少您的文档术语矩阵。这包括删除停用词、标点符号、删除没有任何意义的词。这是非常常见的过程,但有时可以考虑创建自己的更大过滤器。
  2. 不要使用全部文章,而是仅使用样本。好吧,采样是减少计算量的最简单的程序之一。
  3. 最懒惰的解决方案,要么买一台有更多可操作内存的电脑,要么增加你的交换内存,让电脑来做剩下的事情。

在您的第二种情况下,这些是更常见的方法。我可能会跳过名为RTextTools使所有这些工作更容易的包。另一种见解是使用另一种方法而不是 SVM。我不确定,但我认为已经实现了分类算法,这意味着您的某些类别具有子类别。

当 R 崩溃时,不要忘记通过保存工作区、.Rdata 然后加载它来保护您的进度。也尝试使用 R 的垃圾收集器gc()

您可能需要考虑使用 LibLINEAR 而不是 (Lib)SVM。据说它在文档分类等情况下比 SVM 运行得更快,但我不确定它如何影响内存使用(请参阅“何时使用 LIBLINEAR 但不使用 LIBSVM”部分)。是 R 的包。

我在一家小型研究型软件公司担任项目经理和软件工程师。我们最近完成了一个文本分类项目,并在途中进行了许多实验。

我们使用基于 Platt 的“顺序最小优化”算法以及后来对线性情况的改进在 C# 中编码的 Lineer SVM 实现。这些项目是在互联网上销售的产品定义。我们的类别是一个两级树,大约有 15 个一级节点和 200 个叶子。以下是我所学内容的两句话总结:

成功取决于训练集的质量,而不是确切的方法。尽管 SVM 确实比决策树、最近邻算法和任何其他“简单”方法的性能要好一些,但选择内核、优化系统参数在成功率方面几乎没有区别。

我们的实验包括您所写的两种方法的比较。尽管我的常识仍然告诉我,第一种方法应该表现更好,但在我们的实验中,成功率没有统计学上的显着差异:很可能,当产品被分类时,两种方法都正确分类,或者都没有。

对于 RAM 的使用,我不知道 R 可以提出具体的建议。但是,如果您尚未实施这些步骤,我可以提供一些一般性建议:

  • 删除停用词
  • 删除不常见的词(即出现在少于 10 个文档中的词)
  • 格式化和词干所有单词,以便 COME、come、come、coming 等映射到同一个词。(有免费的图书馆)

SVM 在训练期间需要大量内存。不过,24 Gb 对我来说似乎绰绰有余。(同样,我对 R 实现一无所知)但是,您可以执行一个实验,如果成功,它将使训练更快,并且消耗更少的资源:

如果你有 300 个类别,构建 300 个不同的训练集和支持向量机。对于每个类别,让您的训练集由 100 个正样本和 400 个随机选择的负样本组成(通过实验找到最佳数量)。您将拥有 300 个不同的术语文档矩阵,但每个矩阵的大小要小得多。当要对文档进行分类时,询问每个 SVM 并返回具有最大值的类别。