我有一个大型分类数据集和一个用于分类目的的前馈ANN。我使用 Excel VBA(我目前唯一可以访问的编程语言)对机器学习模型进行了编程。
我的数据集中有 150 个类别需要处理。我尝试使用二进制编码和独热编码,但是由于我需要处理的类别数量众多,这些向量通常太大,VBA 无法处理,最终出现内存错误。
我想试一试哈希技巧,看看它是否更好用。但是,我不明白如何使用Excel执行此操作。
我已经查看了以下链接以尝试理解它:
https://learn.microsoft.com/en-us/azure/machine-learning/studio-module-reference/feature-hashing
https://medium.com/value-stream-design/introducing-one-of-the-best-hacks-in-machine-learning-the-hashing-trick-bf6a9c8af18f
https://en.wikipedia.org/wiki/Vowpal_Wabbit
我仍然不完全理解它。这是我到目前为止所做的。我使用以下代码示例为我的分类日期创建哈希序列: 使用VBA生成基于短哈希字符串
使用上面的代码,我已经能够生成无碰撞的数字哈希序列。但是,我现在该怎么办?哈希序列现在需要转换为二进制向量吗?这就是我迷路的地方。
到目前为止,我提供了一个数据的小示例。有人可以一步一步地向我展示哈希技巧的工作原理(最好是 Excel )吗?
'CATEGORY 'HASH SEQUENCE
STEEL 37152
PLASTIC 31081
ALUMINUM 2310
BRONZE 9364
所以散列技巧的作用是防止~假词占用额外的内存。在常规词袋 (BOW) 模型中,词汇表中每个单词都有 1 个维度。这意味着拼写错误的单词和常规单词都可以占用不同的维度 - 如果模型中有拼写错误的单词。如果模型中没有拼写错误的单词,(取决于您的模型),则可以完全忽略它。随着时间的推移,这会增加。对于拼写错误的单词,我只是使用一个单词的示例,这些单词不在你用来创建向量来训练模型的词汇表中。这意味着任何以这种方式训练的模型如果不重新训练,就无法适应新的词汇。
散列方法允许您合并词汇以外的单词,但可能会损失一些准确性。它还确保您可以绑定内存。本质上,哈希方法首先定义一个哈希函数,该函数接受一些输入(通常是单词)并将其映射到已确定范围内的输出值。您可以选择哈希函数来输出 0-2^16 之间的某个位置。因此,您知道输出向量将始终限制在大小 2^16(实际上是任意值),因此您可以防止内存问题。此外,哈希函数有"冲突" - 这意味着哈希(a)可能等于哈希(b) - 很少有适当的输出范围,但它是可能的。这意味着你会失去一些准确性 - 但由于哈希函数理论上能够接受任何输入字符串,它可以与词汇表外的单词一起工作,以获得与用于训练模型的原始向量相同大小的新向量。由于新数据向量的大小与之前用于训练模型的数据向量大小相同,因此可以使用它来优化模型,而不是被迫训练新模型。