Я обучил модели уменьшения размерности в scikit-learn. Это применяет PCA на частотах термина от текста.
После того, как он обучен, запуск модели занимает около 1,7 с.
Когда я теперь использую picklib, используя joblib или dill, а затем открываю модель в той же оболочке python, время выполнения увеличивается примерно до 6 секунд.
Я профилировал с% prun, и это нормальный
2430 function calls (2410 primitive calls) in 1.708 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
2 1.685 0.842 1.685 0.842 {method 'ravel' of 'numpy.ndarray' objects}
1 0.010 0.010 1.694 1.694 compressed.py:464(_mul_multivector)
1 0.001 0.001 0.001 0.001 {built-in method scipy.sparse._sparsetools.csr_matmat_pass2}
54 0.001 0.000 0.001 0.000 numeric.py:424(asarray)
Это маринованный / маринованный:
2428 function calls (2408 primitive calls) in 5.806 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
2 5.786 2.893 5.786 2.893 {method 'ravel' of 'numpy.ndarray' objects}
1 0.009 0.009 5.796 5.796 compressed.py:464(_mul_multivector)
1 0.001 0.001 0.001 0.001 {built-in method scipy.sparse._sparsetools.csr_matmat_pass2}
1 0.001 0.001 0.001 0.001 {built-in method scipy.sparse._sparsetools.csr_matmat_pass1}
1 0.001 0.001 5.804 5.804 pipeline.py:752(transform)
Так что, похоже, функция ravel в numpy.ndarray поглощает намного больше времени Также при уменьшении размерности на 1 или 10 выборок нет разницы во времени выполнения. Что может вызвать это?
Обновление: ниже я добавил простой воспроизводимый пример
from sklearn.datasets import fetch_20newsgroups
from sklearn.decomposition import TruncatedSVD
from sklearn.feature_extraction.text import TfidfVectorizer
from time import time
from sklearn.externals import joblib
dataset = fetch_20newsgroups(subset='all', shuffle=True, random_state=42)
tfidf_vectorizer_subl = TfidfVectorizer(max_df=0.95, min_df=2,
max_features=None,
strip_accents = 'unicode',
ngram_range =(1,2),
sublinear_tf=True
)
tfidf_subl = tfidf_vectorizer_subl.fit_transform(dataset.data[:5000])
n_components = 1000
svd = TruncatedSVD(n_components)
svd.fit(tfidf_subl)
t0 = time()
X_lsa = svd.transform(tfidf_subl)
print("done in %fs" % (time() - t0)) #done in 2.240295s
with open('test', 'wb') as file:
joblib.dump(svd, file)
with open('test' ,'rb') as f:
svd_unpickled = joblib.load(f)
t0 = time()
X_lsa = svd_unpickled.transform(tfidf_subl)
print("done in %fs" % (time() - t0)) #done in 3.551007s WHY DOES THIS TAKE LONGER
- Версия Python: 3.5.3
- Numpy версия: 1.14.3
- Версия Scipy: 1.1.0
- Версия Sklearn: 0.19.1