如何在GridSearchCV中传入多个cv折数值实现多折数交叉验证调参
问题解决:GridSearchCV传入多个cv折数的实现方法
报错原因
GridSearchCV的cv参数本身不支持直接传入多个折数组成的列表,它仅支持三种输入格式:
- 单个正整数:代表K折交叉验证的K值
- 已定义的交叉验证迭代器(比如
KFold实例) - 元素为
(训练集索引, 测试集索引)的可迭代对象
你直接传入[3,5,6,7,10]时,程序会尝试将列表内的每个整数拆分为训练、测试索引对,自然触发TypeError: cannot unpack non-iterable int object报错。
实现方案
通过外层遍历所有待测试的cv值,每次执行一次GridSearchCV,将不同cv对应的结果存储后对比即可,是最直接高效的实现方式。
代码示例
# 定义待测试的cv折数列表 cv_list = [3, 5, 6, 7, 10] # 定义字典存储不同cv下的运行结果 cv_result = {} for cv_val in cv_list: # 每次用当前cv值初始化GridSearchCV,error_score=0用于跳过无效参数组合的报错 logmodel = GridSearchCV(LogisticRegression(), parameters, cv=cv_val, refit=True, error_score=0) logmodel.fit(s_scaled_X_train, y_train) # 存储当前cv对应的最优参数、验证得分、测试集得分、训练好的模型 cv_result[cv_val] = { "best_params": logmodel.best_params_, "best_cv_score": logmodel.best_score_, "test_score": logmodel.score(s_scaled_X_test, y_test), "trained_model": logmodel } # 遍历输出不同折数下的结果对比 for k, res in cv_result.items(): print(f"cv={k}时,最优验证得分:{res['best_cv_score']:.4f},测试集得分:{res['test_score']:.4f},最优参数:{res['best_params']}")
额外优化提示
你当前的参数网格存在大量无效组合:l1惩罚项仅支持solver=liblinear和solver=saga,其余solver仅支持l2惩罚,直接运行会产生大量警告且浪费算力,建议调整参数网格为分组形式减少无效计算。
内容的提问来源于stack exchange,提问作者SAV
相关产品推荐
相关产品推荐

