ошибка sklearn ValueError: вход содержит NaN, infinity или слишком большое значение для 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 ответов


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


размеры моего входного массива были искажены, так как мой входной 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)

поэтому убедитесь, что у вас есть значения non NaN в вашем входе. И все эти значения на самом деле являются значениями float. Ни одно из значений не должно быть 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) перед делать любую замену, замену etc


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