실기 실무 2강. 작업형 제2유형 예측 모형
2유형은 성능 대회가 아닙니다. 끝까지 돌아가는 코드 한 벌과 형식에 맞는 제출 파일이면 배점의 대부분을 가져갑니다.
풀고 시작
만점을 노리지 마세요
작업형 제2유형은 배점이 가장 큰 한 문항입니다. 학습용 데이터와 평가용 데이터를 주고, 모형을 만들어 평가용 데이터에 대한 예측 결과를 파일로 저장하라고 요구하죠. 채점은 그 파일을 읽어 성능 지표로 이루어집니다.
여기서 전략이 갈립니다. 성능을 끝까지 끌어올리려다 시간을 다 쓰고 파일을 못 만드는 것이 최악입니다. 일단 끝까지 돌려서 제출 파일을 만들어 놓고, 남는 시간에 개선하세요. 기본적인 전처리에 앙상블 계열 모델 하나면 대체로 무난한 점수가 나옵니다.
뼈대 한 벌을 통째로 외우기
순서가 늘 같습니다. 읽고, 나누고, 전처리하고, 학습하고, 검증하고, 저장합니다.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
# 1. 목표 변수 분리와 식별자 보관
y = train.pop("target")
test_id = test["ID"]
train = train.drop(columns=["ID"])
test = test.drop(columns=["ID"])
전처리에서 가장 자주 사고가 나는 지점은 범주형 인코딩입니다. 학습 데이터에만 있는 범주가 있으면 열 개수가 어긋나 예측 단계에서 오류가 납니다. 두 데이터를 합쳐서 인코딩한 뒤 다시 나누면 이 문제가 사라집니다.
# 2. 전처리: 결측 대체와 범주형 인코딩
all_df = pd.concat([train, test], axis=0)
for c in all_df.columns:
if all_df[c].dtype == "object":
all_df[c] = all_df[c].fillna("결측")
else:
all_df[c] = all_df[c].fillna(all_df[c].median())
all_df = pd.get_dummies(all_df)
X = all_df[:len(train)]
X_test = all_df[len(train):]
이제 검증용으로 한 번 더 나눠 성능을 확인하고 학습합니다.
# 3. 검증 분할과 학습
X_tr, X_val, y_tr, y_val = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y)
model = RandomForestClassifier(n_estimators=300, random_state=42)
model.fit(X_tr, y_tr)
pred_val = model.predict_proba(X_val)[:, 1]
print(roc_auc_score(y_val, pred_val))
마지막이 제출입니다. 여기서 실점하는 사람이 정말 많습니다.
# 4. 제출 파일 저장
pred = model.predict_proba(X_test)[:, 1]
pd.DataFrame({"ID": test_id, "pred": pred}).to_csv(
"result.csv", index=False)
제출에서 확인할 네 가지
첫째, 확률인가 라벨인가. 평가지표가 ROC AUC면 확률을 내야 하고, 정확도나 F1이면 라벨을 내야 합니다. 문제에 적힌 지표를 보고 정하세요. 확률은 predict_proba의 두 번째 열, 라벨은 predict입니다.
둘째, 열 이름과 개수. 문제가 지정한 이름을 그대로 씁니다. 지정하지 않았다면 식별자와 예측값 두 열이 무난합니다.
셋째, 인덱스를 저장하지 않기. index를 거짓으로 두지 않으면 이름 없는 열이 하나 더 붙어 채점이 어긋날 수 있습니다.
넷째, 행 수 확인. 저장한 파일의 행 수가 평가 데이터의 행 수와 같은지 마지막에 한 번 찍어 보세요. 전처리 과정에서 행이 사라졌다면 여기서 잡힙니다.
회귀 문제로 나오면 분류기 대신 랜덤 포레스트 회귀를, 지표는 결정계수나 RMSE를 씁니다. 뼈대는 그대로이고 모델 이름과 지표만 바뀝니다. 원리가 궁금하시면 3과목 4강으로 돌아가세요.
인출 문제
이전: 1강 작업형 제1유형 전처리 · 다음: 3강 작업형 제3유형 통계 검정