들어가며
이번 글에서는 오차행렬을 조금 더 자세히 들여다 보아서
분류기의 성능 향상 방안에 관해 어떤 인사이트들을 얻을 수 있는지 알아볼 것이다
저번 오차행렬 글에서는 이진 분류기에 관한 오차행렬이여서 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 |
