2016-10-27 2 views
0

Я работаю с набором данных, состоящим из 200 тыс. Объектов. Каждый объект имеет 4 функции. Я классифицирую их K ближайшими соседями (KNN) с евклидовой метрикой. Процесс завершается в течение 20 секунд.Почему KNN медленнее с пользовательской метрикой?

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

Я предположил, что причиной этой проблемы является моя метрика. Я заменяю свой код на return 1. KNN все еще работал более одного часа. Я предположил, что причиной является алгоритм Ball Tree, но KNN с ним и эвклидовой метрикой работает в течение примерно 20 секунд.

Прямо сейчас я понятия не имею, что случилось. Я использую Python 3 и sklearn 0.17.1. Here процесс не может быть завершен с помощью настраиваемой метрики. Я также попробовал алгоритм brute, но он имеет тот же эффект. Обновление и понижение scikit-learn не оказывают никакого влияния. Внедрение классификации по пользовательской метрике на Python 2 также не имеет положительного эффекта. Я выполнил эту метрику (просто верните 1) на Cython, она имеет тот же эффект.

def custom_metric(x: np.ndarray, y: np.ndarray) -> float: 
    return 1 

clf = KNeighborsClassifier(n_jobs=1, metric=custom_metric) 
clf.fit(X, Y) 

Могу ли я повысить классификацию процесса с помощью KNN с пользовательской метрикой?

Извините, если мой английский не ясен.

+2

Определенные пользователем функции не особенно быстрые в Python; есть много накладных расходов, называя их. Ваша пользовательская метрика может заменить что-то, что реализовано в C. – chepner

+0

Матрица расстояния с евклидовой метрикой для KNN может быть реализована в терминах матричных добавлений и умножений (используя тот факт, что || ab ||^2 = || a ||^2 + || b ||^2 - 2 ), которые сильно оптимизированы и распараллелены (OpenBLAS, ATLAS или MKL) – damienfrancois

+0

@chepner Есть ли служебные данные даже в функции только «return 1»? Кроме того, как я указал выше, я реализовал метрику на Cython, и время выполнения тоже было большим. @damienfrancois У меня нет проблемы с евклидовой метрикой. Он находится в стандартной метрике sklearn. У меня проблема с производительностью, когда я пытаюсь использовать свою собственную метрику. Должен ли я взглянуть на библиотеки C/C++ и повторно реализовать свою программу на C/C++? – ANtlord

ответ

0

Sklearn оптимизирован и использует cython и несколько процессов для запуска как можно быстрее. Написание чистого кода python, особенно когда оно вызывается несколько раз, является причиной замедления вашего кода. Я рекомендую вам написать свой собственный показатель с помощью cython. У вас есть руководство, в котором вы можете следить прямо здесь: https://blog.sicara.com/https-medium-com-redaboumahdi-speed-sklearn-algorithms-custom-metrics-using-cython-de92e5a325c

0

Как правильно указано @ Réda Boumahdi, причина заключается в использовании настраиваемой метрики, определенной в python. Это известный вопрос, обсуждаемый here. Он был закрыт как «wontfix» в конце обсуждения. Таким образом, только предлагаемое решение заключается в написании вашей настраиваемой метрики на языке cython, чтобы избежать GIL, который замедляется в случае использования метрики python.

Смежные вопросы