《Python大规模机器学习》 —2.4.2哈希技巧

举报
华章计算机 发表于 2020/02/14 21:54:20 2020/02/14
【摘要】 本节书摘来自华章计算机《Python大规模机器学习》 一书中第2章,第2.4.2节,作者是[荷]巴斯蒂安·贾丁(Bastiaan Sjardin)[意]卢卡·马萨罗(Luca Massaron)[意]阿尔贝托·博斯凯蒂(Alberto Boschetti),王贵财 刘春明 译。

2.4.2哈希技巧

如果在你的特征中有某些类别(以值编码或以文本形式保留),那么事情会变得有点棘手。通常,批量学习中,只需对类别进行独热编码并获得与包含类别一样多的新二进制特征。遗憾的是,数据流中,你事先并不知道要处理多少类别,甚至不能通过抽样来确定它们的数量,因为稀有类别可能在数据流中出现得很晚,或者需要大样本才能被发现。你必须首先流式传输所有数据并记录出现的每个类别。无论如何,流可能短暂,有时类的数量很大,以至于它们不能存储在内存中。在线广告数据就是这样的例子,因为它的数据量很大,难以存储,并且流不能被传递多次。此外,广告数据变化多端,特征也在不断变化。

使用文本会使问题变得更加明显,因为你无法预测将要分析的文本中会包含什么样的单词。在一个单词包模型中(在这样的模型中,对于每个文本,当前单词会被计数,它们的频率值会被粘贴在每个单词对应的

特征向量中),你应该能够将每个单词提前映射到某个索引。即使你能够管理这个问题,也必须处理诸如在测试期间会弹出一个未知的单词(因此以前从未映射过)或者当预测器在生产时这样的情况。此外,还应补充一点,作为一种口语,由数十万甚至数百万不同词汇组成的词典完全是很常见的。

综上所述,如果能够预先了解特征中的类,则可以使用Scikit-learn中的独热编码器来处理它们(http://Scikit-learn.org/stable/modules/generated/sklearn.preprocessing. OneHotEncoder.html)。我们实际上不会在这里说明它,但基本上,这种方法与在批量学习中应用的方法并没有什么不同。我们想向你说明的是当你不能真正应用独热编码时该怎么办。

有一个称为哈希技巧的解决方法,因为它基于哈希函数,能处理整数或字符串形式的文本变量和分类变量。它还可以处理定量特征中混合了数值的分类变量。独热编码的核心问题是,在将其特征映射到某个位置后,它会将该位置赋给特征向量中的值。哈希技巧能明确地将值映射到其位置,而无须事先评估特征,因为它利用哈希函数的核心特性——将值或字符串明确地转换为整数值。

因此,使用前唯一必要的准备是创建一个足够大的稀疏向量,来表示数据的复杂性(可能包含从2**19~2**30个元素,具体大小取决于计算机可用内存、总线架构和所使用的哈希函数类型)。如果正在处理某些文本,那么还需要一个标记生成器,这是一个将文本拆分成单个单词并删除标点符号的函数。

一个简单示例就能清楚说明这一点。我们将用到Scikit-learn包中的两个专门函数:HashingVectorizer,它是一个基于哈希技巧的转换器,用于处理文本数据;FeatureHasher,这是另一个转换器,专门用于将表示为Python字典的数据行转换为稀疏特征向量。

第一个示例将一个短语转换成向量:

 image.png

生成的向量仅在特定索引处具有单位值,从而指出短语(单词)中的标记与向量中某个位置之间的关联。遗憾的是,除非我们在外部Python字典中映射每个标记的哈希值,否则关联无法逆转。尽管有可能,但这样的映射确实会消耗内存,因为字典可能会很大,在数百万项甚至更大范围内,这取决于语言和主题。实际上,我们不需要保持这种跟踪,因为哈希函数能保证始终从相同标记生成相同的索引。

哈希技巧的一个真正问题是发生碰撞的偶然性,当两个不同标记与同一个索引关联时就会发生这种情况。这是一个罕见但又可能发生的事情,另一方面,在由数百万个系数构成的模型中,基本不受影响。因此,如果发生碰撞,可能会涉及两个不重要的标记。使用哈希技巧时,发生碰撞的概率很小,因为有足够大的输出向量(例如,元素数量超过2^24),虽然总有可能发生碰撞,但它们几乎不可能会涉及该模型的重要元素。

哈希技巧能用于常规特征向量,尤其是存在分类变量时。下面是FeatureHasher的示例:

 image.png

如果Python字典包含数字值的特征名,以及任何分类变量的特征名和值的组合,那么将使用键的哈希索引映射字典的值,从而创建独热编码的特征向量,以便供SGD算法学习:

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。