GridSearchCV结合LogisticRegression时如何为精确率设置zero_division参数
自定义precision评分器设置
zero_division参数的实现 报错原因
直接在scoring参数中写入precision_score(zero_division=1)触发缺参报错,是因为GridSearchCV的scoring参数要求传入可调用的评分接口,直接写带参数的函数会被立刻执行,而此时还没有传入模型预测结果、真实标签这两个必填参数。
实现步骤
- 引入sklearn的评分器包装工具
make_scorer,将带自定义参数的precision_score包装为符合GridSearchCV调用规范的评分对象:from sklearn.metrics import make_scorer, precision_score # 自定义带zero_division参数的precision评分器 custom_precision = make_scorer(precision_score, zero_division=1) - 将原scoring列表中的字符串
"precision"替换为上述自定义的custom_precision变量即可,修改后的GridSearchCV代码参考:logistic_reg = GridSearchCV( estimator=LogisticRegression(penalty="l1", random_state=42, max_iter=10000), param_grid={ "C": [1e-4, 5e-4, 1e-3, 5e-3, 1e-2, 5e-2, 1e-1, 5e-1, 1, 5, 10, 20], "solver": ["liblinear", "saga"] }, scoring=["accuracy", custom_precision, "recall", "f1"], cv=StratifiedKFold(n_splits=10), refit="accuracy" ) - 若需要为recall、f1等其他指标也设置
zero_division规则,可使用同样的make_scorer方法包装对应评分函数。
分层拆分下仍触发precision未定义的问题解析
分层拆分的逻辑边界
StratifiedKFold的分层机制,仅保证每个折的测试集中真实y值的类别占比与全量训练集一致,完全不约束模型的输出预测结果。
报错的本质
该报错与测试集是否存在真实正样本无关,触发条件为:模型在某一折的验证环节,将所有样本全部预测为负类(y=0),此时所有预测结果中没有正类输出,计算precision时分母(预测为正的样本总数)为0,才会触发指标未定义的提示。
当前参数网格下的常见触发场景
你设置的LogisticRegression参数搜索范围,非常容易出现这类情况:
- 参数网格中包含1e-4、5e-4这类极小的C值,对应极强的L1正则化惩罚,会将所有特征的系数压缩到接近0的水平,模型输出的预测概率会整体趋近于0,在默认0.5的分类阈值下,就会将所有样本预测为负类,自然没有正类预测结果。
- 这类极端正则化的参数组合属于搜索过程中会被排除的劣解,不需要额外特殊处理,仅通过
zero_division参数消除警告干扰即可。
快速排查方法
- 导出
cv_results后可快速定位触发该报错的参数组合,基本集中在C值极小、正则化过强的分组下,不会影响最优参数的筛选结果。
内容的提问来源于stack exchange,提问作者tb08
相关产品推荐
相关产品推荐

