类型错误:'Pipeline'对象在自定义分类器中不可调用



我正在处理一个分类问题。我已经为我的分类器创建了一个类。我对这门课有意见。我有一个get_clf_pipeline方法,它返回train方法使用的分类器管道。这个方法不需要访问实例或类数据,我尝试将其作为静态方法,但这种方法不起作用。如何解决此问题?

class Event_classifier:

def __init__(self):
self.clf_pipeline = self.get_clf_pipeline()

def get_clf_pipeline(self):
""" Return the pipeline
"""
categorical_features = ['CRole', 'Clevel', 'Gender']
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
transformers=[        
('cat', categorical_transformer, categorical_features)])
estimators = [
('rf',RandomForestClassifier(n_estimators=200,class_weight='balanced')),
('mnb', MultinomialNB()),
('svr', make_pipeline(StandardScaler(with_mean=False),
LinearSVC(random_state=42)))
]
stacked_clf = StackingClassifier(
estimators=estimators, final_estimator=LogisticRegression(class_weight='balanced')
)
clf_pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', stacked_clf)])
return clf_pipeline
def train(self, X,y):
"""Trains the classifier on input data
"""
print(type(self.clf_pipeline))
self.clf_pipeline(X,y)

def predict(self):
"""Predict on test data
"""
if (X.shape) == 1:
X = X.T
y_pred = self.clf_pipeline.predict(X)
return y_pred        

创建类实例并对数据进行培训

ec = Event_classifier()
ec.train(X_train, y_train)
print('Model training complete')

我得到以下错误

<class 'sklearn.pipeline.Pipeline'>
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-129-36d8dfcdfc12> in <module>
1 ec = Event_classifier()
2 
----> 3 ec.train(X_train, y_train)
4 print('Model training complete')
5 
<ipython-input-126-de5f651c0a3d> in train(self, X, y)
35         """
36         print(type(self.clf_pipeline))
---> 37         self.clf_pipeline(X,y)
38 
39     def predict(self):
TypeError: 'Pipeline' object is not callable

您的self.clf_pipelinePipeline对象,因此self.clf_pipeline(X,y)试图调用输入X, y上的管道,但(正如错误所说(Pipeline不是函数。大概你想要self.clf_pipeline.fit(X, y)之类的东西。

还有一件事:X.shape == 1(在您的predict方法中(是什么时候?