인공지능/머신러닝
회귀분석-라쏘 회귀(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