AI와 관련된 연구를 진행하다 보면, 모델의 성능을 평가하기 위해 ROC 그래프를 그리는 작업은 필수적인 과정입니다.
ROC 그래프는 모델의 예측 성능을 시각적으로 표현해 주며, 특히 이진 분류 문제에서 중요한 지표로 사용됩니다.
많은 연구자들은 Python의 다양한 라이브러리(예: Scikit-learn, Matplotlib 등)를 이용해 ROC 그래프를 생성하곤 합니다. Python은 강력한 데이터 처리 및 시각화 도구를 제공하지만, 생성된 그래프를 후속 작업에서 수정하거나, 여러 개의 ROC 그래프를 하나로 합치는 데 상당히 제한적입니다.
특히, 학술 발표나 보고서 작성 시, 그래프의 범례와 같이 세부적인 요소를 조정해야 하는 경우가 종종 발생합니다.
이러한 문제를 해결하기 위해, R을 활용 해볼겁니다.
R에서는 그래프를 메타 형식(meta format)으로 추출하여, PowerPoint와 같은 프레젠테이션 소프트웨어에서 직접 수정할 수 있습니다.
특히 여러 개의 ROC 그래프를 하나로 합치거나, 특정 부분을 강조하는 등의 작업을 쉽게 수행할 수 있습니다.
이제 이 글에서는 R을 사용해 2-Fold Cross Validation의 평균 ROC 곡선을 계산하고 시각화한 후, 메타 형식으로 추출하는 방법을 예제와 함께 소개하겠습니다.
1. 예제 데이터셋
# 데이터셋 1과 데이터셋 2의 FPR과 TPR
fpr1 <- c(0, 0.019230769, 0.019230769, 0.076923077, 0.076923077, 0.115384615,
0.115384615, 0.153846154, 0.153846154, 0.230769231, 0.230769231,
0.25, 0.25, 0.307692308, 0.307692308, 0.346153846, 0.346153846,
0.365384615, 0.365384615, 0.423076923, 0.423076923, 0.442307692,
0.442307692, 0.538461538, 0.538461538, 0.557692308, 0.557692308, 1, 1)
tpr1 <- c(0, 0, 0.0625, 0.0625, 0.125, 0.125, 0.3125, 0.3125, 0.375, 0.375,
0.4375, 0.4375, 0.5, 0.5, 0.5625, 0.5625, 0.625, 0.625, 0.75, 0.75,
0.8125, 0.8125, 0.875, 0.875, 0.9375, 0.9375, 1, 1)
fpr2 <- c(0, 0.02, 0.04, 0.04, 0.12, 0.12, 0.18, 0.18, 0.2, 0.2, 0.22, 0.22,
0.28, 0.28, 0.38, 0.38, 0.4, 0.4, 0.46, 0.46, 0.54, 0.54, 0.56,
0.56, 0.66, 0.66, 1, 1)
tpr2 <- c(0, 0, 0, 0.176470588, 0.176470588, 0.235294118, 0.235294118,
0.294117647, 0.294117647, 0.470588235, 0.470588235, 0.588235294,
0.588235294, 0.647058824, 0.647058824, 0.705882353, 0.705882353,
0.764705882, 0.764705882, 0.823529412, 0.823529412, 0.882352941,
0.882352941, 0.941176471, 0.941176471, 1, 1)
이 예제 데이터셋에서는 두 개의 ROC 커브를 나타내는 데이터셋이 포함되어 있습니다. 각 데이터셋은 FPR(False Positive Rate)과 TPR(True Positive Rate)을 가지고 있으며, 다음과 같은 구성입니다:
데이터셋 1:
FPR: 29개의 값으로 구성된 False Positive Rate.
TPR: 28개의 값으로 구성된 True Positive Rate.
데이터셋 2:
FPR: 28개의 값으로 구성된 False Positive Rate.
TPR: 27개의 값으로 구성된 True Positive Rate.
이 데이터는 ROC 커브를 그리기 위한 것으로, FPR과 TPR 값은 특정 임계값에 대한 예측 성능을 나타냅니다.
R에서는 데이터셋의 길이가 다를 경우, 짧은 벡터를 자동으로 순환(recycling)하여 계산을 진행할 수 있는 유연성이 있습니다. 이러한 특성 덕분에 FPR과 TPR의 길이가 정확히 일치하지 않아도 ROC 커브를 그릴 수 있습니다.📈
2. R 코드: 2-Fold Cross Validation에서 평균 ROC 시각화
✅ 이 R 코드는 ROC그래프를 수정 가능하도록 meta형식으로 export 합니다.
# 필요한 패키지 로드
library(ggplot2)
library(officer)
library(rvg)
library(pROC)
# 데이터셋 1과 데이터셋 2의 FPR과 TPR
fpr1 <- c(0, 0.019230769, 0.019230769, 0.076923077, 0.076923077, 0.115384615,
0.115384615, 0.153846154, 0.153846154, 0.230769231, 0.230769231,
0.25, 0.25, 0.307692308, 0.307692308, 0.346153846, 0.346153846,
0.365384615, 0.365384615, 0.423076923, 0.423076923, 0.442307692,
0.442307692, 0.538461538, 0.538461538, 0.557692308, 0.557692308, 1, 1)
tpr1 <- c(0, 0, 0.0625, 0.0625, 0.125, 0.125, 0.3125, 0.3125, 0.375, 0.375,
0.4375, 0.4375, 0.5, 0.5, 0.5625, 0.5625, 0.625, 0.625, 0.75, 0.75,
0.8125, 0.8125, 0.875, 0.875, 0.9375, 0.9375, 1, 1)
fpr2 <- c(0, 0.02, 0.04, 0.04, 0.12, 0.12, 0.18, 0.18, 0.2, 0.2, 0.22, 0.22,
0.28, 0.28, 0.38, 0.38, 0.4, 0.4, 0.46, 0.46, 0.54, 0.54, 0.56,
0.56, 0.66, 0.66, 1, 1)
tpr2 <- c(0, 0, 0, 0.176470588, 0.176470588, 0.235294118, 0.235294118,
0.294117647, 0.294117647, 0.470588235, 0.470588235, 0.588235294,
0.588235294, 0.647058824, 0.647058824, 0.705882353, 0.705882353,
0.764705882, 0.764705882, 0.823529412, 0.823529412, 0.882352941,
0.882352941, 0.941176471, 0.941176471, 1, 1)
# 공통 FPR 범위 정의
common_fpr <- seq(0, 1, length.out = 100)
# 보간을 통해 동일한 FPR에 대한 TPR 계산 (중복된 FPR 값 제거)
unique_fpr1 <- !duplicated(fpr1)
unique_fpr2 <- !duplicated(fpr2)
tpr1_interp <- approx(fpr1[unique_fpr1], tpr1[unique_fpr1], xout = common_fpr, rule = 2)$y
tpr2_interp <- approx(fpr2[unique_fpr2], tpr2[unique_fpr2], xout = common_fpr, rule = 2)$y
# 평균 TPR 계산 및 CI 구하기
mean_tpr <- rowMeans(cbind(tpr1_interp, tpr2_interp), na.rm = TRUE)
std_tprs <- apply(cbind(tpr1_interp, tpr2_interp), 1, sd, na.rm = TRUE)
tprs_upper <- pmin(mean_tpr + std_tprs, 1)
tprs_lower <- mean_tpr - std_tprs
final_df <- data.frame(
FPR = common_fpr,
TPR = mean_tpr,
Upper = tprs_upper,
Lower = tprs_lower
)
# 최종 시각화 (계단형으로 변경)
gg <- ggplot(final_df, aes(x = FPR)) +
geom_step(aes(y = TPR), color = "blue") + # 여기서 geom_line()을 geom_step()으로 변경
geom_ribbon(aes(ymin = Lower, ymax = Upper), alpha = 0.3) +
xlim(0, 1) + ylim(0, 1) + coord_fixed() + theme_bw()
# 파워포인트 슬라이드 생성 및 그래프 삽입 (메타 형식으로 삽입)
my_pres <- read_pptx()
my_pres <- add_slide(my_pres, layout = "Title and Content", master = "Office Theme")
my_pres <- ph_with(my_pres, value = "ROC Curve (2-fold)", location = ph_location_type(type = "title"))
my_pres <- ph_with(my_pres, dml(code = print(gg)), location = ph_location_type(type = "body"))
# 파워포인트 파일 저장
print(my_pres, target = "ROC_Curve_2Fold_Presentation.pptx")
이 코드는 R을 사용하여 2-Fold Cross Validation의 평균 ROC 곡선을 계산하고 시각화합니다. Python 코드와 마찬가지로 각 fold의 ROC 곡선을 계산하고, 이를 기반으로 평균 ROC 곡선을 생성합니다. 이후, 표준편차를 계산하여 신뢰 구간을 추가로 시각화합니다. 이 R 코드를 사용하면, 결과 그래프를 meta 형식으로 추출하여 PPT에서 직접 수정할 수 있습니다.
실제 저장된 PPT파일에서의 ROC그래프입니다.
각 고유 요소마다 개별적으로 분리되어있어, 그래프를 합치거나, 범례만들기 등 수정이 가능합니다.
마무리하며
이번 포스팅에서는 두 개의 데이터셋을 사용하여 R을 통해 ROC 커브의 평균을 하나의 그래프로 시각화(2-Fold Cross Validation)하는 과정을 다루었습니다.
Python은 간편하고 강력한 시각화 도구를 제공하지만, 그래프 수정이 필요할 때는 R을 활용하는 것이 더 유리할 수 있습니다. 특히, R에서는 ROC 그래프를 메타 형식으로 추출하여 PowerPoint와 같은 프레젠테이션 소프트웨어에서 직접 수정할 수 있는 기능이 큰 장점입니다.
AI 연구와 모델 평가에서, 이러한 유연한 시각화 도구를 활용함으로써 결과를 더욱 명확하고 효과적으로 전달할 수 있습니다. 앞으로도 다양한 도구를 조합하여 최적의 연구 결과를 도출할 수 있는 방법을 탐색해보세요.
참고가 되셨길 바라며, 이 포스팅이 여러분의 연구와 실무에 도움이 되기를 바랍니다.
'AI & Computer Science' 카테고리의 다른 글
R 프로그래밍에서 결측치(NA) 처리 및 연산 방법 (7) | 2024.09.01 |
---|---|
통계적 이상치 탐지: R을 활용한 단계별 가이드 (1) | 2024.09.01 |
DICOM (DCM) 이미지를 PNG, JPG로 변환하기 (3) | 2024.09.01 |
DeLong’s Test를 활용한 AUC 비교: Python 구현 가이드 (11) | 2024.08.30 |
AI 모델 성능 평가를 위한 R 코드: 신뢰 구간(CI) 계산 가이드(파이썬) (4) | 2024.08.30 |