随机搜索交叉验证#

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”方法。如果所使用的估计器中实现了“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、callable、list、tuple或dict,默认为None

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

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

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

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

  • 返回字典的callable,其中键是度量名称,值是度量分数;

  • 具有度量名称作为键和callable作为值的字典。

参见指定多个度量进行评估以了解示例。

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

n_jobsint,默认为None

并行运行的作业数。None表示1,除非在joblib.parallel_backend上下文。-1表示使用所有处理器。更多详情请参见词汇表

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

refitbool、str或callable,默认为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参数,以了解有关多指标评估的更多信息。

v0.20版本中的更改:添加了对callable的支持。

cvint、交叉验证生成器或可迭代对象,默认为None

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

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

  • 整数,指定 (Stratified)KFold 中的折叠数;

  • CV 分割器,

  • 一个迭代器,生成 (train, test) 拆分作为索引数组。

对于整数/None 输入,如果估计器是分类器并且 y 是二元或多类,则使用 StratifiedKFold。在所有其他情况下,使用 KFold。这些分割器使用 shuffle=False 实例化,因此拆分在调用之间将保持一致。

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

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

verboseint

控制详细程度:数值越高,显示的消息越多。

  • >1:显示每个折叠和参数候选的计算时间;

  • >2:还显示分数;

  • >3:还显示折叠和候选参数索引以及计算的起始时间。

pre_dispatchint 或 str,默认值为’2*n_jobs’

控制在并行执行期间分派的作业数量。减少此数字可以避免在分派的作业数量超过 CPU 可处理数量时内存消耗激增。此参数可以是:

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

  • 整数,给出生成的作业总数。

  • 字符串,给出作为 n_jobs 函数的表达式,例如 ‘2*n_jobs’。

random_stateint、RandomState 实例或 None,默认值为 None

用于从可能的取值列表中进行随机均匀采样的伪随机数生成器状态,而不是 scipy.stats 分布。传递一个整数以在多次函数调用中获得可重复的输出。请参见 词汇表

error_score‘raise’ 或数字,默认值为 np.nan

如果估计器拟合过程中发生错误,则为分数分配的值。如果设置为 ‘raise’,则会引发错误。如果给出数值,则会引发 FitFailedWarning。此参数不影响 refit 步骤,refit 步骤将始终引发错误。

return_train_scorebool,默认值为 False

如果 False,则 cv_results_ 属性将不包含训练分数。计算训练分数用于深入了解不同的参数设置如何影响过拟合/欠拟合权衡。但是,在训练集上计算分数在计算上可能很昂贵,并且严格来说不需要选择产生最佳泛化性能的参数。

0.19 版本中添加。

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

属性:
cv_results_numpy(掩码)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}, ...],
}

注意

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

mean_fit_timestd_fit_timemean_score_timestd_score_time 全部以秒为单位。

对于多指标评估,所有评分器的分数都可以在 cv_results_ 字典中以以该评分器名称结尾的键获得('_<scorer_name>'),而不是上面显示的 '_score'。(‘split0_test_precision’,‘mean_train_precision’ 等)

best_estimator_估计器

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

对于多指标评估,只有在指定 refit 时才存在此属性。

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

best_score_float

最佳估计器的平均交叉验证分数。

对于多指标评估,如果 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_函数或字典

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

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

n_splits_int

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

refit_time_浮点数

在整个数据集上重新拟合最佳模型所用的时间(秒)。

仅当refit不为False时才存在。

在0.20版本中添加。

multimetric_布尔值

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

classes_形状为(n_classes,)的ndarray

类别标签。

n_features_in_整数

拟合过程中看到的特征数量。

feature_names_in_形状为(n_features_in_,)的ndarray

拟合过程中看到的特征名称。仅当best_estimator_已定义(有关更多详细信息,请参阅refit参数的文档)且best_estimator_在拟合时公开feature_names_in_时才定义。

在1.0版本中添加。

另请参阅

网格搜索交叉验证

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

参数采样器

参数设置的生成器,由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),
...                      penalty=['l2', 'l1'])
>>> clf = RandomizedSearchCV(logistic, distributions, random_state=0)
>>> search = clf.fit(iris.data, iris.target)
>>> search.best_params_
{'C': np.float64(2...), 'penalty': 'l1'}
属性 classes_#

类别标签。

仅当refit=True且估计器是分类器时可用。

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,)的类数组,默认为None

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

**paramsstr到对象的字典

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

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

返回:
self对象

已拟合估计器的实例。

get_metadata_routing()[source]#

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

请查看用户指南,了解路由机制的工作原理。

在1.4版本中添加。

返回:
routing元数据路由器

一个封装路由信息的MetadataRouter

get_params(deep=True)[source]#

获取此估计器的参数。

参数:
deepbool,默认为True

如果为 True,则将返回此估计器和包含的作为估计器的子对象的参数。

返回:
paramsdict

参数名称与其值的映射。

inverse_transform(X=None, Xt=None)[source]#

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

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

参数:
X可索引的,长度为n_samples

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

Xt可索引的,长度为 n_samples

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

自版本 1.5 起已弃用: Xt已在 1.5 中弃用,并将从 1.7 中删除。请改用X

返回:
X形状为 (n_samples, n_features) 的 {ndarray,稀疏矩阵}

基于具有最佳发现参数的估计器的Xtinverse_transform函数的结果。

property n_features_in_#

拟合过程中看到的特征数量。

仅当refit=True时可用。

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方法。

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

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

y形状为(n_samples, n_output)或(n_samples,)的类数组,默认为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 版本新增。

参数:
X可迭代对象

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

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

best_estimator_.score_samples 方法。

set_params(**params)[source]#

设置此估计器的参数。

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

参数:
**paramsdict

估计器参数。

返回:
self估计器实例

估计器实例。

transform(X)[source]#

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

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

参数:
X可索引的,长度为n_samples

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

返回:
Xt形状为 (n_samples, n_features) 的 {ndarray, 稀疏矩阵}

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