What does it mean AttributeError: 'ColumnSelector' object has no attribute 'n_features_in_'?
What does it mean AttributeError: 'ColumnSelector' object has no attribute 'n_features_in_'?
我正在进行网格搜索以调整堆叠估计器的超参数(sklearn.ensemble 库中的 StackingClassifier 对象)。我使用 ML 的 scikit 库和 RandomizedSearchCV 函数。除此之外,要调整的堆栈的基础估计器是管道(imblearn.pipeline 库中的管道对象),其中每个管道的第一步是 mlxtend 库中的 ColumnSelector 对象。网格搜索旨在查看一长串变量组合,因此网格参数的分布仅遍及 ColumnSelector 对象的参数“cols”。我第一次 运行 这段代码,一切正常,然后我搁置了这个项目,几天后回来发现它不再工作了。代码中的所有内容都与我留下的一样,但是当我 运行 该方法适用于 RandomizedSearchCV 对象时,出现以下错误:
AttributeError: 'ColumnSelector' 对象没有属性 'n_features_in_'
我不明白这是怎么回事。我已经尝试了很多东西,甚至卸载了 Anaconda、mlxtend、imblearn,并重新安装了最新版本,但它一直在喊同样的错误。我在 google 上进行了搜索,但似乎没有关于此的信息。
你能帮我解决这个问题吗?
提前致谢。
补充:scikit版本是0.23.1,mlxtend版本是0.17.3,不平衡学习版本是0.7.0。
完整的回溯如下,对象 gr2 对应于旨在调整堆叠分类器的 RandomizedSearchCV 对象。我想指出,如果我使用 mlxtend 中的 StackingClassifier 对象,一切正常,但该对象没有参数 cv,它确实具有 sklearn.ensemble 中的 StackingClassifier,而我需要它才能拥有更好的性能(这是我之前一切正常时的性能)。
---------------------------------------------------------------------------
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_'
sklearn
一直在添加特征数量检查,属性为 n_features_in_
。看来 mlxtend
尚未将其添加到其 ColumnSelector
,因此出现错误(注意 sklearn
的 Pipeline
没有自己的属性 n_features_in_
],而不是委托给第一步,正如您在回溯末尾的代码注释中看到的那样。
理想情况下,提交带有 mlxtend
的问题以将 n_features_in_
(可能还有相关检查)添加到 ColumnSelector
。但与此同时,我想到了一些解决方法:
mlxtend
有一个 StackingClassifierCV
,它可能比普通的 StackingClassifier
更受欢迎,并且有你想要的 cv
参数。 可能 永远不会寻找 n_features_in_
属性并解决问题(只要 Pipeline
永远不会尝试调用它的 getter...)
- 使用
sklearn
的 ColumnTransformer
可能优于使用 mlxtend
的 ColumnSelector
。那你根本不需要mlxtend
,看来。
- 降级
sklearn
可能就足够了,可以完全避免 n_features_in_
检查。
我正在进行网格搜索以调整堆叠估计器的超参数(sklearn.ensemble 库中的 StackingClassifier 对象)。我使用 ML 的 scikit 库和 RandomizedSearchCV 函数。除此之外,要调整的堆栈的基础估计器是管道(imblearn.pipeline 库中的管道对象),其中每个管道的第一步是 mlxtend 库中的 ColumnSelector 对象。网格搜索旨在查看一长串变量组合,因此网格参数的分布仅遍及 ColumnSelector 对象的参数“cols”。我第一次 运行 这段代码,一切正常,然后我搁置了这个项目,几天后回来发现它不再工作了。代码中的所有内容都与我留下的一样,但是当我 运行 该方法适用于 RandomizedSearchCV 对象时,出现以下错误:
AttributeError: 'ColumnSelector' 对象没有属性 'n_features_in_'
我不明白这是怎么回事。我已经尝试了很多东西,甚至卸载了 Anaconda、mlxtend、imblearn,并重新安装了最新版本,但它一直在喊同样的错误。我在 google 上进行了搜索,但似乎没有关于此的信息。
你能帮我解决这个问题吗?
提前致谢。
补充:scikit版本是0.23.1,mlxtend版本是0.17.3,不平衡学习版本是0.7.0。
完整的回溯如下,对象 gr2 对应于旨在调整堆叠分类器的 RandomizedSearchCV 对象。我想指出,如果我使用 mlxtend 中的 StackingClassifier 对象,一切正常,但该对象没有参数 cv,它确实具有 sklearn.ensemble 中的 StackingClassifier,而我需要它才能拥有更好的性能(这是我之前一切正常时的性能)。
---------------------------------------------------------------------------
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_'
sklearn
一直在添加特征数量检查,属性为 n_features_in_
。看来 mlxtend
尚未将其添加到其 ColumnSelector
,因此出现错误(注意 sklearn
的 Pipeline
没有自己的属性 n_features_in_
],而不是委托给第一步,正如您在回溯末尾的代码注释中看到的那样。
理想情况下,提交带有 mlxtend
的问题以将 n_features_in_
(可能还有相关检查)添加到 ColumnSelector
。但与此同时,我想到了一些解决方法:
mlxtend
有一个StackingClassifierCV
,它可能比普通的StackingClassifier
更受欢迎,并且有你想要的cv
参数。 可能 永远不会寻找n_features_in_
属性并解决问题(只要Pipeline
永远不会尝试调用它的 getter...)- 使用
sklearn
的ColumnTransformer
可能优于使用mlxtend
的ColumnSelector
。那你根本不需要mlxtend
,看来。 - 降级
sklearn
可能就足够了,可以完全避免n_features_in_
检查。