2017-11-10 16:10:54

일차 함수(y = ax + b)에 대해서는 중2때 처음 배웠다. 그때는 이것의 진정한 의미를 몰랐다. 그저 x값을 함수식에 넣어주면 y값이 나온다는 정도로 이해했다. 우리의 생활의 많은 현상을 일차 함수로 모델링해낼 수 있을 것이라고는 생각도 못했다. 예를 들어 기온과 포장마차에서 따뜻한 오뎅이 팔리는 수량도 어느 정도 선형 관계를 가질 것이다. '날씨가 추우면 추울수록 오뎅이 많이 팔릴테니까.' 선형 회귀가 무엇인지 직관적인 이해를 위해 아래 하나의 이야기를 만들어봤다.  


한 포장마차 주인이 한해동안 매일 기온과 오뎅 판매 수량을 계속 기록했다. 그랬더니 정말로 선형 관계가 있었다. 그래서 이 주인은 얻어낸 일차 함수식을 장사에 이용해보기로 했다. 어떻게 했냐면, 일기예보를 통해 알게된 내일의 기온을 일차 함수식에 대입했다. 그랬더니 내일 대략 몇개가 팔릴 것인지 예측할 수 있었다. 그래서 이 주인은 이 수량에 맞춰서 재료를 구입했고, 덕분에 신선하고도 가장 맛있는 오뎅을 판매할 수 있었다. 그리고 판매 예상량을 적절히 예측했기 때문에 아깝게 버리는 오뎅들도 거의 없었다. 소문을 들은 여러 사람들이 이 포장마차에 찾아오게 되었고 결국 엄청난 수익을 내게 되었다.  


이것이 바로 선형회귀를 우리의 삶에 적절히 이용한 하나의 예다. 선형회귀는 사용되는 특성(feature)의 갯수에 따라 단순 선형 회귀(simple linear regression)와 다중 선형 회귀(multiple linear regression)로 분류할 수 있다. 라쏘(least absolute shrinkage and selection operator, Lasso)는 선형 회귀의 단점을 극복하기 위해 개발된 하나의 방법이다. 그러면 단순 선형 회귀, 다중 선형 회귀, 라쏘에 대해서 순차적으로 알아보자. 



▶ 단순 선형 회귀와 다중 선형 회귀


단순 선형회귀단 하나의 특성(feature)을 가지고 라벨값(label) 또는 타깃(target)을 예측하기 위한 회귀 모델을 찾는 것이다. 이해를 위해 먼저 그림1을 보자. 


그림1. 하나의 특성과 라벨값의 관계를 가장 잘 설명해주는 직선을 찾아내는 것이 단순 선형 회귀다. [출처: 위키피디아]


파란색 점은 여러 샘플(sample)들인데 x좌표값은 샘플의 특성값을, y좌표값은 라벨값을 의미한다. 특성값이 커지면, 라벨값도 커지는 관계를 보이고 있다. 가장 이 현상을 잘 설명해주는 선형 함수를 찾아낸 것이 빨간색 선이다. 특성()과 라벨값() 사이의 관계를 설명해낼 수 있는 선형 함수(빨간선)를 찾아낸다면 새로운 데이터의 특성값이 주어졌을 때 그에 해당하는 라벨값을 예측해낼 수 있을 것이다. 주어진 데이터에 완벽하게 딱 들어맞는 선형 함수를 찾아내는 것은 일반적으로 불가능하지만, 최대한 특성과 라벨값의 관계를 가장 잘 설명해줄 수 있는 일차함수식을 찾아내는 것이 단순 선형 회귀의 목적이다. 아래 공식1을 통해 좀 더 구체적으로 이해해보자. 


...(공식1: 단순 선형 회귀를 위한 일반화된 예측 함수)


여기서 는 특성이고, 는 예측값이다. 일차함수적인 관점에서 보면 는 일차함수에서 기울기이고, 는 y절편이다. 그러나 여기서는 는 가중치(weight) 또는 계수(coefficient)라고 부르는 것이, 는 편향(offset)이라고 부르는 것이 더 적절하다. 여러 개의 샘플들의 특성값들과 라벨값들을 이용해서 가장 적합한 와 를 찾아야 한다. 보통 경사감소법(경사하강법)을 통해 찾는다. 경사감소법에 대한 내용은 링크건 포스팅에서 확인하자(https://bskyvision.com/411). 최적의 와 를 찾았다면 공식1의 예측 함수를 이용해서 새로운 데이터의 특성값을 이용해서 예측값()을 구할 수가 있다. 


하지만 회귀모델을 만들 때, 단 하나의 특성만 가지고 있다면 충분한 예측능력을 보이는 모델을 만들기는 상당히 어렵다. 위에서 오뎅 판매 수량을 단 하나의 특성, 그날의 기온으로 예측했지만 사실상 더 많은 특성들을 고려해야만 제대로 된 결과를 예측해 낼 수 있을 것이다. 요일마다 판매량이 다를 수도 있고, 기온 뿐만 아니라 비가 오거나 눈이 오는 상황도 판매량에 영향을 미칠 것이다. 또한 티비 프로그램에 오뎅을 맛있게 먹는 장면이 나왔다면 판매량이 많아질 수 있다. 이러한 특성을 동시에 고려해야만 좀 더 정확한 예측 모델을 만들 수 있기 때문에, 대부분의 경우에 하나의 특성이 아닌 여러 개의 특성을 활용해서 회귀모델을 만든다. 이것이 바로 다중 선형 회귀다. 다중 선형 회귀를 위한 일반화된 예측 함수는 아래와 같다. 


...(공식2: 다중 선형 회귀를 위한 일반화된 예측 함수)


여기서 특성은 총 p+1개다. 그에 따라 가중치도 총 p+1개가 필요하다. 이번에는 주어진 여러 개의 샘플들의 p+1개의 특성들(, 즉 )과 라벨값() 사이의 관계를 잘 설명해낼 수 있는 적합한 , 즉 와 를 찾아내야 한다. 찾고 나면 공식2를 이용해서 라벨값이 없는 새로운 데이터의 예측값을 구할 수 있다. 특성이 하나였을 때는 선형 모델이 직선이 되었지만, 특성이 두개면 평면, 더 높은 차원에서는 초평면(hyperplane)이 되는 특징을 가지고 있다. 


그러면 단순 선형 회귀와 다중 선형 회귀에서 어떻게 적절한 가중치와 편향을 찾아낼 수 있을까? 이 부분이 중요하다. 선형 회귀는 라벨값()과 예측값() 사이의 평균제곱오차(mean squared error, MSE)를 최소화하는 파라미터 와 를 찾는다. 이 방법을 사용하는 이유는 실제 라벨값과 예측값의 차이가 작으면 작을 수록 예측성능이 좋은 것이기 때문이다. 


...(공식3: 평균제곱오차)


여기서 n은 샘플 개수이고, 는 각각 훈련셋 내의 i번째 샘플의 라벨값과 예측값을 의미한다. 공식3은 n개의 샘플들의 라벨값과 예측값 사이의 평균 제곱 오차의 평균을 구한 것이다. MSE를 최소화하는 파라미터 와 를 찾는 것이 선형 회귀의 목적이다. 


...(공식4: MSE를 최소로 만드는 w, b 찾기)


그런데 다중 선형 회귀 모델은 과대적합(overfitting) 될 때가 종종 있다. 주어진 샘플들의 특성값들과 라벨값의 관계를 필요이상으로 너무 자세하게 복잡하게 분석했다는 것이다. 그러다 보니 새로운 데이터가 주어졌을 때 제대로 예측해내기가 어렵다. 즉 일반화 능력이 떨어진다는 것이다. 이것을 해결하기 위해 릿지(Ridge)와 라쏘(Lasso) 방법이 제안되었는데 여기서는 라쏘 위주로 설명하겠다. 




▶ 라쏘(Lasso)


기존의 선형 회귀에서는 적절한 가중치와 편향을 찾아내는 것이 관건이었다. 라쏘는 거기에 덧붙여서 추가 제약 조건을 준다. 어떠한 제약을 줬냐하면, MSE가 최소가 되게 하는 가중치와 편향을 찾는데 동시에 가중치들의 절대값들의 합, 즉 가중치의 절대값들이 최소(기울기가 작아지도록)가 되게 해야한다는 것이다. 다시 말해서 가중치()의 모든 원소가 0이 되거나 0에 가깝게 되게 해야한다. 따라서 어떤 특성들은 모델을 만들때 사용되지 않는다. 어떤 벡터의 요소들의 절대값들의 합은 L1-norm이므로 라쏘는 간단히 말해서 L1-norm 패널티를 가진 선형 회귀 방법이다. 공식5를 보자. 


 ...(공식5: MSE + penalty)


여기서 m은 가중치의 개수를 의미하고(따라서 특성의 개수도 됨), 는 페널티의 효과를 조절해주는 파라미터이다. 의 값이 커지면 패널티 항의 영향력이 커지고, 의 값이 작아져서 거의 0이 되면 선형 회귀와 같아진다는 것을 알 수 있다. MSE와 penalty 항의 합이 최소가 되게 하는 와 를 찾는 것이 라쏘의 목적이다. 


...(공식6: MSE + penalty를 최소로 만드는 w, b 찾기)


그런데 도대체 이러한 방법으로 어떻게 과대적합을 피하는 일반적인 모델을 만들어낸다는 것일까? 우선 MSE항이 작아질 수록 라벨값들과 예측값들의 차이가 작아지고, L1-norm이 작아질 수록 많은 가중치들이 0이 되거나 0에 가까워진다는 것을 기억하자. 이런 상황에서 가 크면 많은 가중치들이 0이 되거나 0에 가까워지게 하는 것에 좀 더 큰 비중을 두게 되는 반면, 훈련셋에서의 예측정확도는 상대적으로 덜 중요해진다. 왜냐하면 가 클 때는 전체값(MSE+penalty)이 L1-norm에 좌지우지되기 때문이다. L1-norm이 커지면 전체값이 커지므로 전체값을 최소가 되게 하기 위해서는 L1-norm을 작게 만드는 것이 우선순위가 된다. 반면 가 작으면 훈련셋에서의 예측정확도(MSE)가 작아지게 하는 것에 좀 더 큰 비중을 둔다. 전체값이 MSE에 의해 좌지우지 되기 때문이다. 따라서 가 너무 작으면 과대적합(복잡도가 너무 큼)이 되고, 너무 크면 과소적합(복잡도가 너무 작음)이 된다. 라쏘에서 구체적으로 의 값의 크기에 따라 어떤 일이 발생하는지 간단한 예를 들어보겠다. 


총 105개의 특성을 라쏘 회귀 모델을 만들기 위해 사용했다. 로 설정했더니 105개의 가중치 중에서 101개가 0이 되면서 특성은 단 4개만 사용되었다. 훈련셋에서의 점수와 테스트셋에서의 점수를 보니 과소적합이었다. 따라서 복잡도를 높이기 위해서 로 설정했더니 가중치 중에서 7개만 0이 되면서 94개의 특성이 사용되었다. 훈련셋과 테스트셋에서의 점수를 보니 훈련셋에서는 좋은데 테스트셋에서는 많이 떨어졌다. 즉, 과대적합이었다. 따라서 다시 복잡도를 낮추기 위해 을 사용했다. 105개의 가중치 중에서 72개가 0이 되면서 33개의 특성이 사용되었다. 훈련셋에서의 점수와 테스트셋에서의 점수가 모두 괜찮았다. 


이런 식으로 적절한 값은 사용자가 cross-validation을 통해 설정해줘야 한다. 거의 모든 기계 학습 알고리즘은 알고리즘의 복잡도를 결정짓는 와 같은 파라미터를 갖고 있다. 귀찮지만 사용자가 적절한 값을 찾아서 설정해줘야 한다. 예를 들어, SVM에서는 C와 gamma가 복잡도를 결정짓는 파라미터들을 갖고 있다. (관심이 있다면 SVM에 대한 포스팅 http://bskyvision.com/163을 참고하자). 


라쏘의 장점은 크게 두가지로 볼 수 있다. 첫번째는 제약 조건을 통해 일반화된 모형을 찾는다는 것이다. 두번째는 가중치들이 0이 되게 하므로써 그에 해당하는 특성들을 제외해준다. 결과적으로 모델에서 가장 중요한 특성이 무엇인지 알게되는 등 모델 해석력이 좋아진다.


마지막으로 라쏘와 굉장히 유사한 릿지에 대해 간단히만 언급하자면 패널티 항에 L1-norm 대신에 L2-norm 패널티를 가진다. 차이가 있다면 라쏘는 가중치들이 0이 되지만, 릿지의 가중치들은 0에 가까워질 뿐 0이 되지는 않는다. 특성이 많은데 그중 일부분만 중요하다면 라쏘가, 특성의 중요도가 전체적으로 비슷하다면 릿지가 좀 더 괜찮은 모델을 찾아줄 것이다. 



▶ 정리


여러 샘플들의 하나의 특성과 라벨값의 관계를 찾아내는 단순 선형 회귀, 여러 개의 특성과 라벨값의 관계를 찾아내는 다중 선형 회귀, 그리고 선형 회귀에 L1 규제를 줘서 과대적합을 피하는 방법인 라쏘까지 쭉 정리해보았습니다. 필요하신 분들께 도움이 되기를 바라며 글을 마칩니다. 좀 더 발전된 글을 위해서 피드백을 남겨주시면 매우 감사하겠습니다. 긍정적인 내용이든 부정적인 내용이든 상관없으니 댓글을 남겨주세요. :D



b스카이비전의 추천글

☞ [ubuntu+python] 선형 회귀(linear regression)

☞ [ubuntu+python] 선형 회귀의 업그레이드 버전1, 릿지 회귀

☞ [ubuntu+python] 선형 회귀의 업그레이드 버전2, 라쏘 회귀

☞ [선형대수학] 놈(norm)이란 무엇인가?



<참고 자료>

[1] https://en.wikipedia.org/wiki/Lasso_(statistics) => 위키피디아, 라쏘

[2] http://sosal.kr/868 => 라쏘. 

[3] https://m.blog.naver.com/PostView.nhn?blogId=libido1014&logNo=120122338861&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F => 다중 선형회귀

[4] 안드레아스 뮐러, 세라 가이도 지음, 박해선 옮김, "파이썬 라이브러리를 활용한 머신러닝", 한빛미디어