sba*_*jis 10 python scikit-learn
如何运行sklearn TFIDF vectorizer(和COUNT vectorizer)作为并行作业运行?与其他sklearn模型中的n_jobs = -1参数类似的东西.
Ali*_*Oli 11
这不是直接可能的,因为无法并行/分发对这些矢量化器所需的词汇表的访问.
要执行并行文档向量化,请使用HashingVectorizer替代.scikit文档提供了一个使用此向量化程序批量训练(和评估)分类器的示例.类似的工作流也适用于并行化,因为输入项被映射到相同的向量索引,而并行工作者之间没有任何通信.
只需单独计算部分term-doc矩阵,并在完成所有作业后将它们连接起来.此时,您也可以TfidfTransformer在连接矩阵上运行.
不存储输入项词汇表的最显着缺点是难以找出哪些项被映射到最终矩阵中的哪一列(即逆变换).唯一有效的映射是在术语上使用散列函数来查看分配给哪个列/索引.对于逆变换,您需要对所有唯一术语(即您的词汇表)执行此操作.
先前的答案很好,但是我想在一个示例中进行扩展,并且不推荐使用HashingVectorizer。我在这里提供了完整的示例,您可以在其中看到经过的时间。基本上,在安装矢量化器之后(很难并行化),您可以进行转换(此位易于并行化)。
您可以使用类似以下内容的模型:
print("Extracting tf-idf features")
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
t0 = time()
tfidf = tfidf_vectorizer.fit(data_pd['text'])
print("done in %0.3fs." % (time() - t0))
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法来转换数据:
print("Transforming tf-idf features...")
tfidf = tfidf_vectorizer.transform(data_pd['text'])
print("done in %0.3fs." % (time() - t0))
Run Code Online (Sandbox Code Playgroud)
这是可以并行化的一点,我建议类似以下内容:
import multiprocessing
import pandas as pd
import numpy as np
from multiprocessing import Pool
import scipy.sparse as sp
num_cores = multiprocessing.cpu_count()
num_partitions = num_cores-2 # I like to leave some cores for other
#processes
print(num_partitions)
def parallelize_dataframe(df, func):
a = np.array_split(df, num_partitions)
del df
pool = Pool(num_cores)
#df = pd.concat(pool.map(func, [a,b,c,d,e]))
df = sp.vstack(pool.map(func, a), format='csr')
pool.close()
pool.join()
return df
def test_func(data):
#print("Process working on: ",data)
tfidf_matrix = tfidf_vectorizer.transform(data["text"])
#return pd.DataFrame(tfidf_matrix.toarray())
return tfidf_matrix
#df = pd.DataFrame({'col': [0,1,2,3,4,5,6,7,8,9]})
#df = data_pd
tfidf_parallel = parallelize_dataframe(data_pd, test_func)
Run Code Online (Sandbox Code Playgroud)
先前的解决方案是从此处改编的。
希望对您有所帮助。就我而言,它大大减少了时间。
| 归档时间: |
|
| 查看次数: |
5757 次 |
| 最近记录: |