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

130

Я использую 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

чтобы удалить бесконечные значения, но это тоже не сработало. Что я могу сделать, чтобы избавиться от бесконечных значений в моей матрице, чтобы я мог использовать алгоритм распространения сродства?

Я использую анаконду и python 2.7.9.

Итан Уолди
источник
3
Я голосую за то, чтобы закрыть это, так как автор сам говорит, что его данные недействительны, и хотя все указывало на это, он не подтвердил - данные эквивалентны опечатке, что является закрывающей причиной.
Маркус Мюллер,
11
У меня была такая же проблема с моим набором данных. В конечном итоге: ошибка данных, а не ошибка scikit learn. Большинство приведенных ниже ответов полезны, но вводят в заблуждение. Проверьте проверьте свои данные, убедитесь, что при преобразовании в float64них одновременно конечны и нет nan. Сообщение об ошибке уместно - это почти наверняка проблема для всех, кто здесь оказался.
Оуэн
1
Для записи и +1 для @Owen проверьте свои входные данные и убедитесь, что у вас нет пропущенных значений ни в одной строке или сетке. Вы можете использовать класс Imputer, чтобы избежать этой проблемы.
abautista

Ответы:

103

Это может произойти внутри scikit, и это зависит от того, что вы делаете. Я рекомендую прочитать документацию по используемым вами функциям. Возможно, вы используете тот, который зависит, например, от того, является ли ваша матрица положительно определенной и не соответствует этим критериям.

РЕДАКТИРОВАТЬ : Как я мог пропустить это:

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
В документации ничего не говорится об этой ошибке. Мне нужен способ избавиться от бесконечных значений из моего массива nupy
Итан Уолди,
3
Как я уже сказал: возможно, их нет в вашем входном массиве. Они могут возникать в математике между вводом и магическим выводом. Дело в том, что вся эта математика зависит от определенных условий ввода. Вы должны внимательно прочитать документацию, чтобы узнать, удовлетворяет ли ваш ввод этим условиям.
Маркус Мюллер
1
@ MarcusMüller, не могли бы вы указать мне расположение этого документа, где они определяют требования матрицы ввода? Кажется, я не могу найти "документы", о которых вы говорите. Спасибо :)
user2253546
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
16

Это моя функция ( в зависимости от этого ) , чтобы очистить набор данных 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)
Boern
источник
Почему ты бросаешь нан два раза? Первый раз с dropnaпотом второй раз при сбросе инф.
luca
Я теряю некоторые данные, когда использую эту функцию для очистки своего набора данных. Любые предположения, почему ???
hackerbuddy
2
Это единственный ответ, который сработал. Я попробовал еще 20 ответов на SO, которые не сработали. Я думаю, что этому нужно больше голосов.
Contango,
12

Размеры моего входного массива были искажены, так как в моем входном CSV были пустые места.

Итан Уолди
источник
1
Для панд я просто использовал dropna pandas.pydata.org/pandas-docs/stable/generated/…
FindOutIslamNow
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.

tuxdna
источник
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
...

Теперь все, что мне нужно сделать, это удалить значения в этих индексах.

Raphvanns
источник
4

У меня возникла ошибка после попытки выбрать подмножество строк:

df = df.reindex(index=my_index)

Оказывается, они my_indexсодержали значения, которых не было df.index, поэтому функция переиндексации вставила несколько новых строк и заполнила их 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)

Edit: Первоначально предполагалось X.as_matrix () является Устаревшее

tekumara
источник
1

у меня такая же ошибка. он работал df.fillna(-99999, inplace=True)до замены, замены и т. д.

Cohen
источник
4
Это грязное исправление. Есть причина, по которой ваш массив содержит nanзначения; ты должен его найти.
Elias Strehle
данные могут содержать nan, и это дает возможность заменить их данными со значениями, которые он / она считает приемлемыми
user2867432 09
0

В моем случае проблема заключалась в том, что многие функции scikit возвращают массивы numpy, которые лишены индекса pandas. Таким образом, было несоответствие индексов, когда я использовал эти массивы numpy для создания новых DataFrames, а затем я попытался смешать их с исходными данными.

Luca
источник
0

Удалите все бесконечные значения:

(и замените на min или max для этого столбца)

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

Если сумма ваших данных бесконечна (больше, чем максимальное значение с плавающей запятой, равное 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))
Рик Хилл
источник