помилка sklearn ValueError: Вхід містить NaN, нескінченність або занадто велике значення для dtype ('float64')


127

Я використовую sklearn і маю проблеми з поширенням афінності. Я створив матрицю введення, і я продовжую отримувати наступну помилку.

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

Я бігав

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

Я спробував використовувати

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

щоб зняти нескінченні значення, але це також не вийшло. Що я можу зробити, щоб позбутися нескінченних значень у своїй матриці, щоб я міг використовувати алгоритм поширення спорідненості?

Я використовую анаконду та пітон 2.7.9.


3
Я голосую за те, щоб закрити це, оскільки сам автор каже, що його дані недійсні, і хоча все на це вказувало, він не перевіряв - дані, еквівалентні друкарській помилці, що є причиною закриття.
Маркус Мюллер

11
У мене була така сама проблема із моїм набором даних. У кінцевому рахунку: помилка даних, а не помилка у навчанні. Більшість відповідей нижче корисні, але оманливі. Перевірте перевірку перевірки ваших даних, переконайтеся, що при перетворенні на них float64вони є кінцевими та ні nan. Повідомлення про помилку влучне - це майже напевно питання для тих, хто опинився тут.
Оуен

1
Для запису та +1 для @Owen перевірте вхідні дані та переконайтеся, що у вас немає жодного пропущеного значення в жодному рядку чи сітці. Щоб уникнути цієї проблеми, ви можете використовувати клас Imputer.
абаутіста

Відповіді:


102

Це може статися всередині scikit, і це залежить від того, що ви робите. Рекомендую ознайомитися з документацією щодо функцій, які ви використовуєте. Ви можете використовувати такий, який залежить, наприклад, від того, що ваша матриця визначена позитивно і не відповідає цим критеріям.

EDIT : Як я міг пропустити це:

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

явно помиляється. Правильно було б:

np.any(np.isnan(mat))

і

np.all(np.isfinite(mat))

Ви хочете перевірити, чи будь-який елемент є NaN, а чи не є значенням повернення anyфункції число ...


4
Документи нічого не згадують про цю помилку. Мені потрібен спосіб позбутися нескінченних значень з мого матового масиву
Етан Уолді

3
Як я вже сказав: вони, можливо, не є у вашому вхідному масиві. Вони можуть виникати в математиці, що відбувається між входом і магічним виходом. Справа в тому, що вся ця математика залежить від певних умов введення. Ви повинні уважно прочитати документи, щоб з’ясувати, чи відповідає ваш вклад цим умовам.
Маркус Мюллер

1
@ MarcusMüller, чи можете ви вказати мені місце цього документа, де вони визначають вимоги вхідної матриці? Я не можу знайти «документи», про які ви посилаєтесь. Дякую :)
користувач2253546

39

Я отримав те саме повідомлення про помилку при використанні sklearn з пандами . Моє рішення - скинути індекс мого кадру даних dfперед запуском будь-якого sklearn коду:

df = df.reset_index()

З цією проблемою я стикався багато разів, коли видаляв деякі записи df, наприклад,

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

1
Я тебе люблю! Це рідкісний приклад, коли я знаходжу правильне рішення, незважаючи на те, що не знаю, в чому причина помилки!
Олександр Капшук

Зробивши df.reset_index (), він додасть "індекс" у вигляді стовпця в отриманий df. Що може бути корисним не для всіх сценаріїв. Якщо df.reset_index (drop = True) запустився, він видасть ту саму помилку.
smm

14

Це моя функція ( в залежності від цього ) , щоб очистити набір даних nan, Infі відсутність клітин (для перекошених наборів даних):

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)

Чому ти скидаєш няню два рази? Перший раз, dropnaпотім другий раз, коли падає інф.
Лука

Я втрачаю деякі дані, коли використовую цю функцію для очищення мого набору даних. Будь-які сугезії чому ???
hackerbuddy

2
Це єдина відповідь, яка спрацювала. Я спробував ще 20 відповідей на ТА, які не спрацювали. Я думаю, що цьому потрібно більше грошей.
Контанго


10

Це перевірка, на яку він не вдається:

Що говорить

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)

Тому переконайтеся, що у вашому введенні немає значень NaN. І всі ці значення насправді є плаваючими значеннями. Жодне зі значень також не повинно бути Inf.


5

З цією версією python 3:

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

Переглядаючи деталі помилки, я виявив рядки кодів, що спричиняють збій:

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

З цього моменту я міг отримати правильний спосіб перевірити, що відбувається з моїми даними, використовуючи той самий тест, який не дає повідомлення про помилку: np.isfinite(X)

Тоді за допомогою швидкої та брудної петлі я зміг виявити, що мої дані дійсно містять 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
...

Тепер все, що мені потрібно зробити, - це видалити значення з цих індексів.


4

У мене виникла помилка після спроби вибрати підмножину рядків:

df = df.reindex(index=my_index)

Виявляється, що my_indexмістили значення, які не містилися в df.index, тому функція reindex вставила кілька нових рядків і заповнила їх nan.


2

У більшості випадків позбавлення від нескінченних та нульових значень вирішує цю проблему.

позбутися нескінченних цінностей.

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

позбудьтеся від нульових значень так, як вам подобається, конкретного значення, такого як 999, означає, або створіть власну функцію для введення відсутніх значень

df.fillna(999, inplace=True)

2

У мене була однакова помилка, і в моєму випадку X і y були фреймами даних, тому мені довелося спочатку перетворити їх на матриці:

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

Редагувати: спочатку запропонований X.as_matrix () застарілий


1

я отримав таку ж помилку. з ним працювали df.fillna(-99999, inplace=True)перед тим, як робити будь-яку заміну, заміну тощо


4
Це брудне виправлення. Є причина, чому ваш масив містить nanзначення; ви повинні його знайти.
Elias Strehle

дані можуть містити nan, і це дає змогу замінити їх на дані зі значеннями, які він / вона вважає прийнятними
user2867432

0

У моєму випадку проблема полягала в тому, що багато функцій scikit повертають нумерові масиви, позбавлені індексу панд. Тож сталася невідповідність індексу, коли я використовував ці нумерові масиви для створення нових DataFrames, а потім намагався змішати їх з вихідними даними.


0

Видаліть усі нескінченні значення:

(і замініть міні або макс для цього стовпця)

# 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]

-1

спробуйте

mat.sum()

Якщо сума ваших даних нескінченна (більша, ніж максимальне значення float, яке становить 3.402823e + 38), ви отримаєте цю помилку.

див. функцію _assert_all_finite у validation.py з вихідного коду 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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.