인공지능/머신러닝

회귀분석-라쏘 회귀(Lasso Regression)

2^7 2024. 11. 18. 21:00

라쏘 회귀(Lasso Regression)

회귀 분석 방법 중 하나로, 데이터를 분석하고 예측하는 데 매우 유용함, 특히 모델을 간단하게 만들고 중요한 특징(변수)만 선택할 수 있도록 도와주는 특징이 있음

 

1. 라쏘 회귀 기본 개념

  • 'Least Absolute Shrinkage and Selection Operator' 의 줄임말로 모델의 복잡성을 줄이면서도 성능을 유지할 수 있는 방법
    • Shrinkage(축소): 회귀 계수를 줄이는 과정
    • Selection(선택): 중요한 변수를 자동으로 선택
  • 라쏘 회귀는 일반 선형 회귀에서 손실 함수에 L1 규제를 추가한 형태
- MSE(Mean Squared Error): 일반적인 회귀 분석의 오차(실제값과 예측값의 차이)
- λ: 규제 강도를 조절하는 하이퍼파라미터
  (값이 크면 규제가 강해저 더 많은 변수를 0으로 만들고 작으면 일반 선형 회귀와 비슷해짐)
: 각 변수의 계수(중요도를 나타냄)
더보기

① 좌표 하강법 (Coordinate Descent)

  • 한 번에 하나의 변수를 고정한 상태에서 손실 함수를 최소화하는 방법
  • 이 과정을 모든 변수에 반복 적용하며 최적의 βj값을 찾음

②  확률적 경사 하강법 (Stochastic Gradient Descent, SGD)

  • 데이터를 무작위로 샘플링하며, 손실 함수를 최소화하는 방법
  • 학습 속도가 빠르며, 대규모 데이터에서도 효율적으로 작동함

2.라쏘 회귀의 특징

1) 불필요한 변수 제거

  • 데이터를 분석할 때, 모든 변수가 결과에 큰 영향을 주는 것은 아님
  • 라쏘 회귀는 중요하지 않은 변수의 회귀 계수를 0으로 만들어서 제거
  • 이렇게 하면 모델이 더 단순해지고, 해석하기도 쉬워짐

2) 규제(Regularization)

  • 라쏘 회귀는 L1 규제(L1 Regularization)를 사용
  • 손실 함수에 규제항(패널티)를 추가해 모델의 과적합(overfitting)을 방지합니다.

3) 복잡성 감소

  • 너무 많은 변수로 인해 복잡한 모델을 만들지 않고, 꼭 필요한 변수만 사용하도록 만듬
  • 이로 인해 계산 속도도 빨라지고, 해석하기도 쉬워

 

3.라쏘 회귀의 장단점

1) 장점

  • 모델 단순화: 중요하지 않은 변수들을 자동으로 제거
  • 해석 가능성: 중요한 변수만 남겨서 결과를 해석하기 쉬움
  • 과적합 방지: 규제항을 사용해 과적합을 줄임

2) 단점

  • 모든 변수가 중요할 경우: 모든 변수가 결과에 영향을 준다면, 라쏘 회귀가 잘 작동하지 않을 수 있음
  • 상관관계가 높은 변수: 서로 상관관계가 높은 변수 중 하나만 선택되는 경우가 있음

 

4.라쏘 회귀의 학습 방법

1) 초기화

  • 모든 회귀 계수 βj를 초기화( 초기값은 일반적으로 0)

2) 손실 함수 계산

  • 현재 상태에서의 손실 함수 값을 계산

3) 규제 적용

  • L1 규제를 적용해 βj값을 줄이거나 0으로 만듬
  • 중요하지 않은 변수는 자동으로 제거

4) 손실 함수 최적화

  • 좌표 하강법이나 경사 하강법을 사용해 손실 함수를 최소화하도록 βj값을 업데이트

5) 수렴확인

  • 회귀 계수가 더 이상 변하지 않거나 손실 함수 값이 수렴하면 학습을 종료

Python의 Scikit-learn 라이브러리를 사용하여 간단하게 라쏘 회귀 모델을 구현하는 방법

from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

# 데이터 생성
X, y = make_regression(n_samples=100, n_features=10, noise=0.1, random_state=42)

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

# 라쏘 모델 훈련
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)

# 결과 출력
print("회귀 계수:", lasso.coef_)
print("제거된 변수 수:", sum(lasso.coef_ == 0))

 

 

728x90