在使用Python Sklearn的逻辑回归中,如何修正“惩罚项应为正”?

时间:2020-01-18 21:37:05

标签: python scikit-learn

我正在尝试使用Python运行逻辑回归并遍历多个C。 但是,我不断收到错误 ValueError:惩罚期限必须为正。得到了(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:惩罚期限必须为正;得到了(C = 0.1)

谢谢。

1 个答案:

答案 0 :(得分:1)

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

查看它在哪里引发错误的源代码,我们会看到:

bookingRes.snapshotChanges().subscribe(res => {
  this.Bookings = [];
  res.forEach(item => {
    let a = item.payload.toJSON();
    a['$key'] = item.key;
    this.Bookings.push(a as Appointment);
  })
})

这基本上表明,如果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

因此,错误是因为给了它一个>>> 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对象。