Skip to main content
Summary

이 장에서 배울 것

지금까지 우리는 모델을 만들고, 여러 평가 지표로 성능을 비교했다. 하지만 실제 프로젝트에서는 점수 하나만 보고 모델을 믿으면 안 된다. 정확도나 F1 점수가 높아도 특정 상황에서 계속 틀릴 수 있고, 특정 집단에 불리하게 작동할 수도 있다.

이 장에서는 다음을 배운다.

  • 모델이 틀린 사례를 모아 공통 패턴을 찾는 방법

  • 혼동 행렬을 오류 유형 분석 도구로 사용하는 방법

  • 성별, 연령대, 지역처럼 민감할 수 있는 속성별 성능 차이를 확인하는 방법

  • 표본 수가 작은 집단, 대리 변수, 편향된 데이터 수집의 위험

  • 오류 분석 리포트에 무엇을 적어야 하는지

목표는 모델을 더 똑똑하게 만드는 것만이 아니다. 믿고 사용할 수 있는 모델인지 검토하는 습관을 만드는 것이다.

오류 분석과 공정성 점검

왜 이 주제가 중요한가

모델 평가표에 이런 결과가 나왔다고 해 보자.

  • 정확도: 92%

  • F1 점수: 0.88

  • 교차검증 평균 점수: 안정적

겉보기에는 좋은 모델이다. 하지만 병원 예약 취소를 예측하는 모델이 노년층 환자에게서 유독 많이 틀린다면 어떨까. 대출 심사 보조 모델이 특정 지역 사람들에게 불리한 판단을 반복한다면 어떨까. 고객 이탈 예측 모델이 신규 고객에게는 거의 맞지 않는다면 어떨까.

이런 문제는 전체 평균 점수만 보면 잘 드러나지 않는다. 평균은 여러 집단의 차이를 덮어버릴 수 있다. 그래서 모델을 만든 뒤에는 반드시 질문해야 한다.

  • 어떤 사례에서 틀렸는가?

  • 같은 유형의 오류가 반복되는가?

  • 데이터 자체에 문제가 있었는가?

  • 모델이 특정 집단에 더 불리하게 작동하는가?

  • 이 모델을 실제 의사결정에 사용해도 되는가?

좋은 머신러닝 실무자는 모델을 훈련하는 사람에서 멈추지 않는다. 모델의 실패를 관찰하고, 그 실패가 누구에게 영향을 주는지 확인한다.

핵심 개념 설명

오류 분석은 틀린 사례를 읽는 일이다

오류 분석은 모델이 틀린 데이터를 모아 왜 틀렸는지 살펴보는 과정이다. 단순히 오답 개수를 세는 것이 아니다. 오답의 공통점을 찾고, 개선 방향을 정하는 일이다.

기본 절차는 다음과 같다.

  1. 테스트 데이터에서 예측값을 만든다.

  2. 실제 정답과 예측값이 다른 행을 모은다.

  3. 거짓 양성, 거짓 음성처럼 오류 유형을 나눈다.

  4. 틀린 사례의 특징, 정답, 예측값, 예측 확률을 함께 본다.

  5. 공통 패턴을 찾는다.

  6. 데이터 문제, 모델 한계, 문제 정의 오류 중 어디에 가까운지 판단한다.

  7. 개선 아이디어를 기록한다.

예를 들어 스팸 메일 분류 모델이 있다고 하자. 정상 메일을 스팸으로 잘못 분류한 경우는 거짓 양성이다. 사용자는 중요한 메일을 놓칠 수 있다. 반대로 스팸 메일을 정상으로 잘못 분류한 경우는 거짓 음성이다. 사용자는 스팸을 보게 된다. 둘 다 오류지만 영향은 다르다.

그래서 오류 분석에서는 단순히 틀렸다는 사실보다 어떤 방향으로 틀렸는지가 중요하다.

데이터 문제, 모델 한계, 문제 정의 오류를 구분한다

모델이 틀렸다고 해서 항상 모델만 바꾸면 되는 것은 아니다. 오류의 원인은 크게 세 가지로 나눌 수 있다.

첫째, 데이터 문제다. 정답 라벨이 잘못 붙었거나, 누락값이 많거나, 오래된 데이터일 수 있다. 예를 들어 이미 이탈한 고객인데 데이터에는 유지 고객으로 기록되어 있다면 모델은 잘못 배운다.

둘째, 모델 한계다. 현재 모델이 데이터의 복잡한 패턴을 충분히 표현하지 못할 수 있다. 선형 모델로는 비선형 관계를 잡기 어렵고, kNN은 특징 스케일에 민감하다. 이 경우에는 전처리나 모델 변경이 도움이 될 수 있다.

셋째, 문제 정의 오류다. 애초에 예측하려는 정답이 모호하거나 실제 목표와 맞지 않을 수 있다. 예를 들어 좋은 고객을 예측한다고 해 놓고 실제로는 최근 구매 여부만 정답으로 삼았다면, 장기적으로 가치 있는 고객을 놓칠 수 있다.

오류 분석의 핵심은 이 세 가지를 구분하는 것이다. 원인을 잘못 판단하면 개선도 엉뚱한 방향으로 간다.

혼동 행렬은 오류 지도를 보여 준다

평가 지표와 교차검증에서 배운 혼동 행렬을 다시 떠올려 보자. 혼동 행렬은 실제 클래스와 예측 클래스를 표로 비교한다.

이 장에서는 혼동 행렬을 점수 계산의 중간 과정이 아니라 오류 지도로 사용한다.

이진 분류에서는 네 가지 경우가 있다.

  • 참 양성: 실제 양성을 양성으로 맞힘

  • 참 음성: 실제 음성을 음성으로 맞힘

  • 거짓 양성: 실제 음성을 양성으로 잘못 예측

  • 거짓 음성: 실제 양성을 음성으로 잘못 예측

의료 검사 모델에서는 거짓 음성이 치명적일 수 있다. 실제 질병이 있는데 없다고 판단하기 때문이다. 반대로 스팸 필터에서는 거짓 양성이 더 불편할 수 있다. 정상 메일이 스팸함으로 들어가기 때문이다.

다중 분류에서도 같은 원리가 적용된다. 숫자 3을 8로 자주 착각하는지, 고양이를 강아지로 자주 착각하는지, 특정 상품군을 계속 다른 상품군으로 분류하는지 확인할 수 있다. 혼동 행렬은 모델이 헷갈리는 경계를 보여 준다.

공정성 점검은 집단별 성능을 비교하는 일에서 시작한다

공정성은 매우 넓은 주제다. 법, 윤리, 사회적 맥락까지 함께 봐야 한다. 이 책에서는 입문 단계에서 꼭 필요한 기본 점검에 집중한다.

가장 먼저 할 일은 집단별 성능을 비교하는 것이다. 성별, 연령대, 지역, 장애 여부, 국적, 소득 수준처럼 민감할 수 있는 속성이 있다면 전체 성능뿐 아니라 집단별 성능을 확인해야 한다.

확인할 수 있는 항목은 다음과 같다.

  • 집단별 데이터 개수

  • 집단별 정확도

  • 집단별 정밀도

  • 집단별 재현율

  • 집단별 거짓 양성 비율

  • 집단별 거짓 음성 비율

  • 집단별 양성 예측 비율

여기서 중요한 점은 모든 수치가 완전히 같아야 공정하다는 뜻은 아니라는 것이다. 문제의 맥락에 따라 중요한 지표가 다르다. 채용 추천 모델에서는 특정 집단의 탈락 비율이 중요할 수 있고, 질병 탐지 모델에서는 집단별 재현율 차이가 더 중요할 수 있다.

공정성 점검은 정답을 자동으로 주지 않는다. 대신 위험한 질문을 놓치지 않게 해 준다.

쉬운 비유 또는 사례

모델을 시험 보는 학생에 비유해 보자. 평균 점수가 90점인 학생이 있다. 훌륭해 보인다. 그런데 답안지를 자세히 보니 문법 문제는 거의 다 맞히지만 독해 문제는 계속 틀린다. 또 짧은 지문은 잘 풀지만 긴 지문은 약하다.

이때 우리는 단순히 공부를 더 하라고 말하지 않는다. 어떤 유형을 틀리는지 분석한다. 독해 연습을 늘릴지, 긴 지문을 읽는 전략을 바꿀지 정한다.

머신러닝 모델도 마찬가지다. 전체 점수는 평균 성적표다. 오류 분석은 틀린 문제 풀이 노트다. 공정성 점검은 특정 유형의 학생이나 특정 조건에서 시험이 불리하게 작동하지 않았는지 확인하는 과정이다.

예를 들어 음성 인식 모델이 조용한 환경에서는 잘 작동하지만 시끄러운 환경에서는 자주 틀릴 수 있다. 또는 특정 억양의 사용자에게서 인식률이 낮을 수 있다. 전체 정확도가 높아도 실제 사용자 경험은 집단마다 다를 수 있다.

직접 해보는 실습

이번 실습에서는 간단한 분류 데이터를 만들고, 오답 사례와 집단별 성능을 확인한다. 실제 프로젝트에서는 성별, 연령대, 지역 같은 속성을 사용할 수 있지만, 여기서는 재현 가능한 연습을 위해 인공 집단 변수를 만든다.

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix

X, y = make_classification(
    n_samples=1000,
    n_features=6,
    n_informative=4,
    n_redundant=0,
    weights=[0.7, 0.3],
    random_state=42
)

rng = np.random.RandomState(42)
group = np.where(rng.rand(len(y)) < 0.7, 'A', 'B')

X_train, X_test, y_train, y_test, g_train, g_test = train_test_split(
    X, y, group,
    test_size=0.25,
    stratify=y,
    random_state=42
)

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

pred = model.predict(X_test)
proba = model.predict_proba(X_test)[:, 1]

result = pd.DataFrame(X_test, columns=[f'x{i}' for i in range(X_test.shape[1])])
result['y_true'] = y_test
result['y_pred'] = pred
result['proba'] = proba
result['group'] = g_test
result['error'] = result['y_true'] != result['y_pred']

print('전체 정확도:', accuracy_score(y_test, pred))
print(confusion_matrix(y_test, pred))

먼저 전체 성능과 혼동 행렬을 확인한다. 그다음 틀린 사례만 모아 본다.

errors = result[result['error']].copy()
print(errors[['y_true', 'y_pred', 'proba', 'group']].head(10))

false_positive = result[(result['y_true'] == 0) & (result['y_pred'] == 1)]
false_negative = result[(result['y_true'] == 1) & (result['y_pred'] == 0)]

print('거짓 양성 개수:', len(false_positive))
print('거짓 음성 개수:', len(false_negative))

이제 집단별 성능을 비교한다.

for g, part in result.groupby('group'):
    print('n집단:', g)
    print('표본 수:', len(part))
    print('정확도:', accuracy_score(part['y_true'], part['y_pred']))
    print('정밀도:', precision_score(part['y_true'], part['y_pred'], zero_division=0))
    print('재현율:', recall_score(part['y_true'], part['y_pred'], zero_division=0))
    print('혼동 행렬:')
    print(confusion_matrix(part['y_true'], part['y_pred']))

결과를 볼 때는 다음 질문을 적어 본다.

  • 어느 집단의 표본 수가 더 작은가?

  • 어느 집단에서 재현율이 낮은가?

  • 거짓 양성이 많은 집단과 거짓 음성이 많은 집단이 다른가?

  • 오류가 특정 예측 확률 구간에 몰려 있는가?

  • 이 차이가 실제 문제에서 어떤 피해로 이어질 수 있는가?

마지막으로 간단한 오류 분석 리포트를 작성한다.

1. 모델과 데이터
- 사용한 모델:
- 사용한 데이터:
- 예측하려는 정답:

2. 전체 성능
- 정확도:
- 정밀도:
- 재현율:
- 혼동 행렬 요약:

3. 주요 오류 패턴
- 거짓 양성에서 자주 보이는 특징:
- 거짓 음성에서 자주 보이는 특징:

4. 집단별 점검
- 성능이 낮은 집단:
- 표본 수가 작은 집단:
- 추가 확인이 필요한 지표:

5. 개선 아이디어
- 데이터 추가:
- 특징 수정:
- 지표 변경:
- 모델 변경:

이 리포트는 길 필요가 없다. 중요한 것은 틀린 이유를 추측으로 끝내지 않고, 근거와 함께 기록하는 것이다.

흔한 실수와 오류 분석

첫 번째 실수는 전체 성능만 보고 끝내는 것이다. 전체 정확도가 높아도 소수 클래스나 특정 집단에서 성능이 낮을 수 있다. 특히 클래스 불균형이 있는 문제에서는 더 조심해야 한다.

두 번째 실수는 표본 수가 작은 집단의 점수를 과하게 해석하는 것이다. 어떤 집단의 테스트 표본이 8개뿐인데 정확도가 100%라고 해서 그 모델이 그 집단에 완벽하다고 말할 수 없다. 반대로 8개 중 4개를 틀렸다고 해서 반드시 모델이 나쁘다고 단정할 수도 없다. 표본 수가 작으면 점수가 크게 흔들린다.

세 번째 실수는 민감 속성을 모델에서 빼면 공정해진다고 생각하는 것이다. 성별을 제거해도 직업, 구매 시간대, 거주 지역 같은 변수가 성별의 대리 변수처럼 작동할 수 있다. 대리 변수란 직접적인 민감 속성은 아니지만 그 속성과 강하게 연결되어 비슷한 역할을 하는 변수를 말한다.

네 번째 실수는 과거 데이터를 그대로 정답으로 믿는 것이다. 과거의 채용, 대출, 진료, 단속 데이터에는 이미 사회적 편향이 들어 있을 수 있다. 모델은 데이터를 통해 과거의 패턴을 배운다. 과거가 공정하지 않았다면 모델도 그 불공정을 따라 배울 수 있다.

다섯 번째 실수는 오류를 발견한 뒤 바로 복잡한 모델로 바꾸는 것이다. 먼저 라벨 오류, 누락값, 표본 부족, 문제 정의를 확인해야 한다. 데이터가 잘못되었는데 모델만 바꾸면 성능이 일시적으로 좋아 보여도 실제 문제는 남는다.

요약

오류 분석은 모델이 틀린 사례를 모아 반복되는 패턴을 찾는 과정이다. 이때 오류를 데이터 문제, 모델 한계, 문제 정의 오류로 나누어 생각하면 개선 방향을 더 정확히 잡을 수 있다.

혼동 행렬은 전체 성능을 계산하는 도구를 넘어, 어떤 클래스에서 어떤 방향의 오류가 많이 발생하는지 보여 주는 지도다. 거짓 양성과 거짓 음성은 문제에 따라 비용이 다르므로 따로 살펴봐야 한다.

공정성 점검은 집단별 성능 차이를 확인하는 일에서 시작한다. 민감할 수 있는 속성별로 정확도, 정밀도, 재현율, 오류 유형을 비교한다. 다만 표본 수가 작은 집단의 점수는 조심해서 해석해야 하며, 대리 변수와 편향된 데이터 수집도 함께 살펴야 한다.

좋은 모델은 점수만 높은 모델이 아니다. 어디서 틀리는지 설명할 수 있고, 누구에게 더 자주 틀리는지 점검된 모델이다.

퀴즈

  1. 오류 분석에서 틀린 사례를 거짓 양성과 거짓 음성으로 나누는 이유는 무엇인가?

  2. 전체 정확도가 높아도 특정 집단에서 문제가 생길 수 있는 이유를 설명해 보라.

  3. 데이터 문제, 모델 한계, 문제 정의 오류의 예를 각각 하나씩 들어 보라.

  4. 민감 속성을 모델 입력에서 제거해도 공정성 문제가 남을 수 있는 이유는 무엇인가?

  5. 표본 수가 작은 집단의 성능을 해석할 때 조심해야 하는 이유는 무엇인가?

체크리스트

  • 테스트 데이터에서 오답 사례를 따로 모을 수 있다.

  • 거짓 양성과 거짓 음성을 구분해 설명할 수 있다.

  • 혼동 행렬을 보고 어떤 오류가 많은지 말할 수 있다.

  • 오류 원인을 데이터 문제, 모델 한계, 문제 정의 오류로 나누어 생각할 수 있다.

  • 집단별 성능을 비교해 기본적인 공정성 점검을 할 수 있다.

  • 표본 수가 작은 집단의 점수를 조심해서 해석할 수 있다.

  • 대리 변수와 편향된 데이터 수집의 위험을 설명할 수 있다.

  • 오류 분석 리포트에 개선 아이디어를 정리할 수 있다.

다음 장 연결

다음 장에서는 지금까지 배운 내용을 하나의 작은 프로젝트로 연결한다. 데이터셋을 정하고, 문제를 정의하고, 훈련 데이터와 테스트 데이터를 나누고, 여러 모델을 비교한다. 그리고 이번 장에서 배운 오류 분석과 공정성 점검을 포함해 최종 리포트를 작성한다.

목표는 단순히 가장 높은 점수를 얻는 것이 아니다. 문제 정의부터 모델 평가, 오류 분석, 개선 제안까지 하나의 흐름으로 완성하는 것이다.

책 목록

AI 교육 2권 : 머신러닝 기초: 데이터로 배우고 검증하는 첫 모델

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기