随机寻优(Random Search)
通常并不是所有的超参数都有同样的重要性,某些超参数可能作用更显著。而随机寻优方法相对于网格化寻优方法能够更准确地确定某些重要的超参数的最佳值。
随机寻优方法
随机寻优方法在超参数网格的基础上选择随机的组合来进行模型训练。可以控制组合的数量,基于时间和计算资源的情况,选择合理的计算次数。这一方法可以通过调用 sklearn 库中的 randomizedSearchCV 函数来实现。
尽管 RandomizedSearchCV 的结果可能不如GridSearchCV准确,但它令人意外地经常选择出最好的结果,而且只花费GridSearchCV所需时间的一小部分。给定相同的资源,RandomizedSearchCV甚至可以优于的结果可能不如GridSearchCV准确。当使用连续参数时,两者的差别如下图所示。
网格化寻优 VS 随机寻优
随机寻优方法找到最优参数的机会相对更高,但是这一方法适用于低维数据的情况,可以在较少迭代次数的情况下找到正确的参数集合,并且花费的时间较少。
通过以下代码,可以实现上述方法:
首先,通过 sklearn 库调用 RandomizedSearchCV 。
from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestRegressor iris = load_iris() rf = RandomForestRegressor(random_state = 42) from sklearn.model_selection import RandomizedSearchCV random_grid = {'n_estimators': n_estimators, 'max_features': max_features, 'max_depth': max_depth, 'min_samples_split': min_samples_split, 'min_samples_leaf': min_samples_leaf, 'bootstrap': bootstrap} rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=2, random_state=42, n_jobs = -1)# Fit the random search model 然后进行计算。 rf_random.fit(X,y) 输出结果。 #print the best score throughout the grid search print rf_random.best_score_ #print the best parameter used for the highest score of the model. print rf_random.best_param_ Output: {'bootstrap': True, 'max_depth': 70, 'max_features': 'auto', 'min_samples_leaf': 4, 'min_samples_split': 10, 'n_estimators': 400}
贝叶斯优化方法(Bayesian Optimization)
前面两种方法能够针对单独超参数组合模型进行训练,并评估各自的性能。每个模型都是独立的,因此很易于进行并行计算。但是每个模型都是独立的,也导致模型之间不具有指导意义,前一模型的计算结果并不能影响后一模型的超参数选择。而贝叶斯优化方法(顺序优化方法的一种,sequential model-besed optimization, SMBO)则可以借鉴已有的结果进而影响后续的模型超参数选择。
这也限制了模型训练评估的计算次数,因为只有有望提高模型性能的超参数组合才会被进行计算。
贝叶斯优化是通过构造一个函数的后验分布(高斯过程)来工作的,该后验分布最好地描述了要优化的函数。随着观测次数的增加,后验分布得到改善,算法更加确定参数空间中哪些区域值得探索,哪些区域不值得探索。
当反复迭代时,算法会在考虑到它对目标函数的了解的情况下,平衡它的探索和开发需求。在每个步骤中,高斯过程被拟合到已知的样本(先前探索的点),后验分布与探索策略(例如UCB(上置信限,upper confidence bound)或EI(预期改善, expected improvement))被用于确定下一个应该探索的点。
通过贝叶斯优化方法,可以更高效的探索超参数变量空间,降低优化时间。
基于梯度的优化方法(Gradient-based Optimization)
基于梯度的优化方法经常被用于神经网络模型中,主要计算超参数的梯度,并且通过梯度下降算法进行优化。
这一方法的应用场景并不广泛,其局限性主要在于:
- 超参数优化通常不是一个平滑的过程
- 超参数优化往往具有非凸的性质
进化寻优(Evolutionary Optimization)
进化寻优方法的思想来源于生物学概念,由于自然进化是不断变化的环境中发生的一个动态过程,因此适用于超参数寻优问题,因为超参数寻优也是一个动态过程。
进化算法经常被用来寻找其他技术不易求解的近似解。优化问题往往没有一个精确的解决方案,因为它可能太耗时并且计算资源占用很大。在这种情况下,进化算法通常可以用来寻找一个足够的近似最优解。进化算法的一个优点是,它们可以产生出不受人类误解或偏见影响的解决方案。
作为一个一般性的经验法则,任何时候想要优化调整超参数,优先考虑网格化寻优方法和随机寻优方法!
总结
在本文中,我们了解到为超参数找到正确的值可能是一项令人沮丧的任务,并可能导致机器学习模型的欠拟合或过拟合。我们看到了如何通过使用网格化寻优、随机寻优和其他算法来克服这一障碍。