안녕하세요. 오늘은 어제 이어서 공모전에 대해서 블로그를 작성할 겁니다!
어제는 구현과 개념을 알아보느라 분석을 많이 못했지만 오늘은 matplotlib.pyplot을 사용해서 분석을 해보려고 합니다.
알고리즘이라 컴퓨터 비전과 다르게 어려워 보이지만, 언제나 하다보면 적응하게 됩니다. 그럼 시작해볼게요!
1. 문제
- 하루(피험자×날짜)마다 7개 이진 지표의 확률을 예측하고, 평균 Log-Loss로 평가한다(낮을수록 좋음).
- 데이터: 라벨 450일(정답 있음) + 테스트 250일(정답 없음), 센서 12종 700일분.
- 피험자가 단 10명이고, train과 test가 같은 사람이다. 게다가 테스트 날짜는 각 사람의 뒤쪽(나중) 구간에 몰려 있다.
- 즉 "처음 보는 사람"이 아니라 "같은 사람의 미래 날"을 맞히는 문제이다.

피험자별 train(파랑)·test(빨강) 날짜 분포입니다. test가 대체로 뒤쪽(미래)에 몰려 있습니다.
2. 검증(CV)부터
분석에 들어가기 전에, 사실 처음에 좀 헤멨습니다. 평범하게 교차검증을 돌렸더니 점수(OOF)가 0.58이 나와서 "오 괜찮네?" 하고 제출했는데, 리더보드는 0.61이 나왔습니다. 0.03이나 차이가 났습니다.
이유를 찾아보니 간단했습니다. 날짜를 무작위로 섞어서 학습/검증을 나누면, 어떤 날을 맞힐 때 그 바로 옆날이 학습 데이터에 들어가 버립니다. 사람 하루는 앞뒤로 비슷하니까, 모델이 사실상 커닝을 하는 셈입니다. 그래서 점수가 가짜로 좋게 나옵니다. 실제 테스트는 미래 날짜라서 옆날이 없었습니다.
그래서 검증 방식을 바꿨습니다. 피험자마다 날짜를 시간 순서대로 자른 뒤, 가장 마지막 구간(과거로만 학습하고 미래를 맞히는)을 검증에 쓰는 방식입니다. -> 이게 실제 테스트와 똑같은 조건이다. 앞으로 이 점수를 last-block 점수라고 부르겠습니다.
3. 평소값
타깃 Q1~Q3는 "그 사람 본인 평균보다 좋은 날이냐"로 정의돼 있습니다. 그래서 각 사람의 평소 경향이 굉장히 강한 단서였습니다. 실제로 "그 사람 과거 평균"만 가지고 예측해도 웬만한 모델만큼 나왔습니다.

피험자 × 지표별로 "1"이 나온 비율입니다. 예를 들어 id06은 수면지표(S1~S4)가 0.85~0.96으로 높은 편이고, id05는 S2·S3가 0.25·0.14로 낮은 편입니다. 이렇게 한쪽으로 기운 칸은 그 비율만 찍어도 어느 정도 맞습니다.
반대로 0.4~0.6(절반 근처)에 몰린 칸이 많은데, 이런 칸은 평소값으로는 거의 못 맞힌다는 뜻입니다. Q1만 봐도 id03은 0.85, id06은 0.15로 극단인 반면 나머지는 대부분 0.5 근처라, 사람마다 난이도가 제각각이다.
지표마다 평소값이 얼마나 통하는지도 달랐습니다. 같은 사람의 전반부와 후반부 비율을 비교해 봤습니다.
| 지표 | 전반부↔후반부 상관 | 의미 |
| S3 (입면지연) | r = 0.93 | 늘 비슷함 → 평소값이 거의 정답 |
| S1·S2·S4·Q1 | r = 0.6~0.66 | 평소값이 유효 |
| Q2 (피로)·Q3 (스트레스) | r = 0.01 / 0.09 | 같은 사람도 매번 달라서 평소값이 의미 없음 |
Q2, Q3는 "그날그날" 신호가 없으면 사실상 못 맞히는 지표라고 봐야 한다.
4. matplotlib로 신호 찾기
피처가 2,600개쯤 됩니다. 이 중에 뭐가 진짜 도움이 되는지 보려고, 각 피처가 0과 1을 얼마나 잘 가르는지(AUC)를 두 가지로 쟀습니다. 전체 데이터(full)에서, 그리고 미래 구간(last)에서입니다.
여기서 어떤 피처는 전체 AUC가 0.83으로 엄청 강해 보였는데, 미래 구간에서는 0.5(아무 의미 없음)로 뚝 떨어졌습니다. 알고 보니 결측이나 수집 패턴 때문에 생긴 가짜 신호였습니다. 그래서 전체와 미래 구간에서 둘 다 강한 피처만 진짜로 봤습니다. 야간 WiFi 개수, 최근 수면효율 추세, 어제 기상시각 같은 것들입니다.

수면효율(S2)을 가장 잘 가르는 피처들의 분포입니다. 파랑이 1, 빨강이 0인데 보시면 깨끗하게 안 갈립니다. 여기선 제일 좋은 피처(WiFi 야간 개수)조차 두 분포가 70%쯤 겹칩니다. 경향은 있는데 결정적인 구분은 안 되는 것이다.
이 그림이 사실상 0.60 벽의 정체를 보여준다. 신호가 흐릿하게 겹쳐 있으니, 아무리 모델을 잘 만들어도 한계가 있다.
5. 시도한 방법들과 실패한 것들
검증이 믿을 만해졌으니, 떠오르는 방법은 다 시험해 봤습니다. 결과는 거의 다 실패였습니다.
| 시도 | 결과 |
| 알고리즘 6종 (LightGBM / XGBoost / CatBoost / ExtraTrees / 로지스틱 / MLP / BiLSTM) | LightGBM이 제일 좋고 나머지는 다 그 아래였습니다 (딥러닝이 오히려 더 나빴습니다) |
| 새 피처 (워치 HRV, GPS 위치, WiFi '집' 지표 등) | 단변량으론 강했는데 모델에 넣으니 효과 없음 |
| 피처 선별, 앙상블, 확률 보정, 멀티타깃 스태킹 | 전부 무효 또는 악화 |
| 스무딩·클리핑·하이퍼파라미터 튜닝 | 전부 0.60 ±노이즈 |
새 피처가 왜 다 무효였는지 보면, 부스팅 트리가 이미 기존 피처에서 비슷한 신호를 다 뽑고 있어서였습니다. 비슷한 정보를 다른 모양으로 더 줘봐야 중복이고, 약한 지표엔 오히려 노이즈만 됐습니다. 무작정 피처를 늘리는 건 답이 아니라고 봅니다.
5-1 CV를 진짜 믿어도 되는 지 제출
로컬 점수만 믿기엔 불안해서, 성격이 다른 3개를 만들어 실제로 리더보드에 올려 봤습니다.
| 제출 | 로컬 CV 예측 | 실제 LB |
| 모델 + 평소값 블렌드 | ~0.60 | 0.6037 |
| 모델 단독 | ~0.60 | 0.6034 |
| 평소값 단독 | ~0.62 | 0.6225 |
셋 다 로컬 CV가 정확히 맞혔습니다. 이걸로 "로컬 점수 = 리더보드"가 확인됐고, 이후로는 제출을 아끼고 컴퓨터에서만 판단할 수 있게 됐습니다. 그리고 평소값 단독이 0.62인데 모델이 0.60이니, 모델이 일을 하는 것 같긴 합니다.
6. 모델이 아니라 데이터 문제
점수 차이는 거의 다 객관적 수면지표(S2·S3·S4)에 있었습니다. 이건 원래 침대 밑 센서가 잰 실제 수면인데, 우리한텐 그 센서 데이터가 없습니다. 그래서 워치 심박으로 수면을 복원해 보려고 야간 심박을 들여다봤습니다.
- 라벨 있는 밤의 야간 심박이 시간 범위 중앙값 2시간밖에 안 됐습니다.
- 33%의 밤은 기록이 30개도 안 됐습니다.
- 밤새 연속이 아니라 짧게 몰려서만 기록돼서, 수면 단계를 추정할 연속 신호가 없었습니다.
즉 외부에서 좋은 수면 분류 모델을 가져와도 넣을 입력 자체가 없는 상황이었습니다. 결국 0.60에서 막힌 건 모델이 아니라 데이터의 한계였습니다.
마무리
그리고 다른 분들의 공유 코드들도 분석을 해봤습니다. 다들 0.59~0.61에 몰려 있었습니다. 특히 B는 무작위 CV라 OOF가 0.58인데 실제 LB는 0.60으로, 제가 처음 겪은 그 착시와 똑같았습니다. 딥러닝(C)은 오히려 더 나빴습니다. 상위권은 아무도 코드를 올리지 않았습니다.
마지막으로 노이즈도 재봤습니다. 공개 리더보드는 테스트의 44%(약 110일)만 쓰는데, 같은 모델이라도 점수가 [0.561, 0.626] 사이로 출렁입니다(±0.033).
그래서 제 생각으론...0.55 점수의 상당 부분은 운이거나 공개 리더보드 과적합일 가능성도 있다고 봅니다. 일단 공부가 부족하고 더 방법을 찾아봐야겠습니다.
오늘은 matplotlib로 데이터를 뜯어보면서, 알고리즘·피처·앙상블·튜닝·외부데이터까지 다 시도해 봤습니다. 결론은 검증된 기준으로 이 데이터에서는 아직까진 0.60 근처가 한계라는 것이었습니다.
점수를 확 올리진 못했지만, 왜 안 되는지를 정확히 알게 된 날이었습니다. 내일은 이 분석을 바탕으로 외부 수면 데이터를 붙일 수 있을지를 더 파볼 생각입니다.
'5. [개인] 프로젝트 및 공모전 > 4-4 공모전' 카테고리의 다른 글
| [개인 공모전] DACON - 2026 성균관대 멀티모달 AI 챌린지 (1): 현재 Public 2위 (0) | 2026.06.02 |
|---|---|
| [개인 공모전] DACON - ETRI 휴먼이해 인공지능 논문경진대회 (1) (0) | 2026.05.31 |
| [KDT 공모전] 멀티 에이전트 카카오톡 챗봇 플랫폼: 트러블 슈팅 (2) (0) | 2026.04.11 |
| [KDT 공모전] 멀티 에이전트 카카오톡 챗봇 플랫폼: Edu-Sync AI (1) (0) | 2026.04.10 |