[PYTHON] Beachten Sie, dass der Standardwert des LogisticRegression-Solvers in lbfgs geändert wurde.

Einführung

Die logistische Regression der Scikit-Learn-Bibliothek (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) (LogisticRegression) ist in Version 0.22 standardmäßig "Solver". Geändert von liblinearzulbfgs`.

Beachten Sie, dass diese Änderung auch mit demselben Code zu unterschiedlichen Ausführungsergebnissen oder einer Fehlerausgabe führen kann.

Zum Beispiel ein solches Ereignis

Ich erhalte eine Fehlermeldung mit dem folgenden Code, der die L1-Normalisierung durchführt.

lr_l1 = LogisticRegression(C=C, penalty='l1').fit(X_train, y_train)

Das Folgende ist der Fehlerinhalt.

---------------------------------------------------------------------------
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.

Der Fehler ist, dass "lbfgs" in "Solver" nur "l2" oder "none" unterstützt.

Schreiben Sie "Solver", um den Fehler zu beheben

Beschreiben Sie wie folgt.

lr_l1 = LogisticRegression(C=C, penalty='l1', solver='liblinear').fit(X_train, y_train)

Ein bisschen mehr über die Ursache

Wie in [hier] angegeben (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html), wurde der Standardwert von "solver" in "LogisticRegression" durch das Update geändert. Es liegt daran.

Changed in version 0.22: The default solver changed from ‘liblinear’ to ‘lbfgs’ in 0.22.

Unter der Annahme, dass der Standardwert von "Solver" "liblinear" ist, scheint der Quellcode, der die Einstellung von "Solver" während der Durchführung der L1-Normalisierung auslässt, betroffen zu sein und einen Fehler auszulösen. ..

Im Fall von "Ich dachte, der Standardwert sei" liblinear "und führte ihn aus, wurde er mit" lbfgs "ausgeführt", da "Solver" weggelassen wurde, liegt das Ausgabeergebnis in der Vergangenheit, auch wenn es keinen Fehler verursacht. Es wird ein Ereignis, das sich von unterscheidet.

Solides Fazit

Es gibt Fälle, in denen sich der Vorgang aufgrund der Bibliotheksseite ändert oder nicht funktioniert. Überprüfen Sie daher unbedingt das Versions-Upgrade der Bibliothek, die Sie häufig verwenden.

Recommended Posts

Beachten Sie, dass der Standardwert des LogisticRegression-Solvers in lbfgs geändert wurde.
Bitte beachten Sie, dass sich der neueste Link von ius geändert hat
Beachten Sie, dass sich die Methode zum Veröffentlichen von Modulen in PyPI auf verschiedene Weise geändert hat.
Beachten Sie, dass sich die Spezifikationen von Pandas loc geändert haben.
Code, der bei AttributeError Standardwerte festlegt