지도학습 Ⅰ: 회귀(Regression) - 숫자를 예측하는 마법
지난번 통계 공부를 통해 데이터가 어떻게 퍼져 있는지 확인하는 법을 배웠다. 이제 그 데이터를 바탕으로 "미래의 숫자를 예측"하는 단계인 '회귀'에 대해 알아보자.
1. 선형 회귀 (Linear Regression): "최적의 선을 찾아라"

선형 회귀는 입력값(X)과 출력값(y)의 관계를 가장 잘 설명하는 단 하나의 직선을 찾는 과정이다.
1) 기본 공식
y = w*x + b
- w (Weight, 가중치/기울기): x가 변할 때 y가 얼마나 변하는지 결정한다. (예: 공부 시간이 늘 때 성적이 오르는 정도)
- b (Bias, 편향/절편): x가 0일 때의 기본값이다.
2) 어떻게 '최적'의 선을 찾을까? (비용 함수)
수많은 직선 중 어떤 게 정답일까? 정답은 "실제값과 모델이 예측한 값의 차이(오차)가 가장 적은 선"이다.
- 오차(Error): 실제값 - 예측값
- 평균 제곱 오차 (MSE, Mean Squared Error): 오차를 그냥 더하면 (+), (-)가 섞여 0이 될 수 있으므로, 오차를 제곱해서 평균을 낸다.
- 우리는 이 MSE 값이 최소가 되는w와 b를 찾는 것이 목표다.
컴퓨터는 수조 개의 직선을 그려볼 수 있다. 그중 가장 좋은 선을 고르는 기준이 비용 함수다.
정리: 제곱을 하는 이유는 두 가지다. 첫째, 음수를 양수로 만들기 위해. 둘째, 큰 오차에 더 큰 벌칙(Penalty)을 주기 위해! 오차가 2배 커지면 제곱 값은 4배가 되어 컴퓨터가 "이건 진짜 틀렸어!"라고 강하게 인지하게 된다.
1. 머신러닝의 표준 코드 흐름 (Scikit-learn 실습)
이론으로 들어가기 전, 실제로 코드가 어떻게 돌아가는지 '농어의 무게 예측' 예시로 살펴보자. (이 과정은 분류와 회귀 모두 공통적으로 적용되는 표준 절차다.)
1). 도구의 선택: Scikit-learn vs PyTorch
- Scikit-learn: CPU 기반으로 머신러닝 알고리즘을 돌리기에 최적화되어 있다.
- PyTorch / TensorFlow: GPU를 사용하여 대규모 딥러닝 연산을 수행할 때 사용한다. 최근에는 사이킷런 스타일로 파이토치를 사용할 수 있게 해주는 라이브러리들도 나오고 있다.
# 1. 필수 라이브러리 가져오기
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split # 데이터 분할 도구
from sklearn.preprocessing import StandardScaler # 스케일러 (단위 맞추기)
from sklearn.linear_model import LogisticRegression # 분류 모델 (일차방정식 기반)
from sklearn.metrics import accuracy_score, classification_report # 평가 지표
# ---------------------------------------------------------
# [Step 1] 데이터 준비 및 전처리
# ---------------------------------------------------------
# 예시 데이터를 만듭니다 (실제로는 pd.read_csv() 등을 사용하겠죠?)
# 데이터 설명: [청구항 개수, 출원 연도, 단어 빈도] -> [특허 등록 여부(0 또는 1)]
X = np.array([[5, 2023, 150], [2, 2021, 50], [10, 2024, 300], [1, 2020, 20]])
y = np.array([1, 0, 1, 0])
# 추가 코드: 스케일링 (전처리)
# '연도'는 2000대인데 '개수'는 한자리라 모델이 헷갈리지 않게 범위를 맞춥니다.
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# ---------------------------------------------------------
# [Step 2] 데이터 분할 (공부용 vs 시험용)
# ---------------------------------------------------------
# test_size=0.25: 75%는 공부하고, 25%는 나중에 시험 보는 용도로 떼어둡니다.
# random_state: 코드를 다시 실행해도 결과가 똑같이 나오게 고정하는 숫자입니다.
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.25, random_state=42
)
# ---------------------------------------------------------
# [Step 3] 모델 생성 및 하이퍼파라미터 설정
# ---------------------------------------------------------
# C: 규제 강도 (숫자가 작을수록 모델이 너무 예민해지지 않게 단속함)
# max_iter: 일차방정식의 해를 찾기 위해 최대 몇 번 반복 계산할 것인가
model = LogisticRegression(C=1.0, max_iter=1000)
# ---------------------------------------------------------
# [Step 4] 학습 (fit) - 모델이 가중치(w)를 찾는 과정
# ---------------------------------------------------------
# 훈련 데이터(X_train)와 정답(y_train)을 주면 최적의 직선을 긋습니다.
model.fit(X_train, y_train)
# ---------------------------------------------------------
# [Step 5] 예측 (predict)
# ---------------------------------------------------------
# 시험 문제(X_test)만 주고 정답이 무엇일지 예측해 보라고 시킵니다.
predictions = model.predict(X_test)
# ---------------------------------------------------------
# [Step 6] 결과 평가 (Evaluation)
# ---------------------------------------------------------
# 정확도 확인 (정답과 예측값을 비교)
accuracy = accuracy_score(y_test, predictions)
print(f"최종 모델 정확도: {accuracy * 100:.2f}%")
# 보충 코드: 상세 보고서 (정밀도, 재현율 등 포함)
# 앞서 공부한 분류 모델의 평가지표들이 여기서 한꺼번에 출력됩니다.
print("\n상세 평가 보고서:")
print(classification_report(y_test, predictions))
💡 이 코드에서 주목해야 할 핵심 포인트
- StandardScaler의 위치: 학습(fit)을 시키기 전에 먼저 숫자의 크기를 맞췄습니다. 이 과정이 있어야 일차방정식($y=wx+b$) 연산 시 특정 변수에 가중치가 쏠리는 것을 막을 수 있습니다.
- train_test_split: 모델이 정답을 통째로 외워버리는 **과적합(Overfitting)**을 방지하기 위해 반드시 데이터를 나눕니다.
- LogisticRegression의 괄호 안: C나 max_iter 같은 값을 조정하는 것이 하이퍼파라미터 튜닝입니다. 이 값을 어떻게 설정하느냐에 따라 성능이 조금씩 달라집니다.
- classification_report: 정확도 하나만 보지 않고, 우리가 배운 정밀도(Precision), 재현율(Recall) 등을 한눈에 확인하여 모델의 약점을 파악합니다.
4. 더 깊게 알기: 다중 선형 회귀 (Multiple Linear Regression)
실제 세상에서는 결과에 영향을 주는 변수가 하나(x)인 경우가 드물다.
- 집값(y) = (평수 \cdot w_1) + (역과의 거리 \cdot w_2) + (건축연도 \cdot w_3) + b
- 이렇게 여러 개의 입력 변수(x_1, x_2, ...)를 사용하는 것을 다중 회귀라고 한다. 여기서 우리가 1단계에서 배운 행렬(Matrix) 계산이 빛을 발한다!
5. 회귀 분석의 전제 조건
회귀 모델이 제대로 작동하려면 데이터가 다음의 조건을 만족해야 한다. (나중에 성능 안 나올 때 체크리스트!)
- 선형성: X와 y가 어느 정도 직선 관계여야 한다.
- 독립성: 입력 변수들끼리 너무 친하면(상관관계가 너무 높으면) 모델이 혼란스러워한다. (다중공선성 문제)
- 등분산성: 오차의 퍼진 정도가 일정해야 한다.
✍️ 공부를 마치며
회귀는 단순히 선을 긋는 것이 아니라, 데이터 속에 숨겨진 '경향성'을 찾아내어 수식으로 만드는 과정이었다. 직선으로 예측하면 선형 회귀, 그 직선을 굽혀서 확률로 바꾸면 로지스틱 회귀가 된다는 점이 가장 큰 깨달음이다.
'AI > Machine Learning' 카테고리의 다른 글
| 평가지표와 통계적 판단 (0) | 2025.06.22 |
|---|---|
| 전처리와 분석 (0) | 2025.06.21 |
| 경사하강법 (최적화) (0) | 2025.06.20 |
| 지도학습 Ⅱ (분류) (0) | 2025.06.19 |
| 머신러닝 시작 (0) | 2025.06.17 |