본문 바로가기
AI/Machine-Learning

[sklearn] 모델 성능 평가(정확도, f1)

by Wikinist 2023. 8. 30.

"sklearn"은 파이썬의 머신 러닝 라이브러리인 scikit-learn에서 제공하는 모듈입니다. 이 모듈을 사용하여 다양한 머신 러닝 모델의 성능을 평가하고 분석할 수 있습니다. 여기서는 "accuracy_score", "f1_score", 그리고 "confusion_matrix"에 대해 각각 설명해 드리겠습니다.

accuracy_score

이 메서드는 예측 결과와 실제 타겟 값 사이의 정확도를 계산합니다. 정확도는 전체 샘플 중 올바르게 예측한 샘플의 비율로 계산됩니다. 이는 간단하게 (정확한 예측 수) / (전체 샘플 수)로 계산됩니다. 하지만 클래스 불균형 문제가 있는 데이터셋에서는 정확도만으로 모델의 성능을 평가하는 것이 충분하지 않을 수 있습니다.

f1_score

F1 스코어는 정밀도(Precision)와 재현율(Recall)의 조화 평균입니다. 이는 클래스 불균형 문제가 있는 데이터셋에서 정확한 성능 평가 지표입니다. F1 스코어는 양성 클래스에 대한 정확도와 실제 양성 클래스 중에서 얼마나 많은 샘플을 제대로 분류했는지를 고려합니다. 높은 F1 스코어는 정확도와 재현율을 모두 고려한 모델을 나타냅니다. F1 스코어는 다음과 같이 계산됩니다: 2 * (정밀도 * 재현율) / (정밀도 + 재현율)

정밀도(Precision)와 재현율(Recall)은 머신 러닝에서 중요한 평가 지표로, 모델의 성능을 더 잘 이해하고 분석할 수 있게 해주는 지표입니다. 이 두 지표는 이진 분류에서 주로 사용되며, 모델이 양성(Positive) 클래스를 얼마나 잘 예측하는지에 관련된 정보를 제공합니다.

정밀도 (Precision)

정밀도는 모델이 양성으로 예측한 샘플 중 실제로 양성인 비율을 나타냅니다. 즉, 모델이 양성이라고 분류한 샘플 중에서 실제로 양성인 샘플의 비율입니다. 정밀도는 거짓 양성(False Positive, FP)의 수를 최소화하는 것을 목표로 합니다.

정밀도 = TP / (TP + FP)

TP: 참 양성(True Positive) - 실제로 양성인데 정확하게 양성으로 예측한 경우의 수
FP: 거짓 양성(False Positive) - 실제로는 음성인데 양성으로 잘못 예측한 경우의 수
예를 들어, 스팸 메일 필터링 모델의 정밀도가 높다면, 스팸으로 분류된 메일 중에서 실제 스팸 메일의 비율이 높다는 뜻입니다. 즉, 모델이 스팸이라고 분류한 메일 중에서 실제로 스팸인 메일이 많은 것을 의미합니다.

재현율 (Recall)

재현율은 실제로 양성인 샘플 중에서 모델이 양성으로 정확하게 예측한 비율을 나타냅니다. 모델이 실제 양성 샘플을 놓치지 않도록 하는 것을 목표로 합니다.

재현율 = TP / (TP + FN)

TP: 참 양성(True Positive) - 실제로 양성인데 정확하게 양성으로 예측한 경우의 수
FN: 거짓 음성(False Negative) - 실제로는 양성인데 음성으로 잘못 예측한 경우의 수
예를 들어, 의료 진단 모델의 재현율이 높다면, 실제 질병을 갖고 있는 환자 중에서 제대로 질병을 감지한 비율이 높다는 것을 의미합니다. 모델이 가능한 한 많은 실제 양성 샘플을 찾아내는 것이 목표입니다.

정밀도와 재현율은 서로 트레이드오프 관계에 있습니다. 한 지표를 높이려면 다른 지표가 낮아질 수 있으며, 이를 조절하면서 모델의 성능을 평가하고 개선하는 것이 중요합니다.

정밀도가 중요한 상황

상황: 신용카드 부정 거래 감지 모델을 고려해 봅시다. 정상 거래를 부정 거래로 잘못 분류하는 경우의 문제를 고려해야 합니다.

정밀도를 강조하는 경우, 거짓 양성(FP)를 최소화하여 실제로 정상인 거래를 부정 거래로 잘못 분류하는 경우를 줄이려고 할 것입니다.
이로 인해 신용카드 사용자들은 잘못된 이유로 거부당할 가능성이 줄어들며, 카드 회사는 고객들에게 불편을 최소화할 수 있습니다.

재현율이 중요한 상황

상황: 암 감지 모델을 생각해 봅시다. 실제 환자들을 놓치지 않고 감지하는 것이 중요한 경우입니다.

재현율을 강조하는 경우, 실제로 암인 환자를 놓치지 않도록 하는 것이 목표입니다.
암 환자를 최대한 많이 찾아내기 위해 모델을 조정하며, 거짓 음성(FN)를 최소화합니다.
이렇게 함으로써 초기 단계에서 암 환자들을 조기에 발견하여 치료 기회를 높일 수 있습니다.
정밀도와 재현율은 각각 다른 문제와 상황에서 중요한 역할을 합니다. 어떤 지표를 강조하느냐에 따라 모델을 조정하고 최적의 결과를 얻는 것이 중요합니다. 어떤 상황에서도 완벽한 결과를 얻기 어렵기 때문에, 모델의 목표와 실제 상황에 맞게 적절한 균형을 찾는 것이 필요합니다.

confusion_matrix

혼동 행렬은 모델의 예측 결과와 실제 타겟 값 사이의 관계를 나타내는 행렬입니다. 이 행렬은 주로 이진 분류 문제에서 사용됩니다. 혼동 행렬은 다음과 같은 네 가지 항목을 포함합니다:

참 양성(True Positive, TP): 실제로 양성인데 정확하게 양성으로 예측한 경우
거짓 양성(False Positive, FP): 실제로는 음성인데 양성으로 예측한 경우
참 음성(True Negative, TN): 실제로 음성인데 정확하게 음성으로 예측한 경우
거짓 음성(False Negative, FN): 실제로는 양성인데 음성으로 예측한 경우
혼동 행렬을 통해 모델이 어떤 종류의 오류를 얼마나 만들었는지를 파악할 수 있습니다. 이 정보는 모델의 성능을 평가하고 개선하기 위한 힌트를 제공합니다.

이러한 메서드들은 모델의 성능 평가와 분석에 유용하게 사용됩니다. 각각의 지표들을 조합하여 모델의 성능을 더 정확하게 평가하고 문제점을 해결할 수 있습니다.

예제

accuracy_score 예제

from sklearn.metrics import accuracy_score

# 실제 타겟 값
true_labels = [1, 0, 1, 1, 0, 1, 0, 0]

# 모델의 예측 결과
predicted_labels = [1, 0, 1, 1, 1, 0, 1, 0]

# 정확도 계산
accuracy = accuracy_score(true_labels, predicted_labels)
print("Accuracy:", accuracy)

f1_score 예제

f1_score 함수는 다중 클래스 분류 문제와 이진 분류 문제 모두에 사용될 수 있습니다. 그러나 다중 클래스 문제의 경우, average 매개변수를 적절한 값으로 설정해야 합니다.

에러 메시지에서 언급된대로 average 매개변수는 다음과 같은 값들 중 하나로 설정할 수 있습니다: [None, 'micro', 'macro', 'weighted'].

None: 클래스별 F1 스코어를 반환합니다. 다중 클래스 문제에서는 사용하지 않는 것이 좋습니다.
'micro': 전체 예측 및 실제 값에 대해 F1 스코어를 계산합니다.
'macro': 각 클래스의 F1 스코어를 평균하여 계산합니다. 클래스당 샘플 수를 고려하지 않습니다.
'weighted': 클래스당 샘플 수를 고려하여 가중 평균을 계산합니다.
에러가 발생하는 경우, 다중 클래스 분류 문제를 다루고 있다면 average 매개변수를 'micro', 'macro', 'weighted' 중 하나로 설정해야 합니다. 만약 이진 분류 문제를 다루고 있다면 average 매개변수를 삭제하거나 None으로 설정해야 합니다.

다음은 이해를 돕기 위한 예제입니다:

다중 클래스 분류 문제의 경우

from sklearn.metrics import f1_score

# 실제 타겟과 예측 결과
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 2, 2]

# 'macro' 평균 F1 스코어 계산
macro_f1 = f1_score(y_true, y_pred, average='macro')
print("Macro F1 Score:", macro_f1)

이진 분류 문제의 경우

from sklearn.metrics import f1_score

# 실제 타겟과 예측 결과
y_true = [0, 1, 0, 0, 1, 1]
y_pred = [0, 1, 0, 0, 0, 1]

# 이진 분류에서는 'average' 설정 필요 없음
binary_f1 = f1_score(y_true, y_pred)
print("Binary F1 Score:", binary_f1)
 
Micro 평균 (Micro Average)

Micro 평균은 전체 예측 및 실제 값에 대해 F1 스코어를 계산하는 방법입니다.
각 클래스의 참 긍정, 거짓 긍정, 거짓 부정의 총 수를 계산하여 전체적으로 정확도와 재현율을 계산합니다.
모든 클래스의 결과를 종합하여 단일 F1 스코어로 표현하며, 데이터의 불균형이 있을 때 성능 평가에 유용합니다.
클래스 크기가 다르더라도 각 예측이 동일한 가중치로 반영됩니다.

Macro 평균 (Macro Average)

Macro 평균은 각 클래스의 F1 스코어를 개별적으로 계산하고 그 평균을 내는 방법입니다.
각 클래스의 F1 스코어를 계산할 때 클래스당 샘플 수를 고려하지 않습니다. 따라서 클래스의 불균형이 고려되지 않습니다.
모든 클래스가 동일한 중요도를 가지는 것으로 가정하며, 데이터의 불균형이 심할 경우 문제가 발생할 수 있습니다.

Weighted 평균 (Weighted Average)

Weighted 평균은 클래스당 샘플 수를 고려하여 가중 평균을 계산하는 방법입니다.
각 클래스의 F1 스코어를 클래스의 샘플 수로 가중 평균하여 계산합니다.
클래스별 샘플 수가 다를 때 사용하면 유용하며, 클래스의 상대적인 중요도를 고려할 수 있습니다.
요약하자면, Micro, Macro, 그리고 Weighted 평균은 다중 클래스 분류 문제에서 클래스간의 F1 스코어를 어떻게 계산할지에 대한 다른 접근 방식입니다. 각 평균 방식은 데이터의 특성과 목표에 따라 선택되어야 하며, 불균형한 클래스 분포나 중요도를 고려할 때 각각의 장단점이 있을 수 있습니다.

confusion_matrix 예제

from sklearn.metrics import confusion_matrix

# 실제 타겟 값
true_labels = [1, 0, 1, 1, 0, 1, 0, 0]

# 모델의 예측 결과
predicted_labels = [1, 0, 1, 1, 1, 0, 1, 0]

# 혼동 행렬 계산
conf_matrix = confusion_matrix(true_labels, predicted_labels)
print("Confusion Matrix:\n", conf_matrix)

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

[sklearn] K-Nearest Neighbors  (0) 2023.08.30
ROC curve  (0) 2023.08.30
[sklearn] GridSearchCV - 파라미터 튜닝  (0) 2023.08.30
L1 규제와 L2 규제  (0) 2023.08.30
[sklearn] LogisticRegression  (0) 2023.08.29