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 的早期停止方案。

Hyperband 不需要像 RandomizedSearchCV 那样在“短时间内评估许多参数”和“长时间训练少量参数”之间进行权衡。

Hyperband 需要一个输入,该输入需要知道通过 max_iter 训练最佳表现估计器的时间。另一个隐式输入(Dask 数组块大小)需要对要采样的参数数量进行粗略估计。详细说明在 注释 中。

*

\(N\)partial_fit 调用之后,Hyperband 生成的估计器将接近最优估计器,该估计器在很大程度上(其中“接近”意味着“在预期最佳可能分数的对数项内”)是 \(N\)partial_fit 调用可能生成的最佳估计器。

参数
估计器估计器对象。

每种超参数组合都会实例化一个该类型的对象。假定它实现了 scikit-learn 估计器接口。估计器需要提供一个 score 函数,或者必须传递 scoring。估计器必须实现 partial_fitset_params,并且能够与 clone 良好配合。

参数dict

包含参数名称(字符串)作为键和要尝试的分布或参数列表的字典。分布必须提供用于采样的 rvs 方法(例如来自 scipy.stats.distributions 的那些)。如果给定一个列表,则均匀采样。

max_iter整数

对任何一个模型调用 partial_fit 的最大次数。这应该是模型收敛所需的 partial_fit 调用次数。有关设置此参数的详细信息,请参阅 注释

攻击性int, 默认=3

在剔除不同估计器时应该有多激进。较高的值意味着对评分有更高的信心(或者超参数对 estimator.score 的影响大于数据)。理论建议 aggressiveness=3 接近最优。aggressiveness=4 有更高的信心,可能适合初始探索。

耐心int, 默认 False

如果指定,当分数在 patience 次调用 partial_fit 后没有增加 tol 时,训练将停止。默认关闭。如果 patience=True,则会自动选择 patience 值,以便与 Hyperband 模型选择算法配合良好。

tolfloat, 默认值 0.001

当指定 patience 时,考虑停止对该模型训练所需的改进水平。增加 tol 通常会减少训练时间,但可能会导致(潜在的)更差的估计器。

test_size浮动

用于计算测试/验证分数的数据集部分。默认为输入训练集的单个分区的大小。

备注

测试数据集应能适应单台机器的内存。根据需要调整 test_size 参数以实现这一点。

random_stateint, RandomState 实例或 None, 可选, 默认: None

如果为整数,random_state 是随机数生成器使用的种子;如果为 RandomState 实例,random_state 是随机数生成器;如果为 None,随机数生成器是 np.random 使用的 RandomState 实例。

评分字符串, 可调用对象, 列表/元组, 字典 或 None, 默认: None

一个单一的字符串(参见 The scoring parameter: defining model evaluation rules)或一个可调用的对象(参见 Defining your scoring strategy from metric functions),用于评估测试集上的预测。

如果为 None,则使用估计器的默认评分器(如果可用)。

详细bool, float, int, optional, default: False

如果为 False(默认),则不打印日志(或将它们输出到标准输出)。但是,标准日志记录仍将被使用。

如果为真,则打印日志并使用标准日志记录。

如果是浮点数,则大约在 verbose 的时间比例内打印/记录。

前缀str, 可选, 默认=””

在记录日志时,为每条消息添加 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 一起工作是必要的。

属性
元数据和元数据_dict[str, Union(int, dict)]

这些字典描述了执行的计算,无论是在计算发生之前使用 metadata 还是在计算发生后使用 metadata_。这两个字典都有键

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

  • partial_fit_calls,一个表示调用次数的整数

    partial_fit 将被/已调用。

  • brackets,Hyperband 运行的括号列表。每个括号对于训练时间和超参数重要性有不同的值。除了 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_字典列表的字典

每个模型的历史记录字典。这是对 history_ 的重新组织:相同的信息存在,但按模型组织。

此数据具有 {model_id: [h1, h2, h3, ...]} 的结构,其中 h1h2h3history_ 的元素,而 model_idcv_results_ 中的模型ID。

best_estimator_BaseEstimator

由 Hyperband 模型选择算法选出的验证得分最高的模型。

best_score_浮动

在最终调用 partial_fit 后,best_estimator_ 在验证集上取得的分数。

最佳索引_整数

指示 cv_results_ 中哪个估计器对应于最高分数的索引。

best_params_dict

在保留数据上找到的最佳参数的字典。

scorer_

用于评分模型的函数,其调用签名是 scorer_(estimator, X, y)

注释

要设置 max_iterXy 的块大小,需要进行估计

  • 至少一个模型将看到的示例数量 (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: 一种基于强盗算法的新型超参数优化方法”, 2016年,作者:L. Li, K. Jamieson, G. DeSalvo, A. Rostamizadeh, 和 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)[源代码]