RandomizedSearchCV#

class sklearn.model_selection.RandomizedSearchCV(estimator, param_distributions, *, n_iter=10, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', random_state=None, error_score=nan, return_train_score=False)[source]#

对超参数进行随机搜索。

RandomizedSearchCV 实现了“fit”和“score”方法。如果所使用的估计器(estimator)实现了这些方法,它还会实现“score_samples”、“predict”、“predict_proba”、“decision_function”、“transform”和“inverse_transform”。

用于应用这些方法的估计器参数通过参数设置的交叉验证搜索进行优化。

与 GridSearchCV 不同,它不会尝试所有参数值,而是从指定的分布中采样固定数量的参数设置。尝试的参数设置数量由 n_iter 指定。

如果所有参数都以列表形式提供,则执行无放回采样。如果至少有一个参数以分布形式给出,则使用有放回采样。强烈建议对连续参数使用连续分布。

阅读更多内容请参阅 用户指南

版本 0.14 中新增。

参数:
estimator估计器对象

为每个网格点实例化该类型的对象。假定该对象实现了 scikit-learn 估计器接口。估计器要么需要提供 score 函数,要么必须传递 scoring

param_distributions字典或字典列表

字典,键为参数名称(str),值为要尝试的分布或参数列表。分布必须提供用于采样的 rvs 方法(例如来自 scipy.stats.distributions)。如果给出了列表,则进行均匀采样。如果给出了字典列表,则首先均匀采样一个字典,然后使用该字典按照上述方式采样一个参数。

n_iterint, 默认=10

采样的参数设置数量。n_iter 在运行时间和解决方案质量之间进行权衡。

scoringstr, 可调用对象, 列表, 元组或字典, 默认=None

用于评估测试集上交叉验证模型性能的策略。

如果 scoring 代表单个分数,可以使用

如果 scoring 代表多个分数,可以使用

  • 一个包含唯一字符串的列表或元组;

  • 一个返回字典的可调用对象,其中键是度量名称,值是度量分数;

  • 一个以度量名称为键,以可调用对象为值的字典。

有关示例,请参见 为评估指定多个指标

如果为 None,则使用估计器的 score 方法。

n_jobsint, default=None

并行运行的作业数。None 表示 1,除非在 joblib.parallel_backend 上下文中。-1 表示使用所有处理器。有关更多详细信息,请参阅 Glossary

版本 v0.20 中已更改:n_jobs 默认值从 1 更改为 None

refitbool, str 或可调用对象, 默认=True

使用找到的最佳参数在整个数据集上重新拟合估计器。

对于多指标评估,这需要是一个 str,表示用于在最后重新拟合估计器时查找最佳参数的评分器。

当选择最佳估计器时考虑除了最大分数以外的因素时,可以将 refit 设置为一个函数,该函数根据 cv_results_ 返回所选的 best_index_。在这种情况下,best_estimator_best_params_ 将根据返回的 best_index_ 进行设置,而 best_score_ 属性将不可用。

重新拟合后的估计器在 best_estimator_ 属性中可用,并允许直接在此 RandomizedSearchCV 实例上使用 predict

同样对于多指标评估,仅当设置了 refit 时,best_index_best_score_best_params_ 属性才可用,并且它们都将相对于该特定评分器进行确定。

有关多指标评估的更多信息,请参阅 scoring 参数。

请参阅 此示例,了解如何使用 refit=callable 来平衡模型复杂度和交叉验证分数。

0.20 版本更改: 增加了对可调用对象的支持。

cvint, cross-validation generator or an iterable, default=None

确定交叉验证拆分策略。cv 的可能输入包括

  • None,使用默认的 5 折交叉验证,

  • integer,指定 (Stratified)KFold 中的折数,

  • CV 分割器,

  • 产生(训练,测试)拆分作为索引数组的可迭代对象。

对于 integer/None 输入,如果估计器是分类器且 y 是二元或多类,则使用 StratifiedKFold。在所有其他情况下,使用 KFold。这些分割器以 shuffle=False 实例化,因此拆分在不同调用中将保持相同。

有关此处可使用的各种交叉验证策略,请参阅 用户指南

版本 0.22 中已更改:如果为 None,cv 默认值从 3 折更改为 5 折。

verboseint, 默认=0

控制拟合期间打印信息的详细程度,值越大,日志越详细。

  • 0 : 不打印消息;

  • >=1 : 拟合总数的汇总;

  • >=2 : 每个折叠和参数候选项的计算时间;

  • >=3 : 折叠索引和分数;

  • >=10 : 每次拟合前的参数候选项索引和 START 消息。

pre_dispatchint 或 str, 默认=’2*n_jobs’

控制并行执行期间调度的作业数量。当调度的作业多于 CPU 可处理的数量时,减少此数字有助于避免内存消耗激增。此参数可以为

  • None,在这种情况下,所有作业会立即创建和生成。对于轻量级且运行快速的作业使用此选项,以避免因按需生成作业而导致的延迟。

  • 一个 int 值,给出生成的总作业的确切数量。

  • 一个 str,给出 n_jobs 函数的表达式,例如 ‘2*n_jobs’。

random_stateint, RandomState instance or None, default=None

用于从可能值列表进行随机均匀采样(而不是使用 scipy.stats 分布)的伪随机数生成器状态。传入一个 int 以在多次函数调用中获得可复现的输出。参见 术语表

error_score‘raise’ or numeric, default=np.nan

如果估计器拟合时发生错误,则分配给该分数的数值。如果设置为 'raise',则会引发错误。如果给定一个数值,则会引发 FitFailedWarning。此参数不影响重拟合步骤,重拟合步骤总是会引发错误。

return_train_scorebool, default=False

如果为 False,则 cv_results_ 属性将不包括训练分数。计算训练分数用于深入了解不同参数设置如何影响过拟合/欠拟合的权衡。然而,计算训练集上的分数可能计算成本很高,并且不是严格要求用于选择产生最佳泛化性能的参数。

Added in version 0.19.

版本 0.21 中已更改:默认值从 True 更改为 False

属性:
cv_results_dict of numpy (masked) ndarrays

一个以列标题为键、以列为值的字典,可以导入到 pandas DataFrame 中。

例如下表

param_kernel

param_gamma

split0_test_score

rank_test_score

‘rbf’

0.1

0.80

1

‘rbf’

0.2

0.84

3

‘rbf’

0.3

0.70

2

将由 cv_results_ 字典表示为

{
'param_kernel' : masked_array(data = ['rbf', 'rbf', 'rbf'],
                              mask = False),
'param_gamma'  : masked_array(data = [0.1 0.2 0.3], mask = False),
'split0_test_score'  : [0.80, 0.84, 0.70],
'split1_test_score'  : [0.82, 0.50, 0.70],
'mean_test_score'    : [0.81, 0.67, 0.70],
'std_test_score'     : [0.01, 0.24, 0.00],
'rank_test_score'    : [1, 3, 2],
'split0_train_score' : [0.80, 0.92, 0.70],
'split1_train_score' : [0.82, 0.55, 0.70],
'mean_train_score'   : [0.81, 0.74, 0.70],
'std_train_score'    : [0.01, 0.19, 0.00],
'mean_fit_time'      : [0.73, 0.63, 0.43],
'std_fit_time'       : [0.01, 0.02, 0.01],
'mean_score_time'    : [0.01, 0.06, 0.04],
'std_score_time'     : [0.00, 0.00, 0.00],
'params'             : [{'kernel' : 'rbf', 'gamma' : 0.1}, ...],
}

关于分析 cv_results_ 的示例,请参阅 使用网格搜索进行模型的统计比较

注意

'params' 用于存储所有参数候选项的参数设置字典列表。

mean_fit_timestd_fit_timemean_score_timestd_score_time 的单位均为秒。

对于多指标评估,所有评分器的分数在 cv_results_ 字典中以该评分器名称结尾的键('_<scorer_name>')存储,而不是上述的 '_score'。(例如 ‘split0_test_precision’, ‘mean_train_precision’ 等)

best_estimator_estimator

搜索选择的估计器,即在保留数据上给出最高分数(或指定最小损失)的估计器。如果 refit=False 则不可用。

对于多指标评估,仅当指定了 refit 时才存在此属性。

有关允许值的更多信息,请参阅 refit 参数。

best_score_float

best_estimator 的平均交叉验证分数。

对于多指标评估,如果 refitFalse,则此属性不可用。有关更多信息,请参阅 refit 参数。

如果 refit 是一个函数,则此属性不可用。

best_params_dict

在保留数据上给出最佳结果的参数设置。

对于多指标评估,如果 refitFalse,则此属性不可用。有关更多信息,请参阅 refit 参数。

best_index_int

与最佳候选参数设置相对应的 cv_results_ 数组中的索引。

search.cv_results_['params'][search.best_index_] 处的字典给出了最佳模型的参数设置,该模型给出了最高平均分数(search.best_score_)。

对于多指标评估,如果 refitFalse,则此属性不可用。有关更多信息,请参阅 refit 参数。

scorer_function or a dict

用于在保留数据上选择模型最佳参数的评分函数。

对于多指标评估,此属性持有经过验证的 scoring 字典,该字典将评分器键映射到评分器可调用对象。

n_splits_int

交叉验证拆分的数量(折叠/迭代)。

refit_time_float

用于在整个数据集上重新拟合最佳模型所花费的秒数。

仅在 refit 不为 False 时存在。

0.20 版本新增。

multimetric_bool

评分器是否计算多个指标。

classes_形状为 (n_classes,) 的 ndarray

类别标签。

n_features_in_int

拟合 期间看到的特征数。

feature_names_in_shape 为 (n_features_in_,) 的 ndarray

fit 期间看到的特征名称。仅当定义了 best_estimator_(有关详细信息,请参阅 refit 参数的文档)并且 best_estimator_ 在拟合时公开 feature_names_in_ 时才定义。

1.0 版本新增。

另请参阅

GridSearchCV

对参数网格进行穷举搜索。

ParameterSampler

一个参数设置生成器,由 param_distributions 构建。

注意事项

根据 scoring 参数,选择的参数是使保留数据分数最大化的参数。

如果 n_jobs 设置为大于 1 的值,则数据会为每个参数设置复制一次(而不是 n_jobs 次)。出于效率原因,如果单个作业花费的时间非常短,则这样做,但如果数据集很大且内存不足,可能会引发错误。在这种情况下,一种解决方法是设置 pre_dispatch。这样,内存仅会被复制 pre_dispatch 次。pre_dispatch 的合理值为 2 * n_jobs

示例

>>> from sklearn.datasets import load_iris
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from scipy.stats import uniform
>>> iris = load_iris()
>>> logistic = LogisticRegression(solver='saga', tol=1e-2, max_iter=200,
...                               random_state=0)
>>> distributions = dict(C=uniform(loc=0, scale=4),
...                      l1_ratio=[0, 1])
>>> clf = RandomizedSearchCV(logistic, distributions, random_state=0)
>>> search = clf.fit(iris.data, iris.target)
>>> search.best_params_
{'C': np.float64(2.195...), 'l1_ratio': 1}
decision_function(X)[source]#

使用找到的最佳参数调用估计器上的 decision_function。

仅当 refit=True 且底层估计器支持 decision_function 时可用。

参数:
X可索引对象,长度 n_samples

必须满足底层估计器的输入假设。

返回:
y_score形状为 (n_samples,) 或 (n_samples, n_classes) 或 (n_samples, n_classes * (n_classes-1) / 2) 的 ndarray

基于具有最佳找到参数的估计器对 X 的决策函数结果。

fit(X, y=None, **params)[source]#

使用所有参数集运行拟合。

参数:
X形状为 (n_samples, n_features) 或 (n_samples, n_samples) 的类数组对象

训练向量,其中 n_samples 是样本数量,n_features 是特征数量。对于预计算的内核或距离矩阵,X 的预期形状为 (n_samples, n_samples)。

y形状为 (n_samples, n_output) 或 (n_samples,) 的类数组对象, default=None

相对于 X 的分类或回归目标;对于无监督学习为 None。

**paramsstr -> object 字典

传递给估计器、评分器和 CV 分割器的 fit 方法的参数。

如果拟合参数是一个长度等于 num_samples 的类数组对象,则它将与 Xy 一起通过交叉验证进行分割。例如,sample_weight 参数会被分割,因为 len(sample_weights) = len(X)。但是,此行为不适用于传递给构造函数 cv 参数配置的分割器的 groups。因此,groups 用于执行分割,并确定哪些样本被分配到分割的每一侧。

返回:
selfobject

已拟合估计器的实例。

get_metadata_routing()[source]#

获取此对象的元数据路由。

请查阅 用户指南,了解路由机制如何工作。

1.4 版本新增。

返回:
routingMetadataRouter

封装路由信息的 MetadataRouter

get_params(deep=True)[source]#

获取此估计器的参数。

参数:
deepbool, default=True

如果为 True,将返回此估计器以及包含的子对象(如果它们是估计器)的参数。

返回:
paramsdict

参数名称映射到其值。

inverse_transform(X)[source]#

使用找到的最佳参数调用估计器上的 inverse_transform。

仅当底层估计器实现 inverse_transformrefit=True 时可用。

参数:
X可索引对象,长度 n_samples

必须满足底层估计器的输入假设。

返回:
X_original形状为 (n_samples, n_features) 的 {ndarray, sparse matrix}

基于具有最佳找到参数的估计器对 Xinverse_transform 函数结果。

predict(X)[source]#

使用找到的最佳参数调用估计器上的 predict。

仅当 refit=True 且底层估计器支持 predict 时可用。

参数:
X可索引对象,长度 n_samples

必须满足底层估计器的输入假设。

返回:
y_pred形状为 (n_samples,) 的 ndarray

基于具有最佳找到参数的估计器对 X 的预测标签或值。

predict_log_proba(X)[source]#

使用找到的最佳参数调用估计器上的 predict_log_proba。

仅当 refit=True 且底层估计器支持 predict_log_proba 时可用。

参数:
X可索引对象,长度 n_samples

必须满足底层估计器的输入假设。

返回:
y_pred形状为 (n_samples,) 或 (n_samples, n_classes) 的 ndarray

基于具有最佳找到参数的估计器对 X 的预测类别对数概率。类别的顺序对应于已拟合属性 classes_ 中的顺序。

predict_proba(X)[source]#

使用找到的最佳参数调用估计器上的 predict_proba。

仅当 refit=True 且底层估计器支持 predict_proba 时可用。

参数:
X可索引对象,长度 n_samples

必须满足底层估计器的输入假设。

返回:
y_pred形状为 (n_samples,) 或 (n_samples, n_classes) 的 ndarray

基于具有最佳找到参数的估计器对 X 的预测类别概率。类别的顺序对应于已拟合属性 classes_ 中的顺序。

score(X, y=None, **params)[source]#

如果估计器已重新拟合,则返回给定数据的分数。

如果提供了 scoring,则使用它定义的分数;否则使用 best_estimator_.score 方法。

参数:
Xshape 为 (n_samples, n_features) 的 array-like

输入数据,其中 n_samples 是样本数量,n_features 是特征数量。

y形状为 (n_samples, n_output) 或 (n_samples,) 的类数组对象, default=None

相对于 X 的分类或回归目标;对于无监督学习为 None。

**paramsdict

要传递给底层评分器(s)的参数。

1.4 版本新增: 仅当 enable_metadata_routing=True 时可用。有关更多详细信息,请参阅 元数据路由用户指南

返回:
scorefloat

如果提供了 scoring,则使用它定义的分数;否则使用 best_estimator_.score 方法。

score_samples(X)[source]#

使用找到的最佳参数调用估计器上的 score_samples。

仅当 refit=True 且底层估计器支持 score_samples 时可用。

0.24 版本新增。

参数:
Xiterable

用于预测的数据。必须满足底层估计器的输入要求。

返回:
y_score形状为 (n_samples,) 的 ndarray

best_estimator_.score_samples 方法。

set_callbacks(*callbacks)[source]#

为估计器设置回调函数。

参数:
*callbacks回调实例

要设置的回调函数。

返回:
selfestimator instance

估计器实例本身。

set_params(**params)[source]#

设置此估计器的参数。

此方法适用于简单的估计器以及嵌套对象(如 Pipeline)。后者具有 <component>__<parameter> 形式的参数,以便可以更新嵌套对象的每个组件。

参数:
**paramsdict

估计器参数。

返回:
selfestimator instance

估计器实例。

transform(X)[source]#

使用找到的最佳参数调用估计器上的 transform。

仅当底层估计器支持 transformrefit=True 时可用。

参数:
X可索引对象,长度 n_samples

必须满足底层估计器的输入假设。

返回:
Xt形状为 (n_samples, n_features) 的 {ndarray, sparse matrix}

基于具有最佳找到参数的估计器在新的空间中转换的 X