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