使用make_pipeline构建Pipeline时出现TypeError错误求助
错误原因与修复方案
核心错误:make_pipeline传参方式误用
make_pipeline的设计逻辑是直接传入单个步骤对象作为位置参数,不需要用列表包裹,也无需手动指定步骤名称(它会自动根据类名生成类似standardscaler、randomundersampler的名称)。
你将整个步骤列表作为单个参数传给make_pipeline,导致它把这个列表当成了Pipeline的唯一“步骤”,但列表本身没有fit方法,因此触发TypeError。
次要问题:重复导入导致功能冲突
你同时导入了sklearn.pipeline.make_pipeline和imblearn.pipeline.make_pipeline,后者会覆盖前者。而sklearn原生Pipeline不兼容imblearn的采样器(如RandomUnderSampler),必须使用imblearn的make_pipeline才能实现采样器、预处理、分类器的组合兼容。
修复后的代码
# 仅保留imblearn的make_pipeline,无需导入sklearn版本 from imblearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler from imblearn.under_sampling import RandomUnderSampler # 导入所需分类器... classifiers = [ LogisticRegression(solver='sag', penalty='l2', multi_class='ovr', max_iter=10000, random_state=None, fit_intercept=True), LinearDiscriminantAnalysis(shrinkage='auto'), LinearSVC(multi_class='ovr', penalty='l2'), QuadraticDiscriminantAnalysis(), SGDClassifier(max_iter=10000), GaussianProcessClassifier(max_iter_predict=10000, multi_class='one_vs_rest'), RidgeClassifier(solver='sag', random_state=None, max_iter=10000), DecisionTreeClassifier(min_samples_leaf=1), BaggingClassifier(), RandomForestClassifier() ] for classifier in classifiers: # 直接传入单个步骤对象,无需列表包裹 model = make_pipeline(StandardScaler(), RandomUnderSampler(), classifier) model.fit(X_train, y_train)
可选:手动指定步骤名称(使用Pipeline类)
如果需要手动给步骤命名,可使用Pipeline类(需用imblearn版本),传参方式为步骤元组组成的列表:
from imblearn.pipeline import Pipeline for classifier in classifiers: model = Pipeline([ ('sc', StandardScaler()), ('rus', RandomUnderSampler()), ('clf', classifier) ]) model.fit(X_train, y_train)
内容的提问来源于stack exchange,提问作者ala mazahreh
相关产品推荐
相关产品推荐

