在 GridSearchCV 中获取每个 CV 的所有预测值

Get all prediction values for each CV in GridSearchCV

我有一个时间相关的数据集,我(作为示例)正在尝试对套索回归进行一些超参数调整。

为此,我使用 sklearn 的 TimeSeriesSplit 而不是常规的 Kfold CV,即像这样的东西:

tscv = TimeSeriesSplit(n_splits=5)

model = GridSearchCV(
    estimator=pipeline,
    param_distributions= {"estimator__alpha": np.linspace(0.05, 1, 50)},
    scoring="neg_mean_absolute_percentage_error",
    n_jobs=-1,
    cv=tscv,
    return_train_score=True,
    max_iters=10,
    early_stopping=True,
)

model.fit(X_train, y_train)

有了这个,我得到了一个模型,然后我可以将其用于预测等。交叉验证背后的想法基于此:

但是,我的问题是我实际上想要从所有 cv 的所有测试集中获得预测。我不知道如何从模型中得到它?

如果我尝试 cv_results_,我会得到每个拆分和每个超参数的分数(来自评分参数)。但我似乎无法在每个测试拆分中找到每个值的预测值。我实际上需要它来进行一些回溯测试。我不认为使用最终模型来预测先前的值是“公平的”。我想在那种情况下会出现某种过度拟合。

是的,我有什么方法可以提取每个拆分的预测值吗?

您可以在 GridSearchCV 中使用自定义评分函数。这样您就可以使用在特定折叠中提供给 GridSearchCV 的估计器来预测输出。
来自文档评分参数是

Strategy to evaluate the performance of the cross-validated model on the test set.

from sklearn.metrics import mean_absolute_percentage_error
def custom_scorer(clf, X, y):
     y_pred = clf.predict(X)
     # save y_pred somewhere
     return -mean_absolute_percentage_error(y, y_pred)

model = GridSearchCV(estimator=pipeline,
                     scoring=custom_scorer)

上面代码中的输入Xy来自测试集。 clfestimator 参数的给定管道。
显然,您的估算器应该实施预测方法(应该是 scikit-learn 中的有效模型)。您可以将其他评分添加到自定义评分以避免来自自定义函数的 non-sense 评分。