ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 회귀분석 평가지표 종류(특징, 장단점, 파이썬 코드)
    Data Science/데이터마이닝 2022. 6. 23. 22:07
    반응형

    대학원생일때까지만 해도 평가지표는 단순히 모델의 성능을 나타내는 것이라고 생각했었는데.

    회사에서 평가지표란 프로젝트의 성공 및 적용 여부를 표현할 수 있어야 하며,

    관리자(팀장,임원 등)들을 설득시킬 수 있어야 했다.

     

    본 글에서는 회귀분석에서는 평가지표들을 간단히 짚어보며

    수식, 특징, 파이썬 코드와 더불어서 간단한 사족을 붙이려 한다.

     

    각 평가지표의 수식의 경우 다양한 블로그 및 사이트에서 다루므로 생략한다.

    0. 목록

    1. R Squared(R2, 결정계수)
    2. Adjusted R Squared(Adjusted R2, 조정된 결정계수)
    3. MAE(Mean Absolute Error, 평균절대오차)
    4. MSE(Mean Squared Error, 평균제곱오차)
    5. RMSE(Root Mean Squared Error, 평균제곱근오차)
    6. MAPE(Mean Absolute Percentage Error, 평균절대비율오차)
    7. MPE(Mean Percentage Error, 평균비율오차)
    8. SMAPE(Symmetric Mean Absolute Percentage Error, 대칭평균절대비율오차)
    9. Spec in Ratio

    1. R Squared(R2, 결정계수)

    회귀 모델에서 종속변수의 분산 중 독립변수로 설명되는 비율을 나타내는 지표.

    0부터 1사이의 값을 가지며, 1은 100%의 설명력을 가진다는 의미.

    음수의 값이 나오기도 하는데 이는 모든 값을 종속변수의 평균값으로 예측했을 경우보다 설명력이 낮다는 의미.

     

    독립변수의 수가 증가하면 R Squared도 증가한다는 특징이 있음.

    즉, 종속변수에대한 설명력이 없는 독립변수가 추가되어도 R Squared은 증가 할 수 있음.

     

    가장 대표적인 평가지표이지만, 단독으로 사용하지 않고 타 평가지표와 같이 사용하는 것을 추천.

    0~1 사이의 값을 가지기 때문에 어느정도 퍼센트(%)적인 성격을 띄어 보고시에 용이함.

    from sklearn.metrics import r2_score
    r2_score(y_true, y_pred)
    
    # 예측모델 결과의 r2와 조금 다르다면 아래의 파라미터를 추가해 볼 것
    # r2_score(y_true, y_pred, multioutput='variance_weighted')

    2. Adjusted R Squared(Adjusted R2, 조정된 결정계수)

    R Squared에서 독립변수 증가에 따른 일방적인 설명력 상승을 보완하기 위해 제안됨.

    def adjusted_r_squared(r2_score,X_test):
    	return 1 - (1-r2_score)*(len(X_test)-1)/(len(X_test)-X_test.shape[1]-1)
    
    # r2_score : 모델에서 예측 된 r2 // model.score(X_test, y_true)
    # X_test : 테스트 데이터 셋의 독립변수셋(X)
    adjusted_r_squared(r2_score,X_test)

    3. MAE(Mean Absolute Error, 평균절대오차)

    오차(예측값 - 평균값)의 절댓값에 대한 평균을 나타내는 지표.

    양수의 값을 가진다.

     

    MAE의 값이 실제 종속변수의 단위와 동일하여 직관적이다.

    종속변수의 단위가 시간일 경우 MAE : 7은 모델의 예측값이 평균적으로 7시간의 오차를 가진다는 의미.

     

    스케일에 의존적이다.

    MAE가 나타내는 값은 종속변수의 단위와 동일하다.

    동일한 MAE 7이여도 종속변수의 범위가 10~100인 데이터와 100,000~200,000인 데이터에서 그 의미는 상이하다.

    데이터에 대한 도메인 지식이 없다면 MAE가 가지는 의미를 파악하기 힘들다.(ex: 그래서 MAE 7이 얼마나 좋은건데?)

     

    절대값을 취하기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 없다.

    예측 경향성이란, 모델이 실제 종속변수보다 과대평가(overestimates)를 하는지 과소평가(underestimates)를 하는지에 대한 경향성이다.

    배달음식 도착 예측 모델이 있다고 가정하고 글쓴이의 입장에서는, 예측시간보다 실제로 빨리 온다면 이득을 본 기분이지만 예측시간보다 늦게 온다면 손해를 보는 느낌일 것이다.

    이럴 경우 오차의 +/-가 가치가 다르다고 할 수 있다.

    from sklearn.metrics import mean_absolute_error
    mean_absolute_error(y_true, y_pred)

    4. MSE(Mean Squared Error, 평균제곱오차)

    오차(예측값 - 평균값)의 제곱 대한 평균을 나타내는 지표.

    양수의 값을 가진다.

     

    스케일에 의존적이다.

    1미만의 오차에 대해서는 제곱을 취할 경우 값이 작아진다.

    1이상의 오차에서는 값이 클 수록 제곱 값은 더욱 커진다.

    큰 오차에 대해서 많은 가중치를 취하기 때문에 이상치에 취약하다.

     

    절대값을 취하기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 없다.

    (MAE 파트의 설명과 동일)

    from sklearn.metrics import mean_squared_error
    mean_squared_error(y_true, y_pred)

    5. RMSE(Root Mean Squared Error, 평균제곱근오차)

    MSE에 루트를 씌운 지표.

     

    스케일에 의존적이다.

    1미만의 오차에 대해서는 제곱을 취할 경우 값이 작아진다.

    1이상의 오차에서는 값이 클 수록 제곱 값은 더욱 커진다.

    제곱근오차를 사용하기 때문에 제곱오차(MSE)보다 값의 왜곡이 적다.

     

    절대값을 취하기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 없다.

    (MAE 파트의 설명과 동일)

     

    r2와 더불어서 자주 사용되는 평가지표다.

    from sklearn.metrics import mean_squared_error
    mean_squared_error(y_true, y_pred,squared=False)

    6. MAPE(Mean Absolute Percentage Error, 평균절대비율오차)

    MAE에 비율의 개념을 적용한 평가지표.

     

    지표가 비율의 형태이기 때문에 직관적이다.

     

    스케일에 의존적이다.

    종속변수의 스케일에 비해서 변동폭이 작다면 MAPE가 비이상적으로 높게 나타난다.

    종속변수가 100,000~ 100030 범위의 값을 가지고 있을 때 평균값인 100,015로 예측을 한다고 가정한다.

    y_true = np.array([100000,100010,100020,100030])
    y_pred = np.array([100015,100015,100015,100015])

    이때 MAPE는 99.99%의 값을 가진다.

    R Squared의 경우 0의 값을 가진다.

    또한 종속변수에 1미만의 값이 있을 경우 MAPE값이 음수 값이 나타날 수 있다.(-1300% 같은 이상치가 나올 수 있다.)

     

    절대값을 취하기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 없다.

    (MAE 파트의 설명과 동일)

    from sklearn.metrics import mean_absolute_percentage_error
    mean_absolute_percentage_error(y_true, y_pred)
    
    # 포스팅과 같이 백분율로 나타내고 싶다면 아래와 같다.
    # 100-mean_absolute_percentage_error(y_true, y_pred)*100

    7. MPE(Mean Percentage Error, 평균비율오차)

    MAPE에서 절대값을 취하지 않는 평가지표이다.

     

    절대값을 취하지 않기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 있다.

    하지만, 오차가 양수/음수 고르게 나온다면 0으로 수렴할 수 있기 때문에 주의해야 한다.

    아래의 데이터의 경우 MPE는 100%이며 MAPE는 50%이다.

    y_true = np.array([10,10,10,10])
    y_pred = np.array([15,5,15,5])
    import numpy as np
    def mean_percentage_error(y_true,y_pred):
    	return np.mean((y_true-y_pred)/y_true)*100
        
    mean_percentage_error(y_true,y_pred)
    
    # 포스팅과 같이 백분율로 나타내고 싶다면 아래와 같다.
    # 100-mean_percentage_error(y_true,y_pred)

    8. SMAPE(Symmetric Mean Absolute Percentage Error, 대칭평균절대비율오차)

    MAPE에서 분모 계산시에 종속변수에 예측값을 더하여 범위를 제한한 지표다.

    기존 MAPE에서는 종속변수에 1미만의 값이 존재할 경우 음수 값이 나타나지만,

    SMAPE에서는 이러한 점을 보완하여 0~100% 범위 내에서 값이 산출되도록 하였다.

    y_true = np.array([0.01,0.02,0.01,0.002])
    y_pred = np.array([0.1,0.1,0.15,0.3])

     다음과 같은 데이터에서 MAPE는 -4300%라는 이상치가 나타나지만 SMAPE는 16.33%라는 값을 반환한다.

     

    분모 계산시에 종속변수에 예측값을 더하기 때문에 오차의 +/-에 대한 차이가 발생한다.

    아래와 같이 데이터1에서는 [2,2,4,1]의 오차이던 것을 데이터2에서 [-2,-2,4,1]로 변경하였다.

    y_true1 = np.array([5,10,7,9])
    y_pred1 = np.array([7,12,11,10])

    y_true2 = np.array([5,10,7,9])
    y_pred2 = np.array([3,8,11,10])

    MAPE에서는 동일하게 67.93%를 나타내지만 SMAPE에서는 각각 86.68%와 84.1%를 나타낸다.

     

    import numpy as np
    def symmetric_mean_absolute_percentage_error(y_true, y_pred):
        return 100/len(y_true) * np.sum(np.abs(y_pred-y_true) / (np.abs(y_true) + np.abs(y_pred)))
        
    symmetric_mean_absolute_percentage_error(y_true, y_pred)
    
    # 포스팅과 같이백분율로 나타내고 싶다면 아래와 같다.
    # 100-symmetric_mean_absolute_percentage_error(y_true, y_pred)
    
    # 해당 코드에서는 y_true, y_pred가 둘다 0일 경우를 고려하지 않고 있다.

    9. Spec in Ratio

    허용오차 내 범위를 가지는 평가결과 비율을 나타내는 지표.

    앞선 평가지표들이 오차에대한 값을 나타냈다면, Spec in ratio는 분류문제와 같이 Yes/No로 이진분류를 하는 지표이다.

    Spec in ratio는 사전에 정의 된 허용오차가 필요하다.

    예측된 결과와 실제 종속변수간에 차이가 허용오차보다 낮다면 Yes 높다면 No로 평가하여 최종적으로는 허용오차를 만족하는 비율을 산출하게 된다.

     

    허용오차를 정의할 수 있다는 가정하에 직관적이며 스케일에 구애받지 않는 평가지표이다.

    def spec_in_ratio(y_true,y_pred,margin_of_error):
    	return len(np.where(np.abs(y_true-y_pred) <= margin_of_error)[0])/len(y_true)*100
        
    spec_in_ratio(y_true,y_pred,margin_of_error)

    참고

    https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics

    https://www.statology.org/adjusted-r-squared-in-python/

    https://www.statology.org/smape-python/

    https://namu.wiki/w/%EA%B2%B0%EC%A0%95%EA%B3%84%EC%88%98

    https://en.wikipedia.org/wiki/Symmetric_mean_absolute_percentage_error

    https://blog.naver.com/seokcrew/221750920090

    https://white-joy.tistory.com/10

    반응형

    댓글

Designed by Tistory.