vowpal-wabbit:使用多次传递、保持和保持期来避免过度拟合?

vowpal-wabbit: use of multiple passes, holdout, & holdout-period to avoid overfitting?

我想使用 awesome vowpal wabbit tool:

使用以下命令训练用于类别分类的二元 S 形前馈网络
vw --binary --nn 4 train.vw -f category.model

并测试它:

vw --binary -t -i category.model -p test.vw

但我的结果非常糟糕(与我的线性 svm 估计器相比)。

我发现一条评论说我应该使用 Number of Training Passes 参数 (--passes arg)。

所以我的问题是如何知道训练次数以避免重新训练模型

P.S。我应该使用 holdout_period 参数吗?如何?

问题中的测试命令不正确。它没有输入(-p ... 表示输出预测)。也不清楚你是想 test 还是 predict 因为它说 test 但使用的命令有 -p ...

Test 表示您已标记数据并且正在评估模型的质量。严格来说:predict 意味着你没有标签,所以你实际上无法知道你的预测有多好。实际上,您还可以预测保留的、标记的数据(通过忽略它们来假装它没有标签),然后评估这些预测有多好,因为您实际上有标签。

一般:

  • 如果你想做二分类,你应该在{-1, 1}中使用标签并使用--loss_function logistic--binary 这是一个独立的选项,意味着您希望预测是二进制的(给您的信息更少)。

  • 如果您已经有一个带有标签的单独测试集,则无需坚持。

vw 中的 holdout 机制旨在替换测试集并避免过度拟合,它仅在使用多遍时才相关,因为在单遍中 all 示例被有效地保留了;每个下一个(尚未见过的)示例被视为 1)未标记用于预测,以及 2)标记用于测试和模型更新。 IOW:你的训练集实际上也是你的测试集。

因此,您可以在训练集上进行 多次传递而无需保留 :

 vw --loss_function logistic --nn 4 -c --passes 2 --holdout_off train.vw -f model

然后使用单独的标记测试集测试模型:

 vw -t -i model test.vw

在同一个训练集上进行多次传递,并将一些保留作为测试集

vw --loss_function logistic --nn 4 -c --passes 20 --holdout_period 7 train.vw -f model

如果您没有测试集,并且想通过使用多次遍历来加强适应性,您可以要求 vw 保留每个 N 个示例(默认的 N 是 10,但您可以使用 --holdout_period <N> 显式覆盖它,如上所示)。在这种情况下,您可以指定更多的遍数,因为 vw 会在保留集的损失开始增长时自动提前终止。

你会注意到你提前终止了,因为 vw 会打印如下内容:

passes used = 5
...
average loss = 0.06074 h

表明在提前停止之前实际使用了 N 遍中的 5 次,示例的留出子集的误差为 0.06074(尾随 h 表明这是保留-出损失)。

如您所见,通过次数保持期是完全独立的选项。

要改进您的模型并获得更多信心,您可以使用其他优化,改变 holdout_period,尝试其他 --nn 参数。您可能还想检查 vw-hypersearch 实用程序(在 utl 子目录中)以帮助找到更好的超参数。

这是一个在源代码中包含的测试集之一上使用 vw-hypersearch 的示例:

$ vw-hypersearch 1 20 vw --loss_function logistic --nn % -c --passes 20 --holdout_period 11 test/train-sets/rcv1_small.dat --binary
trying 13 ............. 0.133333 (best)
trying 8 ............. 0.122222 (best)
trying 5 ............. 0.088889 (best)
trying 3 ............. 0.111111
trying 6 ............. 0.1
trying 4 ............. 0.088889 (best)
loss(4) == loss(5): 0.088889
5       0.08888

表明 45 应该是 --nn 的良好参数,在 11 个示例中的 1 个保留子集上产生 0.08888 的损失。