ошибка 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 ответов:
это может произойти внутри 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
функция-это число...
Я получил то же сообщение об ошибке при использовании 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)