Что это значит AttributeError: объект ColumnSelector не имеет атрибута n_features_in_? - PullRequest
1 голос
/ 04 августа 2020

Я делаю поиск по сетке для настройки гиперпараметров оценщика стека (объект StackingClassifier из библиотеки sklearn.ensemble). Я использовал библиотеку scikit для ML и функцию RandomizedSearchCV. В дополнение к этому, базовыми оценщиками стека для настройки являются конвейеры (объект конвейера из библиотеки imblearn.pipeline), где первым шагом каждого конвейера является объект ColumnSelector из библиотеки mlxtend. Поиск по сетке предназначен для просмотра длинного списка комбинаций переменных, поэтому распределение параметров для сетки происходит только по параметрам «cols» для объекта 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_'

1 Ответ

0 голосов
/ 04 августа 2020

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

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

  1. mlxtend имеет StackingClassifierCV, который, вероятно, в любом случае предпочтительнее обычного StackingClassifier, и имеет параметр cv. вы хотите. Этот может никогда не искать атрибут n_features_in_ и разрешать вещи (до тех пор, пока Pipeline никогда не пытается вызвать его геттер ...)
  2. Используя sklearn * ColumnTransformer может быть предпочтительнее использования mlxtend ColumnSelector. Тогда, похоже, вам вообще не нужно mlxtend.
  3. Понижения sklearn может быть достаточно, чтобы полностью избежать проверок n_features_in_.
...