CCheckpointW1 · DATA
DATA / MLP제출 준비 중

W1

Deeplearning W1 Hackathon

소득 예측

인구 통계 데이터의 범주형·수치형 특성을 정리하고 MLP로 소득 구간(0/1)을 예측합니다. 입력 설계가 성능을 얼마나 바꾸는지 실험으로 확인합니다.

METRIC
Accuracy
LEVEL
초급
EST. TIME
2시간
BASELINE
MLP

Start Here / Step 00

데이터와 제출 규격부터 확인하세요

범주형·수치형 tabular feature

Dataset · Step 00

데이터셋 받기

train · test · sample_submission + 제출 안내(README) 한 번에. 원본 대회 가입 없이 시작합니다.

ZIP 받기

Output Contract

출력 함수 (선택)

save_checkpoint_result(
  ...,
  id_column="id",
  target_column="target",
)
.py 받기

Starter / Step 00b

여기서 출발하세요

기준선 · Accuracy 0.85 (seed 0)

ZIP을 푼 폴더에서 그대로 실행하면 submission.csv가 만들어집니다. 완성된 답이 아니라 기준선입니다 — 먼저 제출해 점수를 확인하고, 아래 항목을 바꿔가며 개선하세요.

From the Lectures · 이 코드가 출발한 강의

10강 · 분류 심화(이진과 다중)
이진 계약 3곳 — 로짓 1개, BCEWithLogitsLoss, 0.5 임계값
11강 · 회귀와 K겹 교차검증
표 데이터를 Linear에 넣는 법과 표준화가 필요한 이유
9강 · 일반화와 최적화
Dropout으로 과적합 억제

dl-w1-income.py · PyTorch

import pandas as pd, torch, torch.nn as nn

torch.manual_seed(0)                           # 13강처럼 시드 고정 — 이게 없으면 돌릴 때마다
                                               # 점수가 흔들려 "내 개선이 효과가 있었나"를 못 가린다
tr, te = pd.read_csv("train.csv"), pd.read_csv("test.csv")
y = torch.tensor(tr["target"].values, dtype=torch.float32).unsqueeze(1)

# train과 test를 붙여서 한 번에 인코딩한다. 따로 하면 한쪽에만 있는 값
# (예: test에만 등장하는 직업) 때문에 두 표의 열 개수가 어긋나 모델에 못 넣는다.
full = pd.concat([tr.drop(columns=["id", "target"]), te.drop(columns=["id"])])

# workclass·education 같은 문자열 열은 신경망에 그대로 넣을 수 없다. get_dummies는
# 값 하나마다 열을 만들어 해당하면 1, 아니면 0을 채운다 — 10강에서 리뷰를 '단어 출석부'로
# 바꾼 multi-hot과 같은 원리다. 열 수가 14개에서 100개 이상으로 늘어나니 X.shape를 찍어볼 것.
full = pd.get_dummies(full).astype("float32")

# 11강 표준화. age는 수십, capital.gain은 수만이라 스케일을 맞추지 않으면
# 큰 값을 가진 열이 학습을 지배한다. +1e-8은 std가 0인 열의 0 나누기 방지.
full = (full - full.mean()) / (full.std() + 1e-8)

X = torch.tensor(full[:len(tr)].values, dtype=torch.float32)
Xt = torch.tensor(full[len(tr):].values, dtype=torch.float32)

model = nn.Sequential(
    nn.Linear(X.shape[1], 64), nn.ReLU(), nn.Dropout(0.3),
    nn.Linear(64, 1))                          # 10강 이진 계약 ①: 출력 로짓 1개
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
lossf = nn.BCEWithLogitsLoss()                 # 10강 이진 계약 ②: sigmoid를 손실 안에서 처리

for epoch in range(15):                        # 먼저 돌려보고 조절하세요
    for i in range(0, len(X), 128):
        opt.zero_grad(); loss = lossf(model(X[i:i + 128]), y[i:i + 128]); loss.backward(); opt.step()
    print(epoch, round(loss.item(), 4))

pred = (torch.sigmoid(model(Xt)) > 0.5).int().squeeze()   # 10강 이진 계약 ③: 0.5 임계값
pd.DataFrame({"id": te["id"], "target": pred.numpy()}).to_csv("submission.csv", index=False)

New Here · 강의에서 다루지 않은 부분

문자열 범주형을 숫자로 바꾸는 인코딩(get_dummies)

강의에서 직접 다루지 않은 부분입니다. 10강에서 리뷰를 '단어 출석부'로 바꾼 multi-hot과 같은 원리 — 값 하나마다 열을 만들어 해당하면 1, 아니면 0을 채웁니다.

Next Steps

  • 01결측 표기(?)와 범주형 인코딩 방식을 바꿔 비교
  • 02수치형만 표준화하는 등 스케일링 범위 조정
  • 03은닉층 크기·Dropout·epoch를 바꿔 baseline 대비 개선 1건 만들기

Live Rankings

클래스 리더보드

이해 확인을 통과해 ranked가 된 제출만 표시합니다. 각 수강생의 최고 점수 1개만 순위에 반영됩니다.

순위 기록을 불러오는 중입니다.

Join the Board

제출 → 이해 확인 → 순위 공개

출력값은 서버가 다시 채점합니다. 객관식 3문항 중 2문항 이상과 80자 이상의 실험 회고를 제출하기 전까지 점수는 잠깁니다.

  1. 01CSV 검증현재
  2. 02서버 재채점대기
  3. 03이해 확인대기
  4. 04순위 공개대기

Submission Gate

제출 준비 중

미션 브리프는 먼저 확인할 수 있습니다. 강사가 비공개 평가셋과 제출 설정을 공개하면 CSV 제출과 이해 확인이 열립니다.

Learning Objectives

이번 미션에서 확인할 것

  1. 01범주형·수치형 특성을 학습 가능한 입력으로 변환한다.
  2. 02MLP baseline의 입력 차원과 이진 분류 출력을 설명한다.
  3. 03검증 점수와 공개되지 않은 holdout 결과의 차이를 분석한다.

Output Checklist

제출·학습 산출물

사이트에는 submission.csv만 업로드합니다. 나머지는 notebook에 남겨 수업 중 실험 근거로 설명합니다.

  • 사이트 제출submission.csv
  • 실험 기록재현 가능한 notebook
  • 실험 기록전처리·데이터 누수 점검 기록
  • 실험 기록baseline 대비 개선 실험 1건

Original Source

위 ZIP은 학습용 split입니다. 정답이 포함된 원본 전체는 아래 대회에서 확인하세요.

DACON · 235892 열기 ↗