Как заставить алгоритм scikit-learn Nearest Neighbors работать быстрее? - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь запустить систему текстовых рекомендаций, чтобы найти категорию детали из файла размером примерно 56 КБ: Например: медная трубка -> Провод, Телевидение -> Электроника и т. Д.

Однако,Требуется около 4 часов для получения рекомендуемой выходной системы при работе в моей системе 8 ГБ ОЗУ.Я попытался запустить тот же сценарий на оперативной памяти около 32 ГБ, но нет никакого улучшения во времени вычислений, которое все еще занимает 4 часа.Тренировочный набор для системы рекомендаций составляет около 11 тыс.

Как я могу заставить мою рекомендательную систему работать быстрее?Кажется, что сценарий не использует память эффективно.Любая помощь будет принята с благодарностью.

Примечание: приведенный пример приведен только для иллюстрации, а исходный набор данных гораздо сложнее.

from sklearn.neighbors import NearestNeighbors

#Code for recommendation system
def recommendhts(x,model,train):
    distance,index=model.kneighbors(x.toarray(),n_neighbors=1)
    mi=distance.argmax()
    idx=index[mi][0]
    return(train.iloc[idx]['sHTS'],distance[0][0])

#Training the model of training set
train=pd.read_csv('train0207190144.csv')
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(train['keywords'])
x=X.toarray()
df=pd.DataFrame(x,columns=vectorizer.get_feature_names())
model=NearestNeighbors(metric='correlation',n_neighbors=1)
model.fit(df)
vect=vectorizer.fit(train['keywords'])

#Fitting the Count vectoriser on keywords(product description to be queried)

x_new=vect.transform(product['keywords'])

for i in range(len(product)):
    key=x_new[i]
    output,probability=recommendhts(key,model,train)

Редактировать: я прилагаю снимок экранарезультат профилирования Результаты профилирования кода , как предлагается в комментариях.Я проверил его на выборке из 1000 строк, а время заняло около 1085 секунд.

1 Ответ

0 голосов
/ 22 апреля 2019

Сначала вам обязательно нужно профилировать код Я бы порекомендовал использовать магическую команду %prun в IPython / Jupyter для профилирования вашего скрипта .

Пара других вещей, чтобы попробовать

  1. Установите параметр 'n_jobs', чтобы учесть параллелизм при прогнозировании.

    # setting n_jobs=2 will use 2 cores; setting n_jobs=-1 will use all cores
    model=NearestNeighbors(metric='correlation',n_neighbors=1, n_jobs=2)
    
  2. Непонятно мне, что переоснащение vectorizer необходимо.

    vect=vectorizer.fit(train['keywords'])  # can be removed?
    

Наконец, вы должны иметь возможность векторизовать прогнозы и заменить цикл for, но для этого потребуется рефакторинг вашей системы рекомендаций, и я не могу помочь с этим без дополнительной информации.

...