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


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

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

Я использую anaconda и python 2.7.9.

10 60

10 ответов:

это может произойти внутри 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 функция-это число...

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

Я получил то же сообщение об ошибке при использовании sklearn С панды. Мое решение-сбросить индекс моего фрейма данных df перед запуском любого кода sklearn:

df = df.reset_index()

я столкнулся с этой проблемой много раз, когда я удалил некоторые записи в моем df, например

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

это проверка, на которой он терпит неудачу:

, который сказал

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 либо.

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

df = df.reindex(index=my_index)

получается, что my_index содержит значения, которые не содержатся в df.index, поэтому функция reindex вставила несколько новых строк и заполнила их nan.

У меня была та же ошибка, и в моем случае X и y были фреймами данных, поэтому мне пришлось сначала преобразовать их в матрицы:

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

С этой версией 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
...

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

Это моя функция (на основе этой) для очистки набора данных 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)

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

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