我有一个很大的数据集,我已将其拆分为:
在每个集合上,我都执行了缺失值插补和特征选择(在训练集上进行训练,并复制到验证和测试集中)以避免数据泄漏。
现在,我想用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)
我理解你的问题,但我没有明确的答案。然而,像您建议的那样重复使用相同的验证集也是不可取的,因为您有可能(过度)拟合数据的特定部分的超参数。
您可以预先指定折叠并根据其他训练折叠来估算验证折叠。您也可以接受,由于一两个观察结果最终出现在验证折叠中,因此存在很小的泄漏可能性。当然,这完全取决于您的数据和插补方法。 CV 折叠处的性能差异很大,表明泄漏是一个问题。