1장. 머신러닝 프로세스와 기본 개념
실습 4 — 특성과 레이블 만들고 나누기
모델에 넣을 수 있는 꼴로 데이터를 바꿉니다. 날짜에서 주말 여부를 뽑고, 글자 열을 숫자로 바꾸고, 특성과 레이블을 나눈 뒤 학습용과 시험용으로 나눕니다. 실습 2의 out_delivery_clean.csv 가 있어야 합니다.
1단계. 날짜에서 주말 여부 뽑기
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: float642단계. 글자 열을 숫자로 바꾸기
# 특성으로 쓸 열. 주문번호(행 번호)와 주문일(주말로 바꿈), 지연(정답)은 뺀다
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단계. 학습용과 시험용으로 나누기
# 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.207 | 1,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은 이 실습의 준비 코드를 그대로 다시 적고 시작합니다. 실습 절이 바뀌면 코드가 처음부터 다시 실행되기 때문입니다.