AutoML-第五章-Hyperopt-Sklearn

第五章:Hyperopt-Sklearn

摘要

Hyperopt-sklearn 是一个软件项目,可提供 Scikit-learn 机器学习库的自动算法配置。遵循对 Auto-Weka 的介绍,我们认为分类器的选择甚至预处理模块的选择可以一起代表一个大的超参数优化问题。我们使用 Hyperopt 定义一个搜索空间,其中包含许多标准组件(例如 SVM,RF,KNN,PCA,TFIDF)以及将它们组合在一起的常见模式。我们使用 Hyperopt 和标准基准数据集(MNIST,20-Newsgroups,Convex Shapes)中的搜索算法证明,搜索该空间是切实有效的。特别是,我们在发布时提高了 MNIST 和 Convex Shapes 的模型空间的最知名分数。

简介

相对于深层网络,诸如支持向量机(SVM)和随机森林(RF)之类的算法具有的超参数数可以通过手动调整和网格或随机搜索提供令人满意的结果。退一步,当两者在计算上都可行时,通常没有特别的理由使用 SVM 或 RF 。不可知论的模型从业者可能更喜欢采用提供更高准确性的模型。因此,分类器的选择,以及 SVM 中的 C 值和 RF 的最大树深度,都可以看作是超参数。 实际上,预处理组件的选择和配置同样可以被视为模型选择/超参数优化问题的一部分。

Auto-Weka 项目[19]是第一个表明可以在单次超参数调整范围内搜索整个机器学习方法库(Weka [8])的项目。但是,Weka 是 GPL 许可的 Java 库,在编写时并没有考虑到可扩展性,因此我们认为需要 Auto-Weka 的替代方案。Scikit-learn [16] 是另一个机器学习算法库,它是用 Python 编写的(具有许多使用 C 编写的模块以提高速度),并且是 BSD 许可的。Scikit-learn 在科学的 Python 社区中得到了广泛的使用,并支持许多机器学习应用领域。

本章介绍 Hyperopt-Sklearn :该项目为 Python 和 scikit-learn 的用户带来了自动算法配置的好处。Hyperopt-Sklearn 使用 Hyperopt [3] 描述了有关 scikit-learn 组件可能配置的搜索空间,包括预处理,分类和回归模块。该项目的主要设计功能之一是提供 scikit-learn 用户熟悉的接口。只需很小的更改,就可以将超参数搜索应用于现有的代码库。本章以 Hyperopt 的背景及其在 scikit-learn 中使用的配置空间开始,然后展示此软件的示例用法和实验结果。

本章是 2014 年论文的扩展版,其中介绍了 hyperopt-sklearn,该论文在 2014 年 ICML AutoML 研讨会上发表[10]。

背景:Hyperopt 用于优化

Hyperopt 库[3]为算法配置中存在的搜索空间提供了优化算法。这些空间的特征在于多种类型的变量(连续,有序,类别),不同的灵敏度曲线(例如,均匀 vs. 对数缩放)和条件结构(当两个分类器之间有选择时,一个分类器的参数在选择另一个分类器的情况下不相关)。要使用 Hyperopt ,用户必须定义/选择三件事:

  • 一个搜索域
  • 一个目标函数
  • 一个优化算法

搜索域是通过随机变量指定的,应选择其分布以便最有前景的组合具有较高的先验概率。搜索域可以包括 Python 运算符和函数,这些函数将随机变量组合为目标函数的更方便的数据结构。在此域中定义一个条件结构。目标函数将这些随机变量的联合采样映射到标量值分数,优化算法将尝试将其最小化。

这里有四个参数,一个用于选择哪种情况有效,三个用于每种情况。第一种情况包含一个对对数缩放敏感的正值参数。第二种情况包含有界实数值参数。第三种情况包含具有三个选项的分类参数。

选择了搜索域,目标函数和优化算法后,Hyperopt的 fmin 函数将进行优化,并将搜索结果存储到数据库中(例如,简单的 Python 列表或 MongoDB 实例)。fmin 调用执行一个简单的分析找到性能最佳的配置,并将其返回给调用方。当使用 MongoDB 后端时,fmincall 可以使用多个工作程序,以在计算集群上实现并行模型选择。

Scikit-Learn 模型选择作为一个搜索问题

模型选择是从一组可能无限的选项中估计哪种机器学习模型表现最佳的过程。作为一个优化问题,搜索域是对机器学习模型的配置参数(超参数)的有效分配的集合。目标函数通常是对保留示例成功与否的度量(例如准确性,F1-分数等)。负成功程度(损失)通常用于将任务设置为最小化问题,而交叉验证可用于产生更可靠的最终评分。从业人员通常通过手工,网格搜索或随机搜索来解决此优化问题。在本章中,我们讨论使用 Hyperopt 优化库解决它。基本方法是使用随机变量超参数建立搜索空间,使用 scikit-learn 实现执行模型训练和模型验证的目标函数,并使用 Hyperopt 优化超参数。

Scikit-learn 包括许多用于从数据中学习(分类或回归)的算法,以及许多用于将数据预处理为这些学习算法所期望的向量的算法。分类器包括,例如 K 最近邻,支持向量机和随机森林算法。预处理算法包括诸如逐分量 Z 缩放(Normalizer)和主成分分析(PCA)之类的转换。完整的分类算法通常包括一系列预处理步骤和一个分类器,因此 scikit-learn 提供了一种管道数据结构来表示和使用一系列预处理步骤和一个分类器,就好像它们只是一个组件(通常使用与分类器类似的 API )。尽管 hyperopt-sklearn 并未正式使用 scikit-learn 的管道对象,但它提供了相关功能。Hyperopt-sklearn 提供了管道上搜索空间的参数化,即预处理步骤和分类器或回归器的序列。

撰写本文时提供的配置空间包括 24 个分类器,12 个回归器和 7 种预处理方法。作为一个开源项目,该空间可能会在将来随着更多用户的贡献而扩展。最初发布时,只有一部分搜索空间可用,其中包括六个分类器和五个预处理算法。该空间用于初始性能分析,如图 5.1 所示。总的来说,此参数化包含 65 个超参数:15 个布尔变量,14 个类别变量,17 个离散变量和 19 个实值变量。

尽管整个配置空间中超参数的总数很大,但是描述任何一个模型的活动超参数的数量却少得多:例如,由 PCA 和 RandomForest 组成的模型将只有 12 个活动超参数(用于预处理的 1 个, PCA 内部 2 个,分类器选择 1 个,RF内部 8 个)。Hyperopt 描述语言使我们能够区分条件超参数(始终要分配)和非条件超参数(在不使用它们时可能会保持未分配状态)。我们广泛使用这种机制,以使 Hyperopt 的搜索算法不会因反复试验而浪费的时间,例如 RF 超参数对 SVM 性能没有影响。即使在分类器内部,也存在条件参数的实例:KNN 具有取决于距离度量的条件参数,LinearSVC 具有 3 个二元参数(损失,惩罚和对偶),它们仅允许4个有效的联合分配。Hyperopt-sklearn 还包括无法一起使用的(预处理,分类器)对的黑名单,例如 PCA 和 MinMaxScaler 与 MultinomialNB 不兼容,TF-IDF 仅可用于文本数据,并且基于树的分类器与 TF-IDF 预处理器产生的稀疏特征不兼容。考虑到实值超参数的 10-way 离散化,并考虑到这些条件超参数,对我们的搜索空间进行网格搜索仍将需要不可行的评估次数(约为 1 0 12 10^{12} 1012 )。

最后,当我们还定义标量值搜索目标时,搜索空间成为一个优化问题。默认情况下,Hyperopt-sklearn 对验证数据使用 scikit-learn 的评分方法来定义搜索度量。 对于分类器,这就是所谓的“Zero-One 损失”:已从用于训练的数据集中(以及在模型选择搜索过程后用于测试的数据中)保留的数据中正确标签预测的数量。

示例用法

按照 Scikit-learn 的约定,hyperopt-sklearn 为Estimator (估计器) 类提供了拟合方法和预测方法。此类的拟合方法执行超参数优化,完成后,预测方法将最佳模型应用于给定的测试数据。优化期间的每个评估都在较大部分的训练集上执行训练,在验证集上评估测试集准确性,然后将该验证集分数返回给优化器。在搜索结束时,将对整个数据集重新训练最佳配置,以生成处理后续预测调用的分类器。

hyperopt-sklearn 的重要目标之一是易于学习和使用。为了促成这一点,将分类器拟合到数据并使预测的语法与 scikit-learn 非常类似。以下是使用此软件的最简单示例。

HyperoptEstimator 对象包含有关要搜索什么空间以及如何搜索的信息。可以将其配置为使用各种超参数搜索算法,并且还支持使用多种算法组合。在这里可以使用任何支持与 hyperopt 中的算法相同接口的算法。用户也可以在这里指定要运行的函数评估的最大数量,以及每次运行的超时时间(以秒为单位)。

每种搜索算法都可能给搜索空间带来自己的偏好,所有情况下都表现最佳的策略尚不清楚。有时混合使用搜索算法会有所帮助。

在 scikit-learn 中可用的分类器的整个搜索空间上进行有效搜索会占用大量时间和计算资源。有时,您可能会拥有一个更感兴趣的特定模型子空间。使用 hyperopt-sklearn ,可以指定更窄的搜索空间,以允许对其进行更深度的探索。

scikit-learn 提供的支持向量机具有多种可以使用的不同内核(线性,rbf,多项式,sigmoid)。更改内核可能会对模型的性能产生很大影响,并且每个内核都有其自己的独特的超参数。为此,hyperopt-sklearn 将每个内核选择视为搜索空间中的唯一模型。 如果您已经知道哪个内核最适合您的数据,或者只是对探索具有特定内核的模型感兴趣,则可以直接指定它而不是搜索整个 SVC。

与分类器类似,可以对预处理模块的空间进行微调。可以通过有序列表指定预处理的多个连续阶段。空列表意味着将不对数据进行任何预处理。

某些类型的预处理仅适用于特定类型的数据。例如,scikit-learn 提供的 TfidfVectorizer 设计用于文本数据,不适用于其他类型的数据。为了解决这个问题,hyperopt-sklearn 附带了一些预定义的分类器空间和针对特定数据类型量身定制的预处理功能。

到目前为止,在所有这些示例中,都在搜索该模型可用的每个超参数。您还可以指定特定的超参数的值,并且这些参数在搜索过程中将保持不变。例如,如果您知道要使用降维后的 PCA 数据和三次多项式内核 SVM ,这可能会很有用。

也可以指定单个参数的范围。这是使用标准的 hyperopt 语法完成的。这些将覆盖 hyperopt-sklearn 中定义的默认值。

实验

我们对三个数据集进行了实验,以确定 hyperopt-sklearn 可以在一系列数据集上在合理的时间内找到准确的模型。结果在在三个数据集上收集:MNIST,20-Newsgroups 和 Convex Shapes 。MNIST 是一个众所周知的 70k 28×28 手绘数字灰度图像数据集[12]。20-Newsgroups 是20 K 新闻组消息的 20 种分类数据集([13],我们没有在实验中删除标题)。Convex Shapesis 是区分小(32×32)黑白图像中凸白色区域的图片的一种二元分类任务[11]。

图 5.2(左)显示,广泛搜索不会受到任何惩罚。我们执行了多达 300 个函数评估的优化运行,搜索了图 5.1 所示的空间子集,并将解决方案的质量与特定分类器类型(包括最知名的分类器)的专门搜索进行了比较。

图 5.2(右)显示搜索可以找到不同的,好的模型。该图是通过在不同初始条件下(评估次数,优化算法选择和随机数种子)运行 hyperopt-sklearn 并跟踪每次运行后最终选择的模型而构建的。尽管支持向量机始终是最好的 ,最佳 SVM 的参数在数据集之间看起来非常不同。 例如,在图像数据集( MNIST 和 Convex )上,所选择的 SVM 从来没有 Sigmoid 型或线性内核,而在 20 个新闻组中,线性和 sigmoid 型内核通常是最好的。

有时,不熟悉机器学习技术的研究人员可能会简单地使用可用分类器的默认参数。为了查看 hyperopt-sklearn 作为此方法的替代的有效性,在默认 scikit-learn 参数的性能与对于 Hyper-sklearn 空间的较小搜索(25 个评估)之间进行了比较。20 个新闻组数据集的结果如图 5.3 所示。在所有情况下,观察到的性能都比基线有所提高,这表明即使在计算预算较小的情况下,这种搜索技术也很有价值。

讨论和未来工作

表5.1列出了通过交叉验证发现的最佳模型的测试集分数,以及先前工作的一些参考点。在每个数据集上,Hyperopt-sklearn 的得分都相对较好,这表明通过 hyperopt-sklearn 的参数化,Hyperopt 的优化算法比人工专家更具竞争力。

在 MNIST Digits 数据集上具有最佳性能的模型使用深度人工神经网络。卷积“胜者全得”神经元的小的接受区域构成了大型网络。每个神经列都将成为以不同方式进行输入预处理的专家,并且 35 个深层神经列的平均预测可以得出一个最终预测[4]。该模型比 scikit-learn 中的模型要先进得多。scikit-learn 搜索空间中最著名的模型是基于中心数据的 radial-basis SVM (径向基支持向量机) ,得分为98.6%,hyperopt-sklearn 可以得到该性能[15]。

在 20 个新闻组文档分类数据集上表现出色的 CFC 模型是 Class-Feature-Centroid 分类器。由于训练过程中发现的质心距离最佳位置较远,因此质心方法通常不如 SVM 。此处报告的 CFC 方法使用从类间条目索引和类内条目索引构建的质心。它使用这些索引的一个新颖组合以及非规范化的余弦量度来计算质心和文本向量之间的相似性评分[7]。目前在 hyperopt-sklearn 中尚未实现这种类型的模型,我们的实验表明,现有的 hyperopt-sklearn 组件无法集成以匹配其性能水平。也许在实现该方法之后,Hyperopt 可能会找到一组可能提供更高分类精度的参数。

在 Convex Shapes 数据集上,我们的 Hyperopt-sklearn 实验揭示了比以前认为在任何搜索空间中都存在的模型更精确的模型,更不用说这些标准组件的搜索空间了。该结果强调了超参数搜索的难度和重要性。

Hyperopt-sklearn 为将来的工作提供了许多机会:搜索空间中可以包含更多的分类器和预处理模块,甚至还有更多的方法可以组合现有的组件。分类所需的其他类型的数据以及分类之外的其他预测问题也存在。在扩展搜索空间时,必须注意确保新模型的收益大于搜索更大空间的难度。scikit-learn 公开的某些参数比影响拟合的实际超参数(例如,KNN 模型中的算法 (algorithm) 和叶大小 (leaf_size))具有更多的实现细节。在每个模型中都应谨慎识别这些参数,并且在探索过程中可能需要对它们进行不同的处理。

用户可以将自己的分类器添加到搜索空间,只要它符合 scikit-learn 接口即可。目前,这需要对 hyperperopt-sklearn 的代码的结构有所了解,并且如果可以改进对此的支持,以使用户只需很少的精力就可以使用,会更好。 用户还可以指定默认的准确度或 F 度量之外的其他评分方法,因为在某些情况下,这些方法可能不适合特定问题。

我们已经在这里展示了 Hyperopt 的随机搜索,退火搜索和 TPE 算法使 Hyperopt-sklearn 可行,但是图 5.4 中的缓慢收敛表明调用其他优化算法可能会效率更高。贝叶斯优化算法的发展是一个活跃的研究领域,我们期待着其他搜索算法如何与 hyperopt-sklearn 的搜索空间相互作用。超参数优化开创了一种将搜索空间的参数化与搜索算法的优势相匹配的新技术。

花在搜索上的计算时间在实际中非常重要,而 hyperopt-sklearn 目前花费大量时间来评估没有希望的点。尽早发现表现不佳的技术可以极大地加快搜索速度[5,18]。

结论

本章介绍了 Hyperopt-sklearn,这是一个用于自动算法配置由 Scikit-Learn 提供的标准机器学习算法的 Python 软件包。Hyperopt-sklearn 为 scikit-learn 中可用的机器学习算法的大部分子集提供了统一的接口,并且借助 Hyperperopt 的优化功能,它能够在算法配置方面与人类专家相媲美并超越人类专家。我们希望它为从业人员提供了用于开发机器学习系统的有用工具,并为自动化机器学习的研究人员提供了在算法配置方面未来工作的一个基准。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hyperopt-sklearn是基于scikit-learn项目的一个子集,其全称是:Hyper-parameter optimization for scikit-learn,即针对scikit-learn项目的超级参数优化工具。由于scikit-learn是基于Python的机器学习开源框架,因此Hyperopt-sklearn也基于Python语言。Hyperopt-sklearn的文档称:对于开发者而言,针对不同的训练数据挑选一个合适的分类器(classifier)通常是困难的。而且即使选好了分类器,后面的参数调试过程也相当乏味和耗时。更严重的是,还有许多情况是开发者好不容易调试好了选定的分类器,却发现一开始的选择本身就是错误的,这本身就浪费了大量的精力和时间。针对该问题,Hyperopt-sklearn提供了一种解决方案。Hyperopt-sklearn支持各种不同的搜索算法(包括随机搜索、Tree of Parzen Estimators、Annealing等),可以搜索所有支持的分类器(KNeightborsClassifier、KNeightborsClassifier、SGDClassifier等)或者在给定的分类器下搜索所有可能的参数配置,并评估最优选择。并且Hyperopt-sklearn还支持多种预处理流程,包括TfidfVectorizer,Normalzier和OneHotEncoder等。那么Hyperopt-sklearn的实际效果究竟如何?下表分别展示了使用scikit-learn默认参数和Hyperopt-sklearn优化参数运行的分类器的F-score分数,数据源来自20个不同的新闻组稿件。可以看到,经过优化的分类器的平均得分都要高于默认参数的情况。另外,Hyperopt-sklearn的编码量也很小,并且维护团队还提供了丰富的参考样例。 标签:Hyperopt
Hyperopt是一个用于优化机器学习模型超参数的Python库,它可以帮助我们更高效地搜索最优的超参数组合。同时,sklearn中也提供了高斯过程回归(GPR)的模型实现。 下面是一个使用Hyperopt优化sklearn GPR模型的示例代码: ```python from hyperopt import fmin, tpe, hp from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import ConstantKernel, RBF # 定义超参数搜索空间 space = { 'alpha': hp.loguniform('alpha', -5, 2), 'kernel': hp.choice('kernel', [ ConstantKernel(1.0, (1e-4, 1e4)) * RBF(length_scale=1.0, length_scale_bounds=(1e-4, 1e4)), RBF(length_scale=hp.loguniform('length_scale', -5, 2), length_scale_bounds=(1e-4, 1e4)) ]) } # 定义目标函数,即超参数搜索的评估指标 def objective(params): model = GaussianProcessRegressor(alpha=params['alpha'], kernel=params['kernel']) score = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error').mean() return -score # 运行优化器 best = fmin(objective, space, algo=tpe.suggest, max_evals=100) # 输出最佳的超参数组合 print(best) ``` 在上面的代码中,我们首先定义了一个超参数搜索空间,其中包含了GPR模型的超参数alpha和kernel。然后我们定义了目标函数,即在给定超参数下,使用交叉验证评估模型性能的负均方误差(neg_mean_squared_error)。最后我们使用Hyperopt的fmin函数来运行优化器,得到最佳的超参数组合。 需要注意的是,由于GPR模型的训练比较耗时,所以我们在这里使用了交叉验证来评估模型性能,同时限制了最大评估次数为100次,以减少搜索时间。如果你的计算资源充足,可以适当增加评估次数,以获得更优的超参数组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值