可以使用嵌入层替代类别输入的一热编码吗?

我正在尝试使用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可以被视为一个字段。其他的属性也是类似的。

我的问题是能否使用嵌入层来替代一热编码的过程?然而,这让我有些顾虑。

  1. 我没有任何其他相关数据集,所以我无法使用任何预训练的嵌入模型。我只能随机初始化嵌入权重并用我自己的数据集进行训练。这种方法可行吗?
  2. 如果我使用嵌入层替代一热编码,是否意味着每个属性将属于一个字段?
  3. 这两种方法之间有什么区别?哪一种更好?

回答:

是的,你可以使用嵌入层,这种方法是可行的。

属性不会等于嵌入中的一个元素,但那一组元素的组合将等于那个属性。嵌入的大小是你需要自己选择的。一个好的公式是embedding_size = min(50, m+1// 2),其中m是类别的数量,所以如果m=10,你的嵌入大小将是5

更高的嵌入大小意味着它将捕捉到类别变量之间更多细节的关系。

根据我的经验,嵌入确实有帮助,特别是当某个类别中有数百个类别时(如果你只有少量类别,例如一个人的性别,那么一热编码就足够了)。

关于哪一种方法更好,我发现当一个类别中有数百个唯一值时,嵌入通常表现得更好。为什么会这样,我没有具体的原因,但有一些直觉上的理解。

例如,将类别表示为300维的密集向量(词嵌入)要求分类器学习的权重远少于将类别表示为50,000维的向量(一热编码),较小的参数空间可能有助于泛化和避免过拟合。

Related Posts

如何对SVC进行超参数调优?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

如何在初始训练后向模型添加训练数据?

我想在我的scikit-learn模型已经训练完成后再…

使用Google Cloud Function并行运行带有不同用户参数的相同训练作业

我正在寻找一种方法来并行运行带有不同用户参数的相同训练…

加载Keras模型,TypeError: ‘module’ object is not callable

我已经在StackOverflow上搜索并阅读了文档,…

在计算KNN填补方法中特定列中NaN值的”距离平均值”时

当我从头开始实现KNN填补方法来处理缺失数据时,我遇到…

使用巨大的S3 CSV文件或直接从预处理的关系型或NoSQL数据库获取数据的机器学习训练/测试工作

已关闭。此问题需要更多细节或更清晰的说明。目前不接受回…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注