You need to enable JavaScript to run this app. GridSearchCV结合LogisticRegression时如何为精确率设置zero_division参数
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 11:24:08