모던지 / 빅데이터분석기사 / 실기 실무 2강. 작업형 제2유형 예측 모형

실기 실무 2강. 작업형 제2유형 예측 모형

2유형은 성능 대회가 아닙니다. 끝까지 돌아가는 코드 한 벌과 형식에 맞는 제출 파일이면 배점의 대부분을 가져갑니다.

풀고 시작

문제 1. 학습 데이터에는 있고 평가 데이터에는 없는 열이 하나 있습니다. 그 열의 정체는?
맞혀야 할 답이 평가 데이터에 들어 있으면 시험이 성립하지 않습니다. 학습 데이터에만 있는 열이 목표 변수이며, 이것을 분리해 내는 것이 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. 평가지표가 ROC AUC로 주어졌을 때 제출해야 하는 값은?
AUC는 순서를 매기는 능력을 재는 지표이므로 확률처럼 연속적인 점수가 필요합니다. 라벨만 제출하면 순위 정보가 사라져 점수가 크게 떨어집니다.
문제 2. 범주형 변수를 원핫 인코딩할 때 학습 데이터와 평가 데이터를 따로 처리하면 생기는 문제는?
각각 인코딩하면 등장하는 범주에 따라 생성되는 열이 달라집니다. 두 데이터를 합쳐 인코딩한 뒤 원래 길이로 다시 자르거나, 학습 데이터 기준으로 열을 맞춰 주어야 합니다.
문제 3. 제출 파일을 저장할 때 index를 저장하지 않도록 지정해야 하는 이유는?
기본 설정으로 저장하면 행 번호가 첫 열로 함께 기록됩니다. 채점은 지정된 열 구성을 기대하므로 예상치 못한 열이 붙으면 문제가 됩니다.
문제 4. 작업형 제2유형에서 가장 권장되는 시간 배분 전략은?
배점은 제출된 결과에 대해 매겨지므로 완성된 파일이 없으면 0점입니다. 끝까지 동작하는 한 벌을 먼저 만들어 두고 개선하는 순서가 위험을 가장 크게 줄입니다.

이전: 1강 작업형 제1유형 전처리 · 다음: 3강 작업형 제3유형 통계 검정

모던지 · 궁금하면 모던지 GitHub · 2026-09-10