Что означает AttributeError: объект ColumnSelector не имеет атрибута n_features_in_?

Я делаю поиск по сетке для настройки гиперпараметров оценщика стека (объект StackingClassifier из библиотеки sklearn.ensemble). Я использовал библиотеку scikit для ML и функцию RandomizedSearchCV. В дополнение к этому, базовыми оценщиками стека для настройки являются конвейеры (объект конвейера из библиотеки imblearn.pipeline), где первым шагом каждого конвейера является объект ColumnSelector из библиотеки mlxtend. Поиск по сетке предназначен для просмотра длинного списка комбинаций переменных, поэтому распределение параметров для сетки происходит только по столбцам параметров для объекта ColumnSelector. В первый раз, когда я запустил этот код, все работало хорошо, затем я отложил проект и вернулся через несколько дней и обнаружил, что он больше не работает. Все в коде такое же, как я оставил, но когда я запустил метод, подходящий для объекта RandomizedSearchCV, я получил следующую ошибку:

AttributeError: объект ColumnSelector не имеет атрибута n_features_in_

Я не понимаю, что надето. Я пробовал много чего, даже удалял Anaconda, mlxtend, imblearn и переустанавливал с последними версиями, но он продолжает кричать одну и ту же ошибку. Я сделал поиск в Google, но, похоже, об этом нет никакой информации.

Вы можете мне помочь с этим вопросом?

Заранее спасибо.


Приложение: версия scikit - 0.23.1, версия mlxtend - 0.17.3, а версия для несбалансированного обучения - 0.7.0.

Полная трассировка приведена ниже, объект gr2 соответствует объекту RandomizedSearchCV, который предназначен для настройки классификатора стекирования. Я хочу отметить, что если я использую объект StackingClassifier из mlxtend, все работает нормально, но у этого объекта нет параметра cv, который имеет StackingClassifier из sklearn.ensemble и который мне нужен для повышения производительности (который у меня был раньше, когда все работало нормально).

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-94-9d8f412d45a3> in <module>
----> 1 gr2.fit(x_train,y_train)

~\anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs)
     71                           FutureWarning)
     72         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 73         return f(**kwargs)
     74     return inner_f
     75 

~\anaconda3\lib\site-packages\sklearn\model_selection\_search.py in fit(self, X, y, groups, **fit_params)
    763             refit_start_time = time.time()
    764             if y is not None:
--> 765                 self.best_estimator_.fit(X, y, **fit_params)
    766             else:
    767                 self.best_estimator_.fit(X, **fit_params)

~\anaconda3\lib\site-packages\sklearn\ensemble\_stacking.py in fit(self, X, y, sample_weight)
    423         self._le = LabelEncoder().fit(y)
    424         self.classes_ = self._le.classes_
--> 425         return super().fit(X, self._le.transform(y), sample_weight)
    426 
    427     @if_delegate_has_method(delegate='final_estimator_')

~\anaconda3\lib\site-packages\sklearn\ensemble\_stacking.py in fit(self, X, y, sample_weight)
    147             for est in all_estimators if est != 'drop'
    148         )
--> 149         self.n_features_in_ = self.estimators_[0].n_features_in_
    150 
    151         self.named_estimators_ = Bunch()

~\anaconda3\lib\site-packages\sklearn\pipeline.py in n_features_in_(self)
    623     def n_features_in_(self):
    624         # delegate to first step (which will call _check_is_fitted)
--> 625         return self.steps[0][1].n_features_in_
    626 
    627     def _sk_visual_block_(self):

AttributeError: 'ColumnSelector' object has no attribute 'n_features_in_'

person Jonathan    schedule 03.08.2020    source источник
comment
Пожалуйста, предоставьте полную трассировку и версии mlxtend, imblearn и scikit-learn.   -  person Ben Reiniger    schedule 04.08.2020
comment
@BenReiniger Спасибо за внимание, Бен, я отредактировал вопрос и добавил версии и трассировку   -  person Jonathan    schedule 04.08.2020


Ответы (1)


sklearn добавлял проверки на количество функций с атрибутом n_features_in_. Похоже, что mlxtend еще не добавил это в свой ColumnSelector, и, следовательно, ошибка (отмечая, что Pipeline sklearn не имеет собственного атрибута n_features_in_, вместо этого делегируя это первому шагу, как вы можете видеть в комментарии в коде в конце трассировки).

В идеале отправляйте Проблема с mlxtend, чтобы добавить n_features_in_ (и, возможно, соответствующие проверки) к ColumnSelector. Но пока что на ум приходит пара обходных путей:

  1. mlxtend имеет StackingClassifierCV, который, вероятно, в любом случае предпочтительнее обычного StackingClassifier, и имеет параметр cv, который вам нужен. Этот может никогда не искать атрибут n_features_in_ и разрешать проблемы (пока Pipeline никогда не пытается вызвать свой геттер ...)
  2. Использование ColumnTransformer sklearn может быть предпочтительнее использования ColumnSelector mlxtend. Тогда вам, кажется, совсем не нужен mlxtend.
  3. Понижения вашего sklearn может быть достаточно, чтобы вообще избежать n_features_in_ проверок.
person Ben Reiniger    schedule 04.08.2020
comment
Большое спасибо, это было очень полезно, я использую подход ColumnTransformer - person Jonathan; 05.08.2020