인프런 커뮤니티 질문&답변
기출 8회 작업형 2 질문
해결된 질문
작성
·
39
0
데이터 전처리 과정에서
train= train.drop('customerID', axis=1)
test = test.drop('customerID', axis=1)
target=train.pop('TotalCharges')
train = pd.get_dummies(train)
test = pd.get_dummies(test)
이렇게 customerID를 drop하는 처리 진행 후 인코딩을 해서 학습 평가 까지는 잘 진행이 되는데, 예측단계(pred=rf.predict(test))에서 아래와같은value에러가 뜹니다.
ValueError: The feature names should match those that were passed during fit. Feature names unseen at fit time: - customerID_CUST0001
이런 경우는 무조건 train과 test를 하나로 묶어서 원핫인코딩을 진행해야하나요? train, test 각각 개별로 진행하면 안되는 떄의 기준이 궁금합니다.
답변 2
0
에러 원인은 train에는 CUST0001 값이 있지만 test에는 없고
원핫인코딩은 카테고리를 모두 컬럼으로 만듭니다.
예를 들어 과일 종류 100가지가 있다고 한다면 인코딩 후엔 모두 컬럼으로 만들어 버리죠!
데이터 수 만큼 모두 유니크한 값이라면 숫자면 그냥 둬도 되지만 문자면 삭제를 권장합니다.
에러가 나는 경우
train과 test의 카테고리 종류가 다를 때
특히 train에만 있는 값이 test에 없으면 문제가 됨
→ train에서는 그 값의 원핫 컬럼이 생겼기 때문에 모델이 그 컬럼을 기대함
→ test에는 해당 컬럼이 없어 오류 발생
에러가 안 나는 경우
train과 test의 카테고리 종류가 완전히 일치할 때
예: 과일 종류가 “사과, 포도, 바나나"로 train과 test 모두 같다면 문제 없음
유
0
안녕하세요, 인프런 AI 인턴입니다. 고라니님의 질문에 답변 드리겠습니다.
이번 질문에서는 원핫 인코딩 시 발생할 수 있는 차원 또는 열 불일치 문제와 관련된 내용입니다. 주어진 코드에서 customerID를 제거했지만 여전히 예측 시의 에러가 발생하는 상황은 train과 test의 컬럼 차이 때문입니다.
문제의 원인
Train과 Test의 원핫 인코딩 차이: train과 test 데이터셋 각각에 대해 독립적으로 원핫 인코딩을 진행하면, 특정 범주가 train에만 있고 test에는 없거나 그 반대일 수 있습니다. 이런 경우 서로 다른 컬럼 수로 인해 모델이 예측 시 데이터가 맞지 않아 에러가 발생할 수 있습니다.
교집합 범주의 불일치: 원핫 인코딩 후 train과 test에 존재하는 범주의 수가 다를 수 있으며, 이에 따라 원핫 인코딩 후의 컬럼 수가 다르게 됩니다.
해결책 및 권장 방법
- 데이터 병합 후 원핫 인코딩: train과 test를 하나로 결합한 뒤 원핫 인코딩을 진행하고, 다시 나눠 사용하는 방법이 안전합니다. 이렇게 하면 인코딩 후로 feature 컬럼의 불일치 문제를 방지할 수 있습니다.
# 데이터 병합
df_all = pd.concat([train, test], axis=0)
# 원핫 인코딩
df_all_encoded = pd.get_dummies(df_all)
# 데이터 분리
train_encoded = df_all_encoded[:len(train)]
test_encoded = df_all_encoded[len(train):]
이렇게 하면 train과 test 모두 동일한 컬럼을 가지게 되어 학습과 예측에 문제가 없어집니다.
참고 자료
유사한 문제와 해결책에 대한 정보는 아래 링크를 참고하시면 도움이 될 것입니다:
- 데이터 병합 후 인코딩 문제 해결
고라니님께 도움이 되었기를 바라며, 추가적으로 궁금한 사항 있으시면 언제든지 질문해 주세요. 곧 지식공유자께서도 답변해 주실 것입니다. 현재는 베타 기능으로 답변의 완벽성을 확신할 수 없는 점에 대해 양해 부탁드립니다. 🙏
감사합니다.





