From 4fcd73dc449ada0b57536d6d0cf74d5139d655b0 Mon Sep 17 00:00:00 2001 From: Richard Kwasnicki Date: Wed, 4 Dec 2024 09:09:49 +0100 Subject: [PATCH 1/5] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a66f621..ed12c9a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ numpy >= 1.9.0 scipy singledispatch >= 3.4.0.3 -scikit-learn >= 0.20 +scikit-learn >= 1.3 attrs > 16.0.0 jinja2 >= 3.0.0 pip >= 8.1 From 1892dd3f9f0028d3694640a7ad4b469784869bb4 Mon Sep 17 00:00:00 2001 From: Richard Kwasnicki Date: Wed, 4 Dec 2024 09:11:25 +0100 Subject: [PATCH 2/5] Update permutation_importance.py use available_if instead of removed if_delegate_has_method --- eli5/sklearn/permutation_importance.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/eli5/sklearn/permutation_importance.py b/eli5/sklearn/permutation_importance.py index ca73d76..8be5164 100644 --- a/eli5/sklearn/permutation_importance.py +++ b/eli5/sklearn/permutation_importance.py @@ -4,7 +4,7 @@ import numpy as np from sklearn.model_selection import check_cv -from sklearn.utils.metaestimators import if_delegate_has_method +from sklearn.utils.metaestimators import available_if from sklearn.utils import check_array, check_random_state from sklearn.base import ( BaseEstimator, @@ -247,23 +247,23 @@ def caveats_(self): # ============= Exposed methods of a wrapped estimator: - @if_delegate_has_method(delegate='wrapped_estimator_') + @available_if('wrapped_estimator_') def score(self, X, y=None, *args, **kwargs): return self.wrapped_estimator_.score(X, y, *args, **kwargs) - @if_delegate_has_method(delegate='wrapped_estimator_') + @available_if('wrapped_estimator_') def predict(self, X): return self.wrapped_estimator_.predict(X) - @if_delegate_has_method(delegate='wrapped_estimator_') + @available_if('wrapped_estimator_') def predict_proba(self, X): return self.wrapped_estimator_.predict_proba(X) - @if_delegate_has_method(delegate='wrapped_estimator_') + @available_if('wrapped_estimator_') def predict_log_proba(self, X): return self.wrapped_estimator_.predict_log_proba(X) - @if_delegate_has_method(delegate='wrapped_estimator_') + @available_if('wrapped_estimator_') def decision_function(self, X): return self.wrapped_estimator_.decision_function(X) From a427ae83d985586b9713a35707e73697a2c18279 Mon Sep 17 00:00:00 2001 From: Richard Kwasnicki Date: Wed, 4 Dec 2024 09:43:43 +0100 Subject: [PATCH 3/5] Update permutation_importance.py Upgrade according to https://github.com/scikit-learn/scikit-learn/issues/20506 --- eli5/sklearn/permutation_importance.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/eli5/sklearn/permutation_importance.py b/eli5/sklearn/permutation_importance.py index 8be5164..669f54b 100644 --- a/eli5/sklearn/permutation_importance.py +++ b/eli5/sklearn/permutation_importance.py @@ -246,24 +246,29 @@ def caveats_(self): return CAVEATS_CV # ============= Exposed methods of a wrapped estimator: + def _estimator_has(attr): + def check(self): + return hasattr(self.wrapped_estimator_, attr) - @available_if('wrapped_estimator_') + return check + + @available_if(_estimator_has('wrapped_estimator_')) def score(self, X, y=None, *args, **kwargs): return self.wrapped_estimator_.score(X, y, *args, **kwargs) - @available_if('wrapped_estimator_') + @available_if(_estimator_has('wrapped_estimator_')) def predict(self, X): return self.wrapped_estimator_.predict(X) - @available_if('wrapped_estimator_') + @available_if(_estimator_has('wrapped_estimator_')) def predict_proba(self, X): return self.wrapped_estimator_.predict_proba(X) - @available_if('wrapped_estimator_') + @available_if(_estimator_has('wrapped_estimator_')) def predict_log_proba(self, X): return self.wrapped_estimator_.predict_log_proba(X) - @available_if('wrapped_estimator_') + @available_if(_estimator_has('wrapped_estimator_')) def decision_function(self, X): return self.wrapped_estimator_.decision_function(X) From ae1de47a4c7bdc516dbd1d040d39bb59eef84806 Mon Sep 17 00:00:00 2001 From: Richard Kwasnicki Date: Wed, 4 Dec 2024 09:51:03 +0100 Subject: [PATCH 4/5] Update permutation_importance.py fix to intended usage --- eli5/sklearn/permutation_importance.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/eli5/sklearn/permutation_importance.py b/eli5/sklearn/permutation_importance.py index 669f54b..0c68cca 100644 --- a/eli5/sklearn/permutation_importance.py +++ b/eli5/sklearn/permutation_importance.py @@ -20,6 +20,12 @@ if pandas_available: import pandas as pd +def _estimator_has(attr): + def check(self): + return hasattr(self.wrapped_estimator_, attr) + + return check + CAVEATS_CV_NONE = """ Feature importances are computed on the same data as used for training, i.e. feature importances don't reflect importance of features for @@ -246,29 +252,24 @@ def caveats_(self): return CAVEATS_CV # ============= Exposed methods of a wrapped estimator: - def _estimator_has(attr): - def check(self): - return hasattr(self.wrapped_estimator_, attr) - - return check - @available_if(_estimator_has('wrapped_estimator_')) + @available_if(_estimator_has('score')) def score(self, X, y=None, *args, **kwargs): return self.wrapped_estimator_.score(X, y, *args, **kwargs) - @available_if(_estimator_has('wrapped_estimator_')) + @available_if(_estimator_has('predict')) def predict(self, X): return self.wrapped_estimator_.predict(X) - @available_if(_estimator_has('wrapped_estimator_')) + @available_if(_estimator_has('predict_proba')) def predict_proba(self, X): return self.wrapped_estimator_.predict_proba(X) - @available_if(_estimator_has('wrapped_estimator_')) + @available_if(_estimator_has('predict_log_proba')) def predict_log_proba(self, X): return self.wrapped_estimator_.predict_log_proba(X) - @available_if(_estimator_has('wrapped_estimator_')) + @available_if(_estimator_has('decision_function')) def decision_function(self, X): return self.wrapped_estimator_.decision_function(X) From def1dfd465aba5af7dd80a2b8adc46d90c09d11c Mon Sep 17 00:00:00 2001 From: Richard Kwasnicki Date: Thu, 5 Dec 2024 14:16:07 +0100 Subject: [PATCH 5/5] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ed12c9a..a66f621 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ numpy >= 1.9.0 scipy singledispatch >= 3.4.0.3 -scikit-learn >= 1.3 +scikit-learn >= 0.20 attrs > 16.0.0 jinja2 >= 3.0.0 pip >= 8.1