본문 바로가기
머신러닝,딥러닝/ML 회귀분석(이상엽 교수님)

\(R^2\)(선형회귀 모형 성능평가 지표) 계산 및 코드구현 방법

by 코듀킹 2023. 5. 26.
목차
1. 선형 회귀 모델 성능평가 지표: \(R^2\)
2. 파이썬 sklearn 모듈로 \(R^2\) 적용

 

지난 시간에 규제화에 대해서 알아보았다. (참고글 - 규제화(Regularization): L1, L2 penalty term) 규제화란, 지도학습 모델의 성능 평가 단계에서 과적합(Overfitting)이 일어나는 경우에 이를 해결하기 위해서 사용하는 방법이라고 했다. 그렇다면, 과적합 또는 과소적합으로 인해 모델의 성능이 얼마나 떨어지는지는 어떻게 알 수 있을까? 학습 데이터를 통해 학습단계에서 학습을 시킨 모델을 평가 데이터에도 학습을 시키고 나서 특정 평가지표를 통해 모델의 성능을 확인할 수 있다.

 

성능 평가 단계에서 사용하는 특정 평가지표는 우리가 풀어야 할 문제가 어떤 문제인가에 따라 다르다. 힌트 정보와 정답정보가 모두 주어지는 지도학습 알고리즘을 적용시키는 문제에는 크게 회귀문제와 분류문제가 있었고, 이 글에서는 회귀문제에서 사용하는 평가 지표인 \(R^2\)에 대해서 알아볼 것이다. 그리고 파이썬 통해서도 평가 과정을 살펴보겠다. 

 

 

1. 선형 회귀 모형 성능평가 지표: \(R^2\)

 

선형 회귀 모형에서의 대표적인 성능 평가 지표는 \(R^2\)이다. \(R^2\)의 식을 통해 어떻게 성능을 나타내는지 살펴보자.

 

$$ R^2 = SSR/SST $$

 

\(R^2\)식의 위와 같다. 그렇다면 SSR와 SST가 무엇일까? SST는 Sum of Squares Total의 약자이다. 실제 종속변수가 갖는 전체 값들이 평균으로부터 얼마나 떨어져 있는지를 나타내는 값이다.(아래 그림 참고) Total sum of squares의 약자인 TSS와도 같은 의미로 쓰인다. 즉, 데이터가 가지고 있는 전체 variation을 뜻한다. SST의 식을 살펴보자.

 

출처: https://vitalflux.com/r-squared-explained-machine-learning/

 

$$ SST = \sum_{i=1}^{N}(y_i - \bar{y})^2 $$

 

여기서 \(y_i\)실제 종속변수의 값이다. \(\bar{y}\)는 학습데이터에 존재하는 y변수의 평균이다. 참고로, TSS을 샘플사이즈(N)로 나누면, 분산이 된다. 다음은 SSR을 살펴보자.

 

$$ SSR = \sum_{i=0}^{N}(\hat{y_i}\ -\ \bar{y})^2$$

 

SSR은 Sum of Squares Regression의 약자로, 학습을 시킨 선형회귀 모델이(위 그림의 bar) 실제 종속변수의 평균과 얼마나 떨어져 있는지를 나타낸다. Explained sum of squares의 약자인 ESS도 같은 의미로 쓰인다. \(R^2\)는 즉, 학습데이터에 존재하는 종속변수가 가지고 있는 전체 흩어진 정도 중에서 우리의 모형이 설명하는 정도를 나타낸다.

 

추가적인 설명을 하자면,  SSE는 Sum of Squares Residual Error의 약자로, 종속변수의 실제 값들이 평균과 떨어져 있는 정도를 모델이 설명하지 못하는 정도를 나타낸다. Residual sum of squares의 약자인 RSS와도 같은 의미이다. 식으로 표현하면 다음과 같다.

 

$$ SSE = \sum_{i=0}^{N}(y_i\ -\ \hat{y})^2$$

 

다시, 위 그림을 보면 \(SST = SSR + SSE\) 인 것을 알 수 있다. 이 식의 양변을 SST로 나누면, \(1 = SSE/SST + SSR/SST\)가 되고, \(SSR/SST\)는 \(R^2\) 이라고 했기 때문에, 최종적으로 \(R^2 = 1 - SSE/SST\)가 된다. 이 식이 의미하는 바는 1에서 전체 흝어진 정도에서 우리의 모형이 설명하지 못하는 정도를 뺀 값이다. 

 

\(R^2\)은 0~1을 가지고, 1에 가까울 수록 모형의 성능이 좋다.(몇을 넘으면 모델의 성능이 좋은 것이다! 하는 기준이 되는 값은 따로 없다.)

 

2. 파이썬 sklearn 모듈로 \(R^2\) 적용

이제 파이썬에서 제공하는 sklearn 모듈을 통해서 실제 데이터를 학습시키고, 모델을 평가하는 단계까지 시행해 보자. 먼저 학습시킬 데이터를 불러와야 한다. 보통 케글이나 데이콘에서 데이터셋을 받으면, train data와 test data로 나뉘어 있다. 우리는 train data를 통해서 모델의 학습 및 성능 평가를 완료를 한 뒤에 최종적으로 그 모델을 test data에 적용시켜야 한다. 그러므로 train data를 먼저 불러온다.

 

import numpy as np
import pandas as pd

data = pd.read_csv("train_data.csv") # train data 불러오기

 

불러온 데이터에 중에 종속변수로 활용할 컬럼이 있을 것이다. 그 컬럼을 y로, 그리고 독립변수로 사용할 컬럼을 X로 나누어주어야 한다.

 

y = data["종속변수 컬럼"]
X = data.drop("종속변수 컬럼", axis = 1) 
# ↑종속변수를 제외한 모든 독립컬럼을 X로 지정하고 싶을 때

 

이 데이터를 다시 학습데이터와 평가 데이터로 분리시켜야 한다. sklearn 모듈에서 제공하는 train_test_split() 함수를 통해 학습데이터와 평가데이터로 랜덤 하게 분리시켜 준다. 이때, 비율을 정할 수 있다. 여기서는 평가 데이터를 전체 학습 데이터 중에 30% 지정해 보겠다. 이를 test_size = 0.3으로 설정해 줄 수 있다. train_test_split 함수는 학습 데이터와 평가 데이터를 랜덤 하게 나누기 때문에, 이를 수행할 때마다 똑같은 데이터를 기준으로 나누고 싶을 때, random_state를 설정해 주면 수행 시 결괏값을 동일하게 맞춰줄 수 있다. 이때, random_state에는 어떤 숫자를 적든 그 기능은 같기 때문에 어떤 숫자를 적든 상관없다.

 

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

 

LinearRegression() 함수를 선택하여 모델을 선형회귀 모델로 설정해 준다. 그러고 나서 선택한 모델에 분리시켰던 train data를 fit() 함수를 이용해 학습시켜 준다. 학습이 끝나면, score() 함수를 분리시킨 test data에 적용하여 \(R^2\) 값을 간단하게 구할 수 있다.

 

from sklearn.linear_model import LinearRegression

model = LinearRegression() # 선형회귀 모델 선택

model.fit(X_train, y_train) # 데이터 학습

model.score(X_test, y_test) # 모델 성능 평가 = R^2

 

추가적으로 학습시킨 모델의 파라미터 값을 확인하고 싶다면, coef_ 함수와 intercept_함수를 통해 확인할 수 있다.

  • model.coef_ : 학습시킨 모델의 b1, b2,..., bk 파라미터 값, 즉 각 독립변수들에 대한 기울기를 나타낸다.
  • model.intercept_ : 학습시킨 모델의 b0 파라미터 값, 즉 모델의 y절편을 나타낸다.

또 다른 \(R^2\)를 확인하는 방법으로는 아래와 같은 방법이 있고, 선형 회귀 모형의 성능 평가를 할 때 사용하는 또 다른 지표인 mse와 rmse를 구하는 코드를 통해서도 성능평가를 할 수 있다.

 

from sklearn.metrics import r2_score

r2_score(y_test, model.predict(X_test)) # 모델 성능 평가 = R^2

 

from sklearn.metrics import mean_squared_error 

mse = mean_squared_error(y_test, model.predict(X_test)) # mse

mse**0.5 # rmse

rmse = np.sqrt(mse) #rmse

 

댓글