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

김성민님의 프로필 이미지
김성민

작성한 질문수

캐글 Advanced 머신러닝 실전 박치기

train, test 병합 후 결측치 또는 이상치 처리 관련문의

작성

·

902

0

안녕하세요 강사님

train, test 세트를 병합 후, 결측치  또는 이상치 처리 때 문의 드릴게 있습니다.
코딩 프로세스를 보면,
train,test 병합 후, TARGET isnull 인경우 app_test 로 설정하하는데
만약 이 과정 전, 결측치 처리 하는데서 결측치를 처리하기 위해, dropna를 쓰게 된다면,
최종적으로 test 세트 row를 제거 할 수도 있습니다(test 세트에 null이 포함 된 경우)

이는 즉, 정말 예측해야 하는 test 세트의 개수와 맞지 않는다는 뜻입니다.

또는, train, test 병합 전, train 데이터에만 outlier 를 제거한 후에 
test와 병합 한다면, test에는 outlier가 제거되지 않은 데이터들이 있을 수 있기 때문에,
문제가 있을 것 같습니다.

강의에서는 fillna(-999) 를 하기 때문에 문제가 없다지만,
실제로 결측치나 아웃라이어는 어떻게 처리해야 하나요?

 

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까, 

실습 코드의 전체적인 프로세스상 결측치는 Feature engineering 중간 과정중에 하지 마시고 가장 마지막에 제거해 주시면 될 것 같습니다.  

그리고 "결측치를 처리하기 위해, dropna를 쓰게 된다면,

최종적으로 test 세트 row를 제거 할 수도 있습니다(test 세트에 null이 포함 된 경우)" 라고 하셨는데, 이 의미는 dropna를 row 단위로 하신다는 말씀이시죠? 

그렇다면 test 세트 row를 지우셔도 됩니다. 단 여기서는 kaggle competition이기 때문에 test 세트 row를 지우시면 안됩니다. kaggle에서 채점을 전체 row 단위로 하기 때문입니다. 보통 실제 업무에서 test 세트에 적합한 값이 없다고 판단되면 지우셔도 상관없습니다. 

다만 결측치를 삭제할 때 컬럼 단위로 해당 컬럼의 매우 많은 값이 Null이어서 아예 컬럼 단위로 삭제하는 경우는 있습니다. 결측치 삭제는 보통 이런 컬럼 단위 삭제를 얘기합니다.

outlier는 조금 상황이 더 복잡할 수 있습니다. 기본적으로 학습데이터와 테스트 데이터의 모든 outlier를 삭제해 주면 좋습니다. 다만 테스트 데이터에 outlier가 발생할 수 있는 경우라면(이런 경우라면 더 이상 outlier가 아닐 수 있습니다) 학습 데이터에 outlier를 유지한 경우와 outlier를 삭제한 경우 각각의 경우를 모두 학습 모델로 만든 다음에 어떤 것이 더 좋은지 테스트 데이터로 판단해 봐야 합니다.   

김성민님의 프로필 이미지
김성민
질문자

안녕하세요 강사님!

답변 감사드립니다.

저는 현재 사내 AI 경진대회에 출전하였고
Kaggle 과 같은 방식으로 진행되고 있습니다.
따라서 test row를 지우면 안됩니다.

결측치 처리나, 이상치 데이터를 처리할 때 drop 시키지 않고,(row 기준 drop 입니다)
강의처럼 
- 결측치는 -999로 바꾸거나, fillna로 다른값으로 변경하는 방법이 있을 것 같고
- 이상치는 Q3 + iqr *1.5  or Q1 - iqr *1.5 한값으로 대체하거나 하는 방법을 사용해야 될 것 같은데,

이러한 방법이 맞는지, 
또, 실제 캐글에서는 어떠한 방법으로 결측치나, 이상치를 다루는지 궁금합니다.

권 철민님의 프로필 이미지
권 철민
지식공유자

결측치를 적절하게 바꾸는 마법 법칙은 없는것 같습니다.

이상치는 말씀하신  Q3 + iqr *1.5  or Q1 - iqr *1.5 로 바꾸는 방법도 괜찮아 보입니다. 

김성민님의 프로필 이미지
김성민

작성한 질문수

질문하기