我正在尝试使用FFM来预测二元标签。我的数据集如下所示:
sex|age|price|label0|0|0|01|0|1|1
我知道FFM是一种将某些属性视为同一字段的模型。如果我使用一热编码来转换数据集,那么数据集将如下所示:
sex_0|sex_1|age_0|age_1|price_0|price_1|label0|0|0|0|0|0|00|1|0|0|0|1|1
因此,sex_0和sex_1可以被视为一个字段。其他的属性也是类似的。
我的问题是能否使用嵌入层来替代一热编码的过程?然而,这让我有些顾虑。
- 我没有任何其他相关数据集,所以我无法使用任何预训练的嵌入模型。我只能随机初始化嵌入权重并用我自己的数据集进行训练。这种方法可行吗?
- 如果我使用嵌入层替代一热编码,是否意味着每个属性将属于一个字段?
- 这两种方法之间有什么区别?哪一种更好?
回答:
是的,你可以使用嵌入层,这种方法是可行的。
属性不会等于嵌入中的一个元素,但那一组元素的组合将等于那个属性。嵌入的大小是你需要自己选择的。一个好的公式是embedding_size = min(50, m+1// 2)
,其中m
是类别的数量,所以如果m=10
,你的嵌入大小将是5
。
更高的嵌入大小意味着它将捕捉到类别变量之间更多细节的关系。
根据我的经验,嵌入确实有帮助,特别是当某个类别中有数百个类别时(如果你只有少量类别,例如一个人的性别,那么一热编码就足够了)。
关于哪一种方法更好,我发现当一个类别中有数百个唯一值时,嵌入通常表现得更好。为什么会这样,我没有具体的原因,但有一些直觉上的理解。
例如,将类别表示为300维的密集向量(词嵌入)要求分类器学习的权重远少于将类别表示为50,000维的向量(一热编码),较小的参数空间可能有助于泛化和避免过拟合。