[PYTHON] Notez que la valeur par défaut du solveur LogisticRegression est devenue lbfgs.

introduction

La régression logistique de la bibliothèque scikit-learn (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) (LogisticRegression) est par défaut solver dans la version 0.22. Changé de liblinearàlbfgs`.

Notez que cette modification peut entraîner des résultats d'exécution différents ou une sortie d'erreur même avec le même code.

Par exemple, un tel événement

J'obtiens une erreur avec le code suivant qui fait la normalisation L1.

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

Voici le contenu de l'erreur.

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

L'erreur est que «lbfgs» dans «solveur» ne prend en charge que «l2» ou «aucun».

Écrivez solveur pour résoudre l'erreur

Décrivez comme suit.

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

Un peu plus sur la cause

Comme indiqué dans ici, la valeur par défaut de solver dans LogisticRegression a été modifiée par la mise à jour. C'est à cause de ça.

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

En conséquence, en supposant que la valeur par défaut de «solveur» est «liblinear», il semble que le code source qui omet le paramètre de «solveur» lors de la normalisation L1 sera affecté et générera une erreur. ..

De plus, dans le cas de "Je pensais que la valeur par défaut était liblinear et je l'ai exécutée, elle a été exécutée avec lbfgs" parce que solveur a été omis, le résultat de sortie est dans le passé même s'il ne provoque pas d'erreur. Cela devient un événement différent de.

Conclusion solide

Dans certains cas, "l'opération change ou ne fonctionne pas en raison du côté bibliothèque", alors assurez-vous de vérifier la mise à jour de la version de la bibliothèque que vous utilisez souvent.

Recommended Posts

Notez que la valeur par défaut du solveur LogisticRegression est devenue lbfgs.
Veuillez noter que le dernier lien d'ius a changé
Notez que la méthode de publication des modules sur PyPI a changé de différentes manières.
Notez que les spécifications de Pandas loc ont changé.
Code qui définit les valeurs par défaut en cas d'AttributeError