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_fitset_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.Seriespd.DataFramenp.array,其类型与评估器 predict 调用的输出类型匹配。此元数据对于某些评估器与 dask.dataframedask.array 配合使用是必需的。

predict_proba_meta: pd.Series, pd.DataFrame, np.array 默认值: None(推断)

一个空的 pd.Seriespd.DataFramenp.array,其类型与评估器 predict_proba 调用的输出类型匹配。此元数据对于某些评估器与 dask.dataframedask.array 配合使用是必需的。

transform_meta: pd.Series, pd.DataFrame, np.array 默认值: None(推断)

一个空的 pd.Seriespd.DataFramenp.array,其类型与评估器 transform 调用的输出类型匹配。此元数据对于某些评估器与 dask.dataframedask.array 配合使用是必需的。

属性
metadata 和 metadata_dict[str, Union(int, dict)]

这些字典描述了执行的计算,无论是在计算发生之前使用 metadata 还是在计算发生之后使用 metadata_。这些字典都包含以下键:

  • n_models,一个整数,表示将要创建/已创建的模型数量。

  • partial_fit_calls,一个整数,表示调用了多少次

    将要/已调用 partial_fit

  • brackets,一个列表,包含 Hyperband 运行的各个阶段(bracket)。每个阶段对于训练时间重要性和超参数重要性有不同的值。除了 n_modelspartial_fit_calls,此列表中的每个元素还包含以下键:

    • bracket,一个整数,表示阶段 ID。每个阶段对应于不同的训练时间重要性级别。对于阶段 0,训练时间很重要。对于最高阶段,训练时间不重要,并且模型被积极剔除。

    • SuccessiveHalvingSearchCV params,一个用于创建不同阶段的字典。它不包含 estimatorparameters 参数。

    • decisions,Hyperband 在做出决策之前进行的 partial_fit 调用次数。

如果未指定 patience,这些字典是相同的。如果指定了 patience,则可能进行的训练较少,metadata_ 将反映这一点(而 metadata 不会)。

cv_results_Dict[str, np.ndarray]

一个字典,描述每个模型的表现如何。它包含关于每个模型的信息,无论它是否达到了 max_iter。它包含以下键:

  • mean_partial_fit_time

  • mean_score_time

  • std_partial_fit_time

  • std_score_time

  • test_score

  • rank_test_score

  • model_id

  • partial_fit_calls

  • params

  • param_{key},其中 {key}params 中的每个键。

  • bracket

test_score 键中的值对应于模型在保留数据集上获得的最后一个分数。model_id 键与 history_ 对应。此字典可以导入到 Pandas DataFrame 中。

model_id 中,阶段 ID 前缀对应于 metadata 中的阶段。阶段 0 完全不适应先前的训练;值越高表示适应性越强。

history_字典列表

每次 partial_fit 调用后关于每个模型的信息。每个字典包含以下键:

  • partial_fit_time

  • score_time

  • score

  • model_id

  • params

  • partial_fit_calls

  • elapsed_wall_time

model_id 对应于 cv_results_ 中的 model_id。此字典列表可以导入到 Pandas 中。

model_history_字典,键为模型 ID,值为字典列表

每个模型历史的字典。这是对 history_ 的重新组织:包含相同的信息,但按模型进行组织。

此数据的结构为 {model_id: [h1, h2, h3, ...]},其中 h1h2h3history_ 的元素,model_idcv_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 以及 Xy 的块大小,需要估计

  • 至少一个模型将看到多少个示例 (n_examples)。如果训练时间最长的模型需要遍历数据 10 次,则 n_examples = 10 * len(X)

  • 需要采样的超参数组合数量 (n_params)

这些可以是粗略的估计。要确定块大小和 max_iter

  1. 令块大小为 chunk_size = n_examples / n_params

  2. 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)