• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    해결됨

원핫인코딩 관련 궁금증

22.07.18 14:41 작성 조회수 503

0

안녕하세요. 강의 듣다가 궁금증이 생겨서 질문 드립니다.

 

이 Bike Sharing Demand 데이터 실습에서 원핫인코딩을 수행할 때, 인코딩을 먼저 수행 후 train과 test를 분리했는데,

실전을 포함해서 test 데이터가 이미 분리된 상태로 주어진 경우 도 많은 것 같아요.

근데 이럴 때 train과 test 각각 따로 인코딩을 수행하면

특정 칼럼에 대해 서로 없는 범주가 포함될 수 있을 것 같습니다.

(예를들어 train에는 개/고양이만 있는데, test에는 개/고양이/원숭이 범주까지 있다던지..)

이 경우에 칼럼 갯수에도 차이가 발생할텐데 이때 모델 학습/예측시에 문제가 발생하지 않나요?

그렇다고 pd.concat 등으로 데이터를 합치고서 인코딩을 수행 후 다시 분리하면 데이터 리키징 문제가 발생한다고 들었습니다. (아니라면 말씀해주세요!)

 

머신러닝/딥러닝 강의 계속 잘 듣고 있습니다.

감사합니다.

답변 1

답변을 작성해보세요.

2

안녕하십니까, 

좋은 질문이군요. 

저는 가능하다면 학습과 테스트를 합해서 인코딩을 하는게 좋다고 생각합니다(맞다고 생각하지는 않습니다) 

먼저 정석대로 말씀드리면 학습과 테스트를 분리해서 적용하는 것이 맞습니다. 말씀하신대로 학습과 테스트를 분리해서 적용하면 테스트 데이터에서 학습데이터에 없는 값을 변환하려고 하기 때문에 오류가 발생할 수 있습니다. 

예를 들어 학습 데이터의 A코드값이 01, 02, 03이 있어서 이를 1, 2, 3으로 레이블 인코딩 하였는데, 테스트 데이터의 A코드값은 01, 02, 03, 04 가 있어서 이를 1, 2, 3, 4 로 인코딩을 했으면 성능이 살짝 떨어질수는 있습니다(사실 매우 중요한 Feature가 아니라면 성능 차이는 거의 나지 않습니다만). 

또한 아래와 같이 학습 데이터의 레이블로 인코딩된 Label 객체를 이용해서 테스트 데이터를 transform( ) 수행하면 encoding이 안되는 오류가 발생합니다. 학습 데이터는 04값이 없기 때문에 오류를 내줍니다. 

LabelEncoder enc = LabelEncoder()

학습데이터_레이블_인코딩값 = enc.fit_transform(학습 데이터의 A코드값)

# 아래 코드는 오류를 발생시킵니다. 

테스트데이터_레이블_인코딩값 = enc.transform(학습 데이터의 A코드값)

저는 이 방식이 정석적으로 맞다고 생각합니다. 학습에서 사용되지 않은 코드값을 테스트에서 사용할 경우에는 오류를 발생 시켜야 사용자가 오류 내용을 인지하고 수정할 수 있기 때문입니다.  그리고 학습에서 사용되지 않는 코드값이 테스트에서 사용되어서는 안됩니다.  프로그램 짤때도 사용자가 없는 코드값을 입력하면 오류를 출력해야 하는 것과도 같은 이치 입니다. 

만약에 오류를 내고 싶지 않다면 enc.fit_transform()을 테스트 데이터에 적용하면 됩니다. 그럼 04에 대해서 새롭게 인코딩을 하기 때문에 오류가 나오지 않습니다. 하지만 이 방식은  학습에서 사용하지 않은 04를 계속 테스트에서 호출하는 결과를 가져오게 됩니다. 만약 해당 코드가 중요한 피처라면 이 방식은 적용하지 않아야 합니다. 

현실적으로는 코드 인코딩은 학습과 테스트 데이터를 합쳐서 해주는 게 편리하다고 생각합니다. 그리고 원래 테스트 데이터에 포함되지 않고 실 환경에서 새롭게 들어오는 테스트 데이터가 다른 코드 값을 가지고 들어오면 오류를 발생시켜야 한다고 생각합니다. 그래야 수정이 가능하기 때문입니다.  무엇보다도 새롭게 들어오는 테스트 데이터가 학습 시에 사용된 코드가 아닌 다른 코드로 입력 되어서는 안되므로 이부분은 애플리케이션 구현시 유의해 줘야 합니다. 

그리고 pd.concat 등으로 데이터를 합치고서 인코딩을 수행 후 다시 분리하는 정도를 데이터 리키징으로 까지 보지는 않습니다. 아~~~주 엄밀히 보면 그럴수는 있지만, 그 정도를 Data Leak으로 간주하는 것은 오버 라고 생각합니다. 

감사합니다. 

강주형님의 프로필

강주형

질문자

2022.07.18

상세한 답변 정말 감사드립니다.

궁금증이 많이 해소되었어요.

"오류가 발생하는 게 맞다."는 생각을 못하고 있었는데, 선생님 말씀 들으니까 다 수긍이 갑니다.

남은 강의도 잘 듣겠습니다!!