W1
Deeplearning W1 Hackathon
소득 예측
인구 통계 데이터의 범주형·수치형 특성을 정리하고 MLP로 소득 구간(0/1)을 예측합니다. 입력 설계가 성능을 얼마나 바꾸는지 실험으로 확인합니다.
- METRIC
- Accuracy
- LEVEL
- 초급
- EST. TIME
- 2시간
- BASELINE
- MLP
Start Here / Step 00
데이터와 제출 규격부터 확인하세요
범주형·수치형 tabular feature
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자 이상의 실험 회고를 제출하기 전까지 점수는 잠깁니다.
- 01CSV 검증현재
- 02서버 재채점대기
- 03이해 확인대기
- 04순위 공개대기
Submission Gate
제출 준비 중
미션 브리프는 먼저 확인할 수 있습니다. 강사가 비공개 평가셋과 제출 설정을 공개하면 CSV 제출과 이해 확인이 열립니다.
Learning Objectives
이번 미션에서 확인할 것
- 01범주형·수치형 특성을 학습 가능한 입력으로 변환한다.
- 02MLP baseline의 입력 차원과 이진 분류 출력을 설명한다.
- 03검증 점수와 공개되지 않은 holdout 결과의 차이를 분석한다.
Output Checklist
제출·학습 산출물
사이트에는 submission.csv만 업로드합니다. 나머지는 notebook에 남겨 수업 중 실험 근거로 설명합니다.
- 사이트 제출submission.csv
- 실험 기록재현 가능한 notebook
- 실험 기록전처리·데이터 누수 점검 기록
- 실험 기록baseline 대비 개선 실험 1건
Original Source
위 ZIP은 학습용 split입니다. 정답이 포함된 원본 전체는 아래 대회에서 확인하세요.