首页 > 解决方案 > Python Typeerror:所有中间步骤都应该是转换器并实现拟合和转换

问题描述

我目前正在阅读 Aurélien Géron 的“Hands-On Machine Learning with Scikit-Learn and TensorFlow”一书。当我运行以下代码(我复制的)时,我收到一条错误消息。错误信息似乎很清楚,但老实说我还是不明白。显然,我缺乏理解,但即使经过大量审查,我也找不到问题所在。有人可以帮忙吗?

from sklearn.base import BaseEstimator, TransformerMixin 
rooms_ix, bedrooms_ix, population_ix, households_ix = 3, 4, 5, 6 

class CombinedAttributesAdder(BaseEstimator, TransformerMixin): 
    def __init__( self, add_bedrooms_per_room = True): # no *args or ** kargs 
        self.add_bedrooms_per_room = add_bedrooms_per_room 
        def fit(self, X, y = None): 
            return self # nothing else to do 
        def transform(self, X):
            rooms_per_household = X[:, rooms_ix] / X[:, households_ix] 
            population_per_household = X[:, population_ix] / X[:, households_ix] 
            if self.add_bedrooms_per_room: 
                bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix] 
                return np.c_[X, rooms_per_household, population_per_household, bedrooms_per_room] 
            else: 
                return np.c_[X, rooms_per_household, population_per_household] 
            attr_adder = CombinedAttributesAdder(add_bedrooms_per_room = False) 
            housing_extra_attribs = attr_adder.transform(housing.values)

from sklearn.pipeline import Pipeline 
from sklearn.preprocessing import StandardScaler 
num_pipeline = Pipeline([('imputer', SimpleImputer(strategy ="median")), ('attribs_adder', CombinedAttributesAdder()), ('std_scaler', StandardScaler()),])
housing_num_tr = num_pipeline.fit_transform(housing_num)

错误信息:

-------------------------------------------------- ------------------------- TypeError Traceback (last last call last) in 20 from sklearn.pipeline import Pipeline 21 from sklearn.preprocessing import StandardScaler -- -> 22 num_pipeline = Pipeline([('imputer', SimpleImputer(strategy ="median")), ('attribs_adder', CombinedAttributesAdder()), ('std_scaler', StandardScaler()),]) 23 Housing_num_tr = num_pipeline。 fit_transform(housing_num)

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

~\Miniconda3\lib\site-packages\sklearn\pipeline.py in init (self, steps, memory, verbose) 112 self.memory = memory 113 self.verbose = verbose --> 114 self._validate_steps() 115 116 def get_params(自我,深=真):

~\Miniconda3\lib\site-packages\sklearn\pipeline.py in _validate_steps(self) 157 if (not (hasattr(t, "fit") or hasattr(t, "fit_transform")) 或 not 158 hasattr(t, "transform")): --> 159 raise TypeError("所有中间步骤应该是" 160 "转换器并实现fit和transform " 161 "或者是字符串'passthrough' "

TypeError:所有中间步骤都应该是转换器并实现拟合和转换,或者是字符串'passthrough''CombinedAttributesAdder()'(类型< class'main .CombinedAttributesAdder'>)不

提前谢谢了!

标签: pythontypeerror

解决方案


对我来说,问题可能出在你的缩进错误(除非它只是一个错误的输入)。方法fit()transform()没有正确缩进(attr_adderhousing_extra_attribs赋值也是如此)。这样CombinedAttributesAdder,您在管道中使用的类的实例不是导致错误的转换器。


推荐阅读