gpt4 book ai didi

python - 将 StackingClassifier 与训练/测试拆分而不是 CV 一起使用

转载 作者:行者123 更新时间:2023-12-05 06:10:05 25 4
gpt4 key购买 nike

我最近一直在试验 StackingClassifiers,通常它与交叉验证一起使用(默认值:K-fold,num-folds = 5)。是这样写的:

from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, RandomizedSearchCV, KFold

X, y = load_breast_cancer(return_X_y=True, as_frame=True)

model = StackingClassifier(estimators=[
('tree', Pipeline([('tree', DecisionTreeClassifier(random_state=42))])),
('knn', Pipeline([('knn', KNeighborsClassifier())])),
],final_estimator = final_estimator, n_jobs = 10, passthrough = False, cv = KFold())

model.fit(X, y)

效果很好。然而,k 折交叉验证作为训练堆叠分类器的一种方式确实非常慢。理想情况下,我想使用 80% 的 training 数据用于训练组件模型,而其他 20% 用于训练 final_estimator。根据docs ,您可以使用产生训练测试拆分的迭代器作为 cv(交叉验证)的输入(这很奇怪,因为它不再是 CV)。所以我想问题分为两部分

  • 是否可以使用 StackingClassifier 以这种方式工作,它根本不使用交叉验证 (CV),而是使用训练/测试拆分(主要是为了加快拟合速度)?
  • 如果是这样,这看起来如何?我应该将什么设置为 cv 的输入?

另一个注意事项。在使用 nsplits=1 的 ShuffleSplit 用户指南中查看潜在的 CV 选项似乎是一个不错的选择,我试过了。

model = StackingClassifier(estimators=[
('tree', Pipeline([('tree', DecisionTreeClassifier(random_state=42))])),
('knn', Pipeline([('knn', KNeighborsClassifier())])),
],final_estimator = final_estimator, n_jobs = 10, passthrough = False, cv = ShuffleSplit(n_splits=1))

model.fit(X, y)

但不幸的是,这不起作用并引发错误:

ValueError: cross_val_predict only works for partitions

最佳答案

在 sklearn 的 Stacked Classifier 页面中,它指出“...... estimators_ 被安装在完整的 X 上,而 final_estimator_ 使用 cross_val_predict 使用基本估计量的交叉验证预测进行训练。”

我认为如果您想使用基于 80%-20% 的传统训练测试方法,您应该在 StackedClassifier 之外进行。主要原因是要使流程与根据上面记录的说明使用堆叠分类器的方式保持一致。

我已经这样做了,我的管道/设置描述如下。我不介意用每个分类器进行训练测试的额外时间,因为 StackedClassifier 对最终分类器的处理效率更高:

  1. 以 70%-30%/80%-20% 的分割率运行单个分类器(KNN、决策树、随机森林、朴素贝叶斯等)。找到最佳参数化。
  2. 设置 StackedClassifier,其中每个分类器都符合您用整个数据确定的最佳参数(在此阶段没有拆分)
  3. 检查并验证最终分类器相对于单个分类器性能的结果。

我认为额外花费的时间是不可避免的,因为您要引入一个额外的步骤来为您的各个分类器拆分数据。对于您的最终分类器 CV 阶段,即使您进行拆分,最终模型输入也应该在整个数据上运行,以实现单个和最终分类器的最大效率。

关于python - 将 StackingClassifier 与训练/测试拆分而不是 CV 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64546085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com