Мне нужно извлечь вероятности каждой модели, обученной по sklearn.ensemble.BaggingClassifier
. Причиной этого является оценка неопределенности вокруг моделей XGBoostClassifier.
Для этого я создаю расширенный класс, унаследованный от sklearn.ensemble.BaggingClassifier
, и добавляю новый метод, позволяющий получить эти вероятности. Обратите внимание, что эта проблема отличается от ModuleNotFoundError: нет модуля с именем 'sklearn.utils._joblib'
Ниже показан фрагмент кода, который я реализовал:
Необходимые модули
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble.base import _partition_estimators
from sklearn.utils import check_array
from sklearn.utils.validation import check_is_fitted
import sklearn.utils as su
Дочерний класс, наследуемый от BaggingClassifier
class EBaggingClassifier(BaggingClassifier):
"""
Extends the class BaggingClassifier fromsklearn
"""
def __init__(self,
base_estimator=None,
n_estimators=10,
max_samples=1.0,
max_features=1.0,
bootstrap=True,
bootstrap_features=False,
oob_score=False,
warm_start=False,
n_jobs=1,
random_state=None,
verbose=0):
super().__init__(
base_estimator,
n_estimators,
max_samples,
max_features,
bootstrap,
bootstrap_features,
oob_score,
warm_start,
n_jobs,
random_state,
verbose)
Новый метод, позволяющий рассчитать вероятность каждой оценки, определен ниже.
def predict_proball(self, X):
"""
Computes the probability of each individual estimator
Parameters
----------
X : {array-like, sparse matrix} of shape = [n_samples, n_features]
The training input samples. Sparse matrices are accepted only if
they are supported by the base estimator.
Returns
-------
p : array of shape = [n_samples, n_classes]
The class probabilities of the input samples. The order of the
classes corresponds to that in the attribute `classes_`.
"""
check_is_fitted(self, "classes_")
# Check data
X = check_array(
X, accept_sparse=['csr', 'csc'], dtype=None,
force_all_finite=False
)
if self.n_features_ != X.shape[1]:
raise ValueError("Number of features of the model must "
"match the input. Model n_features is {0} and "
"input n_features is {1}."
"".format(self.n_features_, X.shape[1]))
# Parallel loop
n_jobs, n_estimators, starts = _partition_estimators(self.n_estimators,
self.n_jobs)
all_proba = su._joblib.Parallel(n_jobs=n_jobs, verbose=self.verbose,
**self._parallel_args())(
su._joblib.delayed(BaggingClassifier._parallel_predict_proba)(
self.estimators_[starts[i]:starts[i + 1]],
self.estimators_features_[starts[i]:starts[i + 1]],
X,
self.n_classes_)
for i in range(n_jobs))
return all_proba
Я создаю экземпляр этого класса, используя XGBoostClassifier
в качестве базовой оценки:
base_estimator = XGBoostClassifier(**params)
estimator = EBaggingClassifier(base_estimator=base_estimator, max_samples=0.8, n_estimators=10)
и затем estimator
с использованием estimator.fit(X, y)
, где X
и y
являются pandas.DataFrame
объектами. Когда я пытаюсь запустить estimator.predict_proball(X)
, я получаю
>>> estimator.predict_proball(X)
AttributeError: module 'sklearn.utils' has no attribute '_joblib'
Кто-то знает, почему это происходит? Глядя на сценарий BaggingClassifier
, функция sklearn.utils._joblib должна быть доступна.
FYI:
>>> sklearn.__version__
'0.19.2'