我有一个非常简单的数据集,见下文(让我们称之为a.vw
):
-1 |a 1 |b c57
1 |a 2 |b c3
2个命名空间(a
和b
),在阅读wiki之后,我知道vw会自动生成a^1
或b^c57
这样的真实功能。
但是,在我知道它之前,我实际上制作了一个这样的vw文件(称之为b.vw
):
-1 |a a_1 |b b_c57
1 |a a_2 |b b_c3
如您所见,我只是手动为每个功能添加前缀。
现在我在具有相同配置的两个文件上训练模型,如下所示:
cat a.vw | vw --loss_function logistic --passes 1 --hash all -f a.model --invert_hash a.readable --random_seed 1
cat b.vw | vw --loss_function logistic --passes 1 --hash all -f b.model --invert_hash b.readable --random_seed 1
然后我检查了可读的模型文件,它们每个功能的权重完全相同,见下文:
$ cat a.readable
Version 8.2.1
Id
Min label:-50
Max label:50
bits:18
lda:0
0 ngram:
0 skip:
options:
Checksum: 295637807
:0
Constant:116060:-0.0539969
a^1:112195:-0.235305
a^2:1080:0.243315
b^c3:46188:0.243315
b^c57:166454:-0.235305
$ cat b.readable
Version 8.2.1
Id
Min label:-50
Max label:50
bits:18
lda:0
0 ngram:
0 skip:
options:
Checksum: 295637807
:0
Constant:116060:-0.0539969
a^a_1:252326:-0.235305
a^a_2:85600:0.243315
b^b_c3:166594:0.243315
b^b_c57:227001:-0.235305
最后,我分别使用两个数据集上的两个模型进行预测,如下所示:
$ cat a.vw | vw -t -i a.model -p a.pred --link logistic --quiet
$ cat b.vw | vw -t -i b.model -p b.pred --link logistic --quiet
现在,问题出现了,a.pred
与b.pred
的结果截然不同,见下文:
$ cat a.pred
0.428175
0.547189
$ cat b.pred
0.371776
0.606502
为什么?这是否意味着我们必须手动为功能添加前缀?
答案 0 :(得分:1)
如果你尝试cat a.vw | vw -t -i a.model -p a.pred --link logistic --quiet --hash all
,你会得到:
$ cat a.pred
0.371776
0.606502
似乎--hash
参数值未存储在模型文件中,您也需要在测试步骤中指定它。 b.vw
没关系,因为它没有纯数字功能,但与a.vw
起作用。我不确定这是不是一个错误。但你可以举报。