이번 문서의 목표: 이 파일을 다 읽으면 numpy 배열과 pandas 데이터프레임의 최소 문법을 읽고, scikit-learn의 fit·predict·transform이 각각 무엇을 하는지 설명하며, 훈련/시험 분할과 파이프라인이 왜 필요한지 코드 수준에서 이해할 수 있다.
왜 코드 문법을 먼저 봐야 하는가
이 과목은 필기시험 대비가 목적이므로 코드 자체를 외우거나 손으로 완벽히 작성할 필요는 없다. 하지만 08편 이후 각 편에서 알고리즘을 설명할 때 “scikit-learn에서는 이 알고리즘을 이렇게 부른다”거나 “이 하이퍼파라미터는 코드에서 이런 이름으로 등장한다”는 식으로 짧은 코드가 계속 인용된다. 코드를 읽을 줄 알아야 그 설명을 따라갈 수 있으므로, 이 편에서는 수치 계산에 쓰는 numpy, 표 형태 데이터를 다루는 pandas, 그리고 머신러닝 모델을 학습·예측시키는 공통 인터페이스를 제공하는 scikit-learn의 최소 사용법만 짚는다. 세 라이브러리 모두 파이썬(Python) 언어 위에서 동작하는 외부 패키지(라이브러리)다.
numpy: 벡터·행렬 연산을 위한 배열
쉽게 말하면: numpy는 03편에서 배운 벡터·행렬 계산을 파이썬 코드로 빠르게 실행해 주는 도구다.
numpy(Numerical Python)는 다차원 배열(array)과 그 위에서의 수치 연산을 제공하는 라이브러리다. 파이썬 기본 리스트로도 숫자를 담을 수 있지만, numpy 배열은 03편에서 다룬 벡터·행렬 연산(내적, 행렬 곱셈, 노름 등)을 짧은 코드 한 줄로 계산할 수 있게 해준다. 관례적으로 import numpy as np로 불러와 np라는 별칭으로 사용한다.
import numpy as np
# 03편의 특징 행렬 X와 가중치 벡터 w를 numpy 배열로 표현
X = np.array([[60, 2], [85, 3], [100, 3]])
w = np.array([2, 5])
# 행렬 곱셈(각 샘플의 예측 점수를 한 번에 계산)
예측점수 = X @ w
print(예측점수) # [130 185 215]
# 벡터의 L2 노름(03편 참고)
v = np.array([3, -4])
print(np.linalg.norm(v)) # 5.0 (L2 노름 기본값)X @ w는 03편에서 손으로 계산한 행렬 곱셈과 정확히 같은 결과()를 낸다. np.linalg.norm은 벡터의 노름을 계산하는 함수로, 기본값은 L2 노름이다.
pandas: 표 형태 데이터를 다루는 도구
쉽게 말하면: pandas는 02편에서 본 “샘플이 행, 특징이 열”인 데이터셋 표를 엑셀처럼 다룰 수 있게 해주는 도구다.
pandas는 표 형태 데이터를 다루기 위한 라이브러리로, 표 전체를 담는 자료구조를 데이터프레임(DataFrame)이라 부른다. 관례적으로 import pandas as pd로 불러온다.
import pandas as pd
# 02편의 집값 데이터셋을 데이터프레임으로 표현
데이터 = pd.DataFrame({
'면적': [60, 85, 100, 45, 120],
'방개수': [2, 3, 3, 1, 4],
'가격': [30000, 45000, 52000, 22000, 61000],
})
# 특징 행렬 X와 타깃 벡터 y로 분리(02편의 개념을 코드로 옮긴 것)
X = 데이터[['면적', '방개수']]
y = 데이터['가격']
print(데이터.describe()) # 각 열의 개수·평균·표준편차·최솟값·최댓값 등 요약 통계데이터[['면적', '방개수']]처럼 대괄호 두 겹으로 여러 열을 한 번에 골라내면 그 결과가 특징 행렬 가 되고, 데이터['가격']처럼 열 하나만 고르면 타깃 벡터 가 된다. describe()는 02편에서 계산한 평균·분산과 같은 요약 통계를 각 열마다 자동으로 계산해 보여주는 메서드(method, 객체가 가진 동작을 실행하는 함수)다.
scikit-learn의 공통 인터페이스: fit·predict·transform
쉽게 말하면: fit은 “데이터를 보고 배워라”, predict는 “배운 대로 새 데이터의 답을 맞혀라”, transform은 “배운 규칙대로 데이터의 모양을 바꿔라”라는 명령이다.
scikit-learn(줄여서 sklearn)은 이 과목에서 다루는 대부분의 지도학습·비지도학습 알고리즘을 같은 방식으로 다룰 수 있도록 통일된 인터페이스를 제공하는 라이브러리다. 어떤 알고리즘을 쓰든 세 가지 메서드 이름이 반복해서 등장한다.
fit: 훈련 데이터를 보고 모델의 파라미터(01편 참고)를 학습하는 메서드. “학습을 시작해라”에 해당한다.predict: 학습이 끝난 모델에 새로운 입력을 넣어 예측값(레이블)을 출력하는 메서드. 지도학습 모델(회귀·분류)에서 쓰인다.transform: 데이터의 형태를 바꾸는 메서드로, 스케일링(값의 범위 조정)이나 PCA(17편)처럼 “예측”이 아니라 “데이터 변환”이 목적인 도구에서 쓰인다.fit으로 변환 규칙을 배운 뒤transform으로 실제 변환을 적용하는 두 단계로 나뉘는 경우가 많다.
08편에서 배울 선형회귀를 scikit-learn으로 학습시키는 코드는 다음과 같다.
from sklearn.linear_model import LinearRegression
모델 = LinearRegression() # 아직 학습 전: 파라미터가 정해지지 않은 빈 모델
모델.fit(X, y) # 훈련 데이터 X, y를 보고 파라미터(가중치, 절편)를 학습
새로운_예측 = 모델.predict([[70, 2]]) # 면적 70, 방 2개인 새 집의 가격을 예측
print(새로운_예측)LinearRegression()을 실행한 시점에는 아직 아무것도 학습되지 않은, 모델의 틀(01편에서 정의한 “모델”)만 있는 상태다. fit(X, y)를 호출해야 비로소 데이터를 보고 가중치·절편 같은 파라미터가 결정된다. 그 뒤 predict에 새로운 특징(면적 70, 방 2개)을 넣으면 학습된 파라미터를 이용해 가격을 예측한다.
전처리(06편에서 다룰 스케일링)에는 transform이 쓰인다.
from sklearn.preprocessing import StandardScaler
스케일러 = StandardScaler()
스케일러.fit(X) # X의 평균·표준편차를 계산해 학습(파라미터 역할)
X_변환 = 스케일러.transform(X) # 학습한 평균·표준편차를 이용해 X를 실제로 변환여기서 fit은 회귀 모델의 fit과 이름은 같지만 하는 일이 다르다. StandardScaler의 fit은 가중치를 학습하는 것이 아니라, 데이터의 평균과 표준편차(02편에서 배운 분산의 제곱근)라는 통계값을 계산해 기억해 두는 것이다. 이후 transform이 실제로 “각 값에서 평균을 빼고 표준편차로 나누는” 변환을 수행한다. fit과 transform을 한 번에 실행하는 fit_transform이라는 메서드도 자주 쓰인다.
데이터 분할: train_test_split
쉽게 말하면: train_test_split은 02편에서 배운 훈련/시험 데이터 분할을 코드 한 줄로 대신 해주는 함수다.
02편에서 데이터를 훈련·검증·시험으로 나눠야 하는 이유를 배웠다. scikit-learn은 이를 위한 train_test_split 함수를 제공한다.
from sklearn.model_selection import train_test_split
X_훈련, X_시험, y_훈련, y_시험 = train_test_split(
X, y, test_size=0.2, random_state=42
)test_size=0.2: 전체 데이터 중 20퍼센트를 시험 데이터로 떼어낸다는 하이퍼파라미터(01편 참고)다. 나머지 80퍼센트는 훈련 데이터가 된다.random_state=42: 무작위로 데이터를 섞을 때 항상 같은 방식으로 섞이도록 고정하는 값이다. 이 값을 고정하지 않으면 코드를 실행할 때마다 다르게 분할되어, 같은 코드인데도 결과가 매번 달라지는 문제가 생긴다. 42라는 숫자 자체에 특별한 의미는 없고, 관습적으로 자주 쓰이는 값일 뿐이다.
이 함수를 실행하면 02편에서 그림으로 본 “전체 데이터를 훈련·시험으로 나누는” 과정이 그대로 일어나며, 결과로 나온 4개의 변수(X_훈련, X_시험, y_훈련, y_시험) 중 X_훈련, y_훈련만 fit에 사용하고 X_시험, y_시험은 마지막 평가에만 사용해야 한다는 원칙은 02편에서 배운 그대로다.
파이프라인: 전처리와 모델을 하나로 묶기
쉽게 말하면: 파이프라인은 “먼저 스케일링하고, 그다음 모델을 학습시켜라”처럼 여러 단계를 하나의 순서로 묶어, 매번 손으로 순서를 반복하지 않아도 되게 해주는 도구다.
실제 머신러닝 작업은 “전처리(스케일링, 인코딩) → 모델 학습”처럼 여러 단계로 이어지는 경우가 대부분이다. 파이프라인(pipeline)은 이런 여러 단계를 하나의 객체로 묶어, fit이나 predict를 한 번만 호출해도 등록된 순서대로 모든 단계가 실행되게 해주는 구조다.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
파이프라인 = Pipeline([
('스케일링', StandardScaler()),
('회귀모델', LinearRegression()),
])
파이프라인.fit(X_훈련, y_훈련) # 스케일링 학습 → 변환 → 회귀 학습까지 한 번에
예측값 = 파이프라인.predict(X_시험) # 스케일링 변환 → 예측까지 한 번에파이프라인을 쓰지 않고 스케일링과 모델 학습을 따로 실행하면, 시험 데이터를 변환할 때 실수로 시험 데이터의 평균·표준편차를 새로 계산해 버리는 실수가 생기기 쉽다. 이는 02편에서 경고한 “시험 데이터를 학습 과정에 노출시키는” 상황과 같은 문제로, 파이프라인은 항상 훈련 데이터로 학습한 스케일링 규칙만을 시험 데이터에도 그대로 적용하도록 순서를 강제해 이런 실수를 막아 준다.
자주 틀리는 점
fit이 항상 “가중치를 학습한다”는 뜻이라고 오해한다. 스케일러의fit처럼 통계값(평균·표준편차)만 계산해 기억해 두는 경우도 있다. 공통점은 “훈련 데이터를 보고 이후에 쓸 정보를 결정한다”는 것이다.transform과predict를 혼동한다.predict는 레이블(정답)을 출력하고,transform은 데이터 자체의 모양(스케일, 차원 등)을 바꿔서 출력한다.train_test_split으로 나눈 시험 데이터에fit이나fit_transform을 실행한다. 시험 데이터에는transform이나predict만 사용해야 하며,fit은 훈련 데이터에만 적용한다.- 파이프라인 없이 전처리를 하면서 시험 데이터의 통계값을 별도로 계산해, 훈련 데이터의 통계값과 다른 기준으로 시험 데이터를 변환해 버린다.
핵심 정리
- numpy는 벡터·행렬 연산(내적, 행렬 곱셈, 노름)을 코드로 빠르게 계산하는 라이브러리다.
- pandas의 데이터프레임은 샘플(행)·특징(열) 구조의 데이터셋을 다루며, 열을 골라 특징 행렬 X와 타깃 벡터 y를 만든다.
- scikit-learn은
fit(학습)·predict(예측)·transform(변환)이라는 공통 인터페이스로 대부분의 알고리즘을 통일된 방식으로 다룬다. train_test_split은 훈련·시험 데이터 분할을, 파이프라인은 전처리와 모델 학습을 하나의 순서로 묶어 실행한다.
마무리 복습
참고 자료
- scikit-learn User Guide — fit·predict·transform 인터페이스, Pipeline, train_test_split 공식 문서
- 국가평생교육진흥원 독학학위제 — 독학사 2단계 머신러닝 출제기준 중 코드·도구 관련 범위 확인