机器学习调参原理:贝叶斯优化(并基于高斯过程回归的实现SMBO算法)

本文介绍使用贝叶斯优化进行机器学习模型超参数调节的方法。通过构建代理模型预测最佳参数组合,有效降低搜索空间,提高调参效率。

 超参数调节,在机器学习中是一个重要,但是又较为困难的环节,特别是当模型训练的时间成本以及算力成本较为高昂时,调参的难度也随之大大提升了。

除去较为依赖从业人员以及模型使用者先验知识的人工调参外,为了进行最佳超参数搜索,人们还会使用网格搜索(GridSearch)与随机搜索(RandomSearch)。前者是将所有的超参数组合一个个地毯式搜索,而后者则是在此基础上从“地毯式搜索”改为“随即搜索”,效能有了显著的提升。

但是,上面2者都是没有先验知识参与的,已经搜索过的参数没有对之后的参数搜索进行指导,而使用贝叶斯优化,则是会将历史搜索的记录用以作为先验知识来帮助判断下一步如何调参。

一、优化的难点以及解决方法

我们想要优化的目标是:找到一组最佳的超参X(注意此处的X不是数据集中的自变量),能够使得训练出来的模型的损失值Y(Y也不是因变量)最小。与正常的机器学习不同,这里的Y(损失值)与X(超参)本身的关系更为复杂,因为模型的结构本身是按照优化函数:f(自变量)来设计的,当我们将超参作为随机变量来看待时,这个函数便不一定是凸函数,不一定关于一、二阶可微,传统的梯度下降法不再适用,损失函数如同“黑箱”一般,难以优化。

为了解决这一难题,贝叶斯优化采取了这样的策略:

1、针对X与Y进行采样,并且根据采样对其建模获得一个“代理模型”,这一模型的作用是用以反映损失函数关于超参的函数的分布(你直观上可以把它当作是“函数本身和随机变量一样,也有一个分布”,但是更深的数学知识我还在思考)

2、使用采集函数,选择在“代理模型”中最好的点,将超参与损失函数加入到已知的X与Y中,进行下一轮采样与代理模型的建立。

为此,SMBO算法建立,以此在计算机上对模型使用贝叶斯优化。

二、高斯过程回归

本文介绍基于高斯过程回归的SMBO算法。

(此处参考了高斯过程回归 - 知乎

高斯过程回归,是“代理模型”的一种,用以寻找到最优函数的“分布”。假定y=f(x)服从于均值为0的高斯过程,那么我们就只需要求得这个高斯过程的方差函数(由核函数决定)就行了。

对于服从于联合高斯分布的(x1,x2)而言,期望与方差为:

\mu = \binom{\mu_1}{\mu_2}\Sigma=\binom{\Sigma_{11} \Sigma_{12}}{\Sigma_{21} \Sigma_{22}}

其后验分布为:

\mu_{2|1} = \mu_2+\Sigma_{21} \Sigma^{-1}_{11}(X_1-\mu_1) \Sigma_{2|1}=\Sigma_{22}-\Sigma_{21}\Sigma^{-1}_{11}\Sigma_{12} 

带入到高斯过程中,我们假设y服从高斯过程,将待测试点X*集合上的结果记录为f*(可以视为y*),有先验知识y,则

### 使用 Optuna 进行贝叶斯优化调参 #### 超参数优化的重要性 超参数的选择对于机器学习模型的表现至关重要。使用专门的超参数优化库能够更高效地进行超参数调优,提供多种优化方法和工具,帮助用户快速找到最优的超参数组合[^2]。 #### Optuna 的优势 Optuna 是一种先进的超参数优化框架,它不仅支持传统的随机搜索和网格搜索,还特别擅长利用贝叶斯优化技术来提高搜索效率。这种基于贝叶斯的方法允许 Optuna 动态调整采样策略,从而更快地收敛到全局最优解附近[^1]。 #### 基本流程概述 为了实现高效的贝叶斯优化,需遵循几个关键步骤: - **定义目标函数**:创建一个返回损失值的目标函数,该函数接受一组超参数作为输入输出相应的评价指标。 - **指定搜索空间**:明确各个待优化超参数的具体取值范围及其分布特性(连续型、离散型等),这决定了后续探索的方向与边界条件。 - **启动优化过程**:调用 `study.optimize()` 方法执行实际的寻优操作,在此期间系统将持续尝试不同的配置直至满足预设终止准则为止。 下面给出一段完整的 Python 示例代码展示如何应用上述原则完成一次典型的超参数优化任务: ```python import optuna from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split, cross_val_score from lightgbm import LGBMClassifier def objective(trial): data = load_breast_cancer() X_train, X_valid, y_train, y_valid = train_test_split( data.data, data.target, test_size=0.25, random_state=42) param_grid = { 'n_estimators': trial.suggest_int('n_estimators', 50, 500), 'max_depth': trial.suggest_categorical('max_depth', [None, *range(3, 9)]), 'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.3), 'num_leaves': trial.suggest_int('num_leaves', 20, 80) } model = LGBMClassifier(**param_grid) score = cross_val_score(model, X_train, y_train, cv=5).mean() return score if __name__ == "__main__": study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=100) print(f'Best parameters found:\n{study.best_params}') ``` 这段脚本展示了怎样借助 Optuna 来寻找 LightGBM 分类器的最佳超参数设置。这里选择了四个重要的超参数——`n_estimators`, `max_depth`, `learning_rate` 及 `num_leaves`—通过交叉验证的方式评估每组候选方案的好坏程度。最终得到的结果即为能使平均精度达到最高的那一套参数组合[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值