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

如何在sklearn的StackingClassifier中指定StratifiedGroupKFold?

在StackingClassifier中正确使用StratifiedGroupKFold的方法

问题背景

在scikit-learn环境中,将StratifiedGroupKFold传入cross_val_score的cv参数时可以正常执行,但直接将其传入StackingClassifier的cv参数会触发报错:

  • 直接传入StratifiedGroupKFold实例时,报错ValueError: cross_val_predict only works for partitions
  • 传入其split生成器时,报错TypeError: cannot pickle 'generator' object

原因分析

StackingClassifier内部通过交叉验证生成基学习器的预测结果时,若使用依赖分组信息的交叉验证器(如StratifiedGroupKFold),必须手动传入groups参数。否则内部交叉验证无法获取分组信息,导致数据划分失败。

正确实现方法

创建StackingClassifier时传入StratifiedGroupKFold实例,同时在调用cross_val_score时,通过fit_params参数将分组信息传递给StackingClassifier的fit方法,确保内部交叉验证可以获取到分组数据。

完整代码示例

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import NuSVC
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.ensemble import StackingClassifier
from sklearn.model_selection import StratifiedGroupKFold, cross_val_score
import numpy as np

# 加载数据集并生成分组信息
X, y = load_iris(return_X_y=True)
groups = np.array([i for i in range(10)] * 15)

# 定义基学习器列表
estimators = [
    ('rf', RandomForestClassifier(n_estimators=10, random_state=42)),
    ('nsv', make_pipeline(StandardScaler(),
                          NuSVC(random_state=42, probability=True)))
]

# 定义Stacking内部使用的分组交叉验证器
stack_cv = StratifiedGroupKFold(5, shuffle=False)

# 初始化Stacking分类器
clf = StackingClassifier(
    estimators=estimators,
    final_estimator=LogisticRegression(),
    stack_method='predict_proba',
    cv=stack_cv
)

# 定义外部交叉验证器(可与内部复用同一实例)
outer_cv = StratifiedGroupKFold(5, shuffle=False)

# 执行交叉验证,通过fit_params传递分组信息给Stacking
val_score = cross_val_score(
    estimator=clf,
    X=X,
    y=y,
    cv=outer_cv,
    groups=groups,
    fit_params={'groups': groups},
    n_jobs=-1
)

print(val_score)

关键说明

  • fit_params={'groups': groups}是核心:该参数将分组信息传递给StackingClassifier的fit方法,使其内部的交叉验证器能够基于分组正确划分数据。
  • 内部和外部的交叉验证器可以复用同一个StratifiedGroupKFold实例,也可根据需求分别配置不同的参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:07:23