[Machine Learning]

[Machine Learning] Regression(회귀) 정리

dyk98 2024. 12. 6. 20:12

회귀기법이란?

  • 회귀 모델은 연속적인 값을 예측하는 문제를 다루는 기법입

주요 회귀 모델

  • 선형 회귀, 다항 회귀, 리지 회귀, 라쏘 회귀.

선형 회귀

선형 회귀는 종속 변수와 독립 변수 간의 선형 관계를 모델링합니다.

1. 선형 회귀 (Linear Regression)

차이점:

  • 선형 회귀는 종속 변수와 독립 변수 간의 선형 관계를 모델링합니다.
  • 단순 선형 회귀는 하나의 독립 변수와 하나의 종속 변수 간의 관계를 모델링하며, 다중 선형 회귀는 여러 독립 변수와 하나의 종속 변수 간의 관계를 모델링합니다.

장점:

  • 구현이 간단하고 해석이 쉬워 빠른 초기 분석에 유용합니다.
  • 수학적으로 간단하고 계산 비용이 적어 빠릅니다.

단점:

  • 선형 관계만을 가정하므로, 실제 데이터가 비선형 관계일 경우 모델 성능이 떨어질 수 있습니다.
  • 과적합 문제를 해결하기 위한 정규화 기능이 없어서 다수의 특성이 있을 때 과적합 위험이 존재합니다.

사용 용도:

  • 독립 변수와 종속 변수 간의 관계가 선형적일 때 사용합니다.
  • 예시: 주택 가격 예측, 간단한 수학적 모델링, 경제 지표 분석 등.
import numpy as np
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'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')

단순 선형 회귀 vs 다중 선형 회귀

단순 선형회귀 와 다중 선형회귀 수식

예시:

주택 가격(y)을 예측하는 모델에서, 단순 선형 회귀는 면적(x)만을 고려하지만, 다중 선형 회귀는 면적(x1), 방 개수(x2), 층수(x3) 등 여러 요인을 고려합니다.

다항 회귀

다항 회귀는 비선형 관계를 모델링하며, 독립 변수의 다항식을 사용합니다.

  • 수식

다항회귀 수식(Polynomial Regression)

예시:

학생의 시험 점수(y)를 예측할 때, 공부 시간(x1), 수면 시간(x2), 운동 시간(x3) 등 여러 요인을 고려하면서도 각 요인의 영향력을 균형 있게 조절하여 더 안정적인 예측을 할 수 있습니다.

2. 다항 회귀 (Polynomial Regression)

차이점:

  • 다항 회귀는 비선형 관계를 모델링하기 위해 독립 변수의 다항식을 사용합니다.
  • 기본적으로 선형 회귀를 확장한 모델로, 비선형 함수의 곡선 형태를 모델링할 수 있습니다.

장점:

  • 비선형 관계를 다항식으로 모델링하여 선형 회귀의 한계를 극복할 수 있습니다.
  • 적절한 차수를 선택하면 복잡한 관계도 모델링할 수 있습니다.

단점:

  • 차수가 높을수록 모델이 복잡해지고 과적합(overfitting)의 위험이 커집니다.
  • 모델이 너무 복잡하면 일반화 성능이 떨어질 수 있습니다.

사용 용도:

  • 비선형 관계를 모델링해야 할 때 유용합니다.
  • 예시: 주식 가격 예측, 물리학적 모델링, 경제 변수 간의 비선형 관계 분석 등.
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 데이터 생성
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'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')

리지 회귀

3. 리지 회귀 (Ridge Regression)

리지 회귀는 선형 회귀의 일종으로, L2 정규화를 통해 회귀 계수의 크기를 제어하여 과적합을 방지.

  • 수식

Ridge Regression 수식

차이점:

  • 리지 회귀는 선형 회귀L2 정규화(패널티)를 추가하여 모델의 복잡도를 줄이는 방법입니다.
  • 회귀 계수의 크기를 제한하여 과적합을 방지합니다.

장점:

  • 과적합을 방지하면서 모델의 복잡도를 제어할 수 있습니다.
  • 다수의 특성이 있을 때 성능이 향상됩니다.

단점:

  • L2 정규화는 계수를 0으로 만드는 특징 선택을 수행하지 않으므로, 특징 선택에 적합하지 않습니다.
  • 모델 해석이 선형 회귀보다 복잡할 수 있습니다.

사용 용도:

  • 다수의 독립 변수가 있을 때 과적합을 방지하고 모델 안정성을 높이기 위해 사용합니다.
  • 예시: 고차원의 데이터, 예측 정확도가 중요한 모델에서 유용합니다.
from sklearn.linear_model import Ridge
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 = 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'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')

라쏘 회귀

라쏘 회귀는 L1 정규화를 사용하여 특징 선택을 수행합니다.

  • 수식

Lasso Regression 수식

예시:

고객의 구매 금액(y)을 예측할 때, 나이(x1), 소득(x2), 과거 구매 이력(x3), 웹사이트 방문 횟수(x4) 등 다양한 특징 중에서 가장 중요한 특징만을 자동으로 선택하여 모델을 단순화할 수 있습니다.

4. 라쏘 회귀 (Lasso Regression)

차이점:

  • 라쏘 회귀는 L1 정규화(패널티)를 사용하여 회귀 계수의 절대값 합을 최소화합니다.
  • 일부 회귀 계수를 0으로 만들어 특징 선택을 수행할 수 있습니다.

장점:

  • L1 정규화를 통해 특징 선택이 가능하여, 불필요한 변수 제거에 유용합니다.
  • 과적합 방지와 함께 중요한 특성만을 선택하여 모델의 해석 가능성을 높일 수 있습니다.

단점:

  • L1 정규화의 강도가 너무 크면 모델 성능이 저하될 수 있습니다.
  • 특징 선택이 자동으로 되기 때문에, 모든 변수가 중요한 경우에는 성능이 떨어질 수 있습니다.

사용 용도:

  • 변수 선택이 중요한 경우, 예를 들어 많은 변수를 다룰 때 불필요한 변수를 제거하고 모델을 간단화하려는 경우 사용합니다.
  • 예시: 특성 선택을 통해 모델을 해석 가능하고 간단하게 만들 때, 또는 고차원 데이터에서 중요한 특성을 선택할 때 유용합니다. 
from sklearn.linear_model import Lasso
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 = Lasso(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'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')