강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

T2-4 집값예측 말씀해주신대로,,

작성

·

166

·

수정됨

0

말씀해주신대로

 

원핫인코딩은 범주형 변주에만 적용하기 때문에

 

라벨인코딩은 진행하지 않고 원핫인코딩만 진행했습니다

 

코드는 다음과 같습니다

 

 

cols = X_train.select_dtypes(include='object').columns

X_train = pd.get_dummies(X_train, columns=cols)

X_test = pd.get_dummies(X_test, columns=cols)

X_train.shape, X_test.shape

((1168, 284), (292, 253))

from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train['SalePrice'], test_size=0.2, random_state=0)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape

((934, 284), (234, 284), (934,), (234,))

from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state=0)
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)
pred

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

원핫인코딩으로 전처리 후 검증데이터 분리하고 랜덤포레스트리그레서 사용했는데,

 

여기서 수치형이 너무 많다고 나오는데,, 어떻게 해야할까요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. chandnd37님, 질문 주신 부분 확인했습니다.

원핫 인코딩 후에 발생하는 ValueError: Input contains NaN, infinity or a value too large for dtype('float32').' 에러는 입력 데이터에 NaN 값이나, 무한대 값을 포함하고 있거나, 너무 큰 값을 float32 데이터 타입으로 처리할 수 없을 때 발생합니다.

이 문제를 해결하기 위해서는 다음과 같은 해결 전략을 따를 수 있습니다:

  1. 데이터에 NaN 값이 있는지 확인하고, 있을 경우 적절한 값으로 대체하거나 해당 행 혹은 열을 제거합니다. Pandas의 isnull()dropna(), fillna() 메소드를 사용할 수 있습니다.
# NaN 값이 있는지 확인
print(X_train.isnull().sum())
print(X_test.isnull().sum())

# NaN 값을 평균값, 중앙값 등으로 대체
X_train = X_train.fillna(X_train.mean())
X_test = X_test.fillna(X_test.mean())

# 또는 NaN 값을 포함하는 행을 제거
X_train = X_train.dropna()
X_test = X_test.dropna()
  1. 무한대 값을 확인하고, 무한대 값은 가장 큰 finite float 값으로 대체하거나 해당 행 혹은 열을 제거합니다.
# 무한대 값이 있는지 확인
print((X_train == np.inf).sum())
print((X_test == np.inf).sum())

# 무한대 값을 대체
X_train = X_train.replace([np.inf, -np.inf], np.nan)
X_test = X_test.replace([np.inf, -np.inf], np.nan)

# 대체한 후 NaN 값 처리
X_train = X_train.fillna(X_train.mean())
X_test = X_test.fillna(X_test.mean())
  1. 원핫 인코딩 시에 훈련 세트와 테스트 세트의 컬럼 수가 다를 수 있어서 이를 일치시켜주는 작업이 필요합니다. 훈련 데이터에 있는 범주형 변수의 각 범주에 대해 원핫 인코딩이 적용된 후, 테스트 데이터에는 없는 범주가 있을 수 있기 때문입니다.
# 훈련 세트와 테스트 세트의 column을 맞추기
X_train, X_test = X_train.align(X_test, join='inner', axis=1)

원핫 인코딩 처리 이후에도 모든 컬럼의 데이터 타입이 float32로 적절한지 확인하고, 랜덤포레스트 모델 학습에 적합하도록 데이터를 전처리 한다면 해당 에러를 해결할 수 있을 것입니다.

부족한 부분이 있다면 추가적으로 문의하세요.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기