실무에 쓰는 머신러닝 기초 - 회귀
1. 회귀 분석이란?
- 종속변수(Y)와 하나 이상의 독립변수(X) 간의 관계를 추정하여, 연속형 종속변수를 예측하는 통계/머신러닝 기법
- ex) “공부한 시간(X)에 따라 시험 점수(Y)가 어떻게 변하는가?” 를 예측
- 지도학습에서의 분류(Classification)와 회귀(Regression)의 차이
- 분류: 결과값이 이산형(클래스 라벨)
- **회귀**: 결과값이 연속형(숫자 값)
- 사람의 지능적인 작업을 기계가 수행하도록 만드는 광범위한 개념
2. 선형 회귀
회귀 모델을 사용하는 이유
① 미래 값 예측 : 판매량, 주가, 온도 등 실수값 예측에 사용
② 인과 관계 해석 : 특정 독립변수가 종속변수에 미치는 영향력을 해석하기 위해
③ 데이터 기반 의사결정 : 추세 파악, 자원 배분 등
선형 회귀 모델 학습 과정
① 가중치(회귀계수) 초기화
② 손실함수 설정 : 주로 MSE 사용
③ 최적화 : 수학적인방법(최소자승법), 경사하강법 등을 통해 가중치 업데이트
④ 학습 완료 후 : 계수값을 얻어서 새로운 입력 값에 대한 예측 수행
장단점
- 장점: 해석이 간단, 구현이 쉬움
- 단점: 데이터가 선형성이 아닐 경우 예측력이 떨어짐
3. 다항 회귀
적용 예시
- 제조 공정에서의 온도와 반응률 관계가 곡선 형태인 경우
- 건강 데이터에서 나이와 특정 지표(근육량 등)가 단순 선형보다 곡선 형태로 나타나는 경우
주의점
- 고차항을 무작정 늘리면 훈련 데이터에는 과도하게 맞춰져 과적합(overfitting) 문제가 발생할 수 있음
- 모델 복잡도와 일반화 성능 간의 균형을 맞춰야 함
4. 고급 회귀
① Ridge(릿지) 회귀

- 가중치 제곱합(L2 Norm)을 페널티로 추가
- 효과: 가중치가 너무 커지지 않도록 방지(가중치 값을 부드럽게 줄임)
② Lasso(라쏘) 회귀

- 가중치 절댓값합(L1 Norm)을 페널티로 추가
- 효과: 가중치를 0으로 만들어 변수 선택(Feature Selection) 효과
릿지&라쏘회귀 코드예제)
import numpy as np
import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge, Lasso
from sklearn.metrics import mean_squared_error, r2_score
# 1. 데이터 로드
housing = fetch_california_housing()
X = housing.data
y = housing.target
print(X.shape)
print(y.shape)

# 2. 학습/테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

# 3. Ridge 회귀
# alpha=1.0 (규제 세기) 는 필요에 따라 조정 가능
ridge_reg = Ridge(alpha=1.0, random_state=42)
ridge_reg.fit(X_train, y_train)
# 예측
y_pred_ridge = ridge_reg.predict(X_test)
# 성능 평가
mse_ridge = mean_squared_error(y_test, y_pred_ridge)
r2_ridge = r2_score(y_test, y_pred_ridge)
# 평균 비율 오차
def MPE(y_true, y_pred):
return np.mean((y_true - y_pred) / y_true) * 100
print("[Ridge 회귀 결과]")
print(" 가중치(coefficient):", ridge_reg.coef_)
print(" 절편(intercept):", ridge_reg.intercept_)
print(" MSE:", mse_ridge)
print(" R^2 점수:", r2_ridge)
print("평균 비율 오차 : ", MPE(y_test, y_pred_ridge))
print()

# 4. Lasso 회귀
# alpha=0.1 정도로 조금 낮춰 볼 수도 있음 (기본값 1.0)
# alpha가 너무 크면 가중치가 0이 되어 과소적합 위험이 있습니다.
lasso_reg = Lasso(alpha=0.1, random_state=42, max_iter=10000)
lasso_reg.fit(X_train, y_train)
# 예측
y_pred_lasso = lasso_reg.predict(X_test)
# 성능 평가
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
r2_lasso = r2_score(y_test, y_pred_lasso)
# 평균 비율 오차
def MPE(y_true, y_pred):
return np.mean((y_true - y_pred) / y_true) * 100
print("[Lasso 회귀 결과]")
print(" 가중치(coefficient):", lasso_reg.coef_)
print(" 절편(intercept):", lasso_reg.intercept_)
print(" MSE:", mse_lasso)
print(" R^2 점수:", r2_lasso)
print("평균 비율 오차 : ", MPE(y_test, y_pred_lasso))

Q&A
Q1: 선형 회귀와 다항 회귀 중 어느 것을 선택해야 하나요?
A1: 데이터의 분포와 잔차(오차) 패턴을 확인하여, 단순 선형 모델로 설명이 어렵다면 다항 회귀를 고려합니다. 먼저, 선형회귀와 다항회귀 모두를 진행해보고 나서 판단해보는 방법도 있습니다.
Q2: Lasso와 Ridge 중 어느 규제 기법을 써야 하나요?
A2: Lasso는 변수 선택(가중치를 0으로 만들어 불필요한 변수 제거)에 유리하며, Ridge는 모든 가중치를 부드럽게 줄여 모델 안정성을 높이는 데 유리합니다. 분석 목적과 데이터 특성에 따라 선택하거나, Elastic Net처럼 두 기법을 혼합하는 방법도 있습니다.
Q3: 앙상블 기법은 항상 선형 회귀보다 좋은가요?
A3: 대부분의 경우 앙상블 기법이 예측 성능이 높지만, 데이터의 규모나 특징, 문제의 복잡도에 따라 다릅니다. 또한 하이퍼파라미터 튜닝이 까다롭고 계산 비용이 큰 단점도 있으므로 상황에 맞춰 선택합니다.
Q4: 회귀 모델에서 독립변수가 많아질수록 항상 성능이 좋아지나요?
A4: 독립변수가 많아지면 모델이 복잡해져 과적합될 가능성이 커집니다. 변수 선택 기법(Feature Selection)이나 규제(Regularization)를 통해 불필요한 변수를 제거하고, 교차검증으로 모델 일반화 성능을 평가해야 합니다.
(참고! 교차검증은 머신러닝을 더욱 공평하게 평가하는 방법입니다! 이 부분은 앙상블 내용에서 자세히 다룰 예정입니다 🙂)
Q5: 회귀 모델을 만들 때 어떤 지표(R², MAE, RMSE)를 우선적으로 봐야 하나요?
A5: 문제의 특성에 따라 달라집니다. 예측 오차의 크기가 중요하면 RMSE나 MAE, 모델이 데이터를 얼마나 잘 설명하는지 보려면 R²를 사용합니다. 여러 지표를 종합적으로 살펴보는 것이 바람직합니다.