В описании класса NearestNeighbours написано:
n_jobs: int или None, необязательно (по умолчанию = None)
Количество параллельных заданий для поиска соседей.
None
означает 1, если не в контексте: obj: joblib.parallel_backend
.
-1
означает использование всех процессоров. См .: термин: Glossary <n_jobs>
для более подробной информации.
И если мы проверим тело функции _fit функции [sklearn] TSNE, есть строки (746 - 761):
if self.verbose:
print("[t-SNE] Computing {} nearest neighbors...".format(k))
# Find the nearest neighbors for every point
knn = NearestNeighbors(algorithm='auto', n_neighbors=k,
metric=self.metric) # here we may place n_jobs=-1 and its will improve speed of the knn.kneighbours call
t0 = time()
knn.fit(X)
duration = time() - t0
if self.verbose:
print("[t-SNE] Indexed {} samples in {:.3f}s...".format(
n_samples, duration))
t0 = time()
distances_nn, neighbors_nn = knn.kneighbors(
None, n_neighbors=k)
Итак, я проверил и получил улучшение производительности (скорости), просто добавив n_jobs, установленный в -1, к ctor of NearestNeighbouts, но я думаю, что это неправильный способ сделать это, поэтому давайте вернемся к описанию этого класса.
Я пытался сделать это:
with parallel_backend('loky', -1):
X_embedded = TSNE(n_components=2, n_iter_without_progress=100, learning_rate=100.0, verbose=1,
random_state=123).fit_transform(X)
Но это работает на одном процессоре, я также пытался использовать экземпляр 'Parallel' из joblib, но у меня нет улучшения производительности (в отличие от случая, когда я обманул код внутри тела TSNE).
Итак, есть ли какие-либо предложения о том, как я могу использовать joblib, и он будет работать так, как будто я устанавливаю n_jobs = -1 для knn вручную?