Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Matplotlib로 보간을 활용한 정밀도-재현율(PR) 곡선 그리기

정밀도-재현율(Precision-Recall) 곡선은 분류 모델의 성능을 평가하는 핵심 도구 중 하나입니다. 실제 데이터에서는 임계값 변화에 따라 정밀도가 들쭉날쭉하게 나타나기 때문에, 곡선을 부드럽고 해석하기 쉽게 만들기 위해 보간(interpolation) 기법을 적용하는 것이 일반적입니다. 이 글에서는 Python의 Matplotlib와 NumPy를 사용하여 보간된 PR 곡선을 그리는 방법을 단계별로 살펴봅니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
  • NumPy를 사용해 재현율(r), 정밀도(p) 데이터 포인트와 이를 복제한 배열(dup_p)을 생성합니다.
  • while 루프를 통해 재현율이 증가할 때 정밀도가 단조 감소하도록 보간 처리를 수행합니다.
  • figure와 서브플롯(subplots)을 생성합니다.
  • plot() 메서드로 각 구간별 계단형 선분을 그려 보간된 PR 곡선을 완성합니다.
  • 원본 데이터(dup_p)를 점선으로 함께 표시하여 보간 전후를 비교합니다.
  • show() 메서드를 호출해 최종 그림을 화면에 출력합니다.

예제 코드

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

# 재현율 0~1 사이의 10개 데이터 포인트 생성
r = np.linspace(0.0, 1.0, num=10)
p = np.random.rand(10) * (1. - r)
dup_p = p.copy()

# 뒤에서부터 순회하며 정밀도가 단조 감소하도록 보간
i = r.shape[0] - 2
while i >= 0:
    if p[i + 1] > p[i]:
        p[i] = p[i + 1]
    i = i - 1

fig, ax = plt.subplots()

# 각 구간마다 수직/수평 선분을 그려 계단형 PR 곡선 생성
for i in range(r.shape[0] - 1):
    ax.plot((r[i], r[i]), (p[i], p[i + 1]), 'k-', label='', color='red')
    ax.plot((r[i], r[i + 1]), (p[i + 1], p[i + 1]), 'k-', label='', color='red')

# 보간 전 원본 정밀도 값을 파란 점선으로 표시
ax.plot(r, dup_p, 'k--', color='blue')
plt.show()

코드 설명

핵심은 while 루프 부분입니다. 배열의 끝에서부터 앞쪽으로 순회하면서, 오른쪽(더 높은 재현율 지점)의 정밀도 값이 현재 값보다 크면 현재 값을 오른쪽 값으로 덮어씁니다. 이 과정을 거치면 재현율이 증가함에 따라 정밀도가 단조적으로 감소하는(monotonically decreasing) 곡선이 만들어집니다. 이는 PR 곡선을 매끄럽게 만드는 표준적인 보간 방식입니다.

이후 for 루프에서는 인접한 두 점 사이에 수직 선분과 수평 선분을 번갈아 그려, 계단처럼 연결된 보간 곡선을 완성합니다. 빨간색 실선이 보간된 PR 곡선이며, 파란색 점선은 보간되지 않은 원본 데이터로, 두 곡선을 비교하면 보간 효과를 한눈에 확인할 수 있습니다.

실행 결과

위 코드를 실행하면 아래와 같이 빨간색 계단형 보간 곡선과 파란색 점선의 원본 데이터가 함께 표시된 그림이 출력됩니다.

Python Matplotlib로 보간을 활용한 정밀도-재현율(PR) 곡선 그리기