AttributeError 是啥意思:'ColumnSelector' 对象没有属性'n_features_in_'?

Posted

技术标签:

【中文标题】AttributeError 是啥意思:\'ColumnSelector\' 对象没有属性\'n_features_in_\'?【英文标题】:What does it mean AttributeError: 'ColumnSelector' object has no attribute 'n_features_in_'?AttributeError 是什么意思:'ColumnSelector' 对象没有属性'n_features_in_'? 【发布时间】:2020-11-24 00:07:59 【问题描述】:

我正在网格搜索以调整堆叠估计器的超参数(来自 sklearn.ensemble 库的 StackingClassifier 对象)。我将 scikit 库用于 ML 和 RandomizedSearchCV 函数。除此之外,要调整的堆栈的基本估计器是管道(来自 imblearn.pipeline 库的管道对象),其中每个管道的第一步是来自 mlxtend 库的 ColumnSelector 对象。网格搜索旨在查看一长串变量组合,因此网格的参数分布仅通过 ColumnSelector 对象的参数“cols”。我第一次运行这段代码时,一切都运行良好,然后我将项目搁置一旁,几天后回来发现它不再工作了。代码中的所有内容都与我留下的相同,但是当我在 RandomizedSearchCV 对象上运行 fit 方法时,出现以下错误:

AttributeError:“ColumnSelector”对象没有属性“n_features_in_”

我不明白穿的是什么。我已经尝试了很多东西,甚至卸载了 Anaconda、mlxtend、imblearn,并重新安装了最新版本,但它一直在喊同样的错误。我在谷歌上搜索过,但似乎没有这方面的信息。

你能帮我解决这个问题吗?

提前致谢。


附录: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_'

【问题讨论】:

请提供完整的回溯,以及 mlxtend、imblearn 和 scikit-learn 的版本。 @BenReiniger 感谢您的关注本,我已经编辑了问题并添加了版本和回溯 【参考方案1】:

sklearn 一直在添加对特征数量的检查,属性为n_features_in_。似乎mlxtend 尚未将其添加到其ColumnSelector,因此出现错误(注意sklearnPipeline 没有自己的属性n_features_in_,而是委托给第一步,如您可以在回溯末尾的代码中的注释中看到)。

理想情况下,使用mlxtend 提交问题以将n_features_in_(可能还有相关检查)添加到ColumnSelector。但与此同时,我想到了一些解决方法:

    mlxtend 有一个StackingClassifierCV,无论如何它可能比普通的StackingClassifier 更受欢迎,并且有你想要的cv 参数。 可能永远不会寻找 n_features_in_ 属性并解决问题(只要 Pipeline 永远不会尝试调用它的 getter...) 使用sklearnColumnTransformer 可能比使用mlxtendColumnSelector 更好。那么你似乎根本不需要mlxtend。 降级您的 sklearn 可能就足够了,可以完全避免 n_features_in_ 检查。

【讨论】:

非常感谢,对我很有帮助,我正在采用ColumnTransformer的方法

以上是关于AttributeError 是啥意思:'ColumnSelector' 对象没有属性'n_features_in_'?的主要内容,如果未能解决你的问题,请参考以下文章

解决AttributeError: XXX instance has no attribute 'xxx'的问题(新手必备)

“?”是啥意思?在 Erlang 中是啥意思? [复制]

“this”这个词是啥意思,“static”是啥意思?

“||”是啥意思在 var 语句中是啥意思? [复制]

PPPoE是啥意思,PPPoE是啥意思

“内容”是啥意思:在招摇/openapi“响应”中是啥意思: