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


41

RandomForest 모델을 사용하여 테스트 데이터를 예측할 때 ValueError가 발생했습니다.

내 코드 :

clf = RandomForestClassifier(n_estimators=10, max_depth=6, n_jobs=1, verbose=2)
clf.fit(X_fit, y_fit)

df_test.fillna(df_test.mean())
X_test = df_test.values  
y_pred = clf.predict(X_test)

오류:

ValueError: Input contains NaN, infinity or a value too large for dtype('float32').

테스트 데이터 세트에서 잘못된 값을 어떻게 찾습니까? 또한 이러한 레코드를 삭제하고 싶지 않습니다. 평균 또는 중간 값으로 대체 할 수 있습니까?

감사.

답변:


44

으로 np.isnan(X)당신을 포함하는 위치에 대한 사실과 부울 마스크 돌아갈 NaN들.

함께 np.where(np.isnan(X))사용하면 I, J의 좌표와 튜플을 다시 얻을 수 NaN의.

마지막으로, np.nan_to_num(X)당신 과 함께 "nan을 0으로 바꾸고 inf를 유한 숫자로 바꾸십시오".

또는 다음을 사용할 수 있습니다.


! X = X 반환 없음, 여러 번 np.isnan (x는) 나를 위해 실패했다면 나는 이유는 기억하지 않는다, 유모를 확인하기 위해 신원 조건을 선호
이타치

1
NaN 값을 0으로 바꾸는 것은 좋지 않습니다. NaN 값은 여전히 ​​누락 된 의미를 가질 수 있으며 0으로 대치하는 것은 아마도 최악의 방법이며 사용하는 최악의 대치 방법 일 것입니다. 변수를 왜곡시킬 수있는 임의의 0을 제공 할뿐만 아니라 변수에서 허용 가능한 값이 아닐 수도 있습니다. 즉, 변수에 진정한 0이 없을 수 있습니다.
hussam

나는 어떤 지침도 제공하지 않았다는 것을 깨달았습니다. 데이터 .rolling()를 대치하려면 롤링 평균을 사용 하여 결 측값을 롤링 창의 평균값으로 바꿉니다. 보다 강력한 사용 모듈 <b> missingpy </ b>를 MissForest원한다면 랜덤 포레스트 기반 대치에 사용할 수 있습니다 .
hussam

7

X_test팬더 데이터 프레임 이라고 가정하면 DataFrame.fillnaNaN 값을 평균으로 바꾸는 데 사용할 수 있습니다 .

X_test.fillna(X_test.mean())

X_test는 numpy 배열입니다. 원래 질문에서 df_test를 업데이트 했는데도 여전히 같은 오류가 발생합니다.
Edamame

6

이 문제를 겪고있는 사람은 실제로 원본을 수정하십시오.

X_test.fillna(X_train.mean(), inplace=True)

원본을 덮어 쓰려면 :

X_test = X_test.fillna(X_train.mean())

사본과보기에 있는지 확인하려면 :

X_test._is_view

2
이것은 기술적으로는 사실이지만 실제로는 잘못되었습니다. 실제로는 표본을 예측할 때 X_test 평균이 없으므로 X_test NA를 X_test 평균으로 채울 수 없습니다. X_train 평균은 실제로 보유하고있는 유일한 데이터이기 때문에 (시나리오의 99 %)
Omri374

4

잊지 마세요

col_mask=df.isnull().any(axis=0) 

np.nan 값을 나타내는 부울 마스크를 반환합니다.

row_mask=df.isnull().any(axis=1)

np.nan이 나타난 행을 반환합니다. 그런 다음 간단한 색인 생성을 통해 np.nan 인 모든 포인트에 플래그를 지정할 수 있습니다.

df.loc[row_mask,col_mask]

2

비슷한 문제에 직면하여 numpy가 NaN과 Inf를 다르게 처리하는 것을 보았습니다.
데이터에 Inf가 있으면 다음을 시도하십시오.

np.where(x.values >= np.finfo(np.float64).max)
Where x is my pandas Dataframe 

이것은 NA 값이 존재하는 장소의 튜플을 제공 할 것입니다.

데이터에 Nan이 있으면 다음을 시도하십시오.

np.isnan(x.values.any())

2

inf 값도 확인하는 것을 잊지 마십시오. 나를 위해 일한 유일한 것 :

df[df==np.inf]=np.nan
df.fillna(df.mean(), inplace=True)

sklearn을 사용하면 더욱 좋습니다

def replace_missing_value(df, number_features):

    imputer = Imputer(strategy="median")
    df_num = df[number_features]
    imputer.fit(df_num)
    X = imputer.transform(df_num)
    res_def = pd.DataFrame(X, columns=df_num.columns)
    return res_def

number_features가 number_features 레이블의 배열 인 경우

number_features = ['median_income', 'gdp']

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