13

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

    class  education    income    social_standing
    1       basic       low       good
    0        low        high      V_good
    1        high       low       not_good
    0        v_high     high      good

这里的教育有四个级别(基本、低、高和 v_high)。收入有低和高两个层次;并且 social_standing 具有三个级别(好、v_good 和 not_good)。

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

    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

这里,“人”是命名空间,所有其他都是特征值,以各自的特征名称为前缀。我对么?不知何故,这种特征值的表示让我很困惑。有没有其他方式来表示特征?应不胜感激。

4

1 回答 1

28

是的,你是对的。

这种表示肯定适用于 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除了内存中的哈希位置之间没有实际区别。唯一不能在变量名中使用的字符是特殊分隔符 ( :and |) 和空格。

术语说明:这种将每个(特征 + 值)对转换为单独特征的技巧有时称为“One Hot Encoding”。

但在这种情况下,变量值可能不是“严格分类的”。他们可能是:

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

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

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

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

问题中的训练集应该可以正常工作,因为即使您像以前一样将所有离散变量转换为布尔变量,也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

最后注意事项:

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

编辑:命名空间呢?

名称空间被附加到带有特殊字符分隔符的特征名称之前,因此它们将相同的特征映射到不同的哈希位置。例子:

|E low |I low

本质上等同于(无名称空间平面示例):

|  E^low:1 I^low:1

名称空间的主要用途是轻松地将名称空间的所有成员重新定义为其他内容,忽略功能的完整名称空间,名称空间与另一个名称空间的交叉功能等(请参阅-q, --cubic, --redefine, --ignore,--keep选项)。

于 2015-02-21T09:00:02.963 回答