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를 사용하고 있습니다.
답변
이것은 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인지 확인하고 싶습니다 .
답변
pandas 와 함께 sklearn 을 사용할 때 동일한 오류 메시지가 나타납니다 . 내 솔루션은 sklearn 코드를 실행하기 전에 데이터 프레임의 인덱스를 재설정하는 것입니다 .df
df = df.reset_index()
내 df
에서 다음과 같은 일부 항목을 제거 할 때이 문제가 여러 번 발생 했습니다.
df = df[df.label=='desired_one']
답변
이것은 (에 따라 내 함수 이 )의 데이터 집합을 청소 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)
답변
내 입력 csv에 빈 공간이 있기 때문에 입력 배열의 차원이 왜곡되었습니다.
답변
이것이 실패한 검사입니다.
어느 말
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가 아니어야합니다.
답변
이 버전의 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
...
이제해야 할 일은 이러한 인덱스에서 값을 제거하는 것입니다.
답변
행의 하위 집합을 선택하려고 시도한 후 오류가 발생했습니다.
df = df.reindex(index=my_index)
에 my_index
포함되지 않은 값 이 포함 된 것으로 밝혀 df.index
졌으므로 재색 인 기능이 일부 새 행을 삽입하고 nan
.