Vowpal Wabbit如何表示分类特征

use*_*777 13 vowpalwabbit

我有以下所有分类变量的数据:

    class  education    income    social_standing
    1       basic       low       good
    0        low        high      V_good
    1        high       low       not_good
    0        v_high     high      good
Run Code Online (Sandbox Code Playgroud)

这里的教育有四个级别(基本,低,高和高).收入有两个层次的低点和高点; 而social_standing有三个级别(好,v_good和not_good).

就我将上述数据转换为VW格式的理解而言,它将是这样的:

    1 |person education_basic income_low social_standing_good
    0 |person education_low income_high social_standing_v_good
    1 |person education_high income_low social_standing_not_good
    0 |person education_v_high income_high social_standing_good
Run Code Online (Sandbox Code Playgroud)

这里,'person'是命名空间,所有其他都是特征值,以相应的特征名称为前缀.我对么?不知何故,这种特征值的表示对我来说非常困惑.有没有其他方式来表示功能?应该感谢你的帮助.

ari*_*elf 22

是的,你是对的.

这种表示肯定适用于vowpal wabbit,但在某些情况下,可能不是最佳的(取决于).

为了表示非有序的分类变量(具有离散值),标准的vowpal wabbit技巧是为每个可能的(名称,值)组合使用逻辑/布尔值(例如person_is_good, color_blue, color_red).这种方法的作用是vw隐含地假设一个值1缺失的值.有之间没有实际区别color_red, color=red,color_is_red或者甚至(color,red)color_red:1除内存中的哈希位置.您不能在变量名中使用的唯一字符是特殊分隔符(:|)和空格.

术语说明:将每个(特征+值)对转换为单独特征的技巧有时称为"一个热编码".

但在这种情况下,变量值可能不是"严格分类".他们可能是:

  • 严格订购,例如(low < basic < high < v_high)
  • 可能与您试图预测的标签有单调的关系

因此,通过使它们"严格分类"(我的术语表示具有上述两个属性的离散范围的变量),您可能会丢失一些可能有助于学习的信息.

在您的特定情况下,您可以通过将值转换为数字来获得更好的结果,例如(1, 2, 3, 4)用于教育.即你可以使用类似的东西:

1 |person education:2 income:1 social_standing:2
0 |person education:1 income:2 social_standing:3
1 |person education:3 income:1 social_standing:1
0 |person education:4 income:2 social_standing:2
Run Code Online (Sandbox Code Playgroud)

问题中的训练集应该可以正常工作,因为即使你将所有的离散变量转换成像你一样的布尔变量,也vw应该自己发现数据本身的标签的排序和单调性,只要这两个属性以上是真实的,并且有足够的数据来推断它们.

这是用于在vowpal wabbit中编码变量的简短备忘单:

Variable type       How to encode                readable example
-------------       -------------                ----------------
boolean             only encode the true case    is_alive
categorical         append value to name         color=green
ordinal+monotonic   :approx_value                education:2
numeric             :actual_value                height:1.85
Run Code Online (Sandbox Code Playgroud)

最后的说明:

  • vw所有变量都是数字.编码技巧只是使事物看起来categorical或的实用方法boolean.布尔变量只是数字0或1; 分类变量可以编码为boolean:name + value:1.
  • 任何其值不与标签单调的变量在数值编码时可能不太有用.
  • 任何与标签不线性相关的变量都可能受益于训练前的非线性变换.
  • 任何具有零值的变量都不会对模型产生影响(例外:使用该--initial_weight <value>选项时),因此可以从训练集中删除它
  • 解析特征时,仅:将其视为特殊分隔符(在变量名称及其数值之间),其他任何内容都被视为名称的一部分,整个名称字符串将散列到内存中的某个位置.遗漏的:<value>部分意味着:1

编辑:名称空间怎么样?

名称空间前置于具有特殊字符分隔符的要素名称,因此它们将相同的要素映射到不同的散列位置.例:

|E low |I low
Run Code Online (Sandbox Code Playgroud)

基本上等同于(没有名称空间平面示例):

|  E^low:1 I^low:1
Run Code Online (Sandbox Code Playgroud)

主要使用名称空间是很容易地重新定义一个名字空间为其他的所有成员,忽略的特点,与其它等的名称空间的交叉功能的完整名字空间(参见-q,--cubic,--redefine,--ignore,--keep选项).

  • @arielf感谢您的详尽解答!唯一的问题是:我是否需要在_different_名称空间中明确指定分类功能的前缀?也就是说,这个东西:`| E low | I low`被vw视为不同的特征与否?从[输入格式文档](https://github.com/JohnLangford/vowpal_wabbit/wiki/Input-format)我知道它会. (3认同)
  • 谢谢.非常非常清楚.除了通过布尔(作弊表的第一行),我理解逻辑或二进制?也就是说,如果它是二进制的(具有任意两个值而不一定是True/False),我将不必为列名添加前缀,而只是按原样写入值,但在其他三种情况下,列名将不得不以某种形式在值之前. (2认同)
  • 谢谢.所有这些澄清使得使用Vowpal Wabbit变得更加容易. (2认同)
  • 很好的问题我也分享! (2认同)
  • @kurtosis - 是的,不同的名称空间会将相同的要素名称映射到不同的位置 - 即单独的要素.我会将此添加到答案中. (2认同)