머신러닝 기초 (1) - 지도학습이란: 회귀와 분류
지도학습을 (특성 X, 타깃 y) 쌍에서 함수 f를 근사하는 문제로 정의하고, 회귀와 분류의 구분, 그리고 "모델은 파라미터를 가진 함수족, 학습은 데이터에 맞는 파라미터를 찾는 것"이라는 관점을 최소한의 scikit-learn 코드로 확인하는 1편입니다.
머신러닝 기초 시리즈의 1편입니다. 0편의 소개에 이어, 지도학습의 큰 틀부터 시작합니다.
지도학습은 무엇을 하는가
지도학습(supervised learning)은 정답이 붙은 데이터로 배우는 방식입니다. 데이터는 (특성, 타깃) 쌍의 모음입니다. 특성은 입력이고, 타깃은 그 입력에 대응하는 정답입니다.
- 집의 면적, 방 개수, 위치(특성) → 매매가(타깃)
- 종양의 크기, 질감, 대칭성(특성) → 악성인지 양성인지(타깃)
- 메일의 단어 빈도(특성) → 스팸인지 아닌지(타깃)
목표는 특성에서 타깃으로 가는 함수를 찾는 것입니다. 입력을 X, 타깃을 y라고 쓰면, 지도학습은 데이터로부터 f: X → y를 근사하는 문제입니다. 여기서 “지도(supervised)”라는 말은 학습 과정에서 정답 y가 곁에 있어 모델이 자기 예측이 맞았는지 틀렸는지 알 수 있다는 뜻입니다.
정답 y가 없는 데이터에서 구조 자체를 찾는 것은 비지도학습(unsupervised learning)이며, 이 시리즈의 14편부터 다룹니다.
회귀와 분류
타깃 y의 종류에 따라 지도학습은 둘로 갈립니다. 타깃이 연속값이면 회귀, 범주면 분류입니다.
- 회귀(regression): 타깃이 숫자입니다. 매매가, 내일 기온, 당뇨 진행 정도처럼 “얼마인가”를 맞히는 문제입니다. 예측값과 정답 사이의 거리가 의미를 가집니다.
- 분류(classification): 타깃이 정해진 몇 개의 라벨 중 하나입니다. 악성/양성, 스팸/정상, 개/고양이/새처럼 “어느 쪽인가”를 맞히는 문제입니다. 라벨 사이에는 크기 순서가 없습니다.
같은 대상도 타깃을 어떻게 잡느냐에 따라 문제 종류가 바뀝니다. 종양 데이터에서 “종양 크기(mm)”를 맞히면 회귀지만, “악성인가 양성인가”를 맞히면 분류입니다. 문제가 회귀인지 분류인지에 따라 쓰는 모델과 성능을 재는 방법이 달라지므로, 데이터를 받으면 타깃부터 확인하는 것이 순서입니다.
용어 정리
앞으로 계속 쓸 단어들을 여기서 못 박아 둡니다.
- 특성(feature): 모델의 입력. 표에서 한 열에 해당하며 보통 여러 개입니다. 특성들을 모은 행렬을 관례적으로 대문자
X로 씁니다. - 타깃(target): 모델이 맞혀야 할 정답. 열 하나이며 소문자
y로 씁니다. - 샘플(sample): 데이터 한 줄. (특성 한 벌, 타깃 하나)의 쌍입니다. 표에서 한 행입니다.
- 학습(fit): 데이터를 보고 모델 내부의 값을 정하는 과정. scikit-learn에서
model.fit(X, y)입니다. - 예측(predict): 학습한 모델에 새 입력을 넣어 타깃을 내놓는 것.
model.predict(X)입니다. - 파라미터(parameter): 학습으로 정해지는 모델 내부의 수. 선형 모델이라면 각 특성에 곱해지는 계수와 절편이 파라미터입니다.
- 모델(model): 특성을 받아 예측을 내놓는 함수. 그 함수의 모양은 파라미터로 결정됩니다.
모델은 함수족, 학습은 파라미터 찾기
지도학습의 핵심을 한 문장으로 줄이면 이렇습니다. 모델은 파라미터를 가진 함수족이고, 학습은 데이터에 가장 잘 맞는 파라미터를 찾는 일이다.
선형 회귀를 예로 들면, 모델이 표현하는 함수는 이 꼴입니다.
1
예측 = w1*x1 + w2*x2 + ... + wn*xn + b
여기서 특성 x1..xn은 데이터가 주는 값이고, 계수 w1..wn과 절편 b가 파라미터입니다. 파라미터를 어떻게 정하느냐에 따라 이 식은 무수히 많은 서로 다른 함수가 됩니다. 이 “가능한 함수 전체의 모임”이 함수족이고, 학습이란 그중에서 우리 데이터를 가장 잘 설명하는 함수 하나를 골라내는 것입니다.
그래서 fit이 하는 일은 결국 파라미터 값을 정하는 것입니다. “가장 잘 맞는다”를 무엇으로 재고(2편: 손실 함수) 그 최적값을 어떻게 찾는지(3편: 경사하강법)는 뒤에서 다룹니다. 지금은 학습의 결과가 파라미터의 집합이라는 그림만 잡으면 충분합니다.
회귀 실습: 선형 회귀
scikit-learn 내장 당뇨 데이터로 회귀를 확인합니다. 특성 10개(나이, BMI, 혈압 등)로 1년 뒤 당뇨 진행 정도라는 연속값을 예측하는 문제입니다.
1
2
3
4
5
6
7
8
9
10
11
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
X, y = load_diabetes(return_X_y=True)
X.shape # (442, 10): 샘플 442개, 특성 10개
model = LinearRegression()
model.fit(X, y) # 학습: 데이터에 맞는 파라미터를 찾는다
model.coef_.shape # (10,): 특성마다 계수 하나
model.intercept_ # 절편 = 152.13
fit 한 줄로 모델은 계수 10개와 절편 1개, 합쳐서 파라미터 11개를 정했습니다. 이 파라미터가 곧 학습된 모델입니다. 이제 예측을 뽑고 성능을 봅니다.
1
2
3
4
model.predict(X[:3]).round(1) # [206.1 68.1 176.9]: 예측값
y[:3] # [151. 75. 141.]: 실제값
model.score(X, y) # 0.5177: R², 1에 가까울수록 잘 맞음
예측값과 실제값이 방향은 비슷하되 정확히 일치하지는 않습니다. 회귀에서 완벽한 일치는 목표도 기대도 아니며, score가 돌려주는 R²는 이 모델이 타깃의 변동을 얼마나 설명하는지를 나타냅니다(회귀 평가는 8편에서 자세히 다룹니다).
분류 실습: 로지스틱 회귀
이번에는 유방암 데이터입니다. 특성 30개(종양의 크기, 질감, 대칭성 등)로 악성인지 양성인지를 맞히는 이진 분류입니다. 타깃은 0(악성)과 1(양성) 두 값뿐입니다.
1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
Xc, yc = load_breast_cancer(return_X_y=True)
Xc.shape # (569, 30): 샘플 569개, 특성 30개
yc[:10] # [0 0 0 0 0 0 0 0 0 0]: 타깃은 0/1 라벨
clf = LogisticRegression(max_iter=5000) # 특성 스케일 차이가 커 반복 횟수를 늘림
clf.fit(Xc, yc) # 학습
clf.predict(Xc[:10]) # [0 0 0 0 0 0 0 0 0 0]: 라벨 예측
clf.score(Xc, yc) # 0.9578: 정확도(맞힌 비율)
이름은 “회귀”지만 로지스틱 회귀는 분류 모델입니다. 선형식으로 점수를 계산한 뒤 그 값을 0~1 사이 확률로 변환하고, 확률이 절반을 넘으면 한 쪽 라벨로 판정합니다. 여기서도 학습이 하는 일은 같습니다. 선형식의 계수와 절편이라는 파라미터를 데이터에 맞게 정하는 것입니다. 분류 모델의 구조는 9편에서, score가 돌려준 정확도만으로는 부족한 이유와 대안은 7편에서 이어집니다.
목표는 훈련 성능이 아니라 일반화
위 두 예제에는 함정이 하나 있습니다. 학습에 쓴 바로 그 X로 score를 쟀다는 점입니다. 모델은 그 데이터에 맞도록 파라미터를 정했으니, 같은 데이터에서의 점수는 실제 실력보다 부풀려지기 쉽습니다. 극단적으로는 데이터를 통째로 외운 모델이 훈련 점수는 만점이면서 새 데이터에서는 쓸모없을 수도 있습니다.
우리가 원하는 것은 훈련 데이터를 잘 맞히는 모델이 아니라, 처음 보는 데이터에서도 잘 맞히는 모델입니다. 이것을 일반화(generalization)라고 하며, 그래서 성능은 학습에 쓰지 않은 데이터로 재야 합니다.
훈련 데이터에서의 점수는 모델의 실력이 아니다. 반드시 학습에 쓰지 않은 데이터로 평가해야 한다.
훈련, 검증, 테스트로 데이터를 나누는 방법과 과대적합과 과소적합은 4편에서 다룹니다. 이번 편의 실습이 훈련 데이터로 점수를 잰 것은 fit/predict/score의 흐름을 최소한으로 보여주기 위한 것일 뿐, 올바른 평가 방식이 아니라는 점을 기억해 두면 됩니다.
정리
| 개념 | 한 줄 요약 |
|---|---|
| 지도학습 | (특성 X, 타깃 y) 쌍에서 f: X → y를 근사하는 문제 |
| 회귀 / 분류 | 타깃이 연속값이면 회귀, 범주면 분류 |
| 특성 / 타깃 | 입력이 특성(X), 맞힐 정답이 타깃(y) |
| 학습 / 예측 | fit은 파라미터를 정하고, predict는 새 입력에 답한다 |
| 모델 = 함수족 | 파라미터로 모양이 정해지는 함수. 학습은 그중 하나를 고르는 것 |
| 목표 = 일반화 | 훈련 점수가 아니라 처음 보는 데이터에서의 성능 |
다음 편에서는 “가장 잘 맞는다”를 무엇으로 재는지, 즉 모델이 최소화하는 손실 함수를 다룹니다.