Чем обусловлена ​​разница во времени исполнения между маринованным трансфомером и обычным? - PullRequest
0 голосов
/ 07 мая 2018

Я обучил модели уменьшения размерности в 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
...