Vowpal Wabbit交互冗余

B_M*_*ner 4 redundancy quadratic feature-selection vowpalwabbit

我很好奇大众通过-q参数创建交互术语的方式.

为了说明的目的,我使用这个玩具数据,称为cats.vm:

1 |a black |b small  green |c numvar1:1.62 numvar2:342 |d cat |e numvar3:554
1 |a white |b large yellow |c numvar1:1.212 numvar2:562 |d cat |e numvar3:632
-1 |a black |b small green |c numvar1:12.03 numvar2:321 |d hamster |e numvar3:754
1 |a white |b large green |c numvar1:5.8 numvar2:782 |d dog |e numvar3:234
-1 |a black |b small yellow |c numvar1:2.322 numvar2:488 |d dog |e numvar3:265
1 |a black |b large yellow |c numvar1:3.99 numvar2:882 |d hamster |e numvar3:543
Run Code Online (Sandbox Code Playgroud)

大众创建互动条款的方式似乎有些不一致.以下是几个示例,其中命令始终如下,只更改了-q:

vw -d cats.vm --loss_function logistic --invert_hash readable.cat.mod -q X
Run Code Online (Sandbox Code Playgroud)

1. -q aa

在这里,我们在命名空间内只有一个特征的交互,并且只获得预期的黑色和白色(黑色^ 2和白色^ 2)的二次项.

Constant:116060:0.082801
a^black:53863:-0.039097
a^black^a^black:247346:-0.039097
a^white:55134:0.223999
a^white^a^white:227140:0.223999
b^green:114666:0.027346
b^large:192199:0.330261
b^small:80587:-0.096200
b^yellow:255950:0.075754
c^numvar1:132428:0.004266
c^numvar2:30074:0.000211
d^cat:11261:0.188487
d^dog:173570:0.006734
d^hamster:247835:-0.085219
e^numvar3:12042:0.000115
Run Code Online (Sandbox Code Playgroud)

2. -q ab

通过2个名称空间(其中一个具有多于1个特征)之间的交互,事物是预期的,除了a或b中没有项目的二次项(例如黑色*黑色)

问题1:有没有办法强制这些"跨命名空间交互"包括多项式术语,如黑色*黑色?

Constant:116060:0.079621
a^black:53863:-0.035646
a^black^b^green:46005:-0.017797
a^black^b^large:123538:0.137239
a^black^b^small:11926:-0.088733
a^black^b^yellow:187289:-0.053135
a^white:55134:0.206693
a^white^b^green:24528:0.127449
a^white^b^large:102061:0.206693
a^white^b^yellow:165812:0.114003
b^green:114666:0.025218
b^large:192199:0.302959
b^small:80587:-0.088733
b^yellow:255950:0.072339
c^numvar1:132428:0.004038
c^numvar2:30074:0.000199
d^cat:11261:0.176863
d^dog:173570:0.007334
d^hamster:247835:-0.080986
e^numvar3:12042:0.000109
Run Code Online (Sandbox Code Playgroud)

3. -q bb

这里我们在名称空间内进行交互,其中有两个功能.存在重复(例如,b ^大^ b ^绿色:81557:0.112864和b ^ green ^ b ^ large:110857:0.112864).

问题2:模型中是否存在这些重复的术语,或者这是--invert_hash中的一些问题?所有重复的权重都相同.例如,为了获得绿色和大型互动的全部效果,我们应该将绿色*大重量乘以2吗?

Constant:116060:0.062784
a^black:53863:-0.043486
a^white:55134:0.182450
b^green:114666:0.023035
b^green^b^green:33324:0.023035
b^green^b^large:110857:0.112864
b^green^b^small:261389:-0.016840
b^large:192199:0.252576
b^large^b^green:81557:0.112864
b^large^b^large:159090:0.252576
b^large^b^yellow:222841:0.187498
b^small:80587:-0.079945
b^small^b^green:249481:-0.016840
b^small^b^small:215402:-0.079945
b^small^b^yellow:128621:-0.123284
b^yellow:255950:0.051017
b^yellow^b^large:68957:0.187498
b^yellow^b^small:219489:-0.123284
b^yellow^b^yellow:132708:0.051017
c^numvar1:132428:0.003217
c^numvar2:30074:0.000164
d^cat:11261:0.158140
d^dog:173570:0.008735
d^hamster:247835:-0.085383
e^numvar3:12042:0.000086
Run Code Online (Sandbox Code Playgroud)

ari*_*elf 6

一,基础知识:当你跨越特征时,vowpal wabbit使用:

  • 对于交叉的特征名称/标识:连接的原始特征名称(字符串)的murmur32散列(模数重量矢量大小)
  • 对于交叉特征值:原始特征值(权重)的交叉(乘法)

所以看看你上面的问题#3:连接的名字是 b^green^b^large或b^large^b^green.它们具有相同的值:0.112864,因为两个特征值的相乘是相同的.但是,由于两种可能的连接方式,我们得到两个不同的哈希值和一个"拆分"功能.这种冗余(具有转置顺序)特征对现象似乎只出现在自交叉中.我不确定为什么,这可能是一个错误.

要回答其他问题(1和2):

强制black^black(实际^a^black^a^black)你需要传递,-q aa因为black只在名称空间a.

请注意,您可以传递多个-q参数vw以实现所需的任何交叉:

-q aa -q ab -q ...

您可以使用通配符:名称空间来互相跨越每个名称空间:

-q ::

为了更多的力量:

还有一个--cubic选项,允许您拟合三次多项式.--cubic将3个名称空间前导字符作为参数,例如--cubic abc.

最后,您还可以使用--keep和--ignore保留或忽略以特定字符开头的名称空间.

  • 通过vw的SGD正确处理分割功能,每个"半功能"应该减轻一半的重量.所以最终行为是正确的,尽管不是最优雅/简约.从这个意义上讲,我称之为"一个错误"可能过于强烈.如果困扰你,请随意打开一个问题.约翰是否愿意解决这个问题是另一个问题; 在追求完美与增加代码复杂性之间需要权衡.无论如何,谢谢你的问题.我也在向他们学习! (2认同)