Hash 功能位在vowpal wabbit中是如何工作的

Hash 功能位在vowpal wabbit中是如何工作的,hash,parameters,vowpalwabbit,bit-depth,Hash,Parameters,Vowpalwabbit,Bit Depth,我对vowpal wabbit比较陌生,希望了解-b参数(feature表中的feature位) 我的训练数据是这样的。总共约有100万字 1 | a = "word" b ="word131232" c="word1233" d = "word123124" e = "word23145" 但是,每行只有5个特征。我应该使用多少位?我试着运行它,随着示例数量的增加,功能集的数量似乎在增加。我似乎不明白为什么会这样 如果使用-b 18(默认设置),功能将散列到一个包含2^18项的表中,因此如果

我对vowpal wabbit比较陌生,希望了解-b参数(feature表中的feature位)

我的训练数据是这样的。总共约有100万字

1 | a = "word" b ="word131232" c="word1233" d = "word123124" e = "word23145"

但是,每行只有5个特征。我应该使用多少位?我试着运行它,随着示例数量的增加,功能集的数量似乎在增加。我似乎不明白为什么会这样

如果使用
-b 18
(默认设置),功能将散列到一个包含2^18项的表中,因此如果数据集中的唯一功能数接近2^18(甚至更高),则应增加参数
-b
,这样就不会有太多散列冲突。没有简单的方法可以检测碰撞的数量,但通常的做法是调整参数
-b
,以获得最佳的渐进式验证损失(或者如果使用更多的过程,则保持损失)。当然,这也取决于机器上的可用内存

1 | a=“word”b=“word131232”c=“word1233”d=“word123124”e=“word23145”

请注意,这个例子是错误的(不是您想要的),因为=。等号没有特殊意义(与冒号不同,冒号用于分隔特征值)。要素名称中不能包含空格。无需将要素名称括在引号中。所以这个例子应该是这样的

1 | word word131232 word1233 word123124 word23145
如果前缀a、b、c、d、e具有某些特殊含义(即
a=word42
应该是与
b=word42
不同的功能),您可以使用:

1 | a=word b=word131232 c=word1233 d=word123124 e=word23145
如果所有单词都已映射到整数(在0-2^b范围内),则可以直接将它们用作要素名称,并且不会进行哈希运算(除非指定
--hash=all
):

功能集的数量似乎在增加

在进度报告(默认情况下,每个2^x示例)的最后一列中,您可以看到
当前特征
,这是当前示例的特征数(包括常量特征和二次/三次/…特征,如果您使用它们),并且不应增加(除非您有这样奇怪的数据)

在最终报告中,
vw
打印
total feature number
,它是每个示例的平均特征数乘以示例数乘以通过次数(因此它不是数据集中唯一特征的数量)

1 | 0 131232 1233 123124 23145