如何调整模型的超参数
2025-01-22 本文已影响0人
梅西爱骑车
当大模型性能未达预期时,可采用以下方法调整超参数以优化模型:
手动调参
- 原理:凭借个人经验和专业知识,手动对超参数进行调整,然后评估模型性能,持续尝试不同的参数组合,直至找到相对较优的超参数。
- 适用场景:适用于对模型和数据有深入了解,且超参数数量较少、搜索空间较小时。
- 操作示例:以神经网络学习率为例,先设置一个常见的学习率如 0.001,训练模型并评估性能。若模型收敛过慢,可适当增大学习率,如调整为 0.01;若模型不收敛或损失函数波动过大,则减小学习率,如改为 0.0001。
网格搜索(Grid Search)
- 原理:它会穷举指定超参数范围内的所有可能组合,然后对每个组合进行模型训练和评估,最终选出性能最优的超参数组合。
- 适用场景:适合超参数数量不多、搜索空间较小的情况,但当超参数数量增多时,计算量会呈指数级增长。
- 代码示例:
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 定义超参数网格
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
# 创建模型
model = SVC()
# 创建网格搜索对象
grid_search = GridSearchCV(model, param_grid, cv=5)
# 进行网格搜索
grid_search.fit(X, y)
# 输出最佳参数
print("最佳参数:", grid_search.best_params_)
-
代码解释:先加载鸢尾花数据集,接着定义支持向量机(SVC)模型的超参数网格,其中
C和kernel是需要调整的超参数。创建GridSearchCV对象并传入模型、超参数网格和交叉验证折数,最后调用fit方法进行网格搜索,输出最佳参数组合。
随机搜索(Random Search)
- 原理:在指定的超参数范围内随机选取一定数量的参数组合进行模型训练和评估,从中找出性能较优的超参数组合。
- 适用场景:当超参数搜索空间较大时,相比网格搜索,随机搜索能在更短时间内找到较优的参数组合。
- 代码示例:
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
import numpy as np
from sklearn.datasets import load_iris
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 定义超参数分布
param_dist = {'n_estimators': np.arange(10, 100, 10),
'max_depth': [None, 3, 5, 10]}
# 创建模型
model = RandomForestClassifier()
# 创建随机搜索对象
random_search = RandomizedSearchCV(model, param_dist, n_iter=10, cv=5)
# 进行随机搜索
random_search.fit(X, y)
# 输出最佳参数
print("最佳参数:", random_search.best_params_)
-
代码解释:加载鸢尾花数据集后,定义随机森林分类器(
RandomForestClassifier)的超参数分布,n_estimators和max_depth是待调整的超参数。创建RandomizedSearchCV对象,指定随机搜索的次数n_iter和交叉验证折数cv,调用fit方法进行随机搜索并输出最佳参数。
image.png
贝叶斯优化(Bayesian Optimization)
- 原理:它基于贝叶斯定理,根据已有的超参数组合及其对应的模型性能,构建一个代理模型来预测不同超参数组合下的模型性能,从而有针对性地选择下一组要尝试的超参数,逐步逼近最优解。
- 适用场景:适用于超参数优化过程计算成本较高、迭代次数有限的情况。
-
使用库:可使用
scikit - optimize库实现,示例代码如下:
from skopt import BayesSearchCV
from sklearn.datasets import load_iris
from sklearn.svm import SVC
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 定义超参数搜索空间
search_space = {'C': (1e-6, 1e+6, 'log-uniform'),
'gamma': (1e-6, 1e+1, 'log-uniform'),
'degree': (1, 8),
'kernel': ['linear', 'poly', 'rbf']}
# 创建模型
model = SVC()
# 创建贝叶斯优化搜索对象
opt = BayesSearchCV(model, search_space, n_iter=32, cv=3)
# 进行贝叶斯优化搜索
opt.fit(X, y)
# 输出最佳参数
print("最佳参数:", opt.best_params_)
-
代码解释:加载鸢尾花数据集后,定义支持向量机(SVC)模型的超参数搜索空间,创建
BayesSearchCV对象,指定搜索次数n_iter和交叉验证折数cv,调用fit方法进行贝叶斯优化搜索并输出最佳参数。