Vowpal Wabbit:标题和关键字等短文本数据的最佳策略

机器算法验证 分类 多级 vowpal-wabbit
2022-03-22 14:20:09

我正在使用 Vowpal Wabbit 7.10.0 (VW) 来学习和预测文本数据的类别。但是,我的每条记录的文本数据不像一篇文章或另一个体面的文本文档,而是几个句子,如标题、副标题和关键字。

我有大约 10,000 条可用于验证、训练和测试的标记记录,以及大约 1-2 百万条未标记记录。它是一个多类问题,大约有 100 个类标签,也是不平衡的。

使用 VW 充分利用此类数据的最佳预处理和输入格式是什么?

我的经验告诉我,大众车型应该对阶级不平衡问题敏感。这是证实它的另一个来源。是对的吗?

至于选择模型,我决定我宁愿通过 n-gram 考虑单词组合,然后根据频率计数发现潜在变量(因为文本太短。)此外,有些文本倾向于列出 100 次的单词(对于 SEO)在我的数据中。因此,我不去 TF-IDF。这是对还是错?我想,我可以将 n-gram 和 bag-of-words 组合为不同的命名空间。但是从什么参数开始的分类器呢?

到目前为止,我尝试了三种不同的数据预处理方式:(1)未处理的文本,只删除了标点符号,(2)标记化,词形还原(不是词干),删除了停用词,(3)除了(2),bag字数,即 word:word_count 格式。

使用非常基本的设置(此示例使用 16 个类,而不是 100 个),结果并不令人满意:

  vw input.vw -c -k --passes 300 -b 24 --ect 16 -f model.vw
  vw input.vw -t -i model.vw -p preds.txt

即使在训练集上,错误率也约为 0.68。

我有一些时间限制来深入探索所有类型的设置,并且确实需要快速且内容丰富的建议:在我的案例中,最好的预处理技术是什么,以及我应该使用最新大众汽车中实现的模型。这两个问题是相关的。

1个回答

以下是提高大众车型性能的一些技巧:

  1. 在训练之前对数据进行洗牌。对数据集进行非随机排序真的会搞砸大众。
  2. 您已经在使用多个通道,这很好。尝试同时衰减通过之间的学习率,使用--decay_learning_rate=.95.
  3. 玩转学习率。我有过--learning_rate=10很棒的案例和其他很棒的案例--learning_rate-0.001
  4. 尝试 --oaa 16or--log_multi 16而不是--ect 16. 我通常发现ect不太准确。但是,oaa速度很慢。我发现--log_multi这是速度和准确性之间的一个很好的折衷方案。在 10,000 个训练示例上,--oaa 16应该没问题。
  5. 玩一下损失函数。 --loss_function=hinge有时可以对分类模型产生很大的改进。
  6. 使用--l1--l2参数来规范您的模型。 --l2特别适用于文本数据。尝试类似的东西--l2=1e-6
  7. 对于文本数据,尝试--ngram=2--skips=2n-gram 和 skipgram 添加到您的模型中。这有很大帮助。
  8. 尝试--autolink=2--autolink=3拟合二次或三次样条模型。
  9. 尝试使用 .ftrl 进行优化--ftrl这对于具有一些极其罕见和一些极其常见特征的文本数据或数据集非常有用。
  10. 尝试一些学习减少:
    1. 尝试使用--nn=1或的浅层神经网络--nn=10
    2. 尝试使用--ksvm --kernel=rbf --bandwidth=1. (这可能非常慢)。
    3. 尝试使用 --ksvm --kernel=poly --degree=3. (这可能非常慢)。
    4. 用 .gbm 试试--boosting=25这可能有点慢。

VW 非常灵活,因此通常需要进行大量微调才能在给定数据集上获得良好的模型。您可以在此处获得更多调整想法:https ://github.com/JohnLangford/vowpal_wabbit/wiki/Command-line-arguments

关于您链接到的帖子:该人在不平衡分类问题上 使用带有平方损失的 vw。这是一件愚蠢的事情,并且几乎可以保证任何线性模型都将始终预测占主导地位的类别。如果您担心班级平衡,大众汽车支持权重,因此您可以超重稀有班级。

编辑:您有 100 个课程和 10,000 个训练示例?这是每个班级平均 100 次观察,无论您使用什么模型,都没有多少值得学习的地方。