본문 바로가기

데이터 사이언스 공부

00. logloss와 예측율의 상관관계 ( logloss가 낮아도 예측율은 높을 수 있는가?)

분류 모델을 사용하여 모델의 예측값과 실제값을 비교하는 문제를 해결할 때, 드는 의문이 있었다.

 

필자는 sklearn의 유방암 데이터셋을 활용했다.

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import pandas as pd

dataset = load_breast_cancer()
df = pd.DataFrame(dataset.data, columns=dataset.feature_names)
df['target'] = dataset.target

X_train, X_test, y_train, y_test = train_test_split(df.drop('target', axis=1), df['target'], test_size=0.5)

 

데이터를 train/test 데이터셋으로 나누었다.

 

from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score

model = XGBClassifier(random_state=0, use_label_encoder=False, eval_metric='logloss',
                      learning_rate = 0.1,
                      n_estimators = 300)

eval_set = [(X_test, y_test)]
model.fit(X_train, y_train, eval_set=eval_set)
pred = model.predict(X_test)
accuracy_score(y_test, pred)

 

전체 실행 결괏값

 

XGBoost 모델에 학습시키고 예측을 돌렸다.

 

n_estimator가 300이므로, 300회 동안의 예측값과 loss값이 모두 출력된 것을 확인할 수 있다.

model = XGBClassifier(random_state=0, use_label_encoder=False, eval_metric='logloss', 
                     learning_rate = 0.1,
                      n_estimators = 300)
eval_set = [(X_test, y_test)]
model.fit(X_train, y_train, eval_set=eval_set, early_stopping_rounds=10)
pred = model.predict(X_test)
accuracy_score(y_test, pred)

 

early stopping 결괏값

 

10회 이상 loss값이 개선되지 않으면 모델을 먼저 멈추는 early_stopping 파라미터를 활용한 모습이다. 140회에서 멈춘 것을 볼 수 있다.

 

여기서 드는 의문은, logloss값이 early stopping을 적용했을 때가 더 낮은데, 예측값의 퍼센티지는 먼저 멈추지 않고 전부 실행시켰을 때가 더 높았다는 것이다.

 

사실 무시해도 되는 수치다. 그런데 의문이었던 점은, 상식적으로 loss값이 낮아지면 문제를 맞추는 퍼센티지가 더 올라가야 하는 것이 아니냐는 점이다.

 

모든 조건이 동일할 때, 왜 저런 결과가 발생하는지 한 번 조사해보았다. 조사의 결과는 다음과 같다.

 


 

logloss와 accuracy는 모두 모델의 성능을 평가하는 지표이지만, 서로 다른 방식으로 모델의 성능을 평가한다. 따라서 완벽한 상관관계가 있지 않을 수도 있고, 다른 방향으로 평가될 수 있다.

 

1. LogLoss (로그 손실)

  • LogLoss는 확률적인 예측을 기반으로 계산된다. 모델이 클래스에 대해 예측한 확률을 바탕으로 실제 라벨과 얼마나 일치하는지를 측정한다.
  • 예를 들어, 확률 예측이 0.7인데 실제 라벨이 1이면 이 예측은 꽤 신뢰할 수 있지만, 확률 예측이 0.3이면 불확실성이 크고 로그 손실은 커진다.
  • LogLoss는 모델이 얼마나 확신을 가지고 정확한 예측을 했는지를 평가하는 지표이다. 예측이 확실하고 정확하다면 LogLoss 값이 낮다.

2. Accuracy (예측 정확도)

  • Accuracy는 모델이 정확하게 예측한 데이터 포인트의 비율이다. 즉, 예측된 클래스가 실제 클래스와 일치하는 경우의 비율을 계산한다.
  • Accuracy는 확률 예측이 아닌 결정적인 예측(예: 클래스 확률이 0.5 이상이면 해당 클래스를 예측함)을 기준으로 평가된다.
  • Accuracy는 모델이 클래스 예측을 잘했는지의 여부만을 확인하고, 예측의 확신도나 불확실성은 고려하지 않는다.

LogLoss와 Accuracy 간의 상관관계

  • 일반적으로 LogLoss가 낮을수록 모델의 확신이 높고 정확한 예측을 한다는 뜻이지만, LogLoss가 낮다고 해서 반드시 Accuracy가 높을 필요는 없다.
  • Accuracy는 불확실성에 둔감하다. 예를 들어, 모델이 클래스 0에 대해서 99% 확률로 예측하고, 나머지 1%에 대해서만 클래스를 잘못 예측하는 경우, Accuracy는 매우 높을 수 있지만, LogLoss는 높을 수 있다. 이 경우 모델이 확신을 가지고 잘못된 예측을 한 것이므로 LogLoss가 증가하게 된다.
  •  

상황 예시

  1. 불균형 데이터셋에서 높은 정확도와 낮은 LogLoss
    • 불균형 데이터셋에서는 Accuracy가 높은 것처럼 보일 수 있지만, 모델이 대부분 클래스에서 확신을 가지고 잘못 예측했다면 LogLoss는 높은 값을 가질 수 있다.
  2. 잘 균형 잡힌 데이터셋에서 낮은 LogLoss와 높은 정확도
    • 잘 균형 잡힌 데이터셋에서 모델이 각 클래스에 대해 확실하고 정확한 예측을 했다면 LogLoss가 낮고 Accuracy도 높을 가능성이 크다.

 

그러니까 결국은 logloss는 전체 데이터포인트에 대한 확률분포의 차이값의 합과 같고(물론 이는 모델마다 다를 수 있다), accuracy는 단순히 pred와 y_test의 차이이기 때문에 완벽하게 동일한 방향으로 나아갈 수는 없다는 것이다.

 

물론 일반적으로는 LogLoss가 낮으면 Accuracy가 높은, 음의 상관관계를 보이겠지만 그렇지 않은 경우도 충분히 있을 수 있다는 말이다.

 

여기서 문제는, 우리가 모델을 하나 만들 때 0.001퍼센트의 결과 개선을 위해 하이퍼파라미터를 조정하는데,

"이론적으로" logloss만을 참고하여 early stopping을 사용하게 되면 실질적인 accuracy값은 더 낮게 나올 수도 있지 않을까 하는 점이다.

 

데이터가 늘어나고 모델의 iter 횟수가 늘어난다면 이 문제는 자연스레 해결이 되겠지만, 이 부분을 인지하고 있는 것은 중요할 것 같았다.

 

그리고 쓸데없이 이런 문제에 관심을 가지는 나 같은 사람들을 위해 한 번 정리해 보았다.