sklearn-fout ValueError: invoer bevat NaN, oneindig of een waarde die te groot is voor dtype(‘float64’)

Ik gebruik sklearn en heb een probleem met de affiniteitspropagatie. Ik heb een invoermatrix gebouwd en ik krijg steeds de volgende foutmelding.

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

Ik heb gelopen

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

Ik heb geprobeerd met

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

om de oneindige waarden te verwijderen, maar ook dit werkte niet.
Wat kan ik doen om de oneindige waarden in mijn matrix kwijt te raken, zodat ik het algoritme voor affiniteitspropagatie kan gebruiken?

Ik gebruik anaconda en python 2.7.9.


Antwoord 1, autoriteit 100%

Dit kan gebeuren binnen scikit, en het hangt af van wat je doet. Ik raad aan om de documentatie te lezen voor de functies die je gebruikt. Mogelijk gebruikt u er een die afhangt van b.v. op uw matrix die positief definitief is en niet aan die criteria voldoet.

EDIT: hoe kan ik dat missen:

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

is duidelijk verkeerd. Rechts zou zijn:

np.any(np.isnan(mat))

en

np.all(np.isfinite(mat))

U wilt controleren of een van de elementen NaN is, en niet of de geretourneerde waarde van de functie any een getal is…


Antwoord 2, autoriteit 40%

Ik kreeg dezelfde foutmelding bij het gebruik van sklearn met panda’s. Mijn oplossing is om de index van mijn dataframe df opnieuw in te stellen voordat een sklearn-code wordt uitgevoerd:

df = df.reset_index()

Ik ben dit probleem vaak tegengekomen toen ik enkele vermeldingen in mijn df verwijderde, zoals

df = df[df.label=='desired_one']

Antwoord 3, autoriteit 23%

Dit is mijn functie (gebaseerd op dit) om de dataset van nan, Inf en ontbrekende cellen op te schonen (voor scheve datasets):

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)

Antwoord 4, autoriteit 11%

Dit is de controle waarbij het niet lukt:

Wat zegt

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)

Zorg er dus voor dat je niet-NaN-waarden in je invoer hebt. En al die waarden zijn eigenlijk float-waarden. Geen van de waarden mag ook Inf zijn.


Antwoord 5, autoriteit 10%

De afmetingen van mijn invoerarray waren scheef, omdat mijn invoer-csv lege spaties had.


Antwoord 6, autoriteit 7%

In de meeste gevallen lost het verwijderen van oneindige en null-waarden dit probleem op.

verwijder oneindige waarden.

df.replace([np.inf, -np.inf], np.nan, inplace=True)

verwijder null-waarden zoals u dat wilt, specifieke waarde zoals 999, mean, of maak uw eigen functie om ontbrekende waarden toe te rekenen

df.fillna(999, inplace=True)

Antwoord 7, autoriteit 5%

Met deze versie van python 3:

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

Toen ik naar de details van de fout keek, vond ik de coderegels die de fout veroorzaakten:

/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').

Hieruit kon ik de juiste manier halen om te testen wat er met mijn gegevens aan de hand was met dezelfde test die mislukt door de foutmelding: np.isfinite(X)

Toen kon ik met een snelle en vuile lus ontdekken dat mijn gegevens inderdaad nans bevatten:

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

Nu hoef ik alleen nog maar de waarden bij deze indexen te verwijderen.


Antwoord 8, autoriteit 3%

Ik kreeg de fout nadat ik probeerde een subset van rijen te selecteren:

df = df.reindex(index=my_index)

Het blijkt dat my_index waarden bevatte die niet in df.index stonden, dus de herindexfunctie heeft enkele nieuwe rijen ingevoegd en deze gevuld met nan code>.


Antwoord 9, autoriteit 2%

Ik had dezelfde fout, en in mijn geval waren X en y dataframes, dus ik moest ze eerst naar matrices converteren:

X = X.values.astype(np.float)
y = y.values.astype(np.float)

Bewerken: de oorspronkelijk voorgestelde X.as_matrix() is Verouderd


Antwoord 10, autoriteit 2%

Verwijder alle oneindige waarden:

(en vervang door min of max voor die kolom)

import numpy as np
# generate example matrix
matrix = np.random.rand(5,5)
matrix[0,:] = np.inf
matrix[2,:] = -np.inf
>>> matrix
array([[       inf,        inf,        inf,        inf,        inf],
       [0.87362809, 0.28321499, 0.7427659 , 0.37570528, 0.35783064],
       [      -inf,       -inf,       -inf,       -inf,       -inf],
       [0.72877665, 0.06580068, 0.95222639, 0.00833664, 0.68779902],
       [0.90272002, 0.37357483, 0.92952479, 0.072105  , 0.20837798]])
# find min and max values for each column, ignoring nan, -inf, and inf
mins = [np.nanmin(matrix[:, i][matrix[:, i] != -np.inf]) for i in range(matrix.shape[1])]
maxs = [np.nanmax(matrix[:, i][matrix[:, i] != np.inf]) for i in range(matrix.shape[1])]
# go through matrix one column at a time and replace  + and -infinity 
# with the max or min for that column
for i in range(matrix.shape[1]):
    matrix[:, i][matrix[:, i] == -np.inf] = mins[i]
    matrix[:, i][matrix[:, i] == np.inf] = maxs[i]
>>> matrix
array([[0.90272002, 0.37357483, 0.95222639, 0.37570528, 0.68779902],
       [0.87362809, 0.28321499, 0.7427659 , 0.37570528, 0.35783064],
       [0.72877665, 0.06580068, 0.7427659 , 0.00833664, 0.20837798],
       [0.72877665, 0.06580068, 0.95222639, 0.00833664, 0.68779902],
       [0.90272002, 0.37357483, 0.92952479, 0.072105  , 0.20837798]])

Antwoord 11, autoriteit 2%

Geen van de antwoorden hier werkte voor mij. Dit was wat werkte.

Test_y = np.nan_to_num(Test_y)

Het vervangt de oneindigheidswaarden door hoge eindige waarden en de nan-waarden door getallen


Antwoord 12

ik kreeg dezelfde fout. het werkte met df.fillna(-99999, inplace=True) voordat vervanging, vervanging enz.


Antwoord 13

In mijn geval was het probleem dat veel scikit-functies numpy-arrays retourneren, die geen panda-index bevatten. Er was dus een mismatch in de index toen ik die numpy-arrays gebruikte om nieuwe DataFrames te bouwen en vervolgens probeerde ik ze te mixen met de originele gegevens.


Antwoord 14

Ik zou graag een oplossing voor numpy willen voorstellen die goed voor mij werkte. De lijn

from numpy import inf
inputArray[inputArray == inf] = np.finfo(np.float64).max

vervangt alle oneindige waarden van een numpy-array met het maximale float64-getal.


Antwoord 15

dataset = dataset.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

Dit werkte voor mij


Antwoord 16

probeer

mat.sum()

Als de som van uw gegevens oneindig is (groter dan de maximale float-waarde die 3.402823e+38 is), krijgt u die fout.

zie de _asset_all_finite functie in validation.py van de scikit-broncode:

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

12 − 5 =

Other episodes