GridSearchCV 如何实现单组参数运行完成后即时写入CSV而非统一导出
实现GridSearchCV每组参数运行完成后实时写入CSV的可行方案
方案1:使用GridSearchCV内置回调(适用于scikit-learn 0.24及以上版本)
从scikit-learn 0.24版本开始,GridSearchCV新增了callback参数,支持在每一组超参数完成交叉验证评估后触发自定义逻辑,是最简便的实现方式。
import csv from sklearn.model_selection import GridSearchCV from sklearn.base import BaseEstimator from sklearn.utils._user_interface import _Callback # 自定义实时写CSV的回调类 class RealtimeCsvWriter(_Callback): def __init__(self, csv_path: str): self.csv_path = csv_path self._header_written = False def on_evaluate(self, estimator: BaseEstimator, params: dict, score: float, **kwargs): # 组装要写入的行数据,可按需添加更多字段比如得分标准差、运行耗时等 row = {**params, "mean_score": score} # 追加写入CSV with open(self.csv_path, mode="a", encoding="utf-8", newline="") as f: writer = csv.DictWriter(f, fieldnames=row.keys()) if not self._header_written: writer.writeheader() self._header_written = True writer.writerow(row)
使用时直接在GridSearchCV初始化阶段传入回调即可:
grid_search = GridSearchCV( estimator=你的模型实例, param_grid=你的超参数网格, cv=5, callbacks=[RealtimeCsvWriter(csv_path="./grid_search_results.csv")] ) grid_search.fit(特征集X, 标签集y)
方案2:手动遍历参数网格(兼容所有scikit-learn版本)
如果你的scikit-learn版本较低不支持回调参数,可以手动展开超参数网格,逐组执行交叉验证,跑完直接写入结果,灵活性更高。
import csv from sklearn.model_selection import ParameterGrid, cross_val_score # 定义超参数网格 param_grid = {"n_estimators": [100, 200], "max_depth": [3, 5, 7]} csv_path = "./grid_search_results.csv" header_written = False # 逐组遍历参数 for params in ParameterGrid(param_grid): # 初始化模型 model = 你的模型类(**params) # 执行交叉验证 scores = cross_val_score(model, 特征集X, 标签集y, cv=5) mean_score = scores.mean() std_score = scores.std() # 组装行数据 row = {**params, "mean_score": mean_score, "std_score": std_score} # 写入CSV with open(csv_path, mode="a", encoding="utf-8", newline="") as f: writer = csv.DictWriter(f, fieldnames=row.keys()) if not header_written: writer.writeheader() header_written = True writer.writerow(row)
注意事项
- 写入时使用
newline=""参数避免Windows系统下CSV出现多余空行 - 如果需要记录更多指标,可以在组装行数据时自行添加对应字段
- 多进程运行GridSearchCV时,需要给文件写入加锁避免写入冲突,可引入
threading.Lock处理并发写入问题
内容的提问来源于stack exchange,提问作者Teodorico Levoff
相关产品推荐
相关产品推荐

