본문 바로가기

타닥타닥10: logloss란? 본문

공부

타닥타닥10: logloss란?

Savedata 2023. 5. 1. 22:41

Logloss란?

분류 모델을 평가하는데 사용하는 모델 성능 평가 지표

 

이진 분류, 다중 분류, 다중 레이블 분류 모델에서 모두 사용될 수 있다.

교차 엔트로피 손실(Cross-entropy loss) 또는 로지스틱 손실(Logistic loss)로도 알려져 있다.

사용하는 이유는?

최종적으로 맞춘 결과만을 가지고 성능을 평가할 경우, 어느 정도의 확률로 해당 답을 얻은 것인지에 대한 평가는 불가능하다. 답을 맞추더라도 낮은 확률로 우연히 얻어 걸린 것이라면 성능이 좋은 모델이라고 평할 수 없을 것이다.

 

이를 보완하기 위해서는 확률 값을 평가 지표로 사용하면 되는데, Logloss는 모델이 예측한 확률 값을 직접적으로 반영하여 평가한다.

 

아래 식을 보면 확률 값을 음의 log함수에 넣어 변환을 시킨 값으로 평가하는데, 이는 잘못 예측할때 패널티를 부여하기 위함이다. 그렇기에 낮을수록 좋은 지표이며, 이를 낮추는 방식으로 학습을 진행시킨다.

예를 들어, 100% 확률로 예측한 답의 경우는 -log(1.0) = 0 이다. 80% 확률이라면 -log(0.8) = 0.22 이다. 이런식으로 확률이 낮을수록 logloss의 값이 빠르게 증가하게 된다.

 

예제코드

import numpy as np

def log_loss(y_true, y_pred): 
    assert len(y_true) == len(y_pred), "Lengths of true labels and predicted probabilities must be equal."   
    n_samples = len(y_true)   
    log_loss_value = -np.sum(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) / n_samples   
    return log_loss_value

# 샘플 데이터
y_true = np.array([1, 0, 1, 1, 0, 1])
y_pred = np.array([0.9, 0.1, 0.8, 0.7, 0.2, 0.6])

# 로그 손실 계산
loss_value = log_loss(y_true, y_pred)
print("Log loss:", loss_value)

> Log loss: 0.2540847836081325
from sklearn.metrics import log_loss
import numpy as np

# 실제 클래스 레이블과 모델이 예측한 클래스 레이블의 확률값
y_true = np.array([0, 1, 1, 0])
y_pred = np.array([[0.9, 0.1], [0.4, 0.6], [0.7, 0.3], [0.2, 0.8]])

# logloss 계산
logloss = log_loss(y_true, y_pred)

print("Logloss: ", logloss)

> Logloss: 0.8573992140459634

 

기초적인 것부터 하나하나 제대로 채워나가야 한다는 것을 실감하는 요즘.
Comments