2025. 3. 4. 00:24ㆍ머신러닝, 딥러닝 개념/성능 지표
머신러닝 라이브러리인 사이킷런(scikit-learn)의 공식 문서에는 다양한 머신러닝 지식들이 아주 잘 설명되어 있다. 성능 지표에 대한 설명도 다음 링크에 들어가보면 매우 잘 되어 있다.
https://scikit-learn.org/stable/modules/model_evaluation.html#
3.4. Metrics and scoring: quantifying the quality of predictions
Which scoring function should I use?: Before we take a closer look into the details of the many scores and evaluation metrics, we want to give some guidance, inspired by statistical decision theory...
scikit-learn.org
이번 포스팅에서는 이 공식 문서를 참고하면서 회귀에서 쓰이는 성능 지표들에 대해 정리해보려고 한다.
① 평균 제곱 오차(Mean Squared Error, MSE)
평균 제곱 오차는 선형 회귀 포스팅하면서 밥 먹듯이 쓴 성능 지표이지만, 처음 보는 셈 치고 다시 정리해 보자. 실젯값 $y$와 예측값 $\hat y$ 사이의 MSE는 다음과 같이 계산된다.
각각의 데이터 샘플에 대해 오차를 제곱한 것을 모두 합해준 다음, 데이터 샘플의 개수 $n$으로 나눠주면 된다. 즉, 오차 제곱을 평균내는 것이므로 '평균 제곱 오차'라는 이름이 붙은 것이다. MSE가 크다는 것은 데이터 샘플들에 대한 평균 오차가 크다는 의미이기 때문에, MSE가 작을수록 성능이 좋다고 판단할 수 있다. 이를 예제를 통해 계산해 보자.
먼저, 첫 번째 샘플에 대해서 입력값 $x$가 1로 주어졌을 때, 실젯값은 2.8인데 예측값은 1.1로 계산되었다. 따라서 둘 사이의 오차 크기는 1.7이 된다. 이런 식으로 오차를 모두 계산한 후, 이를 제곱한 것들을 모두 합해서 데이터 샘플의 개수 7로 나눠주면 MSE가 된다. 구체적인 계산 과정은 다음과 같다.
따라서 7개 데이터 샘플에 대한 MSE는 1.079가 된다.
기본적으로 오차에 제곱이 되기 때문에, 이상치(outlier)에 민감하다는 단점이 있다. 만약 위 예시에 이상한 데이터 샘플이 추가됐는데, 그 데이터 샘플의 오차가 8로 나왔다고 가정해보자. 그렇다면 MSE는 8.9로 확 늘어난다. 나머지 7개 데이터 샘플은 오차에 제곱을 해봤자 2.89가 최대인데 말이다.
참고로 MSE에 제곱근을 씌운 RMSE(Root Mean Squared Error)라는 지표도 있다.
위 예제에서 RMSE는 $\sqrt{1.079}$이다.
MSE와 RMSE를 계산하는 코드는 평균 절댓값 오차 개념까지 설명한 후 한꺼번에 보일 것이다.
② 평균 절댓값 오차(Mean Absolute Error, MAE)
MAE는 MSE와 구하는 방식이 매우 유사하다. 오차를 제곱시키느냐, 절댓값만 씌우느냐에 차이가 있다. MAE는 오차 절댓값을 평균낸 것이므로 구하는 수식은 다음과 같다.
예제는 MSE와 똑같은 자료를 사용하기로 하자. MAE의 계산 과정은 다음과 같다.
따라서 7개 데이터 샘플에 대한 MAE는 0.8714가 된다. MSE와 같은 맥락으로 MAE도 값이 작을수록 성능이 좋은 것이다.
다음은 주어진 실젯값과 예측값에 대해 MSE, RMSE, MAE를 계산하는 코드이다.
from sklearn.metrics import mean_squared_error
# from sklearn.metrics import root_mean_squared_error # sklearn.__version__ >= 1.4.0
from sklearn.metrics import mean_absolute_error
import numpy as np
y_true = [2.8, 3.9, 3.6, 5.2, 6.3, 6.4, 7.1]
y_pred = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7]
print("MSE:", mean_squared_error(y_true, y_pred))
print("RMSE", mean_squared_error(y_true, y_pred) ** 0.5)
# print("RMSE: ", root_mean_squared_error(y_true, y_pred))
print("MAE:", mean_absolute_error(y_true, y_pred))
RMSE의 경우, scikit-learn 1.4 버전부터 RMSE를 직접 계산해주는 함수 root_mean_squared_error()가 추가되었으나, 캐글 노트북에서는 사이킷런 버전이 1.2.2라서 사용할 수 없었다. 이 경우에는 scikit-learn의 버전을 1.4.0 이상으로 업그레이드 해줘도 되지만, 업그레이드를 하지 않아도 $\rm MSE^{0.5}$를 계산하는 방식으로 RMSE를 출력해줄 수 있다.
만약 본인의 scikit-learn 버전이 1.4.0 이상이면 주석을 해제하고 실행시켜도 정상적으로 RMSE를 출력하지만, 그렇지 않다면 주석을 해제하고 실행 시키면 root_mean_squared_error를 import 할 수 없다는 내용의 에러가 발생한다.
출력 결과
MSE: 1.0785714285714283
RMSE 1.038542935352905
MAE: 0.8714285714285713
③ 평균 제곱 로그 오차(Mean Squared Logarithmic Error, MSLE)
MSLE는 다음과 같이 정의된다.
MSLE는 로그의 진수 조건 때문에 예측값이나 실젯값이 -1 이하가 될 때는 사용이 불가능하고, $-1<y<0$일 때는 이론적으로 계산은 가능하지만 실제로 사용할 일은 없다고 생각하면 된다.
MSLE는 주로 지수적인 증가를 따르는 데이터를 예측하거나, 절대적 오차보다 상대적 오차가 더 중요할 때 사용된다고 한다. 상대적 오차가 더 중요한 예는 다음과 같다. 시세가 80,000달러인 비트코인을 81,000 달러로 예측한 경우와 시세가 2달러인 리플을 10달러로 예측했다고 하자. 전자의 오차는 1,000달러이고 후자의 오차는 8달러니까 후자가 훨씬 좋은 예측이라고 할 수 있는가? 절대 그렇지 않다. 이런 경우에 MSE나 MAE를 사용하는 것은 부적절하다. 전자는 실제 시세의 1.25%만큼의 오차를, 후자는 실제 시세의 400%만큼의 오차를 발생시켰으므로 전자가 훨씬 잘 한 예측이라고 보는 것이 옳을 것이다.
다음 예제를 통해 더 자세하게 이해해보자.
왼쪽의 데이터값이 오른쪽보다 훨씬 크기 때문에, 오차 단위도 오른쪽은 0.01 단위인 반면 왼쪽은 100단위로 오차가 난다. 이런 상황에서 MSE나 MAE를 비교하면 왼쪽이 크게 나오는게 당연하다. 하지만 데이터의 크기가 커서 그렇지, 동일 기준에서 놓고 보면 왼쪽이 오른쪽보다 훨씬 잘 한 예측이다. 즉, 이 상황에서는 오차의 크기가 중요한게 아니라 오차의 비율이 중요한 것이다. 이럴 때 사용하는 것이 MSLE가 된다.
참고로 MSE에 제곱근을 씌우면 RMSE가 되듯이, MSLE에 제곱근을 씌우면 RMSLE(Root Mean Squared Logarithmic Error)가 된다.
다음은 위 예제를 잘못된 지표(MSE)로 비교한 결과와 올바른 지표(MSLE, RMSLE)로 비교한 결과를 함께 출력한 것이다.
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_squared_log_error
# from sklearn.metrics import root_mean_squared_log_error # sklearn.__version__ >= 1.4.0
import numpy as np
y1_true = [79300, 81600, 82800, 81900, 80800, 80200, 79900]
y1_pred = [80300, 81500, 82500, 82600, 81700, 80500, 79600]
y2_true = [7.93, 8.16, 8.28, 8.19, 8.08, 8.02, 7.99]
y2_pred = [8.31, 8.83, 8.62, 8.69, 8.47, 8.10, 8.25]
print("Improper Comparison (MSE)")
print("y1 MSE:", mean_squared_error(y1_true, y1_pred))
print("y2 MSE:", mean_squared_error(y2_true, y2_pred))
print()
print("Proper Comparison1 (MSLE)")
print("y1 MSLE:", mean_squared_log_error(y1_true, y1_pred))
print("y2 MSLE:", mean_squared_log_error(y2_true, y2_pred))
print()
print("Proper Comparison2 (RMSLE)")
print("y1 RMSLE:", mean_squared_log_error(y1_true, y1_pred) ** 0.5)
print("y2 RMSLE:", mean_squared_log_error(y2_true, y2_pred) ** 0.5)
# print("y1 RMSLE:", root_mean_squared_log_error(y1_true, y1_pred))
# print("y2 RMSLE:", root_mean_squared_log_error(y2_true, y2_pred))
출력 결과
Improper Comparison (MSE)
y1 MSE: 368571.4285714286
y2 MSE: 0.1692857142857144
Proper Comparison1 (MSLE)
y1 MSLE: 5.6418729740461656e-05
y2 MSLE: 0.0019258366571051233
Proper Comparison2 (RMSLE)
y1 RMSLE: 0.007511240226517966
y2 RMSLE: 0.04388435549378757
MSLE로 비교하면 y1의 오차는 $5.64×10^{-5}$이고, y2의 오차는 $1.93×10^{-3}$이므로 y1의 오차가 더 작게 나옴을 알 수 있다.
④ 평균 절대 백분율 오차(Mean Absolute Percentage Error , MAPE)
MAPE는 다음과 같이 정의된다.
수식을 보면 짐작이 가겠지만 이것도 MSLE와 비슷한 맥락에서 사용된다. 데이터가 지수적으로 증가하는 경향이 있거나, 절대 오차보다는 상대 오차가 중요한 상황에서 사용하기 좋은 성능 지표다. 쉽게 말해서 MSE와 MSLE의 관계랑 MAE와 MAPE 사이의 관계가 비슷하다고 생각하면 될 것 같다.
단, 위 수식은 $y_{i}=0$인 $i$가 존재하면 계산할 수 없는 수식이다. 그래서 $y_i=0$일 때는 매우 작은 수 $\epsilon$을 정의하여 그 수를 분모로 쓰기도 한다. 참고로 사이킷런에서도 분모가 0이 되는 상황에 대비하기 위해 $\epsilon$을 사용하는데 이 값은 $2.22×10^{-16}$ 정도의 매우 작은 값이다.
이번에도 MSLE에서 사용한 데이터와 같은 데이터를 사용하여 코드로 구현해보는 시간을 가져보자.
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_absolute_percentage_error
import numpy as np
y1_true = [79300, 81600, 82800, 81900, 80800, 80200, 79900]
y1_pred = [80300, 81500, 82500, 82600, 81700, 80500, 79600]
y2_true = [7.93, 8.16, 8.28, 8.19, 8.08, 8.02, 7.99]
y2_pred = [8.31, 8.83, 8.62, 8.69, 8.47, 8.10, 8.25]
print("Improper Comparison (MAE)")
print("y1 MAE:", mean_absolute_error(y1_true, y1_pred))
print("y2 MAE:", mean_absolute_error(y2_true, y2_pred))
print()
print("Proper Comparison1 (MAPE)")
print("y1 MAPE:", mean_absolute_percentage_error(y1_true, y1_pred))
print("y2 MAPE:", mean_absolute_percentage_error(y2_true, y2_pred))
출력 결과는 다음과 같다.
Improper Comparison (MAE)
y1 MAE: 514.2857142857143
y2 MAE: 0.37428571428571444
Proper Comparison1 (MAPE)
y1 MAPE: 0.006377140462174844
y2 MAPE: 0.04613186640889076
단순히 MAE를 사용하면 y1이 y2보다 성능이 훨씬 안 좋은 것으로 해석되는데 이는 잘못된 해석이다. 절대 오차보다 상대 오차가 중요한 상황이므로 MAE 대신에 MAPE를 사용해야 정상적인 성능 비교가 가능하다. 이처럼 상대 오차가 중요한 문제에서는 MSE, MAE를 쓰기보다는 MSLE, RMSLE, MAPE를 사용해야 정상적인 성능 비교를 할 수 있음을 알 수 있다.
⑤ 절대 오차 중앙값(Median Absolute Error, MedAE), 최대 오차(Max Error)
사이킷런에서 다루는 오차이긴 한데, 흔히 사용되는 성능 지표는 아닌 것 같다. 하지만 이해하기 어려운 지표는 아니니 설명하고 넘어가려고 한다.
절대 오차 중앙값(MedAE)는 말 그대로 모든 데이터 샘플에 대해 절대 오차를 구했을 때, 그 중 중앙값을 의미한다. 평균 대신 중앙값을 사용했을 때의 이점은 이상치(outlier)의 영향을 거의 받지 않는다는 점이다. 예를 들어, 1, 2, 2, 3, 20이라는 5개의 데이터가 있을 때, 평균은 20이라는 이상치에 영향을 크게 받아 5.6으로 산출된다. 하지만 중앙값은 가장 큰 수가 20이든 200이든 무조건 2가 된다.
최대 오차(Max Error)는 모든 데이터 샘플의 절대 오차 중 최댓값을 의미한다.
이 예제에서 절대 오차를 오름차순부터 나열하면 0.2, 0.3, 0.6, 0.8, 0.8, 1.7, 1.7이다. 이 중 중앙값은 0.8이고 최댓값은 1.7이므로 MedAE는 0.8이고 Max Error는 1.7이 된다.
from sklearn.metrics import median_absolute_error
from sklearn.metrics import max_error
y_true = [2.8, 3.9, 3.6, 5.2, 6.3, 6.4, 7.1]
y_pred = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7]
print("MedAE:", median_absolute_error(y_true, y_pred))
print("Max Error:", max_error(y_true, y_pred))
출력 결과
MedAE: 0.7999999999999998
Max Error: 1.6999999999999997
출력 결과가 이렇게 나온건 부동 소수점 오차 때문이므로 그냥 0.8, 1.7인 것으로 보면 된다.
⑥ 결정 계수(Coefficient of determination, R² Score)
이번 포스팅에서 다루는 성능 지표 중 가장 어려운 개념이다.
결정 계수란, 회귀 모델에서 독립변수의 변화가 종속변수의 변화를 얼마나 잘 설명해주는지 나타내는 지표이다. 예를 들어 $R^2=0.6$이라는 것은 모델이 종속변수의 변화에 대해 60%의 설명력을 갖는다는 의미이다. 쉽게 말해서 회귀 모델이 변수들에 대해 얼마나 잘 적합(fitting)됐는지를 나타내는 지표이며, 이 값이 클수록 새로운 데이터 샘플에 대해서도 예측을 잘 할 가능성이 높다. 따라서 위에서 다뤘던 성능 지표들과 달리 이 지표는 값이 클수록 모델 성능이 좋은 것으로 판단된다.
결정 계수에 대해 설명하기 위해서는 다음과 같이 몇 가지 개념(SST, SSR, SSE)에 대한 정의가 필요하다.
- $\displaystyle \rm SST = \it \sum_{i= \rm 1}^{n} \left( y_i - \bar{y} \right)^{\rm 2}$ : 총 제곱합(SST, Sum of Squares Total)은 개별 종속 변수값($y_i$)과 종속 변수값의 평균($\bar y$)의 차를 각각 구한 후, 이들을 모두 합한 것으로 정의된다. 이는 Total Sum of Squares를 줄여 TSS라고 부르기도 한다.
- $\displaystyle \rm SSR = \it \sum_{i= \rm 1}^{n} \left( \hat{y_i} - \bar{y} \right)^{\rm 2}$ : 회귀 제곱합(SSR, Sum of Squares Regression)은 개별 종속 변수의 예측값($\hat{y_i}$)과 종속 변수값의 평균($\bar y$)의 차를 각각 구한 후, 이들을 모두 합한 것으로 정의된다. 이는 Explained Sum of Squares(설명 가능한 제곱 합)를 줄여 ESS라고 부르기도 한다.
- $\displaystyle \rm SSE = \it \sum_{i= \rm 1}^{n} \left( y_i - \hat{y_i} \right)^{\rm 2}$ : 오차 제곱합(SSE, Sum of Squares Error)은 개별 종속 변수의 예측값($\hat{y_i}$)과 종속 변수값의 평균($\bar y$)의 차를 각각 구한 후, 이들을 모두 합한 것으로 정의된다. 이는 Residual Sum of Squares(잔차 제곱합)을 줄여 RSS라고 부르기도 한다. (헷갈리기 매우 좋을 것 같다. SSR은 ESS와 같은 개념이고, SSE는 RSS과 같은 개념이다.)
지금부터는 모델이 선형 회귀라고 가정하고 $R^{2}$ 개념을 설명한다.
선형 회귀에서 MSE가 최소일 때, SST, SSR, SSE는 다음과 같은 관계가 있다.
$$\rm SST = SSR + SSE$$
선형 회귀 얘기하는거고, 비선형 회귀에서는 성립하지 않는 관계이니 주의하도록 하자. 이를 그림으로 표현하면 다음과 같다.
어찌 보면 그럴싸해 보이는데, 이를 정확히 증명해내기가 쉽지 않다. 단순히 제곱 전개해서 사칙연산 한다고 증명되지 않는다. 따라서 이에 대한 증명은 이 포스팅 끝에서 하기로 하고, 일단은 그냥 받아들이기로 하자.
그림에서 보는 것처럼 SST가 총 변화라고 하면, 이 중에서 SSR은 모델에 의해 설명 가능한 변화이고 SSE는 모델에 의해 설명 불가능한 변화이다. 따라서 SST 중에서 SSE의 비율이 낮을수록 모델의 설명력이 높아진다는 의미이고, 이것이 결정 계수 $R^{2}$의 공식이 된다.
$$R^{2}=1-\frac{SSE}{SST}=1 \it -\frac{\sum_{i= \rm 1}^{n} \left( y_i - \hat{y_i} \right)^{\rm 2} }{\sum_{i= \rm 1}^{n} \left( y_i - \bar{y} \right)^{\rm 2} }$$
- $R^2=1$일 때 : 모든 데이터 샘플에 대해 $y_{i} - \hat{y_i} = 0$이어야 나오는 값이다. 즉, 모든 데이터 샘플에 대해 예측값과 실젯값이 일치한다는 의미이므로, 모델이 모든 데이터 샘플을 완벽하게 예측했다는 의미이다.
- $0 < R^2 < 1$일 때 : $R^2$ 값이 클수록 모델의 설명력이 좋다. 즉, 새로운 데이터에 대해서도 꽤나 근접한 예측을 할 확률이 높다.
- $ R^2 = 0$일 때 : 모든 데이터에 대해 $y_{i} - \hat{y_i} = y_{i} - \bar{y}$이면, 즉 $\hat{y_i} = \bar{y}$이면 결정 계수가 0이 된다. 따라서 모든 데이터를 입력에 상관 없이 평균 $\bar{y}$로 예측한 것이나 마찬가지인 성능이므로, 성능이 매우 좋지 않은 모델이라고 할 수 있다.
- $ R^2 < 0$일 때 : 제곱이 붙어서 음수가 안 나올 것 같다는 생각과 달리 $R^{2}$의 값은 음수가 될 수 있다. 이는 모델이 예측 성능이 떨어지는 것을 넘어 아예 예측이 이상하게 되고 있을 때 나오는 값이다. 예를 들면 실제로 양의 상관관계가 있는 데이터를 음의 상관관계로 적합시켰을 때 $R^2 < 0$이 될 것이다.
이를 예제를 통해서 살펴보기로 하자.
https://one-plus-one-is-two.tistory.com/10
회귀 알고리즘(1) : 선형 회귀 Ⅰ
이번에는 머신러닝의 선사시대 역할을 맡고 있는 선형 회귀에 대해 포스팅해보려고 한다. 선형 회귀는 개론에서도 약간 다룬 바 있지만 여기서는 수식과 코드를 동반하여 더 심화적인 내용까지
one-plus-one-is-two.tistory.com
여기서 만든 선형 회귀 모델의 R2 Score를 계산해보는 코드를 작성하자. 위 글의 예제에서 주어진 데이터는 다음과 같았다.
그리고 이때 선형 회귀 모델의 가중치와 편향은 각각 다음과 같았다.
W = 0.7357142857142857
b = 2.1
MSE = 0.13448979591836732
MSE는 0.1345 정도로 나왔지만, R2 Score는 과연 얼마나 나올까? 코드를 작성하고 실행시켜 확인해보자.
from sklearn.metrics import r2_score
import numpy as np
W = 0.7357142857142857
b = 2.1
x = np.array([1, 2, 3, 4, 5, 6, 7])
y_true = np.array([2.8, 3.9, 3.6, 5.2, 6.3, 6.4, 7.1])
y_pred = W*x + b
print("R2 Score:", r2_score(y_true, y_pred))
실행 결과
R2 Score: 0.9415157969471069
선형 회귀 Ⅰ에서 만든 모델의 결정 계수는 약 0.94이다. 따라서 이 모델은 주어진 데이터에 대해 94%의 설명 능력을 가지므로 매우 우수한 모델이라고 할 수 있다.
직관적으로 봐도 x와 y 사이에 양의 상관관계가 뚜렷하게 보였고, 선형 회귀 모델은 이 데이터 샘플들에 대해 최대로 적합된 상태이기 때문이다.
그렇다면 선형 회귀 모델을 최대로 적합시켜도 이것이 변수의 변화를 제대로 설명하지 못하는 경우는 어떤 예가 있을까? 예를 들자면 다음과 같은 경우가 있을 수 있다.
데이터가 이렇게 주어져 있다고 하자. 이거는 딱 봐도 양의 상관관계도 아닌 것 같고 그렇다고 음의 상관관계도 아닌 것 같고... 뭔가 굉장히 아리까리하다. 굳이 따지자면 양의 상관관계인가? 어쨌든 이를 선형 회귀식에 최적으로 적합시키면 다음과 같다.
이게 최적화된거라고는 하는데 별로 납득은 안 된다. 즉, 이러한 모델이 설명력이 떨어지는 모델이다. 물론 선형 회귀식을 잘못 적합시켜서 그런건 아니다. 단순 선형 회귀에서 할 수 있는 최대한의 최적화를 시켜놓은 상태이다. 다만 주어진 데이터들이 선형 회귀로 설명하기 어려운 형태로 분포되어 있기 때문에 그렇다. 그렇다면 이 모델에 대한 MSE와 R2 Score을 함께 출력해보겠다.
MSE는 0.112로 이전 예제보다 약간 낮게 나왔지만, R2 Score은 겨우 0.06밖에 안 나왔다. 즉, 이 모델의 설명 능력은 6% 밖에 안 된다는 의미다. 직관적으로 봤을 때도 적합시킨 결과가 딱히 납득되지 않았는데, 결정 계수는 이 납득되는 정도를 수치화시켜주는 기능을 한다고 생각하면 된다.
추가 설명 : 선형 회귀의 MSE가 최소일 때, $\rm SST = SSR + SSE$임을 증명하기
먼저 다음 계산 과정까지는 당연하게 따라올 수 있을 것이다.
우리가 증명하려는건 $\rm SST = SSR + SSE$이다. 따라서 위 식에서 $\displaystyle \sum_{i=1}^{n} \left( \hat{y_i} - \bar{y} \right) \left(y_i-\hat{y_i} \right)=0$임을 증명하면 된다. 물론 이 식이 언제나 0이 되는건 아니고, 선형 회귀 모델을 사용하면서 이 모델의 MSE가 최소일 때는 이 식이 0이 됨을 증명할 수 있다.
선형 회귀 모델을 사용한다고 할 때, 가중치 $W$와 편향 $b$에 대해 예측값 $\hat{y_{i}}$를 다음과 같이 나타낼 수 있다.
$$\hat{y_{i}}=Wx_{i}+b$$
그러면 이를 위에서 유도한 식에 대입한 후 정리해보자.
여기서 빨간색 표시한 부분이 둘 다 0이 된다. 도대체 왜지? 이는 다음 포스팅에서 답을 찾을 수 있다.
https://one-plus-one-is-two.tistory.com/10
지도 학습(1) : 단순 선형 회귀
이번에는 머신러닝의 선사시대 역할을 맡고 있는 선형 회귀에 대해 포스팅해보려고 한다. 선형 회귀는 개론에서도 약간 다룬 바 있지만 여기서는 수식과 코드를 동반하여 더 심화적인 내용까지
one-plus-one-is-two.tistory.com
선형 회귀에서 MSE가 최소가 되기 위해서는 $\frac{\partial \rm MSE}{\partial W}$와 $\frac{\partial \rm MSE}{\partial b}$가 모두 0이 되어야 한다고 했는데, 먼저 $\frac{\partial \rm MSE}{\partial W}$의 식은 다음과 같다고 했다.
이 값이 0이므로 $\sum_{i=1}^{n} \left( y_i - Wx_i -b \right) x_i = 0$이다. 따라서 빨간색으로 표시한 두 식 중 왼쪽에 있는 것이 0임을 증명했다. 다음으로 $\frac{\partial \rm MSE}{\partial b}$의 식도 살펴보자.
이 값이 0이므로 $\sum_{i=1}^{n} \left( y_i - Wx_i -b \right) = 0$이다. 따라서 빨간색으로 표시한 두 식 중 오른쪽에 있는 것도 0임을 증명했다. 이로써 $\displaystyle \sum_{i=1}^{n} \left( \hat{y_i} - \bar{y} \right) \left(y_i-\hat{y_i} \right)=0$임이 최종적으로 증명되었으므로, MSE가 최소인 선형 회귀에서는 $\rm SST = SSR + SSE$가 성립한다. 따라서 선형 회귀 한정으로는 $R^{2}=\rm \frac{SSR}{SST}$라는 등식도 성립 가능하다.
포스팅 하면서 의문점 : 비선형 회귀 모델에서는 $\rm SST = SSR + SSE$임이 보장되지 않는데, 그렇다면 비선형 회귀에서는 결정 계수가 의미 없지 않은가?
물론 비선형 회귀에서도 결정 계수값을 정의하고 계산할 수는 있다. 비선형 회귀라고 해도 $$R^{2}=1 \it -\frac{\sum_{i= \rm 1}^{n} \left( y_i - \hat{y_i} \right)^{\rm 2} }{\sum_{i= \rm 1}^{n} \left( y_i - \bar{y} \right)^{\rm 2} }$$이라는 수식의 값을 계산하는 것 자체는 가능하니까. 그런데 $\rm SST = SSR + SSE$라는 룰이 깨진다는 것은 총 변화(SST)를 설명 가능한 변화(SSR)와 설명 가능하지 않은 변화(SSE)로 쪼갤 수 없다는 의미이고, 따라서 $\rm 1-\frac{SSE}{SST}$라는 값도 '설명 가능한 변화의 비율'을 의미하지 않게 된다.
내가 구글링을 하면서 찾아본 결과, 내 생각대로 비선형 회귀에서 $R^{2}$ 값은 별 의미가 없다는 말이 많다. 물론 비선형 회귀에서도 쓸 수 있는 Pseudo-R²이라는 지표도 있다고 하지만 여기까지 들어가면 너무 어려운 것 같고, 일단 이 지표는 선형 회귀에서만 쓰는게 좋을 것 같다.