The scikit-learn library's Logistic Regression (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) (LogisticRegression) defaults to solver in version 0.22. Changed from liblineartolbfgs`.
Note that due to this change, it is expected that the execution result will be different from the past or an error will be output even with the same code.
I get an error with the following code that does L1 normalization.
lr_l1 = LogisticRegression(C=C, penalty='l1').fit(X_train, y_train)
The following is the error content.
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~/devp/linear_model.py in
1 for C, marker in zip([0.001, 1, 100], ['o', '^', 'v']):
----> 2 lr_l1 = LogisticRegression(C=C, penalty='l1').fit(X_train, y_train)
3 print('Training accuracy of l1 logreg with C={:.f3}: {:.2f}'.format(C, lr_l1.score(X_train, y_train)))
4 print('Test accuracy of l1 logreg with C={:.f3}: {:.2f}'.format(C, lr_l1.score(X_test, y_test)))
5 plt.plot(lr_l1.coef_.T, marker, label='C={:.3f}'.format(C))
/usr/local/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py in fit(self, X, y, sample_weight)
1484 The SAGA solver supports both float64 and float32 bit arrays.
1485 """
-> 1486 solver = _check_solver(self.solver, self.penalty, self.dual)
1487
1488 if not isinstance(self.C, numbers.Number) or self.C < 0:
/usr/local/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py in _check_solver(solver, penalty, dual)
443 if solver not in ['liblinear', 'saga'] and penalty not in ('l2', 'none'):
444 raise ValueError("Solver %s supports only 'l2' or 'none' penalties, "
--> 445 "got %s penalty." % (solver, penalty))
446 if solver != 'liblinear' and dual:
447 raise ValueError("Solver %s supports only "
ValueError: Solver lbfgs supports only 'l2' or 'none' penalties, got l1 penalty.
The error is that lbfgs in the solver only supports l2 or none.
solver to resolve the errorDescribe as follows.
lr_l1 = LogisticRegression(C=C, penalty='l1', solver='liblinear').fit(X_train, y_train)
As stated in here, the default value of solver in LogisticRegression has been changed by the update. It's because of it.
Changed in version 0.22: The default solver changed from ‘liblinear’ to ‘lbfgs’ in 0.22.
As a result, assuming that the default value of solver is liblinear, the source code that omits the setting of solver while performing L1 normalization will be affected and an error will be thrown. ..
In addition, in the case of "I thought that the default value was liblinear and executed it, it was executed with lbfgs" because solver was omitted, the output result is in the past even if no error occurs. It becomes an event that is different from.
There are cases where "the operation changes or does not work due to the library side", so be sure to check the version upgrade of the library you use often.
Recommended Posts