Проблема с BaggingClassifier и пользовательским базовым оценщиком scikit-learn: операнды не могут передаваться вместе? - PullRequest
1 голос
/ 02 декабря 2019

Я пытаюсь использовать пользовательский классификатор с BaggingClassifier в SciKit-Learn, и получаю ошибку, которую не могу определить источник. Мой объект классификатора передает check_estimator(), и у меня нет проблем с функцией fit():

model = ensemble.BaggingClassifier(customEstimator, max_samples=1/n_estimators, n_estimators=n_estimators)
model.fit(trainfeat, trainlabels)
model.predict(testfeat)

Это приводит к приведенной ниже трассировке ошибок. Сам базовый оценщик делает двоичные предсказания через сигмовидный порог. Я знаю, что эти значения должны соответствовать тестовым данным, но я не понимаю, какими должны быть три оператора? И далее, похоже, что ошибка исходит от BaggingClassifier, но проблема должна быть от меня, нет?

Я пытаюсь избежать вставки кода для всей моей оценки, но он наследует BaseEstimator, и я только пишу / перегружаю функции: fit, predict, predict_proba. Я что-то упустил в этом отношении?

Я пытался изменить характеристики / ярлыки безрезультатно, даже не исправил ошибку. Я также попытался унаследовать мою оценку ClassifierMixin, но в итоге у меня появилось множество новых проблем.

  File "Main_File.py", line 76, in <module>
    model.predict(testfeat)

  File "G:\Software\Anaconda\lib\site-packages\sklearn\multiclass.py", line 310, in predict
    indices.extend(np.where(_predict_binary(e, X) > thresh)[0])

  File "G:\Software\Anaconda\lib\site-packages\sklearn\multiclass.py", line 98, in _predict_binary
    score = estimator.predict_proba(X)[:, 1]

  File "G:\Software\Anaconda\lib\site-packages\sklearn\ensemble\bagging.py", line 698, in predict_proba
    for i in range(n_jobs))

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 1003, in __call__
    if self.dispatch_one_batch(iterator):

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 834, in dispatch_one_batch
    self._dispatch(tasks)

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 753, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)

  File "G:\Software\Anaconda\lib\site-packages\joblib\_parallel_backends.py", line 201, in apply_async
    result = ImmediateResult(func)

  File "G:\Software\Anaconda\lib\site-packages\joblib\_parallel_backends.py", line 582, in __init__
    self.results = batch()

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 256, in __call__
    for func, args, kwargs in self.items]

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 256, in <listcomp>
    for func, args, kwargs in self.items]

  File "G:\Software\Anaconda\lib\site-packages\sklearn\ensemble\bagging.py", line 129, in _parallel_predict_proba
    proba += proba_estimator

ValueError: operands could not be broadcast together with shapes (100000,2) (100000,) (100000,2)

1 Ответ

1 голос
/ 02 декабря 2019

Полагаю, проблема связана с выводом predict_proba вашего customEstimator.

Похоже, что ваша текущая реализация возвращает выходные данные с размером (n_samples, 1), который не совместим. Убедитесь, что размер выходного сигнала predict_proba равен (n_samples, 2) для проблемы двоичной классификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...