在Vowpal Wabbit中,命名空间和特征之间有什么区别?

4

在使用R或Python进行分析时,我们只知道特征名称(它们的值)并使用它们。在Vowpal Wabbit中,我们还有命名空间。

我无法理解: a. 什么是命名空间; b. 它与特征有何不同; c. 何时使用?什么情况下不使用?也就是说,我们能否避免使用它。 d. 如何使用它?

以下是一两个示例,将不胜感激。

1个回答

10
在vowpal wabbit中,使用命名空间可以方便地在运行时动态生成交互特征,无需预先声明。一个简单的不带命名空间的示例格式如下:
1 | a:2 b:3

其中1是标签,ab是常规输入特征。

请注意,在|后面有一个空格。

与使用两个名称空间xy相比(请注意分隔符|和名称空间之间没有空格):

1 |x a:2 |y b:3

这个例子与第一个例子基本相同(除了特征哈希位置)。 它仍然有两个与原始示例相同值的特征。 不同之处在于,现在通过这些名称空间,我们可以通过向vw传递选项来交叉特征。例如:

vw -q xy

将在命名空间x中交叉所有特征与命名空间y中的所有特征,动态生成附加功能。自动生成的功能名称将是两个名称空间名称的连接,其值将是它们各自值的乘积。在这种特殊情况下,就像我们的数据集有一个额外的特征:ab:6 (*)。

显然,这是一个非常简单的例子,想象一下你有一个具有三个特征的示例名称空间:

1 |x a:2 b:3 c:5

通过在vw中添加-q xx,您可以自动生成6个额外的交互特征:aa、ab、ac、bb、bc、cc。如果您有3个命名空间,比如:x、y、z,您可以在命令行中交叉任何一个(或任何想要的子集):-q xx -q xy -q xz -q yz -q yy -q zz,以获得不同特征集之间所有可能的交互。
这是一个强大的功能,可以让您实验并在运行时添加交互特征。
有几个选项接受(1st letters of)命名空间作为参数,其中包括:
-q
--cubic
--ignore
--keep
--redefine (very new)
--lrq

请查看vw命令行参数维基获取更多详细信息。
(*) 实际上,由于名称空间在它们之前加了一个^分隔符,因此特征名称会有名称空间的前缀,所以实际的哈希字符串将是x^a^y^b:6而不是ab:6(您可以使用--audit选项进行验证),但这只是一个细节。

1
实际的哈希字符串将是x^a^y^b:6。在实践中,二次特征的哈希是以不同的方式计算的(基于两个原始特征和一个魔法常数的哈希),因此它与hash("x^a^y^b")不同。但这只是一个技术细节。 - Martin Popel
1
谢谢Martin。是的,如果你真的想知道确切的实现细节,不错过任何细节的安全方法是查看(免费和开放的)源代码。还有--hash strings--hash all之间的区别,当特征名称为数字时会有所不同。上面的描述主要是为了解释名称空间背后的概念,同时保持答案简洁(我猜我在这方面失败了 :) 在大多数情况下,确切的哈希值以及存储在内存中的特征结束的地址对用户没有影响。 - arielf
感谢您解释名称空间和特征之间的区别。如果我可以这么说,特征存在于现实世界中,但是如果我想要特征之间的交互作用,则需要创建名称空间。您已经提到上面,新的交互特征是来自不同名称空间的两个特征值的产物。但是,如果这两个特征是分类的,是否有可能简单地解释一下如何开发交互值。再次感谢。 - Ashok K Harnal
分类值不被vowpal wabbit直接支持。然而,有一个很酷的技巧可以使二进制特征(取值为{0,1})模拟分类值:例如:color=red color=blue color=green,这是可能的,因为等号=只是特征名称字符串的一部分(即等号不像冒号:那样是一个特殊的分隔符)。这个主题是正交的,与命名空间无关。当特征是二进制交互时自然而然地工作。顺便说一下:随时可以提出关于如何表示不同类型特征给vw的单独问题。 - arielf
@arief 谢谢。VW中的特征表示确实让我困惑。我已经提出了另一个问题。[链接](https://dev59.com/NV4b5IYBdhLWcg3w1UoN)。请帮忙。 - Ashok K Harnal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接