machine-learning - 了解 scikit-learn GridSearchCV - 参数调整和平均性能指标

标签 machine-learning scikit-learn grid-search

我试图了解 scikit-learn 中的 GridSearchCV 究竟如何实现机器学习中的训练-验证-测试原理。正如您在下面的代码中看到的,我理解它的作用如下:

  1. 将“数据集”分为 75% 和 25%,其中 75% 用于参数调整,25% 是保留的测试集(第 1 行)
  2. 初始化一些要搜索的参数(第 3 至 6 行)
  3. 在 75% 的数据集上拟合模型,但将此数据集分成 5 份,即每次训练 60% 的数据,测试其他 15%,并执行 5 次(第 8 - 10 行) )。 我有第一个问题和第二个问题,请参见下文。
  4. 采用性能最佳的模型和参数,对保留数据进行测试(第 11-13 行)

问题 1:第 3 步中的参数空间到底发生了什么? GridSearchCV 是否在五次运行中的每一次(5 次)中尝试每种参数组合,因此总共运行 10 次? (即,“optmizers”、“init”和“batches”中的单个参数与“epoches”中的 2 个参数配对]

问题 2:“cross_val_score”行打印什么分数?这是上述 10 次运行对 5 次运行中每一次数据的单倍运行的平均值吗? (即整个数据集的 5 个 15% 的平均值)?

问题3:假设第5行现在只有1个参数值,这次GridSearchCV实际上没有搜索任何参数,因为每个参数只有1个值,这是正确的吗?

问题 4:在问题 3 中解释的情况下,如果我们对 GridSearchCV 运行和保留运行的 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

最佳答案

问题 1: 正如您所说,您的数据集将分为 5 部分。 将尝试每个参数(在您的情况下为 2)。对于每个参数,模型将在 5 个折叠中的 4 个上进行训练。剩下的一个将用作测试。所以你是对的,在你的例子中,你将训练一个模型 10 次。

问题 2: “cross_val_score”是 5 次测试折叠的平均值(准确性、损失或其他)。这样做是为了避免仅仅因为测试集非常简单就得到好的结果。

问题 3: 是的。如果您只有一组参数来尝试进行网格搜索,则毫无意义

问题 4: 我不太明白你的问题。通常,您在训练集上使用网格搜索。这允许您将测试集保留为验证集。如果没有交叉验证,您可以找到一个完美的设置来最大化测试集的结果,并且您将过度拟合您的测试集。通过交叉验证,您可以通过微调参数随意发挥,因为您不使用验证集来设置它。

在您的代码中,不需要太多 CV,因为您没有太多参数可供使用,但如果您开始添加正则化,您可以尝试 10+,在这种情况下,需要 CV。

希望对你有帮助

关于machine-learning - 了解 scikit-learn GridSearchCV - 参数调整和平均性能指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48852524/

相关文章:

python - 使用 Keras 进行 LSTM 预测

python - 将分类器投入生产

python - 如何输出sklearn standardscaler

python - Scikit-learn 中用于多标签分类的 GridSearch

Python 和 HyperOpt : How to make multi-process grid searching?

machine-learning - 占位符_2 :0 is both fed and fetched

python - 以最快的方式将 one-hot 编码的特征保存到 Pandas DataFrame 中

python - tensorflow 中 nd 数组输入的占位符定义

python - 使用相同参数时,GridSearchCV 的性能比普通 SVM 差

python - 从 gridsearchCV 内的 RFECV 检索选定的特征