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

如何使用GridSearchCV为字典中每个DataFrame获取最优参数?

问题原因

你只能拿到单组最优参数是因为两个代码逻辑问题:

  • 你在for循环外部只初始化了一个GridSearchCV实例,循环内反复调用同一个实例的fit()方法时,每次拟合生成的best_params_、best_score_等属性都会覆盖上一次的结果,循环跑完后实例里只留了最后一个DataFrame的搜索结果。
  • 代码存在变量名错误:你提前定义的结果字典叫gs_output,循环赋值时用了未声明的gs_results,运行时会直接报NameError。
修复方法

把Pipeline和GridSearchCV的初始化放到循环内部,每处理一个DataFrame就生成全新的搜索实例,拟合完成后立刻把当前实例的结果存到字典里,就不会出现结果覆盖的问题。
修复后的完整逻辑:

# 提前定义所有固定参数、预处理组件,不需要放到循环里重复初始化
regressor = RandomForestRegressor(random_state = None)
num_estimators = list(np.linspace(10, 100, num=5, endpoint=True).astype(int))
max_features = ["auto", "sqrt", "log2"]
min_samples_split = [2,4,8]
params = {
    'regressor__n_estimators': num_estimators,
    'regressor__max_features': max_features,
    'regressor__min_samples_split': min_samples_split,
    'regressor__bootstrap': [False]
}

num_columns = list(subset_features[2:])
num_transformer = Pipeline([('impute', IterativeImputer()),
                            ('scale', StandardScaler())])
column_transformer = ColumnTransformer([('num_pipeline', num_transformer, num_columns)])

# 初始化结果存储字典
gs_results = {}
best_params = {}

for df_id, df in dfs.items():
    print('starting id:', df_id)
    # 每个DataFrame单独初始化Pipeline和网格搜索实例
    pipe = Pipeline(steps=[("ct", column_transformer), ("reg", regressor)])
    gs = GridSearchCV(
        estimator=pipe, 
        param_grid=params, 
        cv=5, 
        n_jobs=-1,
        verbose=1, 
        scoring=scorer,
        refit=True
    )
    # 拟合当前DataFrame
    fitted_gs = gs.fit(df)
    # 分别存储完整搜索结果和对应最优参数
    gs_results[df_id] = fitted_gs
    best_params[df_id] = fitted_gs.best_params_
结果读取

代码运行完成后,best_params字典里会存5组参数,key和你原始dfs字典的key一一对应,直接按键取值就能拿到每个DataFrame对应的最优参数。如果需要获取每个数据集对应的最优交叉验证分数、最优模型,直接从gs_results[df_id]上读取best_score_、best_estimator_属性即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:06:23