데이터 분석 연습+피드백 1일차
대회: 물류 유통량 예측 경진대회
링크: https://dacon.io/competitions/official/235867/data
물류 유통량 예측 경진대회 - DACON
분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.
dacon.io
한것
- eda
- baseline
- combine(eda 기반 baseline 다시 잡기)
받은 피드백
1. 어떠한 관찰을 발견했으면 파생변수로 어떻게 살릴까 까지 한 문장이라도 이어지면 완결된 사고가 될 것 같음
2. 카테고리가 많으니 CatBoost가 유용할거라는 가설도 좋음. 모델 특성을 이해하고, 초기 베이스라인 모델을 잡으려는 시도 자체도 좋은 방법. 단, 대신 다른 모델을 처음부터 배제하면 안됨. 전처리 방식에 따라 XGBoost나 LGBM이 더 잘 나오는 경우도 종종 있어서, 가설을 세웠으면 틀렸을 경우도 생각해서 검증하는 습관으로 이어지면 좋음.
3. 원핫 인코딩을 고려하다 보류하신 것도, 왜 안되는지 이해하고 내린 판단인지 확인이 필요함. 송하인(4229개) / 수하인(26875개)처럼 유니크값이 몇천~몇만 개인 컬럼에 원핫을 하면 컬럼이 그만큼 늘어나 메모리도 터지고 모델이 학습할 패턴도 오히려 희석됨.원핫 인코딩을 사용하면 안 좋은 케이스에 대해서 조사하길.
https://developer-j.tistory.com/35
원핫인코딩이 특히 불리한 경우
1. 카디널리티가 매우 높은 범주 고유값이 수천~수만 개면 차원이 폭증하고, 희소·메모리·학습 비용이 커집니다. (예: user_id, product_sku, zip code)2. 범주에 순서가 있는 경우 `낮음 3. 트리 기반 모델
developer-j.tistory.com
4. 분석에서 목적이 안 서 있음. 송하인-수하인 편중 비율을 파고든 구간은 사실상 호기심을 채우는 수준에서 모델로 이어지지 못했음.
분석을 하실 때 단순히 궁금해서라던지 데이터에 대해 전혀 모르는 상태이기 때문에 인사이트를 얻기 위한 탐색적 분석 수준이라면 빠르게 데이터 자체에 대한 이해를 가져가고, 지금 우리가 맞추고자 하는 것에서 벗어나지 않도록 하는게 좋음.
"이건 지금 궁금해서 파는거다"와 "이건 제출 성능에 영향이 갈 파생변수 또는 특성공학 작업이다"를 나눠서 붙여보기
대회나 실무에서나 목적 없이 재밌는걸 파는건 너무 좋지만, 시간은 다 갔는데 산출물이 없는 상황이 생깁니다!
5. 파생변수가 정말 필요했는지 검증 과정도 필요함.
말씀하셨던 CatBoost는 카테고리형 피처에 ordered target encoding을 자동으로 적용하고, 카테고리 조합(송하인×수하인 포함)까지 어느 정도 자동으로 만듬. 즉 송하인_총건수 같은 피처는 CatBoost가 내부적으로 이미 하고 있는 타깃 통계량과 상당 부분 겹치는 정보일 가능성이 높음. 수하인수·HHI는 단순 타깃 평균이 아니라 구조적 정보라 완전히 중복은 아니지만, 이것도 확인 없이 넣은 것.
6. (중요)파생변수 없이 raw ID만 넣은 버전과 비교(A/B)를 반드시 해볼것.
7. 다음엔 "지금 내가 나누는 기준이 같은 축인가?"부터 확인하기
8. 송하인 기준 비율로 거른 그룹, 다른 하나는 수하인 기준 비율로 거른 그룹이 각각 저비율 그룹(65.65%)과 고비율 그룹(77.86%)라고 나왔음. 이 둘을을 비교하며 "둘 다 커서 이해가 안 된다"고 했으나, 이건 계산 기준이 서로 다른 두 그룹이라 그럼. 하나는 송하인 기준 비율로 거른 그룹, 다른 하나는 수하인 기준 비율로 거른 그룹이라 여집합 관계가 아님. 다음엔 "지금 내가 나누는 기준이 같은 축인가?"부터 확인하기
송하인 A가 총 1000건을 배송하는데, 서로 다른 수하인 50명에게 20건씩 고르게 뿌린다고 해봅시다.
송하인 A 기준 비율(각 쌍마다): 20/1000 = 2% > "저비율" 그룹에 들어감 (송은 특정 수를 안 가림)
그런데 그 수하인 각각이 "평생 A한테서만" 물건을 받는다면(다른 송하인은 이용 안 함): 수하인 기준 비율 = 20/20 = 100% > "고비율" 그룹에도 들어감 (수는 특정 송에게 몰빵당함)
바로 이 똑같은 50개 쌍이 두 그룹에 동시에 속할 수 있는 겁니다.
실제로 이게 무슨 현실을 뜻하냐면:
송하인(발신 쪽)은 대형 유통업체/도매상처럼 "여러 수하인에게 넓게 뿌리는" 소수의 큰 주체들이고, 수하인(수신 쪽)은 각자 "거의 한 군데(그 도매상)에서만" 받는 다수의 개별 주체들이라는 구조예요. 대형 유통업체 하나가 수천 명의 개인 고객에게 배송하는데, 각 고객은 그 업체 한 곳에서만 주문하는 전형적인 다대일(N:1) 팬아웃 구조입니다.
저비율(송 기준) 그룹과 고비율(수 기준) 그룹의 실제 쌍 자체가 얼마나 겹치는지 교집합을 직접 확인해보세요.
겹치는 비율이 높게 나오면 방금 설명한
"소수의 큰 송하인 > 다수의 충성 수하인"
구조가 맞다는게 증명되는거고, 그러면 그 자체로 좋은 파생변수 아이디어가 됩니다.
9. 모델 관련 종합
CatBoost를 500 iteration 다 돌리셨는데 test RMSE가 23번째 이후 계속 나빠짐.(오버피팅). early_stopping_rounds를 명시적으로 안 걸어서 CatBoost가 내부적으로 알아서 best 시점으로 shrink해준 거지, 직접 통제하신 게 아님. early_stopping_rounds=50 정도를 직접 넣어서 오버피팅을 본인이 인지하고 멈췄다는 걸 코드로 보여줄것.
RMSE 수치 기록관리와 리딩도 해볼것.
10. 미션에서 이야기한 실험도 해볼것.
(1) 격자번호 자리수 분해로 제주/내륙 흐름 나누기, (2) 파생변수 있음/없음 A/B 비교
다음 번에는 파생변수를 만들지 않은 완전 기본 학습 제출물과, 만드신 파생변수들을 적용한 학습 제출물을 모두 만들어보시면 좋겠습니다.
정말 중요한 이야기인데, 수치상 상관관계가 나왔다는게 절대적인 인과관계가 있다는게 아니기 때문에, 파생변수가 정말로 유의미했는지 검증하는 과정이 반드시 필요해요.
분석 속에서 절대적인 인과관계가 검증되는게 아니라면 A/B테스트는 필수입니다!
방향이 틀린 것보다는 잘 다듬으면 좋을 것 같습니다!
이상한데? 라고 생각하신 부분을 놓치지 않고 확인하는 습관이 대부분의 사람들이 안하는 건데, 정말 좋은 것 같아요.
다음 단계에서는 이 좋은 직감을 왜 이게 좋았는지 숫자로 증명하는 습관으로 넓히면 재능을 더 살리실 수 있을 것 같아요.
다음 미션에선 깊이보다 검증을 끝낸다를 목표로 가봅시다!