我想知道你是否可以在没有交叉验证的情况下运行 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(...)
(我认为仅在 beta 0.16b1 中)。有关选项,请参阅docs。
是的,您可以在不使用交叉验证的情况下执行
RandomizedSearchCV
,而是使用简单的训练/测试分割来进行参数调整。
为了实现这一目标,您可以利用
ShuffleSplit
模块中的 sklearn.model_selection
类来创建指定用于参数搜索的单一训练/测试分区。这是实现此方法的方法
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)
第一个选项在训练集和测试集之间生成随机分离,而第二个选项允许您通过指示所需的测试大小来指定测试集的大小。
随后,您可以在
cv
功能中配置 RandomizedSearchCV
参数,将其设置为 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
和其他参数。
希望这有帮助!