如何在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
相关产品推荐
相关产品推荐

