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_fit、set_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.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一起工作是必要的。
- 属性
- 元数据和元数据_dict[str, Union(int, dict)]
这些字典描述了执行的计算,无论是在计算发生之前使用
metadata还是在计算发生后使用metadata_。这两个字典都有键n_models是一个表示将创建/已创建的模型数量的整数。partial_fit_calls,一个表示调用次数的整数partial_fit将被/已调用。
brackets,Hyperband 运行的括号列表。每个括号对于训练时间和超参数重要性有不同的值。除了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_字典列表的字典
每个模型的历史记录字典。这是对
history_的重新组织:相同的信息存在,但按模型组织。此数据具有
{model_id: [h1, h2, h3, ...]}的结构,其中h1、h2和h3是history_的元素,而model_id是cv_results_中的模型ID。- best_estimator_BaseEstimator
由 Hyperband 模型选择算法选出的验证得分最高的模型。
- best_score_浮动
在最终调用
partial_fit后,best_estimator_在验证集上取得的分数。- 最佳索引_整数
指示
cv_results_中哪个估计器对应于最高分数的索引。- best_params_dict
在保留数据上找到的最佳参数的字典。
- 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: 一种基于强盗算法的新型超参数优化方法”, 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