Как заставить алгоритм scikit-learn ближайших соседей работать быстрее?

#python #scikit-learn #knn #recommendation-engine

#python #scikit-learn #knn #рекомендация-движок

Вопрос:

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

Однако для получения вывода рекомендательной системы при запуске в моей системе с 8 ГБ оперативной памяти требуется около 4 часов. Я попытался запустить тот же скрипт на оперативной памяти около 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. Я рекомендую выполнить некоторое профилирование, чтобы выяснить, на что вы тратите все свое время. Если вы обнаружите, что время сосредоточено в одном месте, легче дать рекомендацию. Возможно, вы проводите большую часть своего времени в sci-kit learn, и в этом случае вы можете быть ограничены в том, что вы можете сделать, чтобы увеличить время в вашем коде.

2. Насколько велик набор обучающих данных?

3. @davidrpugh Обучающий набор составляет около 11 000. Проблема в том, запускаю ли я его в системе объемом 8 ГБ или 32 ГБ, нет никакой разницы во времени вычислений.

4. @fiveclubs Спасибо за ответ, я попробую то, что вы предложили.

5. Тот факт, что добавление большего объема памяти не влияет на время вычислений, предполагает, что ограничением привязки является вычисление, а не память.

Ответ №1:

Сначала вам обязательно нужно профилировать свой код. Я бы рекомендовал использовать %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 цикл, но для этого потребуется рефакторинг вашей системы рекомендаций, и я не могу помочь с этим без дополнительной информации.

Комментарии:

1. Привет, Дэвид, спасибо за предложения. Я попробовал профилирование, как было предложено для выборки из 1000 строк, и приложил снимок результатов в исходном вопросе. Я также попытался установить для ‘n_jobs’ значение 2, но, к сожалению, это ухудшило мою производительность. Теперь для тех же 1000 строк требуется около 90 минут. Я также исправил настройку countvectoriser, но это не имело никакого значения. Если у вас есть еще какие-либо предложения, пожалуйста, дайте мне знать. Это мне очень поможет.