【发布时间】:2018-07-28 21:11:20
【问题描述】:
我试图了解 scikit-learn 中的 GridSearchCV 究竟是如何实现机器学习中的训练验证测试原理的。正如你在下面的代码中看到的,我理解它的作用如下:
- 将“数据集”分成 75% 和 25%,其中 75% 用于参数调整,25% 是保留的测试集(第 1 行)
- 初始化一些要搜索的参数(第 3 到 6 行)
- 在 75% 的数据集上拟合模型,但将此数据集拆分为 5 次,即每次训练 60% 的数据,测试其他 15% 的数据,并执行 5 次(第 8 - 10 行) )。 我的第一个和第二个问题在这里,见下文。
- 采用性能最佳的模型和参数,对保持数据进行测试(第 11-13 行)
问题 1:关于参数空间,步骤 3 中究竟发生了什么? GridSearchCV 是否在五次运行中的每一次(5 倍)上尝试每个参数组合,因此总共运行 10 次? (即,来自 'optmizers'、'init' 和 'batches' 的单个参数与来自 'epoches' 的 2 个参数配对]
问题 2:'cross_val_score' 行打印什么分数?这是上述 10 次运行的平均值吗? (即整个数据集的 5 个 15% 的平均值)?
问题3:假设第5行现在只有1个参数值,这次GridSearchCV真的没有搜索任何参数,因为每个参数只有1个值,这样正确吗?
问题 4:在问题 3 中解释的情况下,如果我们对 GridSearchCV 运行和 holdout 运行的 5 倍计算的分数进行加权平均,则得到平均性能分数在整个数据集上 - 这与 6 折交叉验证实验(即没有网格搜索)非常相似,除了 6 折的大小不完全相等。或者这不是?
非常感谢您的任何回复!
X_train_data, X_test_data, y_train, y_test = \
train_test_split(dataset[:,0:8], dataset[:,8],
test_size=0.25,
random_state=42) #line 1
model = KerasClassifier(build_fn=create_model, verbose=0)
optimizers = ['adam'] #line 3
init = ['uniform']
epochs = [10,20] #line 5
batches = [5] # line 6
param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=5) # line 8
grid_result = grid.fit(X_train_data, y_train)
cross_val_score(grid.best_estimator_, X_train_data, y_train, cv=5).mean() #line 10
best_param_ann = grid.best_params_ #line 11
best_estimator = grid.best_estimator_
heldout_predictions = best_estimator.predict(X_test_data) #line 13
【问题讨论】:
标签: machine-learning scikit-learn grid-search