Vowpal Wabbit 如何表示分类特征
Vowpal Wabbit how to represent categorical features
我有以下所有分类变量的数据:
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)。
就我对将上述数据转换为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
这里,'person'是命名空间,其他都是特征值,以各自的特征名称为前缀。我对么?不知何故,这种特征值的表示让我很困惑。还有其他表示特征的方法吗?不胜感激
是的,你是对的。
这种表示肯定适用于元音兔,但在某些情况下,可能不是最优的(视情况而定)。
为了表示无序,分类变量(具有离散值),标准的vowpal wabbit技巧是使用logical/boolean 每个可能的 (name, value) 组合的值(例如 person_is_good, color_blue, color_red
)。这样做的原因是 vw
在缺少值的地方隐式假定值 1
。 color_red, color=red
、color_is_red
甚至 (color,red)
和 color_red:1
之间没有实际区别,除了内存中的哈希位置。唯一不能在变量名中使用的字符是特殊分隔符(:
和 |
)和白色-space.
Terminology note: this trick of converting each (feature + value) pair into a separate feature is sometimes called "One Hot Encoding".
但在这种情况下,变量值可能不是 "strictly categorical"。他们可能是:
- 严格排序,例如 (
low < basic < high < v_high
)
- 大概与您要预测的标签具有 单调关系
因此,通过使它们成为 "strict categorical"(我对不具有上述两个属性的具有离散范围的变量的术语),您可能会丢失一些可能有助于学习的信息。
在您的特定情况下,将值转换为数字可能会获得更好的结果,例如(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 中编码变量的简短作弊-sheet:
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
编辑:name-spaces 怎么样?
Name spaces 被预先添加到带有特殊字符分隔符的特征名称,因此它们将相同的特征映射到不同的哈希位置。示例:
|E low |I low
本质上等同于(无名spaces平面示例):
| E^low:1 I^low:1
name-spaces的主要用途是很方便的把一个name-space的所有成员重新定义成别的东西,忽略一个全名space的特征,交叉特征名称 space 与另一个名称等的组合(参见 -q
、--cubic
、--redefine
、--ignore
、--keep
选项)。
我有以下所有分类变量的数据:
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)。
就我对将上述数据转换为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
这里,'person'是命名空间,其他都是特征值,以各自的特征名称为前缀。我对么?不知何故,这种特征值的表示让我很困惑。还有其他表示特征的方法吗?不胜感激
是的,你是对的。
这种表示肯定适用于元音兔,但在某些情况下,可能不是最优的(视情况而定)。
为了表示无序,分类变量(具有离散值),标准的vowpal wabbit技巧是使用logical/boolean 每个可能的 (name, value) 组合的值(例如 person_is_good, color_blue, color_red
)。这样做的原因是 vw
在缺少值的地方隐式假定值 1
。 color_red, color=red
、color_is_red
甚至 (color,red)
和 color_red:1
之间没有实际区别,除了内存中的哈希位置。唯一不能在变量名中使用的字符是特殊分隔符(:
和 |
)和白色-space.
Terminology note: this trick of converting each (feature + value) pair into a separate feature is sometimes called "One Hot Encoding".
但在这种情况下,变量值可能不是 "strictly categorical"。他们可能是:
- 严格排序,例如 (
low < basic < high < v_high
) - 大概与您要预测的标签具有 单调关系
因此,通过使它们成为 "strict categorical"(我对不具有上述两个属性的具有离散范围的变量的术语),您可能会丢失一些可能有助于学习的信息。
在您的特定情况下,将值转换为数字可能会获得更好的结果,例如(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 中编码变量的简短作弊-sheet:
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
编辑:name-spaces 怎么样?
Name spaces 被预先添加到带有特殊字符分隔符的特征名称,因此它们将相同的特征映射到不同的哈希位置。示例:
|E low |I low
本质上等同于(无名spaces平面示例):
| E^low:1 I^low:1
name-spaces的主要用途是很方便的把一个name-space的所有成员重新定义成别的东西,忽略一个全名space的特征,交叉特征名称 space 与另一个名称等的组合(参见 -q
、--cubic
、--redefine
、--ignore
、--keep
选项)。