본문 바로가기
내가 하는 데이터분석/내가 하는 머신러닝

[다중 회귀, Multiple Regression] with Python

by Pymoon 2023. 2. 1.

여러 개의 독립변수한 개의 종속변수로 이루어진 회귀 분석인 다중 회귀(Multiple Regression) 분석에 대해서 정리해보고자 한다.

 

이 전글에서 머신러닝 중 다항 회귀(Polynomial Regression)에 대해서 정리하던 중에 다중 회귀 예시가 나와서 잠깐 다룬 적이 있다.

 

다항 회귀(Polynomial Regression Model) with Python

이 전의 머신러닝에서는 단순 선형 회귀(Simple Linear Regression Model)에 대해서 다뤄보았다. 단순 선형 회귀(Simple Linear Regression Model) with Python 머신러닝 기법 중 단순 선형 회귀모델에 대해 다뤄보며

py-moon.tistory.com

 

위 게시물에서 1개의 독립변수로 학습된 모델과 12개의 독립변수로 학습된 모델의 성능에서 명확한 차이를 보였다.

그렇다면, 무조건적인 다수의 독립변수가 회귀 모델의 성능에 긍정적인 영향을 끼치는가? 그건 아니다.

모델이 복잡해짐에 따라 과대적합의 가능성이 있고, 독립변수 간에 높은 상관관계가 존재하는 다중공선성 문제도 야기될 수 있기 때문이다.

 

 

이와 같은 문제를 방지하고자 몇몇 규제를 통해서 모델의 가중치를 제한하기도 한다.

우선, 다중 선형 모델의 성능을 높이기 위해 독립변수의 부분집합을 선택하는 변수선택법이 있다.

변수선택법은 이전에 다중 회귀분석을 다뤄보면서 진행했던 경험이 있다.

 

다중 회귀분석 - 다중공선성 with Python

다중 선형 회귀분석 중에서 필수적으로 해결해야 하는 것인 다중공선성에 대해 정리해보고자 한다. 이 전엔 선형 회귀분석에 대해서 정리해 보았다. 선형 회귀분석(Linear Regression) 하나 혹은 그

py-moon.tistory.com

 

그리고 규제를 적용하는 방식이 있는데, 대표적으로 L1(Lasso) 규제, L2(Ridge) 규제, Elastic net이 있다.

규제를 적용하는 방식은 실습을 통해서 다뤄보고자 한다.

 


 

독립변수에 가중치를 제한하는 규제에 대한 실습은 scikit-learn에서 제공하는 당뇨병 데이터를 사용해서 진행한다.

 

1
2
3
4
5
6
7
from sklearn.datasets import load_diabetes
import pandas as pd
import numpy as np
 
diabetes = load_diabetes()
= pd.DataFrame(diabetes.data, columns = diabetes.feature_names)
= diabetes.target
cs

 

> 실습에 필요한 라이브러리와 데이터를 불러와 준다.

 

 

1
2
3
4
5
6
7
8
9
10
11
from sklearn.linear_model import Ridge
 
alpha = np.logspace(-315)
data = []
for i, a in enumerate(alpha):
    ridge = Ridge(alpha = a)
    ridge.fit(x, y)
    data.append(pd.Series(np.hstack([ridge.coef_])))
    
df_ridge = pd.DataFrame(data, index = alpha)
df_ridge.columns = x.columns
cs

 

> 먼저, L2규제인 릿지 회귀다.

> 릿지 회귀는 계수를 제곱한 값을 기준으로 규제를 적용하는 방식이다. 

> 3줄에 np.logspace(-3, 1, 5)를 해석하자면 [0.001, 0.01, 0.1, 1, 10]로 표현할 수 있다.

> 이런 식으로 alpha값을 10배씩 늘려가는 이유는 alpha값이 크면 규제 강도가 세지므로 계수의 값을 더 줄이고 좀 더 과소적합이 되도록 유도하고, alpha값이 작으면 계수를 줄이는 역할이 줄어들고 선형 회귀모델과 유사해지므로 과대적합될 가능성이 커지므로 점진적인 변화를 관찰하기 위함이다.

> 따라서 각 alpha값 별로 독립변수의 값을 측정하여 새로운 데이터프레임을 만든다.

 

 

df_ridge

> 그렇게 해서 만든 데이터프레임은 이러하다.

> 각 가중치별로 같은 변수지만 다른 릿지 회귀계수를 가지는 것을 확인할 수 있다.

 

 

> alpha값이 증가함에 따라 릿지 회귀계수의 값이 0으로 수렴하는 것을 확인할 수 있다.

 

 

> 이번에는 x축이 변수 명으로 이루어진 그래프이다.

> 마찬가지로 alpha값이 커지면서 릿지 회귀계수값이 점차 0으로 수렴하는 것을 확인할 수 있다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
from sklearn.linear_model import Lasso
 
alpha = np.logspace(-315)
data = []
for i, a in enumerate(alpha):
    lasso = Lasso(alpha = a)
    lasso.fit(x, y)
    data.append(pd.Series(np.hstack([lasso.coef_])))
    
df_lasso = pd.DataFrame(data, index = alpha)
df_lasso.columns = x.columns
cs

 

> 두 번째로 L1규제인 라쏘 회귀이다.

> 라쏘 회귀는 계수의 절댓값을 기준으로 규제를 적용하는 방식이다.

> 코드의 구성과 프로세스는 릿지 회귀와 동일하다.

 

 

df_lasso

> 릿지 회귀와 비교했을 때 0으로 수렴하는 지점이 라쏘 회귀가 더 빠르다는 것을 위와 같은 데이터프레임을 통해서 알 수 있다.

> 이로 인해 라쏘 회귀가 릿지 회귀보다 규제가 강하다는 사실도 확인이 가능하다.

 

 

> 시각화를 통해서 위에서 언급했었던 계수가 0으로 수렴하는 지점이 빠르다는 자료로 활용할 수 있다.

 

 

> 보라색 선이 alpha값이 10일 때의 계수를 나타내고 있는데 정확이 모든 변수 다 0을 가리키고 있음을 확인할 수 있다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
from sklearn.linear_model import ElasticNet
 
alpha = np.logspace(-315)
data = []
for i, a in enumerate(alpha):
    ela = ElasticNet(alpha = a)
    ela.fit(x, y)
    data.append(pd.Series(np.hstack([ela.coef_])))
    
df_ela = pd.DataFrame(data, index = alpha)
df_ela.columns = x.columns
cs

 

> 마지막으로, 엘라스틱 넷이다.

> 엘라스틱 넷은 릿지 회귀와 라쏘 회귀를 절충한 알고리즘으로, 수식으로 보면 단순히 두 알고리즘 식을 더한 것과 같다.

 

 

df_ela

> 엘라스틱 넷으로 데이터를 학습한 데이터프레임이다.

 

 

> alpha값에 따라서 계수가 수렴하는 추이를 확인할 수 있다.

 

 

> 다른 규제에서와는 다르게 엘라스틱 넷의 그래프에서 갈색 선인 선형 회귀선과 alpha값에 따른 그래프의 차이가 도드라지게 보인다.

 

 

> 세 규제의 차이를 좀 더 명확하게 비교하기 위한 자료이다.

> 계수가 0으로 수렴하는 구간이 빠른 게 엘라스틱넷, 라쏘, 릿지 순으로 보인다.

 


 

OUTTRO.

다항 회귀까지는 좋았으나 다중 회귀부터는 좀 어렵다고 느낀다.

리뷰하자면,

회귀모델에서 독립변수가 2개 이상인 다중 회귀를 다룰 때 나타날 수 있는 과대적합이나 모델 복잡도로 일어날 수 있는 문제를 방지하기 위해 독립변수의 가중치를 제한하는 방법을 사용할 수 있다.

1. L1규제 - 라쏘 회귀

계수의 절댓값을 기준으로 규제를 가하는 방식(계수가 0으로 수렴하는 추이가 더디다.)

2. L2규제 - 릿지 회귀

계수의 제곱한 값을 기준으로 규제를 가하는 방식(계수가 0으로 수렴하는 추이가 가파르다.)

3. Elastic net - 엘라스틱 넷

라쏘 회귀와 릿지 회귀의 절충안으로, 두 식을 더한 것과 같다.