交叉验证#
- sklearn.model_selection.cross_validate(estimator, X, y=None, *, groups=None, scoring=None, cv=None, n_jobs=None, verbose=0, params=None, pre_dispatch='2*n_jobs', return_train_score=False, return_estimator=False, return_indices=False, error_score=nan)[source]#
通过交叉验证评估指标,并记录拟合/评分时间。
更多信息请阅读用户指南。
- 参数:
- estimator实现“fit”方法的估计器对象
用于拟合数据的对象。
- X形状为 (n_samples, n_features) 的{数组类,稀疏矩阵}
要拟合的数据。例如可以是列表或数组。
- y形状为 (n_samples,) 或 (n_samples, n_outputs) 的数组类,默认为 None
在监督学习情况下,尝试预测的目标变量。
- groups形状为 (n_samples,) 的数组类,默认为 None
将数据集拆分为训练集/测试集时使用的样本分组标签。仅与“分组” cv 实例(例如,
GroupKFold
)结合使用。1.4 版本中的更改:
groups
只有在未通过sklearn.set_config(enable_metadata_routing=True)
启用元数据路由时才能传递。启用路由时,请通过params
参数传递groups
以及其他元数据。例如:cross_validate(..., params={'groups': groups})
。- scoringstr、callable、list、tuple 或 dict,默认为 None
评估交叉验证模型在测试集上性能的策略。如果为
None
,则使用估计器的默认评估标准。如果
scoring
表示单个分数,可以使用:单个字符串(参见评分参数:定义模型评估规则);
返回单个值的callable(参见可调用评分器)。
如果
scoring
表示多个分数,可以使用:唯一字符串的列表或元组;
返回字典的callable,其中键是指标名称,值是指标分数;
字典,其中指标名称为键,callable 为值。
参见指定多个指标进行评估以了解示例。
- cvint、交叉验证生成器或可迭代对象,默认为 None
确定交叉验证拆分策略。cv 的可能输入为:
None,使用默认的 5 折交叉验证,
int,指定
(Stratified)KFold
中的折叠数,产生 (train, test) 拆分作为索引数组的可迭代对象。
对于 int/None 输入,如果估计器是分类器并且
y
是二元或多类,则使用StratifiedKFold
。在所有其他情况下,使用KFold
。这些分割器使用shuffle=False
实例化,因此拆分在调用之间将保持一致。参考用户指南了解此处可使用的各种交叉验证策略。
0.22 版本中的更改: 如果为 None,则
cv
的默认值从 3 折更改为 5 折。- n_jobsint,默认为 None
并行运行的作业数。估计器的训练和分数计算在交叉验证拆分上并行化。
None
表示 1,除非在joblib.parallel_backend
上下文中。-1
表示使用所有处理器。更多详情请参见词汇表。- verboseint,默认为 0
详细程度。
- paramsdict,默认为 None
传递给底层估计器的
fit
、评分器和 CV 分割器的参数。1.4 版本中添加。
- pre_dispatchint 或 str,默认为 '2*n_jobs'
控制在并行执行期间分派的作业数。减少此数字有助于避免在分派的作业数超过 CPU 可以处理的数目时内存消耗激增。此参数可以是:
一个 int,给出生成的总作业的确切数量
一个 str,给出作为 n_jobs 函数的表达式,如 '2*n_jobs'
- return_train_score布尔值,默认为False
是否包含训练分数。计算训练分数用于了解不同的参数设置如何影响过拟合/欠拟合的权衡。但是,在训练集上计算分数可能计算量很大,并且并非严格要求选择产生最佳泛化性能的参数。
0.19版本新增。
0.21版本更改: 默认值已从
True
更改为False
- return_estimator布尔值,默认为False
是否返回在每个分割上拟合的估计器。
0.20版本新增。
- return_indices布尔值,默认为False
是否返回为每个分割选择的训练-测试索引。
1.3版本新增。
- error_score‘raise’ 或数值,默认为np.nan
如果估计器拟合发生错误,则分配给分数的值。如果设置为'raise',则引发错误。如果给出数值,则会引发FitFailedWarning。
0.20版本新增。
- 返回:
- scores形状为 (n_splits,) 的浮点数组字典
每次交叉验证运行的估计器的分数数组。
返回一个包含每个评分器的分数/时间数组的数组字典。此
dict
的可能键为test_score
每次交叉验证分割的测试分数的得分数组。如果评分参数中有多个评分指标,则
test_score
中的后缀_score
将更改为特定指标,例如test_r2
或test_auc
。train_score
每次交叉验证分割的训练分数的得分数组。如果评分参数中有多个评分指标,则
train_score
中的后缀_score
将更改为特定指标,例如train_r2
或train_auc
。只有当return_train_score
参数为True
时才可用。fit_time
每次交叉验证分割在训练集上拟合估计器的时间。
score_time
每次交叉验证分割在测试集上对估计器进行评分的时间。(即使
return_train_score
设置为True
,也不包括在训练集上进行评分的时间)estimator
每次交叉验证分割的估计器对象。只有当
return_estimator
参数设置为True
时才可用。indices
每次交叉验证分割的训练/测试位置索引。返回一个字典,其中键是
"train"
或"test"
,关联值是包含索引的整数类型NumPy数组列表。只有当return_indices=True
时才可用。
另请参见
交叉验证得分 (cross_val_score)
运行交叉验证以进行单指标评估。
交叉验证预测 (cross_val_predict)
获取来自交叉验证每个分割的预测结果,用于诊断目的。
sklearn.metrics.make_scorer
从性能指标或损失函数创建评分器。
示例
>>> from sklearn import datasets, linear_model >>> from sklearn.model_selection import cross_validate >>> from sklearn.metrics import make_scorer >>> from sklearn.metrics import confusion_matrix >>> from sklearn.svm import LinearSVC >>> diabetes = datasets.load_diabetes() >>> X = diabetes.data[:150] >>> y = diabetes.target[:150] >>> lasso = linear_model.Lasso()
使用
cross_validate
进行单指标评估>>> cv_results = cross_validate(lasso, X, y, cv=3) >>> sorted(cv_results.keys()) ['fit_time', 'score_time', 'test_score'] >>> cv_results['test_score'] array([0.3315057 , 0.08022103, 0.03531816])
使用
cross_validate
进行多指标评估(更多信息请参考scoring
参数文档)>>> scores = cross_validate(lasso, X, y, cv=3, ... scoring=('r2', 'neg_mean_squared_error'), ... return_train_score=True) >>> print(scores['test_neg_mean_squared_error']) [-3635.5... -3573.3... -6114.7...] >>> print(scores['train_r2']) [0.28009951 0.3908844 0.22784907]