machine-learning - 我可以使用嵌入层而不是一个热作为类别输入吗?
问题描述
我正在尝试使用 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 维向量(one-hot encoding)要少得多,并且较小的参数空间可能有助于泛化和避免过拟合。
推荐阅读
- ios - iOS/Objective-C 谷歌云存储上传文件
- android - 从远程网站访问科尔多瓦相机
- rest - 合作伙伴中心 获取资源名称对象级别
- arrays - 计算现有表中的重复出现次数
- php - 如果列包含 Laravel 中的 JSON 编码数据,我如何在数据库中搜索值
- excel - 将数据从 Query 丢失到 Excel 工作表
- ssis - 无法从 SSIS 访问 DB2 的全局临时表
- javascript - 从另一个 XPath 结果获取 XPath 结果
- excel - 如何在 PowerBI / Excel 中创建以下(描述中的链接)数据透视表?
- node.js - Node.js Promise.all 当函数什么都不返回时