SK플래닛 ai활용 데이터엔지니어 과정 2기/ML & DL

ML 3 - 머신러닝 지도학습 (회귀)

dev-lee 2026. 5. 25. 21:52

1. 회귀 개념

회귀는 자연현상이나 사회현상에서 변수들 사이의 관계를 수식으로 모델링하는 방법임. 종속변수가 **연속형 수치**일 때 사용하며, 학습의 목적은 **오차를 최소화하는 파라미터를 찾는 것**임.

1.1 데이터 구성

  • 독립변수(피처) — 영향을 주는 변수, x로 표기
  • 종속변수(레이블) — 영향을 받는 변수, y로 표기
  • 출력 데이터 타입 — 수치형 > 연속형

1.2 모델링 원칙

  • 학습을 통해 독립변수와 종속변수 간의 관계식을 구성함
  • 결과물은 모델이며, 해당 모델로 예측을 수행함
  • 예측은 어느 정도의 오차를 동반하므로 오차 최소화가 핵심 목표

학습이란 결국 오차값이 최소가 되는 알고리즘 내의 파라미터값을 찾아가는 과정임. 이 원칙은 단순 회귀든 다중 회귀든 동일하게 적용됨.


2. 회귀의 종류

2.1 단순 선형 회귀

  • 구조 — 독립변수(x) 1개, 종속변수(y) 1개
  • 관계식y = w0 + w1x (1차 함수)
  • 학습 목표 — 오차를 최소로 하는 w0, w1 값을 찾는 것
  • 학습 절차 — 학습 → 평가 → w0, w1 조정 → 반복 → 기준 부합 → 종료

2.2 다중 선형 회귀

  • 구조 — 독립변수(x) n개, 종속변수(y) 1개
  • 관계식y = w0 + w1x1 + w2x2 + ... + wnxn
  • 회귀 계수가 증가하면 다차원 함수가 됨

2.3 회귀 계수의 명칭

분야 명칭 세부 표현
머신러닝 회귀 계수 기울기, y절편
딥러닝 파라미터 w0 = 편향(bias), w1~wn = 가중치(weight)

회귀 계수와 딥러닝 파라미터는 본질적으로 동일한 개념임. 머신러닝의 회귀가 인공신경망의 출발점이 된 이유이기도 함.


3. 비용 함수 — RSS

학습이 "오차 최소화"라면, 그 오차를 정량화하는 도구가 비용 함수임. 회귀에서는 **RSS(Residual Sum of Square, 잔차 제곱합)**을 사용함.

3.1 RSS 정의

  • 공식 — Σ(실제값 - 예측값)²
  • 제곱하는 이유 — 오차가 음수일 수 있어 부호 제거 + 큰 오차에 더 큰 페널티 부여
  • 학습 = RSS가 최소가 되는 회귀계수를 구하는 과정

비용 함수를 최소화하는 것이 회귀 학습의 본질임. 어떤 알고리즘(LinearRegression, Ridge, Lasso 등)을 쓰든 이 원리는 동일함.


4. 베이스라인 구축 — 캘리포니아 집값

4.1 요구사항 분석

  • 데이터 — sklearn 내장 캘리포니아 집값 데이터(연속형)
  • 목표 — 8개 피처로 집값 예측 모델 구축
  • 태스크 유형 — 머신러닝 / 지도학습 / 회귀(다중 선형 회귀)

4.2 데이터 수집

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
%matplotlib inline

house = fetch_california_housing()
print(house.DESCR)
  • house.data — 8개 피처 (MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude)
  • house.target — 연속형 정답값(집값)

4.3 데이터 준비

# 8개 피처 + 1개 정답 → (20640, 9)
house_df = pd.DataFrame(data=house.data, columns=house.feature_names)
house_df['target'] = house.target
house_df.shape
DataFrame으로 변환해 EDA와 모델링에 쓸 수 있는 상태로 만듦.

5. EDA — 회귀에서의 핵심은 상관관계

5.1 회귀 EDA의 목적

  • 상관관계 체크 — 8개 독립변수와 종속변수 간 관계 분석 → 피처 제거 판단에 활용
  • 분포·비율 체크 — 독립변수와 종속변수의 분포 확인
  • 밀집도 분석 — 스케일링(피처 엔지니어링) 필요 여부 판단

5.2 상관관계 시각화

fig, ax = plt.subplots(nrows=2, ncols=4, figsize=(16, 8))

for idx, feat_nm in enumerate(house.feature_names):
    # idx//4, idx%4 → (0,0), (0,1), ..., (1,3) 차트 자리 계산
    sns.regplot(x=feat_nm, y='target', data=house_df, ax=ax[idx//4][idx%4])
plt.show()
  • idx//4, idx%4 — 8개 피처를 2×4 그리드에 배치하기 위한 좌표 계산 트릭. enumerate 인덱스로 행/열 위치를 동시에 산출
  • sns.regplot — 산점도와 회귀선을 함께 그려 상관관계를 시각적으로 표현

5.3 상관관계 해석 기준

방향 의미
우상향 양의 상관관계
우하향 음의 상관관계
강도 (-1 ~ 0 ~ 1) 기준
강한 상관관계 |상관계수| > 0.7
보통 상관관계 0.3 ≤ |상관계수| ≤ 0.7
약한 상관관계 |상관계수| < 0.3

피처 간 강한 상관관계가 있으면 VIF로 다중공선성을 체크하고, 10 이상이면 피처를 제거해야 함. 다중회귀에서 모델 신뢰성을 결정하는 중요한 판단 기준임.

5.4 EDA 결론

  • 피처와 타겟이 1:1로 다양한 상관관계를 보임 → 학습에 도움이 됨
  • 모든 피처를 학습에 사용 가능하다고 판단함

6. 모델 구축

6.1 모듈 임포트 및 데이터 분할

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

X = house_df.drop('target', axis=1)
Y = house_df['target']

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)
  • random_state=0 — 난수 시드 고정으로 재현성 확보. 같은 코드를 돌려도 항상 동일한 분할 결과를 얻음
  • 기본 분할 비율 — train_test_split의 디폴트는 75:25

6.2 학습과 예측

lr = LinearRegression()       # 알고리즘 생성
lr.fit(X_train, Y_train)      # 훈련
Y_pred = lr.predict(X_test)   # 예측
sklearn API의 표준 3단 구조 — 생성 → fit → predict.

6.3 평가 — MSE / RMSE

mse = mean_squared_error(Y_test, Y_pred)
rmse = np.sqrt(mse)
mse, rmse    # RMSE: 약 0.73
메트릭 의미
MSE Mean Squared Error, 평균 제곱 오차
RMSE MSE의 제곱근, 원래 단위로 해석 가능

RMSE 0.73은 만족스러운 수치가 아님. 0에 가까워지도록 데이터 증성, 피처 엔지니어링, 알고리즘 교체, 하이퍼파라미터 튜닝 등이 필요함.

6.4 회귀 계수 확인

print(lr.intercept_)  # y절편, 편향(bias)
print(lr.coef_)       # w1 ~ w8 회귀계수
w1, w2, w3, w4, w5, w6, w7, w8 = lr.coef_
학습이 완료되면 모델이 제안하는 관계식이 도출됨.
집값 = -36.6096
      + 0.4391  * MedInc
      + 0.0096  * HouseAge
      + ...
      + (-0.4306) * Longitude
이 식에 따라 약 0.73의 오차로 집값을 예측할 수 있음.

6.5 정확도 확인

lr.score(X_test, Y_test)    # 약 0.59 (59%)
  • 회귀의 .score() — 분류와 달리 결정계수(R²) 를 반환함
  • R² 0.59는 모델이 데이터의 분산 중 59%를 설명한다는 의미

7. 최적화 — 교차검증

단일 분할 학습은 운에 따라 성능 편차가 클 수 있음. **K-Fold 교차검증**으로 안정적인 평가를 수행함.

7.1 교차검증 코드

from sklearn.model_selection import cross_val_score

lr = LinearRegression()

mse = cross_val_score(lr, X_train, Y_train, cv=5, scoring='neg_mean_squared_error')
rmse = np.sqrt(-mse)    # 부호 보정 후 RMSE 계산

np.mean(rmse)    # 0.72 (0.73 → 0.72로 약간 개선)
  • cv=5 — 5-Fold 교차검증. 데이터를 5등분해 5번 학습·평가 후 평균
  • scoring='neg_mean_squared_error' — sklearn은 점수가 클수록 좋다는 규칙이라 MSE에 음수 부호를 붙임. 사용 시 -mse로 부호 복원이 필수

sklearn의 neg_* 스코어 컨벤션은 자주 실수하는 지점임. RMSE 계산 시 np.sqrt(-mse)로 부호 보정을 빠뜨리면 NaN이 발생함.


8. statsmodels — 통계 기반 회귀

8.1 통계 vs 머신러닝 관점

구분 statsmodels sklearn
목적 변수 간 관계 설명·해석 예측 성능 극대화
출력 p-value, R², 신뢰구간 예측값, 정확도
변수명 설명변수 / 반응변수 피처 / 레이블

통계 모델은 "역사는 반복된다"는 대명제에서 출발함. 과거 데이터로 검증된 패턴이 미래에도 유효하다는 가정하에 예측을 수행함.

8.2 통계적 가설 설계

알코올도수가 와인 품질에 미치는 영향을 분석하는 경우 다음과 같이 가설을 세움.
  • 대립가설 — 입증하고 싶은 주장 (예: "알코올도수는 와인 품질에 영향을 미치지 않는다")
  • 귀무가설 — 대립가설의 반대 (예: "알코올도수는 와인 품질에 영향을 미친다")
  • 대립가설을 직접 입증하기 어려우므로 반대 개념의 귀무가설을 기각함으로써 대립가설을 증명하는 우회 방식을 씀.

8.3 단순 회귀 코드

import statsmodels.api as sm
import pandas as pd

wine_qu_df = pd.read_csv('winequality-red.csv', sep=';')

# 컬럼명 공백을 _로 대체
wine_qu_df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)

# OLS 모델 구성
model = sm.OLS(
    wine_qu_df['quality'],
    sm.add_constant(wine_qu_df['alcohol'])
)
results = model.fit()
print(results.summary())
  • OLS (Ordinary Least Squares) — 최소자승법. 오차 제곱합이 최소가 되게 하는 회귀계수를 추정하는 방법
  • sm.add_constant — w0(절편)을 위해 1로 채워진 상수 컬럼을 추가. statsmodels는 sklearn과 달리 절편을 자동 추가하지 않음

8.4 변수 개수에 따른 통계 용어

독립변수 개수 통계 용어
1개 일변량 (univariate)
2개 이변량 (bivariate)
n개 다변량 (multivariate)

9. OLS 보고서 해석

9.1 모델링 결과식

와인퀄리티 = 1.8750 + 0.3608 * 알코올도수

9.2 핵심 지표

  • 결정계수(R², R-squared) — 1에 가까울수록 모델 성능이 좋음. R² = 0.227 → 알코올도수는 와인 품질에 22.7%만큼만 영향을 미침
  • P-value (유의 확률) — P > |t| 컬럼. P < 0.001~0.005면 귀무가설 기각. 0.000이면 강한 기각
  • VIF (다중공선성 지표) — 공식 1 / (1 - R²). 다중회귀에서만 사용. 10 이상이면 다중공선성 존재 → 피처 제거 필요

R²는 모델의 설명력을, P-value는 변수의 유의성을, VIF는 변수 간 독립성을 검증함. 이 세 지표는 통계 기반 회귀의 핵심 의사결정 도구임.

9.3 다중 회귀 코드

# 8개 독립 변수 모두 사용
model = sm.OLS(
    wine_qu_df['quality'],
    sm.add_constant(wine_qu_df.iloc[:, :-1])
)
results = model.fit()
print(results.summary())

# 모델링된 수식
# y = 21.9652 + 0.0250*fixed_acidity + ... + 0.2762*alcohol
  • wine_qu_df.iloc[:, :-1] — 마지막 컬럼(quality, 정답) 제외하고 모든 피처 선택

10. 머신러닝에서 딥러닝으로

머신러닝의 한계가 인공신경망(딥러닝) 개발의 동기가 됨. 회귀의 수식이 그 시작점임.

10.1 인공신경망의 역사

연도 사건
1943 인공지능 논문 제안
1957 퍼셉트론 제안 (인간의 뉴런을 본딴 실물 장비)

10.2 단일 퍼셉트론 구조

  • 간단한 구조 — 입력층(x) + 출력층(y)
  • 기본식y = w1x1 + w2x2
  • 확장식output = w0x0 + w1x1 + w2x2 + ... + wnxn
  • 입력이 많아지면 최적의 w를 더 많이 찾아야 하며, 연산은 행렬 연산으로 진행됨

퍼셉트론의 수식은 다중 선형 회귀와 본질적으로 동일함. 회귀의 회귀계수 = 퍼셉트론의 가중치 = 딥러닝의 파라미터. 같은 개념을 다른 이름으로 부를 뿐임.


11. 요약

단계 핵심 도구 출력
1. 회귀 정의 연속형 종속변수 모델링
2. 비용 함수 RSS 오차 정량화 지표
3. 베이스라인 sklearn LinearRegression 학습된 회귀 모델
4. EDA seaborn regplot 상관관계 시각화
5. 평가 MSE, RMSE, R² 모델 성능 지표
6. 최적화 cross_val_score (K-Fold) 안정적 평균 성능
7. 통계 분석 statsmodels OLS p-value, R², VIF
8. 딥러닝 연결 퍼셉트론 회귀 수식의 확장

회귀의 본질은 오차를 최소화하는 회귀계수를 찾는 과정임. sklearn은 예측 성능에, statsmodels는 통계적 해석에 각각 강점이 있으며 실무에서는 두 도구를 병행함. R²로 설명력을, P-value로 유의성을, VIF로 다중공선성을 점검하는 3종 세트가 통계 회귀의 의사결정 도구임. 이 수식 구조가 그대로 딥러닝의 퍼셉트론으로 확장된다는 점을 이해하면 ML/DL의 연결이 자연스러워짐.

'SK플래닛 ai활용 데이터엔지니어 과정 2기 > ML & DL' 카테고리의 다른 글

DL 3 - CNN  (0) 2026.05.26
DL 2 - 전이학습  (0) 2026.05.26
DL 1 - 딥러닝 개요  (0) 2026.05.26
ML 2 - 간단한 구현  (1) 2026.05.21
ML 1 - 개념 정리  (0) 2026.05.20