【问题标题】:AttributeError: 'numpy.ndarray' object has no attribute 'fit' when calling fit_transform on a pipelineAttributeError:在管道上调用 fit_transform 时,“numpy.ndarray”对象没有属性“fit”
【发布时间】:2019-09-29 21:36:58
【问题描述】:

当我调用pipeline.fit_transform(X_train, y_train) 时出现以下错误。

AttributeError: 'numpy.ndarray' 对象没有属性 'fit'

管道中的各个转换器工作正常,但是当我在管道中组合它们时出现错误。


X, y = training_data.drop('Response', axis=1), training_data['Response']
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)

X_train = np.array(X_train)
X_test = np.array(X_test)
y_train = np.array(y_train)
y_test = np.array(y_test)

class preprocess(TransformerMixin, BaseEstimator):

    def __init__():
        self.X = None

    def fit(self, X, y=None):
        self.X = X
        self.PI2 = 'Product_Info_2'
        self.PI2_categories = list(training_data[self.PI2].unique())
        return self

    def transform(self, X, y=None):
        Xt = X.copy()
        Xt = pd.concat([Xt, pd.get_dummies(Xt[self.PI2])], axis=1).drop(self.PI2, axis=1)
        Xt.drop('Id', axis=1, inplace=True)
        Xt.fillna(value=0, inplace=True)
        return np.array(Xt)


class apply_NB(TransformerMixin, BaseEstimator):

    def __init__(self):
        self.gridCV = None
        self.params = {"var_smoothing": [x*10**(-9) for x in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 
                                                              0.8, 0.9, 1, 1.5, 2, 2.5, 3, 3.5, 
                                                              4, 4.5, 5]]}
        self.best_params = None

    def fit(self, X, y):

        self.gridCV = GridSearchCV(GaussianNB(), self.params, verbose=10, n_jobs=-1)
        self.gridCV.fit(X, y)
        self.best_params = self.gridCV.best_params_
        return self

    def transform(self, X, y=None):
        Xt = self.gridCV.predict(X)
        return Xt

nb_pipeline = Pipeline([('preprocess', preprocess),
                        ('fit_NB', apply_NB())])

nb_pipeline.fit_transform(X_train, y_train)

当我尝试最后一行时,我得到了:

AttributeError: 'numpy.ndarray' 对象没有属性 'fit'

【问题讨论】:

    标签: scikit-learn pipeline


    【解决方案1】:

    你忘了把self放在预处理的第一个初始化中

    class preprocess(TransformerMixin, BaseEstimator):
    
        def __init__(self):
            self.X = None
    

    然后你也必须为 applyNB 初始化这个类。

    nb_pipeline = [('preprocess', preprocess()),
                        ('fit_NB', apply_NB())]
    

    进行这些更改后似乎对 m 有效!

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 2018-08-30
      • 1970-01-01
      • 2020-12-03
      • 2020-11-29
      • 2020-10-06
      • 2018-01-25
      • 2016-06-29
      • 2020-03-25
      相关资源
      最近更新 更多