⊢MachineLearning

지도학습 : 회귀모델

최 수빈 2025. 3. 6. 17:21

 

회귀(Regression) 모델

 

연속적인 값을 예측하는 문제를 해결하는 데 사용됨
데이터의 특성과 목적에 따라 적절한 회귀 모델을 선택

  • 선형 회귀(Linear Regression) : 기본적인 선형 관계를 모델링
  • 다항 회귀(Polynomial Regression) : 비선형 관계를 모델링
  • 리지 회귀(Ridge Regression) : 과적합 방지를 위해 L2 정규화 적용
  • 라쏘 회귀(Lasso Regression) : 가중치를 조정하여 불필요한 변수를 제거

 

 

선형 회귀(Linear Regression)

 

종속 변수(y)와 하나 이상의 독립 변수(x) 간의 선형 관계를 모델링하는 기법

  • 단순 선형 회귀 : 하나의 독립 변수와 종속 변수 간의 관계를 모델링
    𝑦 = β₀ + β₁𝑥 + Ⲉ
  • 다중 선형 회귀 : 여러 개의 독립 변수와 종속 변수 간의 관계를 모델링
    𝑦 = β₀ + β₁𝑥₁ + β₂𝑥₂+ ••• + β𝒏𝑥𝒏 + Ⲉ

y : 종속 변수 (목표 값)

𝑥₁, 𝑥₂, •••, 𝑥𝒏 : 독립 변수

β₀ : 절편 (Intercept)

β₁ + β₂+ ••• + β𝒏 : 회귀 계수 (Regression Coefficients)

Ⲉ : 오차항 (Error Term)

 

 

Scikit-learn을 활용한 선형 회귀 모델 구현

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 데이터 생성
X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]])
y = np.array([1, 2, 3, 4, 5, 6])

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 생성 및 학습
model = LinearRegression()
model.fit(X_train, y_train)

# 예측 및 평가
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'MSE: {mse}, R^2 Score: {r2}')

"""
MSE:1.5777218104420236e-30, R^2 Score:1.0
"""

 

 

다항 회귀(Polynomial Regression)

 

독립 변수와 종속 변수 간의 비선형 관계를 모델링하는 기법

 

독립 변수의 다항식을 사용하여 모델링

𝑦 = β₀ + β₁𝑥 + β₂𝑥²+ ••• + β𝒏𝑥ⁿ + Ⲉ

 

 

Scikit-learn을 활용한 다항 회귀 모델 구현

from sklearn.preprocessing import PolynomialFeatures

# 데이터 생성
X = np.array([[1], [2], [3], [4], [5], [6]])
y = np.array([1, 4, 9, 16, 25, 36])

# 다항 특징 생성 (차수 2)
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)

# 데이터 분할 및 학습
X_train, X_test, y_train, y_test = train_test_split(X_poly, y, test_size=0.2, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)

# 예측 및 평가
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'MSE: {mse}, R^2 Score: {r2}')

"""
MSE: 4.30175712378333e-29, R^2 Score: 1.0
"""

 

 

리지 회귀 (Ridge Regression)

 

선형 회귀에 L2 정규화(Regularization)를 적용하여 과적합(Overfitting)을 방지하는 기법

 

 

리지 회귀의 손실 함수

J(β) = ∑i=1n (yi - ŷi)² + λ ∑j=1p βj²

여기서 λ값이 클수록 모델의 가중치가 작아지며, 과적합을 방지할 수 있음

 

 

Scikit-learn을 활용한 리지 회귀 모델 구현

from sklearn.linear_model import Ridge

# 데이터 생성
X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]])
y = np.array([1, 2, 3, 4, 5, 6])

# 데이터 분할 (훈련 데이터와 테스트 데이터)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 리지 회귀 모델 생성 및 학습
model = Ridge(alpha=1.0)
model.fit(X_train, y_train)

# 예측 및 평가
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'MSE: {mse}, R^2 Score: {r2}')

"""
MSE: 0.07644628099173564, R^2 Score: 0.6942148760330574
"""

 

 

 

라쏘 회귀 (Lasso Regression)

 

선형 회귀에 L1 정규화(Regularization)를 적용하여 가중치를 0으로 만들고 불필요한 변수를 제거하는 기법

특징 선택(Feature Selection)에도 유용하게 사용됨

*L1 정규화 : 일부 회귀 계수를 0으로 만들어 특징 선택을 수행 - 모델의 해석 가능성을 높이고, 불필요한 특징을 제거하는 데 유용

 

 

라쏘 회귀의 손실 함수

J(β) = ∑i=1n (yi - ŷi)² + λ ∑j=1pj|

 


Scikit-learn을 활용한 라쏘 회귀 모델 구현

from sklearn.linear_model import Lasso

# 데이터 생성
X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6,6]])
y = np.array([1, 2, 3, 4, 5, 6])

# 데이터 분할 (훈련 데이터와 테스트 데이터)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 라쏘 회귀 모델 생성 및 학습
model = Lasso(alpha=0.01)
model.fit(X_train, y_train)

# 예측 및 평가
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'MSE: {mse}, R^2 Score: {r2}')

"""
MSE: 0.0005919999999999797, R^2 Score: 0.9976320000000001
"""