2025, Oct 16 19:17
Как починить конфликт scikit-learn и imbalanced-learn в Poetry
Poetry конфликтует при установке scikit-learn и imbalanced-learn из‑за sklearn-compat Решение фиксировать scikit-learn<1.7 или ставить imbalanced-learn из Git
При добавлении scikit-learn и imbalanced-learn в новый проект на Poetry, механизм разрешения зависимостей может завершиться сбоем из‑за конфликта версий. Суть проблемы — ограничение, введённое пакетом sklearn-compat, от которого зависит imbalanced-learn. Ниже — краткое объяснение того, что происходит, почему так выходит и как двигаться дальше, не ломая текущую настройку.
Как воспроизвести проблему
Начните с минимальной конфигурации проекта под Python 3.13. Версия Poetry — 2.1.4.
# Файл pyproject.toml
[project]
name = "ml-kit"
version = "0.1.0"
description = ""
authors = [
    {name = "", email = ""}
]
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
]
Попробуйте добавить оба пакета через Poetry:
ubuntu@ubuntu:~/ml-kit$ poetry add scikit-learn imbalanced-learn
Creating virtualenv ml-kit in /home/ubuntu/ml-kit/.venv
Using version ^1.7.1 for scikit-learn
Using version ^0.13.0 for imbalanced-learn
Updating dependencies
Resolving dependencies... (0.4s)
Because no versions of sklearn-compat match >0.1,<0.1.1 || >0.1.1,<0.1.2 || >0.1.2,<0.1.3 || >0.1.3,<1
 and sklearn-compat (0.1.0) depends on scikit-learn (>1.2,<1.7), sklearn-compat (>=0.1,<0.1.1 || >0.1.1,<0.1.2 || >0.1.2,<0.1.3 || >0.1.3,<1) requires scikit-learn (>1.2,<1.7).
And because sklearn-compat (0.1.1) depends on scikit-learn (>=1.2,<1.7), sklearn-compat (>=0.1,<0.1.2 || >0.1.2,<0.1.3 || >0.1.3,<1) requires scikit-learn (>=1.2,<1.7).
And because sklearn-compat (0.1.2) depends on scikit-learn (>=1.2,<1.7)
 and sklearn-compat (0.1.3) depends on scikit-learn (>=1.2,<1.7), sklearn-compat (>=0.1,<1) requires scikit-learn (>=1.2,<1.7).
Because no versions of imbalanced-learn match >0.13.0,<0.14.0
 and imbalanced-learn (0.13.0) depends on sklearn-compat (>=0.1,<1), imbalanced-learn (>=0.13.0,<0.14.0) requires sklearn-compat (>=0.1,<1).
Thus, imbalanced-learn (>=0.13.0,<0.14.0) requires scikit-learn (>=1.2,<1.7).
So, because ml-kit depends on both scikit-learn (^1.7.1) and imbalanced-learn (^0.13.0), version solving failed.
ubuntu@ubuntu:~/ml-kit$
Что именно ломается
Сбой вызван транзитивными ограничениями. imbalanced-learn использует sklearn-compat, а sklearn-compat требует scikit-learn ниже 1.7. Когда Poetry выбирает для проекта scikit-learn ^1.7.1, это противоречит верхней границе, заданной sklearn-compat. Резолвер явно показывает эту цепочку: imbalanced-learn 0.13.0 зависит от sklearn-compat (>=0.1,<1), а все доступные релизы sklearn-compat 0.1.x требуют scikit-learn >=1.2,<1.7.
Два практичных варианта решения
Первый путь — согласовать версию scikit-learn с ограничением, приходящим через sklearn-compat. Зафиксируйте scikit-learn ниже 1.7 и позвольте Poetry решить остальное. Так вы останетесь на выпущенных, пакованных версиях и строго в рамках опубликованных ограничений.
poetry add 'scikit-learn<1.7' imbalanced-learn
Второй путь — подключить imbalanced-learn напрямую из репозитория. Следующее обсуждение в трекере проекта даёт контекст:
Still don't support scikit-learn 1.70? · Issue #1141 · scikit-learn-contrib/imbalanced-learn
Установка из репозитория через pip проверена и автоматически подтягивает scikit-learn 1.7.1:
pip install git+https://github.com/scikit-learn-contrib/imbalanced-learn.git
С Poetry при использовании того же Git-URL поведение может отличаться. Команда ниже способна вывести сообщение «Unable to create package with no name»:
poetry add git+https://github.com/scikit-learn-contrib/imbalanced-learn.git
При этом есть сообщение, что использование этого URL работает. Если установка из Git вписывается в ваш процесс, такой подход позволит двигаться дальше с более новой версией scikit-learn.
Рабочий пример
Если хотите оставаться на выпущенных пакетах, зафиксируйте scikit-learn ниже 1.7. Poetry отработает без конфликтов:
ubuntu@ubuntu:~/ml-kit$ poetry add 'scikit-learn<1.7' imbalanced-learn
В результате pyproject будет эффективно ограничивать scikit-learn совместимым диапазоном, сохраняя imbalanced-learn на версии 0.13.x.
Почему это важно
Прослойки вроде sklearn-compat — распространённый мост во время переходов зависимостей. Они защищают зависимые библиотеки от ломающих изменений, но при этом могут сдерживать верхнеуровневую версию, если позволить резолверу выбирать самое новое. Понимание того, какой пакет задаёт верхнюю границу, помогает решить, принять ли более старый, стабильный набор зависимостей или временно перейти на установку из Git, пока проект подтягивается к новому мажорному или минорному релизу.
Итоги
Если Poetry не может разрешить зависимости с scikit-learn и imbalanced-learn, внимательно читайте вывод резолвера. Если в цепочке присутствует sklearn-compat и он ограничивает scikit-learn ниже 1.7, зафиксируйте scikit-learn<1.7 и продолжайте работу — или установите imbalanced-learn напрямую из репозитория, если это соответствует вашей политике. Следите за связанным обсуждением, чтобы узнать, когда в выпущенных пакетах снимут ограничение и можно будет вернуться к последнему scikit-learn без дополнительных шагов.