0

我正在尝试使用 train_test_split 策略微调我的 sklearn 模型。我知道GridSearchCV执行参数调整的能力,但是,它与使用交叉验证策略有关,我想使用 train_test_split 策略进行参数搜索,因为训练速度对我的情况很重要,我更喜欢简单train_test_split交叉验证。

我可以尝试编写自己的 for 循环,但如果不利用 GridSearchCV 中使用的内置并行化,效率会很低。

任何人都知道如何为此利用 GridSearchCV 吗?或者提供一个不太慢的替代方案。

4

2 回答 2

4

是的,您可以为此使用ShuffleSplit 。

ShuffleSplit 是一种类似于 的交叉验证策略KFold,但与KFold您必须训练K模型的地方不同,在这里您可以控制进行训练/测试拆分的次数,即使您愿意也可以控制一次。

shuffle_split = ShuffleSplit(n_splits=1,test_size=.25)

n_splits定义重复此拆分和训练例程的次数。现在你可以像这样使用它:

GridSearchCV(clf,param_grid={},cv=shuffle_split)
于 2019-08-27T13:25:07.177 回答
1

我想通过提供代码示例来补充 Shihab Shahriar 的答案。

import pandas as pd
from sklearn import datasets
from sklearn.model_selection import GridSearchCV, ShuffleSplit
from sklearn.ensemble import RandomForestClassifier

# Load iris dataset
iris = datasets.load_iris()

# Prepare X and y as dataframe
X = pd.DataFrame(data=iris.data, columns=iris.feature_names)
y = pd.DataFrame(data=iris.target, columns=['Species'])

# Train test split
shuffle_split = ShuffleSplit(n_splits=1, test_size=0.3)
# This is equivalent to: 
#   X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# But, it is usable for GridSearchCV

# GridSearch without CV
params = { 'n_estimators': [16, 32] }
clf = RandomForestClassifier()
grid_search = GridSearchCV(clf, param_grid=params, cv=shuffle_split)
grid_search.fit(X, y)

这应该可以帮助任何面临类似问题的人。

于 2019-08-28T03:19:12.287 回答