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

如何用scikit-learn StackingRegressor整合预训练模型?

如何用scikit-learn整合两个预训练的链式模型?

我有两个预训练的scikit-learn模型model_1和model_2,其中model_1的输出作为model_2的输入,手动实现的代码如下:

import numpy as np
some_input_data = np.random.rand(50, 3)
model_1_preds = model_1.predict(some_input_data)
model_1_preds = model_1_preds.reshape(-1, 1)
predictions = model_2.predict(model_1_preds)

我尝试用StackingRegressor整合这两个模型,但运行以下代码时出现错误:

from sklearn.ensemble import StackingRegressor
stacked = StackingRegressor(estimators=[('model_1', model_1)], final_estimator=model_2)
stacked.predict(some_input_data)

错误信息:

NotFittedError: This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.

请问是否可以将预训练模型与StackingRegressor结合,或使用make_pipeline等替代方案?


解决方案

你的场景是模型链式串联(前一个模型的输出作为后一个模型的输入),StackingRegressor并不适配这个需求——它的设计目标是让多个基模型并行处理原始特征,再将所有基模型的输出(可能结合原始特征)喂给最终模型。更适合的工具是Pipeline,以下是具体实现:

方案一:用Pipeline整合预训练模型

直接将预训练模型放入Pipeline会导致fit时重新训练模型,覆盖预训练权重。因此需要将model_1包装成一个仅做预测/转换、不执行训练的转换器:

from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator, TransformerMixin

class PretrainedModelTransformer(BaseEstimator, TransformerMixin):
    def __init__(self, model):
        self.model = model
    
    def fit(self, X, y=None):
        # 预训练模型无需重新训练,直接返回自身
        return self
    
    def transform(self, X):
        # 执行预测并调整输出形状,适配下一个模型的输入格式
        preds = self.model.predict(X)
        return preds.reshape(-1, 1)

# 构建链式Pipeline
pipeline = Pipeline([
    ("model_1_transform", PretrainedModelTransformer(model_1)),
    ("model_2", model_2)
])

# 直接调用predict,无需提前fit
predictions = pipeline.predict(some_input_data)

这个实现完全复现了你手动编写的逻辑,同时避免了预训练模型被重新训练。

方案二:强制使用StackingRegressor(不推荐)

如果你一定要用StackingRegressor,需要先通过dummy数据完成fit流程,同时确保预训练模型不被重新训练。同样需要包装model_1:

from sklearn.ensemble import StackingRegressor

# 使用上面定义的PretrainedModelTransformer包装model_1
stacked = StackingRegressor(
    estimators=[("model_1", PretrainedModelTransformer(model_1))],
    final_estimator=model_2,
    passthrough=False  # 不传递原始特征给最终模型,仅使用model_1的输出
)

# 用dummy数据执行fit(StackingRegressor要求必须先fit才能predict)
dummy_X = some_input_data[:1]
dummy_y = [0]
stacked.fit(dummy_X, dummy_y)

# 执行预测
predictions = stacked.predict(some_input_data)

此方案仅为满足特定场景需求,本质上是用StackingRegressor模拟Pipeline的功能,冗余且不符合工具设计初衷,不推荐使用。


内容的提问来源于stack exchange,提问作者Mehmet Alican Noyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:17:27