본문 바로가기

Machine Learning_모델설계_Python

선형회귀_3 다중선형회귀 및 평가지표

안녕하세요 배도리입니다. 제가 좋아하는 사자성어가 있습니다. "다다익선" 많을수록 좋다라는 뜻이지만 사실 뜻보다는 유래를 좋아합니다. 춘추전국시대 시절 유방과 한신의 대화에서 나온말입니다.

 

유방: "나는 얼마만큼의 군대를 지휘할 수 있는가?"
한신: "폐하는 십만 명 가량을 지휘하실 수 있습니다."
유방: "그렇다면 그대는 어떠한가?"
한신: "신은 많으면 많을수록 좋습니다."

 

크으 폼 미쳤습니다. 한신의 천재성과 그리고 그에 대한 자신감이 드러나는 구절입니다. 저 또한 머신러닝 분야에 있어서 자신감을 갖고 싶군요... 계속 나아가겠습니다. 단순선형회귀에 이어서 다중선형회귀를 배워보겠습니다. 

 

다중선형회귀(multiple linear regression)

통계학과 머신러닝에서 사용되는 회귀 분석 기법 중 하나입니다. 단순선형회귀와는 달리, 다중선형회귀는 종속 변수와 여러 개의 독립 변수 간의 관계를 모델링합니다. 다중선형회귀는 종속 변수(또는 반응 변수)와 독립 변수(또는 설명 변수) 간의 선형 관계를 가정합니다. 이때, 독립 변수는 둘 이상일 수 있으며, 각 독립 변수는 종속 변수에 영향을 미치는 정도를 나타내는 회귀 계수를 가지게 됩니다. 따라서, 다중선형회귀는 종속 변수를 여러 독립 변수의 선형 조합으로 예측하는 모델을 구축하는 것입니다.

 

단순선형회귀(Simple linear regression)

단순선형회귀 가설함수

 

다중선형회귀(Multiple linear regression) 

다중선형회귀 가설함수

 

 

 

다중 선형귀의 가설함수 h𝜃(𝑥)는 입력 변수인 𝑥와 가중치 벡터 𝜃의 전치(transpose)를 내적(inner product)한 값으로 표현이 가능합니다.

 

 

다중선형회귀 모델을 학습하는 데에는 두 가지 주요한 방법은 반복적인 접근법(Iterative Approach)과 해석적인 접근법(Analytical Approach)입니다. 반복적인 접근법은 경사하강법을 이용한 접근이고 해석적인 접근은 선형대수를 바탕으로 정규방정식을 이용합니다.  

 

반복적인 접근법(Iterative Approach):  경사 하강법과 같은 반복적인 접근법을 사용하여 회귀 계수를 조정하고 최적의 모델을 찾을 수 있습니다. 경사 하강법을 적용하여 비용 함수를 최소화하는 회귀 계수를 조정하는 방법으로, 이를 통해 단순선형회귀 모델을 개선할 수 있습니다.

해석적인 접근법(Analytical Approach):  최소 제곱법을 사용하여 해석적으로 회귀 계수를 계산할 수 있습니다. 최소 제곱법을 통해 데이터의 특성 행렬과 종속 변수 벡터를 사용하여 정규 방정식을 푸는 과정을 통해 최적의 회귀 계수를 구할 수 있습니다.

 

 

해석적인 접근법에 대해 좀 더 자세히 설명드리겠습니다. 벡터의 노름(Norm)을 통해서 회귀 모델의 예측값(𝑋𝜽)과 실제 관측값(y) 간의 차이를 계산합니다.

노름을 이용한 비용함수

최소제곱문제(Least squares problem)의 기하학적 해석하면

▪ Overdetermined system(과결정 연립방정식), X𝜽 ⋍ 𝒚 (𝑋 ∈ ℝ𝑚×𝑛 , 𝜽 ∈ ℝ𝑛 , 𝑚 ≫ 𝑛)에 대하여, 방정식의 해 𝜽^는 다음과 같이 정의할 수 있습니다.

 

즉, 𝑋의 column space 내의 모든 점들 중에서 vector 𝒚와 가장 가까이 위치한 점은 vector 𝒚 에서 𝑋의 column space로 수선의 발을 내렸을 때 만나는 지점인 vector y^ (= 𝑋𝜽^)가 됩니다. 따라서, 𝒚 − 𝑋𝜽^와 𝑋의 column space는 서로 수직(orthogonal)이어야 합니다.

 

 

위의 식을 한번 풀어 정규방정식을 만들겠습니다.

최소제곱문제(Least squares problem), X𝜽 ⋍ 𝒚 (𝑋 ∈ ℝ𝑚×𝑛 , 𝜽 ∈ ℝ𝑛 , 𝑚 ≫ 𝑛)로부터 위와 같이 최종적으로 얻어진 방정식(Eq.1)을 정규방정식(normal equation)이라 합니다. 𝑋 T𝑋의 역행렬이 존재(invertible)할 때, 정규방정식의 해는 다음과 같습니다. 

정규방정식의 해

다중 선형 회귀 분석에서는 보통 데이터들이 독립적인 경우가 많으며, 이로 인해 역행렬이 존재할 확률이 높지만 때로는 역행렬이 존재하지 않는 경우도 발생할 수 있습니다. 이러한 경우에는 Redundant features (중복된 독립 변수)를 제거해주면 해결ㅎㅎ

 

경사하강과 정규방정식을 비교해보죠

 

경사하강(Gradient Descent)은 learning rate(𝛼)을 직접 선택해야하며많은 반복(iteration) 수행을 필요로 합니다.  또한 𝑛의 값이 큰 경우에도 잘 동작합니다.

반면 정규방정식(Normal Equation)은 learning rate(𝛼)을 선택하거나 반복 수행이 불필요합니다. 그러나 features의 값이 매우 클 경우에는 수행 속도가 매우 느립니다.따라서 features > c × 10^3 (order of magnitude) 인 경우에는즉 독립변수가 1000개 이상일 때 iterative method (gradient descent)가 유용합니다. 

 

"Order of magnitude"는 수치의 크기를 대략적으로 나타내는 개념입니다. 보통 10을 기준으로 하는 로그 스케일을 사용하여 표현됩니다. 예를 들어, 어떤 값이 "order of magnitude"가 3이라면, 해당 값은 10의 3승(1,000)에 근접한 크기를 가지고 있다는 것을 의미합니다. 마찬가지로, "order of magnitude"가 -2인 경우 해당 값은 10의 -2승(0.01)에 근접한 작은 크기를 가지고 있다는 것을 나타냅니다. 사실 저도 몰랐습니다 ㅎㅎ^^

 

 

 

 

선형회귀 성능평가 방법

훈련/테스트 데이터 분할(train/test data split)

머신러닝에서 데이터를 학습을 하기 위한 학습 데이터셋(train dataset)과 학습의 결과로 생성된 모델의 성능을 평가하기 위한 테스트 데이터셋(test dataset)으로 나눕니다. 또한 모델이 새로운 데이터셋에도 일반화(generalize)하여 처리할 수 있는지를 확인합니다. 대표적으로 Hold-out method은 전체 데이터셋에서 일부를 학습 데이터와 테스트 데이터로 나누는 일반적인 데이터 분할 기법입니다. 전체 데이터에서 랜덤하게 학습 데이터셋과 테스트 데이터셋으로 나눕니다.

Hold-out method

 

 

MAE (Mean Absolute Error)

평균 절대 잔차입니다. 모든 테스트 데이터마다 예측값과 실제값의 차이에 대한 절댓값을 구하고, 이 값을 모두 더한 후에 데이터의 개수만큼 나눈 결과입니다. 직관적으로 예측값과 실측값의 차이를 알 수 있습니다.

MAE

sklearn 모듈에서는 median_absolute_error 함수로 MAE를 구함

from sklearn.metrics import mean_absolute_error
 
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred) #MAE
 
0.5

 

 

MSE (Mean Squared Error)

평균제곱 오차입니다. 오차에 대해 제곱을 한 다음 모든 값을 더하여 평균을 구합니다. 차이가 크게 나는 값에 대해서 페널티를 줄 수 있으나, 단위(unit)까지 제곱을 하게 되어 예측변수와 단위가 달라집니다(해석의 용이성 저하). 또한 이상치(outlier)에 민감합니다. 

MSE

sklearn 모듈에서 mean_squared_error 지원(MSE 계산)

from sklearn.metrics import mean_squared_error
 
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred) #MSE: squared=True(Default값)
 
0.375

 

 

RMSE (Root Mean Squared Error)

평균제곱근 오차입니다. 오차에 대해 제곱을 한 다음 모든 값을 더하여 평균을 낸 후 제곱근을 구합니다. 예측변수와 같은 단위를 유지하고 MAE에 비해 상대적으로 값의 차이가 더 큽니다. 차이가 크게 나는 값에 대해서 페널티를 주고 싶다면 RMSE 값을 사용합니다. 

RMSE

sklearn 모듈에서 mean_squared_error 지원(RMSE 계산)

from sklearn.metrics import mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred, squared=False) #RMSE: squared=False
 
0.6123724356957945

 

 

결정계수(R-Squared)

두 개의 값의 증감이 얼마나 일관성을 가지는지 나타내는 지표입니다.  실제값이 크면 클수록 예측값도 커지고, 실제값이 작으면 예측값도 작아지고 종속 변수의 총 변동 중에서 모델이 설명할 수 있는 변동의 비율을 나타냅니다. 두 개의 모델 중 어떤 모델이 조금 더 상관성이 있는지를 나타낼 수 있지만, 값의 차이 정도가 얼마인지는 나타낼 수 없다는 한계가 있습니다.

결정계수(R-Squared)

• SST – Total Sum of Squares 총 제곱합

종속 변수의 전체 변동을 측정하고 종속 변수의 분산을 의미하며, 모든 예측 오차를 고려합니다.

 

• SSE – Explained Sum of Squares 설명된 제곱합

회귀 모델이 예측한 종속 변수의 예측값과 종속 변수의 평균값 간의 차이의 제곱을 모두 합한 값으로, 회귀 모델이 얼마나 데이터를 설명하는지를 나타냅니다.

 

• SSR – Residual Sum of Squares 잔차 제곱합

회귀 모델로 설명되지 않은 종속 변수의 변동이나 오차의 크기를 측정합니다.

SST, SSE, SSR

sklearn 모듈에서 r2_score 지

from sklearn.metrics import r2_score
 
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred) #R-Squared
 
0.9486081370449679

 

 

 

 

다음 게시글에는 릿지 라쏘에 대해 배워보겠습니다.