Loading the catalog…
Loading the catalog…
데이콘 스트레스 지수 예측 해커톤 회고 데이콘 AI 헬스케어 6기 해커톤(스트레스 점수 예측)에 팀으로 프로젝트를 진행했다. 지표는 MAE, 학습 데이터는 3,000행이다. 베이스라인 LB 0.2114에서 시작했고, 발표용 모델(#34)은 0.1260554858, 리더보드 제출용(#35)은 0.125381447까지 내려갔다. 실험 번호는 팀 실험기록표 기준이고, 내가 한 부분 위주로 적는다. 데이터 타깃은 stress_score (0~1), 피처는 17개다. 수치: age, height, weight, cholesterol, 수축기/이완기 혈압, glucose, bone_density, mean_working 범주: gender, activity, smoke_status, medical_history, family_medical_history, sleep_pattern, edu_level 어떤 피처도 타깃과 상관이 거의 없었다(|r| < 0.03). mean_working 은 34%가 결측이다. 모델을 바꿔도 점수가 크게 움직이지 않는 데이터였다. 1. LightGBM (CV 0.2117 → 0.1719) 실험 내용 CV LB #00 결측치 처리 + 파생변수 17개 0.2117 0.2114 #03 정규화 파라미터 0.1855 0.1769 #04 랜덤 탐색 0.1796 0.1693 #06 파생변수 19개 + 최적 파라미터 (효민) 0.1740 0.1772 #10 5-seed 앙상블 (효민) 0.1717 0.1765 #17 Optuna + 타겟인코딩 0.1719 미제출 가장 크게 내려간 건 정규화다(#00 → #03). 그 뒤로는 0.172 근처에서 더 안 내려갔다. 스태킹, 가중 블렌딩, OOF 앙상블은 단일 최고 모델을 못 넘었다. MLP는 0.2379, 타깃 log1p와 이종 모델 결합은 0.1914로 오히려 나빠졌다. CatBoost는 0.2130으로 LGBM보다 한참 나빴다. 시드 앙상블은 효과가 있었다. 모델 시드만 바꾼 5-seed(0.1794)보다 폴드 분할까지 시드별로 바꾼 10-seed(0.1769)가 더 좋았다. 2. SVR로 교체 (CV 0.1505) #19에서 age와 mean_working을 빼고 원본 14개 + BMI만 썼더니 0.1616이 나왔다. mean_working이 오히려 점수를 깎고 있었다. 여기서 모델을 SVR-RBF로 바꾸자 0.1505(LB 0.1529)가 나왔다. 신호가 있는 데이터라면 부스팅이 이겨야 하는데 거꾸로였다. 가까운 행의 값을 따라가는 커널 방식이 맞는 데이터라고 보고, 이후에는 커널 거리를 어떻게 만들지에 집중했다. #26에서는 mean_working 결측을 0으로 채우던 게 거리를 망치고 있다는 걸 확인했다. 이 피처를 빼고 파생변수도 안 썼다(SVR에서는 파생변수 19개가 효과가 없었다). CV 0.1476, LB 0.1285771. 3. mean_working을 별도 경로로 (LB 0.1285 → 0.1260) mean_working은 거리 피처로 쓰면 해롭다. 그런데 값별 타깃 평균을 보면 mw=6에서 0.315, mw=12에서 0.775로 많이 벌어진다. 신호는 있고, 커널 거리에 넣는 게 문제였다. SVR은 그대로 두고 mean_working 레벨별 추정치를 폴백으로 따로 두었다. #29 SVR 예측이 중앙값 근처(자신 없는 예측)일 때 폴백과 섞었다. LB 0.1272127. #32 폴백을 등위회귀로 바꾸고, 폴백이 중앙값과 충분히 다른 레벨에만 적용했다. 등위회귀 값이 mw=7~10과 결측(전체의 89%)에서 중앙값과 거의 같아서, 그 레벨에 폴백을 걸어도 중앙값을 다시 말할 뿐이었다. LB 0.1262152. #33 섞지 않고 둘 중 하나를 고르게 했다. 지표가 MAE인데 평균을 내는 방식은 제곱오차 기준으로 최적이다. SVR이 짝을 찾은 행과 못 찾은 행이 갈리는 분포에서는 둘 사이의 평균이 어느 쪽도 아닌 값이 된다. |예측−중앙값| 구간별로 보면 0.010 0.020에서는 폴백(MAE 0.1717)이 SVR(0.2165)을, 0.026 0.035에서는 SVR(0.1039)이 폴백(0.1916)을 이겼다. LB 0.1261960. #34 (발표) 숫자 거리 가중치를 log2(고유값 수) 로 주고 smoke_status, sleep_pattern, bmi를 빼서 32 → 25컬럼으로 줄였다. gamma는 2.0 → 2.8. CV 0.143177, LB 0.1260554858. 피처 제거는 순열검정(z=−2.00)과 무작위 제거 대조(z=−2.19)를 통과한 것만 채택했다. 4. 리더보드 제출: 커널 신뢰도로 라우팅 (#35) #34는 "예측이 중앙값 근처인가"를 폴백 신호로 썼다. #35에서는 이 신호를 "학습 행과의 최대 커널 값( max K(x, xi) )이 낮은가"로 바꿨다. SVR이 사실상 맞힌 행(오차 < 0.05)을 라벨로 두고 판별력을 재보니 AUC가 0.930( |예측−중앙값| )에서 0.958로 올랐다. SVR, 피처, gamma, 폴백 추정기는 #34와 같다. 문턱(tau)은 시드 42에서만 정하고, 평가는 보정에 안 쓴 시드 3개로 20-fold를 돌렸다. #34 #35 폴백 신호 예측−중앙값 + 레벨 정보 커널 최대값 폴백 적용 행 (OOF 기준) 약 160 약 970 20-fold MAE (3시드 평균) 0.125120 0.124887 3시드 모두 #35가 좋았다. 같은 개수를 무작위로 골라 폴백을 걸면 0.165까지 나빠져서, 라우팅 자체가 정보를 갖고 있다는 건 확인됐다. 최종 모델에서는 test 3,000행 중 1,010행(33.7%)에 폴백이 걸렸다. LB는 0.125381447 로 #34보다 0.000674 내려갔다. 20-fold CV 개선이 0.000233이었으니 CV가 말한 것보다 LB에서 더 많이 내려간 셈이다. 5. CV 개선이 LB로 얼마나 전달되나 실험할 때마다 CV는 내려가는데 LB가 같은 폭으로 따라오지 않았다. 변경 종류별로 정리하면 이렇다. 변경 종류 ΔCV ΔLB 전달률 #29 → #30 파라미터 재탐색 커널 기하 −0.000500 +0.0000221 0% #33 → #34 가중치+피처+gamma 커널 기하 −0.000695 −0.0001406 20% #22 → #26 전처리+튜닝 커널 기하 - −0.0023810 27% #32 → #33 블렌드 → 하드 스위치 게이트 −0.000137 −0.0000191 14% #29 → #31 폴백 추정기 (팀원) 폴백 구조 −0.000525 −0.000331 63% #31 → #32 게이트 조건 추가 게이트 구조 −0.000320 −0.000667 208% 처음에는 "구조 변경은 전달되고 파라미터는 안 된다"고 생각했는데 #33이 맞지 않았다. 그다음에는 통계적 유의성이 크면 전달된다고 생각했는데 #34가 맞지 않았다(#32와 유의성이 같은데 전달률은 10분의 1). 지금까지 맞는 설명은 하나다. 게이트·폴백 구조를 바꾸면 63 208% 전달됐고, 커널 거리의 기하를 바꾸면 0 27%였다. 가장 가까운 이웃의 커널 가중치가 그다음 이웃보다 약 1,970배라서, 거리를 다듬어도 얻을 게 적은 상태였다. 라우팅을 바꾼 #35도 같은 방향으로 맞아떨어졌다. CV 방식도 문제였다. 5-fold는 학습이 2,400행이라 최종 모델(3,000행)보다 작고, 이 데이터는 학습량이 늘수록 점수가 계속 좋아진다. 5-fold CV와 LB 사이 격차가 약 0.017이었고, 20-fold(2,850행)로 바꾸니 0.001로 줄었다. 중반부터는 20-fold와 여러 시드를 기준으로 판단했다. 6. 규정 관련 인코더 누수 : #20, #22에서 test를 포함해 fit한 인코더를 쓰고 있었다. train에서만 fit하도록 고쳤고, 이후 스케일러·인코더·레벨표는 모두 train(또는 학습 폴드)에서만 fit한다. 중복 행 : train 안에 숫자 컬럼만 조금 다른 근접 중복이 있었다. 일반 KFold가 이 쌍을 폴드 사이로 갈라놓아 CV가 낙관적으로 나왔고, 같은 쌍을 같은 폴드로 묶는 GroupKFold로 확인했다(train만 사용). record linkage 미사용 : test 행마다 가장 가까운 train 행의 정답을 복사하는 방식을 TA에게 두 번 문의했고, 두 번 다 쓰지 말라는 답을 받았다. 재현과 설명이 가능해야 하고 코드 검증에서 문제가 될 수 있다는 이유였다. 폐기했고 제출 노트북에는 쌍/중복 매칭 코드가 없다. #28 기각 : GroupKFold 기준에서만 개선으로 보였고 일반 KFold에서는 나빠졌다. 정리 트리 튜닝은 0.172에서 막혔고, 모델을 SVR로 바꾼 게 가장 컸다. mean_working은 거리 피처로는 해롭고 폴백 경로로는 이로웠다. CV가 0.0002 안팎으로 움직이는 구간은 LB를 예측할 수 없었다. 이 구간의 미세 조정은 효율이 낮았다. 이 대회에서는 모델보다 어떤 검증을 믿을지 정하는 데 시간을 더 썼다. 코드: https://github.com/qwemn223/HyoYiTae
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
[파이널 프로젝트]데이콘 스트레스 지수 예측 해커톤. 데이콘 스트레스 지수 예측 해커톤 회고 데이콘 AI 헬스케어 6기 해커톤(스트레스 점수 예측)에 팀으로 프로젝트를 진행했다. 지표는 MAE, 학습 데이터는 3,000행이다. 베이스라인 LB 0.2114에서 시작했고, 발표용 모델(#34)은 0.1260554858, 리더보드 제출용(#35)은 0.125381447까지 내려갔다. 실험 번호는 팀 실험기록표 기준이고, 내가 한 부분 위주로 적는다. 데이터 타깃은 stress_score (0~1), 피처는 17개다. 수치: age, height, weight, cholesterol, 수축기/이완기 혈압, glucose, bone_density, mean_working 범주: gender, activity,…
Open source