Подтвердить что ты не робот

Sklearn error 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.

4b9b3361

Ответ 1

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

Ответ 2

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

df = df.reset_index()

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

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

Ответ 3

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

Ответ 4

Это проверка, с которой она не выполняется:

Что говорит

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, на вашем входе. И все эти значения фактически являются значениями float. Ни одно из значений не должно быть Inf.

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

df = df.reindex(index=my_index)

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

Если вы не можете найти проблему в X, проверьте у

Ответ 12

пытаться

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

Ответ 13

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

почему я принимаю эту ошибку?

мой код:

import pandas as pd
from sklearn.metrics import r2_score
import statsmodels.api as sm

veriler = pd.read_csv('dataset.csv')

x = veriler.iloc[:,1:7]
y = veriler.iloc[:,7:]
X = x.values
Y = y.values

print(veriler.corr())

#Decision Tree Regression
from sklearn.tree import DecisionTreeRegressor
r_dt = DecisionTreeRegressor(random_state=0)
r_dt.fit(X,Y)

print('dt ols')
model4 = sm.OLS(r_dt.predict(X),X)
print(model4.fit().summary())

print("Decision Tree R2 degeri:")
print(r2_score(Y, r_dt.predict(X)) )