Я работаю с набором данных, состоящим из 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 с пользовательской метрикой?
Извините, если мой английский не ясен.
Определенные пользователем функции не особенно быстрые в Python; есть много накладных расходов, называя их. Ваша пользовательская метрика может заменить что-то, что реализовано в C. – chepner
Матрица расстояния с евклидовой метрикой для KNN может быть реализована в терминах матричных добавлений и умножений (используя тот факт, что || ab ||^2 = || a ||^2 + || b ||^2 - 2 ), которые сильно оптимизированы и распараллелены (OpenBLAS, ATLAS или MKL) – damienfrancois
@chepner Есть ли служебные данные даже в функции только «return 1»? Кроме того, как я указал выше, я реализовал метрику на Cython, и время выполнения тоже было большим. @damienfrancois У меня нет проблемы с евклидовой метрикой. Он находится в стандартной метрике sklearn. У меня проблема с производительностью, когда я пытаюсь использовать свою собственную метрику. Должен ли я взглянуть на библиотеки C/C++ и повторно реализовать свою программу на C/C++? – ANtlord