You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Scikit-learn Pipeline中添加多模型并配置不同参数

问题分析与解决

错误原因

Scikit-learn的Pipeline是按顺序传递数据的:前一步的输出作为后一步的输入。除最后一步可以是分类器/回归器外,所有中间步骤必须是转换器(实现fit()和transform()方法)。你把KNeighborsClassifier放在中间步骤,它是分类器,没有transform()方法,因此触发了TypeError。

正确实现方式

要在Pipeline中结合多个分类器,需要用Scikit-learn提供的模型组合工具,将多个分类器包装成一个可用于Pipeline的最终步骤,以下是两种常用方案:

方案1:使用VotingClassifier(投票分类器)

投票分类器会整合多个模型的预测结果(硬投票取多数票,软投票取概率加权平均),适合简单的模型融合。

示例代码:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
import numpy as np

# 定义两个分类器
knn = KNeighborsClassifier()
dt = DecisionTreeClassifier()

# 用VotingClassifier包装多模型,voting='soft'为软投票,'hard'为硬投票
voting_clf = VotingClassifier(estimators=[('knn', knn), ('dt', dt)], voting='soft')

# 构建Pipeline:预处理 + 投票分类器
steps = [('scaler', StandardScaler()), ('voting', voting_clf)]
pipeline = Pipeline(steps)

# 配置不同模型的参数:格式为"管道步骤名__模型名__参数名"
parameters = {
    'voting__knn__n_neighbors': np.arange(1, 50),
    'voting__dt__max_depth': [None, 5, 10, 15]  # 同时调优决策树参数
}

# 数据划分与训练
X_train, X_test, y_train, y_test = train_test_split(X, y.values.ravel(), test_size=0.3, random_state=65)
cv = GridSearchCV(pipeline, param_grid=parameters)
cv.fit(X_train, y_train)
y_pred = cv.predict(X_test)

方案2:使用StackingClassifier(堆叠分类器)

堆叠分类器会将多个基模型的预测结果作为输入,训练一个元分类器得到最终预测,适合更复杂的模型融合。

示例代码:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression  # 作为元分类器
from sklearn.model_selection import train_test_split, GridSearchCV
import numpy as np

# 定义基模型和元分类器
base_estimators = [('knn', KNeighborsClassifier()), ('dt', DecisionTreeClassifier())]
meta_clf = LogisticRegression()

# 用StackingClassifier包装模型
stacking_clf = StackingClassifier(estimators=base_estimators, final_estimator=meta_clf)

# 构建Pipeline
steps = [('scaler', StandardScaler()), ('stacking', stacking_clf)]
pipeline = Pipeline(steps)

# 配置不同模型的参数
parameters = {
    'stacking__knn__n_neighbors': np.arange(1, 50),
    'stacking__dt__min_samples_split': [2, 5, 10],
    'stacking__final_estimator__C': [0.1, 1, 10]  # 调优元分类器参数
}

# 数据划分与训练
X_train, X_test, y_train, y_test = train_test_split(X, y.values.ravel(), test_size=0.3, random_state=65)
cv = GridSearchCV(pipeline, param_grid=parameters)
cv.fit(X_train, y_train)
y_pred = cv.predict(X_test)

关键注意点

  • 多模型组合时,必须用VotingClassifier/StackingClassifier这类工具把多个分类器包装成一个整体,作为Pipeline的最后一步。
  • 调参时,参数名需遵循管道步骤名__模型名__参数名的格式,确保GridSearchCV能正确识别对应模型的参数。

内容的提问来源于stack exchange,提问作者Hamza Abbasi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 23:18:32