Skip to main content

머신러닝에서의 F1 점수 입문

머신러닝에서 F1 점수란 무엇이며 왜 중요한가 이 글은 AI 번역본입니다. 오역이 의심되면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15

F1 점수란 무엇인가?

머신러닝과 데이터 사이언스의 세계에서 평가 지표는 예측 모델의 효과와 성능을 해독하는 핵심이다. 각 지표는 (예를 들어 정확도, 정밀도 또는 재현율) 는 모델의 성능에 대한 고유한 통찰을 제공하여 예측을 미세 조정하고 더 나은 결과를 달성하는 데 도움을 준다.
오늘 다룰 지표는 F1 점수다. F1 점수는 특히 분류 문제의 맥락에서 매우 중요한 도구로, 하나의 지표로서 다음을 포괄한다. 성능 분류기의 … 측면에서 둘 다 정밀도와 재현율을 모두 고려하여 어느 한쪽도 다른 쪽을 희생시키며 무시되지 않도록 한다.
F1 점수의 수학적 공식은 다음과 ��다:
출처: 작성자

머신러닝에서 F1 점수가 중요한 이유는 무엇인가?

머신러닝 모델을 다룰 때는 데이터셋이 종종 불균형한 경우가 많습니다. 즉, 한 클래스의 샘플 수가 다른 클래스에 비해 과도하게 많거나 적을 수 있습니다. 이러한 불균형은 전통적인 평가 지표를 왜곡하여 모델의 실제 성능을 정확하게 반영하지 못하게 만들 수 있습니다.
예를 들어, 전체 샘플의 95%가 한 클래스(예: 고양이)에 속한 데이터셋에서는, 모델이 모든 샘플에 대해 단순히 그 클래스를 예측(저건 고양이!)하기만 해도 실제로 아무 의미 있는 학습을 하지 않았음에도 95%의 정확도를 달성할 수 있습니다. 이러한 현상은 “정확도 역설은 클래스 불균형이 존재할 때 전통적인 지표가 얼마나 쉽게 오해를 불러일으킬 수 있는지를 강조한다.
한편, 정밀도와 재현율은 정확도만으로는 포착되지 않는 모델 성능의 서로 다른 측면을 드러낸다. 정밀도 은(는) 모델이 예측한 모든 양성 예측 중에서 실제로 맞은 양성의 비율을 측정하며, 동시에 재현율 은 실제 양성 전체 중에서 올바르게 예측한 양성의 비율을 측정한다. 다만 두 지표 모두 클래스 불균형의 영향을 받을 수 있다. 정밀도가 높은 모델은 양성 예측을 보수적으로 하는 데 그칠 수 있고, 재현율이 높은 모델은 소수 클래스를 과도하게 양성으로 예측할 수 있다.
이런 상황에서는 F1 점수가 매우 유용하다. F1 점수는 정밀도와 재현율의 조화평균을 취해 두 지표 사이의 균형을 제공한다. 정밀도와 재현율의 균형이 중요한 이유는, 한 지표만 상승해도 다른 지표의 개선 없이 전체 점수가 과도하게 왜곡되지 않도록 보장하기 때문이다. 특히 거짓 양성과 거짓 음성의 비용이 서로 다를 때, F1 점수는 적절한 절충을 유지하는 데 도움이 된다. 일반적으로 정밀도를 높이면 거짓 양성이 줄어들고, 재현율을 높이면 거짓 음성이 줄어든다.

현실 세계의 머신러닝 프로젝트에서 F1 점수는 어디에 활용되나요?

F1 점수는 정밀도와 재현율의 균형이 중요한 다양한 실제 활용 사례에서 특히 가치가 크다. 예를 들면 다음과 같다:

의료 진단

의료 검사에서 특정 질병의 보유 여부를 예측할 때는 거짓 음성(아픈 환자를 놓치는 경우)과 거짓 양성(건강한 사람을 잘못 진단하는 경우)을 최소화하는 것이 중요하다. F1 점수는 질병의 실제 사례를 올바르게 식별하는 모델의 능력을 평가하면서 동시에 불필요한 경보를 줄이는 데 도움이 된다.

사기 탐지

은행과 금융 분야에서는 사기 거래를 탐지하는 것이 매우 중요하다. 재현율이 높아(대부분의 사기 사례를 찾아내는 것)야 하지만, 정상 거래를 사기로 잘못 표시하지 않도록 정밀도 역시 중요하다. F1 점수는 사기 탐지 모델의 성능을 균형 있게 평가하는 지표를 제공한다.

스팸 필터링

이메일 필터링 시스템에서는 스팸 메일을 정확히 분류하는 동시에 중요한 정상 메일이 잘못 차단되지 않도록 하는 것이 중요하다. F1 점수는 스팸을 효과적으로 잡으면서도 정상 메시지를 과도하게 차단하지 않도록 해 사용자 신뢰를 유지하는 방식으로 스팸 필터를 최적화하는 데 도움이 된다.
또한 이러한 분류 문제를 위한 머신러닝 모델을 학습할 때, 보다 균형 잡힌 분류 성능에 기여하는 유용한 특성을 식별하는 것이 중요하다. 따라서 특성 선택 과정에서 모델에 특성을 추가하거나 제거했을 때의 영향을 평가하는 데 F1 점수를 활용할 수 있다. 아울러 여러 머신러닝 모델을 비교하는 상황에서, 한 모델은 정밀도가 높지만 재현율이 낮거나 그 반대인 경우에도 F1 점수가 중요하다.
두 지표의 조화평균을 고려함으로써 F1 점수는 한쪽 지표에 치우쳐 다른 한쪽을 희생하는 모델이 아니라, 두 지표의 균형을 최적으로 맞춘 모델을 고르는 데 도움을 준다. 또한 F1 점수는 분류 모델의 결정 임계값을 조정하는 데에도 유용하다. 분류의 기준이 되는 임계값을 조절하면 모델의 정밀도와 재현율에 영향을 줄 수 있다.

F1 점수를 사용할 때 어떤 어려움이 있을까?

F1 점수는 유용한 지표이지만, 오해하거나 잘못 적용할 여지가 있다.

클래스 불균형에 대한 무시

F1 점수는 불균형한 환경에서 정확도보다 유리하지만, 불균형 문제를 완전히 해결하지는 못한다. 데이터의 분포를 고려하지 않은 채 F1 점수에만 과도하게 의존하면 여전히 오해를 낳을 수 있다. 예를 들어, 어떤 모델이 실제 양성 5건 중 4건을 정확히 양성으로 예측해 재현율은 높지만, 실제 음성 95건 중 20건을 양성으로 잘못 예측해 정밀도가 낮다면, F1 점수는 정밀도와 재현율 사이에서 그럴듯한 균형을 시사할 수 있다. 그러나 거짓 양성의 비용(예: 불필요한 치료)이 큰 상황에서는, 이러한 모델이 실제로는 비현실적일 수 있다.

오해

F1 점수를 정밀도와 재현율의 균형이 아니라 정확도의 지표로 오해하면 모델의 효과성에 대해 잘못된 결론에 이를 수 있다.

단일 지표의 오류

모델 평가를 F1 점수 하나에만 의존하면 오해를 낳을 수 있다. 모델 성능을 종합적으로 파악하려면 다른 지표들과 함께 활용해야 한다.

균형에 대한 과도한 강조

F1 점수는 정밀도와 재현율이 동일하게 중요하다고 가정하지만, 이는 모든 비즈니스나 임상 목표와 반드시 일치하지는 않는다. 상황에 따라 두 지표 중 하나가 훨씬 더 중요할 수 있다.
극단적으로 불균형한 데이터셋에서는 다수 클래스의 압도적인 규모 때문에 F1 점수에서 재현율의 영향력이 희석될 수 있다는 점도 유의해야 한다. 실제 양성의 수가 거짓 음성과 거짓 양성에 비해 미미해지면, 모델이 소수 클래스 사례를 거의 모두 무시하거나 오분류하더라도 다수 클래스의 압도적 존재로 인해 겉보기에는 그럴듯한 F1 점수를 얻을 수 있다. 또한 극단적 불균형에서는 정밀도 역시 정보성이 떨어질 수 있다. 소수 클래스가 매우 희소할 때, 모델이 ‘안전하게’ 극히 소수만 양성으로 예측하고 그 소수 예측이 맞기만 하면, 놓친 양성 사례가 매우 많아 재현율이 낮더라도 정밀도는 높게 유지될 수 있다. 따라서 불균형 데이터셋을 다루는 모델을 평가할 때 F1 점수를 사용할 경우, 이러한 한계를 신중히 고려해야 한다.

F1 점수는 어떻게 계산하고 해석하나요?

F1 점수를 계산하려면 먼저 정밀도와 재현율을 각각 계산한 뒤, 이를 이용해 F1 점수를 구해야 한다.

F1 점수 계산하기

  1. 정밀도 계산하기: 정밀도는 실제 양성(TP)의 수를 실제 양성(TP)과 거짓 양성(FP)의 수를 합한 값으로 나눈 비율이다.
  2. 재현율 계산하기: 재현율은 실제 양성의 수를 실제 양성과 거짓 음성(FN)의 수를 합한 값으로 나눈 비율이다.
  3. F1 점수 계산하기: F1 점수는 정밀도와 재현율의 조화 평균이다.

F1 점수 해석하기:

  • F1 점수 = 1 완벽한 정밀도와 재현율.
  • F1 점수 = 0 최악의 점수로, 모델이 실제 양성을 전혀 찾아내지 못했다.
  • 0 < F1 점수 < 1: 정밀도와 재현율 사이의 균형을 나타낸다. 1에 가까울수록 균형이 더 좋다.

Python으로 F1 점수 계산하기: 단계별 가이드

이 가이드에서는 XGBoost 암 종양이 양성인지 악성인지 예측하는 분류기를 구축한다. 예측 결과는 실험 추적을 돕는 머신러닝 플랫폼인 Weights & Biases (W&B)에 기록된다. 이 플랫폼은 하이퍼파라미터, 출력, 모델 결과를 로깅하는 도구를 제공해 다양한 실험과 모델을 모니터링하고 비교하기 쉽게 해준다. 클래스 불균형이 존재하므로, 모델 평가는 F1 점수와 기타 지표를 함께 사용해 수행한다.

1. 라이브러리 임포트하기

from google.colab import drive
import os
import zipfile
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
import pandas as pd
from sklearn.model_selection import GridSearchCV
!pip install wandb
import wandb
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, ConfusionMatrixDisplay, classification_report
from wandb.xgboost import WandbCallback
drive.mount('/content/drive')

!pip install kaggle
os.environ['KAGGLE_CONFIG_DIR'] = '/content/drive/MyDrive/kaggle'

2. 데이터셋 다운로드 및 압축 해제

F1 점수의 계산과 평가 방법을 이해하기 위해 Breast Cancer Wisconsin (Diagnostic) 데이터셋을 사용한다. 이 데이터셋은 암이 양성인지 악성인지 예측하는 데 활용된다. Kaggle에서 zip 파일 형태로 제공되며, 다운로드한 후 압축을 해제해 사용한다.
!kaggle datasets download -d uciml/breast-cancer-wisconsin-data
file_path = '/content/breast-cancer-wisconsin-data.zip'

with zipfile.ZipFile(file_path, 'r') as zip_ref:
zip_ref.extractall('/content/kaggle/')

3. 데이터셋 전처리

데이터셋을 로드한 뒤, ML 모델이 예측할 레이블로 diagnosis 열을 지정한다. 의미가 없는 id 열은 제거하고, 데이터 분포를 확인하면 양성 클래스의 샘플이 더 많아 다소 불균형함을 알 수 있다.
df = pd.read_csv('/content/kaggle/data.csv')
y = df['diagnosis']
x = df.drop(columns=['diagnosis', 'id'])

df['diagnosis'].value_counts().reset_index()
출처: 작성자
다음으로 diagnosis 열을 양성은 0, 악성은 1로 인코딩한다. 이후 데이터를 StandardScaler를 사용해 정규화한다.
encoding_dict = {'B': 0, 'M': 1}
y = y.map(encoding_dict)


scaler = StandardScaler()
x = pd.DataFrame(scaler.fit_transform(x), columns=x.columns)

4. 학습/테스트 분할

features_train, features_test, target_train, target_test = train_test_split(x, y, test_size = 0.2, stratify=y, random_state = 0)

5. 머신러닝 모델 설정

XGBoost 모델을 초기화하고, 교차 검증 그리드 서치를 통해 탐색할 하이퍼파라미터 딕셔너리와 평가 지표를 지정한다. 다음으로, 모델, 평가 지표, 그리고 F1 score를 목표 지표로 사용하여 GridSearch 객체를 생성한다.
xgboost_model = XGBClassifier(objective='binary:logistic', random_state=0)


cv_hyperparameters = {'max_depth': [3, 5],
'min_child_weight': [3, 5],
'learning_rate': [0.001, 0.1, 0.2],
'n_estimators': [5, 10, 15],
'subsample': [0.7]
}


evaluation_metrics_dict = {'accuracy', 'precision', 'recall', 'f1'}


xgboost_cv = GridSearchCV(xgboost_model, cv_hyperparameters, scoring=evaluation_metrics_dict, cv=5, refit='f1')

6. 머신러닝 모델 학습

이제 모델을 학습하고, 그리드서치에서 찾은 최적 하이퍼파라미터를 손쉬운 평가와 분석을 위해 W&B에 기록한다.
xgboost_cv.fit(features_train, target_train, callbacks=[WandbCallback(log_model=True)])

wandb.log({"best_params": xgboost_cv.best_params_, "best_score": xgboost_cv.best_score_})

cv_results_df = pd.DataFrame(xgboost_cv.cv_results_)
wandb.log({"cv_results": wandb.Table(dataframe=cv_results_df)})
아래 W&B에 기록된 결과는 그리드 서치에서 선택된 최적 하이퍼파라미터를 보여 주며, F1 score 93%로 가장 높은 성능을 달성했다.
출처: 작성자
또한 특성 중요도도 아래와 같이 기록되어 시각화되었다. "concave points_mean", "perimeter_worst", "radius_worst"와 같은 특성은 막대가 더 길게 나타나 모델의 예측에 가장 큰 영향을 미치는 것으로 확인된다. 중요도는 F1 score를 사용해 측정했으며, 이를 통해 어떤 특성이 모델의 예측을 주도하는지 파악할 수 있어 해석 가능성이 높아지고, 나아가 특성 선택과 특성 엔지니어링에 참고할 수 있다.
출처: 작성자

7. 머신러닝 모델 테스트

테스트 세트에 대한 예측값을 산출하고, 결과 지표를 W&B에 기록한다. 초기 데이터가 불균형했으므로 더 정확한 평가를 위해 다른 지표들도 함께 기록하는 것이 중요하다. 또한 모든 결과 점수가 90%를 상회하므로, 이 모델은 각 클래스를 정확하게 예측한다.
target_predictions = xgboost_cv.predict(features_test)


accuracy_score = accuracy_score(target_test, target_predictions)
wandb.log({"Test accuracy": accuracy_score})


precision_score = precision_score(target_test, target_predictions)
wandb.log({"Test Precision": precision_score})


recall_score = recall_score(target_test, target_predictions)
wandb.log({"Test Recall": recall_score})


f1_score = f1_score(target_test, target_predictions)
wandb.log({"Test F1 Score": f1_score})


xgboost_confusion_matrix = confusion_matrix(target_test, target_predictions)
confusion_matrix_display = ConfusionMatrixDisplay(confusion_matrix=xgboost_confusion_matrix,
display_labels=xgboost_cv.classes_)

또한 혼동 행렬을 시각화하여 W&B에 기록했으며, 그 결과 정밀도와 재현율이 균형을 이루는 것으로 나타났다. 따라서 이 모델은 예측이 정확하다.
fig, ax = plt.subplots()
confusion_matrix_display.plot(ax=ax)
plt.grid(False)
wandb.log({"confusion_matrix": wandb.Image(fig)})
plt.close(fig)
출처: 작성자

모델의 F1 점수를 어떻게 높일 수 있을까요?

F1 점수를 이해하고 구현 과정을 살펴봤다면, 이제 모델의 F1 점수를 높이는 데 도움이 되는 전략도 함께 이해하는 것이 중요합니다. 이를 위해 활용할 수 있는 몇 가지 기법을 살펴보겠습니다:
  • 재표본화 기법
다수 클래스의 규모를 줄이기 위해 언더샘플링을 적용하거나, 소수 클래스의 규모를 늘리기 위해 오버샘플링을 적용하세요. 또는 SMOTE(Synthetic Minority Over-sampling Technique)와 같은 합성 데이터 생성 기법을 사용해 더 균형 잡힌 데이터셋을 만드세요.
  • 데이터 증강
회전, 뒤집기, 크롭과 같은 기법(이미지의 경우)이나 문장 바꾸기(텍스트의 경우) 등을 활용해 소수 클래스를 증강하여 학습 데이터의 다양성과 양을 늘리세요.
  • 가중치가 적용된 클래스
학습 시 소수 클래스에 더 높은 가중치를 부여하세요. 많은 머신러닝 알고리즘은 클래스 가중치를 설정할 수 있도록 지원하며, 이를 통해 모델의 초점을 과소대표된 클래스에 맞추도록 조정할 수 있습니다.
  • 임계값 조정
기본적으로 많은 분류기는 클래스 구분을 위해 0.5의 결정 임계값을 사용합니다. 이 임계값을 조정하면 정밀도와 재현율의 균형을 맞출 수 있어 F1 점수를 향상시키는 데 도움이 됩니다. 필요에 따라 재현율을 높이기 위해 임계값을 낮추거나, 정밀도를 높이기 위해 임계값을 높일 수 있습니다.
  • 비용 민감 학습
애플리케이션 요구 사항에 따라 거짓 음성을 거짓 양성보다 더 크게(또는 그 반대로) 패널티를 주는 비용 함수를 구현하고, 이 비용에 기반해 결정 임계값을 최적화하세요.
  • 앙상블 방법
여러 모델의 예측을 결합해 전체 성능을 향상시키세요. 배깅, 부스팅, 스태킹과 같은 기법은 모델의 견고성을 높이고 F1 점수를 개선하는 데 도움이 됩니다.
  • 하이퍼파라미터 튜닝
그리드 서치, 랜덤 서치, 또는 베이즈 최적화를 통해 모델의 하이퍼파라미터를 최적화하여 가장 높은 F1 점수를 내는 조합을 찾으세요.
F1 점수는 모델 평가에서 중요한 지표이지만, 더 넓은 평가 전략의 한 구성 요소로 사용해야 합니다. 오직 F1 점수만에 의존해 모델을 평가하면 모델 성능에 대한 이해가 불완전해질 수 있습니다. 특히 위험이 큰 도메인에서는 모델이 특정 예측을 어떻게, 그리고 왜 내렸는지 이해하는 것이 매우 중요합니다. 평가는 수치적 성능 지표를 넘어, 해석 가능성의 수준과 이해관계자에게 의사결정을 설명할 수 있는 능력까지 포함해야 합니다. 또한 프로덕션 환경에서 모델의 실현 가능성을 평가하기 위해 계산 비용, 지연 시간, 확장성도 반드시 고려해야 합니다. 이러한 요소들은 머신러닝 솔루션의 전반적인 유용성과 지속 가능성에 직접적인 영향을 미칩니다.

F1 점수의 대안이나 예외가 있을까요?

F1 점수에 대한 흔한 오해는 점수가 높으면 좋은 모델이라는 것입니다. 그러나 이는 항상 사실이 아니며, 특히 심각한 클래스 불균형이 있을 때는 더더욱 그렇습니다. 높은 점수는 단지 다수 클래스에서만 모델이 잘 동작하고 있음을 의미할 수 있습니다. 또한 F1 점수는 계산에서 진음성(true negative)을 고려하지 않는데, 이는 음성 예측이 과업에서 결정적으로 중요한 맥락에서는 큰 누락이 될 수 있습니다. 이러한 한계를 보완하기 위해, 더 나은 평가를 위해 F1 점수와 함께 다음과 같은 대체 지표들을 병행해 계산할 수 있습니다:
  • 매튜스 상관 계수 (MCC)
MCC는 참양성, 거짓양성, 참음성, 거짓음성을 모두 고려하는 보다 포괄적인 지표로, 클래스 크기가 매우 다르더라도 사용할 수 있는 균형 잡힌 측도로 널리 인정받습니다. 값의 범위는 -1에서 +1 사이이며, +1은 완벽한 예측, 0은 무작위 예측과 동등한 수준, -1은 예측과 관측이 완전히 불일치함을 의미합니다. 특히 심각한 클래스 불균형이 있는 데이터셋에 적합합니다. MCC는 다음과 같이 계산할 수 있습니다:
출처: 작성자
여기서 TP = 참양성, TN = 참음성, FP = 거짓양성, FN = 거짓음성입니다.
  • ROC 곡선 아래 면적(AUC-ROC)
이 지표는 모델이 클래스들을 구분하는 능력을 평가합니다. ROC 곡선은 다양한 임계값에서 진양성 비율을 거짓양성 비율에 대해 도표화합니다. AUC-ROC 값은 0에서 1 사이이며, 1은 완벽한 모델을, 0.5는 무작위 모델을 의미합니다. 특히 불균형 데이터셋에서 모델을 평가할 때 유용합니다. 이 지표는 가능한 모든 분류 임계값 전반에서 모델의 성능을 평가하려는 이진 분류 문제에 이상적이며, 여러 모델의 성능을 비교해야 할 때에도 적합합니다. 아래 AUC-ROC 그래프는 TP를 FP 비율에 대해 나타낸 것으로, 완벽한 분류기는 TP 비율이 1이고 FP 비율이 0입니다.
출처: 매스웍스

결론

결론적으로, F1 점수를 이해하는 것은 특히 불균형 데이터셋을 다룰 때 분류 모델을 효과적으로 평가하는 데 필수적입니다. 본 글에서는 이 지표의 계산 방법뿐만 아니라 적용과 해석 과정에서 흔히 발생하는 오해를 어떻게 식별할지까지 다뤘습니다. 또한 Python으로 이 지표를 구현하는 방법을 실습 예제와 함께 보여 주고, 모델의 최종 F1 점수를 향상시키는 데 도움이 되는 요인들을 정리했습니다. 적절한 지표를 신중하게 선택하고 적용함으로써 실무자는 모델 평가를 고도화할 수 있으며, 이는 더 신뢰할 수 있고 견고한 머신러닝 솔루션으로 이어집니다.

이 글은 AI 번역본입니다. 오역 가능성이 있다면 댓글로 알려주세요. 원문 보고서 링크는 다음과 같습니다: 원문 보고서 보기