현재 <캐글 메달리스트가 알려주는 캐글 노하우>를 가지고 스터디를 하고 있어 매 장 정리해보고자 한다.
1. Keyword
이진 분류, AUC, 스태킹, GMM, Hist Feature
2. Instant Gratification 개요
Competition Summary
주제(대회 목적) | Code competition 피드백 |
대회 유형 | featured |
제출 방식 | code competition |
문제 유형 | 이진 분류(Binary Classification) |
데이터 타입 | 정형(Tabluar) |
평가 지표 | AUC(Area Under the Curve) |
-
- 캐글이 클라우드 환경을 도입하며, 다양한 방식의 컴페티션 시도
- 이 중 ‘2단계 컴페티션(Two-Stage Competition)’은 컴페티션 테스트 검증 과정을 두 단계로 나누어, 첫 단계에서는 공개(public) 테스트 셋, 다음 단계에서는 비공개(private) 테스트 셋으로 점수를 계산해 순위를 결정하는 방식
- 2단계 컴페티션 방식의 문제
- 검증 시 캐글의 과도한 리소스 사용
- 검증 완료 이전에 참가자들이 결과를 확인할 수 없음
- 참가자들이 제출한 코드가 제대로 작동하지 않음
- 과적합으로 인한 일반화 문제
- 문제를 해결하고자, 캐글에서는 현재 code competition 방식의 기반인 ‘Synchronous Kernel-Only Competition’ 방식 제시
- 컴페티션 기간 중에 노트북을 제출하면 공개 테스트 셋과 비공개 테스트 셋에 대해 모두 실시간으로 코드를 실행해서 점수를 계산하고, 대회 중에는 공개 테스트 셋 결과만 참가자에게 공개
- 이 방식을 다른 컴페티션에 도입하기 전, 캐글러들의 피드백 구하고자 해당 컴피티션 개최
- 평가 지표 → AUC대회 목적
- 평가 지표 → AUC
- AUC를 이해하려면 ROC 곡선을 이해해야 함
- ROC 곡선: 분류 모델이 얼마나 잘 예측하는지 보여주는 그래프
- x축은 False Positive Rate, y축은 True Positive Rate
- False Positive Rate: 실제 False인 데이터 중 모델이 True라고 예측한 비율(=위양성률)
- True Positive Rate: 실제 True인 데이터 중 모델이 True라고 예측한 비율 (=진양성률 또는 민감도)
- ROC 곡선의 각 포인트는 특정 임곗값(모델이 판단하는 기준)에서 분류 모델의 성능을 의미함
- 하지만, 곡선을 보고 어느 모델이 더 좋다고 판단할 수 없기 때문에 AUC(Area Under the Curve)가 필요한 것
- AUC는 ROC 곡선의 밑 면적. 예측을 잘 할 수록 곡선이 빨간색 화살표 방향으로 올라가며 1에 가까워지고, 예측을 잘하지 못할 경우 곡선이 회색 화살표 방향으로 이동하며 0.5에 가까워짐
- x축은 False Positive Rate, y축은 True Positive Rate
- 데이터셋
- 훈련 데이터 수: 262,144
- 공개(public) 테스트 데이터 수: 131,073
- 열(column) 수: 248
- 정답 열: Target(1과 0으로 구성되어 있는 이진 분류 문제)
- 행 이름은 의미를 알 수 없는, ‘-’으로 구분된 텍스트
3. 솔루션 분석
- 전처리: KernelPCA, Gaussian Mixture Model, Hist 피처 → 사이킷런 StandardScaler 사용해 표준화
- 1단계로 쓰인 모델: NuSVC, Quadratic Discriminant Analysis, SVC, KNeighborsClassifier, LogisticRegression → 사이킷런 StratifiedKFold 사용하여 교차검증
- 2단계로 쓰인 모델: 1단계에서 사용한 모델들을 두 가지 방식(Light BGM, MLP Classifier)으로 스태킹하여 앙상블 → 시드 앙상블 사용
- 책에서는 모든 모델을 설명하지 않고, 틀이 되는 ‘스태킹’과 중요 피처 찾은 과정 중심으로 기술
<스태킹>
- 스태킹(Stacking): 여러 알고리즘이 예측한 결과를 입력으로 받아 재학습하여 결과를 도출하는 방법
- 성능이 무조건 좋아지진 않지만 성능이 올라가는 경우가 더러 있기 때문에 미세한 성능차이가 중요한 데이터 해커톤에서 많이 사용됨(특히 기본 모델로 4개 이상을 선택해야 좋은 결과 있을 수 있음)
- 2단계 모델의 인풋으로는 두 가지 예측값이 들어감(1. 학습 데이터에 대한 예측값, 2 . 테스트 데이터에 대한 예측값), ****각 모델이 만든 예측값을 하나의 feature로 간주해 2단계 모델 학습
- 학습 데이터에 대한 예측값: 1단계 모델들을 3폴드 교차 검증 통해서 훈련한 후, 1단계 모델이 학습 데이터를 통한 예측값 저장.
- 테스트 데이터에 대한 예측값: 학습이 끝난 1단계 모델을 가지고 공개된 테스트 데이터에 대해서도 예측을 수행.
(스태킹 성능 올리는 방법)
- 모델에 들어가는 피처를 다르게 하여 다양성을 추가
- 같은 모델이더라도 파라미터를 다르게 함
- 다양한 모델 추가(트리 기반 모델, K-최근접 이웃, 신경망, 선형 모델 등)
- 2단계 모델의 입력에는 1단계 모델의 예측 값뿐만 아니라 원본 피처의 일부를 추가가능
- 2단계 모델을 다양하게 시도해보고 여러 모델의 결과를 다시 스태킹하거나 평균 값을 취할 수 있음
<핵심 피쳐 다룬 방식>
‘왜 `wheezy-copper-turtle-magic` 열의 각 데이터마다 모델을 따로 만들어줘야 하는가?’
- EDA때 확인했던 `wheezy-copper-turtle-magic` 열은 고유값이 512개로 다른 열들과 달리 매우 튀는 것 확인하고, 해당 값에 따라 모델을 따로 나눠줌
- `wheezy-copper-turtle-magic`의 값별로 target 값이 0일 때, 나머지 열들의 값 분포 확인: -10~10, -2~2 라는 두 가지 패턴으로 나뉨
- `wheezy-copper-turtle-magic`의 값별로 target 값이 0일 때, 훈련 데이터의 표준편차 확인(해당 피쳐의 변동성(데이터 분포) 확인하기 위해): 1과 3~4 형태로 분포 → 표준편차 값 2를 기준으로 나눴을 때 정확히 두 그룹으로 분류 가능 → 2보다 작은 열만 남기고 알고리즘 수행, 2보다 큰 열 남기고 알고리즘 수행 → 2보다 큰 피처가 유용한 피처
- `wheezy-copper-turtle-magic`의 그룹 내 표준편차가 2보다 큰 피처가 다른 그룹내 유용한 피처와 얼마나 겹치는지 확인 → 그룹마다 유용한 피처가 서로 잘 겹치지 않기때문에 결론적으로 그룹별로 따로 모델을 학습하는 것의 필요성 확인
<전처리에 사용된 모델>
- GMM(Gaussian Mixture Model): 여러 개의 정규 분포를 조합해서 데이터를 설명하는 모델
- 즉, 각 정규분포(클러스터)의 모수(평균, 분산) 등을 추정해야 함 → EM 알고리즘 사용
- 혼합계수: 각 클러스터의 비율
- 평균: 각 클러스터 중심
- 공분산 행렬: 클러스터의 모양과 크기
- EM 알고리즘
- '데이터가 어느 클러스터에서 나왔는지 확률적으로 추정하고, 이를 반복적으로 최적화 하는 과정'
- 숨겨진 변수가 있는 확률 모델에서 최적의 모수를 추정하는 알고리즘
- GMM처럼 데이터가 여러 개의 정규 분포로 혼합된 경우, 각 데이터가 어느 클러스터에 속할 확률을 모르는 상황에서 사용됨
- E step: 현재 모수를 사용해서 각 데이터가 어느 클러스터에 속할 확률 계산
- M step: E step 결과 사용해 혼합계수, 평균, 공분산(모수들) 계산
- E, M step 반복하고, 모수가 더 이상 크게 변하지 않을 때 수렴한다 생각하고 stop
- k-means는 데이터가 딱 하나의 클러스터에 속하지만, EM은 각 데이터가 여러 클러스터에 속할 확률 계산함/ Kmeans는 원형 클러스터도 가능하지만, GMM은 타원형 클러스터도 학습 가능/GMM은 보장된 글로벌 최적해가 아닌 지역 최적해에 수렴할 수도 있음
- 즉, 각 정규분포(클러스터)의 모수(평균, 분산) 등을 추정해야 함 → EM 알고리즘 사용
- Hist Feature: 히스토그램 기반의 특징을 만드는 기법
- 대표적으로 이미지 처리(ex. 이미지 색상정보 벡터 표현), 시계열 분석(ex. 특정 주식의 일별 수익률 히스토그램 변환해 패턴 분석), ML 피처 엔지니어링에 사용 → 스터디 3장(fraud detection)에 사용가능
- 빈도 수가 정답 값과 연관될 때 좋은 성능 보임
- 예) 사기 탐지에서 거래 금액 분포 시나리오
- 사기와 정상 거래를 구분하는 머신러닝 모델 만든다 가정
- 거래 금액을 보면, 정상거래는 평균적으로 10~500달러 범위에서 분포
- 사기 거래는 극단적으로 높은 금액(5000달러 이상)에서 빈도가 많음
- 모델이 학습할 수 있는 패턴거래 ID 거래 금액 히스토그램(구간별 개수) 사기 여부(target)
1 [5,10,0,0,0] 0(정상) 2 [0,2,8,3,5] 1(사기. 극단적으로 높은 값에 큰 값의 빈도수가 몰려있으므로)
- 예) 사기 탐지에서 거래 금액 분포 시나리오
4. 스텝별 정리사항
<EDA>
- EDA는 분석 맨 초기 단계에만 수행하는 것이 아니라 대회 내내 반복해야함
- 이진 분류의 경우 각 항목마다 정답 값 0,1에 대하여 히스토그램 그려보며 정답 값에 따라 분포 달라지는 것 있는지 기본적으로 확인
- 캐글에서는 데이터가 어떻게 만들어졌고, 공개 및 비공개 데이터가 어떻게 분포되어있는지 아는 것이 중요 → 이것을 알면 역으로 데이터를 생성(ex.make_classification)해서 교차 검증(Cross Validation)하는 전략 세울 수 있음
- 본문의 글쓴이는 코드 컴페티션에서 숨겨진 테스트 데이터를 추정하는 것은 바람직하지 못하며 제출횟수도 소모되기 때문에 추천하진 않는다고 함(하나를 제출하기 위해 많은 실험을 해야한다는 점을 알려주고 싶었다함)
(과정)
- 데이터가 어떤 형식으로 이루어졌는지 확인: 대부분의 데이터와 다른 타입 있다면 이 안에서 어떤 정보를 추출할 수 있는지 나열(본문 EDA에서 wheezy-copper-turtle-magic이라는 열 분석하는 과정 참고)
- 정답 값의 비율 확인: 정답의 불균형 여부를 확인한 뒤 이 점 고려해 모델 구성(value_counts() 기능 사용)
- 정답 값에 누출 없는지 확인
- 누출(leak): 훈련 데이터가 잘 섞여 있는지, 혹시 어느 부분에서 정답 값(1)이 많이 분포 하는 것은 아닌지 확인하는 것 → 정답 값 누적합 그래프 그려서 살펴보기
- NULL 값 확인: isnull 과 sum 사용해 파악 가능. 알고리즘에 따라 NULL값을 필수로 채워야 할 수도 → 생각 없이 값 채우기가 아니라, 이 NULL이 왜 생성되었고, 어떤 의미인지 먼저 파악
- 범주형 변수와 수치형 변수 나누어 생각
- 피처는 정답 값과 연관 지어 생각하는 것이 좋음: 특정 범주형 변수에 정답 값의 분포가 몰려 있거나, 수치형 변수의 분포를 살펴봤을 때 정답 값별로 분포가 다르면 좋은 변수가 될 가능성이 큼
<모델링>
- 영향력이 크다고 판단되는 카테고리 변수를 별도 모델링하는 방법 존재(특히 이 사례처럼 데이터 생성 집합의 키 값같은 피쳐라면, 하는 것이 합리적(변수 자체가 고유한 패턴을 담고 있고, 다른 변수와 독립적으로 분석해서 모델이 더 정교해질 수 있으며, 고유한 값이 많아서 일반적인 모델이 잘 활용하기 어려울 수 있음))
- 모델의 파라미터 찾는데 도움 주는 라이브러리: Hyperopt
- 모델 다 만들고 모델 간 상관관계 확인 필요: 상관관계가 낮을수록 모델이 유사하지 않음 = 앙상블 시 점수가 향상될 가능성이 큼(ex. 트리 계열 모델과 딥러닝 기반 모델을 섞을 때 성능 많이 향상됨)
- 모델 다 만들고 교차검증 시에, 모델이 검증 점수가 낮다고 해서 버리는 것이 아니라 어느 정도 점수를 만족하면 다양성을 추가하기 위해 해당 모델 사용할 수 있음(본문의 경우 96~97% 통과시킴)
<ETC>
- 대회가 진행되는 도중에 계속 디스커션과 노트북 모니터링하고 정리
- 대회에 참가할 때 단순히 점수를 올리기 위해 고도화된 모델을 돌린다는 생각보다는
- 회사나 기관에서 AI를 활용한 문제를 어떻게 정리했는지
- 문제를 풀기 위해 어떤 데이터를 수집했고 어떻게 구성했는지
- 다양한 AI모델을 어떤 방식으로 적용하는지
'Data > Data Science' 카테고리의 다른 글
[캐글 메달리스트가 알려주는 캐글 노하우] 3장 IEEE - CIS Fraud Detection 정리 (0) | 2025.03.03 |
---|