How to win a data science competition Week2 - EDA
Coursera 강의인 How to Win a Data Science Competition: Learn from Top Kaggler Week2 EDA를 듣고 정리한 내용입니다
EDA : 탐색적 자료 분석, Exploratory data analysis
EDA
- EDA가 주는 것
- 데이터를 더 잘 이해할 수 있음
- 인사이트를 형성 가능
- 가설 생성할 수 있음
- 직관력을 가질 수 있음
- magic feature를 찾을 수 있음
- Visualiations
- Visualization -> Idea : Find pattern
- Idea -> Visualization : Hypothesis testing
- 모델링에 바로 들어가기보다 반드시 EDA를 먼저 해라!
Exploratory data analysis
- Get domain knowledge
- 대회 관련 도메인 지식 쌓기
- 위키피디아에 검색, 구글에서 기사 검색 등
- Check if the data is intuitive
- 직감에 기반해 데이터 체크
- 나이에 336이 있으면 이건 오타인가?
- 33인가? 36인가?
- Understand how the data was generated
- Train과 Test data의 분포 비교
- 데이터를 잘 섞었는지?
- 적절한 validation이 셋팅되야 함
Exploring anonymized data
- Anonymized data
- 보안상의 문제로 encode
- type of feature를 알 수 없게 만듬
- 우리는 의미를 알 수 없음
- decode 할 수 있지만, 거의 불가능
- 각각의 feature를 explore
- column의 의미지 추측
- column의 타입 추측
- Feature의 관계를 explore
- Feature간 관계 찾기
- Feature groups 찾기
histogram
을 그려보거나value_counts()
로 빈도 보기- Decoding 실습
feature_importance
보고 중요도 파악- mean, std 파악
- 같은 값이 반복되는 것이 보임
- 아마도 StandardScaler! Decode해보자
- unique value를 뽑고 sort -> 0.04332159가 반복
- 모든 값에 0.04332159를 나눈 후, 소수점을 정리
Visualizations
- Explore individual features
- Histograms :
plt.hist()
- Plot (index vs value) :
plt.plot(x, '.')
,plt.scatter(range(len(x)), x, c=y)
, 데이터가 적절히 섞였는지 확인 - Statistics :
df.describe()
,x.mean()
,x.var()
- Other tools :
x.value_counts()
,x.isnull()
- Histograms :
- Explore feature relations
- Pairs
- Scatter plots :
plt.scatter(x1, x2)
,pd.scatter_matrix(df)
- Corrplot :
df.corr()
,plt.matshow(...)
- Scatter plots :
- Groups
- Corrplot + clustering
- Plot (index vs feature statistics) :
df.mean().plot(style='.')
,df.srot_values().plot(style='.')
- Corrplot + clustering
- Pairs
Dataset cleaning and other things to check
- Duplicated columns
- 중복되는 column이라면 제거하는 것이 좋음(메모리 관점)
traintest.T.drop_duplicates()
- Duplicated rows
- 같은 label을 가지는지 체크
- 왜 이 값이 중복인지 이해하기
- Check if dataset is shuffled
- 만약 셔플되지 않았으면 data leakages를 찾을 수도 있음!
rolling_mean
과mean
비교
Validation
Validation and overfitting
- private 리더보드가 나오면 성적이 떨어지는 경우가 있습니다
- 2가지 원인
- 1) 경쟁자가 validation을 무시하고 public 리더보드에서 가장 좋은 제출물을 선택
- 2) 경쟁자가 public, private 데이터가 일치하지 않거나 private 리더보드에 데이터가 적은 경우
- private 데이터에 맞게 제출하는 것이 목표!
- Validation
- Unseen data에도 잘 맞췄으면 좋겠음
- 잘 맞추지 못한다면 모델의 실수를 측정하고 싶음
- 이 성능은 Train(past) 데이터와 Test(future) 데이터에 따라 다름
- 학습한 후, 모델의 성능을 평가하기 위해 validation을 사용
- Train(past), Validation(past), Test(future)
- Validation에서 성능이 잘 나온 것을 Best 모델로 하고 계속 튜닝을 하면 오버피팅이 될 수 있음(Test엔 잘 안맞는 모델)
- underfitting and overfitting
- 머신러닝의 오버피팅과 대회의 오버피팅은 살짝 다름
- Overfitting in general != overfitting in competition
- General
- capturing noize
- capturing patterns which do not getneralize to test data
- Competition
- low models’ quality on test data, which was unexpected due to validation socres
- 모델의 복잡도가 높을 경우, 낮추면 당연히 더 좋을 것이라 예상하지만 아닐 경우
Validation strategies
- How many splits should we make
- What are the most foten methods to perform such splits
- Validation 유형
- Holdout
- ngroups=1
sklearn.model_selection.ShuffleSplit
- Data를 Part A, B로 나눔
- A로 Train, B로 Predict
- B의 예측을 토대로 model quality 측정하고 하이퍼파라미터 진행. B의 quality를 최대화
- Use Case
- 충분한 데이터를 가지고 있을 때 유용
- 같은 모델을 다르게 split해서 성능을 보고싶을 경우
- Split 방식이 성능 추정에 민감한 영향을 미침
- K-fold
- ngroups=k
sklearn.model_selection.kfold
- Train data를 K folds로 나눔
- 각 fold마다 iterate: 현재 fold를 제외한 모든 fold에 retrain한 후, 현재 fold로 predict
- prediction값을 사용해 각 fold별 quality를 계산, 하이퍼 파라미터를 찾고, 각 fold의 quality 최대화
- loss의 mean과 variance를 측정해 개선을 파악할 수 있음
- 서로 다른 holdout을 k번 반복
- 모든 데이터를 training과 test에 쓸 수 있음
- Score를 평균
- 일반화 성능을 만족시키는 최적의 하이퍼 파라미터를 구하기 위한 모델 튜닝에 사용
- Strtified 방법을 사용해 샘플링하면 알고리즘이 더 개선되곤 함
- Leave-one-out
- ngroups=len(train)
sklearn.model_selection.LeaveOneOut
- 작은 데이터를 가지고 있을 때 유용
- 현재 샘플을 제외한 모든 샘플로 retrain, 현재 샘플로 predict
- 다른 알고리즘에 비해 실행 시간이 오래 걸림
- Holdout
- Stratification
- 충분한 sample이 있을 경우 shuffling data로 random split
- 그러나 sample이 충분하지 않으면 random split은 실패할 수 있음
- Train시 클래스 비율은 38%, 28%, 34%인데 Valid시 데이터셋은 24%, 44%, 32%라면 불균형 발생
- 각 클래스가 train set과 test set에 정확하게 분포되도록 데이터셋을 랜덤하게 나눔
- 유용한 상황
- 작은 데이터셋
- 불균형한 데이터셋
- Multiclass classification
Data splitting strategies
- 1) Random rows in validation
- 2) Time based split
- 3) Differend approached to validation
- 모델의 목적에 따라 적절한 split이 필요
- 파란색 선이 mean value
- 좌측의 경우 test보다 validation 때 더 나은 score 얻음
- 우측의 경우 test와 validation와 유사한 score 얻음
- Summary
- 다음과 같은 상황에 전략이 다를 수 있음
- 생성된 feature 사용시
- 모델이 해당 feature에 의존할 경우
- target leak일 경우
- Splitting data into train and validation
- Random, rowwise
- Row들이 독립적일 때 유용
- Row가 사람일 경우 독립적인 Case
- 가족이거나 같은 회사 동료일 경우, 가족이 하나의 카드를 사용할 경우는 의존적인 Case
- Timewise
- Time based
- 특정 일 이전의 데이터는 train, 이후의 데이터는 test
- Moving window validation
- By id
- Combined
- Date + Id, geographic
- Random, rowwise
- 다음과 같은 상황에 전략이 다를 수 있음
Problems occurring during validation
- 1) Validation stage
- inconsistency for data
- example : 1월이 2월보다 명절이 더 있어 판매량이 증가되는 데이터가 있음. 이 경우 1월 데이터로 2월을 예측하면?
- score와 최적의 파라미터가 다른 이유
- 너무 적은 데이터 (Too little data)
- 너무 다양하고 불일치한 데이터 (Too diverse and inconsistent data)
- Extensive validation
- 다른 KFold에서 얻은 score를 평균
- 1 split으로 모델을 만든 후, 나머지로 score 평가
- 2) Submission stage
- 우리가 종종 보는 현상
- LB score가 validation score보다 일관되게 상승/하락
- LB score가 valdation score와 관련이 없음
- Organizer가 split한 것을 분류하는 것은 매우 어려움
- 계속 제출해보며 기록
- leader board 점수를 또다른 validation fold로 보기!
- Other reasons
- too little data in public leaderboard
- 부정확한 train/test split
- train and test data가 다른 분포
- 우리가 종종 보는 현상
- LB shuffle
- 리더보드에서 랭킹이 급상승 또는 급하락할 경우
- Randomness
- Little amount of data
- Different public/private distributions
- Time-series 데이터에서 종종 발생
- Conclusion
- validation stage가 크게 다를 경우
- Average scores form different KFold splits
- Tune model on one split, evaluate score on the other
- Submission score가 local validation score와 일치하지 않을 경우
- Public LB가 너무 작은지 check
- 오버피팅인지 check
- 올바른 split 전략을 선택했는지 check
- train/test의 분포가 다른지 check
- LB shuffle의 원인
- Randomeness
- 적은 데이터
- public/private 분포가 다름
- validation stage가 크게 다를 경우
- Advices on validation in a competition
Data leakages
Basic data leaks
- Data leakage : 데이터 유출, 비현실적으로 좋은 결과를 내는 예상하지 못한 정보가 있는 경우
- 현실에선 사용하는 것이 말도 안되지만, 경진 대회에선 높은 점수가 목적이라 사용하기도 함
- 마감 전에 공개하면 대회가 흔들릴 수 있음
- 종류
- Leaks in time series
- Future picking
- 현실에선 우린 미래의 정보를 알 수 없음
- 대회에선 train/public/private으로 나뉨
- CTR tasks에서 유저 로그, 날씨 같은 경우 미래의 정보를 포함할 수 있음
- Unexpected information
- Meta data
- 파일 생성일, 이미지 해상도 등
- 특정 카메라에서 찍은 것이 모두 고양이일 수 있음
- Information in IDs
- 모델에 ID를 넣는 것은 이치에 맞지 않음(이미 target값과 연결되어 있으니)
- 그러나 언제나 그런 것은 아님 id는 hash의 결과일 수 있음
- id에 대해 신중히 다루기
- Row order
- Meta data
- Leaks in time series
Leaderboard probing and examples of rare data leaks
- ID와 밀접하게 연결된 카테고리는 LB probing에 취약함
- id가 같은 것의 라벨을 넣고 제출해보고 나온 결과로 역추적 가능
- Redhat and west nile competition
- Peculiar(이상한) examples
- Truly Native
- Data collection, Date proxies가 저장되어 있음. 추가적인 데이터를 수집해 feature 생성
- Expedia Hotel recommendations
- 유저가 예약할 호텔 그룹 예측
- distance feature에 data leak
- Reverse engineering으로 좌표를 추정
- Falvours of physics
- signal이 인위적으로 시뮬레이션됨
- Reverse engineering
- Pairwise tasks
- Data leakge in item frequencies
- Similarities from connectivity matrix
- Truly Native
Expedia challenge
- 강의 자료
- 강사님이 참여한 대회 중 가장 흥미로운 대회
- Data leakage 썰 풀어줌
- 호텔 그룹으로 라벨링 되었다는 것은 실제 호텔의 특성임을 기억!
- 유저와 호텔의 거리를 통해 추측할 수 있는 것들이 있음! Train과 test에서 많이 매칭됨
- user city와 destination distance pair
- 더 많은 match를 찾는 것
- 유저 도시, 호텔 국가, 호텔 도시 3개의 방정식으로 어느 그룹의 호텔이 몇 개나 있는지를 알 수 있음
- 리버스 엔지니어링을 하며 모든 도시의 좌표를 반복적으로 찾음
- 일부 도시는 바다 위에 있는것으로 보였는데, 알고리즘이 정확하지 않다는 것을 의미
- 3개의 방정식이 아닌 수백 수천개의 방정식과 수만개의 변수를 사용해 정확한 좌표를 얻음
- 모든 도시에 대해 그리드 셀을 남겨서 개수 count
- Out-of-fold로 feature generation. 2013<->2014
- Xgboost로 16시간 학습
- (그냥 진짜 리버스 엔지니어링으로 철저하게 데이터를 얻음.. 변태처럼 해야 3등하는구나)
Reference
카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 다양한 의견이 있다면 댓글 부탁드립니다 :)