Vowpal Wabbit 如何表示分类特征
Posted
技术标签:
【中文标题】Vowpal Wabbit 如何表示分类特征【英文标题】:Vowpal Wabbit how to represent categorical features 【发布时间】:2015-04-22 19:57:57 【问题描述】:我有以下所有分类变量的数据:
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
这里,“person”是命名空间,所有其他都是特征值,以各自的特征名称为前缀。我对么?不知何故,这种特征值的表示让我很困惑。有没有其他方式来表示特征?将不胜感激。
【问题讨论】:
【参考方案1】:是的,你是对的。
这种表示肯定适用于 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
之间没有实际区别,除了内存中的哈希位置。唯一不能在变量名中使用的字符是特殊分隔符(:
和 |
)和空格。
术语说明:这种将每个(特征 + 值)对转换为单独特征的技巧有时称为“One Hot Encoding”。
但在这种情况下,变量值可能不是“严格分类的”。他们可能是:
严格排序,例如 (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
问题中的训练集应该可以正常工作,因为即使您将所有离散变量都转换为布尔变量,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
,@ 987654346@、--redefine
、--ignore
、--keep
选项)。
【讨论】:
谢谢。非常非常清楚。除了布尔值(备忘单的第一行),我是理解逻辑还是二进制?也就是说,如果它是二进制的(具有任意两个值,不一定是真/假),我不必为列名添加前缀,而只需按原样写值,但在其他三种情况下,列名必须以某种形式出现在值之前。 谢谢。所有这些说明使使用 Vowpal Wabbit 变得更加容易。 @arielf 感谢您详尽的回答!唯一的问题:我是否需要为 不同 命名空间中的分类特征明确指定前缀?也就是说,这些东西:|E low |I low
是否会被大众视为不同的功能?从input format doc 我知道它会的。
我也分享了好问题!
@kurtosis - 是的,不同的名称空间会将相同的功能名称映射到不同的位置 - 即单独的功能。我会将其添加到答案中。以上是关于Vowpal Wabbit 如何表示分类特征的主要内容,如果未能解决你的问题,请参考以下文章
Vowpal Wabbit 中的纠错锦标赛 (ect) 多类分类