자율주행 센서의 안테나 성능 예측 AI 경진대회

[Private 2위, 1.91352] Denoising Stacked Generalization

2022.09.14 15:47 2,848 Views language

안녕하세요 :)

방법론 및 아이디어가 적용된 scratch code 입니다. (public: 1.8967, private: 1.9162)
Denoising 기법으로 Exponential Smoothing과 Low-pass Filtering을 사용했습니다.

최종 code 및 자세한 내용은 github를 참고해 주시기 바랍니다.
https://github.com/GNOEYHEAT/LG-AI_Rader

감사합니다.

Code
로그인이 필요합니다
0 / 1000
최정명
2022.09.14 17:56

안녕하세요.
데이터 denoising을 위해 exponential smoothing와 low-pass filtering를 적용하신 것이 인상깊네요!

한 가지 우려되는 부분은
```
X_df = pd.concat([X_train_df, X_test_df], axis=0).reset_index(drop=True)
X_df.shape

drop_columns = [] # 검사 통과 여부
for col in X_df.columns:
    if X_df[col].nunique() == 1:
        drop_columns.append(col)
        
drop_columns
```

해당 코드에서 train과 test 데이터를 merge한 후 각 컬럼을 탐색하면서 오직 1개의 값만 가지는지 체크하고 train과 test모두 체크된 컬럼을 제거하는 부분이 data leakage 같습니다.

해당 대회 참여를 하지 않아서 train만 탐색하여 체크를 할 때도 동일한 컬럼이 나오는지는 잘 모르겠습니다만 지금 위 코드만 봐선 test분포를 사용한것이기 때문에 data leakage issue 가 있을 것 같네요.

GNOEYHEAT
2022.09.14 20:12

댓글 감사합니다.
최종 code 및 발표 자료를 업로드하지 않고 핵심적인 방법론을 간단하게 소개하다 보니 설명이 부족했던 것 같습니다.
github의 code 및 발표 자료를 보시면 자세한 내용을 이해하기에 도움이 되실 것 같습니다.

답변드리자면, train dataset을 기준으로 unique 한 값을 가지는 변수는 ['X_04', 'X_23', 'X_47', 'X_48']입니다.
['X_04', 'X_23', 'X_47', 'X_48']의 변수 설명을 살펴보면 1~4차 검사 통과 여부를 의미합니다.
이를 통해, data leakage 문제없이 학습에 있어 유의미한 정보를 가지고 있지 않는다고 판단할 수 있었습니다.
또한, 변수 설명을 통한 도메인 지식 기반으로도 충분히 제거할 수 있는 변수로 판단하였습니다. 

Scratch code에서는 EDA 과정 중에 train과 test dataset을 결합하여 위와 같이 변수를 제거하였습니다.
하지만, 실제 경진대회를 진행할 때 test dataset의 분포를 사용해서 임의로 변수를 제거한 것이 아니었기 때문에 data leakage 문제가 없다고 생각됩니다.

답변 후 코드를 수정하게 된다면 다른 분들은 해당 이슈를 인지하지 못할 수 있을 것 같습니다.
때문에, 동일한 코드에서 결과를 출력한 파일로만 글을 수정하겠습니다.

감사합니다 :)

최정명
2022.09.15 03:21

현재  제공된 train과 test를 통해서 [train분포로 만 unique 컬럼을 뽑았을 때], [train과test합쳐 unique 컬럼을 뽑았을 때] 두 경우 모두 같은 컬럼이 뽑아진다고 하지만 다른 test 데이터셋이 들어온다면(현재 코드처리 단계에서 drop_columns 리스트가 변할만한 데이터셋) 결과가 달라질 수 있는 여지가 있기 때문에 DACON의 평가 절차가 어떻게 될지는 모르겠네요.

이번 대회는 특히 DataLeakage를 유의하라는 remind 공지도 올라온 것 같습니다.
"평가 데이터셋(Test Dataset)의 Row의 개수 혹은 Index (그 밖의 Test Dataset에 대한 정보)를 활용하는 것은 Data Leakage에 해당됩니다."
"일반적으로 Test Dataset은 '아예 볼 수 없다' 라고 가정하고 진행해야하며 코드 역시 이를 반영해야합니다."

real world에 이러한 알고리즘을 적용하기 위해 개발을 한다면 이런 문제를 파악한 후 바로 잡으면 되겠지만, 대회의 특성상 다른 팀과의 공정성을 위해 이런 부분도 
 평가되어야 한다고 생각합니다.

물론 최종 제출이 중요하니 이런 부분이 고려되어 잘 제출이 됐다면 다행이네요!

hhback
2022.09.15 03:22

안녕하세요.

제가 github에 있는 코드를 개발한 사람입니다.

일단 공유드린 본 코드는 최종본이 아니며,  대회를 진행하면서 큰 틀에서 비슷하게 진행됐던 케이스를 공유드린겁니다.
(저희는 큰 방법은 공유를 하고 각자 개발해서 좋은 점수가 나오는 것을 최종 제출하는 식으로 진행했습니다.)

그럼에도 위의 코드로도  Private 2,3위 정도의 점수가 확보됩니다.

따라서 제가 columns drop 한 기준은 본 코드랑 다르고 깃헙 코드를 보시면 알겠지만 drop한 column도 다릅니다.

저는 분명히 개발할 때 언급하신대로  그리고, remind 공지에 올라온 대로

"일반적으로 Test Dataset은 '아예 볼 수 없다' 라고 가정하고 진행해야하며 코드 역시 이를 반영해야합니다."

라는 기준으로 Train 데이터으로만 drop 기준을 잡았고 그리고 도메인적인 부분과 같이 고려하여

이 부분에 부합되는 Column를  drop하는 기준을 Fix하여 개발했습니다.

따라서, 공정성에도 전혀 문제가 없다 생각하고 Real World에서도 당연히 문제없는 코드라 생각합니다.

최정명
2022.09.15 04:01

네 저도 댓글을 쓰면서 github에 올려진 코드를 뒤늦게 보았었는데 누수 이슈은 없어보였습니다.

첫 댓글은 해당 github에 올려진 코드가 아닌 현재 이 코드만 보고 의견을 썼었습니다.

그리고 피피티도 올려주셨길래 봤는데 정말 많은 노력이 담겨있는 것 같습니다.

평가에서 좋은 결과가 나오셨으면 좋겠습니다!!

GNOEYHEAT
2022.09.15 04:40

추가 답변입니다.

저희 팀원이 전달한 내용처럼 최종적으로 제출한 code를 기준으로 data leakage가 발생하지 않는다는 의견은 저도 마찬가지로 동의합니다.

유의 사항에 따른 평가 절차에 대해 제 생각을 말씀드리겠습니다.
scratch code를 기반으로 case를 살펴보겠습니다.

case 1 : train unique, test unique
- 새로 수집한 test data는 Pipeline을 통해 학습에 사용된 변수들로만 데이터셋이 재구성되어 추론을 진행합니다. 이때, 제거된 변수의 test 시점의 정보가 학습된 모형에 영향을 미치지 않습니다.

case 2: train unique, test not unique
- 이전에 제거되지 않았던 변수가 나타납니다. 하지만, 추론 시 case 1과 같이 test 시점의 정보가 예측 모형에 영향을 미치지 않습니다. 또한, 새로 수집한 data를 학습 시 추가적으로 사용할 수 있는 변수를 살펴볼 수 있습니다. 결과적으로, unique한 값을 갖는 변수가 학습 시 추가되지만 온전히 train 시점의 정보만 학습에 영향을 미칩니다.

때문에, 위와 같은 과정을 통해 데이터 전처리 시 변수를 drop 하는 것은 data leakage 문제로 볼 수 없습니다.
scaling, test data의 분포를 기반으로 생성한 파생 변수, pseudo labeling 등이 data leakage 문제가 발생된다고 생각됩니다.
scratch code에서 unseen data를 관측하는 부분이 엄밀하게 가정에 맞지 않는다고 지적해 주신 내용은 이해가 되는 부분입니다.

핵심적인 방법론을 소개 드리고 싶어 작성한 code에서 꼼꼼하게 살펴보지 못하고 이슈를 일으키게 되어 부족한 점을 느끼고 있습니다.
github를 살펴보시면 real-world에서 model serving 관점에서도 충분히 사용할 수 있는 예측 모형을 개발하려고 노력했음을 확인하실 수 있습니다.

구체적인 피드백 감사드리며 답변이 도움이 되었기를 희망합니다 :)

최정명
2022.09.15 02:59

삭제된 댓글입니다

Statistics
2022.09.15 07:54

안녕하세요,  저는 발표 대상 팀 소속 대회 참가자인 것을 먼저 밝힙니다.
동시에 현업에서 일하고 있으면서 Dacon의 여러 대회를 참가하고 수상 경험도 있고 여러 논란을 거친 것도 밝힙니다.

공유해주신 github에 발표자료까지 올라와있어서 살펴봤는데요, 접근 방향 자체는 정말 대단하지만 대회의 규정에 맞춰보면 문제의 소지가 있습니다.

공지된 대회 규칙을 보면 다음과 같은 내용이 있습니다.
-평가 데이터셋(Test Dataset)의 Row의 개수 혹은 Index (그 밖의 Test Dataset에 대한 정보)를 활용하는 것은 Data Leakage에 해당됩니다.

대회에 참여한 모든 팀이 Train과 Test가 쌍둥이인 것을 알고 있고,  저희 팀도 FFT활용해서 주기 탐색하고 validation 전략을 세웠지만 Test 데이터에 대해서는 적용하지 않았습니다. 제가 "Test 데이터셋에서 이동 평균이랑 x들 간의 이동 상관계수랑 몇개를 계산해서 넣으면  사실상 index를 대체할 수 있다"고 말한적도 있는데요, 이것도 위의 규정에 위배된다고 생각해서 실현하지는 않았습니다.

MA니 FT가 왜 규정에 위반되냐고 할 수 있는데요, " Index (그 밖의 Test Dataset에 대한 정보)"에 준하는 정보입니다.
Train와 Test 데이터를 나란히 두고 순서대로 100개씩 잘라서 그룹을 매긴 다음, 작업하신 feature들로 Classification 모형을 적합해보면 꽤 높은 정확도를 보일 겁니다. 제가 팀원들에게 말했던 방법에서도 그랬고요. 주어진 X를 활용해서 Y를 예측하는 것인가, 주어진 X를 활용해서 Train 데이터의 그룹을 찾아서 Y를 예측하는 것인가에 대한 의문이 남습니다. 

저희 팀에서 판단한 "Data Leakage 여부"에 대한 기준은, test 데이터셋을 random shuffle했을 때 동일한 성능이 나오는가였습니다.

위 내용은 제 개인적인 의견일 뿐이지만 Dacon에서도 명확히 답을 해주셔야 할 것 같습니다.

GNOEYHEAT
2022.09.15 11:04

토론의 장이 되어버렸네요...
대회에서 좋은 점수를 기록하게 되어서 관심을 많이 주시는 것 같습니다.

우선 말씀하신 내용에 대해서도 납득이 되는 부분이 있습니다.
저는 현실적인 상황에서 해당 문제를 해결하는 것을 중요한 우선순위로 생각했습니다.
제안하는 방법론을 실제로 적용할 수 있는지, 그에 따른 근거를 도출할 수 있는지 등을 고민하고 과제를 진행했습니다.
Data Leakage에 해당되지 않는 선에서 문제를 해석하고 가설을 세우며 타당성을 확보하고자 했습니다.

답글을 통해 구체적으로 말씀드리고 싶지만 아직 대회가 진행 중이기 때문에 토론이 과열되어 팀에 피해를 끼칠 우려가 있습니다.
대회가 끝나고 추후에 해당 이슈에 대해 정리하여 말씀드릴 수 있도록 노력하겠습니다.
2차 평가 심사에서 위의 이슈로 공격을 받는다면 설득력 있게 답변을 드릴 예정입니다.
심사 위원 분들께서 제안하는 방법론에 대한 위험 요소를 충분히 고려하시고 평가를 해주실 것 같습니다.

끝으로, 저희 팀이 고민한 결과물을 발표 자료를 통해 친절하게 설명하고 싶었습니다.
다양한 의견은 개인적으로 언제나 환영이지만 대회가 마무리되지 않았고 2차 평가 전에 편향된 사고를 초래하게 될 위험이 있어 발표 자료는 삭제했습니다.

감사합니다 :)

Statistics
2022.09.15 12:01

아무래도 상위팀에 대한 견제는 피할 수 없는 숙명이죠!

대부분의 공모전에서 운영사와 주관사가 극도로 신경 쓰는 부분이 공정성입니다.
이미 많은 대회에서 경험하셨겠지만, 대회 평가 기준에 여러 지표들이 있어도 큰 스코어 차이가 나는데 1등을 바꾸기는 어렵습니다.
모형의 스코어가 아닌 사람의 평가는 항상 공정성의 이슈가 뒤따를 수 밖에 없으니까요.

Data Leakage는 대회 규정상 실격 사유에 해당합니다. 
비슷한 시기에 진행된 옆대회, 수위 예측 시계열 문제에서는 미래 시점의 정보가 말려들어오면 실격입니다. 
예를 들어 FFT를 하더라도 현재 t시점까지의 정보만 활용해야지, t+1 시점이 들어오면 실격사유에 해당합니다.  대신 t시점까지의 이동평균은 문제가 없죠.

이 대회는 시계열 문제가 아니기 때문에 더욱 조건이 까다롭습니다. 공지에서 말한 index를 쓰지말라는 것은 "시점"이라는 속성자체를 활용하지 말라는 것과 동일하다고 생각합니다.
Test 데이터에서 전체 평균을 계산하는 것도 data leakage에 해당한다고 공지가 되어 있고, Test 데이터로 FFT를 하는 순간 data leakage에 해당합니다. 
t, t-1, t-2 와 같이 시점 정보를 활용하는 MA 역시 data leakage에 해당할 가능성이 매우 높습니다. 

이게 문제가 되지 않으면 앞으로의 대회에서 Test 데이터의 결측값 처리 과정에서 전체 평균대신 이동 평균을 써도 된다는 것이 되고, 
시계열 문제도 아닌데, 결측값을 전체 평균으로 채우면 실격이고 이동 평균은 실격이 아니라는 이상한 결론이 나오게 됩니다.
역시 공정성의 이슈가 발생합니다.


저는 매번 거의 혼자 대회 참여하다가 뒤늦게 팀에 합류했는데요, 대충하고 적당히 해서 상위에 랭크된 팀은 없겠죠.
혼자 할 때는 그냥 적당히 넘어가는 경우가 많지만, 이번에는 팀원들이 노력한 것들이 눈에 아른거려서 더욱 날을 세울 수 밖에 없는 것을 양해 부탁드립니다.

hhback
2022.09.15 12:44

의견 감사합니다.

저희 또한 노력해서 본 방법을 사용한것이고 말씀드리고 방어드리고 싶은 부분도 많으나, 아직 대회가 끝난것 아니므로 말을아끼겠습니다.

주최측에서 잘  판단하시라 믿습니다.

GNOEYHEAT
2022.09.15 15:11

코드 검증 단계에서 Data Leakage 문제로 아쉽지만 실격 처리되었습니다..!
구체적인 이유로 위의 문제를 직접적으로 언급하지는 않았으며 저희 팀의 실수로 다른 data leakage가 발생했습니다..ㅠㅜ
경진대회에 참여하신 모든 분들께 도움이 되기를 바라는 마음으로 글은 남겨두겠습니다 :)