在机器学习中,交叉验证是一种评估模型泛化能力的重要技术。它通过将数据集分割成多个子集,然后使用其中一个子集作为测试集,其余作为训练集,来评估模型的性能。这种方法可以减少模型评估过程中的偏差,并提供更可靠的性能估计。
在Python的scikit-learn库中,提供了一个名为cross_val_predict
的函数,用于生成交叉验证的预测结果。这个函数允许对每个输入数据点进行评估,并且可以指定不同的交叉验证策略。
使用cross_val_predict
函数时,需要指定一个估计器(estimator),它必须实现fit
方法和predict
方法。此外,还可以指定数据集X
和目标变量y
。如果进行的是监督学习,y
是预测的目标变量;如果是无监督学习,则y
可以是None
。
函数还允许指定分组标签groups
,这在进行分组交叉验证时非常有用。例如,如果数据集中的样本属于不同的组,可能希望确保每个测试集中都包含每个组的样本。
交叉验证的分割策略由参数cv
决定。它可以是一个整数,表示要使用的折数;也可以是一个交叉验证生成器,或者是一个可迭代对象,生成训练集和测试集的索引。如果cv
设置为None
,则默认使用5折交叉验证。
在并行执行交叉验证时,可以通过参数n_jobs
来控制并行作业的数量。如果设置为None
,则默认为1,除非在joblib的并行后台上下文中。如果设置为-1,则使用所有处理器。
参数verbose
用于控制输出的详细程度。如果设置为一个正整数,则会输出更多的信息。
参数fit_params
和params
允许传递额外的参数给估计器的fit
方法和交叉验证分割器。需要注意的是,fit_params
参数已被弃用,将在未来的版本中移除。
参数pre_dispatch
控制并行执行时调度的作业数量。如果设置为None
,则所有作业都会立即创建并启动。如果设置为一个整数,则会生成指定数量的作业。如果设置为一个字符串,如'2*n_jobs'
,则会根据n_jobs
的值来计算要生成的作业数量。
最后,参数method
指定了要调用的估计器方法。它可以是'predict'
、'predict_proba'
、'predict_log_proba'
或'decision_function'
。默认值为'predict'
。
函数返回的是一个数组,包含了每个输入数据点的预测结果。如果method
是'predict'
,或者在二元目标的'decision_function'
特殊情况下,返回的数组形状为(n_samples,)
。如果method
是'predict_proba'
、'predict_log_proba'
或'decision_function'
(除非是上述特殊情况),则返回的数组形状为(n_samples, n_classes)
。如果估计器是多输出的,则在每个形状的末尾添加一个额外的维度'n_outputs'
。
在某些情况下,如果训练集中缺少一个或多个类别,那么对于这些类别的所有实例,需要分配一个默认分数。如果method
产生每个类别的列,如'decision_function'
、'predict_proba'
或'predict_log_proba'
,则对于predict_proba
,这个值是0。为了确保输出是有限的,在其他情况下用该数据类型在dtype中的最小有限浮点值来近似负无穷大。
下面是一个使用cross_val_predict
函数的示例代码:
from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_predict
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
# 选择前150个样本作为数据集
X = diabetes.data[:150]
y = diabetes.target[:150]
# 创建一个Lasso回归模型
lasso = linear_model.Lasso()
# 使用3折交叉验证来预测
y_pred = cross_val_predict(lasso, X, y, cv=3)
这个示例首先加载了糖尿病数据集,并选择了前150个样本作为数据集。然后创建了一个Lasso回归模型,并使用3折交叉验证来预测目标变量。