【发布时间】:2026-02-09 19:55:01
【问题描述】:
我正在尝试使用 LogisticRegression 估计器运行 GridSearchCV 并记录模型准确度、精度、召回率、f1 指标。
但是,我在精度指标上收到以下错误:
Precision is ill-defined and being set to 0.0 due to no predicted samples.
Use `zero_division` parameter to control this behavior
我理解为什么会出现错误,因为在 Kfold 拆分中没有输出值等于 1 的预测。但是我不明白如何在 GridSearchCV(logistic_reg 变量)中将“zero_divison”具体设置为 1。
原始代码
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", "precision", "recall", "f1"], cv=StratifiedKFold(n_splits=10), refit="accuracy")
logistic_reg_X_train = self.X_train.copy()
logistic_reg_X_train.drop(self.columns_removed, axis=1, inplace=True)
logistic_reg.fit(logistic_reg_X_train, self.y_train)
logistic_reg_results = pd.DataFrame(logistic_reg.cv_results_)
我尝试将“precision”更改为precision_score(zero_division=1),但这给了我另一个错误 (missing 2 required positional arguments: 'y_true' and 'y_pred')。我再次理解这一点,但在应用 fit 方法之前未定义 2 个缺失的参数。
如何将1zero_division 参数指定为精度分数指标?
编辑
我不明白的是,我在我的 train_test_split 方法中对 y 数据进行了分层,并在 GridSearchCV 中使用了 StratifedKFold。我对此的理解是,训练/测试数据将具有相同的 y 值拆分比例,并且在交叉验证期间也应该发生同样的情况。这意味着在 gridsearchcv 样本中,数据应具有 0 和 1 的 y 值,因此精度不能等于 0(模型将能够计算 TP 和 FP,因为样本测试数据包含 y 等于 1 的样本)。我不知道从这里去哪里。
【问题讨论】:
-
This answer 表示你或许可以使用
make_scorer函数来解决这个问题 -
感谢您的评论。我不明白的是,我在我的 train_test_split 方法中对 y 数据进行了分层,并在 GridSearchCV 中使用了 StratifedKFold。我对此的理解是,训练/测试数据将具有相同的 y 分类值拆分比例,并且在交叉验证期间也应该发生相同的情况。这意味着在 gridsearchcv 样本中,数据应具有 0 和 1 的 y 值,因此精度不应等于 0(模型将能够计算 TP 和 FP)。你对此有什么想法吗?
-
可能依赖于底层数据。例如,如果您的正类比例为 10%,并且其中一个折叠有 9 行,那么它可能不包含任何正样本。您可以通过从
kfold对象中解压缩索引来查看实际值是什么 -
这不是我的数据的情况,因为我有 7621 个 y 值等于 0 和 1607 个 y 值等于 1。训练/测试数据在 train_test_splt 方法中正确分层。我在检查 gridsearchcv 方法时遇到了困难。
标签: python scikit-learn precision logistic-regression gridsearchcv