sklearn 오류 ValueError : 입력에 NaN, 무한대 또는 dtype ( 'float64')에 비해 너무 큰 값이 있습니다.


128

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

무한 값을 제거했지만 이것도 작동하지 않았습니다. 선호도 전파 알고리즘을 사용할 수 있도록 매트릭스에서 무한 값을 제거하려면 어떻게해야합니까?

아나콘다와 파이썬 2.7.9를 사용하고 있습니다.


3
저자가 자신의 데이터가 유효하지 않다고 말하고 모든 것이 그것을 지적했지만 그는 오타에 해당하는 데이터를 검증하지 않았다고 말하면서이를 종결하기 위해 투표하고 있습니다. 이것이 종결 이유입니다.
Marcus Müller

11
내 데이터 세트에서 이와 동일한 문제가 발생했습니다. 궁극적으로 : 데이터 오류, scikit 학습 버그가 아닙니다. 아래 답변의 대부분은 유용하지만 오해의 소지가 있습니다. 확인 확인 데이터를 확인하고 변환 할 때 float64유한이 아닌지 확인하십시오 nan. 오류 메시지는 적절합니다. 이것은 거의 확실하게 여기에있는 모든 사람에게 문제입니다.
Owen

1
@Owen에 대한 레코드 및 +1의 경우 입력 데이터를 확인하고 행이나 그리드에 누락 된 값이 없는지 확인합니다. Imputer 클래스를 사용하여이 문제를 피할 수 있습니다.
abautista

답변:


102

이것은 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))

any함수 의 반환 값이 숫자 인지 아닌지 요소가 NaN인지 확인하고 싶습니다 .


4
문서는이 오류에 대해 언급하지 않습니다. 내 nupy 배열에서 무한 값을 제거하는 방법이 필요합니다.
Ethan Waldie

3
내가 말했듯이 : 그들은 아마도 당신의 입력 배열에 없을 것입니다. 입력과 마법 출력 사이에서 발생하는 수학에서 발생할 수 있습니다. 요점은이 모든 수학이 입력에 대한 특정 조건에 달려 있다는 것입니다. 입력 한 내용이 이러한 조건을 충족하는지 확인하려면 문서를주의 깊게 읽어야합니다.
Marcus Müller

1
@ MarcusMüller가 입력 행렬의 요구 사항을 지정하는이 문서의 위치를 ​​알려줄 수 있습니까? 말씀하신 "문서"를 찾을 수없는 것 같습니다. 감사합니다 :)
user2253546

39

pandas 와 함께 sklearn 을 사용할 때 동일한 오류 메시지가 나타납니다 . 내 솔루션은 sklearn 코드를 실행하기 전에 데이터 프레임의 인덱스를 재설정하는 것입니다 .df

df = df.reset_index()

df에서 다음과 같은 일부 항목을 제거 할 때이 문제가 여러 번 발생 했습니다.

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

1
사랑해! 오류의 원인을 알지 못함에도 불구하고 올바른 솔루션을 찾는 드문 경우입니다!
Alexandr Kapshuk

df.reset_index ()를 수행하면 결과 df에 "index"가 열로 추가됩니다. 모든 시나리오에 유용하지 않을 수 있습니다. df.reset_index (drop = True)가 실행되면 동일한 오류가 발생합니다.
smm

15

이것은 (에 따라 내 함수 )의 데이터 집합을 청소 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)

왜 난을 두 번 떨어 뜨리나요? dropnainf를 떨어 뜨릴 때 처음 에는 두 번째로.
루카

이 기능을 사용하여 데이터 세트를 정리하면 일부 데이터가 손실됩니다. 왜 ???
hackerbuddy

2
이것이 효과가 있었던 유일한 대답입니다. 작동하지 않는 20 가지 다른 답변을 시도했습니다. 나는 이것이 더 많은 찬성표가 필요하다고 생각합니다.
Contango


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이 아닌 값이 있는지 확인하십시오. 그리고 그 모든 값은 실제로 float 값입니다. 어떤 값도 Inf가 아니어야합니다.


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

이제해야 할 일은 이러한 인덱스에서 값을 제거하는 것입니다.


4

행의 하위 집합을 선택하려고 시도한 후 오류가 발생했습니다.

df = df.reindex(index=my_index)

my_index포함되지 않은 값 이 포함 된 것으로 밝혀 df.index졌으므로 재색 인 기능이 일부 새 행을 삽입하고 nan.


2

대부분의 경우 무한 및 null 값을 제거하면이 문제가 해결됩니다.

무한한 가치를 제거하십시오.

df.replace([np.inf, -np.inf], np.nan, inplace=True)

원하는 방식으로 null 값, 999, 평균과 같은 특정 값을 제거하거나 누락 된 값을 대치하는 자체 함수를 만듭니다.

df.fillna(999, inplace=True)

2

동일한 오류가 발생했고 제 경우에는 X와 y가 데이터 프레임이어서 먼저 행렬로 변환해야했습니다.

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

편집 : 원래 제안 된 X.as_matrix ()는 더 이상 사용되지 않습니다.


1

같은 오류가 발생했습니다. df.fillna(-99999, inplace=True)교체, 대체 등을 수행하기 전에 함께 작동했습니다.


4
이것은 더러운 수정입니다. 배열에 nan값이 포함 된 이유가 있습니다. 당신은 그것을 찾아야합니다.
Elias Strehle 18-06-25

데이터는 유모를 포함 할 수 이것은 그 / 그녀가 허용 발견 한 값을 데이터로 대체하는 방법을 제공합니다
user2867432가

0

제 경우 문제는 많은 scikit 함수가 pandas 인덱스가없는 numpy 배열을 반환한다는 것입니다. 그래서 새로운 DataFrames를 빌드하기 위해 그 숫자가 많은 배열을 사용했을 때 인덱스 불일치가 있었고 원본 데이터와 혼합하려고했습니다.


0

모든 무한 값 제거 :

(그리고 해당 열의 최소 또는 최대로 대체)

# 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보다 큼)이면 해당 오류가 발생합니다.

scikit 소스 코드에서 validation.py의 _assert_all_finite 함수를 참조하십시오.

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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.