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.shapeDataFrame으로 변환해 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*alcoholwine_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 |