使用SMAC进行算法配置的实践指南

679 阅读4分钟

许多算法属于树状和集合的家族,这些算法对于计算问题来说是很难的,并且暴露出许多超参数,可以通过修改来提高性能。 然而,手动探索这些参数并为优化的解决方案设置这些参数是一项严格的任务,往往导致不满意的结果。因此,最近用于解决这种算法配置问题的自动化方法使解决各种问题的最先进技术得到了实质性的改善。

基于序列模型的算法配置,简而言之,简称SMAC,是一个多功能的工具,用于优化算法参数或其他一些自动化过程的参数或我们可以评估的用户定义的功能,如仿真。SMAC要对机器学习算法的超参数优化非常有效。最终,它比其他技术更能扩展到高维度和离散输入维度。它还有助于捕捉模型领域的重要信息,如哪些输入变量是重要的。

今天在这篇文章中,我们将看到SMAC用于优化支持向量机超参数的用例。稍后,同一算法将被用于优化输入数据集。所有这些都可以通过利用Python编程语言来完成。

实施SMAC

为了运行SMAC,你需要安装一些依赖项,然后确保你已经安装了1.7.0或更高版本的SciPy。要安装SciPy,请使用下面的命令。

! pip install scipy==1.7.0

安装完SciPy后,确保你重新启动了运行时间;这样,变化就会发生。

安装并导入所有的依赖项。
! apt-get install swig -y
! pip install pyrfr
# install smac
! pip install smac
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.model_selection import KFold
from smac.configspace import ConfigurationSpace
from smac.configspace import UniformFloatHyperparameter
from smac.scenario.scenario import Scenario
# main algo used to optimize
from smac.facade.smac_hpo_facade import SMAC4HPO 
from smac.configspace import CategoricalHyperparameter,UniformFloatHyperparameter,\
                             UniformIntegerHyperparameter, InCondition

如前所述,SMAC可以优化用户定义的函数;在本节中,我们将配置SVM,在这里我们将优化解决方案的质量,即我们将优化准确性。我们配置SVM是为了在虹膜数据集上实现高精确度。

iris = load_iris()

优化SVM。

首先,我们需要告知SMAC可能的超参数及其优化值;ConfigSpace包可以做到这一点;下面,我们从结构上添加SVM支持的超参数以及默认值。

让我们首先建立一个容纳所有参数状态的配置空间。

# build configuration space
cs = ConfigurationSpace()

我们定义了几种类型的SVM内核,并将它们作为内核添加到我们的配置空间。

# kernels
kernel = CategoricalHyperparameter('kernel',['linear','rbf','poly','sigmoid'],default_value='sigmoid')
cs.add_hyperparameter(kernel)

还有其他一些常见的参数,如'C'正则化参数和收缩;下面的代码将这两个参数与范围一起添加。

# common hyperparameters
C = UniformFloatHyperparameter('C',0.001, 1000.0, default_value=1.0)
shrinking = CategoricalHyperparameter('shrinking',['true','false'],default_value='true')
cs.add_hyperparameters([C,shrinking])

下面是内核的具体参数,如度数、系数和伽玛,我们在指定条件下添加它们。

# Others
degree = UniformIntegerHyperparameter('degree', 1, 5, default_value=1) # used by poly
coef0 = UniformFloatHyperparameter('coef0', 0.0, 10.0, default_value=5.0) # poly, sigmoid
cs.add_hyperparameters([degree, coef0])
use_degree = InCondition(child=degree, parent=kernel, values=['poly'])
use_coef0 = InCondition(child=coef0, parent=kernel, values=['poly','sigmoid'])
cs.add_conditions([use_degree, use_coef0])
## only for rbf, ploy, sigmoid
gamma = CategoricalHyperparameter('gamma',['auto','value'],default_value='auto') 
gamma_value = UniformFloatHyperparameter('gamma_value', 0.0001, 8, default_value=8)
cs.add_hyperparameters([gamma, gamma_value])
# activate gamma_value only if gamma is set to value
cs.add_condition(InCondition(child=gamma_value, parent=gamma, values=['value']))
# restrict the use of gamma in general to choice of kernel 
cs.add_condition(InCondition(child=gamma, parent=kernel, values=['rbf','poly','sigmoid']))
SVM和Cofigurator之间的接口。

对于SMAC配置SVM,我们需要添加一个接口,接受配置作为输入并输出一个成本值。

def cfg_svm(cfg):
  """ a SVM based configuration and evaluates it 
      using cross-validation """

  # deactivated parameters stored as None this is not
  # accepted by SVM below we removing them
  cfg = {k: cfg[k] for k in cfg if cfg[k]}
  # translate the boolean values
  cfg['shrinking'] = True if cfg['shrinking'] == 'true' else False
  # for gamma set it to fixed value or auto
  if 'gamma' in cfg:
    cfg['gamma'] = cfg['gamma_value'] if cfg['gamma']=='value' else 'auto'
    cfg.pop('gamma_value',None)
  model = svm.SVC(**cfg, random_state=42)
  scores = cross_val_score(model, iris.data,iris.target, cv=5)
  return (1 - np.mean(scores)) # as SMAC minimizes the cost
资源限制。

为了最终确定方案,我们需要使用Scenario对象告诉SMAC整个方法和配置空间。这个方法看起来类似于神经网络的编译。

# scenario object
scenario = Scenario({'run_obj':'quality',
                     'runcount-limit':120, 
                     'cs':cs,
                     'deterministic':'true'})
运行SMAC。

我们现在可以使用SMAC来优化超参数;SMAC有不同的实例,可以设置其超参数,以便在不同的场景下很好地工作。

smac = SMAC4HPO(scenario=scenario, rng=42,
                tae_runner=cfg_svm)
incumbent = smac.optimize()

现在让我们检查一下在优化开始和优化结束时的默认超参数是什么。

print(cs.get_default_configuration())

输出。

print(incumbent)

输出。

上述优化的结果应该是降低了成本值;让我们来验证一下这个结果。

def_value = cfg_svm(cs.get_default_configuration())
inc_value = cfg_svm(incumbent)
print('Default Value: {:.4f}'.format(def_value))
print('Optimized Value: {:.4f}'.format(inc_value))

输出。

结论。

在这篇文章中,我们看到了参数优化技术SMAC,它可以用于各种算法和仿真任务,使性能最大化。用户友好的API为添加基于条件的参数提供了更大的灵活性。而且效果相当可观。此外,我们可以直接使用这些由SMAC给出的参数进行模型训练。笔记本中包含了更多关于SMAC的例子,同样的SVM也是针对新优化的参数进行训练的;链接在参考文献中。

参考文献。

The postHands-On Guide To Algorithm Configuration Using SMACappeared first onAnalytics India Magazine.