[AI] 오차 행렬을 통한 오류 분석

2026. 3. 2. 21:06·AI/Machine Learning
반응형

들어가며

이번 글에서는 오차행렬을 조금 더 자세히 들여다 보아서

분류기의 성능 향상 방안에 관해 어떤 인사이트들을 얻을 수 있는지 알아볼 것이다

 

저번 오차행렬 글에서는 이진 분류기에 관한 오차행렬이여서 2x2 형태였다면

이번에는 다중 분류의 오차행렬로 10x10 형태를 다뤄볼 것이다

 

오차 행렬을 통한 오류 분석

우선 오차행렬을 컬러 그래프로 나타내면 분석하기가 더욱 쉬울 것이다

ConnfusionMatrixDisplay.from_predictions() 함수를 이용하면 된다

from sklearn.metrics import ConfusionMatrixDisplay

y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)
ConfusionMatrixDisplay.from_predictions(y_train, y_train_pred)
plt.show()

이러면 아래와 같은 그래프가 생성된다

이 그래프를 해석하는 방법은 

우선 행은 진짜 레이블을 의미하고 열은 예측 레이블을 의미한다

즉 0번째 행의 0번 열의 5577은 0을 0이라고 분류한게 5577개 있다는 의미이다

5번째 행의 5번째 열의 4444는 5를 5로 분류한게 4444개 있다는 것이다

 

하지만 클래스마다 개수가 다르기 때문에

개수로 보는 것보다 비율로 보는게 더 의미있을 것이다

이 오차행렬을 정규화시켜주어야 한다

 

ConfusionMatrixDisplay.from_predictions(y_train, y_train_pred,
                                        normalize="true", values_format=".0%")
plt.show()

normalize 매개변수를 true로 지정하여 행 단위로 정규화시킬 수 있다

 

이 때 대각선의 각 비율들은 재현율(recall)을 의미한다

 

만약 오류를 조금 더 눈에 띄게 보이도록 하고싶다면

올바른 예측에 대한 가중치를 0으로 설정해보면 된다

sample_weight = (y_train_pred != y_train)
ConfusionMatrixDisplay.from_predictions(y_train, y_train_pred,
                                        sample_weight=sample_weight,
                                        normalize="true", values_format=".0%")
plt.show()

 틀린 예측에만 가중치를 1씩 두고 올바른 예측은 가중치를 0으로 두는 방식이다

즉 오분류만 모아서 만들어진 오차행렬이 된다

8번째 열의 값들이 매우 밝은 것을 보아

대부분의 예측이 8로 잘못 분류되었음을 알 수 있다

 

그래프에서 4번째 행의 8번째 열의 53%는

모든 4 이미지 중 53%가 8로 잘못 분류되었다는 것이 아니라

4 이미지에서 발생한 오류들 중 53%가 8로 분류되었다는 것이다

이 개념을 헷갈려서는 안된다

 

지금까지 행 단위로 정규화된 오차행렬을 보았다면

열 단위로 정규화된 오차행렬도 알아볼 것이다

sample_weight = (y_train_pred != y_train)
ConfusionMatrixDisplay.from_predictions(y_train, y_train_pred, ax=axs[1],
                                        sample_weight=sample_weight,
                                        normalize="pred", values_format=".0%")
plt.show()

이번에도 오류를 더 자세히 보기위해

올바른 예측에 대한 가중치를 0으로 설정하였다

똑같이 4번째 행의 8번째 열의 12%를 보면

8로 잘못 예측된 것들 중 12%가 실제로는 4라는 것을 의미한다

 

행 단위의 정규화와 열 단위의 정규화 그래프로부터 얻을 수 있는 인사이트의 차이를 알아야한다

 

이렇게 오차행렬을 분석하면

데이터가 문제인지 모델이 문제인지 판단가능하고

어떤 클래스가 어디서 틀리는 지 알 수 있어 데이터를 개선할 수 있다

모델이 문제라면 모델 구조를 변경해 개선하는 방법을 선택할 수 있다

 

마치며

이번 글에서는 오차 행렬을 분석해서 얻을 수 있는 정보들에 대하여 알아보았다

처음에 행별로 정규화한 것과 열별로 정규화한 것의 차이를 이해하는 것에 어려움을 겪었다

기준이 무엇인지 잘 생각해보고 각 값들이 의미하는 것들을 천천히 이해해보니 도움이 되었다

같은 데이터라도 표현하는 방식에 따라 얻을 수 있는 정보가 다양해진다는 것에 신기했고

무수히 많은 정보들이 나올 수 있겠다는 생각이 들었다

반응형

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

[AI] 학습 곡선(Learning Curve)  (0) 2026.03.15
[AI] 경사하강법(Gradient Descent)  (1) 2026.03.14
[AI] 다중 분류(multiclass classifier)  (0) 2026.03.02
[AI] ROC곡선  (0) 2026.03.01
[AI] 정밀도/재현율 트레이드오프  (1) 2026.02.28
'AI/Machine Learning' 카테고리의 다른 글
  • [AI] 학습 곡선(Learning Curve)
  • [AI] 경사하강법(Gradient Descent)
  • [AI] 다중 분류(multiclass classifier)
  • [AI] ROC곡선
20puddle
20puddle
20puddle 님의 블로그 입니다.
  • 20puddle
    20puddle 님의 블로그
    20puddle
  • 전체
    오늘
    어제
    • 분류 전체보기 (100)
      • Spring boot (5)
      • git & github (5)
      • algorithm (47)
        • theory (3)
        • 배열 (7)
        • 연결 리스트 (3)
        • 스택 (5)
        • 큐 (3)
        • 덱 (2)
        • 기초 코드 (19)
        • BFS (5)
      • AI (43)
        • Machine Learning (35)
        • Deep Learning (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    딥러닝
    list
    ML
    git
    github
    홀드아웃 검증
    머신러닝
    AI
    Aimers
    DL
    Java
    Spring Boot
    연결리스트
    백준
    주성분변환
    오프라인 학습
    그레디언트 클리핑
    알고리즘
    인공지능
    게시판
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
20puddle
[AI] 오차 행렬을 통한 오류 분석
상단으로

티스토리툴바