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

Sung Huh님의 프로필 이미지
Sung Huh

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

5회 기출유형 (작업형2)

강사님! 원-핫 인코딩 사용할때 궁금한게 있어요!

해결된 질문

작성

·

51

0

train과 test 모두 pd.get_dummies를 사용해서 원-핫 인코딩을 해주잖아요.

 

근데 만약에 그 train의 object unique 수랑 test의 object unique 수가 서로 다르면 (서로 다른 값이 존재한다면) train과 test의 열(속성) 수가 달라져서 train로 학습을 시키고 test로 예측을 할때 열(속성) 수가 달라서 오류가 뜨지 않나요??

 

그러면 사전에 object 컬럼에 서로 다른 값이 있는지 확인하고 원-핫 인코딩을 진행해줘야 되나요?? -> 서로 일치하는지 알 수 있는 방법이 있을까요?

 

이런 오류가 생긴다면 그냥 라벨인코딩하는게 좋을까요??

답변 2

0

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

단순하게는 일단 원핫인코딩 하고 다르면 처리해도 좋습니다.

같은지 다른지 확인

import pandas as pd

# 예제 데이터프레임 생성
df1 = pd.DataFrame({
    'col1': ['A', 'B', 'A', 'C'],
    'col2': ['X', 'Y', 'X', 'Z'],
	  'col3': ['A', 'B', 'A', 'B'],
})

df2 = pd.DataFrame({
    'col1': ['A', 'B', 'C', 'D'],
    'col2': ['X', 'Y', 'Z', 'W'],
	  'col3': ['A', 'A', 'A', 'B'],
})


print(set(df1['col1']) == set(df2['col1']))
print(set(df1['col2']) == set(df2['col2']))
print(set(df1['col3']) == set(df2['col3']))
Sung Huh님의 프로필 이미지
Sung Huh
질문자

다른 경우도 시험에 출제된 적이 있을까요? 생각해보니까 레이블인코딩도 만약 train에 없는 데이터가 test에 있게 되면 에러가 뜨는 것 같더라고요... 만약 이렇게 나오면 train과 test를 concat해서 인코딩 시키는게 가장 베스트일까요?

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

출제된적 없습니다

네 합쳐서 진행하면 됩니다 !

Sung Huh님의 프로필 이미지
Sung Huh
질문자

감사합니다!! 좋은 하루 보내세요!

0

안녕하세요, 인프런 AI 인턴입니다. Sung Huh님.

원-핫 인코딩을 진행할 때 train 데이터와 test 데이터의 카테고리 수가 다르면, 말씀하신 대로 열 수가 다르게 되어 오류가 발생할 수 있습니다. 원-핫 인코딩은 각 카테고리 값을 새로운 열로 변환하므로, 서로 다른 카테고리가 포함되어 있으면 데이터셋의 차원이 달라지는 문제가 발생합니다.

이를 해결하기 위해서는 다음과 같은 방법을 고려할 수 있습니다:

  1. Train과 Test를 합쳐 인코딩: 먼저 train 데이터와 test 데이터를 하나로 합쳐서 원-핫 인코딩을 진행한 후, 다시 분리하는 방식입니다. 이렇게 하면 두 데이터셋의 차원이 일관되게 됩니다.
import pandas as pd

# Train과 Test 결합
combined = pd.concat([train, test], axis=0)

# 원-핫 인코딩 적용
combined_encoded = pd.get_dummies(combined)

# 다시 Train과 Test로 분리
train_encoded = combined_encoded.iloc[:len(train)]
test_encoded = combined_encoded.iloc[len(train):]
  1. Dummy Features 수 조정: pd.get_dummies를 사용할 때, drop_first=True 옵션을 사용하여 첫 번째 카테고리를 드롭하여 차원의 일관성을 유지할 수 있습니다.

  2. 필요에 따라 라벨 인코딩 사용: 원핫 인코딩이 아닌 라벨 인코딩을 사용하여 단순히 각 카테고리를 일련번호로 변환할 수도 있습니다. 이는 데이터의 카테고리 값이 너무 많거나, 메모리가 제한적일 때 유용할 수 있습니다. 하지만, 라벨 인코딩은 카테고리를 순서 있는 값으로 인코딩하기 때문에, 카테고리 간에도 순서가 없음을 전제합니다. 이 점에 주의가 필요합니다.

해당 내용에 대한 더 많은 정보는 다음의 기존 답변을 참고해보세요:
- 원핫인코딩 오류 해결 방안
- 라벨 인코딩과 비교

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Sung Huh님의 프로필 이미지
Sung Huh

작성한 질문수

질문하기