Python中的网格搜索

2025年8月28日 | 阅读 8 分钟

在本教程中,我们将讨论用于超参数调优的网格搜索。我们还将了解网格搜索的工作原理以及如何在优化机器学习 (ML) 方法性能时实现它。

超参数调优对于机器学习 (ML) 模型正常工作至关重要。网格搜索等方法似乎是超参数优化的基本实用工具。

网格搜索方法会考虑一些超参数组合,并选择返回较低误差分数的组合。此方法在只需要优化少量超参数时特别有用。然而,当机器学习模型变得更复杂时,它会被其他加权随机搜索方法所超越。

那么,让我们开始理解网格搜索。

理解网格搜索

网格搜索是一种优化算法,它允许我们从我们提供的参数选项列表中选择最佳参数来优化问题,从而自动化“试错”过程。虽然我们可以将其应用于多个优化问题;然而,它最常用于机器学习,以获得模型提供最佳准确率的参数。

让我们假设模型以以下三种参数作为输入:

  1. 隐藏层数量 [2, 4]
  2. 每层的神经元数量 [5, 10]
  3. 训练轮次 [10, 50]

如果我们想尝试每个参数输入的两个选项(如上面方括号中所示),它会评估不同的组合。例如,一种可能的组合是 [2, 5, 10]。手动找到这样的组合将是一件头疼的事。

现在,假设我们有十个不同的参数作为输入,并且我们希望为每个参数尝试五个可能的值。每次我们想更改参数值、重新执行代码并记录每个参数组合的输出时,这都需要程序员手动输入。

网格搜索自动化了这个过程,因为它接受每个参数的可能值,执行代码以尝试每个可能的组合,输出结果,并输出具有最佳准确率的组合。

安装所需的库

在我们开始在Python 编程语言中实现网格搜索之前,让我们简要讨论一些需要在系统中安装的必要库和框架。

这些库和框架如下:

  1. Python 3
  2. NumPy
  3. Pandas
  4. Keras
  5. Scikit-Learn

它们都非常容易安装。我们可以使用 pip 安装程序来安装这些库,如下所示:

注意:如果在执行任何包时遇到任何问题,请尝试重新安装并参考每个包的官方文档。

现在,让我们开始在 Python 中实现网格搜索。

在 Python 中实现网格搜索

在下一节中,我们将了解如何在实际应用程序中实现网格搜索。我们将只执行代码,并深入讨论网格搜索出现的部分,而不是讨论机器学习和数据预处理部分。

那么,让我们开始吧。

我们将使用 Diet 数据集,其中包含有关不同人群的身高和体重的数据,基于性别、年龄和饮食类型等各种属性。我们可以使用 Pandas 的 read_csv() 函数直接从在线资源导入数据。

但在此之前,我们需要导入所需的包。

文件:mygrid.py

说明

在上面的代码片段中,我们导入了项目所需的包和库。也可以保存程序文件并执行它,以检查库和包是否已正确安装和导入。

一旦包成功导入,我们就必须使用以下代码片段来导入数据集并打印其前五行。

文件:mygrid.py

输出

   Person gender  Age  Height  pre.weight  Diet  weight6weeks
0      25          41     171          60     2          60.0
1      26          32     174         103     2         103.0
2       1      0   22     159          58     1          54.2
3       2      0   46     192          60     1          54.0
4       3      0   55     170          64     1          63.3

说明

在上面的代码片段中,我们使用 pandas 库的 read_csv() 导入了数据集,并将其存储在 mydf 变量中。然后,我们使用 head() 函数和 mydf 变量打印了前五行。

现在,让我们将数据分为特征集和标签集,以便对数据集应用标准缩放。

为此的代码片段如下所示:

文件:mygrid.py

说明

在上面的代码片段中,我们将 pandas 数据框转换为了 NumPy 数组。然后,我们从 sklearn 库导入了 StandardScaler 模块,并使用该函数对数据进行归一化。然后,我们使用 transform() 函数转换并显示了训练数据。

现在,让我们考虑使用以下代码片段来创建一个简单的深度学习模型。

文件:mygrid.py

说明

以下代码片段定义了一个名为 create_my_model() 的函数,该函数接受两个参数,即 learnRatedropoutRate。然后,我们使用 Sequential() 函数将模型创建为 mymodel。我们还使用了 add() 以及 Dense()Dropout() 函数。然后,我们使用 compile() 函数编译了模型。

因此,当我们执行代码时,这将导致加载数据集、预处理它并创建机器学习模型。由于我们只对理解网格搜索的工作原理感兴趣,我们没有执行训练/测试拆分,并且我们在完整数据集上拟合了模型。

现在,我们将在下一节中了解网格搜索如何通过优化参数来使程序员的生活更轻松。

不使用网格搜索训练模型

在下面的代码片段中,我们将使用我们凭直觉或随机确定的参数值来创建一个模型,看看我们的模型表现如何。

文件:mygrid.py

输出

4/4 [==============================] - 41s 14ms/step - loss: 0.9364 - accuracy: 0.0000e+00

说明

在上面的代码片段中,我们分别声明了参数值,即 dropoutRate、epochs、batchSizelearnRate。然后,我们通过调用 create_my_model() 函数创建了模型对象。然后,我们将模型拟合到训练数据上。

因此,我们获得的准确率为 0.0000e+00。

使用网格搜索优化超参数

如果我们不使用网格搜索方法,我们可以直接调用上面创建的模型上的 fit() 函数。但是,为了利用网格搜索方法,我们需要向 create_my_model() 函数传递一些参数。此外,我们需要声明一个网格,其中包含要为每个参数尝试的各种选项。让我们分几个部分来完成。

首先,我们将尝试修改 create_my_model() 函数,使其接受来自调用函数的参数,如下所示:

文件:mygrid.py

说明

在上面的代码片段中,我们对之前的 create_my_model 函数进行了一些更改,并使用 KerasClassifier 来创建模型对象。

现在,让我们实现网格搜索算法并用数据集对其进行拟合。

文件:mygrid.py

输出

Best: 0.00347268912077, using {batch_size=10, dropoutRate=0.4, epochs=5, learnRate=0.2}

说明

上面的输出显示了产生最佳准确率的参数组合。

最后,我们可以得出结论,网格搜索在 Python 编程语言中很容易实现,并且为我们节省了大量人工劳动。我们可以列出所有想要调整的参数,声明需要测试的值,执行代码,然后就可以忘记它了。这个过程非常简单方便,需要程序员方面的输入很少。一旦找到了最佳参数组合,我们就可以将其用于最终模型。