sklearn error ValueError: Wejście zawiera NaN, nieskończoność lub wartość zbyt dużą dla dtype ('float64')

131

Używam sklearn i mam problem z propagacją powinowactwa. Zbudowałem macierz wejściową i ciągle otrzymuję następujący błąd.

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

Pobiegłem

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

Próbowałem użyć

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

aby usunąć nieskończone wartości, ale to też nie zadziałało. Co mogę zrobić, aby pozbyć się nieskończonych wartości w mojej macierzy, aby móc korzystać z algorytmu propagacji powinowactwa?

Używam Anacondy i Pythona 2.7.9.

Ethan Waldie
źródło
3
Głosuję za zamknięciem, ponieważ sam autor mówi, że jego dane są nieważne i choć wszystko na to wskazywało, nie sprawdził poprawności - dane odpowiadają literówce, co jest powodem zamykającym.
Marcus Müller
11
Miałem ten sam problem z moim zbiorem danych. Ostatecznie: błąd danych, a nie błąd związany z nauką scikit. Większość poniższych odpowiedzi jest pomocna, ale wprowadza w błąd. Sprawdź, sprawdź, sprawdź swoje dane, upewnij się, że po konwersji na float64nie są one skończone i nie nan. Komunikat o błędzie jest trafny - jest to prawie na pewno problem dla każdego, kto się tutaj znajdzie.
Owen
1
Dla rekordu i +1 dla @Owen, sprawdź swoje dane wejściowe i upewnij się, że nie ma żadnych brakujących wartości w żadnym wierszu lub siatce. Możesz użyć klasy Imputer, aby uniknąć tego problemu.
abautista

Odpowiedzi:

104

Może się to zdarzyć w scikit i to zależy od tego, co robisz. Zalecam przeczytanie dokumentacji funkcji, z których korzystasz. Być może używasz takiego, który zależy np. Od tego, czy twoja macierz jest określona pozytywnie i nie spełnia tych kryteriów.

EDYCJA : Jak mogłem tego przegapić:

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

jest oczywiście błędny. Racja byłaby:

np.any(np.isnan(mat))

i

np.all(np.isfinite(mat))

Chcesz sprawdzić, czy którykolwiek z elementów ma wartość NaN, a nie, czy wartość zwracana przez anyfunkcję jest liczbą ...

Marcus Müller
źródło
4
Dokumenty nie wspominają nic o tym błędzie Potrzebuję sposobu na pozbycie się nieskończonych wartości z mojej tablicy nupy
Ethan Waldie
3
Jak powiedziałem: być może nie ma ich w twojej tablicy wejściowej. Mogą pojawić się w matematyce, która zachodzi między wejściem a magicznym wyjściem. Chodzi o to, że cała ta matematyka zależy od pewnych warunków wejściowych. Musisz uważnie przeczytać dokumenty, aby dowiedzieć się, czy twoje dane wejściowe spełniają te warunki.
Marcus Müller,
1
@ MarcusMüller, czy mógłbyś wskazać mi lokalizację tego dokumentu, w której określają wymagania matrycy wejściowej? Nie mogę znaleźć „dokumentów”, do których się odnosisz. Dziękuję :)
user2253546
39

Mam ten sam komunikat o błędzie podczas korzystania sklearn z pand . Moim rozwiązaniem jest zresetowanie indeksu mojej ramki danych dfprzed uruchomieniem kodu sklearn:

df = df.reset_index()

Wielokrotnie napotkałem ten problem, usuwając niektóre wpisy w moim df, na przykład

df = df[df.label=='desired_one']
Jun Wang
źródło
1
Kocham Cię! To rzadki przypadek, kiedy znajduję właściwe rozwiązanie, mimo że nie wiem, co jest przyczyną błędu!
Alexandr Kapshuk,
Wykonując df.reset_index () doda "index" jako kolumnę w wynikowym pliku df. Co może nie być przydatne w każdym scenariuszu. Jeśli uruchomiono df.reset_index (drop = True), zwróci ten sam błąd.
smm
17

To jest moja funkcja (w oparciu o to ), aby wyczyścić zestaw danych nan, Inforaz brak komórki (na skośnych zbiorów danych):

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)
Boern
źródło
Dlaczego upuszczasz nan dwa razy? Pierwszy raz, a dropnanastępnie drugi raz przy upuszczaniu inf.
luca
Utracam część danych, kiedy używam tej funkcji do czyszczenia zestawu danych. Jakieś sugestie, dlaczego ???
hackerbuddy
2
To jedyna odpowiedź, która zadziałała. Wypróbowałem 20 innych odpowiedzi na SO, które nie działały. Myślę, że ten potrzebuje więcej głosów pozytywnych.
Contango
12

Wymiary mojej tablicy wejściowej były wypaczone, ponieważ mój wejściowy plik csv miał puste spacje.

Ethan Waldie
źródło
1
W przypadku pand właśnie użyłem dropna pandas.pydata.org/pandas-docs/stable/generated/…
FindOutIslamNow
10

Oto test, w którym się nie udaje:

Który mówi

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)

Więc upewnij się, że masz wartości inne niż NaN w swoim wejściu. Wszystkie te wartości są w rzeczywistości wartościami zmiennoprzecinkowymi. Żadna z wartości również nie powinna być Inf.

tuxdna
źródło
5

W tej wersji Pythona 3:

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

Patrząc na szczegóły błędu znalazłem linijki kodów powodujące awarię:

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

Z tego udało mi się wyodrębnić prawidłowy sposób sprawdzenia, co się dzieje z moimi danymi za pomocą tego samego testu, który kończy się niepowodzeniem w komunikacie o błędzie: np.isfinite(X)

Następnie dzięki szybkiej i brudnej pętli byłem w stanie stwierdzić, że moje dane rzeczywiście zawierają 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
...

Teraz wszystko, co muszę zrobić, to usunąć wartości z tych indeksów.

Raphvanns
źródło
4

Wystąpił błąd po próbie wybrania podzbioru wierszy:

df = df.reindex(index=my_index)

Okazuje się, że my_indexzawierał wartości, których nie było w df.index, więc funkcja reindex wstawiła kilka nowych wierszy i wypełniła je nan.

Elias Strehle
źródło
2

W większości przypadków pozbycie się wartości nieskończonych i zerowych rozwiązuje ten problem.

pozbyć się nieskończonych wartości.

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

pozbądź się wartości null tak, jak lubisz, konkretnej wartości, takiej jak 999, mean, lub utwórz własną funkcję, aby wstawić brakujące wartości

df.fillna(999, inplace=True)
Natheer Alabsi
źródło
2

Miałem ten sam błąd, aw moim przypadku X i y były ramkami danych, więc musiałem najpierw przekonwertować je na macierze:

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

Edycja: pierwotnie sugerowano X.as_matrix () jest Nieaktualne

tekumara
źródło
1

mam ten sam błąd. działał df.fillna(-99999, inplace=True)przed dokonaniem jakiejkolwiek wymiany, zamiany itp

Cohen
źródło
4
To jest brudna poprawka. Jest powód, dla którego twoja tablica zawiera nanwartości; powinieneś to znaleźć.
Elias Strehle
dane mogą zawierać nan, co daje możliwość zastąpienia ich danymi wartościami, które uzna za dopuszczalne
user2867432
0

W moim przypadku problem polegał na tym, że wiele funkcji scikit zwraca tablice numpy, które są pozbawione indeksu pand. Wystąpiła więc niezgodność indeksu, gdy użyłem tych tablic numpy do zbudowania nowych ramek DataFrames, a następnie próbowałem je wymieszać z oryginalnymi danymi.

luca
źródło
0

Usuń wszystkie nieskończone wartości:

(i zamień na min lub max dla tej kolumny)

# 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(log_train_arr.shape[1]):
    matrix[:, i][matrix[:, i] == -np.inf] = mins[i]
    matrix[:, i][matrix[:, i] == np.inf] = maxs[i]
Renel Chesak
źródło
-1

próbować

mat.sum()

Jeśli suma twoich danych jest nieskończona (większa niż maksymalna wartość zmiennoprzecinkowa, która wynosi 3.402823e + 38), otrzymasz ten błąd.

zobacz funkcję _assert_all_finite w validation.py z kodu źródłowego 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))
Rick Hill
źródło