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

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

특성과 레이블

모의고사를 떠올려 보세요. 시험지에는 문제가 있고, 따로 정답지가 있습니다. 공부할 때는 문제와 정답을 함께 보고, 시험을 볼 때는 문제만 받습니다. 머신러닝의 표도 같습니다. 열 가운데 문제에 해당하는 것과 정답에 해당하는 것을 나눠야 모델에게 가르칠 수 있습니다.

배송 표에서 특성 열, 레이블 열, 쓰지 않는 열을 서로 다른 색으로 칠한 그림

민트로 칠한 열(주문시각, 거리km, 날씨, 택배사)이 특성이고, 라일락으로 칠한 지연 열이 레이블입니다. 회색 주문번호는 쓰지 않는 열입니다. 여기서 시험지의 문제가 특성, 정답지가 레이블입니다. 비유와 다른 점도 있습니다. 모의고사의 정답은 틀릴 일이 없지만, 데이터의 레이블은 사람이 적은 것이라 가끔 틀려 있습니다. 1장 프로젝트에서 그런 경우를 직접 봅니다.

열마다 역할 정하기

열역할까닭
주문시각, 거리km, 무게kg, 날씨, 택배사특성주문을 받을 때 이미 알 수 있고, 지연과 관계가 있을 법하다
지연레이블맞히고 싶은 답이다
주문번호쓰지 않는다행을 구별하는 번호일 뿐 지연과 관계가 없다
주문일바꿔서 쓴다날짜 그대로는 못 쓰고, 주말 여부 같은 특성으로 뽑아 쓴다(실습 4)

코드로 나누기

scikit-learn 에서는 특성을 대문자 X, 레이블을 소문자 y 에 담는 것이 관례입니다. X 는 열이 여럿인 표이고, y 는 열 하나라서 대소문자로 구별합니다.

Python
import pandas as pd

# 배송 기록 세 건을 표로 만든다(설명용)
df = pd.DataFrame({
    "주문번호": [3001, 3002, 3003],
    "주문시각": [2, 22, 7],
    "거리km": [7.3, 197.6, 35.5],
    "날씨": ["맑음", "눈", "맑음"],
    "지연": [0, 1, 1],
})

# 특성: 주문을 받을 때 알 수 있는 열만 고른다. 주문번호는 뺀다
X = df[["주문시각", "거리km", "날씨"]]
# 레이블: 맞히고 싶은 정답 열 하나
y = df["지연"]

print(X.shape)   # (행 수, 특성 수)
print(y.tolist())

X.shape 는 (3, 3) 으로 주문 세 건에 특성 세 개이고, y 는 [0, 1, 1] 입니다. 날씨는 아직 글자라서 이대로는 모델에 넣을 수 없습니다. 숫자로 바꾸는 법은 실습 4에서 봅니다.

코드에 나오는 함수

코드쉬운 뜻
df[["주문시각", "거리km", "날씨"]]대괄호 두 겹은 열 이름의 목록이다. 고른 열들을 표(DataFrame, 데이터 프레임)로 받는다
df["지연"]대괄호 한 겹은 열 하나다. 열 하나를 Series(시리즈, 한 줄로 늘어선 값)로 받는다
X.shapeshape 는 "모양"이라는 뜻이다. (행 수, 열 수)를 돌려준다
y.tolist()to list(목록으로). Series 의 값을 파이썬 목록으로 꺼낸다

이 코드가 뜻하는 것

모의고사 묶음을 가위로 오려 나누는 일입니다. 문제 칸은 시험지 묶음으로, 정답 칸은 정답지로 옮기고, 수험번호 칸은 버립니다. 여기서 시험지 묶음이 X, 정답지가 y, 버린 수험번호가 주문번호입니다.

줄하는 일쉽게 말하면
df = pd.DataFrame({...})배송 세 건을 표로 만든다모의고사 세 장
X = df[["주문시각", "거리km", "날씨"]]특성 열 셋만 고른다문제 칸만 오려 시험지 묶음을 만든다
y = df["지연"]정답 열 하나를 고른다정답 칸만 오려 정답지를 만든다
print(X.shape)표의 크기를 본다시험지가 세 장, 장마다 문제 셋
print(y.tolist())정답을 목록으로 본다정답지의 답 0, 1, 1

(3, 3) 과 [0, 1, 1] 은 문제와 정답이 같은 세 건으로 짝이 맞는다는 뜻입니다. 행 수가 서로 다르면 fit 에서 오류가 납니다.

작게 줄여서 눈으로 보기

X 와 y 가 정말 다른 꼴인지, 레이블이 특성에 섞이지 않았는지 확인해 봅니다. 숫자는 설명을 위해 정한 것입니다.

Python
import pandas as pd

df = pd.DataFrame({"주문시각": [2, 22], "거리km": [7.3, 197.6], "지연": [0, 1]})

X = df[["주문시각", "거리km"]]   # 대괄호 두 겹: 열 목록을 골라 표로 받는다
y = df["지연"]                   # 대괄호 한 겹: 열 하나를 받는다

print(type(X).__name__, type(y).__name__)
print(X.columns.tolist())
print("지연" in X.columns)   # 레이블이 특성에 섞이지 않았는지 확인
출력
DataFrame Series
['주문시각', '거리km']
False
결과읽는 법
DataFrame SeriesX 는 열이 여럿인 표, y 는 한 줄로 늘어선 값이다. 대문자와 소문자로 이름을 구별하는 까닭이다
['주문시각', '거리km']X 에 든 열 이름이다. columns 는 "열들"이라는 뜻이다
False"지연"이 X 의 열에 없다. 정답이 문제에 새어 들어가지 않았다

주의할 점

  • 예측하는 순간에 알 수 없는 열은 특성으로 쓰지 않습니다. 예를 들어 "실제 배송일수"를 특성에 넣으면 점수는 높게 나오지만, 주문을 받는 시점에는 그 값이 없어서 쓸모가 없습니다. 이런 실수를 정답 누출이라고 합니다.
  • 레이블 열을 특성에 실수로 남겨 두면 모델이 정답을 보고 답하게 됩니다. X 를 만든 뒤 열 이름을 꼭 한 번 찍어 봅니다.
← 이전 절1장 · 머신러닝 문제의 종류다음 절 →1장 · 머신러닝 프로세스