首页 > 解决方案 > 如何使用 Python Sklearn 在逻辑回归中修复“惩罚项应该为正”?

问题描述

我正在尝试使用 Python 运行逻辑回归并循环几个 C。但是,我不断收到错误ValueError: Penalty term must be positive; 得到 (C=0.1)。这对我来说很奇怪,因为 0.1 是正数。我认为错误并不完全在 C 值上,但我不知道如何修复它。我试图查看这个问题ValueError: Penalty term must be positive但我不明白如何解决我的问题。

我很困惑,因为当试图绘制决策边界时,代码是有效的。

让我们看看我在说什么。以下代码有效:

for this_C, subplot in zip([0.1, 1, 100], subaxes):
    clf = LogisticRegression(C=this_C).fit(X_train, y_train)
    print('Accuracy of Logistic regression classifier on training set: {:.2f}'
          .format(clf.score(X_train, y_train)))
    print('Accuracy of Logistic regression classifier on test set: {:.2f}'
          .format(clf.score(X_test, y_test)))

但是,下面的代码不起作用,我收到错误提示

for this_C in zip([0.1, 1, 100]):
    clf = LogisticRegression(C=this_C).fit(X_train, y_train)
    print('Accuracy of Logistic regression classifier on training set: {:.2f}'
          .format(clf.score(X_train, y_train)))
    print('Accuracy of Logistic regression classifier on test set: {:.2f}'
          .format(clf.score(X_test, y_test)))

第二个代码有什么问题?为什么我收到错误ValueError: Penalty term must be positive; 得到 (C=0.1)

提前致谢。

标签: pythonscikit-learn

解决方案


错误的原因在于第二个版本的循环。

查看引发您遇到的错误的源代码,我们会看到:

if not isinstance(self.C, numbers.Number) or self.C < 0:
    raise ValueError("Penalty term must be positive; got (C=%r)"
        % self.C)

这基本上说如果self.C不是numbers.Number-object 或不是正整数,那么我们会得到这个错误。

如果我们看一下第二个循环的输出,那么我们可以更好地理解为什么上面的代码行给出了错误

>>> for this_C in zip([0.1, 1, 100]):
...     print(this_C)
...     print(type(this_C))
...
(0.1,)
<class 'tuple'>
(1,)
<class 'tuple'>
(100,)
<class 'tuple'>

所以,错误是因为它被赋予了tuple-object而不是numbers.Number-object。


推荐阅读