web-dev-qa-db-fra.com

erreur de désapprobation dans sklearn à propos du tableau vide sans aucun tableau vide dans mon code

Je ne fais que jouer à l'encodage et au décodage, mais j'obtiens cette erreur de la part de sklearn:

Avertissement (du module avertissements): Fichier "C:\Python36\lib\site-packages\sklearn\preprocessing\label.py", ligne 151 si diff: DeprecationWarning: la valeur de vérité d'un tableau vide est ambiguë. Renvoyer False, mais à l'avenir, cela entraînera une erreur. Utilisez array.size > 0 pour vérifier qu'un tableau n'est pas vide.

Voici le code complet, vous pouvez l'exécuter vous-même en python 3+

Ma question est la suivante: pourquoi dit-on que j'utilise un tableau vide, ce qui est clairement mon code, merci d'avoir pris le temps de répondre à ma question.

### label encoding ###

import numpy as np
from sklearn import preprocessing

# Sample input labels
input_labels = ["red", "black", "red", "green",\
                "black", "yellow", "white"]

# Create label encoder abd fit the label
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

# Print the mapping
print("\nLabel mapping:")
for i, item in enumerate(encoder.classes_):
    print(item, "-->", i)

# Encode a set of labels using encoder
test_labels = ["green", "red", "black"]
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))

# Decode a set of values using the encoder
encoded_values = [3, 0, 4, 1]
decoded_list = encoder.inverse_transform(encoded_values)
print("\nEncoded values =", encoded_values)
print("Decoded labels=", list(decoded_list))
13
Tissuebox

TLDR: Vous pouvez ignorer l'avertissement. Cela est dû au fait que Sklearn fait quelque chose en interne qui n’est pas tout à fait idéal.


L’avertissement est en fait causé par numpy, qui test de vérité déconseillé sur les tableaux vides :

En résumé, tester la vérité sur des tableaux vides est dangereux, trompeur et nullement utile, et doit donc être déconseillé.

Cela signifie que vous n'êtes pas censé faire quelque chose comme if array: pour vérifier si array est vide. Cependant, sklearn le fait-il dans la version 0.19.1 :

    diff = np.setdiff1d(y, np.arange(len(self.classes_)))
    if diff:
        raise ValueError("y contains new labels: %s" % str(diff))

Parce que votre version de numpy est suffisamment récente, elle se plaint et émet un avertissement.

Le problème a été corrigé dans la branche principale actuelle de sklearn, je pense donc que le correctif sera inclus dans la prochaine version.

23
kazemakase

Après la mise à jour de numpy, l'avertissement a été effacé:

conda update numpy

Vous pouvez également le mettre à jour par pip ou autre chose.

0
Qinsi