逻辑回归GridSearchCV调参报错:求解器与惩罚项不兼容
解决逻辑回归param_grid参数不兼容的问题
报错核心是sklearn的LogisticRegression中,不同求解器(solver)支持的正则化惩罚项(penalty)有固定配对规则,你当前的param_grid把不兼容的组合放在了一起,比如lbfgs仅支持l2或none,无法搭配l1。
调整param_grid的关键是让solver和penalty的组合严格符合兼容规则,以下是两种实用调整方式:
方式1:拆分出单一兼容参数组
如果只测试某一类兼容的参数组合,直接定义对应配对:
# 测试仅支持l2/none的求解器 param_grid = { 'solver': ['lbfgs', 'newton-cg', 'sag'], 'penalty': ['l2', 'none'], 'C': [0.01, 0.1, 1, 10, 100] # 正则化强度,按需增减取值 }
如果要测试支持l1的求解器,单独配置对应参数:
# 测试支持l1的求解器 param_grid = { 'solver': ['liblinear', 'saga'], 'penalty': ['l1', 'l2'], 'C': [0.01, 0.1, 1, 10, 100] }
方式2:用字典列表实现多组兼容组合
如果想同时覆盖所有合法的solver+penalty组合,可以用字典列表让每组参数都是独立兼容的:
param_grid = [ { 'solver': ['lbfgs', 'newton-cg', 'sag'], 'penalty': ['l2', 'none'], 'C': [0.01, 0.1, 1, 10, 100] }, { 'solver': ['liblinear'], 'penalty': ['l1', 'l2'], 'C': [0.01, 0.1, 1, 10, 100] }, { 'solver': ['saga'], 'penalty': ['l1', 'l2', 'elasticnet'], 'C': [0.01, 0.1, 1, 10, 100], 'l1_ratio': [0.1, 0.5, 0.9] # 使用elasticnet时必须指定该参数 } ]
这样GridSearchCV遍历参数时,只会取每组内的合法组合,不会再触发参数不兼容的报错。
补充sklearn兼容规则(方便自主调整)
lbfgs、newton-cg、sag:仅支持l2、noneliblinear:支持l1、l2(唯一支持l1且适合小数据集的求解器)saga:支持l1、l2、elasticnet、none
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

