[ML Study 2022] 4주차

Everafter·2022년 10월 25일
0

ML Study 2022

목록 보기
4/10

PROBLEM

Problem info

competition

Catch-me-if-you-can (Kaggle)

Theme

Binary Classification

metric

ROC AUC

Notes

  • 각 사이트 접속 시간이 기록되어 있는 세션 데이터가 주어지고, 그 중 사용자가 “Alice”인 세션을 예측하는 이진분류 문제입니다.
  • 데이터가 어렵진 않으나, 조금 새로운 형태의 데이터라 다양한 접근방식이 가능할 것 같습니다. 파싱하여 column generate도 가능하고, feature engineering 여지도 많습니다.
  • 평가지표는 ROC AUC인데, 단순 예측률이 아닌 이진 분류기의 threshold에 따른 성능을 전반적으로 평가하는 지표입니다. 저처럼 조금 생소하신 분은 refer 참고해주시면 되겠습니다.
  • 추가로 Kaggle 답게 여러 참고할 만한 코드들이 많습니다. 참고하면 좋을만한 커널 몇 개를 공유해드리니, 가급적 문제 풀이 완료 후 참고해주시면 되겠습니다.

refer

Review

  • 4주차 세션은 내가 맡아 진행했다. 주제가 '분류'인데 너무 기괴하거나 단순하지 않은 데이터를 다루고, 참여자가 많은 대회를 찾았다. 그렇게 캐글을 뒤진 끝에 조금은 색다른 형태의 데이터를 찾았다.
  • 각 사이트들의 접속시간이 기록된 세션 데이터가 주어지고, 그 중 'Alice'가 사용한 세션을 예측하는 문제이다.
  • 같은 속성의 column(site, time)이 10개 반복되고, 1~10개 사이의 접속 사이트가 기록된다. 10개 미만 접속한 경우에는 나머지 column은 공백이 된다.
  • 막상 데이터를 받아들었을때 대략 난감하다. site의 cardinality도 매우 큰 편이고, 시계열 데이터라 섣불리 모델에 때려박을 수 없다.
  • 접근은 크게 두 갈래다. 'Alice'의 1. 접속 사이트 패턴 2. 접속 시간 패턴
  • 주로 접속하는 사이트에만 집중하여 상위 n개만 추려 데이터를 간소화 한다던지, 접속 시간대를 시간별, 요일별 등으로 정리하여 추이를 본다던지 하는 접근방식이 모두 유효했다.
  • 높은 점수를 얻은 커널은 모두 기본적인 접근 방식은 비슷했다. 시간대 정보를 뽑아 feature generation을 하고, site id 배열에 대해서는 CounterVectorizer 등 임베딩 기법을 이용했다. 이후 logistic regression 정보만 돌려도 높은 점수 획득이 가능했다.
  • 꽤나 논의가 됐던 내용으로, 공백으로 주어진 사이트 정보를 어떻게 impute할 것인가 였는데 결국 0으로 채우는 것 외에 앗 하는 아이디어는 없었다.
  • 문제가 단순하여 크게 어렵지 않을것이라 예상했는데, 스터디원분들 모두 꽤나 고전하였다. 그래도 새로운 형식의 데이터를 다뤄 본 것이라 다들 만족하였다.
  • Topic도 준비해서 발표했는데, 아무래도 categorical feature의 처리에 대해 고민이 잦던 터라 hashed feature에 대해 정리했다. '머신러닝 디자인 패턴'에 있는 내용을 정리한것일 뿐이지만, 나름 열심히 했다...! 스터디원분들 반응도 나쁘지 않았다. 네이스~

스터디 논의 내용

  • CountVectorizer의 사용. 본래 NLP 분야에서 단어의 출현 빈도로 문장을 벡터화 시키는 기법인데, 일련의 site id 배열을 문장으로 취급하여 벡터화. 사이트 이용 패턴 정보를 유지시키므로, 본 문제에서 critical한 성능을 냄.
  • 공통적으로 세션의 시작, 종료 시간, duration, 년, 월, 요일 데이터 등을 feature로 뽑아내고, 계절, 낮/밤, 평/휴일의 구분을 두기도 함.
  • Alice의 사용패턴에 집중하여, Alice가 사용한 상위 n개의 site를 주안으로 둔 아이디어가 많았음.극단적으로 Alice가 사용하지 않은 site가 포함된 row는 drop하는 경우도.
  • site의 cardinality가 너무 크므로, 사용빈도가 큰 상위 n개 site만 고려하는 것도 생각해봤으나, n=5000에서 겨우 90%의 데이터셋을 포함하므로 의미없다고 판단.
  • 세션당 site가 10개 미만인 경우 Na가 발생하는데, 이를 0으로 두는 것에 대한 논의가 진행. row에 대해 최빈값으로 처리 → test에 적용할 수 없음(data leakage). 0으로 두면 id=0인 사이트에 접속했다고 하는 꼴이라 적절치 않다는 의견. 모델이 이를 구별할 수 있을지.
  • 실제 상위 빈도의 site 도메인을 관찰할때 유의미한 발견이 있을지 → alice와 마찬가지로 모두 youtube, google, facebook 관련 site가 최상위권.
  • XGBoost vs Logistic ? → preprocessing / feature engineering만 잘 수행되면 logit으로 충분, 학습시간 단축. 보통의 경우 XGBoost의 성능이 우세.
  • cross-val에서 시계열 데이터를 위한 TimeSeriesSplit(sklearn) 메서드 활용.
  • target = 1의 데이터 비율이 매우 적어 imbalance-XGBoost 모듈 사용 → 효과 없었음.

Topic

내용이 길어 따로 블로그에 글을 썼다.
Hashed Feature

Code

Github

0개의 댓글