三种关键的超参数调整技术-以提升机器学习模型的性能

三种关键的超参数调整技术,以提升机器学习模型的性能

原文:towardsdatascience.com/three-essential-hyperparameter-tuning-techniques-for-better-machine-learning-models/

一个合适的机器学习(ML)模型不应该记忆训练数据。相反,它应该从给定的训练数据中学习得很好,以便它能很好地泛化到新的、未见过的数据。

机器学习模型的默认设置可能不适用于我们试图解决的每一种类型的问题。我们需要手动调整这些设置以获得更好的结果。在这里,“设置”指的是超参数

什么是机器学习模型中的超参数?

用户在训练过程之前手动定义一个超参数值,在模型训练过程中它不会从数据中学习其值。一旦定义,其值将保持固定,直到用户更改它。

我们需要区分超参数和参数。

参数从给定的数据中学习其值,其值取决于超参数的值。参数值在训练过程中更新。

这里有一个例子,说明了不同的超参数值如何影响支持向量机(SVM)模型。

from sklearn.svm import SVC

clf_1 = SVC(kernel='linear')
clf_2 = SVC(C, kernel='poly', degree=3)
clf_3 = SVC(C, kernel='poly', degree=1)

clf_1clf_3模型执行 SVM 线性分类,而clf_2模型执行非线性分类。在这种情况下,用户可以通过更改SVC()类中的‘kernel’超参数的值来执行线性和非线性分类任务。

什么是超参数调整?

超参数调整是通过寻找超参数的最佳值来优化模型性能的迭代过程,同时避免过拟合。

有时,例如在上面的 SVM 示例中,某些超参数的选择取决于我们想要解决的问题的类型(回归或分类)。在这种情况下,用户可以简单地设置‘linear’用于线性分类,设置‘poly’用于非线性分类。这是一个简单的选择。

然而,例如,用户需要使用高级搜索方法来选择‘degree’超参数的值。

在讨论搜索方法之前,我们需要了解两个重要的定义:超参数搜索空间超参数分布

超参数搜索空间

超参数搜索空间包含由用户定义的一组可能的超参数值组合。搜索将限制在这个空间内。

搜索空间可以是n-维的,其中n是一个正整数。

搜索空间中的维度数是超参数的数量。(例如 3 维——3 个超参数)。

搜索空间被定义为包含超参数名称作为键和超参数值的列表的 Python 字典。

search_space = {'hyparam_1':[val_1, val_2],
                'hyparam_2':[val_1, val_2],
                'hyparam_3':['str_val_1', 'str_val_2']}

超参数分布

超参数的潜在分布也很重要,因为它决定了在调整过程中如何测试每个值。有四种流行的分布类型。

  • 均匀分布: 在搜索空间内选择所有可能的值。

  • 对数均匀分布: 对均匀分布的值应用对数尺度。这在超参数范围较大时很有用。

  • 正态分布: 值围绕零均值和标准差为 1 分布。

  • 对数正态分布: 对正态分布的值应用对数尺度。这在超参数范围较大时很有用。

分布的选择也取决于超参数值的类型。超参数可以取离散或连续值。离散值可以是整数或字符串,而连续值始终是浮点数。

from scipy.stats import randint, uniform, loguniform, norm

# Define the parameter distributions
param_distributions = {
    'hyparam_1': randint(low=50, high=75),
    'hyparam_2': uniform(loc=0.01, scale=0.19),
    'hyparam_3': loguniform(0.1, 1.0)
}
  • randint(50, 75): 选择介于 50 和 74 之间的随机整数

  • uniform(0.01, 0.49): 选择在 0.01 和 0.5 之间的浮点数(连续均匀分布)

  • loguniform(0.1, 1.0): 在对数尺度上选择 0.1 和 1.0 之间的值(对数均匀分布)

超参数调整方法

有许多不同类型的超参数调整方法。在本文中,我们将仅关注属于 穷举搜索 类别的三种方法。在穷举搜索中,搜索算法会彻底搜索整个搜索空间。这个类别中有三种方法:手动搜索、网格搜索和随机搜索。

手动搜索

没有搜索算法可以执行手动搜索。用户只需根据直觉设置一些值,并查看结果。如果结果不好,用户尝试另一个值,如此类推。用户会从之前的尝试中学习,并在未来的尝试中设置更好的值。因此,手动搜索属于 信息搜索 类别。

在手动搜索中,没有对超参数搜索空间的明确定义。这种方法可能耗时,但与其他方法(如网格搜索或随机搜索)结合使用时可能很有用。

当我们必须同时搜索两个或更多超参数时,手动搜索变得困难。

手动搜索的一个例子是,用户可以在 SVM 模型中将线性分类简单地设置为 ‘linear’,将非线性分类设置为 ‘poly’

from sklearn.svm import SVC

linear_clf = SVC(kernel='linear')
non_linear_clf = SVC(C, kernel='poly')

网格搜索

在网格搜索中,搜索算法测试搜索空间中定义的所有可能的超参数组合。因此,这种方法是一种穷举法。这种方法耗时且需要更多的计算能力,尤其是在超参数数量增加时(维度诅咒)。

为了有效地使用这种方法,我们需要有一个定义良好的超参数搜索空间。否则,我们将浪费大量时间测试不必要的组合。

然而,用户不需要指定超参数的分布。

搜索算法不会从之前的尝试(迭代)中学习,因此不会在未来的尝试中尝试更好的值。因此,网格搜索属于无信息搜索类别。

随机搜索

在随机搜索中,搜索算法在每个迭代中随机测试超参数值。就像在网格搜索中一样,它不会从之前的尝试中学习,因此不会在未来的尝试中尝试更好的值。因此,随机搜索也属于无信息搜索

网格搜索与随机搜索(图片由作者提供)

当搜索空间很大且我们不知道超参数空间时,随机搜索比网格搜索要好得多。它也被认为是计算效率高的。

当我们为网格搜索和随机搜索提供相同大小的超参数空间时,我们看不到两者之间太大的区别。我们必须定义一个更大的搜索空间,以便利用随机搜索相对于网格搜索的优势。

有两种方法可以增加超参数搜索空间的大小。

  • 通过增加维度(添加新的超参数)

  • 通过扩大超参数的范围

建议为每个超参数定义其底层分布。如果没有定义,算法将使用默认的分布,即所有组合被选中的概率相同的均匀分布。

在随机搜索方法本身有两个重要的超参数!

  • n_iter: 要测试的超参数组合的迭代次数或随机样本的大小。接受一个整数。这需要在运行时间和输出质量之间进行权衡。我们需要定义这个参数以允许算法测试组合的随机样本。

  • random_state: 我们需要定义这个超参数以确保多次函数调用得到相同的结果。

随机搜索的主要缺点是它在不同随机状态的多次函数调用中产生高方差。


这就是今天文章的结尾。

如果您有任何问题或反馈,请告诉我。

人工智能课程怎么样?

欢迎在下一篇文章中再见。祝您学习愉快!

设计者和作者:

Rukshan Pramoditha

2025–08–22

posted @ 2026-03-28 09:40  布客飞龙II  阅读(7)  评论(0)    收藏  举报