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

Public 2등 팀 솔루션 공유

2020.06.26 18:17 7,155 조회

항상 재밌는 대회 열어주셔서 감사합니다.

저희 팀은 이번에 팀으로 진행하면서 많은걸 배웠는데, 저희 팀의 솔루션을 공유하고자 합니다.

마지막까지 잘하시는 분들이 많으셔서 힘들었는데 많이 배웠습니다. 감사합니다



* 주의 : 저희가 사용한 도메인 지식은 실제 과학적 사실과 다를 수도 있습니다.


 

대회 목적

  • 대회의 목적은 빛을 쏴서 빛의 흡수량을 측정하여 물질의 농도를 측정하고자 하는 것


 

feature engineering

- dst/src( 투과도 피쳐 생성), log(src/dst)/rho (농도와 비례하는 피쳐생성) -> 자세한 내용은 비어 램버트 법칙 참고


- 10 단위로 이루어진 파장별 데이터 노이즈를 줄여주기 위해 binning 한후 피쳐생성 또한 진행(10, 20, 30, 40, 50, 100 사이즈로 binning)


- dst NaN값은 어떤방식으로 값을 채워도 성능하락 하기에( dst의 양은 흡광도와 비례하고, 이는 다시 농도와 직결되기에 잘못된 추정을 하게 되었을거라 생각) , 대신 파장끼리 rolling mean을 하여 주변 파장의 평균으로 missing data를 채우는 효과를 내봄(window size = 3, 5)


- 파장대 별로 absorbance 피크를 살펴보면 피크의 intensity 가 다르고, 샘플마다 피크의 양상 또한 다름 .

파장대 별로 피크 intensity가 다른 이유는 물질마다 반응하는 에너지가 다르고 에너지는 파장과 반비례하기에, 파장별로 빛의흡수량이 달라지는 것.

즉 피크의 intensity는 빛의 흡수량에 따라 달라지고, 빛의 흡수량은 물질의 농도에 의해 결정됨.

-> 따라서 파장별로 피크들의 값을 서로 나눈 비율을 피쳐로 사용한다면 농도를 잘예측할수 있을거라 판단하여 피쳐로 추가

 

- drift를 보정하기 위해 분석파장과 가깝고 흡광도가 크지 않은 파장을 기준 파장으로 사용하여 (분석파장-기준파장)을 하여 drift를 보정한다고 하는데, 어떤걸 기준파장으로 설정할지 몰라 모든 파장을 다 빼주고 나중에 쓸모없는 피쳐를 걸러줌

(https://m.blog.naver.com/PostView.nhn?blogId=nanomate&logNo=110161379524&proxyReferer=https:%2F%2Fwww.google.com%2F

참고)

 

- 물질의 농도가 높아지면 한 분자가 다른 분자를 가릴 수 있기 때문에, 실제 측정하려는 흡광도에 비해 낮게 측정될 수 가 있는데, 이를 모델에게 알려주기 위해 먼저 모델 1을 학습하여 물질의 농도값을 예측한 다음 예측값을 피쳐로 추가하여 다시 모델 2를 학습하였음

 

- lgbm모델 같은경우 multi output regression을 진행할때 y끼리 상관관계를 가지더라도 이를 고려하여 모델을 만들수가 없는데 , 이 상관성을 모델에게 알려주기 위해 모델 1을 학습하고 y들을 예측한 다음 y 끼리 서로 나눈 값 또한 피쳐로 추가( 나이브하게 y의 상관관계를 비율로 표현) ( y끼리는 상관관계를 가진다는 것을 가정하고 한 실험)


 

Model

  • LightGBM , dart 사용



 

Ensemble

  • 각자 3seed 모델을 만들고 모두 단순 평균 진행

 


시도

  • 데이터 자체의 노이즈를 처리해주기 위해 여러 시도를 해봤는데 측정오차중 산란효과 , dst가 src보다 더 큰경우, dst에 존재하는 NaN.. 등을 고려해봤지만 실패
  • data generation
  • xgboost, neural net, catboost, pca, clustering, knn 등 시도
  • target encoding


로그인이 필요합니다
0 / 1000
처음해봐요
2020.06.26 18:23

공유해주셔서 감사합니다! 피쳐가 인상깊네요! 고생하셨습니다!

처음해봐요
2020.06.26 18:39

lgbm모델 같은경우 multi output regression을 진행할때 y끼리 상관관계를 가지더라도 이를 고려하여 모델을 만들수가 없는데 , 이 상관성을 모델에게 알려주기 위해 모델 1을 학습하고 y들을 예측한 다음 y 끼리 서로 나눈 값 또한 피쳐로 추가( 나이브하게 y의 상관관계를 비율로 표현) ( y끼리는 상관관계를 가진다는 것을 가정하고 한 실험) 이 것으로 얼마나 향상되었는지 알 수 있을까요?

처음해봐요
2020.06.26 18:40

아이디어가 정말 ㄷㄷ 많이 배웁니다!

Team
2020.06.26 18:46

처음해봐요님도 고생 많으셨습니다! 감사합니다
상관성 피쳐 뺀 나머지로 실험했을때 5fold 단일모델로 0.79X 정도 나왔는데, 피쳐 추가후 0.77x 로 향상했습니다

처음해봐요
2020.06.26 18:49

감사합니다! 솔루션 참고해서 모델 다듬어 봐야겠어요~

최정명
2020.06.26 18:33

관련 도메인의 글들을 많이 읽어보게 된 대회였는데 feature engineering을 어떤식으로 할지 막막했는데 올려주신 솔루션 보니 한 번에 이해가 되네요!!  감사합니다 ㅎㅎ 

혹시 어떤 feature를 추가 했을 때 가장 다이나믹한 성능 향상이 있었나요 ? 

고생하셨습니다 ! 

Team
2020.06.26 18:48

감사합니다. 최정명님도 고생 많으셨습니다! 
어느 피쳐가 가장 좋았다 라고 말하긴 어렵지만, 대회하면서 성능을 1점대에서 0.8점대까지 큰폭으로 올려준건 피크끼리의 비율을 구한 피쳐였습니다.

최정명
2020.06.26 18:52

답변 감사합니다. 공유해 주신 내용들 통해 정말 많은 것을 배웁니다!!

Jamm
2020.06.26 18:52

와 정말.... 그저 놀라울 뿐입니다..대단하세요..
2위 축하드립니다. 너무 수고하셨습니다!

Team
2020.06.26 19:39

Jamm 님도 너무 고생 많으셨습니다!!
감사합니다!