赞
踩
在机器学习中,特征哈希也称为哈希技巧(类比于核技巧),是一种快速且空间利用率高的特征向量化方法,即将任意特征转换为向量或矩阵中的索引。它通过对特征应用散列函数并直接使用特征的散列值作为索引来工作,而不是在关联数组中查找索引。
在典型的文档分类任务中,机器学习算法(包括学习和分类)的输入是自由文本。 因此,构造了BOW表示:每个单词被抽取并计数,并且在训练集中的每个不同的单词都定义了训练集和测试集中每个文档的一个特征(独立变量)。
但是,机器学习算法通常用数值向量来定义。 因此一个文档集中的单词被认为是一个文档矩阵,其中每行是一个文档,每列是一个特征/单词; 在这个矩阵中的i,j项捕获了文档i中词汇表的第j项的频率(或权重)。根据Zipf定律,这些向量通常极其稀疏。
常用的方法是在训练时或在此之前构建训练集词汇表的字典表示,并用它将单词映射到索引。 例如这三个文档
可以使用字典转换成文档矩阵
Term | Index |
---|---|
John | 1 |
likes | 2 |
to | 3 |
watch | 4 |
movies | 5 |
Mary | 6 |
too | 7 |
also | 8 |
football | 9 |
(和常见的文档分类和聚类一样,标点符号被删除了)
这个过程的问题在于,这些字典占用大量的存储空间并且规模随着训练集的增长而增长。 如果词典保持不变,对手可能会尝试发现不存在于存储词典中的新单词或拼写错误,来绕开机器学习的过滤器。 这就是为什么Yahoo!尝试使用特征哈希进行垃圾邮件过滤的原因。
哈希技巧并不局限于文本分类和类似文档的任务,也可以应用于任何涉及大规模(可能是无限的)特征的问题。
和维护一个字典不同,使用哈希技巧的特征向量化器可以把哈希函数
def hashing_vectorizer(features, N):
x = N * [0]
for f in features:
h = hash(f)
idx = h % N
x[idx] += 1
return x
因此,如果我们的特征向量是[“cat”,”dog”,”cat”], hash function 是
def hashing_vectorizer(features, N):
x = N * [0]
for f in features:
h = hash(f)
idx = h % N
if ξ(f) == 1:
x[idx] += 1
else:
x[idx] -= 1
return x
上面的代码实际上将每个样本转换为一个向量。 优化后的版本会生成一个
tips:
References:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。