我使用Vowpal Wabbit进行二元情感分类(正面和负面),使用的是基本的单字特征。我的训练特征看起来像这样:
1 | 28060 10778 21397 64464 19255-1 | 44248 21397 3353 57948 4340 7594 3843 44368 33938 49249 45696 32698 57948 21949 58810 32698 62793 644641 | 44248 21397 3353 32698 629961 | 44248 21397 3353 57948 63747 40024 46815 37197 7594 47339 28060 10778 32698 45035 3843 54789 19806 60087 7594 47339
每行以标签开始,后面是一系列词汇表中单词的索引。这些特征的默认值为1。
我使用以下命令进行训练:
cat trainfeatures.txt | vw --loss_function logistic -f trainedModel
这是我用于测试的命令:
cat testfeatures.txt | vw -i trainedModel -p test.pred
这是输出文件test.pred的样貌:
28.64133515.40983413.05779328.48816516.71683919.752426
这些值的范围在-0.114076到28.641335之间。如果我使用一个规则,即如果值超过某个阈值,比如14,则为正面,否则为负面,那么我得到的准确率为51%,F-measure为40.7%。
但我参考的论文报告说在这个数据集上的准确率为81%。所以我的实现或结果解释中肯定有问题。我无法找出问题所在。
编辑:我在测试命令中使用了–binary选项,这给了我{-1,+1}的标签。我进行了评估,得到了以下结果 – 准确率为51.25%,F-measure为34.88%。
回答:
编辑:主要问题是训练数据没有按随机顺序打乱。这在使用任何在线学习时是必要的(除非训练数据已经打乱,或者它是一个实时序列)。可以使用Unix命令shuf
来完成。
解释:在极端情况下,如果训练数据先包含所有负面例子,然后是所有正面例子,那么模型很可能学会将(几乎)所有东西分类为正面。
导致低F1-measure(几乎所有预测为正面)的另一个常见原因是不平衡的数据(许多正面例子,少量负面例子)。这不是Satarupa Guha问题中数据集的情况,但我保留了我的原始回答在这里:
显而易见的解决方案是给负面例子赋予更高的(比默认值1高)重要性权重。重要性权重的最佳值可以通过使用保留集来找到。
如果我使用一个规则,即如果值超过某个阈值,比如14,则为正面,否则为负面
负面与正面预测的阈值应该是0。
请注意,Vowpal Wabbit的一大优势是你不需要将特征名称(在你的例子中是单词)转换为整数。你可以使用原始(已分词)的文本,只需确保转义管道”|”和冒号”:”(以及空格和换行符)。当然,如果你已经将单词转换为整数,你也可以使用它。