본문 바로가기

Programming/Python

[Python][Error] ImportError: cannot import name 'if_delegate_has_method' from 'sklearn.utils.metaestimators'

ML를 위해 코드를 작성하던 중 eli5 라이브러리가 필요하여 

pip install eli5 

를 진행하여 eli5 라이브러리를 설치했습니다.

from eli5.sklearn import PermutationImportance
import eli5

 

이후 위와 같이 간단학세 eli5 라이브러리를 import 하고 나면 아래와 같은 에러가 뜹니다.

 

ImportError: cannot import name 'if_delegate_has_method' from 'sklearn.utils.metaestimators'


위에 대한 에러 해결은 아래 깃허브 자료에서 자세한 내용 확인하실 수 있습니다. 

 

https://github.com/manuel-calzolari/sklearn-genetic/commit/12ee9b2e591ec379793bcff1966095b43dac10c6

 

Update for modern versions of sklearn and numpy · manuel-calzolari/sklearn-genetic@12ee9b2

manuel-calzolari committed Aug 19, 2023

github.com

 


자세한 방법은 다음과 같습니다. 

 

우선 본인의 가상환경 위치에서 아래 주소로 들어갑니다.

/home/users/anaconda3/envs/[가상환경 이름]/lib/python3.10/site-packages/eli5/sklearn/

 

아래 주소에서 permutation_importance.py 파일에 들어갑니다.

 

해당 파일에서 아래 내용을 전부 수정합니다. 

# 수정 전
from sklearn.utils.metaestimators import if_delegate_has_method
# 수정 후
from sklearn.utils.metaestimators import available_if
# 수정 전

# 수정 후 (해당 내용은 통째로 파일내에 삽입해 주시면 됩니다.)
def _estimator_has(attr):
    """Check if we can delegate a method to the underlying estimator.
    First, we check the first fitted estimator if available, otherwise we
    check the unfitted estimator.
    """
    return lambda self: (
        hasattr(self.estimator_, attr)
        if hasattr(self, "estimator_")
        else hasattr(self.estimator, attr)
    )

 

# 수정 전
@if_delegate_has_method(delegate='estimator')
# 수정 후
@available_if(_estimator_has("score"))
# 수정 전
@if_delegate_has_method(delegate='estimator')
# 수정 후
@available_if(_estimator_has("predict"))
# 수정 전
@if_delegate_has_method(delegate='estimator')
# 수정 후
@available_if(_estimator_has("predict_proba"))
# 수정 전
@if_delegate_has_method(delegate='estimator')
# 수정 후
@available_if(_estimator_has("predict_log_proba"))
# 수정 전
@if_delegate_has_method(delegate='estimator')
# 수정 후
@available_if(_estimator_has("decision_function"))

 


 

수정된 파일 모습은 아래와 같아야 합니다. 

 

이렇게 수정하고 난 이후에는 에러가 나타나지 않는 것을 확인하실 수 있습니다.