2025, Oct 16 19:34

Poetry में scikit-learn और imbalanced-learn dependency टकराव: क्यों होता है और कैसे ठीक करें

Python 3.13 पर Poetry में scikit-learn और imbalanced-learn जोड़ते समय sklearn-compat के कारण resolver फेल होता है—इसे पिनिंग या Git इंस्टॉल से कैसे ठीक करें.

एक नए Poetry प्रोजेक्ट में scikit-learn और imbalanced-learn जोड़ते समय, dependency resolver संस्करण टकराव के कारण विफल हो सकता है। समस्या का मूल कारण 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$

असल में टूट क्या रहा है

यह विफलता ट्रांजिटिव constraints के कारण होती है। imbalanced-learn, sklearn-compat का उपयोग करता है, और sklearn-compat को scikit-learn का संस्करण 1.7 से कम चाहिए। जब Poetry आपके प्रोजेक्ट के लिए scikit-learn ^1.7.1 चुनता है, तो यह sklearn-compat द्वारा लगाए गए ऊपरी सीमा से टकरा जाता है। resolver इसे स्पष्ट रूप से दिखाता है: 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 को सीधे उसके रिपॉज़िटरी से लेना। प्रोजेक्ट के ट्रैकर में नीचे दी गई चर्चा पृष्ठभूमि समझाती है:

अभी भी 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

इसी Git URL के साथ Poetry का व्यवहार अलग हो सकता है। नीचे दिया गया कमांड यह संदेश दिखा सकता है: “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 बिना किसी दिक्कत के resolve कर देगा:

ubuntu@ubuntu:~/ml-kit$ poetry add 'scikit-learn<1.7' imbalanced-learn

इससे pyproject में scikit-learn एक अनुकूल रेंज तक सीमित हो जाता है, जबकि imbalanced-learn 0.13.x पर बना रहता है।

यह क्यों महत्वपूर्ण है

sklearn-compat जैसे bindings निर्भरता बदलावों के दौरान एक सामान्य पुल का काम करते हैं। ये downstream लाइब्रेरीज़ को breaking changes से बचाते हैं, लेकिन साथ ही वे उस शीर्ष‑स्तरीय संस्करण को भी रोक सकते हैं जो आप resolver को नवीनतम चुनने देते समय पाते हैं। कौन‑सा पैकेज ऊपरी सीमा लागू कर रहा है, यह समझना मदद करता है तय करने में कि आपको पुराना, स्थिर निर्भरता सेट स्वीकार करना चाहिए या किसी प्रोजेक्ट के नए मेजर या माइनर रिलीज़ तक पहुँचने तक Git‑आधारित इंस्टॉल पर जाना चाहिए।

मुख्य बातें

जब Poetry, scikit-learn और imbalanced-learn के साथ resolve करने में विफल हो, तो resolver का आउटपुट ध्यान से पढ़ें। यदि चेन में sklearn-compat आता है और वह scikit-learn को 1.7 से नीचे सीमित करता है, तो scikit-learn<1.7 पिन करें और आगे बढ़ें, या यदि आपकी नीति अनुमति देती है तो imbalanced-learn को सीधे उसकी रिपॉज़िटरी से इंस्टॉल करें। दिए गए मुद्दे के लिंक पर नज़र रखें—जैसे ही पैकेज्ड रिलीज़ यह सीमा हटाएँ, आप बिना अतिरिक्त चरणों के नवीनतम scikit-learn पर लौट सकते हैं।

यह लेख StackOverflow के एक प्रश्न (लेखक: winter) और furas के उत्तर पर आधारित है।