如何使用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
相关产品推荐
相关产品推荐

