상세 컨텐츠

본문 제목

회귀분석-Elastic Net

인공지능/머신러닝

by 2^7 2024. 11. 20. 21:00

본문

Elastic Net

 라쏘 회귀(Lasso Regression)와 릿지 회귀(Ridge Regression)의 장점을 결합한 회귀 분석 방법으로 데이터를 분석하고 예측하는 데 유용하며, 다수의 상관관계가 높은 변수고차원 데이터에서 특히 효과적

 

1. Elastic Net이란?

  • 라쏘 회귀와 릿지 회귀를 결합한 모델로, L1 규제와 L2 규제를 동시에 적용
    • L1 규제(Lasso): 불필요한 변수를 제거하고 중요한 변수만 선택하는 역할
    • L2 규제(Ridge): 모든 변수의 계수를 작게 만들어 과적합을 방지하는 역할
  • 다수의 상관관계가 높은 변수가 있거나 불필요한 변수가 많고, 중요한 변수만 선택해야 할 때, 데이터 차원이 높아 릿지 회귀와 라쏘 회귀가 제한적인 경우 사용하면 적합함
  • MSE(Mean Squared Error): 일반 회귀 분석에서 사용하는 오차 함수입니다.
  • α: 규제 강도를 조절하는 파라미터. 값이 클수록 규제가 강해집니다.
  • ρ: L1 규제와 L2 규제의 비율을 조절하는 파라미터 (0≤ρ≤10)
    • : 라쏘 회귀처럼 작동.
    • ρ=0: 릿지 회귀처럼 작동.
    • 0<ρ<1 : L1과 L2 규제를 혼합한 Elastic Net.

 

2. Elastic Net 특징

 1) 상관관계가 높은 변수 처리

  • 라쏘 회귀는 상관관계가 높은 변수 중 하나만 선택하는 경향이 있습니다. Elastic Net은 여러 변수를 함께 선택할 수 있어 더 안정적

 2) 규제의 유연성

  • L1과 L2 규제를 함께 사용해 불필요한 변수 제거와 모델 안정화를 동시에 달성

 3) 고차원 데이터에 적합

  • 변수의 수가 데이터의 샘플 수보다 많은 경우에도 효과적으로 작동

 4) 하이퍼파라미터 튜닝 필요

  • 와 ρ 값을 적절히 설정해야 최적의 성능을 낼 수 있음

 5) 계산 복잡성 증가

  • 라쏘나 릿지 회귀에 비해 계산량이 많음

 

3. Elastic Net 학습 방법

 Elastic Net은 라쏘와 릿지 회귀처럼 손실 함수를 최소화하는 방향으로 학습합니다. 좌표 하강법(Coordinate Descent)과 같은 최적화 알고리즘을 사용해 계수 βj를 반복적으로 업데이트

  •  1) 모든 회귀 계수를 초기화
  •  2) 현재 상태에서 손실 함수 값을 계산
  •  3) L1 규제와 L2 규제를 적용해 손실 함수를 최소화하며 중요한 변수는 남기고 불필요한 변수는 줄이거나 제거
  •  4) 회귀 계수가 더 이상 변하지 않으면 학습을 종료

 

4. Elastic Net과 라쏘, 릿지 회귀 비교

특징 라쏘 회귀 릿지 회귀 Elastic Net
규제 L1 규제 L2 규제 L1 + L2 규제
변수 선택 일부 변수 제거 (0으로 설정) 모든 변수를 사용 (작게 만듦) 일부 제거 + 안정적 선택
상관관계가 높은 변수 하나만 선택 모두 유지 함께 선택 가능
사용 상황 중요한 변수만 선택해야 할 때 과적합을 방지해야 할 때 고차원 데이터, 변수 상관관계

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

from sklearn.linear_model import ElasticNet
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)

# Elastic Net 모델 생성 및 학습
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)  # alpha: 규제 강도, l1_ratio: L1과 L2 비율
elastic_net.fit(X_train, y_train)

# 결과 출력
print("회귀 계수:", elastic_net.coef_)
print("제거된 변수 수:", sum(elastic_net.coef_ == 0))
print("모델 점수 (R^2):", elastic_net.score(X_test, y_test))
728x90

관련글 더보기