【问题标题】:scikit-learn HashingVectorizer on sparse matrix稀疏矩阵上的 scikit-learn HashingVectorizer
【发布时间】:2015-08-04 23:48:21
【问题描述】:

在 scikit-learn 中,如何对 scipy.sparse 矩阵中已经存在的数据运行 HashingVectorizer?

我的数据是 svmlight 格式,所以我用 sklearn.datasets.load_svmlight_file 加载它并获得一个 scipy.sparse 矩阵来处理。

来自 scikit-learn 的 TfidfTransformer 可以输入这样一个稀疏矩阵来转换它,但是我怎样才能将相同的稀疏矩阵提供给 HashingVectorizer 以使用它呢?

编辑: 是否有可能在稀疏矩阵上使用一系列方法调用,可能使用FeatureHasher

编辑 2:在与下面的用户 cfh 进行有用的讨论之后,我的目标是从输入:从 svmlight 数据获取的稀疏计数矩阵到输出:令牌出现的矩阵,例如 HashingVectorizer 给出的。这怎么可能?

我在下面提供了一个示例代码,非常感谢有关如何执行此操作的一些帮助,在此先感谢:

from sklearn.feature_extraction.text import TfidfTransformer
import numpy as np
from sklearn.feature_extraction.text import HashingVectorizer
from scipy.sparse import csr_matrix

# example data
X_train = np.array([[1., 1.], [2., 3.], [4., 0.]])
print "X_train: \n", X_train
# transform to scipy.sparse.csr.csr_matrix to be consistent with output from load_svmlight_file
X_train_crs = csr_matrix(X_train)
print "X_train_crs: \n", X_train_crs   
# no problem to run TfidfTransformer() on this csr matrix to get a transformed csr matrix
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X_train)
print "tfidf: \n", tfidf
# How do I use the HashingVectorizer with X_train_crs ?
hv = HashingVectorizer(n_features=2)

【问题讨论】:

  • 我不明白这个问题。 HashingVectorizer 计算一个文档术语矩阵,就是你可以输入TfidfTransformer 的那种矩阵。为什么要再次散列这样的矩阵?
  • TfidfTransformer“将计数矩阵转换为标准化的 tf 或 tf-idf 表示”。我有一个计数矩阵,但我需要在其上应用散列技巧。 HashingVectorizer“将文本文档集合转换为标记出现的矩阵”。所以我的目标是:输入:计数矩阵和输出:标记出现的散列矩阵。
  • 我不认为这就是散列技巧的工作原理,您应该在解析期间对单词进行散列,而不是构建字典:en.wikipedia.org/wiki/…
  • 换句话说,HashingVectorizer 已经实现了散列技巧。
  • 我拥有的数据是 svmlight 格式。我看到它目前可能工作的唯一方法是读取 svmlight 数据,在文本文件中再次写入,然后通过HashingVectorizer 再次读取,但这似乎非常低效。有什么建议吗?

标签: python matrix machine-learning scipy scikit-learn


【解决方案1】:

哈希基本上将单词随机组合到较少数量的桶中。使用已经计算的频率矩阵,您可以像这样模拟:

n_features = X_train.shape[1]
n_desired_features = n_features / 5
buckets = np.random.random_integers(0, n_desired_features-1, size=n_features)
X_new = np.zeros((X_train.shape[0], n_desired_features), dtype=X_train.dtype)
for i in range(n_features):
    X_new[:,buckets[i]] += X_train[:,i]

当然,您可以根据需要调整n_desired_features。 只需确保对测试数据也使用相同的 buckets

如果你需要对稀疏矩阵做同样的事情,你可以这样做:

M = coo_matrix((repeat(1,n_features), (range(n_features), buckets)),
               shape=(n_features,n_desired_features))
X_new = X_train.dot(M)

【讨论】:

  • 不幸的是,这仅在 X_train 是 numpy.ndarray 时有效,但如果是稀疏 csr 矩阵则无效,这是必需的,因为输入数据中有数百万个特征。
  • @tkja:但是您可以轻松地设置一个大小为n_features x n_desired_features 的稀疏矩阵,当它与您的实际特征矩阵相乘时,将产生与我在答案栏中所描绘的相同的效果 -按列。
  • @tkja:我已经为此添加了一个示例。
  • 最后一行,你的意思是X_new = X_train.dot(M)吗?另外,shape=(5,5) 应该是,正如您之前所说的,shape(n_features x n_desired_features)?如果是这样,您能否在答案中重新格式化它作为一个独立的示例?然后我可以接受它,它可能对其他有类似问题的人有所帮助。谢谢!
  • @tkja:当然,这些只是稀疏矩阵的不同存储格式。只需确保两个类的构造函数参数匹配即可。
猜你喜欢
  • 2019-05-29
  • 2017-07-10
  • 2012-11-24
  • 2015-09-28
  • 2015-07-26
  • 2013-04-12
  • 2016-04-08
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多