Processing math: 0%
본문 바로가기

카테고리 없음

L1, L2 Regulariztion(정규화)에 대해(Rasso, Ridge)

1. L1, L2 Regularization 이란?

(1) L1, L2 Regularization이란?

Overfitting에 대한 직관적 설명 (출처: https://www.superannotate.com/blog/overfitting-and-underfitting-in-machine-learning)

 머신러닝 모델을 학습시키다 보면 Overfitting(모델이 학습 데이터에 지나치게 맞춰져 새로운 데이터에 대한 예측 능력이 떨어지는 현상)을 직면하기도 하는데, 이러한 Overfitting 해결하기 위한 방법 중 하나로 L1, L2 정규화(regularization)가 있다

 

참고로, Lasso와 Ridge는 각각 L1, L2 Regulization를 사용하며 regression model의 overfitting 문제를 해결하기 위한 model

(2) L1, L2 Regularization을 이해하기 위한 Norm 쉽게 이해하기!

Norm :  Vector의 물리적인 길이(크기) (Matrix Norm도 있지만 여기서는 Vector Norm만 다룰 예정)

  • Norm을 표현할 때 기호 표현 방법  =  

L1 - norm과 L2-norm의 수학적 정의는 아래와 같다!

▶ L1-norm : 벡터의 각 원소들의 크기(절대값)의 합

\left\|x \right\|_{1} = \sum_{i=1}^{n}\left|x_{i} \right|

 

▶ L2-norm : 벡터의 각 원소들의 크기(절대값)의 제곱의 합의 제곱근

\left\|x \right\|_{2} = \sqrt{\sum_{i=1}^{n}\left|x_{i} \right|^{2}}

 

L1 - norm과 L2-norm의 직관적 설명

위 벡터 x에 대해서, L1-norm, L2-norm 계산결과는 각각 아래와 같다.

L1 - norm :  \left\|x \right\|_{1} = \left|3 \right| + \left|4 \right| = 7

L1 - morm :  \left\|x \right\|_{2} = \sqrt{\left|3 \right|^{2} + \left|4 \right|^{2}} = 5

 

norm 계산에 대한 기하학적으로 설명한다면 아래의 두 그림으로 설명할 수 있다

출처 : https://blog.naver.com/PostView.naver?blogId=lagrange0115&logNo=222828050979&categoryNo=20&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search

좌측의 그림이 L1 - norm 에서의 크기를 정의하는 방식이고, 우측의 그림이 L2 - norm 에서의 그림을 정의하는 방식이 되는 것,

 

Norm의 값이 1인 벡터의 끝을 이은 도형을 그래프로 그릴때 L1과 L2의 모습은 아래과 같은데 각각 마름모와 원의 도형이 그려진다

출처, https://www.youtube.com/shorts/6YX1xXj4dOU

각각,

주황색이 L1 - norm(마름모)

파란색이 L2 - norm(원)

노랑생은 infinity - norm (여기 글에서는 다루지 않지만 가장 큰 W값이 norm이 되는 방식)

이 도형은 앞으로 나올 가중치 벡터에 제약을 거는 방식에 영향이 있다. 

 

(3)L1, L2 Regularization 수식설명

L1, L2 Regularization의 수식은 아래와 같다.

https://medium.com/analytics-vidhya/l1-vs-l2-regularization-which-is-better-d01068e6658c

 공식에서 볼 수 있듯이, L1 정규화는 가중치(Wj)에 절대값을 추가하여 Loss 함수의 페널티 항을 추가하여 규제를 하며, L2 정규화는 비용 함수에서 가중치(Wj)의 제곱 값을 추가하여 규제를 한다

 각 항의 역할은 가중치 값의 크기를 제한하는 것으로 가중치 값이 커질수록 더 큰 페널티를 부과하여 모델의 복잡성을 줄인다

즉, 손실값이 떨어지는 최저점을 높이며, 손실값 하강속도가 느려짐으로 규제를 거는 것이 L1, L2 Regularization이다!

(3) L1, L2를 적용하면 어떻게 과적합이 방지되는 이유(L1, L2 Regularization 의 직관적 이해)

출처 : https://www.linkedin.com/pulse/intuitive-visual-explanation-differences-between-l1-l2-xiaoli-chen/

 

위에서 시각화한 그림은 가중치(weight)가 2개일 때 L1, L2 규제의 효과를 보여주는 그림으로

  • 검은색 점 : 규제가 없을 경우의 최적 가중치(loss가 최소가 되는 가중치)
  • 마름모 : L1 규제 하에서 가능한 가중치 영역 
  • 원 : L2 규제 하에서 가능한 가중치 영역

여기서, 영역(원, 마름모) 빨간색 선이 닿아 있는 부분중 가장 검은색 점과 가까운 지점이 규제하에 최적의 가중치로,

 

L1의 경우 축에 닿게되어 일부 가중치가 0이되며

L2의 경우 가중치가 0에 가까워지게 된다

즉, L1가중치 값을 완전히 0으로 축소하는 경향이 있고 L2는 가중치 값을 0에 가까운 값으로 축소하는 경향이 있다

2. LinearRegression, Rasso, Ridge 을 적용한 후 결과 비교 

사이킷런의 와인데이터 가져오기

from sklearn.datasets import load_wine
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error

wine = load_wine()
wine_df = pd.DataFrame(data=wine.data, columns=wine.feature_names)
target_df = pd.DataFrame(data=wine.target, columns=['Y'])
X_train, X_test, y_train, y_test = train_test_split(wine_df, target_df, test_size= 0.3, random_state=101)

 

모델의 결과를 각각 MAE, MSE, MRSE로 확인하고, 학습이 완료된 모델의 가중치를 확인하였다

LinearRegression

model = LinearRegression()
model.fit(X_train, y_train)

pred = model.predict(X_test)
 
print("result of linear regression")
print('Mean Absolute Error:', mean_absolute_error(y_test, pred))
print('Mean Squared Error:', mean_squared_error(y_test, pred))
print('Mean Root Squared Error:', np.sqrt(mean_squared_error(y_test, pred)))

print("\n\n coefficient linear regression")
print(model.coef_)
result of linear regression
Mean Absolute Error: 0.25128973939722626
Mean Squared Error: 0.1062458740952556
Mean Root Squared Error: 0.32595379134971814


 coefficient linear regression
[[-8.09017190e-02  4.34817880e-02 -1.18857931e-01  3.65705449e-02
  -4.68014203e-04  1.41423581e-01 -4.54107854e-01 -5.13172664e-01
   9.69318443e-02  5.34311136e-02 -1.27626604e-01 -2.91381844e-01
  -5.72238959e-04]]

Rasso 결과

from sklearn.linear_model import Lasso

L1 = Lasso(alpha=0.05, max_iter=5)
L1.fit(X_train, y_train)
pred = L1.predict(X_test)

print("result of Lasso")
print('Mean Absolute Error:', mean_absolute_error(y_test, pred))
print('Mean Squared Error:', mean_squared_error(y_test, pred))
print('Mean Root Squared Error:', np.sqrt(mean_squared_error(y_test, pred)))

print("\n\n coefficient of Lasso")
print(L1.coef_)
result of Lasso
Mean Absolute Error: 0.24845768841769436
Mean Squared Error: 0.10262989110341268
Mean Root Squared Error: 0.32035900346862844


 coefficient of Lasso
[-0.          0.         -0.          0.03295564  0.00109495  0.
 -0.4027847   0.          0.          0.06023131 -0.         -0.12001119
 -0.00078971]

 

L1 Regularization 가 적용되어 Weight가 0으로 된 모습

Ridge 결과

from sklearn.linear_model import Ridge

L2 = Ridge(alpha=0.05, max_iter=5)
L2.fit(X_train, y_train)
pred = L2.predict(X_test)

print("result of Ridge")
print('Mean Absolute Error:', mean_absolute_error(y_test, pred))
print('Mean Squared Error:', mean_squared_error(y_test, pred))
print('Mean Root Squared Error:', np.sqrt(mean_squared_error(y_test, pred)))

print("\n\n coefficient of Ridge")
print(L2.coef_)
result of Ridge
Mean Absolute Error: 0.251146695993643
Mean Squared Error: 0.10568076460795564
Mean Root Squared Error: 0.3250857803841251


 coefficient of Ridge
[[-8.12456257e-02  4.35541496e-02 -1.21661565e-01  3.65979773e-02
  -3.94014013e-04  1.39168707e-01 -4.50691113e-01 -4.87216747e-01
   9.54111059e-02  5.37077039e-02 -1.28602933e-01 -2.89832790e-01
  -5.73136185e-04]]
L2 Regularization 가 적용되어 Weight값이 규제가 들어갔지만 0이 된 가중치는 보이지 않음

 

 

모델의 선택기준

Lasso, Ridge 모델의 선택기준은 아래와 같다

 

 

1. 변수 선택 

  • 중요한 변수만 선택하고 싶다면 Lasso를 선택
  • 모든 변수를 모델에 포함하고 싶다면 Ridge를 선택

2. 변수 간 상관관계

  • 변수 간 상관관계가 높다면 Ridge를 선택
  • 변수 간 상관관계가 낮다면 Lasso를 선택
    (lasso 모델의 경우 상관관계가 높을 시 나머지 변수를 0으로 바꾸기 때문)

3. 데이터 크기:

  • 데이터 크기가 크고 변수가 많다면 계산 비용이 낮은 Ridge를 선택하는 것이 좋음
    (Rasso는 좌표 하강법 같은 반복적인 알고리즘을 사용하여 해를 구해야 함)

 

 

근데 일반적으로 Ridge 모델의 성능이 좋다고 함. 끝.