如何使用交叉验证模型进行预测?

机器算法验证 交叉验证 预言 scikit-学习
2022-03-13 13:23:50

我想做以下步骤:

  1. 使用交叉验证训练模型
  2. 使用该模型进行未来预测(包括我的测试集)

cross_val_predict只给我它对训练集的预测。在那之后,我的分类器在哪里保存以备将来预测?我发现最接近的是运行cross_validate和 set return_estimator=True这给了我一个训练有素的估计器数组,因为它为每个折叠创建一个单独的实例。

这是否意味着我现在被困在所有未来预测的集成 k 模型中?如果是这样,有没有一种方便的方法可以做到这一点?也许使用VotingClassifier这里的最佳做法是什么?

2个回答

tl;dr是的,您可以使用经过训练的估计器数组构建投票分类器。我不建议这样做,尤其是因为我对用例了解不多。

我的典型工作流程

  • 在这个用例中可能有多个候选者来构建一个像样的估计器(假设RandomForest, xgboost, SVM
  • 使用它们中的每一个及其最佳超参数构建一个估计器(这是一种方法
  • 评估上述估计器的预测能力以及它们在不同测试集中的泛化程度(我将在这里使用交叉验证
  • 一些/所有候选估计器似乎都很好(这在这里会有所帮助
  • 构建多个估计器的集合,以获得更好的预测和/或泛化能力。(我可以在这里使用VotingClassifier

VotingClassifier主要用于在不同的技术之间进行投票,当然你也可以像你说的那样使用它。以下是对交叉验证的使用和投票的快速介绍。


关于您的用例的想法

交叉验证主要用作检查过拟合的一种方法。假设您已经确定了分类技术的最佳超参数(我们现在假设为随机森林),那么您会想看看模型是否能够很好地泛化不同的测试集。

在您的情况下,交叉验证将构建k估计器(假设 k 倍 CV),然后您可以检查该技术对数据的预测能力和方差,如下所示:

  1. mean的质量度量。越高越好

  2. standard_deviation的质量度量。越低越好 你的质量测量的高均值和低标准差意味着建模技术做得很好。

假设上述度量看起来不错,那么您可以得出结论,使用超参数的随机森林是一个不错的候选模型。如果您认为您的分类技术做得足够好,那么您还可以使用k来自 CV 的估计器构建一个投票分类器。

(我确信我们已经有了这个问题的一些答案,但我现在找不到它们。)

这是否意味着我现在被困在所有未来预测的集成 k 模型中?

不,通常这不是你所做的。

集成模型从根本上不同于不聚合许多子模型的预测的模型。

对于“正常”(未聚合)交叉验证,您通常会应用在交叉验证期间使用的相同训练算法,以将代理模型拟合到整个数据集(就像在拆分交叉验证之前一样)。

在 sklearn 上下文中,这意味着您移交给的fit功能estimatorcross_validate

以以下示例为例cross_val_predict

>>> from sklearn import datasets, linear_model
>>> from sklearn.model_selection import cross_val_predict
>>> diabetes = datasets.load_diabetes()
>>> X = diabetes.data[:150]
>>> y = diabetes.target[:150]
>>> lasso = linear_model.Lasso()
>>> y_pred = cross_val_predict(lasso, X, y, cv=3)

现在,

>>> final_model = lasso.fit (X, y)
>>> new_predictions = final_model.predict (diabetes.data [440:442])

为什么不合奏

通过聚合几个子模型的预测,集成模型不同于“单一”非聚合模型。如果子模型存在不稳定性,聚合模型将产生比每个子模型更稳定的预测。如果子模型稳定,则预测没有差异(只是浪费计算资源)。

正常的交叉验证将未聚合的预测与基本事实进行比较,因此它不会通过聚合来评估可能的稳定性。

因此,

  • 对于非聚合模型,非聚合(即通常的)交叉验证可用作预测性能/泛化误差估计的近似值。
  • 对于集成模型,我们还需要集成类型的性能/泛化误差估计,例如袋外或其交叉验证类似物。

反之亦然。

对集成模型使用未聚合的交叉验证估计将导致悲观偏差,该偏差可能在可忽略不计和很大之间,具体取决于 CV 代理模型的稳定性以及聚合了多少代理模型。
此外,这种偏差是不必要的,因为使用相应的拟合函数和交叉验证方案只会受到较小的悲观偏差,因为代理模型的训练用例较少(和/或要聚合的子模型较少)。