保留验证集-超参数调整

问题描述 投票:0回答:1

我有一个很大的数据集,我已将其拆分为:

  • 训练集(80%)
  • 验证集(10%)
  • 测试集(10%)

在每个集合上,我都执行了缺失值插补和特征选择(在训练集上进行训练,并复制到验证和测试集中)以避免数据泄漏。

现在,我想用Python训练一个XGBoost模型,并想使用训练集执行超参数调整,并使用验证集评估每个参数集。如何使用随机方法(例如在 RandomizedSearchCV 中)来执行此操作,这样我就不会运行所有参数集?

如果我是对的,GridSearch和RandomizedSearchCV只允许交叉验证,这不是我想要的,因为将预处理的训练集分割成折叠会导致数据泄漏。 我知道我可以构建一个 sklearn 管道,在每个折叠中进行预处理,但我想避免后一种选择。

我只能考虑运行每个参数集的代码,就像在 GridSearch 中一样:

from sklearn.model_selection import ParameterGrid
import xgboost as xgb

# Define your hyperparameter grid
param_grid = {
    'max_depth': [3, 5, 7],
    'learning_rate': [0.01, 0.1, 0.2],
    'n_estimators': [100, 200, 300]
}

best_score = -1
best_params = {}

for params in ParameterGrid(param_grid):
    model = xgb.XGBClassifier(**params)
    model.fit(X_train, y_train)
    val_score = model.score(X_val, y_val)  # Or use a more specific metric

    if val_score > best_score:
        best_score = val_score
        best_params = params

# Train the final model with the best hyperparameters
best_model = xgb.XGBClassifier(**best_params)
best_model.fit(X_train, y_train)
machine-learning xgboost hyperparameters
1个回答
0
投票

我理解你的问题,但我没有明确的答案。然而,像您建议的那样重复使用相同的验证集也是不可取的,因为您有可能(过度)拟合数据的特定部分的超参数。

您可以预先指定折叠并根据其他训练折叠来估算验证折叠。您也可以接受,由于一两个观察结果最终出现在验证折叠中,因此存在很小的泄漏可能性。当然,这完全取决于您的数据和插补方法。 CV 折叠处的性能差异很大,表明泄漏是一个问题。

© www.soinside.com 2019 - 2024. All rights reserved.