I 이진 로지스틱 회귀 모델의 경우 곡선 아래 면적 (AUC) 또는 c- 통계를 수동으로 계산하는 데 관심이 있습니다.
예 : 검증 데이터 세트에 대한 실제 값인 유지 (1 = 유지됨, 0 = 유지되지 않음) 및 학습을 사용하여 구축 된 모델을 사용하여 회귀 분석에서 생성 된 각 관측치에 대한 예측 유지 상태가 있습니다. set (범위는 0에서 1까지입니다).
내 초기 생각은 “올바른”모델 분류 수를 식별하고 단순히 “올바른”관찰 수를 계산할 총 관찰 수로 나누는 것이 었습니다. c- 통계. “정확”에 의해 관찰의 실제 보유 상태 = 1이고 예측 보유 상태가> 0.5이면 “올바른”분류입니다. 또한 관찰의 실제 보유 상태가 0이고 예측 보유 상태가 < 0.5이면 “올바른”분류이기도합니다. 예측 값 = 0.5 일 때 “동점”이 발생한다고 가정하지만 그 현상은 유효성 검사 데이터 세트에서 발생하지 않습니다. 반면에 “잘못된”분류는 관찰의 실제 보유 상태 = 1이고 예상 보유 상태가 < 0.5이거나 결과에 대한 실제 보유 상태 = 0이고 예상 보존 상태는> 0.5입니다. TP, FP, FN, TN은 알고 있지만이 정보가 주어지면 c- 통계를 계산하는 방법을 모릅니다.
답변
나는 Hanley의 & McNeil의 1982 년 논문 수신기 작동 특성 (ROC) 아래 영역의 의미와 사용을 권장합니다. ) 곡선 .
예
다음과 같은 질병 상태 및 테스트 결과 표가 있습니다 (예 : 물류 모델에서 추정 된 위험에 해당). 오른쪽의 첫 번째 숫자는 진정한 질병 상태가 정상인 환자 수이고 두 번째 숫자는 진정한 질병 상태가 비정상인 환자의 수입니다.
(1) 확실히 정상 : 33/3
(2) 아마 정상 : 6/2
(3) 의심 : 6/2
(4) 아마도 비정상 : 11/11
(5) 확실히 비정상 : 2/33
그래서 총 58 명의 정상환자와 51비정상 환자가 있습니다. 예측 인자가 1 인 경우 확실히 정상이면 환자는 일반적으로 정상 (36 명 중 33 명은 참)이고 5 인 경우 확실히 비정상인 경우 환자는 일반적으로 비정상입니다 (33 명은 참). 35 명의 환자), 따라서 예측자가 의미가 있습니다. 하지만 2 점, 3 점, 4 점으로 환자를 어떻게 판단해야할까요? 결과 검사의 민감도와 특이도를 결정하기 위해 환자를 비정상 또는 정상으로 판단하는 기준을 설정했습니다.
민감도와 특이도
추정 다양한 컷오프에 대한 민감도와 특이성. (이제부터는 민감도와 특이성을 작성하여 값의 추정 된 특성을 암시 적으로 지정하겠습니다.)
모두
를 분류하도록 컷오프를 선택하는 경우 em> 환자가 비정상 인 경우, 테스트 결과가 무엇을 말하든 (즉, 컷오프 1+를 선택 함) 민감도는 51/51 = 1이됩니다. 특이성은 0/58 = 0이됩니다. 소리가 너무 좋습니다.
좋습니다. 덜 엄격한 차단을 선택하겠습니다. 검사 결과가 2 이상인 경우에만 환자를 비정상으로 분류합니다. 그런 다음 3 명의 비정상 환자를 놓치고 민감도는 48/51 = 0.94입니다. 그러나 우리는 33/58 = 0.57의 훨씬 증가 된 특이성을 가지고 있습니다.
이제 다양한 컷오프 (3, 4, 5,> 5)를 선택하여 이것을 계속할 수 있습니다. (마지막 경우에는 어떤 환자도 가능한 가장 높은 테스트 점수가 5 인 경우에도 비정상으로 분류하지 않습니다.)
ROC 곡선
가능한 모든 컷오프에 대해이 작업을 수행하고 1에서 특이도를 뺀 민감도를 플롯하면 ROC 곡선이됩니다. 다음 R 코드를 사용할 수 있습니다.
# Data norm = rep(1:5, times=c(33,6,6,11,2)) abnorm = rep(1:5, times=c(3,2,2,11,33)) testres = c(abnorm,norm) truestat = c(rep(1,length(abnorm)), rep(0,length(norm))) # Summary table (Table I in the paper) ( tab=as.matrix(table(truestat, testres)) )
출력은 다음과 같습니다.
testres truestat 1 2 3 4 5 0 33 6 6 11 2 1 3 2 2 11 33
다양한 통계를 계산할 수 있습니다.
( tot=colSums(tab) ) # Number of patients w/ each test result ( truepos=unname(rev(cumsum(rev(tab[2,])))) ) # Number of true positives ( falsepos=unname(rev(cumsum(rev(tab[1,])))) ) # Number of false positives ( totpos=sum(tab[2,]) ) # The total number of positives (one number) ( totneg=sum(tab[1,]) ) # The total number of negatives (one number) (sens=truepos/totpos) # Sensitivity (fraction true positives) (omspec=falsepos/totneg) # 1 − specificity (false positives) sens=c(sens,0); omspec=c(omspec,0) # Numbers when we classify all as normal
그리고 이것을 사용하여 (추정 된) ROC 곡선을 그릴 수 있습니다 :
plot(omspec, sens, type="b", xlim=c(0,1), ylim=c(0,1), lwd=2, xlab="1 − specificity", ylab="Sensitivity") # perhaps with xaxs="i" grid() abline(0,1, col="red", lty=2)
수동으로 계산 AUC
사다리꼴 면적 공식을 사용하여 ROC 곡선 아래 면적을 매우 쉽게 계산할 수 있습니다.
height = (sens[-1]+sens[-length(sens)])/2 width = -diff(omspec) # = diff(rev(omspec)) sum(height*width)
결과는 0.8931711입니다.
일치 측정
AUC는 일치 측정으로도 볼 수 있습니다.하나는 정상이고 다른 하나는 비정상 인 환자의 가능한 모든 쌍 을 취하면, 가장 높은 (가장 비정상적으로 보이는) 검사 결과를 가진 비정상 환자의 빈도를 계산할 수 있습니다. 동일한 값을 가지며이를 반승으로 간주합니다.
o = outer(abnorm, norm, "-") mean((o>0) + .5*(o==0))
정답은 ROC 곡선 아래 영역 인 0.8931711입니다. 항상 그렇습니다.
일치에 대한 그래픽보기
Harrell이 답변에서 지적했듯이 이것은 또한 그래픽 해석을 가지고 있습니다. y 축에 테스트 점수 (위험 추정치)를, x 축에 실제 질병 상태를 플로팅합니다 (여기서는 겹치는 점을 표시하기 위해 약간의 흔들림이 있음).
plot(jitter(truestat,.2), jitter(testres,.8), las=1, xlab="True disease status", ylab="Test score")
이제 왼쪽의 각 지점 ( 정상환자)과 오른쪽의 각 지점 ( 비정상환자) 사이에 선을 그리겠습니다. 양의 기울기 (즉, 일치 쌍의 비율)를 갖는 선의 비율은 일치 지수입니다 (평탄한 선은 50 % 일치 로 계산 됨).
동점 수 (동일한 위험 점수)로 인해이 예제의 실제 선을 시각화하는 것은 약간 어렵지만 약간의 지 터링과 투명성을 통해 합리적인 플롯을 얻을 수 있습니다.
d = cbind(x_norm=0, x_abnorm=1, expand.grid(y_norm=norm, y_abnorm=abnorm)) library(ggplot2) ggplot(d, aes(x=x_norm, xend=x_abnorm, y=y_norm, yend=y_abnorm)) + geom_segment(colour="#ff000006", position=position_jitter(width=0, height=.1)) + xlab("True disease status") + ylab("Test\nscore") + theme_light() + theme(axis.title.y=element_text(angle=0))
대부분의 선이 위쪽으로 기울어 져 있으므로 일치 지수가 높아집니다. 또한 각 유형의 관측 쌍에서 지수에 대한 기여도를 볼 수 있습니다. 대부분은 위험 점수가 1 인 정상 환자와 위험 점수가 5 (1-5 쌍) 인 비정상 환자와 짝을 이루지 만 1-4 쌍과 4-5 쌍에서도 상당히 많이 나옵니다. 그리고 기울기 정의를 기반으로 실제 일치 지수를 계산하는 것은 매우 쉽습니다.
d = transform(d, slope=(y_norm-y_abnorm)/(x_norm-x_abnorm)) mean((d$slope > 0) + .5*(d$slope==0))
답은 다시 0.8931711, 즉 AUC입니다.
Wilcoxon–Mann–Whitney 테스트
일치 측정과 Wilcoxon–Mann–Whitney간에 밀접한 관련이 있습니다. 테스트. 실제로 후자는 일치 확률 (즉, 무작위 정상-비정상 쌍에서 가장 비정상적으로 보이는테스트 결과를 갖는 비정상 환자)의 확률이 정확히 0.5인지 테스트합니다. 테스트 통계는 추정 된 일치 확률의 단순한 변환 일뿐입니다.
> ( wi = wilcox.test(abnorm,norm) ) Wilcoxon rank sum test with continuity correction data: abnorm and norm W = 2642, p-value = 1.944e-13 alternative hypothesis: true location shift is not equal to 0
테스트 통계 (W = 2642
)는 일치하는 쌍의 수를 계산합니다. 가능한 쌍의 수로 나누면 가족 수를 얻습니다.
w = wi$statistic w/(length(abnorm)*length(norm))
예, ROC 곡선 아래 영역 인 0.8931711입니다.
AUC를 계산하는 더 쉬운 방법 (R에서)
하지만 우리 자신의 삶을 더 쉽게 만들어 봅시다. AUC를 자동으로 계산하는 다양한 패키지가 있습니다.
Epi 패키지
Epi
패키지는 다양한 포함 된 통계 (AUC 포함) :
library(Epi) ROC(testres, truestat) # also try adding plot="sp"
pROC 패키지
pROC
패키지도 좋습니다. ROC 추정치를 평활화 (그리고 평활 된 ROC를 기반으로 AUC 추정치를 계산) :
(빨간색 선은 원래 ROC이고 검은 색 선은 평활화 된 ROC입니다. 또한 기본 1 : 1 종횡비에 유의하십시오. 민감도와 특이도 모두 0–1이기 때문에 이것을 사용하는 것이 좋습니다. 범위.)
평활 ROC의 추정 AUC는 0.9107로, 평활되지 않은 ROC의 AUC와 비슷하지만 약간 더 큽니다 ( 그림에서 왜 더 큰지 쉽게 알 수 있습니다.) (부드러운 AUC를 계산하기에는 가능한 고유 한 테스트 결과 값이 너무 적지 만)
rms 패키지
Harrell의 rms
패키지 rcorr.cens()
함수를 사용하여 다양한 관련 일치 통계를 계산할 수 있습니다. 출력의 C Index
는 AUC입니다.
> library(rms) > rcorr.cens(testres,truestat)[1] C Index 0.8931711
caTools 패키지
마지막으로 caTools
패키지와 colAUC()
기능이 있습니다. 때때로 도움이 될 수있는 다른 패키지에 비해 몇 가지 장점 (주로 속도와 다차원 데이터 작업 기능 – ?colAUC
참조)이 있습니다.하지만 물론 우리가 계속해서 계산 한 것과 동일한 답을 제공합니다.
library(caTools) colAUC(testres, truestat, plotROC=TRUE) [,1] 0 vs. 1 0.8931711
최종 단어
많은 사람들이 AUC가 얼마나 좋은지 알려주는 것으로 생각하는 것 같습니다. 테스트입니다. 그리고 어떤 사람들은 AUC가 검사가 환자를 올바르게 분류 할 확률이라고 생각합니다. 아닙니다 . 위의 예와 계산에서 알 수 있듯이 AUC는 가능한 컷오프마다 하나씩 테스트 패밀리 에 대해 알려줍니다.
AUC는 다음을 기반으로 계산됩니다. 실제로 사용하지 않을 컷오프. 무의미한컷오프 값의 민감도와 특이성에 관심을 가져야하는 이유는 무엇입니까? 그래도 이것이 AUC가 (부분적으로) 기반으로하는 것입니다. (물론 AUC가 1에 매우 가까워지면 거의 모든 가능한 테스트가 큰 차별 력을 갖게되며 우리 모두 매우 만족할 것입니다.)
무작위 정상 AUC에 대한 비정상적인 쌍 해석은 훌륭합니다 (예를 들어 생존 모델로 확장 할 수 있습니다. 여기서 가장 먼저 사망하는 가장 높은 (상대적) 위험을 가진 사람인지 확인합니다). 그러나 실제로는 결코 사용하지 않을 것입니다. 한 사람이 건강한 사람 한 사람 과 아픈 사람 한 사람 을 알고 드문 경우이며, 어떤 사람이 아픈 사람인지 모르고 그들 중 치료할 것을 결정하십시오. (어쨌든 결정은 간단합니다. 추정 위험이 가장 높은 항목을 처리합니다.)
따라서 실제 ROC 곡선 을 연구하는 것이 단순히 보는 것보다 더 유용 할 것이라고 생각합니다. AUC 요약 측정. ROC를 오탐 및 오탐의 비용 (추정치)과 함께 공부하는 기본 요금과 함께 사용하면 어딘가에 도달 할 수 있습니다.
또한 AUC는 보정이 아닌 차별 만 측정합니다. 즉, 위험 점수를 기준으로 두 사람 (아픈 사람과 건강한 사람)을 구별 할 수 있는지 여부를 측정합니다. 이를 위해 상대적 위험 값 (또는 원하는 경우 순위, Wilcoxon–Mann–Whitney 테스트 해석 참조) 만 살펴 봅니다. 절대 값은 해야합니다 . 예를 들어 로지스틱 모델의 각 위험 추정치를 2로 나누면 정확히 동일한 AUC (및 ROC)를 얻게됩니다.
위험 모델을 평가할 때 보정 도 매우 중요합니다. 이를 조사하기 위해 위험 점수가 약 0.7 인 모든 환자를 살펴보고 이들 중 약 70 %가 실제로 아픈지 확인합니다. 가능한 각 위험 점수에 대해이 작업을 수행합니다 (일종의 평활화 / 로컬 회귀 사용). 결과를 플로팅하면 교정 에 대한 그래픽 측정 값을 얻을 수 있습니다.
좋은 교정과 좋은 차별이 모두 있는 모델이있는 경우 좋은 모델을 갖기 시작합니다. 🙂
댓글
답변
이 질문을보십시오 : ROC 곡선 이해
다음은 ROC 곡선을 작성하는 방법입니다 (해당 질문에서) :
ROC 곡선 그리기
순위 분류기
- 점수 감소에 대한 순위 테스트 예
- $ (0, 0) $에서 시작
- 각 예 $ x $ ( 내림차순)
- $ x $가 양수이면 $ 1 / \ text {pos} $ 위로 이동
- $ x $가 음수이면 $ 1 / \ text {neg} $ 오른쪽으로 이동
여기서 $ \ text {pos} $ 및 $ \ text {neg} $는 각각 긍정 및 부정 예제의 비율입니다.
다음 알고리즘을 사용하여 AUC ROC를 수동으로 계산하는 데이 아이디어를 사용할 수 있습니다.
auc = 0.0 height = 0.0 for each training example x_i, y_i if y_i = 1.0: height = height + tpr else auc = auc + height * fpr return auc
이 멋진 gif 애니메이션 그림은이를 설명합니다. 보다 명확한 프로세스
댓글
- @Alexey에게 감사드립니다. Grigorev, 이것은 훌륭한 비주얼이며 앞으로 유용 할 것입니다! +1
- ” 긍정적 및 부정적 예시의 일부 “에 대해 조금 설명해 주시겠습니까? 두 축의 최소 단위 값?
- @Allan Ruin :
pos
여기서 긍정적 인 데이터의 수를 의미합니다. 11 개의 포인트가 1 인 20 개의 데이터 포인트가 있다고 가정 해 보겠습니다. 따라서 차트를 그릴 때 직사각형 11×9 (높이 x 너비)가 있습니다. Alexey Grigorev는 확장했지만 원하는대로 ‘ 그대로 두었습니다. 이제 각 단계에서 차트에서 1 개만 이동하세요.
Answer
Karl 의 게시물에는 하지만 지난 20 년 동안 누군가의 생각을 좋은 방향으로 바꾸어 놓은 ROC 곡선의 예를 아직 보지 못했습니다. 내 생각에 ROC 곡선의 유일한 가치는 그 면적이 매우 유용한 일치 확률과 동일하다는 것입니다. ROC 곡선 자체는 독자가 컷오프를 사용하도록 유도하는데, 이는 잘못된 통계 관행입니다.
$ c $ -index를 수동으로 계산하는 한 $ Y = 0,1 $로 플롯을 만듭니다. x $ 축 및 $ y $ 축에서 $ Y = 1 $ 일 연속 예측 자 또는 예측 확률. $ Y = 0 $의 모든 포인트와 $ Y = 1 $의 모든 포인트를 연결하면 양의 기울기를 갖는 선의 비율이 일치 확률입니다.
분모가 이 설정의 $ n $는 부적절한 정확도 점수 규칙이므로 피해야합니다. 여기에는 올바르게 분류 된 비율, 감도 및 특이성이 포함됩니다.
R Hmisc
패키지 rcorr.cens
함수의 경우 전체 결과, 특히 표준 오류를 확인하세요.
댓글
- 감사합니다. @Frank Harell, 귀하의 의견에 감사드립니다. 컷오프를 좋아하지 않기 때문에 ‘ c- 통계를 일치 확률로 사용합니다. 다시 한 번 감사드립니다!
답변
다음은 단순히 사다리꼴을 사용하여 AUC를 계산하는 자연스러운 방법에 대한 대안입니다. ROC 곡선 아래 영역을 구하는 규칙입니다.
AUC는 무작위로 표본 추출 된 양성 관측치가 무작위로 표본 추출 된 음성 관측치보다 더 큰 예측 확률 (양성일 가능성)을 가질 확률과 같습니다. 이를 사용하여 긍정 및 부정 관측 값의 모든 쌍별 조합을 통해 모든 프로그래밍 언어에서 AUC를 매우 쉽게 계산할 수 있습니다. 표본 크기가 너무 크면 관측치를 무작위로 표본 추출 할 수도 있습니다. 펜과 종이를 사용하여 AUC를 계산하려는 경우 샘플이 매우 적거나 시간이 많지 않으면 이것이 최선의 방법이 아닐 수 있습니다. 예를 들어 R :
n <- 100L x1 <- rnorm(n, 2.0, 0.5) x2 <- rnorm(n, -1.0, 2) y <- rbinom(n, 1L, plogis(-0.4 + 0.5 * x1 + 0.1 * x2)) mod <- glm(y ~ x1 + x2, "binomial") probs <- predict(mod, type = "response") combinations <- expand.grid(positiveProbs = probs[y == 1L], negativeProbs = probs[y == 0L]) mean(combinations$positiveProbs > combinations$negativeProbs) [1] 0.628723
pROC
패키지를 사용하여 확인할 수 있습니다.
library(pROC) auc(y, probs) Area under the curve: 0.6287
무작위 샘플링 사용 :
mean(sample(probs[y == 1L], 100000L, TRUE) > sample(probs[y == 0L], 100000L, TRUE)) [1] 0.62896
답변
- 관찰에 대한 진정한 가치가 있습니다.
- 사후 확률을 계산 한 다음이 확률로 관측치의 순위를 매 깁니다.
- $ P $의 컷오프 확률과 관측치 수 $ N $ :
$$ \ frac {\ text {Sum of true ranks} -0.5PN (PN + 1)} { PN (N-PN)} $$
댓글
- @ user73455 … 1) 예, 진정한 가치가 있습니다. 관찰을 위해. 2) 사후 확률은 각 관측치에 대한 예측 확률과 동의어입니까? 3) 이해함; 그러나 ” 진정한 순위의 합 “은 무엇이며이 값을 어떻게 계산합니까? 이 답변을 더 자세히 설명하는 데 예가 도움이 될까요? 감사합니다!
sens=c(sens,0); omspec=c(omspec,0)
에 작은 오류가있는 것 같습니다. ‘sens=c(0, sens); omspec=c(0, omspec)
? 선행0
로 올바르게 플롯되지만 현재 답변에있는 방식은 아닙니다.sens
및omspec
를 모두 반전하여 왼쪽에서 오른쪽으로 플로팅했을 수도 있습니다.