网格搜索(Grid Search)是一种常用的超参数调优
方法,它通过遍历给定的超参数组合,从中寻找最优的超参数组合。
可以用于选择最佳模型参数。在机器学习模型的训练过程中,有许多参数需要设置
,例如神经网络中的隐藏层数、每层的神经元数量等。这些参数会影响模型的性能和准确度。
网格搜索技术通过枚举一组超参数
的可能取值,然后对每一组取值
进行训练和评估
来确定最优的超参数组合
。它基于一个预定义的参数网格,并使用交叉验证
来确定最佳参数集合,从而实现了自动调参
。
网格搜索技术在处理高维数据
时非常有用,因为它可以在所有可能的参数组合中搜索最佳的超参数组合
,从而提高模型的准确度和稳定性。
网格搜索技术其实就是一种智能的“试错”方法
,可以帮助机器学习模型找到最佳的参数组合
。假设我们有一个需要训练的机器学习模型,里面有很多参数需要设置,但我们不知道哪个参数组合会得到最好的结果。这时候,我们可以通过网格搜索技术来自动化地测试
多种可能的参数组合,并找到最优的那个(类似于在一个网格中排列所有可能的参数组合,逐个尝试
,直到找到最佳的那个)。这个过程需要计算机自动化地完成,并输出最优参数组合以供我们使用。这样,我们就可以节省大量时间和精力来手动调整参数,并且可以更容易地找到最佳的参数组合,从而让我们的机器学习模型变得更加准确和可靠。
python库
,包括scikit-learn
(一种流行的机器学习库)和numpy
(用于数据处理和计算):import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
训练数据
,这里使用scikit-learn
自带的iris
数据集:from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
支持向量机(SVM)模型
,并设置需要测试的超参数范围
。在这个示例中,我们将测试不同的C
值和gamma
值(两个影响SVM性能的重要参数):svm = SVC()
parameters = {'C': [0.1, 1, 10], 'gamma': [0.01, 0.1, 1]}
GridSearchCV
来执行网格搜索。这里我们设置cv
参数为5
,表示使用5折交叉验证
来评估每个参数组合的性能。clf = GridSearchCV(svm, parameters, cv=5)
clf.fit(X, y)
best_params_
属性来获取最佳的参数组合
,以及使用best_score_
属性来获取最佳的性能得分
。print("Best parameters: ", clf.best_params_)
print("Best score: ", clf.best_score_)
最佳的参数组合
来训练最终的模型,并用它进行预测:best_svm = SVC(C=1, gamma=0.01)
best_svm.fit(X, y)
predictions = best_svm.predict(X)
这个示例中,我们使用网格搜索技术
来寻找最佳的SVM超参数组合
。当我们执行GridSearchCV
时,它会自动测试每种可能的C
和gamma
值组合,并返回最佳的参数组合和相应的准确度得分。最后,我们使用最佳的超参数组合来训练最终的模型,并用它来进行新的数据预测。
在scikit-learn
中,GridSearchCV
类是用来实现网格搜索技术
的。它内部使用了交叉验证技术
来评估每一个超参数组合的性能。
其原理
如下:
首先
,将训练集数据划分为k
个等分。对于每一组超参数组合,使用k-1份数据
进行模型训练
,并在留出的k份数据
上进行预测
,得到该组超参数
组合的平均准确度
得分。
重复步骤2
,直到所有的超参数组合都被测试完毕,得到每组超参数组合的平均准确度得分
。
最终选择具有最高平均准确度得分
的超参数组合作为最佳超参数组合,并返回该组合对应的模型。
可以看出GridSearchCV
的核心思想就是穷举
所有可能的超参数组合,通过交叉验证来
计算每个组合的性能得分,从而找到最佳的超参数组合。这种技术虽然简单,但非常有效,能够帮助机器学习工程师快速找到最优的模型超参数,从而提高模型的准确度和稳定性。
在autosklearn中,不需要使用传统的网格搜索技术。相反,autosklearn使用一种叫做“贝叶斯优化”
的方法或者随机搜索方法
来寻找最佳超参数组合。
网格搜索
是一种传统的超参数优化方法,它通过定义一组超参数的值域范围,对所有可能的超参数组合进行穷举搜索。例如
,对于两个超参数a
和b
,如果它们分别在[1,10]
和[0.01, 0.1]
范围内,则可以使用网格搜索算法在100个不同的超参数组合中搜索最佳的超参数组合
。网格搜索的缺点
是当超参数数量较多
或者取值范围较大
时,搜索空间会变得非常庞大,计算成本也会增加。
随机搜索
是一种比网格搜索更为高效的超参数优化方法,它直接在超参数空间中随机采样
一定数量的超参数组合,并评估它们的性能,从而寻找最佳的超参数组合。相比于网格搜索,随机搜索无需对所有超参数进行穷举搜索,因此计算成本更低。
贝叶斯优化
是一种基于贝叶斯统计学理论的超参数优化方法,它通过先验概率和观测数据来不断更新超参数空间的后验概率分布,并选择其中最有可能获得最佳性能的超参数组合进行评估。贝叶斯优化算法具有高效、智能和自适应的特点,因此在大规模或复杂的机器学习问题中通常表现出色。
与网格搜索相比,随机搜索和贝叶斯优化算法都可以降低计算成本
,并且可以避免在非重要的区域内搜索。同时,贝叶斯优化算法还可以更好地处理噪声数据,并具有更好的全局优化能力。
网格搜索
:适用于超参数数量较少且范围已知的情况下,可以使用网格搜索来穷举搜索所有超参数的可能值。
随机搜索
:适用于超参数空间比较大或无法确定超参数的取值范围时,随机搜索算法可以在超参数空间内随机采样一定数量的超参数组合进行评估。
贝叶斯优化
:适用于需要优化时间和计算成本的场景,例如模型训练周期长、计算资源有限等。贝叶斯优化算法可以根据前几次试验的结果调整超参数搜索的方向,并尝试更精确地找出最佳超参数组合。
在autosklearn中,以分类任务为例:
网格搜索
:网格搜索需要指定每个超参数的所有可能值,然后将这些值排列成一个网格结构进行搜索。对于分类问题,通常需要调整的超参数包括分类器类型、正则化系数、C值、kernel等。
例如,可以使用以下代码定义多个超参数的值范围:
import autosklearn.classification as asc
cls = asc.AutoSklearnClassifier(time_left_for_this_task=360,
per_run_time_limit=30,
include_estimators=['random_forest', 'adaboost', 'libsvm_svc'],
resampling_strategy='cv',
resampling_strategy_arguments={'folds': 5},
n_jobs=4)
cls_config_space = cls.get_configuration_space()
params = {'classifier:__choice__': ['random_forest', 'adaboost', 'libsvm_svc'],
'classifier:random_forest:max_features': Int(1, 20),
'classifier:adaboost:n_estimators': Categorical([50, 100, 200]),
'classifier:adaboost:learning_rate': Float(0.01, 0.1, default=0.1, log=True),
'classifier:libsvm_svc:C': Float(0.01, 10, default=1, log=True),
'preprocessor:__choice__': ['no_preprocessing', 'select_percentile_classification'],
'preprocessor:select_percentile_classification:percentile': Int(1, 100),
'preprocessor:select_percentile_classification:score_func': ['f_classif', 'chi2']}
在这个例子中,我们指定了三种不同的分类器类型(随机森林、AdaBoost和支持向量机)和两种数据预处理方法(无预处理和百分位数特征选择),对于每种分类器,我们还需要调整它们的具体超参数。
如果想要使用随机搜索算法
而不是SMAC(一种贝叶斯优化方法)
算法,那么应该将smac_scenario_args
中的runcount_limit
参数设置为None
。这样做可以使autosklearn选择随机搜索算法来进行超参数搜索。
以下是使用随机搜索算法
调用autosklearn时的示例代码:
import autosklearn.classification as asc
cls = asc.AutoSklearnClassifier(time_left_for_this_task=360,
per_run_time_limit=30,
include_estimators=['random_forest', 'adaboost', 'libsvm_svc'],
resampling_strategy='cv',
resampling_strategy_arguments={'folds': 5},
n_jobs=4,
ensemble_size=0,
initial_configurations_via_metalearning=0,
smac_scenario_args={'runcount_limit': None},
random_state=42)
cls.fit(X_train, y_train, dataset_name='classification', metric=accuracy, optimize_metric=True)
在这个例子中,我们将smac_scenario_args
中的runcount_limit
参数设置为None
,表示使用随机搜索算法来进行超参数搜索。
贝叶斯优化
:贝叶斯优化算法通过先验概率和观测数据来不断更新超参数空间的后验概率分布,并选择其中最有可能获得最佳性能的超参数组合进行评估。
在autosklearn中,如果不指定任何超参数搜索算法,则默认使用贝叶斯优化算法。但是,我们可以通过调整以下参数来指定特定的搜索算法:
import autosklearn.classification as asc
cls = asc.AutoSklearnClassifier(time_left_for_this_task=360,
per_run_time_limit=30,
include_estimators=['random_forest', 'adaboost', 'libsvm_svc'],
resampling_strategy='cv',
resampling_strategy_arguments={'folds': 5},
n_jobs=4,
ensemble_size=0,
initial_configurations_via_metalearning=0,
smac_scenario_args={'runcount_limit': 10},
random_state=42)
cls.fit(X_train, y_train, dataset_name='classification', metric=accuracy, optimize_metric=True)
在这个例子中,我们可以通过设置smac_scenario_args
参数来选择使用SMAC
算法(一种贝叶斯优化方法)或随机搜索算法。如果将runcount_limit
设置为正整数
,则表示使用SMAC算法;如果将其设置为None,则表示使用随机搜索算法。
runcount_limit
参数设置作用runcount_limit
参数指定了SMAC
算法运行的最大步数
(即评估超参数组合的次数
)。当runcount_limit
设置为较小的值
时,SMAC算法只能进行有限
的尝试,可能无法
找到最佳超参数组合。相反,如果将该参数设置得非常大
,则SMAC算法将花费更长时间
来搜索空间,并且可能会找到更好的超参数组合。
在autosklearn中,如果将runcount_limit
参数设置为正整数
,则SMAC
算法将被用于搜索超参数空间
。因此,runcount_limit参数的大小会影响超参数搜索的准确性和速度。如果您的数据集比较小
,那么可以将runcount_limit
设置为较小
的值,例如10或20,这样可以节省时间并快速获得一组相对较好的超参数。如果您的数据集很大
,建议将runcount_limit
设置为较大
的值,例如50或100,以便能够更全面地搜索超参数空间。
需要注意的是,使用随机搜索算法
可以避免SMAC算法中的这些问题,因为随机搜索算法会直接在超参数空间中随机抽样超参数组合进行评估,而不是使用启发式算法。因此,如果您的任务比较简单
,可以使用随机搜索算法
代替SMAC算法。