작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
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 데이터 타입으로 처리할 수 없을 때 발생합니다.
이 문제를 해결하기 위해서는 다음과 같은 해결 전략을 따를 수 있습니다:
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()
# 무한대 값이 있는지 확인
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())
# 훈련 세트와 테스트 세트의 column을 맞추기
X_train, X_test = X_train.align(X_test, join='inner', axis=1)
원핫 인코딩 처리 이후에도 모든 컬럼의 데이터 타입이 float32
로 적절한지 확인하고, 랜덤포레스트 모델 학습에 적합하도록 데이터를 전처리 한다면 해당 에러를 해결할 수 있을 것입니다.
부족한 부분이 있다면 추가적으로 문의하세요.