Programming

Lasso 회귀와 ElasticNet 회귀 이해 및 실습

Lucas.Kim 2026. 1. 5. 08:19
반응형

1. Lasso 회귀 개요 (L1 Regularization)

Lasso 회귀는 선형회귀에 L1 규제를 적용한 모델입니다.
L1 규제는 회귀계수 WW절대값 합에 패널티를 부여합니다.

✔ Lasso 비용 함수

Cost(W)=RSS(W)+α⋅∥W∥1\text{Cost}(W) = RSS(W) + \alpha \cdot \|W\|_1

  • RSS(W): 예측값과 실제값의 잔차 제곱합
  • ∥W∥1\|W\|_1: 회귀계수 절대값의 합
  • α\alpha: 규제 강도

✔ Lasso의 핵심 특징

  • L2(Ridge)는 계수를 작게 만들지만
  • L1(Lasso)는 중요하지 않은 계수를 0으로 만듦
  • 즉, 자동 피처 선택(Feature Selection) 효과를 가짐
  • 고차원 데이터나 불필요한 피처가 많은 경우 유리

사이킷런에서는 Lasso 클래스를 통해 Lasso 회귀를 제공합니다.

2. 공통 평가 함수 정의 (Ridge / Lasso / ElasticNet)

아래 함수는 규제 회귀 모델을 공통적으로 평가하기 위한 유틸리티 함수입니다.

from sklearn.linear_model import Lasso, ElasticNet, Ridge
from sklearn.model_selection import cross_val_score
import pandas as pd
import numpy as np

# 모델별(alpha 값별) 5-Fold RMSE 평가 및 회귀계수 반환 함수
def get_linear_reg_eval(model_name, params=None, X_data_n=None, y_target_n=None, 
                        verbose=True, return_coeff=True):
    """
    [목적]
    - Ridge / Lasso / ElasticNet 회귀 모델에 대해
      alpha 값 변화에 따른 성능(RMSE)과 회귀계수 변화를 비교

    [주요 기능]
    1. alpha 값별로 모델 학습
    2. 5-Fold 교차검증 RMSE 계산
    3. 전체 데이터로 재학습 후 회귀계수 저장
    """
    coeff_df = pd.DataFrame()

    if verbose:
        print('####### ', model_name , '#######')

    for param in params:
        # 모델 선택
        if model_name == 'Ridge':
            model = Ridge(alpha=param)
        elif model_name == 'Lasso':
            model = Lasso(alpha=param)
        elif model_name == 'ElasticNet':
            model = ElasticNet(alpha=param, l1_ratio=0.7)

        # 5-Fold 교차검증 (MSE → RMSE 변환)
        neg_mse_scores = cross_val_score(
            model,
            X_data_n,
            y_target_n,
            scoring="neg_mean_squared_error",
            cv=5
        )
        avg_rmse = np.mean(np.sqrt(-1 * neg_mse_scores))

        print(f'alpha {param}일 때 5 폴드 세트의 평균 RMSE: {avg_rmse:.3f}')

        # 회귀계수 확인을 위해 전체 데이터로 재학습
        model.fit(X_data_n, y_target_n)

        if return_coeff:
            coeff = pd.Series(model.coef_, index=X_data_n.columns)
            colname = 'alpha:' + str(param)
            coeff_df[colname] = coeff

    return coeff_df

핵심 포인트

  • cross_val_score는 성능만 반환하므로
    계수 확인을 위해 재학습이 필요
  • 동일한 방식으로 Ridge / Lasso / ElasticNet 비교 가능

3. Lasso 회귀 실습

3-1. alpha 값별 성능 평가

# Lasso에서 사용할 alpha 값들
lasso_alphas = [0.07, 0.1, 0.5, 1, 3]

# Lasso 회귀 평가
coeff_lasso_df = get_linear_reg_eval(
    'Lasso',
    params=lasso_alphas,
    X_data_n=X_data,
    y_target_n=y_target
)

alpha 0.07일 때 5 폴드 세트의 평균 RMSE: 5.612
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 5.615
alpha 0.5일 때 5 폴드 세트의 평균 RMSE: 5.669
alpha 1일 때 5 폴드 세트의 평균 RMSE: 5.776
alpha 3일 때 5 폴드 세트의 평균 RMSE: 6.189

해석

  • alpha 증가 → 규제 강화 → 성능 점진적 저하
  • 너무 큰 alpha는 과소적합(Underfitting) 유발

3-2. Lasso 회귀계수 확인 (Feature Selection 효과)

# 가장 작은 alpha 기준으로 계수 정렬
sort_column = 'alpha:' + str(lasso_alphas[0])
coeff_lasso_df.sort_values(by=sort_column, ascending=False)

중요 관찰

  • alpha가 커질수록 많은 피처의 회귀계수가 0
  • 실제로 모델에서 해당 피처가 제거됨
  • Lasso = 성능 + 해석력 확보

4. ElasticNet 회귀 개요

ElasticNet 회귀L1 + L2 규제를 결합한 모델입니다.

✔ ElasticNet 비용 함수

Cost(W)=RSS(W)+α1∥W∥1+α2∥W∥22\text{Cost}(W) = RSS(W) + \alpha_1 \|W\|_1 + \alpha_2 \|W\|_2^2

  • L1 규제: 피처 선택
  • L2 규제: 계수 안정화

✔ ElasticNet이 필요한 이유

  • Lasso는 상관관계 높은 피처 중 하나만 선택하는 경향
  • alpha 변화에 따라 계수가 급격히 변동 가능
  • ElasticNet은 L2를 추가해 계수 변동을 완화

사이킷런에서는 ElasticNet(alpha, l1_ratio) 사용

  • alpha = 전체 규제 강도
  • l1_ratio = L1 비율 (예: 0.7 → L1 70%, L2 30%)

5. ElasticNet 회귀 실습

# ElasticNet에서 사용할 alpha 값들
elastic_alphas = [0.07, 0.1, 0.5, 1, 3]

coeff_elastic_df = get_linear_reg_eval(
    'ElasticNet',
    params=elastic_alphas,
    X_data_n=X_data,
    y_target_n=y_target
)

alpha 0.07일 때 5 폴드 세트의 평균 RMSE: 5.542
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 5.526
alpha 0.5일 때 5 폴드 세트의 평균 RMSE: 5.467
alpha 1일 때 5 폴드 세트의 평균 RMSE: 5.597
alpha 3일 때 5 폴드 세트의 평균 RMSE: 6.068

해석

  • 중간 alpha(≈0.5)에서 가장 좋은 성능
  • Lasso보다 안정적인 성능 곡선

5-1. ElasticNet 회귀계수 확인

sort_column = 'alpha:' + str(elastic_alphas[0])
coeff_elastic_df.sort_values(by=sort_column, ascending=False)

특징 요약

  • 일부 계수는 0 (L1 효과)
  • 나머지는 완만하게 축소 (L2 효과)
  • 피처 선택 + 안정성 동시 확보

6. 전체 정리

모델 규제방식 특징 적합한 상황
Ridge L2 계수 축소 다중공선성
Lasso L1 계수 0 → 피처 선택 고차원, 해석
ElasticNet L1 + L2 안정적 피처 선택 상관 피처 다수

✔ 실무 권장 순서
Ridge → Lasso → ElasticNet 비교 후 선택

반응형