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_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, ...]}
,其中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)¶