원핫인코딩 관련 궁금증
850
작성한 질문수 3
안녕하세요. 강의 듣다가 궁금증이 생겨서 질문 드립니다.
이 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으로 간주하는 것은 오버 라고 생각합니다.
감사합니다.
0
상세한 답변 정말 감사드립니다.
궁금증이 많이 해소되었어요.
"오류가 발생하는 게 맞다."는 생각을 못하고 있었는데, 선생님 말씀 들으니까 다 수긍이 갑니다.
남은 강의도 잘 듣겠습니다!!
모델 서빙과 관련된 강좌가 출시되는지 질문드립니다.
0
30
2
안녕하세요 열심히 수강중인 학생입니다
0
71
2
정수 인덱싱
0
75
2
넘파이 오류
0
95
2
11강 numpy의 axis 축 질문 드립니다.
0
92
2
Kaggle 에서 Santander customer satisfaction data 를 다운로드 되지가 않습니다.
0
83
2
Feature importances 를 보여주는 barplot 이 그래프로 안보여져요.
0
74
2
타이타닉 csv 파일이 주피터 화면에 보이지 않습니다.
0
79
2
타이타닉 csv 파일이 주피터 화면에 보이지 않습니다.
0
66
2
5강 강의 오류가 있어요.
0
86
1
실무에서 LTV 관련 모델 선택 질문입니다!
0
75
2
14강 강의 듣는중에 궁금한게 있어서 질문합니다~
0
71
3
파이썬 다운그레이 후 사이킷런 재설치
0
124
2
좋은 강의 감사합니다.
0
76
2
scoring 함수 음수값
0
69
2
6번 강의에 사이킷런, 파이썬, 아나콘다 각각 버전 일치 안 시키고 진행해도 강의 따라가 지나요?
0
104
2
분류 평가 정확도 예측
0
83
2
안녕하세요. 강의 들으면서 업무에 적용하고 싶은 수강생입니다.
0
103
1
카카오톡 채널 있나요
0
111
1
혹시 강의에서 사용하시는 ppt 받을 수 있는건가요
0
191
2
pca 스케일링 관련하여 질문드립니다.
0
105
2
주피터 대신 구글 코랩
0
177
2
강의에서 사용하는 pdf or ppt자료는 따로 없는 건가요?
0
149
2
실루엣 스코어..
0
88
2





