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

Posted

技术标签:

【中文标题】了解 scikit-learn GridSearchCV - 参数调整和平均性能指标【英文标题】:Understanding scikit-learn GridSearchCV - param tuning and averaging performance metrics 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

问题 2: 'cross_val_score' 是 5 次测试折叠的平均值(准确度、损失等)。这样做是为了避免仅仅因为测试集真的很简单而获得良好的结果。

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

问题 4: 我没有完全理解你的问题。通常,您在火车上使用网格搜索。这允许您将测试集保留为验证集。如果没有交叉验证,您可能会找到一个完美的设置来最大化您的测试集的结果,并且您会过度拟合您的测试集。使用交叉验证,您可以使用微调参数尽可能多地玩,因为您不使用验证集来设置它。

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

希望对你有帮助

【讨论】:

以上是关于了解 scikit-learn GridSearchCV - 参数调整和平均性能指标的主要内容,如果未能解决你的问题,请参考以下文章

了解python scikit-learn中的文本特征提取TfidfVectorizer

了解 scikit-learn ValueError:由于数据形状而设置具有序列的数组元素

scikit-learn: isotonic regression(保序回归,非常有意思,仅做知识点了解,但差点儿没用到过)

Sklearn K均值聚类

混淆矩阵中的 Scikit-learn 变化阈值

scikit-learn 可以处理多少功能?