LLM 엔지니어링1장 · 머신러닝 프로세스와 기본 개념18 / 23← 이전목차다음 →MetaContents

1장. 머신러닝 프로세스와 기본 개념

실습 4 — 특성과 레이블 만들고 나누기

모델에 넣을 수 있는 꼴로 데이터를 바꿉니다. 날짜에서 주말 여부를 뽑고, 글자 열을 숫자로 바꾸고, 특성과 레이블을 나눈 뒤 학습용과 시험용으로 나눕니다. 실습 2의 out_delivery_clean.csv 가 있어야 합니다.

1단계. 날짜에서 주말 여부 뽑기

Python
import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv("out_delivery_clean.csv")

# 주문일은 글자로 읽혀 있다. to_datetime 으로 날짜로 바꾼다
# dt.day_of_week 는 요일 번호(월 0 ~ 일 6). 5 이상이면 토요일과 일요일
df["주말"] = (pd.to_datetime(df["주문일"]).dt.day_of_week >= 5).astype(int)

# 주말(1)과 평일(0)의 지연 비율을 견준다
print(df.groupby("주말")["지연"].mean().round(3))
출력
주말
0    0.174
1    0.292
Name: 지연, dtype: float64

2단계. 글자 열을 숫자로 바꾸기

Python
# 특성으로 쓸 열. 주문번호(행 번호)와 주문일(주말로 바꿈), 지연(정답)은 뺀다
features = ["주문시각", "거리km", "무게kg", "주말", "지역", "상품분류", "날씨", "택배사"]

# get_dummies 는 글자 열을 값마다 0/1 열로 펼친다
# 예: 날씨 → 날씨_눈, 날씨_맑음, 날씨_비 ... (그 행의 날씨인 열만 1)
# dtype=int 는 True/False 대신 1/0 으로 적게 한다
X = pd.get_dummies(df[features], dtype=int)
y = df["지연"]

print("특성 표의 모양:", X.shape)
print(X.columns.tolist())
출력
특성 표의 모양: (1194, 21)
['주문시각', '거리km', '무게kg', '주말', '지역_경기', '지역_서울', '지역_인천', '지역_지방', '상품분류_가전', '상품분류_도서', '상품분류_생활용품', '상품분류_식품', '상품분류_의류', '날씨_눈', '날씨_맑음', '날씨_모름', '날씨_비', '날씨_흐림', '택배사_빠른별택배', '택배사_새벽길택배', '택배사_한결택배']

3단계. 학습용과 시험용으로 나누기

Python
# test_size=0.25  : 25% 를 시험용으로 뗀다
# random_state=42 : 섞는 순서를 고정한다. 실습 5와 6도 같은 값을 써서 똑같이 나눈다
# stratify=y      : 지연 비율을 학습용과 시험용에 똑같이 나눈다
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)

print("학습용:", len(X_train), "건, 지연 비율", round(y_train.mean(), 3))
print("시험용:", len(X_test), "건, 지연 비율", round(y_test.mean(), 3))
출력
학습용: 895 건, 지연 비율 0.206
시험용: 299 건, 지연 비율 0.207

이 실습이 뜻하는 것

이 실습은 모의고사 문제집을 만드는 일과 같습니다. 날짜처럼 그대로는 쓸 수 없는 정보를 "주말인가"라는 쉬운 질문으로 바꾸고(1단계), 글로 적힌 보기를 0과 1로 적는 칸으로 펼치고(2단계), 문제집을 공부용과 시험용으로 나눕니다(3단계). 여기서 문제가 특성 X, 정답이 레이블 y, 공부용이 학습용, 시험용이 시험용 데이터입니다.

단계출력뜻
1. 주말 여부0 0.174, 1 0.292주말 주문은 평일 주문보다 늦는 비율이 높습니다. 날짜에서 쓸모 있는 특성을 하나 뽑았습니다
2. 특성 표(1194, 21)특성 8개가 21열이 되었습니다. 숫자 열 4개에 지역 4, 상품분류 5, 날씨 5, 택배사 3열이 더해졌습니다
2. 열 목록'날씨_눈', '날씨_맑음', …글자 열이 값마다 한 열씩 나뉘었습니다. 그 주문의 날씨인 칸만 1입니다
3. 나누기학습용 895건 0.206, 시험용 299건 0.2071,194건이 4대 1쯤으로 나뉘었고, 두 묶음의 지연 비율이 거의 같습니다

한 줄로 줄이면, 장부를 모델이 읽을 수 있는 숫자 표로 바꾸고 공부용과 시험용으로 나눈 실습입니다. 아직 모델은 하나도 학습하지 않았고, 실습 5에서 이 준비를 그대로 다시 적은 뒤 모델을 학습하고 채점합니다. 주말의 지연 비율이 높다는 것도 함께 움직인다는 뜻일 뿐 원인이라는 뜻은 아닙니다.

코드 설명

  • 주말(1) 주문의 지연 비율이 0.292 로 평일(0)의 0.174 보다 높습니다. 날짜 그대로는 모델에 넣을 수 없지만, 주말 여부로 바꾸면 쓸모 있는 특성이 됩니다. 이렇게 있는 열에서 새 특성을 뽑는 일을 특성 만들기라고 합니다.
  • get_dummies 를 거치면 특성 8개가 21개 열로 늘어납니다. 숫자 열 넷은 그대로 두고, 지역 넷, 상품분류 다섯, 날씨 다섯, 택배사 셋이 각각 0/1 열이 되었기 때문입니다.
  • 학습용 895건과 시험용 299건의 지연 비율이 0.206 과 0.207 로 거의 같습니다. stratify=y 덕분입니다.
  • 실습 5와 6은 이 실습의 준비 코드를 그대로 다시 적고 시작합니다. 실습 절이 바뀌면 코드가 처음부터 다시 실행되기 때문입니다.
← 이전 절1장 · 실습 3 — 조건별 지연 비율을 그래프로 보기다음 절 →1장 · 실습 5 — 기준선과 모델 채점하기