Ridge와 Lasso Regression을 이해하기 위한 Preview
#예측모형, #선형회귀모형, #linearregression, #costfunction, #GradientDescent, #R-squared, #AdjustedR-squared, #Python
대형 슈퍼마켓의 operations manager에 일하는 내 친구와 얼마 전 이야기를 나누었습니다. 대화 중 우리는 명절 전 슈퍼마켓의 재고 준비 정도에 대한 주제로 이야기를 이어갔습니다. 그는 어떤 물건이 그 시기에 가장 잘 팔릴지, 그리고 어떤 물건은 그렇지 않을지를 예측하는 것이 매우 중요하다고 이야기했습니다. 만약 매니저로써 잘못된 선택을 한다면 친구의 상점을 방문한 고객들은 근처 경쟁 상점으로 가서 구매할테니까요. 문제는 여기서만 끝나는 것이 아닙니다. 매니저로써 소비자의 각자 다른 소비 행태들을 예상하여 물건 배치를 어떻게 구성해야 할지도 예측해야 합니다.
친구가 이 문제를 설명하고 있을 때, data scientist인 저는 오늘 주제를 regression model로 다루고 어떻게 그 모형으로 친구의 문제를 해결할 수 있을지 설명해야겠다 마음 먹었습니다.
잠시 시간을 가지고 친구 상점의 판매량에 영향이 있을만한 모든 변수들을 써보세요. 그리고 각각의 변수에 따라 왜 그리고 어떻게 해당 변수가 판매량에 영향이 미칠지 가정을 만들어보십시오. 예를 들어서, 저는 상점의 위치가 판매량에 강한 영향을 미칠 것이라고 생각합니다. 왜냐하면 지역 주민들은 각자 다른 라이프스타일을 살고 있기 때문이죠. 주민(가구원수)이 더 많은 동네일수록 쌀의 판매량이 늘어나는 것처럼요.
이와 유사하게 가능하다고 생각되는 모든 변수를 써보세요.
상점의 위치, 물건보유여부, 상점의 크기, 세일여부, 홍보, 상점 안에서의 물건 위치 등이 매출에 영향을 미치는 변수들이라고 생각됩니다.
데이터셋을 보여드리겠습니다. – The Big Mart Sales. 이 데이터는 다양한 아울렛의 판매 정보입니다.
데이터셋을 보시면 우리는 팔린 물건에 대한 특징들(fat content, visibility, type, price) 을 볼 수 있습니다. 그리고 아울렛에 대한 특징(year of establishment, size, location, type)과 특정 아이템이 몇 개 팔렸는지도 알 수 있습니다. 이제 이 변수들을 통해서 매출액을 예상할 수 있을지 알아봅시다.
[목차]
1. Simple models for Prediction
2. Linear Regression
3. The Line of Best Fit
4. Gradient Descent
5. Using Linear Regression for prediction
6. Evaluate your Model – R square and Adjusted R squared
7. Using all the features for prediction
8. Polynomial Regression
9. Bias and Variance
10. Regularization
11. Ridge Regression
12. Lasso Regression
13. ElasticNet Regression
쉬운 방법으로 시작해봅시다. 제가 만약에 여러분에게, '상품 판매량을 예측하는 가장 간단한 방법은 무엇일까요?'라고 물어본다면, 무엇이라고 대답하시겠습니까?
머신러닝에 대한 지식이 없어도, 만일 어떤 item의 판매량을 예측해야 한다면 당신은 최근 몇일간/몇달간/몇주간 해당 item의 평균 판매량으로 계산할 것입니다.
좋은 시작이지만, 여기서 몇 가지 질문들도 추가 됩니다. 모델이 얼마나 정확한가 입니다. 우리가 생성한 모형의 성능이 얼마나 좋은지는 여러가지 방법으로 맞출 수 있습니다. 가장 흔한 방법이 MSE(Mean Squared Error)입니다. 그럼 MSE를 어떻게 측정하는지 알아봅시다.
Predictoin error(예측 오차)
모형이 얼마나 좋은지 평가하기 위해서는 틀린 예측이 어떤 영향을 주는지 알아야합니다. 우리가 만일 실제보다 더 큰 판매량을 예측한다면, 상점은 불필요한 재고 생성과 정리로 많은 돈을 손해보게 됩니다. 반대로 예상한 판매량이 너무 적다면, 우리는 명절을 맞이하여 많이 벌 수 있는 그 기회를 놓치게 됩니다.
따라서, error를 계산하기 위한 가장 간단한 방법은, 실제값과 예측값의 차이를 계산하는 것입니다. 하지만 단순히 error를 더하기만 한다면 그 의미가 상쇄되는 경우가 있기 때문에 우리는 error값을 더하기 전 각 에러에 대한 값을 제곱(sqaure)합니다. 제곱된 에러의 합을 데이터 수(record)만큼 나눠 줌으로써 데이터 수에 따른 bias를 제거 합니다.
이것이 MSE입니다.
여기에서 나오는 e1, e2 …. , en 은 실제값과 예측값의 차이 입니다.
그렇다면 우리의 첫번째 모델에서 MSE는 무엇일까요? 모든 data points들의 평균값을 예측하면, MSE값은 2,911,799입니다. 굉장히 큰 에러처럼 보이긴 합니다. 어쩌면 평균값으로 예측한다는 것은 썩 좋지 않은 방법인 것 같네요.
그렇다면 에러를 줄이기 위해 어떻게 해야할지 생각해봅시다.
우리는 지역이 물건 판매량에 지대한 영향을 끼친다는 것을 알고 있습니다. 예를 들어, Delhi라는 도시가 Varanasi라는 도시보다 더 많은 자동차 판매량을 보인다고 해봅시다. 그렇다면 우리는 데이터의 column 중 'Outlet_Location_Type'을 쓰게 되겠죠.
그렇다면 각각의 location type의 평균 매출량을 계산하고 그에 맞게 예측을 한다고 해봅시다. 매출 판매량의예측에 대한 MSE는, Model 1에서의 결과값보다 작은 2,875,386가 나오게 됩니다. 그렇다면 우리는 '지역'이라는 특성이 error값을 줄여줬다라는 것을 알 수 있게 되는 것입니다.
그렇다면 판매량이 여러 개의 변수들에 의해 영향 받는다면, 우리는 이 정보들을 이용해서 어떻게 판매량을 예측할 수 있을까요? 이런 문제를 해결하기 위해 Linear regression이 등장합니다.
Linear regression은 예측 모델링에 있어서 가장 간단하면서도 많이 쓰이는 방법론입니다. 판매량은 target 변수가 되고, 앞서 이야기했던 여러 개의 변수들은 independent variables가 되는 것이지요.
그렇다면 공식으로는 어떻게 표현할까요? 이는 다음과 같습니다.
Y는 dependent variable(즉, 판매량)이 되고, X는 indepednt variables고 theta값은 각 X값에 해당한느 계수가 됩니다. 계수는 X변수의 중요도에 따라 그 가중치(weights)가 주어지게 됩니다. 예를 들어, 변수들 중 '지역'이 '매장의 크기'보다 판매량에 더 큰 영향을 미친다고 가정해봅시다. 이 뜻은 Tier 1 도시에 있는 작은 매장이 Tier 3에 있는 큰 매장에 비해서 더 높은 판매량을 기록한다는 것입니다. 그렇다면 '지역'에 해당하는 계수가 '매장의 크기'보다 더 높을 것입니다.
우선, 선형 회귀를 1개의 변수만으로 이해해 봅시다. 공식으로 나타낸다면 다음과 같겠습니다.
이 공식을 단순선형회귀(simple linear regression)라 부르고, ‘Θ0’ 이 절편이고, ‘Θ1’ 이 기울기인 일직선의 선을 뜻하는 것입니다. 다음과 판매량과 MRP와의 관계입니다.
놀랍게도 MRP가 증가함에 따라 판매량이 증가합니다. 따라서 빨간 점선은 regression line 또는 line of best fit을 표현합니다. 이때 질문이 있으시겠죠? 어떻게 이 점선을 찾을 수 있을까요?
아래 그림을 보면 MRP에 따른 판매량 예측을 표현하는 선은 무수히 많을 수 있습니다. 그렇다면 여기서 가장 적합하게 들어맞는 line은 어떻게 찾을까요?
best fit line의 메인 목적은 우리의 예측값이 실제값과 그 거리가 될 수 있으면 최대한 작게 나게 하는 것입니다. 굳이 실제 값과 굉장히 차이나는 예측값을 찾을 필요는 없겠지요? 우리는 예측을 통해 나온 값과 실제 값의 차이를 줄이려 부단히 노력할 것입니다. 그리고 이 차이를 error라고 표현하죠. 그림으로 나타낸 error의 모습은 아래와 같습니다. 이 error값들은 residuals(잔차)라고도 표현됩니다. residuals는 예측값과 실제값의 거리를 나타내는 수직 선입니다.
네, 이제 우리의 주요 목적이 error를 최소화하려는 것인건 아시겠죠? 하지만 그전에 error계산법에 대해 짚고 넘어갑시다. 제가 지금까지 error란 예측값과 실제값의 차이라고 계속 언급했습니다. 이 에러값 계산을 3가지 방법으로 나눠 봅시다.
잔차의 합(Sum of residuals) (∑(Y – h(X))) – 양수와 음수의 값이 있다면 서로가 값을 상쇄하는 일이 발생할 것입니다.
잔차의 절대값의 합(Sum of the absolute value of residuals) (∑|Y-h(X)|) – 절대값을 취하면서 값 상쇄 문제는 해결이 됩니다.
잔차의 제곱의 합(Sum of square of residuals) ( ∑ (Y-h(X))^2) – 이 방법이 현재 우리가 가장 많이 활용합니다. 높은 에러값을 나타내는 점에 패널티를 부여함으로써 큰 에러와 작은 에러의 차이를 구분하는 것이지요.
잔차의 제곱의 합(Sum of square of residuals) 은 다음과 같이 나타낼 수 있습니다.
여기서 h(x)는 우리의 예측값입니다. h(x) =Θ1*x +Θ0 와 같이 표현될 수 있겠지요. y는 실제 값이고 m은 training set의 열의 수(즉 레코드 갯수)입니다.
*training set은 이전 글에서 설명을 드렸으니, 참고하시기 바랍니다.
The Cost Function(비용 함수)
매장의 크기를 늘리면 판매량이 증가한다는 것을 들은 당신은 더 큰 판매량을 달성하기 위해 매장의 크기를 늘리는 시도를 했다고 가정해봅시다. 하지만 안타깝게도 판매량에서는 그렇게 큰 효과를 보지 못했습니다. 따라서 매장을 늘림으로써 발생하는 비용은 결국 음수의 값을 나타내었습니다.
그렇다면 이제 우리에게 주어진 과제는 비용을 줄이는 일입니다. 따라서, 모델의 error값을 정의하고 측정하는, cost function(비용 함수)를 설명해드리겠습니다.
이 공식을 자세히 보시면, sum of squared errors와 굉장히 유사합니다. 앞에 1/2m을 곱해주는 것만 제외한다면요.
따라서 우리의 예측 성능을 개선시키려면 우리는 cost function을 최소화시켜야 합니다. 이러한 이유로 우리는 gradient descent algorithm을 이용하는 것입니다. 어떤 방식으로 작동이 되는 것인지 다음 장에서 알아봅시다.
다음 식의 최소 값을 찾아봅시다.
Y= 5x + 4x^2.
수학적으로 우리는 x에 대해 derivate(미분)을 취하게 되고 결과값이 0인 x값을 찾을 것입니다. 그리고 해당 x값을 넣어, (x,y)를 찾게 되겠지요. Gradient descent도 이와 비슷한 방법으로 작동합니다. Gradient descent는 비용 함수가 가장 최소화 될 수 있는 점을 찾기 위해 반복적으로 Θ값을 업데이트합니다.
이제 다시 상점 판매량 예측 문제로 돌아와서, 우리가 배운 Linear Regression을 활용해보도록 하겠습니다.
이전 예제를 통해 맞는 변수를 이용하는 것이 모형의 정확성을 개선시킬 수 있는 방법임을 알 수 있습니다. 그렇다면 이번엔 2개의 features를 사용해봅시다. 'MRP'와 '매장설립일'로 판매량을 추측해봅시다.
Python을 이용해 이 두 개의 features에 대한 linear regression model을 만들어 봅시다.
결과를 보면 MRP는 높은 계수(Coefficient Estimate)를 나타내고 있기 때문에 상품이 높은 가격을 가질수록 판매량 성적은 더 좋은 것임을 알 수 있습니다.
모형이 얼마나 정확할까? 우리가 확인할 수 있는 평가 방법이 있을까요? 네, 사실 우리는 R-Square라는 측정값을 알고 있습니다.
R-Square는 Y(dependent variable)의 총 변동량이 X(independent variable)의 변동량으로 설명되는 양을 결정합니다. 수학적으로는 이렇게 나타낼 수 있습니다.
R-square값은 항상 0에서 1사이의 값을 나타냅니다. 0은 모델이 target 변수(Y)를 전혀 설명하지 못한다라는 뜻이고, 1은 target 변수를 완전히 설명한다라는 뜻입니다.
위의 모델의 R-square값을 확인해 봅시다.
이 경우, R²은 33%입니다. 33%의 판매량 변동성이 매장설립년도와 MRP로 설명된다라는 뜻입니다. 다르게 표현하자면, 만일 당신이 설립년도와 MRP를 알고 있다면 당신은 판매량을 정확히 예측하기 위해 33%의 정보를 가졌다라고 보시면 됩니다.
만일 여기서 제가 또 다른 변수(feature)를 기존 model에 넣게 된다면 모형은 더 실제값과 가까워질까요? R-square값은 증가하게 될까요?
우리는 물건 판매량 예측 모형을 만들 때 변수 한 개를 활용했을 때보다 두 개를 활용한 경우가 성능면에서 더 우수한 것을 확인했었습니다.
그렇다면 이번에는 weight라는 또 다른 변수를 넣어보겠습니다. 3개의 변수로 regression model을 마찬가지로 만들어보죠.
에러가 나오네요. 에러 문장을 보니 weight라는 컬럼에 missing value가 있는 것 같습니다. 그렇다면 빈 값은 전체(non-null)의 평균으로 채워넣어보죠.
MSE는 1,853,431로 이전 모델보다 줄어들었고, R-square값도 증가하였습니다. 그렇다면 item weight이라는 변수의 추가가 우리 모형에 유용하다는 뜻일까요?
R-squared의 유일한 단점은 새로운 예측 변수(X)가 추가되면, R²는 절대 감소하지 않고, 늘어나거나 일정하게 유지됩니다. 모델의 복잡성이 증가합에 따라 모형이 점점 정확해진다고 판단할 수 없습니다.
따라서 우리는 "Adjusted R-Square"값을 이용합니다.
Adjusted R-Square는 x변수의 갯수에 맞게 조정된 R-Square의 변형값입니다. 이 값은 모델의 자유도를 통합하고, 새로운 변수가 모델 정확도를 향상시키는데 기여할 때만 증가합니다.
where
R2 = 샘플의 R-square
p = predictors(변수)의 갯수
N = 샘플 사이즈
이제 모든 변수를 포함한 model를 만들어봅시다. 이번 모델링에서 저는 연속형 변수만을 쓰려 노력했습니다. 왜냐하면 범주형 변수의 경우 linear regression에 반영하려면 사전 데이터 처리 작업이 필요하기 때문입니다. 이 처리 방법은 여러가지가 있지만, 저는 one hot encoding(범주형 변수의 내용들을 각각 변수화하는 방법, 즉 dummy variable을 생성)만을 썼습니다. 그 외에도 아울렛 사이즈 컬럼의 missing value값도 처리하였습니다.
보시다시피 MSE와 R-Square값의 명확한 개선이 있기에 현재 모형이 이전보다 훨씬 더 실제 값과 근접하다고 볼 수 있습니다.
높은 차원의 데이터셋을 가지고 있을 경우, 이 모든 변수를 전부다 활용한다는 건 굉장히 비효율적일 것입니다. 왜냐하면 그 중의 몇은 서로 중복 정보를 포함하고 있기 때문이죠. 그래서 우리는 정확한 모델을 제공하면서도 종속 변수를 잘 설명할 수 있는 적합한 변수를 선택해야 합니다. 모델에 적합한 변수를 선택하는데에 있어서는 여러 가지 방법이 있습니다. 첫번째는 비즈니스적 이해 및 업무 지식입니다. 예를 들어 판매량을 예측할 때에 마케팅이 판매의 중요한 영향을 미치고 또한 중요한 변수로써 작용한다는 것을 우리는 알고 있습니다. 그리고 우리가 선택하는 변수들이 서로 correlate이 되어서는 안됨을 유의해야 합니다.
수동으로 변수를 일일이 선택하는 것 대신, 우리는 forward 또는 backward selection으로 이 과정을 자동화 할 수 있습니다. (forward selection와 backward selection을 결합한 stepwise selection 도 존재합니다.) Forward Selection은 모델의 가장 중요한 변수부터 시작하여 그 다음 중요도에 따라 하나 하나씩 넣어보는 것을 의미하고 Bacward elimination은 모든 변수를 일단 다 넣고 가장 중요하지 않은 변수부터 차례 차례 빼내는 변수 선택 과정입니다. (그렇다면 stepwise는 변수를 넣고 빼고를 반복하면서, 가장 최적의 조합을 찾는 것이겠죠?) 선택의 기준은 통계값인 R-square, t-stat이 있겠습니다.
예측값과 잔차의 관계를 나타낸 plot을 확인해보십시오.
plot에서 깔대기 모양의 그림을 볼 수 있습니다. 이 모양은 Heteroskedasticity(이분산성)를 나타냅니다. 오차항에서 변화하는(non-constant) 분산이 나타나면 이분산성이 생깁니다. 그림에서 오차항의 변동이 일정하지 않음을 분명히 알 수 있습니다. 일반적으로 non-constant variance는 특이치(outliers)나 extreme leverage values가 있을 때 발생합니다. 이런 극단치의 값이 너무 큰 가중치를 가지게되면서 모델의 성능에 불균형적인 영향을 미치게 됩니다. 이런 현상이 발생하게 될 때에, out-of-sample의 값 예측에 대한 신뢰 구간은 비현실적으로 넓거나 좁아지는 경향이 있습니다.
*참고. out-of-sample이란?
우리가 모형을 만들 때에 선택되는 sample에는 전체 집단 중 일정 부분을 떼어낸 것이기 때문에 bias가 존재할 수 있습니다. 따라서 그 sample로 linear regression을 만든다고 하면 sample에 국한된 선형회귀모형이 만들어질수도 있겠죠? 이를 확인하기 위해서 전체 집단에서 제가 모형을 만들기 위해 선택했던 sample이 아닌 다른 sample, 즉 out-of-sample,을 이용하여 내가 만든 모형의 성능을 확인해보는 작업을 진행합니다.
우리는 이것을 residual vs fitted values plot으로 간단히 확인해 볼 수 있습니다. 만일 heteroskedasticity가 존재한다면, 위의 그림처럼 plot은 깔대기 모양의 패턴을 그릴 것입니다. 이는 모델에 서 잡히지 않은 데이터의 비선형성이 존재함을 나타내는 것입니다.
이러한 비선형 효과를 잡아내기 위해, 또 다른 regression이 있습니다. 바로 polynomial regression(다항 회귀)입니다. 함께 다음 장에서 알아보도록 하죠.
*본 글은 https://www.analyticsvidhya.com/blog/2017/06/a-comprehensive-guide-for-linear-ridge-and-lasso-regression/의 일부분을 번역+약간의 의역을 하였습니다. 중간중간 저의 개별적인 설명은 파란색 글씨로 써두었습니다.