dask_ml.model_selection.HyperbandSearchCV
dask_ml.model_selection.HyperbandSearchCV¶
- class dask_ml.model_selection.HyperbandSearchCV(estimator, parameters, max_iter=81, aggressiveness=3, patience=False, tol=0.001, test_size=None, random_state=None, scoring=None, verbose=False, prefix='', predict_meta=None, predict_proba_meta=None, transform_meta=None)¶
使用自适应交叉验证算法为特定模型寻找最佳参数。
Hyperband 将在给定的计算预算内找到接近最佳的参数 * ,方法是花费更多时间训练高性能的评估器 [1]。这意味着 Hyperband 会停止训练性能不佳的评估器——其核心是 RandomizedSearchCV 的一种早期停止方案。
与 RandomizedSearchCV 不同,Hyperband 不需要权衡“短时间内评估许多参数”和“长时间训练少量参数”。
Hyperband 需要一个输入,该输入要求了解通过
max_iter训练性能最佳评估器所需的时间。另一个隐式输入(Dask 数组块大小)需要对采样多少参数进行粗略估计。详细说明见 Notes。- *
在 \(N\) 次
partial_fit调用后,Hyperband 产生的评估器将很可能接近于 \(N\) 次partial_fit调用所能产生的最佳评估器(其中“接近”指“在预期最佳可能分数对数项范围内”)。
- 参数
- estimator评估器对象。
对于每个超参数组合,都会实例化一个该类型的对象。假定此对象实现了 scikit-learn 评估器接口。评估器需要提供一个
score函数,或者必须传入scoring。评估器必须实现partial_fit、set_params,并且能与clone良好配合使用。- parameters字典
字典,键为参数名称(字符串),值为要尝试的分布或参数列表。分布必须提供一个用于采样的
rvs方法(例如 scipy.stats.distributions 中的分布)。如果给定一个列表,则均匀采样。- max_iter整数
对任何一个模型进行 partial_fit 调用的最大次数。这应该是模型收敛所需的
partial_fit调用次数。有关设置此参数的详细信息,请参阅 Notes。- aggressiveness整数,默认值=3
剔除不同评估器的激进程度。值越高意味着对评分越有信心(或者超参数对
estimator.score的影响大于数据)。理论表明aggressiveness=3接近最优。aggressiveness=4具有更高的置信度,可能适用于初步探索。- patience整数,默认值 False
如果指定,当得分在对
partial_fit进行patience次调用后未提高tol时,训练停止。默认关闭。如果patience=True,则会自动选择一个patience值,以便与 Hyperband 模型选择算法良好配合。- tol浮点数,默认值 0.001
当指定
patience时,考虑停止训练该模型的所需改进水平。增加tol将倾向于减少训练时间,代价是(可能)获得较差的评估器。- test_size浮点数
用于计算测试/验证分数的保留数据集的比例。默认值为输入训练集的单个分区的大小。
注意
测试数据集应适合单台机器的内存。根据需要调整
test_size参数以实现此目标。- random_state整数、RandomState 实例或 None,可选,默认值:None
如果为整数,random_state 是随机数生成器使用的种子;如果为 RandomState 实例,random_state 是随机数生成器;如果为 None,随机数生成器是 np.random 使用的 RandomState 实例。
- scoring字符串、可调用对象、列表/元组、字典或 None,默认值:None
一个字符串(参见 评分参数:定义模型评估规则)或一个可调用对象(参见 scoring),用于评估测试集上的预测结果。
如果为 None,则使用评估器的默认评分器(如果可用)。
- verbose布尔值、浮点数、整数,可选,默认值:False
如果为 False(默认值),则不打印日志(或将其管道输出到 stdout)。但是,仍会使用标准日志记录。
如果为 True,则打印日志并使用标准日志记录。
如果为浮点数,则大约
verbose的比例时间进行打印/记录。- prefix字符串,可选,默认值=””
日志记录时,为每条消息添加
prefix。- predict_meta: pd.Series, pd.DataFrame, np.array 默认值: None(推断)
一个空的
pd.Series、pd.DataFrame、np.array,其类型与评估器predict调用的输出类型匹配。此元数据对于某些评估器与dask.dataframe和dask.array配合使用是必需的。- predict_proba_meta: pd.Series, pd.DataFrame, np.array 默认值: None(推断)
一个空的
pd.Series、pd.DataFrame、np.array,其类型与评估器predict_proba调用的输出类型匹配。此元数据对于某些评估器与dask.dataframe和dask.array配合使用是必需的。- transform_meta: pd.Series, pd.DataFrame, np.array 默认值: None(推断)
一个空的
pd.Series、pd.DataFrame、np.array,其类型与评估器transform调用的输出类型匹配。此元数据对于某些评估器与dask.dataframe和dask.array配合使用是必需的。
- 属性
- metadata 和 metadata_dict[str, Union(int, dict)]
这些字典描述了执行的计算,无论是在计算发生之前使用
metadata还是在计算发生之后使用metadata_。这些字典都包含以下键:n_models,一个整数,表示将要创建/已创建的模型数量。partial_fit_calls,一个整数,表示调用了多少次将要/已调用
partial_fit。
brackets,一个列表,包含 Hyperband 运行的各个阶段(bracket)。每个阶段对于训练时间重要性和超参数重要性有不同的值。除了n_models和partial_fit_calls,此列表中的每个元素还包含以下键:bracket,一个整数,表示阶段 ID。每个阶段对应于不同的训练时间重要性级别。对于阶段 0,训练时间很重要。对于最高阶段,训练时间不重要,并且模型被积极剔除。SuccessiveHalvingSearchCV params,一个用于创建不同阶段的字典。它不包含estimator或parameters参数。decisions,Hyperband 在做出决策之前进行的partial_fit调用次数。
如果未指定
patience,这些字典是相同的。如果指定了patience,则可能进行的训练较少,metadata_将反映这一点(而metadata不会)。- cv_results_Dict[str, np.ndarray]
一个字典,描述每个模型的表现如何。它包含关于每个模型的信息,无论它是否达到了
max_iter。它包含以下键:mean_partial_fit_timemean_score_timestd_partial_fit_timestd_score_timetest_scorerank_test_scoremodel_idpartial_fit_callsparamsparam_{key},其中{key}是params中的每个键。bracket
test_score键中的值对应于模型在保留数据集上获得的最后一个分数。model_id键与history_对应。此字典可以导入到 Pandas DataFrame 中。在
model_id中,阶段 ID 前缀对应于metadata中的阶段。阶段 0 完全不适应先前的训练;值越高表示适应性越强。- history_字典列表
每次
partial_fit调用后关于每个模型的信息。每个字典包含以下键:partial_fit_timescore_timescoremodel_idparamspartial_fit_callselapsed_wall_time
键
model_id对应于cv_results_中的model_id。此字典列表可以导入到 Pandas 中。- model_history_字典,键为模型 ID,值为字典列表
每个模型历史的字典。这是对
history_的重新组织:包含相同的信息,但按模型进行组织。此数据的结构为
{model_id: [h1, h2, h3, ...]},其中h1、h2和h3是history_的元素,model_id是cv_results_中的模型 ID。- best_estimator_BaseEstimator
由 Hyperband 模型选择算法选出的具有最高验证分数的模型。
- best_score_浮点数
best_estimator_在最后一次调用partial_fit后在验证集上获得的分数。- best_index_整数
指示
cv_results_中哪个评估器对应于最高分数的索引。- best_params_字典
在保留数据上找到的最佳参数字典。
- scorer_
用于对模型进行评分的函数,其调用签名是
scorer_(estimator, X, y)。
注意事项
要设置
max_iter以及X和y的块大小,需要估计至少一个模型将看到多少个示例 (
n_examples)。如果训练时间最长的模型需要遍历数据 10 次,则n_examples = 10 * len(X)。需要采样的超参数组合数量 (
n_params)
这些可以是粗略的估计。要确定块大小和
max_iter,令块大小为
chunk_size = n_examples / n_params令
max_iter = n_params
这样,每个评估器看到的示例数量不超过
max_iter * chunk_size = n_examples。Hyperband 实际上会采样比n_examples更多的一些超参数组合(这就是为什么粗略估计就足够了)。例如,假设需要测试大约 200 或 300 个超参数才能有效地搜索可能的超参数空间
模型需要超过
50 * len(X)个示例,但少于100 * len(X)个示例。
我们决定提供
81 * len(X)个示例,并采样 243 个参数。那么每个块将是数据集的 1/3,并且max_iter=243。如果您使用
HyperbandSearchCV,请引用 [2]。@InProceedings{sievert2019better, author = {Scott Sievert and Tom Augspurger and Matthew Rocklin}, title = {{B}etter and faster hyperparameter optimization with {D}ask}, booktitle = {{P}roceedings of the 18th {P}ython in {S}cience {C}onference}, pages = {118 - 125}, year = {2019}, editor = {Chris Calloway and David Lippa and Dillon Niederhut and David Shupe}, # noqa doi = {10.25080/Majora-7ddc1dd1-011} }
参考文献
- 1
“Hyperband: 一种基于 bandit 的新型超参数优化方法”,2016,作者:L. Li, K. Jamieson, G. DeSalvo, A. Rostamizadeh, and A. Talwalkar。 https://arxiv.org/abs/1603.06560
- 2
“使用 Dask 进行更好更快的超参数优化”,2018,作者:S. Sievert, T. Augspurger, M. Rocklin。 https://doi.org/10.25080/Majora-7ddc1dd1-011
示例
>>> import numpy as np >>> from dask_ml.model_selection import HyperbandSearchCV >>> from dask_ml.datasets import make_classification >>> from sklearn.linear_model import SGDClassifier >>> >>> X, y = make_classification(chunks=20) >>> est = SGDClassifier(tol=1e-3) >>> param_dist = {'alpha': np.logspace(-4, 0, num=1000), >>> 'loss': ['hinge', 'log', 'modified_huber', 'squared_hinge'], >>> 'average': [True, False]} >>> >>> search = HyperbandSearchCV(est, param_dist) >>> search.fit(X, y, classes=np.unique(y)) >>> search.best_params_ {'loss': 'log', 'average': False, 'alpha': 0.0080502}
方法
decision_function(X)fit(X[, y])为特定模型寻找最佳参数。
get_metadata_routing()获取此对象的元数据路由。
get_params([deep])获取此评估器的参数。
inverse_transform(Xt)predict(X)对 X 进行预测。
predict_log_proba(X)概率估计的对数。
predict_proba(X)概率估计。
score(X[, y])返回给定数据上的分数。
set_params(**params)设置此评估器的参数。
set_score_request(*[, compute])请求传递给
score方法的元数据。transform(X)对 dask 输入按块或按分区进行转换。
partial_fit
- __init__(estimator, parameters, max_iter=81, aggressiveness=3, patience=False, tol=0.001, test_size=None, random_state=None, scoring=None, verbose=False, prefix='', predict_meta=None, predict_proba_meta=None, transform_meta=None)¶