You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GridSearchCV如何为每个参数组合单独洗牌数据以避免过拟合

实现方案

Scikit-learn自带的GridSearchCV会预先生成所有交叉验证拆分,再复用给所有参数组合,本身不支持单参数组合独立洗牌的逻辑,你可以通过手动遍历参数网格的方式实现需求,具体实现如下:

核心实现代码

from sklearn.model_selection import ParameterGrid, ShuffleSplit
from sklearn.metrics import f1_score
import numpy as np

# 展开参数网格
param_grid_list = list(ParameterGrid({**FE_grid, **CA_grid}))
best_score = -1
best_params = None
all_results = []

for params in param_grid_list:
    # 每个参数组合单独生成新的ShuffleSplit,不固定random_state实现独立洗牌
    cv = ShuffleSplit(test_size=0.20, n_splits=5)
    fold_scores = []
    for train_idx, val_idx in cv.split(self.data_input, self.data_output):
        X_train, X_val = self.data_input[train_idx], self.data_input[val_idx]
        y_train, y_val = self.data_output[train_idx], self.data_output[val_idx]
        
        # 初始化pipeline并设置当前参数
        pipe = Pipeline(steps=[(self.FE, FE_algorithm), (self.CA, Class_algorithm)])
        pipe.set_params(**params)
        pipe.fit(X_train, y_train)
        y_pred = pipe.predict(X_val)
        fold_scores.append(f1_score(y_val, y_pred, average='macro'))
    
    # 计算当前参数组合的平均得分
    mean_score = np.mean(fold_scores)
    all_results.append({
        "params": params,
        "mean_f1": mean_score,
        "std_f1": np.std(fold_scores)
    })
    
    # 更新最优参数
    if mean_score > best_score:
        best_score = mean_score
        best_params = params

# 最终用最优参数训练全量数据
final_pipe = Pipeline(steps=[(self.FE, FE_algorithm), (self.CA, Class_algorithm)])
final_pipe.set_params(**best_params)
final_pipe.fit(self.data_input, self.data_output)

优化建议

  • 如果需要结果可复现,可以为每个参数组合生成唯一的随机种子,比如将参数组合转为字符串后取哈希值作为random_state的输入,避免随机波动导致结果不可复现
  • 该实现相比原生GridSearchCV计算量无额外增加,只是调整了拆分的生成逻辑,同时因为每个参数组合使用独立的验证集,能有效避免参数适配固定验证集导致的过拟合问题
  • 如果你需要保留GridSearchCV的其他功能(比如并行计算),可以继承GridSearchCV重写fit方法,在每次评估参数组合前重新生成cv拆分即可,手动实现的灵活度更高。

内容的提问来源于stack exchange,提问作者boigadendro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 01:42:04