[4일차] 컴백 평가를 해보도록 하겠습니다. [2021 추가 달력]


2021년 1인 특정 달력(기계학습)은 나흘째 보도다.
https://qiita.com/advent-calendar/2021/solo_advent_calendar
주제는 회귀의 정밀도 평가다.
MAE, MSE, RMMSE, R2점 처리.
Colab의 코드는 여기.Open In Colab입니다.

MAE, MSE, RMMSE, R2점의 실현


RMSE를 LightGBM의 메트릭으로 설정합니다.
(이론적 내용은 잠시 후)
params = {
          'task': 'train',              # タスクを訓練に設定
          'boosting_type': 'gbdt',      # GBDTを指定
          'objective': 'regression',    # 回帰を指定
          'metric': 'rmse',  # 回帰の損失(誤差)
          'learning_rate': 0.1,         # 学習率
          }
lgb_results = {}                                    # 学習の履歴を入れる入物

model = lgb.train(
                  params=params,                    # ハイパーパラメータをセット
                  train_set=lgb_train,              # 訓練データを訓練用にセット
                  valid_sets=[lgb_train, lgb_test], # 訓練データとテストデータをセット
                  valid_names=['Train', 'Test'],    # データセットの名前をそれぞれ設定
                  num_boost_round=100,              # 計算回数
                  early_stopping_rounds=50,         # アーリーストッピング設定
                  evals_result=lgb_results,
                  verbose_eval=-1,                           # ログを最後の1つだけ表示
                  )  
정밀도 평가용 라이브러리를 사용하면 편리합니다.
외관을 정리하기 위해 라운드를 사용했지만 안 써도 돼요.
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
from sklearn.metrics import explained_variance_score
from sklearn.metrics import max_error
from sklearn.metrics import median_absolute_error


mae = mean_absolute_error(y_test, y_pred)
print("MAE:", round(mae, 4))

mse = mean_squared_error(y_test, y_pred)
print("MSE:", round(mse, 4))

rmse1 = np.sqrt(mean_squared_error(y_test, y_pred))
print("RMSE 1:", round(rmse1, 4))

rmse2 = mean_squared_error(y_test, y_pred, squared=False)
print("RMSE 2:", round(rmse2, 4))

r2score = r2_score(y_test, y_pred)
print("R2 score:", round(r2score, 4))
다음은 MAE로 측정해 보자.
(상술한 바와 같이 이론 내용은 잠시 후에 언급될 것이다)
params = {
          'task': 'train',              # タスクを訓練に設定
          'boosting_type': 'gbdt',      # GBDTを指定
          'objective': 'regression',    # 回帰分類を指定
          'metric': 'mae',              # 回帰の損失(誤差)
          'learning_rate': 0.1,         # 学習率
          }
출력은 다음과 같다.
미묘한 차이지만 도량으로 설정된 지표의 정밀도가 더 높다는 것을 알 수 있다.
나는 이것이 각자의 지표가 어떤 데이터의 영향을 받기 쉬운지 나타낸다고 생각한다.
출력:
지표
metric:rmse
metric:mae
MAE:
0.0183
0.0182
MSE:
0.0601
0.0604
RMSE 1:
0.2452
0.2457
RMSE 2:
0.2452
0.2457
R2 score:
0.9205
0.9202

이론


그럼 각자의 평가 지표를 살펴봅시다.

MAE 평균 절대 오차


예측치와 정해치의 차이(=오차)의 절대치의 합을 데이터수로 나눈 값
\begin{aligned}
MAE =\frac{1}{n}\sum_{i=1}^n|y^i -\hat{y}^i|
\end{aligned}

MSE 균일 오차


예측치와 정해치의 차이(=오차)의 제곱값을 계산하고 이를 합쳐서 데이터수로 나눈 값
\begin{aligned}
MSE =\frac{1}{n}\sum_{i=1}^n(y^i -\hat{y}^i)^{2}
\end{aligned}

RMMSE 평균 제곱 오차


예측치와 정해치의 차이(=오차)의 제곱치의 총계는 제곱근이다.
\begin{aligned}
RMSE =\sqrt{\frac{1}{n}\sum_{i=1}^n(y^i -\hat{y}^i)^{2}}
\end{aligned}

$R^{2}$결정 계수


\begin{aligned}
R^{2} = 1 -\frac{\sum_{i=1}^n(y^i -\hat{y}^i)^{2}}{\sum_{i=1}^n(y^i -\bar{y}^i)^{2}}
\end{aligned}

극단적 예


이해하기 편리하도록 극단적인 예를 써서 각 지표를 살펴보자.
(사용 빈도가 높은 MAE, MSE, RMMSE R2 점수 기준)
print("MAE:", mean_absolute_error(true, pred))

print("MSE:", mean_squared_error(true, pred))

print("RMSE:", mean_squared_error(true, pred, squared=False))

print("R2 score:", r2_score(true, pred))
모델1 오차가 크고 작으며 예측은 실제 상황과 무관하다
true = [100, 2]
pred = [1, 1]
실질 성적
예측
에러
100
1
99
2
1
1
패턴2 오차가 크고 예측은 실제치와 무관하다
true = [100, 99]
pred = [1, 1]
실질 성적
예측
에러
100
1
99
99
1
98
지표
가치 평가 1
가치 평가 2
MAE:
50.0
98.5
MSE:
4901.0
9702.5
RMSE:
70.00714249274856
98.501..
R2 score:
-1.0412328196584757
-38809.0
제 개인적인 의견이지만 다음과 같이 기본적으로 이해하면 좋을 것 같습니다.

  • (1) 제곱과 (2) 절대치를 사용하여 오차가 마이너스로 변할 때의 영향을 제거하는 방법으로 한다.

  • (1) 제곱을 사용해 오차의 부정적인 영향을 없애면 수치가 지수 증가를 보이기 때문에 오차가 큰 영향을 받기 쉽다.

  • 따라서 큰 오차의 발생을 억제할 수 있지만 편차치의 영향을 받기 쉽다.

  • (2) 절대값을 사용하는 경우 제곱을 사용하는 경우보다 오차가 큰 경우의 영향을 더 받기 어렵다.

  • 따라서 제곱을 사용하는 경우와 비교하면 큰 오차의 발생을 억제하기 어려우면서도 편차치의 영향을 받기 어렵다.

  • MAE는 절대값을 사용하여 오차의 부정적인 영향을 제거합니다.

  • MSE 및 RMMSE는 제곱을 사용하여 오차의 부정적 영향을 제거합니다.

  • 한편, R2 득점은 상관관계에 영향을 받았다.

  • R2득점은 1에서 [차의 제곱을 합한 합계와 실제 성적과 실제 평균치의 차이를 합한 합계]이다.

  • 예측과 실제 성적의 오차, 개별 실적과 실제 성과의 평균치의 배리 영향.

  • 개별 실적과 실제 성과의 평균치의 괴리 없이 분포가 안정되면 분모가 작아진다.예측도 쉬울 것 같은데?

  • 그럼에도 일정 부분 예측과 실제 성적 오차가 발생하면 R2점이 감점되기도 한다.

  • 또 이때 실제 성적의 추이와 예측의 추이가 상관이 없을수록 R2점의 감소 폭이 커진다.
  • R2점 추가


    R2점에 관해서는 좀 더 보충해 주세요.
    패턴1은 큰 오차와 작은 오차가 있어 실제 상황과 무관하게 예측한다
    true = [100, 2]
    pred = [1, 1]
    
    print("実績: ", true)
    print("予測: ", pred)
    print("実績の平均: ", np.array([np.mean(true)] * len(true)).tolist() )
    print()
    
    a = np.sum(
                    (
                        # 実績
                        np.array(true) - \
                     
                        # 予測
                        np.array(pred)
                    ) 
                ** 2)
    print("実績と予測の差(誤差)の総和の二乗: ", a) # 分子
    
    b = np.sum( 
                    (
                        # 実績
                        np.array(true)  \
                     
                       # 実績の平均値
                        - np.array([np.mean(true)] * len(true))
                    )
                 ** 2 )
    print("実績と実績の平均値の差の総和の二乗: ", b) # 分母
    
    score = 1 - a/b # R2 score
    print("R2 Score: ", score)
    
    R2는 마이너스를 기록했다.
    출력:
    실제 성적:[10,2]
    예측: [1,1]
    실제 성과 평균: [51.051.0]
    실제 성적과 예측의 차이(오차)의 제곱:9802
    실제 성적과 실제 성적의 평균치의 차이의 제곱: 4802.0
    R2 Score: -1.0412328196584757
    패턴2 오차가 크고 예측은 실제치와 무관하다
    true = [100, 99]
    pred = [1, 1]
    
    ### 以降、パターン1と同様
    
    R2점의 감소폭이 놀랍다.
    출력:
    실제 성적: [10099]
    예측: [1,1]
    실제 성과 평균: [99.599.5]
    실적과 예측의 차이(오차)의 제곱: 19405
    실제 값과 실제 값의 평균 값의 차이의 제곱: 0.5
    R2 Score: -38809.0
    패턴 3 오차가 적고 예측과 실제값과 관련이 있다
    true = [1.5, 1.2]
    pred = [1.4, 1.1]
    
    ### 以降、パターン1と同様
    
    R2의 득점은 마침내 가산점의 좋은 정밀도를 얻었다.
    출력:
    실제 성과: [11.5,1.2]
    예측: [11.41.1]
    실제 성과 평균: [1.351.35]
    실적과 예측의 차이(오차)의 합계: 0.0199999999999
    실제 성적과 실제 성적의 평균치의 차이의 제곱: 0.04500001
    R2 Score: 0.5555555555555559
    패턴 4 오차는 작지만 예측과 실제 상황은 무관하다
    true = [1.5, 1.2]
    pred = [1.0, 1.0]
    
    ### 以降、パターン1と同様
    
    패턴 3과 오차 크기에 큰 변화가 없지만 예측된 관련성 분실로 R2 득점은 마이너스로 바뀌었다.
    출력:
    실제 성과: [11.5,1.2]
    예측: [1.01.0]
    실제 성과 평균: [1.351.35]
    실제 성적과 예측의 차이(오차)의 제곱:0.29
    실제 성적과 실제 성적의 평균치의 차이의 제곱: 0.04500001
    R2 Score: -5.444444444444442
    비교는 다음과 같다.
    패턴
    개요
    R2분
    모드 1
    오차가 각기 다르기 때문에 예측은 실제 성적과 상관이 없다
    -1.04
    모드 2
    오차가 커서 예측은 실제 성적과 무관하다
    -38809.0
    모드 3
    오차도 적고 예측과 실제 성적과 관련이 있다
    0.55
    모드 4
    오차는 비록 작지만 예측과 실제 성적은 무관하다
    -5.44
    넷째 날은 여기까지입니다. 끝까지 읽어주셔서 감사합니다.

    사이트 축소판 그림


    https://atmarkit.itmedia.co.jp/ait/articles/2105/19/news022.html
    https://atmarkit.itmedia.co.jp/ait/articles/2105/24/news019.html
    https://aizine.ai/rmse-rmsle1114/#toc2
    https://www.weblio.jp/content/RMSE
    https://mathwords.net/rmsemae
    https://funatsu-lab.github.io/open-course-ware/basic-theory/accuracy-index/#r2
    https://water2litter.net/rum/post/python_sklearn_evaluation_function/#my_mokuji0
    https://atmarkit.itmedia.co.jp/ait/articles/2108/18/news023.html
    https://aizine.ai/r2-score0411/
    https://katex.org/docs/supported.html
    https://goessner.github.io/markdown-it-texmath/index.html
    https://toukeigaku-jouhou.info/2019/05/06/latex-x-bar/

    좋은 웹페이지 즐겨찾기