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.
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 ...
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']
Les dimensions de mon tableau d'entrée étaient asymétriques, car mon CSV d'entrée avait des espaces vides.
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.
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)
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.
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
.
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)
j'ai eu la même erreur. cela fonctionnait avec df.fillna(-99999, inplace=True)
avant tout remplacement, substitution, etc.
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))
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.