我想知道你是否可以在没有交叉验证的情况下运行RandomizedSearchCV(只使用简单的训练/测试分割?
我想这样做是为了能够大概估计哪些参数对更细粒度的调优有用,我将使用标准的交叉验证。
这是代码:
pipe = Pipeline(steps=[('gbm', GradientBoostingClassifier())])
param_dist = dict(gbm__max_depth=[3,6,10],
gbm__n_estimators=[50,100,500,1000],
gbm__min_samples_split=[2,5,8,11],
gbm__learning_rate=[0.01,0.05,0.1,0.5,1.0],
gbm__max_features=['sqrt', 'log2']
)
grid_search = RandomizedSearchCV(pipe, param_distributions=param_dist,cv=???)
grid_search.fit(X_train, y_train)
提前感谢,
您可以使用cv=ShuffleSplit(n_iter=1)
来获得单个随机拆分,或者如果有您想要进行的特定拆分,则使用cv=PredefinedSplit(...)
(我认为仅在测试版0.16b1中)。有关选项,请参阅文档。
是的,您可以在不使用交叉验证的情况下执行RandomizedSearchCV
,而是使用简单的训练/测试分割进行参数调整。
为了实现这一点,您可以利用sklearn.model_selection
模块中的ShuffleSplit
类来创建指定用于参数搜索的单一训练/测试分区。以下是实现此功能的方法
仅集成以下代码行之一:
from sklearn.model_selection import ShuffleSplit
my_cv = ShuffleSplit(n_splits=1)
my_cv = ShuffleSplit(n_splits=1, test_size=0.33, random_state=0)
第一个选项在训练集和测试集之间生成随机分隔,而第二个选项允许您通过指示所需的测试大小来指定测试集的大小。
随后,您可以通过将RandomizedSearchCV
函数中的cv
参数设置为cv=my_cv
来配置该参数。
此外,必须强调
在这种情况下,RandomizedSearchCV
会自动为您管理列车/测试拆分。因此,利用完整的数据集非常重要。您不应该使用(X_train, y_train)
,而应该使用(features, target)
来输入随机搜索过程。这确保了RandomizedSearchCV
在内部有效地处理数据分区。
以下是修改代码的方法:
pipe = Pipeline(steps=[('gbm', GradientBoostingClassifier())])
my_cv = ShuffleSplit(n_splits=1, test_size=0.33, random_state=0) # <==========
param_dist = dict(gbm__max_depth=[3,6,10],
gbm__n_estimators=[50,100,500,1000],
gbm__min_samples_split=[2,5,8,11],
gbm__learning_rate=[0.01,0.05,0.1,0.5,1.0],
gbm__max_features=['sqrt', 'log2']
)
grid_search = RandomizedSearchCV(pipe, param_distributions=param_dist,cv=my_cv)
grid_search.fit(features, **target**) # <==========
在该代码中,cv
表示使用ShuffleSplit
创建的训练/测试分割,您可以根据自己的喜好自定义test_size
和其他参数。
希望这能有所帮助!