월간 데이콘 생체 광학 데이터 분석 AI 경진대회

공유된 결측치 보간 방법을 이용한 BaseLine의 성능 개선

2020.05.28 14:29 7,441 조회 language

참고 코드
[데이터 전처리 관련해 참고사항] https://dacon.io/competitions/official/235608/codeshare/1118?page=1&dtype=recent&ptype=pub
[Baseline][XGBoost][Heatmap]  https://dacon.io/competitions/official/235608/codeshare/1112?page=1&dtype=recent&ptype=pub

기존 BaseLine에서는 dst(측정스펙트럼) 결측치 처리를 컬럼의 평균값들로 처리하였습니다.
저도 결측치를 보간하는 방법을 시도하고 있었는데 pandas에서 제공하는 보간 함수가 있는지 몰랐습니다. 김탱 님이 잘 정리해주셔서 그대로 들고왔습니다.
김탱님의 코드에서와 차이점은 0값을 NaN 값으로 대체 후 보간하였는데 성능이 좋지않아 기존 NaN값에서 보간을 진행하였습니다.
데이터의 시각화는 각 참고 코드를 보시면 될 것 같습니다.

기존 BaseLine 리더보드 점수보다 1.50963-->1.4299  로 0.07973 상승하였습니다.
리더보드 성능, CV 성능을 봐선 보간을 통한 결측치 처리가 성능 향상에 도움이 되었습니다.
해당 코드는 제공된 BaseLine과의 비교를 위해 Xgboost 모델을 사용하였고, LightGBM 모델을 사용하면 성능의 향상이 있을 것이라 생각합니다.
또한 나머지 사용하지 않은 컬럼(rho,src)을 추가하여 학습하면 성능 향상이 있을 것이라 생각합니다.

코드
로그인이 필요합니다
0 / 1000
DACON.edu
2020.05.28 19:50

감사합니다. 보간법은 자주쓰이는 것 같은데 유용하네요~

최정명
2020.05.29 00:05

네네 여러 곳에서 다양하게 쓰이는 것 같네요 !!

Yion
2020.05.29 21:13

좋은 글 감사합니다. 한가지 질문이 있는데요.
혹시 보간 후에도 nan인 값들이 남아서 이걸 0으로 대체해주고 있는데 왜 보간 후에도 nan인 값들이 남는지 아시나요?

최정명
2020.05.30 14:42

보간 후 경우에 따라 nan 값이 남는게 맞습니다.
보간을 할 때는 nan값의 앞과 뒤 값을 사용합니다. 즉, 행의 첫 번째 혹은 마지막의 데이터가 nan값일 경우 보간에 사용할 데이터가 없어 nan 값 그대로 남게 됩니다.
보간 코드를 직접 실행 해 보시면 해당 내용을 좀 더 자세히 아실 수 있을 것 같습니다.

최정명
2020.05.30 14:43

ex ) 0 nan 10 11 12       --> nan 값 보간 가능
ex ) 10 11 12 nan  0      -- > nan 값 보간 가능
ex ) nan nan 10 11 12   --> 앞의 두 nan 값은 보간을 할 수 없음.
ex ) 10 11 12 nan nan   -->  뒤의 두 nan 값은 보간을 할 수 없음.

최정명
2020.05.30 14:43


적으면서 생각난 방법인데 보간을 진행하기 전 행의 제일 처음, 마지막이 nan 일 경우 0 으로 값을 대체 후 보간을 진행하면 또 다른 결과가 나올 것 같습니다.

위 예를 사용해보면
ex ) 0 nan 10 11 12
ex ) 10 11 12 nan 0 
이렇게 0으로 대체후 보간을 진행하면 될 것 같네요 ! 

제로콜라맛있다
2020.05.30 15:03

interpolate가 앞에서 뒤로하는 방식으로 진행하게 되면 맨앞에 있는 값이 nan이 생기고, 뒤에서 앞으로 보간을하면 맨뒤 값이 nan으로 남아있습니다.
저는 이후에 bfill이나 ffill로 같은 값으로 채우는 방법을 썻습니다

최정명
2020.05.30 15:28

제로콜라맛있다 님 의견 감사합니다!

nevret
2020.06.10 15:46

좋은 글 공유해주셔서 감사합니다 :)
혹시 MultiOutputRegressor를 사용하시지 않고 예측 라벨을 하나씩 predict 해준 이유가 있을까요?
그렇게해도 결과는 동일하게 나오는 건가요?

최정명
2020.06.10 15:57

하나씩 predict한 이유는 딱히 없고 저도 MultiOutputRegressor가 된다는 것을 다른 분이 공유해주신 내용을 보고 처음 알았습니다.
결과는 동일한지는 모르겠지만 저는 아직 하나씩 예측 중 입니다.
multioutputregressor 방식으로 한번에 결괏값을 출력할 수 있게 시도해봐야겠네요.
추가로 multioutput을 하게 되면 early stopping을 어떻게 할지 잘 모르겠네요.

최정명
2020.06.10 17:12

multioutputregressor로 예측한 결과와 각각의 모델로 예측한 결과가 같다는 내용을 저도 방금 알았습니다...
결국은 각각의 타겟에 적합한 feature engineering을 통해 예측하는 것이 나아보입니다!

nevret
2020.06.10 17:25

궁금해서 캐글코리아 채팅방에 물어봤는데 채팅방에서도 답변해주셨네요ㅎㅎ 감사드립니다 :)

최정명
2020.06.10 22:46

아 같은 분이셨군요 ㅎㅎㅎㅎ
저도 덕분에 공부하게 되었습니다. 감사합니다.