web-dev-qa-db-fra.com

Erreur sklearn ValueError: l'entrée contient NaN, l'infini ou une valeur trop grande pour dtype ('float64')

J'utilise sklearn et j'ai un problème avec la propagation par affinité. J'ai construit une matrice d'entrée et je continue à avoir l'erreur suivante.

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

J'ai couru

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

J'ai essayé d'utiliser

mat[np.isfinite(mat) == True] = 0

supprimer les valeurs infinies mais cela ne fonctionnait pas non plus. Que puis-je faire pour me débarrasser des valeurs infinies de ma matrice, afin de pouvoir utiliser l'algorithme de propagation par affinité?

J'utilise anaconda et python 2.7.9.

91
Ethan Waldie

Cela peut se produire dans Scikit, et cela dépend de ce que vous faites. Je recommande de lire la documentation pour les fonctions que vous utilisez. Vous pouvez en utiliser un qui dépend par exemple votre matrice étant positive définie et ne remplissant pas ces critères.

EDIT: Comment pourrais-je manquer ça:

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

est évidemment faux. Droit serait:

np.any(np.isnan(mat))

et

np.all(np.isfinite(mat))

Vous voulez vérifier si l'un des éléments est NaN, et pas si la valeur de retour de la fonction any est un nombre ...

79
Marcus Müller

J'ai reçu le même message d'erreur lors de l'utilisation de sklearn avec pandas. Ma solution est de réinitialiser l'index de mon image de données df avant d'exécuter du code Sklearn:

df = df.reset_index()

J'ai rencontré ce problème plusieurs fois lorsque j'ai supprimé certaines entrées de mon df, telles que

df = df[df.label=='desired_one']
27
Jun Wang

Les dimensions de mon tableau d'entrée étaient asymétriques, car mon CSV d'entrée avait des espaces vides.

11
Ethan Waldie

C'est le chèque sur lequel il échoue:

Qui dit

def _assert_all_finite(X):
    """Like assert_all_finite, but only for ndarray."""
    X = np.asanyarray(X)
    # First try an O(n) time, O(1) space solution for the common case that
    # everything is finite; fall back to O(n) space np.isfinite to prevent
    # false positives from overflow in sum method.
    if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum())
            and not np.isfinite(X).all()):
        raise ValueError("Input contains NaN, infinity"
                         " or a value too large for %r." % X.dtype)

Assurez-vous donc que vous avez des valeurs non NaN dans votre entrée. Et toutes ces valeurs sont en réalité des valeurs flottantes. Aucune des valeurs ne devrait être Inf non plus.

8
tuxdna

Voici ma fonction (basée sur this ) pour nettoyer le jeu de données de nan, Inf et des cellules manquantes (pour les jeux de données asymétriques):

import pandas as pd

def clean_dataset(df):
    assert isinstance(df, pd.DataFrame), "df needs to be a pd.DataFrame"
    df.dropna(inplace=True)
    indices_to_keep = ~df.isin([np.nan, np.inf, -np.inf]).any(1)
    return df[indices_to_keep].astype(np.float64)
7
Boern

Avec cette version de python 3:

/opt/anaconda3/bin/python --version
Python 3.6.0 :: Anaconda 4.3.0 (64-bit)

En regardant les détails de l'erreur, j'ai trouvé les lignes de codes à l'origine de l'échec:

/opt/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in _assert_all_finite(X)
     56             and not np.isfinite(X).all()):
     57         raise ValueError("Input contains NaN, infinity"
---> 58                          " or a value too large for %r." % X.dtype)
     59 
     60 

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

A partir de cela, j'ai pu extraire la bonne façon de tester ce qui se passait avec mes données en utilisant le même test qui échoue, donné par le message d'erreur: np.isfinite(X)

Puis, avec une boucle rapide et sale, j'ai pu constater que mes données contenaient bien nans:

print(p[:,0].shape)
index = 0
for i in p[:,0]:
    if not np.isfinite(i):
        print(index, i)
    index +=1

(367340,)
4454 nan
6940 nan
10868 nan
12753 nan
14855 nan
15678 nan
24954 nan
30251 nan
31108 nan
51455 nan
59055 nan
...

Il ne me reste plus qu'à supprimer les valeurs de ces index.

4
Raphvanns

J'ai eu l'erreur après avoir essayé de sélectionner un sous-ensemble de lignes:

df = df.reindex(index=my_index)

Il s'avère que my_index contenait des valeurs non contenues dans df.index, de sorte que la fonction de réindexation insérait de nouvelles lignes et les remplissait avec nan.

3
Elias Strehle

J'ai eu la même erreur, et dans mon cas, X et y étaient des trames de données, je devais donc d'abord les convertir en matrices:

X = X.as_matrix().astype(np.float)
y = y.as_matrix().astype(np.float)
2
tekumara

j'ai eu la même erreur. cela fonctionnait avec df.fillna(-99999, inplace=True) avant tout remplacement, substitution, etc.

1
Cohen

essayer

mat.sum()

Si la somme de vos données est infinie (supérieure à la valeur flottante maximale qui est 3.402823e + 38), vous obtiendrez cette erreur.

voyez la fonction _assert_all_finite dans validation.py à partir du code source de scikit:

if is_float and np.isfinite(X.sum()):
    pass
Elif is_float:
    msg_err = "Input contains {} or a value too large for {!r}."
    if (allow_nan and np.isinf(X).any() or
            not allow_nan and not np.isfinite(X).all()):
        type_err = 'infinity' if allow_nan else 'NaN, infinity'
        # print(X.sum())
        raise ValueError(msg_err.format(type_err, X.dtype))
0
Rick Hill

Dans mon cas, le problème était que beaucoup de fonctions scikit retournent des tableaux numpy, qui sont dépourvus de pandas index. Il y avait donc une incompatibilité d'index lorsque j'ai utilisé ces tableaux numpy pour créer de nouveaux DataFrames, puis j'ai essayé de les mélanger avec les données d'origine.

0
luca