当我使用scipy.sparse.hstack
由 CountVectorizer 等生成的一些稀疏矩阵时,我想合并它们以用于回归,但不知何故它们速度较慢:
- X1 有 10000 个来自 analyse="char" 的特征
- X2 有 10000 个来自 analyse="word" 的特征
- X3 有 20000 个来自 analyse="char" 的特征
- X4 有 20000 个来自 analyse="word" 的特征
您会期望,当您使用 hstack X1 和 X2 时,它的速度与 X3 或 X4 大致相同(功能数量相同)。但这似乎还没有接近:
from scipy.sparse import hstack >>> a=linear_model.Ridge(alpha=30).fit(hstack((X1, X2)),y).predict(hstack((t1,t2))) time: 57.85 >>> b=linear_model.Ridge(alpha=30).fit(X1,y).predict(t1) time: 6.75 >>> c=linear_model.Ridge(alpha=30).fit(X2,y).predict(t2) time: 7.33 >>> d=linear_model.Ridge(alpha=30).fit(X3,y).predict(t3) time: 6.80 >>> e=linear_model.Ridge(alpha=30).fit(X4,y).predict(t4) time: 11.67
我什至注意到,当我hstack
只有一个功能时,模型也会变慢。什么可能导致这种情况,我做错了什么,当然,有什么改进?
值得注意的编辑:
我想介绍一种我认为可以解决它的方法,即构建一个词汇表并使用它来适应:
feats = []
method = CountVectorizer(analyzer="word", max_features=10000, ngram_range=(1,3))
method.fit(train["tweet"])
X = method.fit(...)
feats.extend(method.vocabulary_.keys())
method = CountVectorizer(analyzer="char", max_features=10000, ngram_range=(4,4))
method.fit(train["tweet"])
X2 = method.fit(...)
feats.extend(method.vocabulary_.keys())
newm = CountVectorizer(vocabulary=feats)
newm.fit(train["tweet"])
X3 = newm.fit(...)
当我适合这些时,存储的项目数量会发生一些奇怪的事情(我对没有 20,000 个特征并不感到惊讶,因为可能会有重叠)。怎么会有这么少的“一”?
X
<49884x10000 sparse matrix of type '<class 'numpy.int64'>'
with 927131 stored elements in Compressed Sparse Row format>
X2
<49884x10000 sparse matrix of type '<class 'numpy.int64'>'
with 3256162 stored elements in Compressed Sparse Row format>
X3
<49884x19558 sparse matrix of type '<class 'numpy.int64'>'
with 593712 stored elements in Compressed Sparse Row format>