如何将 GridSearchCV 中的验证集与训练集分开标准化?

Dom*_*vic 5 python machine-learning scikit-learn cross-validation

如何在 GridSearchCV 中单独缩放每个折叠?

在训练 ML 模型时,我们应该对训练数据的特征进行标准化(缩放)。然后在测试数据上使用拟合的缩放器。但如果使用网格搜索 CV(5 倍),我们通常会为其提供已经缩放的训练数据。然后将其分成折叠。但是我们如何分别缩放每个 4-1 折叠呢?

scl = MinMaxScaler()
scl.fit_transform(X_train)
scl.transform(X_test)

# The training data was scaled all together and
# not train and validation separately
cv = GridSearchCV(MODEL, GRID, scoring='f1', cv=5)
cv.fit(X_train, Y_train)
Run Code Online (Sandbox Code Playgroud)

如果您对如何实现这样的目标有任何建议,请告诉我。

Shi*_*han 7

这就是管道的用途。

将当前模型转换为流水线模型,如下所示:

new_model = Pipeline([('scaler', MinMaxScaler()), ('model', cur_model)])
Run Code Online (Sandbox Code Playgroud)

不要提前扩展你的训练集。每次fit调用时,Pipeline 都会自动拟合和转换您的训练数据(当然仅使用训练数据)并transform使用fitting 调用测试集MinMaxScaler

  • 如果您在 GridSearchCV 中设置了“refit=True”(默认设置),则不会。这意味着 GridSearchCV 将使用具有最佳找到的超参数的整个训练集来训练最终模型,因此管道*内的缩放器会自动安装。事实上,在 `cv = GridSearchCV(new_model , GRID, rating='f1', cv=5).fit(X_train, Y_train)` 之后,您可以简单地调用 `cv.predict(X_test)` (即直接在拟合的 GridSearchCV 上)不用担心缩放或其他任何事情` (2认同)
  • 这是一些突破性的消息:)。如果我理解正确的话,让我重申一下。虽然 GridSearchCV(pipeline, grid, ...) 将与我的管道一起运行。我的管道将进行适当的预处理。然后我可以将 cv.predict(X_test) 与未预处理的数据一起使用,sklearn 会处理这个问题吗?听起来棒极了。即使我用 joblib 转储经过训练的管道,它还能工作吗?然后加载它?管道的预处理是否仍然存在转储/加载? (2认同)