可以将 Vowpal Wabbit 预测与观察到的目标值一起输出到 .txt 吗?
Possible to output Vowpal Wabbit predictions to .txt along with observed target values?
我们正在编写一个使用 Vowpal Wabbit 的预测应用程序,并希望尽可能多地自动化我们的模型验证过程。任何人都知道 vw
是否有一个本地实用程序来输出测试文件中的目标值以及 vw
模型的预测?这些值在预测期间打印到终端输出。常规 vw
调用是否有参数,或者 utl
文件夹中是否有一个工具可以逐行打印目标和预测?
下面是我现在用于预测的代码:
vw -d /path/to/data/test.vw -t -i lg.vw --link=logistic -p predictions.txt
我的目标是从 Vowpal 中生成如下所示的输出文件:
Predicted Target
0.78 1
0.23 0
0.49 1
...
更新
@arielf 的代码非常有效。我只做了一个小的补充,将流媒体结果打印到 validation.txt
文件:
vw -d test.vw -t -i lg.vw --link=logistic -P 1 2>&1 | \
perl -ane 'print "$F[5]\t$F[4]\n" if (/^\d/)' > validation.txt
试试这个:
vw -d test.vw -t -i lg.vw --link=logistic -P 1 2>&1 | \
perl -ane 'print "$F[5]\t$F[4]\n" if (/^\d/)'
解释:
-P 1 # Add option: set vw progress report to apply to every example
注:-P
为大写P
(--progress
的别名),1
为进度打印间隔
请注意,您不需要使用 -p ...
添加预测,因为在这种情况下这是多余的(预测已包含在 vw
进度线中)
带有 headers 的进度报告行如下所示:
average since example example current current current
loss last counter weight label predict features
0.000494 0.000494 1 1.0 -0.0222 0.0000 14
由于进度报告转到 stderr,我们需要将 stderr 重定向到 stdout (2>&1
)。
现在我们将 vw
进度输出通过管道传输到 perl
以实现简单的 post-processing。 perl
命令循环遍历每一行输入,默认情况下不打印 (-n
),auto-splits 进入 white-space 上的字段 (-a
),并应用表达式(-e
) 打印由 TAB 分隔的第 5 和第 4 个字段,如果该行以数字开头则以换行符终止(为了跳过任何不是进度行的内容,例如 headers,序言和摘要行)。我颠倒了第 5 和第 4 个提交的顺序,因为 vw
进度线的观察值在预测值之前,而您要求相反的顺序。
更新
Aaron 在 Google 驱动器中发布了一个使用此解决方案的工作示例:https://drive.google.com/open?id=0BzKSYsAMaJLjZzJlWFA2N3NnZGc
我们正在编写一个使用 Vowpal Wabbit 的预测应用程序,并希望尽可能多地自动化我们的模型验证过程。任何人都知道 vw
是否有一个本地实用程序来输出测试文件中的目标值以及 vw
模型的预测?这些值在预测期间打印到终端输出。常规 vw
调用是否有参数,或者 utl
文件夹中是否有一个工具可以逐行打印目标和预测?
下面是我现在用于预测的代码:
vw -d /path/to/data/test.vw -t -i lg.vw --link=logistic -p predictions.txt
我的目标是从 Vowpal 中生成如下所示的输出文件:
Predicted Target
0.78 1
0.23 0
0.49 1
...
更新
@arielf 的代码非常有效。我只做了一个小的补充,将流媒体结果打印到 validation.txt
文件:
vw -d test.vw -t -i lg.vw --link=logistic -P 1 2>&1 | \
perl -ane 'print "$F[5]\t$F[4]\n" if (/^\d/)' > validation.txt
试试这个:
vw -d test.vw -t -i lg.vw --link=logistic -P 1 2>&1 | \
perl -ane 'print "$F[5]\t$F[4]\n" if (/^\d/)'
解释:
-P 1 # Add option: set vw progress report to apply to every example
注:-P
为大写P
(--progress
的别名),1
为进度打印间隔
请注意,您不需要使用 -p ...
添加预测,因为在这种情况下这是多余的(预测已包含在 vw
进度线中)
带有 headers 的进度报告行如下所示:
average since example example current current current
loss last counter weight label predict features
0.000494 0.000494 1 1.0 -0.0222 0.0000 14
由于进度报告转到 stderr,我们需要将 stderr 重定向到 stdout (2>&1
)。
现在我们将 vw
进度输出通过管道传输到 perl
以实现简单的 post-processing。 perl
命令循环遍历每一行输入,默认情况下不打印 (-n
),auto-splits 进入 white-space 上的字段 (-a
),并应用表达式(-e
) 打印由 TAB 分隔的第 5 和第 4 个字段,如果该行以数字开头则以换行符终止(为了跳过任何不是进度行的内容,例如 headers,序言和摘要行)。我颠倒了第 5 和第 4 个提交的顺序,因为 vw
进度线的观察值在预测值之前,而您要求相反的顺序。
更新
Aaron 在 Google 驱动器中发布了一个使用此解决方案的工作示例:https://drive.google.com/open?id=0BzKSYsAMaJLjZzJlWFA2N3NnZGc