Вопрос или проблема
Я унаследовал решение, которое работает на Databricks Runtime 7.3 и использует scikit-learn 0.21. Databricks Runtime необходимо обновить, и поэтому существующая версия scikit-learn несовместима с версией Python в более новых Databricks Runtime. Я попытался обновить версию scikit-learn, но теперь решение не работает с следующими сообщениями: ModuleNotFoundError: No module named ‘sklearn.neighbors.ball_tree’
Секция кода, где возникает ошибка: bt = pickle.load(open(‘/dbfs/mnt/storage/Numpy/’ + area + ‘.bt’, ‘rb’))
По этой ссылке: https://stackoverflow.com/questions/60145652/no-module-named-sklearn-neighbors-base я прочитал, что модули изменили названия, чтобы включать ‘_’ . Но я не вижу, что это здесь так.
Нет предыдущего опыта работы с scikit, pickle и так далее. Что мне нужно сделать, чтобы заставить рабочий дерево шаров?
Другие библиотеки, установленные в кластере/runtime:
- azure-storage-blob==2.0.1 PyPI
- geopy==1.23.0 PyPI
- haversine PyPI
- pyproj==3.7.0 PyPI
- scipy PyPI
- vincenty PyPI
- applicationinsights PyPI
- cryptography==2.9 PyPI
- numpy==1.26.4 PyPI
- pandas==1.5.3 PyPI
- scikit-learn PyPI
- shapely PyPI
- xarray PyPI
Ответ или решение
Обновление scikit-learn: Как исправить проблему с несовместимостью
После обновления Databricks Runtime и попытки повышения версии библиотеки scikit-learn, вы столкнулись с ошибкой ModuleNotFoundError: No module named 'sklearn.neighbors.ball_tree'
. Эта проблема возникла в результате изменений в архитектуре библиотеки scikit-learn, что часто случается при переходе на более новые версии.
Причины проблемы
-
Изменения в API: Поскольку вы обновили scikit-learn, некоторые классы или модули могли быть перемещены, удалены или изменены. Ваша версия 0.21 могла использовать модули или классы, которые не существуют в новых версиях.
-
Формат сериализации (pickle): Вы использовали
pickle
для сериализации объекта BallTree, что может оказаться несовместимым между разными версиями библиотеки. Если BallTree был сериализован в более ранней версии, его нельзя будет загрузить в новой без изменений.
Шаги для решения проблемы
-
Определите используемую версию библиотеки: Узнайте, какая версия scikit-learn установлена в вашей среде, и проверьте документацию по API для этой версии. Это поможет вам определить, какие изменения произошли.
-
Локальная проверка: Если это возможно, создайте локальное окружение с такой же версией Python и scikit-learn, которая использовалась в исходном решении. Это позволит протестировать код и поработать над преобразованиями.
-
Обновление кода:
-
Замените инстанцирование BallTree в вашем коде на:
from sklearn.neighbors import BallTree
Убедитесь, что вы не используете
sklearn.neighbors.ball_tree
как отдельный модуль. -
Если в вашем коде использовались специфические параметры или методы для BallTree, проверьте их, так как они могли измениться в новой версии.
-
-
Переопределение или сохранение модели: Если вы не можете использовать
pickle
для загрузки ранее сохраненной модели, рассмотрите возможность переобучения модели с использованием новых данных. Это также даст вам возможность убедиться в том, что ваша модель адаптирована под новую версию библиотеки. -
Использование альтернативных методов сериализации: Если
pickle
вызывает подобные проблемы и вы хотите сохранить точность ваших данных, рассмотрите возможность использования библиотекиjoblib
, которая может лучше справляться с большими объектами NumPy.from joblib import dump, load # Сохранение dump(bt, '/dbfs/mnt/storage/Numpy/' + area + '.bt') # Загрузка bt = load('/dbfs/mnt/storage/Numpy/' + area + '.bt')
-
Тестирование: После внесения изменений не забудьте протестировать свой код. Убедитесь, что все функции работают корректно после обновления библиотеки.
Заключение
Ошибки при обновлении библиотек, таких как scikit-learn, могут быть вызваны множеством факторов, включая изменения в API и несовместимость сериализованных объектов. Следуя предложенным шагам, вы сможете устранить проблему и адаптировать ваше приложение к новой версии библиотеки. Важно также поддерживать актуальность документации и учитывать изменения при дальнейших обновлениях.