web-dev-qa-db-fra.com

sklearn DeprecationWarning value value of an array

Exécution d'un exemple rasa_core à partir des documents avec

› python3 -m rasa_core.run -d models/dialogue -u models/nlu/default/current

et obtenez cette sortie d'erreur après chaque message dans la boîte de dialogue:

.../sklearn/...: DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.

C'est un problème avec numpy qui a été corrigé mais n'a pas été publié dans la dernière version: https://github.com/scikit-learn/scikit-learn/issues/10449

Ce qui suit n'a pas fonctionné pour désactiver temporairement l'avertissement:

  1. Ajouter -W ignore

python3 -W ignore -m rasa_core.run -d models/dialogue -u models/nlu/default/current

  1. warnings.simplefilter

python3

>>> warnings.simplefilter('ignore', DeprecationWarning)
>>> exit()

python3 -m rasa_core.run -d models/dialogue -u models/nlu/default/current

15
rojobuffalo

Cet avertissement est provoqué par numpy qui a déprécié le vérification de la valeur de vérité sur un tableau vide

La justification de ce changement est

Il est impossible de tirer parti du fait que les tableaux vides sont faux, car un tableau peut être faux pour d'autres raisons.

Vérifiez l'exemple suivant:

>>> import numpy as np
>>> bool(np.array([]))
False
>>> # but this is not a good way to test for emptiness, because...
>>> bool(np.array([0]))
False

Solution

Selon problème 10449 sur la bibliothèque scikit-learn, cela a été corrigé dans la branche principale de la bibliothèque. Cependant, cela sera disponible vers août 2018, donc une alternative possible est d'utiliser une version moindre de la bibliothèque numpy qui n'a pas ce problème, c'est-à-dire 1.13.3 puisque scikit-library par défaut ferait référence à la dernière version de numpy (qui est 1.14.2 à le temps d'écrire cette réponse)

Sudo pip install numpy==1.13.3

ou avec pip3 comme suit

Sudo pip3 install numpy==1.13.3

Ignorer les avertissements

Dans le cas où nous voulons utiliser la dernière version de la bibliothèque (numpy dans ce cas) qui donne l'avertissement de dépréciation et voulons simplement faire taire l'avertissement de dépréciation, nous pouvons le faire en utilisant filterwarnings méthode de python - Avertissements module

L'exemple suivant ci-dessous produirait l'avertissement de dépréciation mentionné dans la question ci-dessus:

from sklearn import preprocessing

if __name__ == '__main__':
    le = preprocessing.LabelEncoder()
    le.fit([1, 2, 2, 6])
    le.transform([1, 1, 2, 6])
    le.inverse_transform([0, 0, 1, 2])

produit

/usr/local/lib/python2.7/dist-packages/sklearn/preprocessing/label.py:151: DeprecationWarning: la valeur de vérité d'un tableau vide est ambiguë. Renvoyer False, mais à l'avenir, cela entraînera une erreur. Utilisation array.size > 0 pour vérifier qu'un tableau n'est pas vide.

Et pour en prendre soin, ajoutez des avertissements de filtre pour DeprecationWarning

from sklearn import preprocessing
import warnings

if __name__ == '__main__':
    warnings.filterwarnings(action='ignore', category=DeprecationWarning)
    le = preprocessing.LabelEncoder()
    le.fit([1, 2, 2, 6])
    le.transform([1, 1, 2, 6])
    le.inverse_transform([0, 0, 1, 2])

Dans le cas où il y a plusieurs modules qui donnent un avertissement et que nous voulons un avertissement sélectivement silencieux, utilisez l'attribut module . par exemple. à l'avertissement de dépréciation silencieux du module d'apprentissage de scikit

warnings.filterwarnings(module='sklearn*', action='ignore', category=DeprecationWarning)
32
GauravLuthra