하마가 분석하마

[machine learning class] 3. 검증 및 평가 메트릭-3 본문

Machine learning class

[machine learning class] 3. 검증 및 평가 메트릭-3

Rrohchan 2021. 2. 22. 12:27
코드를 통한 이해가 가장 빠를거라 생각하기에 이번 장은 코드를 깃허브 링크와 함께 티스토리에도 넣었다.

 회귀 학습에서 가장 일반적인 메트릭은 오차 (error)이다. 오차는 [실제 값-예측 값]을 의미한다.

 

1. MAE (mean absolute error)

 절대오차 (absolute error)는 오차의 절대 값이다. 평균절대오차인 MAE는 일반적인 회귀 지표로써 사용된다. 시계열 분석에서 예측 오차의 일반적인 척도이며 평균 절대 편차(MAD)의 표준 정의와 혼동하여 사용된다.

## MAE : 절대 오차의 평균
import numpy as np

def mean_absolute_error(y_true, y_pred):
    
    # 오차를 0으로 초기화
    error = 0
    # 모든 샘플에 대해 오차를 계산
    for yt, yp in zip(y_true, y_pred):
        
        # 절대오차를 계산한다.
        # 전체 오차에 합한다.
        error += np.abs(yt - yp)
        
    #  전체 절대오차의 평균을 구한다.
    return error / len(y_true)

 

2. MSE (mean squared error)

 제곱오차의 평균으로 회귀모델을 평가하는데 가장 많이 사용되는 메트릭이다. (실제 값-예측 값)의 제곱의 평균을 의미한다. 항상 음수가 아니며 0에 가까운 값이 좋다. 또한 분산과 편향을 모두 통합하는 지표이다.

 MSE는 통계에서 가장 널리 사용되는 손실 함수 중 하나이다. 그 이유는 응용 프로그램의 실제 손실을 고려하는 것보다 수학적 편의성 때문이다. 

## MSE : 제곱 오차의 평균
def mean_squared_error(y_true, y_pred):
    # 오차를 0으로 초기화
    error = 0
    # 모든 샘플에 대해 오차를 계산
    for yt, yp in zip(y_true, y_pred):
        
        # 절대오차를 계산한다.
        # 전체 오차에 합한다.
        error += (yt - yp)**2
        
    #  전체 절대오차의 평균을 구한다.
    return error / len(y_true)

 

RMSE는 MSE에  루트를 씌운 것으로 MSE보다 평가 지표로써 많이 쓰인다. 위 MSE 코드에 루트만 씌우면 되므로 넘어가겠다.

 

3. MSLE (mean squared lagarithmic error)

 제곱 로그 오차의 평균으로 MSE와 유사한 메트릭이다. 실제 값과 예측 값 사이의 비율 측정 값으로 해석될 수 있다. 그러므로 MSLE는 퍼센트 차이 (상대적인 차이)에만 관심을 가져 값 사이의 백분율 차이를 나타낸다. 그러므로 비율이 갖다면 큰 실제 값과 큰 예측 값, 작은 실제 값과 작은 예측 값을 동일하게 처리한다.

 

 또한 과대 평가보다 과소 평가에 페널티를 적용하여 오차 곡선에 비대칭을 도입한다. 이러한 이유로 목표 값의 범위가 큰 경우 큰 오류가 작은 오류보다 훨씬 더 많은 페널티를 받는 것을 원하지 않을 때 MSLE를 사용한다.

## MSLE : 제곱 로그 오차의 평균
def mean_squared_log_error(y_true, y_pred):
    # 오차를 0으로 초기화
    error = 0
    # 모든 샘플에 대해 오차를 계산
    for yt, yp in zip(y_true, y_pred):
        
        # 절대오차를 계산한다.
        # 전체 오차에 합한다.
        error += (np.log(1+yt) - np.log(1+yp))**2
        
    #  전체 절대오차의 평균을 구한다.
    return error / len(y_true)

 

4. MPE (mean percentage error) & MAPE (mean absolute percentage error)

 MPE는 백분율 오차의 평균이다.  MAPE는 평균 절대 백분율 오차로 정확도를 오차의 백분율로 나타낸 것이다. 예를 들어 MAPE가 5이면 예측 값은 평규 5% 벗어난다. 

 

 실제 값이 1보다 작을 때 MAPE는 크게 팽창하여 무한대에 가까운 값을 가지고 만약 실제 값이 0이라면 MAPE 값 자체를 계산할 수 없다. 이러한 경우 모형이 데이터를 잘 적합시키더라고 MAPE 값은 매우 크게 나와 모형 성능의 정확한 평가에 어려움이 있을 수 있다.

## MPE : 백분율오차의 평균
def mean_percentage_error(y_true, y_pred):
    # 오차를 0으로 초기화
    error = 0
    # 모든 샘플에 대해 오차를 계산
    for yt, yp in zip(y_true, y_pred):
        # 백분율 오차를 계산하여 전체 오차에 합한다.
        error += (yt - yp) / yt
        
    #  전체 오차의 평균을 구한다.
    return error / len(y_true)
## 함수 없이 메트릭을 사용하여 MAE 구하기
import numpy as np

def mae_np(y_true, y_pred):
    return np.mean(np.abs(y_true - y_pred))
## MAPE : 백분율오차의 평균에 대한 절대값 버전
def mean_abs_percentage_error(y_true, y_pred):
    # 오차를 0으로 초기화
    error = 0
    # 모든 샘플에 대해 오차를 계산
    for yt, yp in zip(y_true, y_pred):
        # 백분율 오차를 계산하여 전체 오차에 합한다.
        error += np.abs(yt - yp) / yt
        
    #  전체 오차의 평균을 구한다.
    return error / len(y_true)

 

4. 결정계수

 결정계수는 간단히 말해 예측 값이 실제 값을 얼마나 잘 설명하는 가를 측정한다. 1에 가까운 결정계수는 예측 값이 실제 값을 잘 설명한다는 것이고, 0에 가까운 결정계수는 그렇지 않다는 것을 나타낸다. 예측 값이 실제 값과 반대의 상관 관계를 가질 때 결정계수가 음수가 되기도 한다.

 

 설명변수를 추가하면 할수록 결정계수가 점점 1에 가까워지기에 설명변수가 많은 경우에는 높은 결정계수를 신뢰할 수 없다는 단점이 있다. 모형의 설명력을 변수의 개수에 따라 높아지는 결정계수를 보고 정확하게 알 수 없기 때문이다.

# 결정계수
import numpy as np

def r2(y_true, y_pred):
    
    # 타겟 값의 평균을 구한다.
    mean_true_value = np.mean(y_true)
    
    # 분자를 0으로 초기화
    numerator = 0
    # 분모를 0으로 초기화
    denominator = 0
    
    # 모든 샘플에 대해 분자와 분모를 업데이트 한다.
    for yt, yp in zip(y_true, y_pred):
        # 분자를 업데이트 한다.
        numerator += (yt - yp) ** 2
        # 분모를 업데이트 한다.
        denominator += (yt - mean_true_value) ** 2
    # 분자와 분모의 비율을 구한다.
    ratio = numerator / denominator
    # 1-비율을 반환한다.
    return 1 - ratio

 

5. 고급 메트릭

 

1. QWK (quadratic weighted kappa)

 

 '코헨의 카파'라고 불리는 메트릭으로 자주 사용된다. QWK는 두 평점의 동의도(agreement)를 측정한다. 평점의 실제 값은 0에서 N 사이의 임의의 실수이고 예측 값 또한 동일한 범위를 가진다. 동의도는 실제 평점과 예측 평점이 얼마나 가까운 지로 정의할 수 있다. 동의도가 높으면 QWK가 1에 가까워지고, 동의도가 낮으면 QWK가 0에 가까워진다.

 

 타겟 변수의 평점이 범주형 변수인 다중분류 문제를 확인해 보자.

## QWK
from sklearn import metrics

y_true = [1, 2, 3, 1, 2, 3, 1, 2, 3]
y_pred = [2, 1, 2, 1, 2, 3, 3, 1, 2]

metrics.cohen_kappa_score(y_true, y_pred, weights = 'quadratic')
metrics.accuracy_score(y_true, y_pred)

0.85 이상의 QWK는 아주 좋은 점수로 볼 수 있다.

 

2. MCC (Matthew's Correlation Coefficient)

 MCC는 -1에서 1 사이 값을 가진다. 1은 완벽한 예측, -1은 반대의 예측, 0은 랜덤한 예측을 나타낸다. 위 식에서 MCC가 TP, FP, TN, FN을 고려한 것을 볼 수 있다. 즉, 편향된 범주 분포에 사용할 수 있는 메트릭이다.

## MCC
def mcc(y_true, y_pred):
    
    # 이진분류에서  mcc 구하기
    tp = true_positive(y_true, y_pred)
    tn = true_negative(y_true, y_pred)
    fp = false_positive(y_true, y_pred)
    fn = false_negative(y_true, y_pred)
    
    numerator = (tp * tn) - (fp * fn)
    
    denominator = (
    (tp + fp) *
    (fn + tp) *
    (fp + tn) *
    (tp + fn)
    )
    
    denominator = denominator**0.5
    
    return numerator / denominator

 

TP, FP, TN, FN에 대한 파이썬 함수들은 이전 포스팅을 참고하면 된다.

 

https://github.com/rch1025/Machine-learning-class

 

rch1025/Machine-learning-class

Several concepts and several tips that are important for data analysis can be learned. I studied based on 'Machine Learning Master Class'. - rch1025/Machine-learning-class

github.com