超参数的选择与交叉验证

1. 超参数有哪些

  与超参数对应的是参数。参数是可以在模型中通过BP(反向传播)进行更新学习的参数,例如各种权值矩阵,偏移量等等。超参数是需要进行程序员自己选择的参数,无法学习获得。
  常见的超参数有模型(SVM,Softmax,Multi-layer Neural Network,…),迭代算法(Adam,SGD,…),学习率(learning rate)(不同的迭代算法还有各种不同的超参数,如beta1,beta2等等,但常见的做法是使用默认值,不进行调参),正则化方程的选择(L0,L1,L2),正则化系数,dropout的概率等等。

2. 确定调节范围

  超参数的种类多,调节范围大,需要先进行简单的测试确定调参范围。

2.1. 模型

  模型的选择很大程度上取决于具体的实际问题,但必须通过几项基本测试。
  首先,模型必须可以正常运行,即代码编写正确。可以通过第一个epoch的loss估计,即估算第一个epoch的loss,并与实际结果比较。注意此过程需要设置正则项系数为0,因为正则项引入的loss难以估算。
  其次,模型必须可以对于小数据集过拟合,即得到loss接近于0,accuracy接近于1的模型。否则应该尝试其他或者更复杂的模型。
  最后,如果val_acc与acc相差很小,可能是因为模型复杂度不够,需要尝试更为复杂的模型。

2.2. 学习率

loss基本不变:学习率过低
loss震动明显或者溢出:学习率过高
根据以上两条原则,可以得到学习率的大致范围。

2.3. 正则项系数

val_acc与acc相差较大:正则项系数过小
loss逐渐增大:正则项系数过大
根据以上两条原则,可以得到正则项系数的大致范围。

3. 交叉验证

  对于训练集再次进行切分,得到训练集以及验证集。通过训练集训练得到的模型,在验证集验证,从而确定超参数。(选取在验证集结果最好的超参数)
  交叉验证的具体实例详见CS231n作业笔记1.7:基于特征的图像分类之调参和CS231n作业笔记1.2: KNN的交叉验证。

3.1. 先粗调,再细调

  先通过数量少,间距大的粗调确定细调的大致范围。然后在小范围内部进行间距小,数量大的细调。

3.2. 尝试在对数空间内进行调节

  即在对数空间内部随机生成测试参数,而不是在原空间生成,通常用于学习率以及正则项系数等的调节。出发点是该超参数的指数项对于模型的结果影响更显著;而同阶的数据之间即便原域相差较大,对于模型结果的影响反而不如不同阶的数据差距大。

3.3. 随机搜索参数值,而不是格点搜索

random layout

通过随机搜索,可以更好的发现趋势。图中所示的是通过随机搜索可以发现数据在某一维上的变化更加明显,得到明显的趋势。

### 五折交叉验证超参数网格搜索的关系 在机器学习模型训练过程中,五折交叉验证(KFold Cross Validation)是一种评估模型性能的方法。通过将数据集划分为五个互斥子集,在每次迭代中使用四个子集作为训练集,剩余的一个子集作为测试集,从而可以更稳定地估计模型的表现。 超参数网格搜索(Grid Search)则是用于寻找最优超参数组合的一种技术。该方法通过对预定义的超参数空间进行全面遍历,尝试每种可能的配置,并基于某种评价指标选出最佳设置[^1]。 当两者结合时,`sklearn.model_selection.GridSearchCV` 提供了一个方便的方式来同时完成这两项任务——不仅能够自动执行多轮次的不同划分下的验证过程,而且可以在每一次内部循环里应用指定范围内的所有候选超参数值来进行调优操作。这意味着对于每一个潜在的最佳超参数组合,都会经历完整的 k 折交叉验证流程,最终返回表现最好的一组超参数以及对应的平均得分。 #### Python代码示例:五折交叉验证结合超参数网格搜索 下面是一个具体的例子,展示了如何利用 `scikit-learn` 库中的 `GridSearchCV` 和 `KFold` 来实现上述功能: ```python import numpy as np from sklearn.model_selection import GridSearchCV, KFold from sklearn.datasets import load_digits from sklearn.svm import SVC # 加载手写数字数据集 digits = load_digits() X, y = digits.data, digits.target # 定义支持向量机分类器及其待优化的超参数字典 param_grid = { 'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf'], } svc = SVC() # 创建5折分层抽样对象 kf = KFold(n_splits=5) # 初始化GridSearchCV实例,传入分类器、参数网格和交叉验证策略 grid_search_cv = GridSearchCV(estimator=svc, param_grid=param_grid, cv=kf, scoring='accuracy', n_jobs=-1) # 执行拟合操作,即启动网格搜索并进行k折交叉验证 grid_search_cv.fit(X, y) print(f'Best parameters found: {grid_search_cv.best_params_}') print(f'Mean cross-validation accuracy of the best model: {grid_search_cv.best_score_: .2f}') ``` 此段脚本首先加载了标准的手写数字识别数据集;接着设定了 SVM 的两个重要超参数 C 和 kernel 的取值列表形成一个二维的空间;再创建了一个具有固定折叠数目的 K-Fold 对象;最后构建了带有这些组件的 `GridSearchCV` 并对其进行了 fit 方法调用以开始整个计算过程。结果会给出找到的最佳超参数集合以及对应的最大化目标函数均值分数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值