분석시각화 대회 코드 공유 게시물은
내용 확인 후
좋아요(투표) 가능합니다.
데이콘 Basic 고객 지원 등급 분류 : 도움이 필요한 고객을 찾아라!
score 향상을 위한 각종 트릭 공유
EDA로 올려놓은 내용이 상당히 난잡하기에
score 향상에 도움이 됐던 몇 가지 트릭을 공유합니다.
-feature engineering은 무턱대고 하는 것이 아닙니다. 상황에 따라 불필요한 경우가 있습니다.
(예를 들어 행 개수가 매우 적거나 원본 데이터의 신호가 없는 경우 > 모든 대회를 시작하기 전 이것부터 분석하기 바랍니다.
간혹 합성 데이터로 구성되어 원본 데이터에 유의미한 신호가 없는 경우가 있습니다)
전체 행(30k)을 50~300 정도로 나눈 값이 feature 개수의 경험적 최댓값이라고 합니다.
(Kaggle에서 배운 내용입니다)
이 대회의 경우 60~400개의 feature까지 안전한 값으로 생각됩니다.
제 경우 약 50개의 추가 feature도 안정적이었습니다.
그 이상은 overfitting 우려가 있지만,
최대한 많은 feature engineering을 시도해 보시는 걸 권장합니다.
이때 데이터 누수에 항상 주의하세요.
2.Class Imbalance
-모든 대회에는 클래스 불균형이 있기 마련입니다.
특히 이번 대회는 클래스 불균형 해소가 직접적으로 score에 영향을 미치니 다양한 방법을 시도해 보세요.
특정 방법들은 효과가 약할 겁니다. 왜 안 되는지도 고민해 보세요.
SMOTE 등의 증강 기법을 처음부터 쓰는 건 권장하지 않습니다.
제 경험상 SMOTE는 결과가 안 좋은 케이스가 많기에 항상 후순위로 두곤 합니다.
3.Overfit 관리
Optuna를 돌리다 보면 종종 Overfitting과 마주하게 됩니다.
Public score 상으로는 점수가 잘 나와도 결과적으로 private에서 뒤집히게 됩니다. (제 이전 대회들이 그랬습니다)
이를 최대한 방지하는 방법은 아래와 같습니다. 본질적으로 overfitting을 방지하는 법은 없지만, 몇 가지 트릭들이 존재합니다.
제 경험 상 이번 대회는 overfitting에서 다소 자유로운 편입니다.
대회 train 데이터가 적을수록, LB를 믿지 말고 CV를 신뢰하세요.
(마찬가지로 Kaggle에서 배운 내용입니다)
4.KFold의 위험성
KFold는 항상 정석이지만,
"데이터가 적을수록 fold split에 따른 randomness가 비약적으로 상승"합니다.
다시 말해 그냥 무턱대고 KFold로 학습하게 되면 그러한 랜덤성에 몸을 맡기게 되는 것이고,
그 fold split으로만 최적화를 하게 되면 당연히 과적합 위험성이 높아집니다.
이를 방지해 주는 방법들을 고민해 보세요.
5.전체 데이터로 학습
전체 데이터로 학습하면 때로는 score가 비약적으로 높아지기도 합니다.
매번 시도해 볼만한 테크닉 중 하나입니다.
(물론 CV score 추적이 안 되니 제출용으로만 사용합니다)
1. 전력 대회를 말씀하시는 것 같은데 시계열은 일반 split과는 다른 split을 써야 하는 걸로 알고 있습니다. 변수 개수는 최대값이라는 개념이지 그보다 적은 값에서 최적값이 나오는 일도 빈번하니, CV-LB 상관관계를 추적하면서 처참하게 score가 하락하는 경우에는 과적합 위험이 크다는 개념으로 이해하시면 될 듯합니다. 일반적으로는 원본 데이터의 신호가 모두 유효하느냐를 기준으로 생각합니다. EDA를 해보고 판단해 보시면 됩니다.
2. leave-one-out과 leave-one-in 모두 비슷한 방식이라 생각되지만, 과적합 우려가 있는 선에서는 다소 보수적으로 접근해야 한다고 생각합니다. feature selection에 정답은 없다고 생각합니다. (트리 모델이 참 오묘한 이유이기도 합니다) 데이터셋과 상황에 따라 유효한 방법이 다르기 때문으로 생각됩니다.
(개인적으로는 transformer와 기타 딥러닝 아키텍처 등이 빨리 발전해 tabular 데이터셋에서 feature selection을 하는 날이 없어졌으면 좋겠습니다)
3. 데이터가 아주 적어 과적합 우려가 클 때(일반적으로 10k 미만)는 kfold가 정석이 아닙니다.
말씀드렸다시피 split에 따른 randomness가 심하기 때문입니다. 이 경우 상황에 따라 randomsplit이 안전할 수 있습니다.
이를테면 0.8:0.1:0.1(train:val:test) 비율로 나누고, 이를 여러 seed 평균 또는 앙상블로 안정화하는 방식도 있습니다.
num-replicate라고도 합니다.
과적합 지표는 모델에 따라 매우 달라 일반론은 없습니다만, 트리 모델의 경우 분할 기준과 결정 경계를 집중적으로 보시면 됩니다.
이를테면 이상치가 많은 데이터에서 트리 모델은 샘플 수가 아주 적은 이상치 데이터에도 분할을 할당하게 되는 문제가 종종 발생합니다.
이 경우 optuna를 돌릴 때부터 신호가 올 것입니다. 이를테면 3~20 depth를 search space로 정했다면, 20에 최적화가 되는 것입니다.
그리고 search space를 더 늘려 30까지 늘리면, 30에 최적화가 될 겁니다.
이럴 때는 모델로 하여금 일정 개수 이하의 데이터에는 리프를 생성하지 않게 끔 강제하는 등
좀 더 일반화된 분할을 유도할 필요가 있습니다. (예를 들어, min_samples_leaf로 데이터 분할의 하한선을 두는 식입니다)
정확한 원인을 찾는 게 필요합니다.
많은 공부가 됐습니다! 감사드립니다!
너무 좋은 정보네요 분석이나 모델링 시에 참고하겠습니다. 감사합니다!
감사합니다. 대회 좋은 결과 있길 바랍니다.
데이콘(주) | 대표 김국진 | 699-81-01021
통신판매업 신고번호: 제 2021-서울영등포-1704호
직업정보제공사업 신고번호: J1204020250004
서울특별시 영등포구 은행로 3 익스콘벤처타워 901호
이메일 dacon@dacon.io |
전화번호: 070-4102-0545
Copyright ⓒ DACON Inc. All rights reserved
글 잘 보았습니다. 질문이 몇가지 있습니다!
1. 다른종류의 데이터 이야기지만 시계열은 굉장히 데이터가 많은데 시계열쪽도 변수 갯수에서 비슷하게 생각하실까요? 예를 들면 train+test 데이터는 500,000개지만 전처리를 거친 후에 실제 학습시킬 데이터 수는 20,000개일 경우엔 어느 데이터수에 맞춰서 변수갯수를 고르시는지 의견이 궁금합니다.
2. 변수를 고를 때 저는 feature의 중요도를 기준으로 후진소거법을 하는데 feature seletion같은건 어떻게 생각하시나요??
3. 과적합의 경우엔 모든 상황에서 똑같진않겠지만 기본적으로 어떻게 방지하시는지도 궁금합니다. 특히 옵튜나의 경우 trial 횟수가 많을수록 train셋에 과적합되는 경우가 많은데 1번은 아마 탐색 범위라고 생각이 됩니다만 과적합 지표 등을 어떻게 판단하시는지도 궁금합니다.