본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 6. · 11 Views
Kaggle 경진대회 도전 완벽 가이드
데이터 과학 입문자를 위한 Kaggle 경진대회 참가 가이드입니다. 플랫폼 가입부터 리더보드 상위권 진입까지, 실무에서 바로 활용할 수 있는 머신러닝 기법을 단계별로 안내합니다.
목차
1. Kaggle 플랫폼 가입 및 탐색
김개발 씨는 회사에서 데이터 분석 업무를 맡게 되었습니다. 선배가 "Kaggle에서 연습 많이 해봐, 실력이 금방 늘어"라고 조언해 주었지만, 막상 사이트에 들어가니 어디서부터 시작해야 할지 막막했습니다.
수많은 대회와 데이터셋이 눈앞에 펼쳐져 있었습니다.
Kaggle은 전 세계 데이터 과학자들이 모여 경쟁하고 학습하는 플랫폼입니다. 마치 개발자들의 GitHub처럼, 데이터 과학자들에게는 Kaggle이 자신의 실력을 증명하고 성장시키는 놀이터와 같습니다.
가입 후 프로필을 설정하고 기본 기능을 익히면 본격적인 도전을 시작할 수 있습니다.
다음 코드를 살펴봅시다.
# Kaggle API 설치 및 기본 설정
# 터미널에서 실행: pip install kaggle
# kaggle.json 파일을 ~/.kaggle/ 디렉토리에 배치
import os
os.makedirs(os.path.expanduser('~/.kaggle'), exist_ok=True)
# API를 통한 대회 목록 조회
from kaggle.api.kaggle_api_extended import KaggleApi
api = KaggleApi()
api.authenticate() # kaggle.json 인증 정보 사용
# 현재 진행 중인 대회 목록 확인
competitions = api.competitions_list()
for comp in competitions[:5]:
print(f"대회명: {comp.title}")
print(f"마감일: {comp.deadline}")
print("-" * 40)
김개발 씨는 입사 6개월 차 주니어 개발자입니다. 최근 회사에서 머신러닝 프로젝트가 늘어나면서, 팀장님이 데이터 분석 역량을 키워보라고 권유했습니다.
"Kaggle이라는 곳이 있는데, 거기서 실전 경험을 쌓으면 많은 도움이 될 거야." 집에 돌아온 김개발 씨는 Kaggle 웹사이트에 접속했습니다. 화면에는 수백 개의 대회가 나열되어 있었고, 리더보드에는 전 세계 참가자들의 점수가 실시간으로 업데이트되고 있었습니다.
"와, 이게 뭐지?" 처음 보는 광경에 당황스러웠습니다. 그렇다면 Kaggle이란 정확히 무엇일까요?
쉽게 비유하자면, Kaggle은 마치 요리 경연 대회장과 같습니다. 주최 측에서 재료(데이터)를 제공하면, 참가자들이 각자의 레시피(알고리즘)로 최고의 요리(예측 모델)를 만들어 겨루는 것입니다.
심사위원(채점 시스템)이 맛(정확도)을 평가하고, 가장 맛있는 요리를 만든 사람이 우승합니다. Kaggle에서 가장 먼저 해야 할 일은 계정 생성입니다.
Google 계정으로 간편하게 가입할 수 있습니다. 가입 후에는 프로필을 꼼꼼히 작성하는 것이 좋습니다.
다른 Kaggler들과 네트워킹할 때 프로필이 명함 역할을 하기 때문입니다. 다음으로 중요한 것은 Kaggle API 설정입니다.
웹 인터페이스만으로도 충분히 대회에 참가할 수 있지만, API를 활용하면 데이터 다운로드와 제출을 자동화할 수 있습니다. 마치 은행 업무를 창구에서 볼 수도 있지만, 인터넷 뱅킹을 쓰면 더 편리한 것과 같습니다.
위의 코드를 살펴보겠습니다. 먼저 pip install kaggle 명령으로 Kaggle 라이브러리를 설치합니다.
그 다음 Kaggle 웹사이트의 Account 설정에서 kaggle.json 파일을 다운로드받아 지정된 경로에 저장합니다. 이 파일이 바로 API 인증의 열쇠입니다.
KaggleApi 객체를 생성하고 authenticate() 메서드를 호출하면 인증이 완료됩니다. 이제 competitions_list()로 현재 진행 중인 대회 목록을 가져올 수 있습니다.
대회명, 마감일, 상금 정보까지 한눈에 확인할 수 있습니다. 실제 현업에서는 어떻게 활용할까요?
많은 기업에서 채용 시 Kaggle 프로필을 참고합니다. Kaggle Rank와 획득한 메달은 데이터 과학자로서의 실력을 객관적으로 보여주는 지표가 됩니다.
실제로 Kaggle Master나 Grandmaster 타이틀을 가진 사람들은 업계에서 높은 평가를 받습니다. 하지만 주의할 점도 있습니다.
초보자들이 흔히 하는 실수는 처음부터 상금이 큰 대회에 도전하는 것입니다. 이런 대회는 경쟁이 치열하고 난이도가 높아 좌절감만 느끼기 쉽습니다.
따라서 처음에는 Getting Started 또는 Playground 카테고리의 대회로 시작하는 것이 현명합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
API 설정을 마친 김개발 씨는 드디어 Kaggle의 세계에 첫 발을 내디뎠습니다. "생각보다 어렵지 않네!" 이제 본격적으로 대회를 선택할 차례입니다.
실전 팁
💡 - Kaggle Notebooks(구 Kernels)를 적극 활용하세요. 무료 GPU/TPU를 제공하며 별도 환경 설정이 필요 없습니다.
- Discussion 탭에서 다른 참가자들의 인사이트를 얻을 수 있습니다. 적극적으로 참여하면 학습 속도가 빨라집니다.
2. 대회 선택 및 데이터 이해
Kaggle 가입을 마친 김개발 씨 앞에 수백 개의 대회가 펼쳐져 있습니다. "Titanic?
House Prices? 도대체 어떤 걸 선택해야 하지?" 선택의 기로에 선 김개발 씨는 옆자리 데이터 분석가 이선배 씨에게 조언을 구했습니다.
대회 선택은 Kaggle 여정의 첫 번째 관문입니다. 자신의 실력과 목표에 맞는 대회를 고르고, 제공된 데이터를 철저히 이해하는 것이 성공의 기반입니다.
마치 마라톤 코스를 미리 답사하는 것처럼, 데이터의 구조와 특성을 파악해야 올바른 전략을 세울 수 있습니다.
다음 코드를 살펴봅시다.
import pandas as pd
import numpy as np
# Kaggle API로 타이타닉 데이터 다운로드
# kaggle competitions download -c titanic
# 데이터 로드 및 기본 정보 확인
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
# 데이터 크기 확인
print(f"훈련 데이터: {train.shape[0]}행, {train.shape[1]}열")
print(f"테스트 데이터: {test.shape[0]}행, {test.shape[1]}열")
# 기본 통계 정보
print("\n수치형 변수 통계:")
print(train.describe())
# 결측치 확인
print("\n결측치 현황:")
print(train.isnull().sum())
# 타겟 변수 분포
print(f"\n생존율: {train['Survived'].mean():.2%}")
"초보자라면 일단 Titanic 대회부터 시작해봐." 이선배 씨의 조언이었습니다. Titanic 대회는 Kaggle의 입문 코스로, 승객 정보를 바탕으로 생존 여부를 예측하는 문제입니다.
김개발 씨는 고개를 갸웃거렸습니다. "왜 하필 타이타닉이에요?" 이선배 씨가 웃으며 대답했습니다.
"데이터가 작고, 문제가 직관적이고, 참고할 자료가 엄청나게 많거든. 실패해도 배울 게 많아." 대회를 선택할 때 고려해야 할 요소는 여러 가지입니다.
첫째, 대회 유형입니다. Getting Started는 연습용, Featured는 실전 대회, Research는 연구 목적입니다.
초보자는 Getting Started나 Playground 대회로 시작하는 것이 좋습니다. 둘째, 평가 지표를 확인해야 합니다.
대회마다 정확도(Accuracy), RMSE, AUC, F1-Score 등 다양한 지표를 사용합니다. 평가 지표에 따라 모델 최적화 방향이 완전히 달라지기 때문에 반드시 숙지해야 합니다.
셋째, 마감일과 상금입니다. 물론 상금에 연연할 필요는 없지만, 마감일은 중요합니다.
충분한 시간을 갖고 도전할 수 있는 대회를 선택하세요. 대회를 선택했다면 이제 데이터 이해 단계입니다.
이것은 마치 의사가 환자를 진찰하는 것과 같습니다. 증상(데이터)을 제대로 파악해야 올바른 처방(모델)을 내릴 수 있습니다.
위 코드에서 가장 먼저 하는 일은 데이터를 로드하고 크기를 확인하는 것입니다. train.shape로 행과 열의 수를 파악합니다.
Titanic 데이터는 891명의 승객 정보와 12개의 변수로 구성되어 있습니다. describe() 메서드는 수치형 변수의 기본 통계를 보여줍니다.
평균, 표준편차, 최솟값, 최댓값 등을 한눈에 확인할 수 있습니다. 이를 통해 변수의 분포와 이상치 존재 여부를 가늠할 수 있습니다.
결측치 확인은 필수입니다. isnull().sum()으로 각 열의 결측치 개수를 파악합니다.
Titanic 데이터에서는 Age, Cabin, Embarked 열에 결측치가 있습니다. 이 결측치를 어떻게 처리하느냐가 모델 성능에 큰 영향을 미칩니다.
마지막으로 타겟 변수의 분포를 확인합니다. 생존율이 38% 정도라면 불균형이 심하지 않은 편입니다.
만약 타겟 클래스가 1%와 99%로 극단적으로 불균형하다면 다른 접근법이 필요합니다. 실무에서도 마찬가지입니다.
어떤 예측 모델을 만들든 데이터 이해가 선행되어야 합니다. 데이터를 충분히 탐색하지 않고 바로 모델링에 뛰어드는 것은 지도 없이 등산하는 것과 같습니다.
김개발 씨는 데이터를 천천히 살펴보았습니다. "Age에 결측치가 177개나 있네...
이걸 어떻게 처리하지?" 새로운 고민이 생겼지만, 그것은 다음 단계에서 해결할 문제였습니다.
실전 팁
💡 - 대회 페이지의 Data 탭에서 각 변수의 설명을 꼼꼼히 읽으세요. 도메인 지식이 모델 성능을 좌우합니다.
- 상위권 참가자들이 공개한 Notebook을 참고하되, 그대로 복사하지 말고 원리를 이해하려고 노력하세요.
3. EDA 및 특성 엔지니어링
데이터를 로드한 김개발 씨는 바로 모델을 만들려고 했습니다. 그러자 이선배 씨가 말렸습니다.
"잠깐, 아직 EDA도 안 했잖아. 데이터를 제대로 들여다봐야 어떤 특성이 중요한지 알 수 있어." 김개발 씨는 EDA라는 말을 처음 들었습니다.
**EDA(Exploratory Data Analysis)**는 탐색적 데이터 분석으로, 데이터의 패턴과 관계를 시각화하고 분석하는 과정입니다. 특성 엔지니어링은 기존 데이터에서 새로운 유의미한 변수를 만들어내는 작업입니다.
이 두 과정이 모델 성능의 80%를 결정한다고 해도 과언이 아닙니다.
다음 코드를 살펴봅시다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 생존율과 성별의 관계 시각화
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
sns.barplot(data=train, x='Sex', y='Survived')
plt.title('성별에 따른 생존율')
# 객실 등급과 생존율
plt.subplot(1, 2, 2)
sns.barplot(data=train, x='Pclass', y='Survived')
plt.title('객실 등급에 따른 생존율')
plt.tight_layout()
# 특성 엔지니어링: 가족 크기 변수 생성
train['FamilySize'] = train['SibSp'] + train['Parch'] + 1
train['IsAlone'] = (train['FamilySize'] == 1).astype(int)
# 이름에서 호칭 추출
train['Title'] = train['Name'].str.extract(r' ([A-Za-z]+)\.')
print(train['Title'].value_counts())
# 나이 결측치를 호칭별 중앙값으로 대체
train['Age'] = train.groupby('Title')['Age'].transform(
lambda x: x.fillna(x.median())
)
"EDA가 뭔가요?" 김개발 씨의 질문에 이선배 씨가 답했습니다. "쉽게 말해서 데이터를 이리저리 들여다보는 거야.
그래프도 그려보고, 통계도 내보고. 그래야 데이터가 무슨 이야기를 하는지 들을 수 있거든." EDA는 마치 탐정이 사건 현장을 조사하는 것과 같습니다.
단서(데이터)를 꼼꼼히 살펴보고, 패턴을 찾고, 가설을 세웁니다. 섣불리 결론을 내리지 않고 증거를 모읍니다.
Titanic 데이터에서 가장 먼저 확인할 것은 생존율과 다른 변수의 관계입니다. 위 코드에서 성별에 따른 생존율을 막대 그래프로 그렸습니다.
결과를 보니 여성의 생존율이 남성보다 훨씬 높습니다. "여성과 아이 먼저"라는 원칙이 데이터에 그대로 반영된 것입니다.
객실 등급(Pclass)에 따른 생존율도 흥미롭습니다. 1등석 승객의 생존율이 가장 높고, 3등석이 가장 낮습니다.
부유한 승객이 더 좋은 위치의 객실에 머물렀고, 탈출 경로에 더 가까웠기 때문입니다. 이런 분석을 통해 어떤 변수가 중요한지 파악할 수 있습니다.
Sex와 Pclass는 생존 예측에 매우 중요한 변수임이 분명합니다. 이제 특성 엔지니어링 차례입니다.
기존 변수를 조합하거나 변환하여 새로운 변수를 만드는 과정입니다. 마치 요리사가 기본 재료로 새로운 소스를 만들어내는 것과 같습니다.
FamilySize 변수는 형제자매 수(SibSp)와 부모자녀 수(Parch)를 더하고 본인을 포함해 만들었습니다. 가족이 함께 탄 승객은 서로 도우며 탈출했을 수도 있고, 반대로 가족을 찾느라 탈출이 늦어졌을 수도 있습니다.
IsAlone 변수는 혼자 탄 승객인지 여부를 나타냅니다. 복잡한 가족 크기를 단순한 이진 변수로 변환한 것입니다.
가장 창의적인 부분은 이름에서 호칭을 추출하는 것입니다. "Braund, Mr.
Owen Harris"라는 이름에서 "Mr"를 추출합니다. 정규표현식 r' ([A-Za-z]+)\.'이 이 역할을 합니다.
호칭은 나이, 성별, 사회적 지위를 함축적으로 담고 있어 매우 유용한 변수가 됩니다. 결측치 처리도 특성 엔지니어링의 일부입니다.
Age 열의 결측치를 단순히 전체 평균으로 대체하는 것보다, 호칭별 중앙값으로 대체하는 것이 더 합리적입니다. "Master"는 어린 남자아이, "Miss"는 미혼 여성이므로 나이 분포가 다르기 때문입니다.
실무에서도 특성 엔지니어링은 핵심입니다. 쇼핑몰 데이터라면 "최근 구매일로부터 경과 일수", "평균 구매 금액", "구매 빈도" 같은 변수를 만들 수 있습니다.
원본 데이터에는 없지만, 예측에 결정적인 역할을 하는 변수들입니다. 김개발 씨는 그래프를 들여다보며 점점 데이터에 빠져들었습니다.
"아, 이래서 EDA를 하는 거구나. 숫자만 봐서는 몰랐던 것들이 보이네요."
실전 팁
💡 - Seaborn의 pairplot, heatmap을 활용하면 변수 간 상관관계를 한눈에 파악할 수 있습니다.
- 도메인 지식을 활용한 특성 엔지니어링이 가장 효과적입니다. 문제를 깊이 이해하세요.
4. 앙상블 모델 구축
EDA와 특성 엔지니어링을 마친 김개발 씨는 드디어 모델을 만들 준비가 되었습니다. "그냥 랜덤 포레스트 하나 돌리면 되는 거 아닌가요?" 이선배 씨가 고개를 저었습니다.
"상위권에 들려면 앙상블을 해야 해. 여러 모델의 예측을 조합하는 거지."
**앙상블(Ensemble)**은 여러 모델의 예측을 결합하여 더 좋은 성능을 얻는 기법입니다. 마치 여러 전문가의 의견을 종합하면 더 정확한 판단을 내릴 수 있는 것처럼, 다양한 모델의 예측을 결합하면 개별 모델보다 우수한 결과를 얻을 수 있습니다.
다음 코드를 살펴봅시다.
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.ensemble import VotingClassifier, StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
import xgboost as xgb
import lightgbm as lgb
# 개별 모델 정의
rf = RandomForestClassifier(n_estimators=100, random_state=42)
gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
xgb_clf = xgb.XGBClassifier(n_estimators=100, random_state=42)
lgb_clf = lgb.LGBMClassifier(n_estimators=100, random_state=42)
# 보팅 앙상블: 여러 모델의 예측을 투표로 결합
voting_clf = VotingClassifier(
estimators=[('rf', rf), ('gb', gb), ('xgb', xgb_clf)],
voting='soft' # 확률 기반 가중 투표
)
# 스태킹 앙상블: 메타 모델이 개별 모델의 예측을 학습
stacking_clf = StackingClassifier(
estimators=[('rf', rf), ('gb', gb), ('xgb', xgb_clf)],
final_estimator=LogisticRegression(),
cv=5
)
# 교차 검증으로 성능 비교
for name, clf in [('RF', rf), ('Voting', voting_clf), ('Stacking', stacking_clf)]:
scores = cross_val_score(clf, X_train, y_train, cv=5, scoring='accuracy')
print(f"{name}: {scores.mean():.4f} (+/- {scores.std():.4f})")
"왜 모델을 여러 개 쓰는 건가요? 가장 좋은 모델 하나만 쓰면 되지 않나요?" 김개발 씨의 합리적인 질문이었습니다.
이선배 씨가 비유를 들어 설명했습니다. "혼자서 퀴즈를 푸는 것과 친구 세 명이랑 같이 푸는 거, 뭐가 더 정확할까?
각자 잘하는 분야가 다르잖아. 한 명이 틀려도 다른 두 명이 맞추면 정답을 찾을 수 있어." 앙상블의 핵심 원리가 바로 이것입니다.
서로 다른 특성을 가진 모델들을 결합하면, 개별 모델의 약점을 보완할 수 있습니다. 랜덤 포레스트가 놓친 패턴을 XGBoost가 잡아내고, XGBoost의 과적합을 로지스틱 회귀가 보정합니다.
앙상블에는 크게 두 가지 방법이 있습니다. 첫째는 **보팅(Voting)**입니다.
말 그대로 투표입니다. 각 모델이 예측한 결과를 모아서 다수결로 최종 예측을 정합니다.
voting='hard'는 단순 다수결입니다. 세 모델 중 두 모델이 "생존"이라고 예측하면 최종 예측도 "생존"입니다.
voting='soft'는 확률 기반 투표로, 각 모델이 출력한 확률을 평균 내어 결정합니다. 일반적으로 soft voting이 더 좋은 성능을 보입니다.
둘째는 **스태킹(Stacking)**입니다. 이것은 더 정교한 방법입니다.
개별 모델들의 예측을 입력으로 받아서, 새로운 모델(메타 모델)이 최종 예측을 학습합니다. 스태킹은 마치 학생들의 답안지를 선생님이 종합해서 채점하는 것과 같습니다.
학생마다 실력이 다르고 잘하는 문제 유형이 다릅니다. 선생님은 각 학생의 특성을 파악해서 최종 답을 결정합니다.
위 코드에서 StackingClassifier의 final_estimator가 바로 이 메타 모델입니다. 로지스틱 회귀를 사용했는데, 간단한 모델이 오히려 과적합을 방지하는 데 효과적입니다.
Kaggle에서 상위권 솔루션을 보면 거의 예외 없이 앙상블을 사용합니다. 단일 모델로는 리더보드 상위 10%에 들기 어렵습니다.
XGBoost, LightGBM, CatBoost를 기본으로, 신경망이나 서포트 벡터 머신까지 조합하는 경우도 많습니다. cross_val_score로 교차 검증을 수행하면 모델의 실제 성능을 가늠할 수 있습니다.
단순 랜덤 포레스트보다 보팅이, 보팅보다 스태킹이 대체로 더 높은 점수를 기록합니다. 하지만 주의할 점도 있습니다.
앙상블에 사용하는 모델들이 너무 비슷하면 효과가 떨어집니다. 다양성이 핵심입니다.
트리 기반 모델만 여러 개 쓰는 것보다, 선형 모델과 트리 모델을 섞는 것이 더 효과적입니다. 김개발 씨는 스태킹 모델을 학습시켜 보았습니다.
교차 검증 점수가 단일 모델보다 확실히 높아졌습니다. "오, 진짜 효과가 있네요!"
실전 팁
💡 - 앙상블에는 서로 다른 특성의 모델을 조합하세요. 트리 기반 모델과 선형 모델의 조합이 효과적입니다.
- 스태킹 시 메타 모델은 단순한 것이 좋습니다. 과적합을 방지할 수 있습니다.
5. 하이퍼파라미터 최적화
앙상블 모델까지 구축한 김개발 씨는 뿌듯했습니다. 하지만 리더보드 점수는 기대만큼 오르지 않았습니다.
"뭐가 문제지?" 이선배 씨가 모델 코드를 살펴보더니 말했습니다. "하이퍼파라미터를 기본값 그대로 쓰고 있네.
이걸 튜닝해야 성능이 올라가."
하이퍼파라미터는 모델이 학습하기 전에 사람이 설정해주어야 하는 값입니다. 트리의 깊이, 학습률, 정규화 강도 등이 여기에 해당합니다.
마치 요리할 때 불 세기와 조리 시간을 조절하는 것처럼, 하이퍼파라미터를 잘 조절해야 최적의 결과를 얻을 수 있습니다.
다음 코드를 살펴봅시다.
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
import optuna
import xgboost as xgb
# 그리드 서치: 모든 조합을 시도
param_grid = {
'max_depth': [3, 5, 7],
'learning_rate': [0.01, 0.1, 0.3],
'n_estimators': [100, 200, 300]
}
grid_search = GridSearchCV(
xgb.XGBClassifier(random_state=42),
param_grid,
cv=5,
scoring='accuracy',
n_jobs=-1
)
grid_search.fit(X_train, y_train)
print(f"최적 파라미터: {grid_search.best_params_}")
# Optuna: 베이지안 최적화로 효율적 탐색
def objective(trial):
params = {
'max_depth': trial.suggest_int('max_depth', 2, 10),
'learning_rate': trial.suggest_float('learning_rate', 0.001, 0.3),
'n_estimators': trial.suggest_int('n_estimators', 50, 500),
'min_child_weight': trial.suggest_int('min_child_weight', 1, 10),
'subsample': trial.suggest_float('subsample', 0.5, 1.0)
}
model = xgb.XGBClassifier(**params, random_state=42)
score = cross_val_score(model, X_train, y_train, cv=5).mean()
return score
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
print(f"Optuna 최적 파라미터: {study.best_params}")
"하이퍼파라미터가 뭔가요? 그냥 파라미터랑 뭐가 달라요?" 김개발 씨의 질문에 이선배 씨가 답했습니다.
"파라미터는 모델이 데이터를 보고 스스로 학습하는 값이야. 신경망의 가중치 같은 거지.
반면 하이퍼파라미터는 우리가 미리 정해줘야 하는 값이야. 트리를 몇 층까지 만들지, 학습률은 얼마로 할지 같은 것들." 쉽게 비유하면 이렇습니다.
요리를 배우는 과정이 모델 학습이라면, 레시피의 "강불에서 5분 볶기"가 하이퍼파라미터입니다. 재료의 비율이나 조리법은 요리사가 정하지만, 실제로 음식이 어떤 맛이 나는지는 조리 과정에서 결정됩니다.
하이퍼파라미터 튜닝의 가장 기본적인 방법은 **그리드 서치(Grid Search)**입니다. 가능한 모든 조합을 시도해보는 것입니다.
위 코드에서 max_depth가 3, 5, 7 세 가지, learning_rate가 세 가지, n_estimators가 세 가지면 총 27가지 조합을 시도합니다. 그리드 서치는 확실하지만 비효율적입니다.
파라미터가 많아지면 조합 수가 기하급수적으로 늘어납니다. 10개 파라미터에 각각 5가지 값이면 약 1000만 가지 조합입니다.
이를 해결하는 방법이 랜덤 서치와 베이지안 최적화입니다. 랜덤 서치는 무작위로 조합을 선택해 시도합니다.
의외로 그리드 서치보다 좋은 결과를 내는 경우가 많습니다. Optuna는 베이지안 최적화 기반의 라이브러리입니다.
이전 시도의 결과를 바탕으로 다음에 시도할 파라미터를 똑똑하게 선택합니다. 마치 경험 많은 요리사가 맛을 보고 조리 시간을 조절하는 것과 같습니다.
위 코드에서 objective 함수는 Optuna가 최대화하려는 목표를 정의합니다. trial.suggest_int나 trial.suggest_float로 탐색 범위를 지정하면, Optuna가 알아서 좋은 값을 찾아갑니다.
study.optimize(objective, n_trials=100)은 100번의 시도를 수행합니다. 그리드 서치로 27가지 조합을 시도하는 것보다, Optuna로 100번 시도하는 것이 더 넓은 범위를 효율적으로 탐색합니다.
XGBoost의 주요 하이퍼파라미터를 살펴보겠습니다. max_depth는 트리의 최대 깊이로, 너무 크면 과적합됩니다.
learning_rate는 학습률로, 작을수록 정교하지만 느립니다. n_estimators는 트리 개수입니다.
min_child_weight는 과적합 방지에, subsample은 배깅 효과에 관여합니다. 주의할 점은 과적합입니다.
튜닝을 너무 열심히 하면 교차 검증 점수는 높아지는데 실제 테스트 점수는 떨어지는 현상이 발생합니다. 이를 방지하려면 별도의 검증 세트를 두거나, 교차 검증 폴드 수를 늘려야 합니다.
김개발 씨는 Optuna를 돌려보았습니다. 기본값으로 0.78이던 점수가 0.82까지 올랐습니다.
"와, 이렇게 차이가 나는구나!"
실전 팁
💡 - 하이퍼파라미터 튜닝 전에 먼저 특성 엔지니어링에 집중하세요. 좋은 특성이 좋은 튜닝보다 효과적입니다.
- Optuna의 시각화 기능(optuna.visualization)으로 파라미터 중요도를 확인하세요.
6. 리더보드 제출 및 개선
모든 준비를 마친 김개발 씨는 드디어 첫 번째 제출을 했습니다. 떨리는 마음으로 리더보드를 확인했는데, 생각보다 순위가 낮았습니다.
"분명히 교차 검증 점수는 높았는데..." 낙담한 김개발 씨에게 이선배 씨가 다가왔습니다. "괜찮아, 이제부터가 진짜 시작이야."
리더보드는 참가자들의 점수 순위를 보여주는 곳입니다. Public 리더보드와 Private 리더보드가 있으며, 최종 순위는 Private 리더보드에서 결정됩니다.
제출 후 점수를 분석하고 개선점을 찾아 반복적으로 성능을 높여가는 것이 Kaggle 경쟁의 핵심입니다.
다음 코드를 살펴봅시다.
import pandas as pd
import numpy as np
# 최종 예측 및 제출 파일 생성
final_model = stacking_clf
final_model.fit(X_train, y_train)
predictions = final_model.predict(X_test)
# 제출 파일 형식 맞추기
submission = pd.DataFrame({
'PassengerId': test['PassengerId'],
'Survived': predictions
})
submission.to_csv('submission.csv', index=False)
# Kaggle API로 제출
# kaggle competitions submit -c titanic -f submission.csv -m "Stacking ensemble v1"
# 교차 검증 점수와 리더보드 점수 비교 분석
cv_scores = cross_val_score(final_model, X_train, y_train, cv=10)
print(f"CV 평균: {cv_scores.mean():.4f}, 표준편차: {cv_scores.std():.4f}")
# 오버피팅 체크: CV와 LB 점수 차이 분석
# CV 점수가 LB 점수보다 많이 높으면 오버피팅 의심
# K-Fold별 예측 블렌딩 (OOF Prediction)
from sklearn.model_selection import KFold
oof_preds = np.zeros(len(X_train))
test_preds = np.zeros(len(X_test))
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, val_idx in kf.split(X_train):
model = xgb.XGBClassifier(**study.best_params, random_state=42)
model.fit(X_train.iloc[train_idx], y_train.iloc[train_idx])
oof_preds[val_idx] = model.predict_proba(X_train.iloc[val_idx])[:, 1]
test_preds += model.predict_proba(X_test)[:, 1] / 5
"Public 리더보드는 참고만 해. 진짜 중요한 건 Private 리더보드야." 이선배 씨의 조언이었습니다.
Kaggle의 리더보드 시스템을 이해하는 것은 매우 중요합니다. 테스트 데이터는 두 부분으로 나뉩니다.
일부(보통 30~50%)는 제출 즉시 점수를 보여주는 Public 리더보드에 사용됩니다. 나머지는 대회 종료 후 공개되는 Private 리더보드에 사용됩니다.
문제는 많은 참가자들이 Public 점수에만 집착한다는 것입니다. Public 점수를 높이기 위해 튜닝을 반복하다 보면, 공개된 테스트 셋에 과적합되기 쉽습니다.
대회가 끝나고 Private 점수가 공개되면 순위가 폭락하는 일이 흔합니다. 이것을 Shake Up이라고 합니다.
위 코드에서 첫 번째로 하는 일은 제출 파일 생성입니다. 대부분의 대회는 특정 형식의 CSV 파일을 요구합니다.
Titanic의 경우 PassengerId와 Survived 두 열만 있으면 됩니다. Kaggle API를 사용하면 명령줄에서 바로 제출할 수 있습니다.
-m 옵션으로 제출 메시지를 남기면 나중에 어떤 버전인지 추적하기 좋습니다. 제출 후에는 교차 검증 점수와 리더보드 점수를 비교해야 합니다.
CV 점수가 0.85인데 LB 점수가 0.75라면 심각한 오버피팅입니다. 반대로 CV와 LB 점수가 비슷하다면 모델이 안정적이라는 뜻입니다.
OOF(Out-of-Fold) Prediction은 고급 기법입니다. K-Fold 교차 검증을 수행하면서, 각 폴드에서 검증 셋에 대한 예측을 모읍니다.
이 예측들을 모으면 전체 훈련 데이터에 대한 예측이 만들어집니다. OOF Prediction의 장점은 두 가지입니다.
첫째, 스태킹의 입력으로 사용할 수 있습니다. 둘째, CV 점수를 더 정확하게 계산할 수 있습니다.
점수를 개선하는 방법은 무엇일까요? 가장 효과적인 것은 역시 특성 엔지니어링입니다.
Discussion 탭을 살펴보면 다른 참가자들이 발견한 유용한 특성에 대한 힌트를 얻을 수 있습니다. 또한 다양한 모델 블렌딩도 효과적입니다.
자신의 모델과 다른 참가자가 공개한 노트북의 예측을 평균 내면 점수가 오르는 경우가 많습니다. 서로 다른 접근 방식의 모델은 다른 패턴을 학습하기 때문입니다.
Post-processing도 고려해볼 만합니다. 예측 확률이 0.48인 경우, 0이냐 1이냐에 따라 결과가 달라집니다.
임계값을 0.5가 아닌 다른 값으로 조정하면 점수가 개선될 수 있습니다. 마지막으로 검증 전략을 점검하세요.
시계열 데이터라면 시간 순서를 고려한 검증이 필요합니다. 그룹이 있는 데이터라면 GroupKFold를 사용해야 합니다.
김개발 씨는 수십 번의 제출 끝에 상위 20%에 진입했습니다. "처음엔 막막했는데, 하다 보니까 점점 감이 오네요." 이선배 씨가 웃었습니다.
"이제 시작이야. 다음 대회에 도전해볼까?"
실전 팁
💡 - 최종 제출은 CV 점수가 가장 높은 모델과 LB 점수가 가장 높은 모델 두 개를 선택하세요.
- Discussion과 Notebooks 탭을 적극 활용하세요. Kaggle의 진정한 가치는 커뮤니티에 있습니다.
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.