我最近一直在尝试 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% 的训练数据用于训练组件模型,另外20%用于训练 Final_estimator 的方法。根据docs,您可以使用一个迭代器来生成训练测试分割作为cv(交叉验证)的输入(这很奇怪,因为它不再是 CV)。所以我想分为两部分的问题
是否可以使用 StackingClassifier 以这种方式工作,其中根本不使用交叉验证(CV),而是使用训练/测试分割(主要是为了加快拟合速度)?
如果是这样,这看起来怎么样?我将设置什么作为cv的输入?
另一张纸条。查看用户指南中的潜在 CV 选项 ShuffleSplit 和 nsplits=1 似乎是一个不错的选择,我尝试了它。
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
斯蒂芬大帝
繁花不似锦
相关分类