bskyvision RSS 태그 관리 글쓰기 방명록
2020-01-20 03:38:11
728x90

지난 시간에 파이썬에 대해 선형 회귀를 실행하는 코드에 대해 살펴봤습니다. 오늘은 지난 시간에 예고한 것처럼 선형 회귀를 업그레이드한 것인 릿지 회귀에 대해 다루도록 하겠습니다. 선형 회귀에 대해 익숙치 않은 분들은 오늘 이 글을 보시기 전에 아래 두 포스팅을 보고 오시길 추천드립니다. 

 

선형 회귀(linear regression) 그리고 라쏘(Lasso)

[파이썬] 선형 회귀(linear regression)  

 

데이터의 특성이 단 하나일 경우에는 선형 회귀나 릿지 회귀나 다를 것이 없습니다. 똑같은 성능을 보입니다. 그러나 특성이 다수일 경우에는 릿지 회귀가 좀 더 잘 작동할 가능성이 큽니다. 릿지 회귀는 선형 회귀와 달리 모델의 복잡도를 조정할 수 있기 때문입니다. 복잡도를 조정할 수 있다는 말은 사용자가 설정 가능한 파라미터가 있다는 뜻으로 받아들이셔도 좋습니다.

 

선형 회귀의 경우  최적의 가중치들을 선택하기 위해서 타깃값과 예측값의 차를 제곱해서 평균낸 것, 즉 평균제곱오차(mean squared error, MSE)를 최소로 만드는 가중치들을 찾습니다.

 

평균제곱오차

 

릿지 회귀는 여기에다가 제약 조건을 덧붙입니다. "그 가중치들의 절대값들을 가능한 한 작게 만들어라!" 따라서 릿지 회귀는 다음과 같은 식을 최소로 만드는 가중치들을 찾습니다. 

 

여기서 alpha가 사용자가 설정할 수 있는 파라미터입니다. 

 

그런데 이러한 제약 조건을 붙임으로 얻을 수 있는 효과는 무엇일까요? 만약 alpha 값을 크게 설정해주면 그만큼 가중치들의 절대값들은 작아져야합니다. 그러면 그만큼 기울기가 줄어들겠죠? 기울기가 줄어든다는 말은 특성들이 출력에 미치는 영향력이 줄어든다고 볼 수 있습니다. 즉, 현재 특성들에 덜 의존하겠다는 뜻으로 볼 수 있습니다. 반대로 alpha 값을 작게 설정해주면 가중치들의 절대값들은 조금 커지게 됩니다. 만약 alpha 값을 줄이고 줄여서 0에 가깝게 설정해준다면 사실상 선형 회귀와 동일해지겠죠. alpha가 커지면 커질수록 과소적합이 될 가능성이, alpha가 작으면 작을수록 과대적합이 될 가능성이 커집니다. 따라서 적정한 alpha값을 찾아주는 것은 바로 릿지 회귀를 사용하는 사람의 책임이 됩니다. 

 

자 그럼 이제 릿지 회귀의 성능이 선형 회귀와 비교해서 어떤가를 살펴보겠습니다. 이를 위해 보스턴 주택가격 데이터셋을 활용하겠습니다. 이 데이터셋은 506개의 샘플을 갖고 있고, 각 샘플은 105개의 특성을 갖고 있습니다.

 

먼저 기존의 선형 회귀의 성능이 어떤지 확인해보도록 하겠습니다. 파이썬 코드는 다음과 같이 작성했습니다. 

 

import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.load_extended_boston() # 보스턴 주택가격 데이터셋 불러오기

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 데이터셋을 훈련셋과 테스트셋으로 분리

lr = LinearRegression().fit(X_train, y_train) # 선형 회귀 모델 훈련

print("training set score: {:.2f}".format(lr.score(X_train, y_train))) # 훈련셋 결정계수
print("test set score: {:.2f}".format(lr.score(X_test, y_test))) # 테스트셋 결정계수

 

이 코드를 실행했을 때 터미널에 출력되는 결과입니다. 

 

선형 회귀 성능

 

훈련셋의 점수는 0.95로 상당히 높은 반면에, 테스트셋 점수는 0.61로 좋지 않습니다. 게다가 두 점수의 차이가 크기 때문에 과대적합된 상태입니다. 그렇지만 선형 회귀 모델은 설정가능한 파라미터가 없기 때문에 이 문제를 해결할 방법이 없습니다. 

 

그러면 동일한 데이터셋에서 릿지 회귀는 어떤 성능을 내는지 확인해보겠습니다. 파이썬 코드는 다음과 같이 작성했습니다. 우선 파라미터 alpha를 디폴트 값(alpha = 1)으로 설정했습니다. 

 

import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge 
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.load_extended_boston() # 보스턴 주택가격 데이터셋 불러오기

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 데이터셋을 훈련셋과 테스트셋으로 분리

ridge = Ridge().fit(X_train, y_train) # 릿지 회귀 모델 훈련

print("training set score: {:.2f}".format(ridge.score(X_train, y_train))) # 훈련셋 결정계수
print("test set score: {:.2f}".format(ridge.score(X_test, y_test))) # 테스트셋 결정계수

 

릿지 회귀 성능 (alpha = 1)

 

선형 회귀 모델에 비해 테스트셋 점수가 0.61에서 0.75로 많이 좋아진 것을 알 수 있습니다. 그럼 디폴트값 말고 여러 값을 대입해서 최적의 alpha 값을 찾아보도록 하겠습니다. 

 

alpha = 1보다 큰 값들인 alpha = 2, alpha = 5, alpha = 10으로 설정해보겠습니다. 위 파이썬 코드에서 다음 한 줄만 바꿔주면 됩니다. 

ridge = Ridge(alpha=2).fit(X_train, y_train) # 릿지 회귀 모델 훈련

 

릿지 회귀 (alpha = 2)
릿지 회귀 (alpha = 5)
릿지 회귀 (alpha = 10)

 

alpha가 1에서 커질수록 오히려 성능이 나빠진것을 확인할 수 있습니다. 따라서 최적의 alpha 값을 찾기 위해서는 alpha값을 줄여가야 합니다. 따라서 alpha를 0.5, 0.1, 0.01과 같은 값으로 설정해보겠습니다. 

 

릿지 회귀 (alpha = 0.5)
릿지 회귀 (alpha = 0.1)
릿지 회귀 (alpha = 0.01)

결과를 통해 알 수 있는 것은 0.5, 0.1로 작아질수록 성능이 좋아지다가 어느 순간부터 다시 나빠집니다. 따라서 alpha = 0.1을 최적의 파라미터값으로 설정해줄 수 있습니다. 물론 더 미세하게 값을 바꿔가면서 최적의 alpha 값을 찾을 수 있겠지만, 이 정도로만 하겠습니다.^^

 

그럼 최종적으로 선형 회귀와 릿지 회귀 성능을 비교해보겠습니다. 

 

주목해야할 것은 훈련셋 점수가 아니라 테스트셋 점수이므로, 0.77의 결정계수를 가지는 릿지 회귀가 0.61의 선형 회귀보다 보스턴 주택가격 데이터셋에서 우수한 성능을 낸다고 판단할 수 있습니다. (이 결과를 가지고 모든 데이터셋에서 릿지 회귀가 선형 회귀보다 낫다고 단정지을 수는 없습니다.)

 

다음 시간에는 선형 회귀의 또다른 업그레이드 버전, 라쏘 회귀에 대해 다루도록 하겠습니다. 언제나 질문과 지적은 환영합니다. 댓글 남겨주세요.^^ 

댓글

방문해주신 모든 분들을 환영합니다.

* 글을 읽던 중에 궁금했던 부분은 질문해주세요.

* 칭찬, 지적, 의문, 격려, 감사표현 등을 남겨주세요.

* 최대한 답변 드리도록 노력하겠습니다.

* 욕설과 광고를 담은 댓글은 가차없이 삭제합니다.


guest@이름 ~$
guest@패스워드 ~$
guest@홈페이지주소작성 ~$

guest@댓글작성 ~$




bskyvision. Designed by bskyvision.