Data science (101)

반응형


두 정규분포 모양의 모집단의 모평균의 차이에 대한 검정: Two sample t-test 


예를 들어, 서울사람과 부산사람의 몸무게의 평균의 차이가 있는지에 대해 검정하고자 한다. 이럴 때 흔히 쓸 수 있는 방법이 바로 two sample t-test 방법이다. 두 집단의 평균을 비교하여 차이가 유의한지를 보는 방법이다. 우선 언제 t-test 를 할 수 있는지 정리해보자.


t-test 는 연속형 확률 변수이고 평균이 mu 이고 표준편차가 sigma 인 분포를 갖는 모집단으로부터 n 개의 표본을 추출했을 때, n 이 크면 클 수록 중심극한정리에 의해 표본 평균이 평균이 mu 이고, 표준편차가 sigma/root(n) 인 정규분포에 근사된다는 사실을 이용한 방법이다. 따라서 t-test 의 가정은 아래 두 가지로 요약된다. 


t-test 의 가정


1. 연속형 변수 

2. 정규성

3. 임의추출 

4. 큰 샘플 사이즈 


변수가 연속형이어야하고 임의추출을 해야한다는것은 당연해 보이지만, t-test 에서 왜 정규성을 따라야할까? 처음 t-test 를 배울 때, 많이 질문하는 부분이 't-test 는 샘플이 정규분포를 따라야하나요?' 이다. 결론은 '정규분포를 따르면 좋다.' 라고 생각한다. 왜냐하면, 표본 크기가 크면, 어쨌든 표본 평균의 분포는 정규분포에 근사되기 때문에 t-test 가 불가능한 것은 아니기 때문이다. 하지만 문제는 평균이 대표성을 갖는가이다. 그리고 평균이 대표성을 갖기 위해서는 정규분포와 같은 모양이어야한다. 따라서 모평균을 비교하는 문제에 있어서, 모집단이 정규 분포와 비슷해야 타당한 것인데 모집단이 정규 분포임을 확인하는 방법은 샘플의 분포를 이용하는 길밖에 없다. 따라서 샘플의 정규성을 확인함으로써 평균이 대표성을 갖는지 확인해야한다. 만약 샘플이 정규성을 보이지 않는다면, t-test 의 타당성이 떨어지게 된다. 


예를 들어 모집단의 분포가 이항분포나 포아송 분포처럼 특정 상황에서 정규분포로 근사된다면, t-test 의 결과는 타당할 것이다. 하지만 정규성을 띄지 않는 분포에서 왔다면, t-test 보다는 비모수 검정이 더 적합하다. 왜냐하면 평균이 대표성을 띄지 않기 때문이다. 


Two sample t-test 의 종류



More about the basic assumptions of t-test: normality and sample size, statistical round, 2019


위 그림은 mu1-mu2 의 분포를 H0가 참일때와 H1 이 참일 때로 나누어서 보여주는 그림이다. 1종 오류와 2종 오류의 개념에 대해 잘 이해할 수 있는 그림이다. two sample t-test 에 개념에 대해 간단히 설명해보자. 두 집단의 모평균 (mu1, mu2) 에 차이가 있는지 검정하는 two-sample t-test 는 아래의 분포를 이용해 검정한다. 


$$ \tilde X - \tilde Y \sim N(\mu_1, \mu_2, \frac{s^2_1}{n_1} + \frac{s^2_2}{n_2}) $$ 


H0가 참일 때 (mu1-mu2=0) 검정 통계량은 표본 분산을 이용해 아래와 같은 분포를 갖는다.


$$ \frac{\tilde X - \tilde Y}{\sqrt{\frac{s^2_1}{n_1}+\frac{s^2_2}{n_2}}} ... 식 1 $$


위 검정 통계량이 특정한 자유도를 갖는 t 분포를 갖는다는 사실을 이용해서 검정하는 것인데, t 분포의 자유도는 두 그룹의 분산에 대한 가정에 따라 다르기 계산된다.


1. 등분산 가정 (합동분산 추정량을 이용한 t-test)


합동분산추정량은 아래와 같이 계산된다. 


$$ s^2_p = \frac{n_1-1}{(n_1-1)+(n_2+1)}s^2_1 + \frac{n_2-1}{(n_1-1)+(n_2+1)}s^2_2 = \frac{(n_1-1)s^2_1 + (n_2-1)s^2_2}{n_1+n_2-2} $$ 


이 합동분산 추정량을 위 식1 의 s_1, s_2 대신에 넣으면 검정통계량을 계산할 수 있고, 이 검정통계량은 자유도가 n_1+n_2-2 인 t 분포를 따른다. 식 1을 합동 분산 추정량을 통해 쉽게 계산하기 위해 다음과 같이 정리할 수 있다. 


$$ \frac{\tilde X - \tilde Y}{\sqrt{s^2_p(\frac{1}{n_1}+\frac{1}{n_2})}} \sim t(n_1+n_2-2) $$


2. 등분산 가정을 하지 않을 때 (Welch's t-test)


등분산 가정을 하지 않으면 위 식1을 그대로 계산하면 된다. 다만, 자유도의 계산이 다소 복잡하다. 이 방법을 Welch's t-test 라 하는데 이 방법에 따라 자유도를 유도하는 것은 어려운 부분이므로, 단지 이렇게 계산한다는 것만 알고 넘어가도록 하자. Welch's t-test 에서 자유도는 아래와 같이 계산된다. 


$$ v=\frac{(s^2_1/n_1 + s^2_2/n_2)^2}{\frac{(s^2_1/n_1)^2}{n_1-1} + \frac{(s^2_2/n_2)^2}{n_2-1}} $$


즉, Welch's t-test 는 다음의 분포를 통해 검정한다. 


$$ \frac{\tilde X - \tilde Y}{\sqrt{\frac{s^2_1}{n_1}+\frac{s^2_2}{n_2}}} \sim t(v) $$



1, 2 두 방법 모두 표본수가 많다면 정규근사를 이용할 수 있다. 이 경우 t분포를 이용하지 않고 표본 수가 많을 때, 검정 통계량이 표준정규분포를 근사적으로 따른 다는 사실을 통해 검정한다. 

반응형
반응형

중심극한정리를 통한 표본 비율 분포 근사와 모비율의 검정


비율의 분포 


당신이 정책 담당자이고 전체 국민들 중 대상으로 새로운 교육 개혁에 대해 찬성하는 사람들의 비율을 알고 싶다고 해보자. 그리고 그 비율을 p 라고 할 때, p > 0.5 임을 보이고 싶다고 하자. 하지만 현실적으로 전체 국민에 대해 찬반 여부를 조사하는 것은 불가능에 가깝다. 따라서 전체 인구 집단에서 샘플링한 표본에서 구한 비율을 통해 위 가설 (p > 0.5) 을 보이고 싶다. 


예를 들어, 1000명을 조사해서 p=0.48 을 얻었다고 하자. 이 때, p > 0.5 라고 할 수 있을까? 이 표본에서는 p 가 0.5를 넘지 못했지만, 0.5 에 매우 근접했기 때문에 다른 1000 명을 조사하면 0.5가 넘을 수 있을 것을 기대할 수 있을 법하다. 한 가지 방법은, 1000 명을 여러번 뽑아서 p가 0.5를 넘는 비율을 보는 것일 것이다. 예를 들어, 1000 명을 100번 뽑았는데, 95번이 p>0.5 일 경우, p > 0.5 라고 결론내려볼 수 있을 것이다. 


하지만 1000 명을 100 번 뽑는 것도 마찬가지로 시간과 비용이 많이 든다. 따라서 현실적으로 비율의 분포를 이용한다. 표본을 통해 비율의 분포를 구할 수 있다면 더욱 쉬운 방법을 통해 가설을 검정할 수 있을 것이다. 표본 안에서 뽑은 값이 분포 안에서 어디에 위치해 있는 가를 보는 것이다. 가설이 분포 흔히 관찰할 수 있는 것이라면 그 가설이 맞는 것이고, 그렇지 않다면 가설이 틀린 것이다. 우선, 모집단의 일부를 샘플링하여 찬성 비율을 보는 것은 다음과 같이 모델링 해볼 수 있다. 모집단의 정책에 대한 찬반여부를 확률변수 X 라 할 때, 다음과 같은 베르누이 분포를 갖는다. 


$$ X \sim Be(P) $$ 


이 때, 1000의 크기를 갖는 표본 X1,...,X1000 이 존재하면, 찬성 비율은 다음과 같이 계산할 수 있다. 


$$ \tilde P = \frac{\sum_{i=1}^{i=1000}{X_i}}{n} $$ 


중심극한정리에 의해 p^ 은 정규근사가 가능하다. 왜냐하면 p^ 은 베르누이 분포의 표본 평균이기 때문이다. 


$$\tilde P \sim N(P, \frac{p(1-p)}{n}) $$ 


비율의 검정


중심극한정리를 통해 p^ 의 분포는 구했는데, 이것을 통해 p > 0.5 인지 아닌지를 어떻게 검정할 수 있을까? 사실 좋은 방법은 앞서 언급했듯, 1000 명을 여러번 뽑아서 p가 0.5를 넘는 비율을 보는 것일 것이다. 이 경우 분포를 모르더라도 결론을 내려볼 수 있다. 하지만 우리는 통계적, 근사적으로 이 문제를 해결하려고 한다. 


검정의 방법은 크게 두 가지로 나누어볼 수 있다. 


1. 가설검정을 이용한 방법

2. 신뢰구간을 이용한 방법 


가설검정을 이용한 방법


가설검정을 이용한 방법의 절차는 다음과 같다. 


1. 귀무가설 및 대립가설의 설정 


양측 검정, 단측 검정 둘 중 하나를 선택해 수행한다. 


$$ H_0 = 0.5 $$

$$ H_1 > 0.5 $$ 


2. 검정 통계량 계산 


아래분포를 이용해 검정통계량을 계산

$$ \tilde P \sim N(0.5, \frac{0.5*0.5}{1000}) = N(0.5, 0.00025) $$ 


> x = seq(0.01, 1, 0.001)

> y = dnorm(x=seq(0.01, 1, 0.001), mean=0.5, sd=sqrt(0.00025))

> plot(x, y)


검정통계량은 아래와 같다. 


$$ \frac{0.48-0.5}{\sqrt{0.00025}} = -1.26 $$ 


3. 유의수준 설정 


일반적으로 5 %의 유의수준을 설정한다. 


4. 기각역 (또는 p-value) 계산 


검정통계량과 유의수준을 통해 기각역을 결정한다.


기각역은 아래와 같은 절차로 계산한다. 


$$ P(\tilde p > R) = 0.05 $$ 


위 식에서 R 이 기각역인데, R = 0.526 이다. 


>qnorm(p=0.95, mean=0.5, sd=sqrt(0.00025)) 

0.526


유의수준을 통한 기각여부 결정은 아래와 같이한다. 유의수준 계산에는 검정통계량을 이용한다.


> 1-pnorm(-1.26)

0.89

 

$$ P(X > -1.26) = 0.89 $$ 


5. 기각역 포함 여부를 통해 의사 결정을 수행한다. 


p-value 가 0.05 보다 큰 0.89 이고, 기각역 (X > 0.526) 에 포함되지 않으므로, (사실 두 개는 같은 정보이다.) 귀무가설을 기각할 수 없다. 


신뢰구간을 이용하는 방법


신뢰구간을 이용한 검정 방법의 절차는 다음과 같다. 신뢰구간을 이용한 방법은 양측 검정을 위해 사용할 수 있다. 


귀무가설 및 대립가설의 설정 


$$ H_0 = 0.5 $$

$$ H_1 != 0.5 $$ 


신뢰수준을 정하고 p 의 구간추정을 통해 신뢰구간을 구한다. 95% 신뢰구간은 다음과 같이 구할 수 있다. 


$$ \tilde P \sim N(p, \frac{p(1-p)}{n}) $$ 

$$ P[\tilde p - 1.96* \sqrt{p(1-p)/n} < p < \tilde p+ 1.96 * \sqrt{p(1-p)/n}] = 0.95 $$

$$ (\tilde p - 1.96* \sqrt{p(1-p)/n}, \tilde p+ 1.96 * \sqrt{p(1-p)/n}) $$


위 식에서 n,p,sd 를 대입하면 다음과 같은 신뢰구간을 얻을 수 있다. p 대신의 p의 추정량 p^을 넣는다. 


(0.469, 0.531)


따라서 p^ 은 0.48 이고, 위 구간에 들어가기 때문에 귀무가설을 기각할 수 없다. 


모비율의 신뢰구간을 구할 때, 한가지 알아두면 좋은 테크닉은, p 에 표본 비율 p^을 대입하지 않고, 0.5를 대입하면 가장 보수적인 신뢰구간을 구할 수 있다는 것이다. 


$$ (\tilde p - 1.96* \sqrt{0.5(1-0.5)/n}, \tilde p+ 1.96 * \sqrt{0.5(1-0.5)/n}) $$


p를 0.5로 추정할 때, 신뢰구간의 길이가 가장 넓어지기 때문에 만약 표본 수가 충분한다면 신뢰구간의 타당성을 확보하기 좋은 방법이라고 할 수 있고, 표본수가 적어 표본비율의 변동이 큰 상황에서도 대략적인 신뢰구간을 구할 수 있다는 장점이 있다. 


반응형
반응형


Label smoothing


본 포스팅에서는 최근 딥러닝 모델의 정확도와 Calibration 향상 최종적으로는 model generalization 에 도움이 된다고 알려진 Label smoothing 에 대해서 살펴보도록 하겠습니다. 


Introduction


이미지 분류는 이미지를 n 개의 카테고리로 할당하는 일을 말합니다. 예를 들어, 고양이와 개를 분류하는 이미지 분류문제를 예로 들어보자. 이미지의 크기가 248x400 라면, RGB 각 3개의 채널이 존재하기 때문에 하나의 이미지는 248x400x3 의 3차원 벡터로 표현할 수 있습니다. 이 벡터를 단 하나의 값으로 요약하는 것이 이미지 분류 문제에서 하는 것입니다. 

이미지 분류 문제의 예



고양이와 개를 분류하는 위의 예는 이진 분류 (binary classification) 의 예로 볼 수 있습니다. 이미지 분류의 목적 (248x400x3) 의 벡터를 하나의 값으로 요약하는) 을 달성하기 위해서는 학습 데이터 (training data) 가 필요합니다. 즉, 데이터의 갯수가 n 일 때, 학습 데이터의 형태는 이미지 : nx248x400x3 / Label: n 의 벡터로 표현할 수 있습니다. 근데 문제는, 잘못 labeling 된 이미지가 있을 수 있다는 것입니다. 특히, 이미지의 출처가 인터넷인 경우에는 이러한 mislabeling 의 문제가 빈번하게 일어납니다. 

예를 들어, 위와 같은 상황에서 딥러닝 모델은 Dog 라고 잘못 labeling 된 고양이의 이미지까지 학습하게 됩니다. 물론 데이터의 수가 적다면 이를 눈으로 일일히 확인하며 수정할 수 있지만, 데이터의 수가 많다면 이는 불가능합니다. 


$$ L = −(ylog(p)+(1−y)log(1−p)) $$

Binary classification 에서는 위와 같은 binary cross entropy 를 씁니다. 딥러닝 모델을 트레이닝하면서 loss 를 계산할 때, 잘못 labeling 된 sample 에 대해서는 loss 값이 크게 계산되게 됩니다. 이것은 training 도중 문제를 발생시킬 수 있습니다. 

Label Smoothing — One Possible Solution

이러한 문제를 해결하기 위한 한 가지 가능한 방법이 label smoothing 입니다. 이진 분류 문제에서 label 은 0 또는 1로 주어집니다. label 이 1이라고 하는 것은 그것의 label 이 1 임을 100 % 확신한다는 뜻입니다. 하지만 반드시 그렇지 않을 수 있다는 것이 핵심 문제입니다. 왜냐하면 사람이 annotation 하는 것이기 때문에 실수의 가능성이 언제나 존재합니다. 이 때 발생할 수 있는 잘못된 loss 의 영향을 줄이기 위하여 label 을 0또는 1이 아니라 smooth 하게 부여하는 것이 label smoothing 의 아이디어입니다. 또한 label smoothing 은 mislabeling 된 데이터를 고려하기 위해 사용되는 것에 추가적으로 regularization에 도움을 주면서, model generalization 과 calibration 에 도움이 된다는 것이 알려져있습니다.

Maximum likelihood learning with a softmax classifier and hard targets may actually never converge, the softmax can never predict a probability of exactly 0 or exactly 1, so it will continue to learn larger and larger weights, making more extreme predictions. forever (출처)

tensorflow 에는 label smoothing 에 대한 implementation 을 제공합니다. 아래와 같이 softmax_cross_entropy 의 parameter 로 label_smoothing 값을 전달할 수 있습니다. 


tensorflow document 를 보면 label_smoothing 값이 0이 아닌 경우, 아래와 같이 label smoothing 을 한다고 설명이 되어있습니다. 

"If label_smoothing is nonzero, smooth the labels towards 1/num_classes: new_onehot_labels = onehot_labels * (1 - label_smoothing) + label_smoothing / num_classes"

이것이 무엇을 뜻할까요? 

예를 들어 개/고양이 이진분류문제에서 label_smoothing 이 0.2로 설정되었다고 해봅시다. 그리고, 0은 고양이, 1은 개라는 rule 로 labeling 을 했다고 합시다. 위의 식을 이용하면 새로운 label 은 아래와 같이 계산됩니다. 

new_onehot_labels = 1 * (1 — 0.2) + 0.2 / 2 = 1*(0.8) + 0.1
new_onehot_labels = 0.9 

그리고 원래 0으로 부여되었던 label 의 경우 tensorflow 에서는 1-0.9 = 0.1 로 부여하게됩니다. 왜 label smoothing 을 이용하면 model calibration 에 도움이 될까요? 직관적인 해석은, 모델이 target 을 정확하게 예측하지 않아도 되도록 만드는 것입니다. 예를 들어, 원래 label 이 1인 데이터에 대해서 모델은 1을 최대한 예측하도록 트레이닝되는데 label smoothing 을 적용하면 '그래 0.9 정도면 잘 예측했다.' 정도의 loss 값을 산출하게 되는 것입니다. 그렇기 때문에 모델이 overconfident 해지는 경향을 막게 되아 calibration 및 regularization 이 되는 효과를 갖게 됩니다.  

Reference

https://towardsdatascience.com/label-smoothing-making-model-robust-to-incorrect-labels-2fae037ffbd0

https://arxiv.org/pdf/1906.02629.pdf

https://medium.com/@nainaakash012/when-does-label-smoothing-help-89654ec75326

https://rickwierenga.com/blog/fast.ai/FastAI2019-12.html

반응형
반응형


Cross-entropy 의 이해: 정보이론과의 관계



1. 손실함수로서의 Cross-entropy


딥러닝에서 분류 모델에 대한 손실 함수로 cross-entropy 혹은 binary entropy 나 log loss 라는 것을 사용하게 된다. 손실함수로서의 cross-entropy 는 아래 식으로 계산할 수 있다. 

$$ - \frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} L_{ic}log(P_{ic}) $$ 

이 때, 

  • n = 데이터 갯수
  • C = 범주 갯수
  • L = 실제 값 (주로 0 또는 1)
  • P = 실제 값에 대한 확률 값 (0~1)  

만약 k = 3 이면 L_1 = [0, 0, 1] P_1 = [0.1, 0.2, 0.7] 과 같이 정의 될 수 있다. 이 때, 해당 데이터 포인트 (1) 에서 cross entropy 는 0*log(0.1) + 0*log(0.2) + 1*log(0.7) = -log(0.7) = 0.35 이다. 만약 L_2 = [0, 0, 1] P_2 = [0.5, 0.3, 0.2] 라면, 예측 모델은 상당히 잘못 예측했다는 것을 알 수 있고, 이 데이터 포인트 (2) 에서의 cross-entropy 는 -log(0.2) = 1.6 이다. 


딥러닝을 통한 예측 모델링에 있어, 실제 값과 예측값의 차이 (dissimilarity) 계산한다는 관점에서 cross-entropy 사용하는 것의 의미를 직관적으로 이해할 수 있다. 하지만 본 포스팅에서 이러한 식이 나오게 된 배경을 정보 이론 (Information theory) 을 기반으로 알아보려고한다. 


2. entropy 란 무엇인가?


entropy 란 불확실성 (uncertainty) 에 대한 척도이다. 결국 예측 모형으로 하고자 하는 것은 불확실성을 제어하고자 하는 것이다. 가방 안에 빨간공만 들어있다고 하자. 이 경우, 불확실성은 없다. 왜냐하면 어떤공을 꺼내도 빨간 공이기 때문이다. 따라서 이 경우 entropy 는 0이다. 우리가 신경써야하는 부분은 가방 안에서 꺼내는 공에 불확실성이 있는 경우이다. 


만약, 어떠한 사건이 같은 비율로 발생한다고 하고, 사건의 갯수를 n이라고 하면 entropy 는 log(n) 이다. 예를 들어, 가방 안에 빨간공과 녹색 공이 50:50으로 들어있다면 이 경우 entropy 는 log(2)=0.69 이다. 두 색깔의 공만 들어있는 경우, 50:50 으로 들어있을 때, 가장 entropy (불확실성) 이 크다. 이를 직관적으로 이해하면, 우리가 공을 꺼낼 때, 반반으로 들어있다면, 어떤 공이 더 자주 관찰될지 예측할 수 없기 때문에 entropy 가 크다고 이해할 수 있다.


하지만 일반적으로 가방 안에 각기 다른색의 공들이 다른 비율로 들어있는 경우가 많을 것이다. 이 때는 위와 같은 공식으로 구할 수 없으며, entropy 를 아래와 같은 식으로 구하게 된다. 

$$ H(q) = -\sum_{c=1}^{C} q(y_c)log(q(y_c)) $$ 


이 때, C는 범주의 갯수이고, q는 사건의 확률질량함수 (probability mass function) 이다. 예를 들어, 가방 안에 빨간공과 녹색공이 20:80 으로 들어있는 경우, H(q)=-(0.2log(0.2)+0.8log(0.8))=0.5 이다. 더욱 쉬운 이해를 위해 가방에서 공을 꺼낼 때, 더 많은 경우의 수가 존재한다고 해보자. 가령 100개의 각기 다른 색깔과 모양의 공이 가방 안에 들어있다. 이 경우, 가방에서 공을 꺼냈을 때 어떤 색과 모양을 갖는 공이 관찰될지 알기 매우 힘들다. 각 공이 동일한 확률로 관찰된다고 가정할 때 entropy = log(100) = 4.6 이다. 하지만 100개의 공이 들어있다고 하더라도, 한 종류의 공이 99 %를 차지하고 있으면 어떨까? 이 경우, 위 식에 의해 entropy는 매우 작아진다 (-(0.99*log(0.99)+99*(0.01/99*log(0.01/99))) = 0.1). 즉, entropy 는 예측하기 쉬운 일에서보다, 예측하기 힘든일에서 더 높다. 


3. Cross-entropy 


예측 모형은 실제 분포인 q 를 모르고, 모델링을 하여 q 분포를 예측하고자 하는 것이다. 예측 모델링을 통해 구한 분포를 p(x) 라고 해보자. 실제 분포인 q를 예측하는 p 분포를 만들었을 때, 이 때 cross-entropy 는 아래와 같이 정의된다. 

$$ H_p(q) = -\sum_{c=1}^{C} q(y_c)log(p(y_c)) $$ 


이 때, q와 p가 모두 식에 들어가기 때문에, cross-entropy 라는 이름이 붙었다고 할 수 있다. 머신러닝을 통한 예측 모형에서 훈련 데이터에서는 실제 분포인 p 를 알 수 있기 때문에 cross-entropy 를 계산할 수 있다. 즉, 훈련 데이터를 사용한 예측 모형에서 cross-entropy 는 실제 값과 예측값의 차이 (dissimilarity) 를 계산하는데 사용할 수 있다는 것이다. 또한, Cross-entropy > entropy 이다. 


예를 들어, 가방에 0.8/0.1/0.1 의 비율로, 빨간/녹색/노랑 공이 들어가 있다고 하자, 하지만 직감에는 0.2/0.2/0.6의 비율로 들어가 있을 것 같다. 이 때, entropy 와 cross-entropy 는 아래와 같이 계산된다. 


$$ H(q) = -[0.8log(0.8) + 0.1log(0.1) + 0.1log(0.1)] = 0.63 $$

$$ H_p(q) = -[0.8log(0.2) + 0.1log(0.2) + 0.1log(0.6)] = 1.50 $$


4. Kullback-Leibler Divergence


 “KL Divergence” 라고 주로 부르는 서로 다른 두 분포의 차이 (dissimilarity) 를 측정하는데 쓰이는 measure 이다. 이를 entropy 와 cross-entropy 개념에 대입하면 두 entropy 의 차이로 계산된다. KL Divergence 의 정의는 아래와 같다 (아래 정의는 p와 q가 이산분포일 때 정의되는 것이며, 연속 분포일 때는 sum 대신 integral 이 들어갈 것임을 예상해볼 수 있다.). 두 분포, q (실제)와 p (예측)가 있을 때, 


$$ D_{KL}(q||p) = -\sum_{c=1}^{C} q(y_c) [log(p(y_c)) - log(q(y_c))] = H_p(q) - H(q) $$ 


cross-entropy = H_p(q) 는 실제 entropy = H(q) 보다 항상 크기 때문에 KL Divergence 는 항상 0보다 큰 값을 갖게된다. 예측 분포인 p 를 실제분포 q에 가깝게 하는 것이, 예측모형이 하고자하는 것이며, p가 q에 가까이갈 수록 KL Divergence 0에 가까워질 것이다. 그리고 H(q) 는 고정이기 때문에, H_p(q)를 최소화 시키는 것이 예측 모형을 최적화 시키는 것이라고 할 수 있다. 따라서 cross-entropy 를 최소화 시키는 것이 KL Divergenece 를 최소화 시키는 것이며, 이것이 불확실성을 제어하고자하는 예측모형의 실질적인 목적이라고 볼 수 있다. 


5. Cross-entropy 를 통한 loss function 


예를 들어, 이미지를 읽어들여 개/고양이/물고기를 분류하는 3개의 클래스를 갖는 다중 분류 문제를 생각해보자. 가방에 개/고양이/물고기라고 쓰인 공이 들어있다. 이 공은 해당 이미지에 대한 정답을 사람이 적어 놓은 것이다. 예측 모형은 주어진 정보 (이미지) 를 살펴본 후, 예측 분포를 산출했는데, p(y) = [0.2, 0.3, 0.5] 으로 예측했다. 즉, 공 (실제 정답) 을 꺼냈을 때, 개/고양이/물고기를 관찰할 확률이 각각 0.2/0.3/0.5 일 것이라고 예측 한 것이다. 하지만 실제 분포, q(y) = [0, 0, 1] 이다. 이 때, cross-entropy 는 매우 간단하게, -log(0.5) 이다.


2에서 예로 든, 빨간공 녹색공 예제와 다른점은, 빨간공 녹색공 예제에서는 공이 어떠한 확률질량함수를 갖고 가방 안에 들어있을 것이라고 가정한 것이지만, 현실의 분류 문제에서는 정답이 있다고 가정하고 하기 때문에 (즉, 공을 꺼낼 때 관찰하는 것이 100 % 정해져 있다.), 실제 분포인 q(y)가 [0,0,1], [1,0,0] .. 과 같은 one-hot encoding 된 벡터로 나타내어진다는 것이다. 왜냐하면 실제 이미지가 0.2 의 확률로 개일 수는 없다. 왜냐하면 그 이미지가 개라는 것이 "정답" 이라고 사람이 정의했기 때문이다. 즉, 어떠한 이미지가 무엇이냐는 것은 확률적이지 않다는 것이기 때문에 실제 분포의 entropy = H(q) = 0 이다. 하지만 cross-entropy 는 p와 q에서 정의되는 것이므로 구할 수 있다. 실제 분포의 entropy 가 0이기 때문에, cross-entropy = KL(q||p) 이다. 


이 경우, p와 q의 cross-entropy 는 실제로 아래와 같이 계산된다. 

$$ -\sum_{c=1}^{C} L_{c}log(P_{c}) $$  

$$ L_{c} = q(y_c)  $$

$$ P_{c} = p(y_c) $$ 


그리고 n 개의 데이터포인트에 대해 cross-entropy 의 평균을 구하는 것이 아래의 식이다. 

$$ - \frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} L_{ic}log(P_{ic}) $$ 


지금까지 손실함수로 cross-entropy 를 사용한다는 것이 무엇을 의미하는 것인지, entropy 를 기반으로 설명하였다. 손실함수로서의 cross-entropy 를 정보 이론의 관점, entropy 의 관점에서 이러한 관련성을 갖고 있다는 것을 이해하는데 도움이 되었으면 한다.  


참고

https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181a 


반응형
반응형

Model Calibration


예측모형 (predicted model) 을 어떻게 평가할 수 있을까? 가장 직관적이면서 많이 쓰이는 평가 방법은 정확도 (accuracy), 즉, 예측한 것중 몇퍼센트나 맞았는가에 관한 지표일 것이다. 하지만 좋은 모델이란 정확해야할 뿐만아니라 잘 보정 (calibration) 되어야할 필요가 있다. 


calibration 을 평가하기 위해 사용되는 calibration plot 은 예측된 확률과, 실제 확률의 관계를 보여준다. 이를 통해 모델의 예측이 얼마나 "현실적인지" 를 측정하게 된다. 예를 들어, 이미지를 인풋으로 받아 개와 고양이를 분류하는 모델을 생각해보자. 어떤 이미지에 대해 0.8 의 확률로 개라고 반환했다면, "정말 이 이미지가 개일 확률이 0.8 인가?" 에 대한 답을 주는 것이 calibration plot 이다. 정확도란 (일반적으로 이진 분류에 관하여) 50 % 를 cutoff 로 사용하여, 예측을 A와 B 클래스로 나누어, 실제 값이랑 맞는지를 확인하는 것이지만, calibration 은 보다 면밀하게 모델의 결과값을 검증하는 과정이라고 볼 수 있다. 


Calibration plot 


만약 데이터의 실제 정답이 알려져 있다면, Calibration 을 평가하기 위해 Calibration plot 을 많이 그리게 되는데, 일반적인 방법은 다음과 같다. 


1. 모델의 예측값을 기준으로 [0,10%], (10,20%], (20,30%], … (90,100%] 에 맞게 데이터를 분할한다 (이를 binning 이라고도 한다).  

2. 각 카테고리에서 예측하고자 한 클래스의 비율 (event rate) 를 계산한다 (예제의 경우 개의 비율을 계산한다).

3. calibration plot을 그린다 : 각 카테고리에서의 중앙 값 (5 %, 15 %, 20 % ...) 를 x 로 놓고, event rate 를 y 로 놓고 그린 그림이다. 

4. calibration plot 의 선이 일직선 (45◦)임을 확인한다. 


Example


R을 통해 Calibration 을 실제로 해보자. 


diabetes.csv


실습 데이터는 Pima diabetes 데이터셋을 이용해보겠다. Pima diabetes 데이터셋은 사람들의 임상정보와 당뇨병 여부에 관한 정보를 갖고 있는 데이터셋이다. 이 때 당뇨병 여부를 예측하는 모형을 로지스틱 회귀분석 및 랜덤포레스트을 이용해 구축하고, 이 두 모델의 정확도 및 Calibration 을 평가해보자. 


데이터 로드 및 train/test split 

  • 이 데이터셋의 경우, missing value 가 많은 것이 특징이다. 
  • 아래 코드는 평균으로 missing 을 채워넣는 mean imputation 을 수행하고 train/test 를 50:50으로 나누는 코드이다. 
suppressPackageStartupMessages(library(tidyverse))
library(data.table) 
data <- readr::read_csv("../PimaDiabetes/diabetes.csv") 
data$Outcome <- factor(data$Outcome)

## Imputation
fix_missing <- function(x, missing_value) { 
  x[x == missing_value] <- NA 
  x 
} 
cols <- colnames(data)[1:8]
data[, cols] <- lapply(data[, cols], fix_missing, 0)

impute_mean <- function(x) {
    x[is.na(x)] <- mean(x, na.rm = TRUE)
    return(x)
}
data[, cols] <- lapply(data[, cols], impute_mean)
data %>% head

##  Train/Test Split
set.seed(123)
smp_size <- floor(0.5 * nrow(data))
train_ind <- sample(seq_len(nrow(data)), size = smp_size)
train <- data[trai n_ind, ]
test <- data[-train_ind, ]


로지스틱 회귀분석 모형 구축 및 test set 에 대한 예측

  • Pregnancies + Glucose + BloodPressure + Insulin + BMI + DiabetesPedigreeFunction + Age 를 통해 Outcome 을 예측하는 모형을 만든다. 
lrmodel <- glm(data = train, Outcome ~ Pregnancies + Glucose + BloodPressure + Insulin + BMI + DiabetesPedigreeFunction + Age, family = binomial("logit"))

x = predict(lrmodel, newdata = test)
p = (1 / (1+exp(-x)))
test <- test %>% mutate(lrmodel = p)

랜덤 포레스트 모형 구축 및 test set 에 대한 예측 

  • 랜덤 포레스트의 hyperparameter 인 mtry 와 ntree 는 적절한 값을 선택한다. 
library(randomForest)

rfmodel = randomForest(Outcome ~ Pregnancies + Glucose + BloodPressure + Insulin + BMI + DiabetesPedigreeFunction + Age
                      , data = train, mtry = floor(sqrt(7)), ntree = 500, importance = T)

p = predict(rfmodel, newdata = test, type = "prob")[, 2]
test <- test %>% mutate(rfmodel = p)

cutoff 정하기

  • 모형은 0~1사이의 확률을 의미하는 값을 내보내는데, 여기에 threshold 를 적용해서 0 또는 1로 변환한다. 
test <- test %>% mutate(
  rfclass = if_else(rfmodel >= 0.5, 1, 0),
  lrclass = if_else(lrmodel >= 0.5, 1, 0)
)
test$rfclass <- factor(test$rfclass)
test$lrclass <- factor(test$lrclass)


로지스틱 회귀분석 정확도 

  • 정확도는 최종 예측값 (0 또는 1) 을 기준으로, 예측한 값중 실제 정답으로 맞춘 비율을 의미하는 값이다. 
  • 로지스틱 회귀분석의 경우, 78.9 % 의 정확도를 보여준다. 

library(caret) confusionMatrix(test$lrclass, test$Outcome)

Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 227  58
         1  23  76
                                          
               Accuracy : 0.7891          
                 95% CI : (0.7448, 0.8288)
    No Information Rate : 0.651           
    P-Value [Acc > NIR] : 2.494e-09       
                                          
                  Kappa : 0.5058          
                                          
 Mcnemar's Test P-Value : 0.0001582       
                                          
            Sensitivity : 0.9080          
            Specificity : 0.5672          
         Pos Pred Value : 0.7965          
         Neg Pred Value : 0.7677          
             Prevalence : 0.6510          
         Detection Rate : 0.5911          
   Detection Prevalence : 0.7422          
      Balanced Accuracy : 0.7376          
                                          
       'Positive' Class : 0  


로지스틱 회귀분석 Calibration plot

  • Calibration plot 을 그릴 수 있는 방법은 여러가지가 있지만, caret 패키지의 calibration 함수를 통해 쉽게 그려볼 수 있다. 

calibration 함수는 아래의 calibration plot 을 그릴 수 있는 정보를 dataframe으로 만들어 반환해준다. 
  • 모델의 예측값을 기준으로 [0,10%], (10,20%], (20,30%], … (90,100%] 에 맞게 데이터를 분할한다 (이를 binning 이라고도 한다).  
  • calibration plot을 그린다 : 각 카테고리에서의 중앙 값 (5 %, 15 %, 20 % ...) 를 x 로 놓고, event rate 를 y 로 놓고 그린 그림이다. 
library(caret)

cal_plot_data_lr = calibration(Outcome ~ lrmodel, 
  data = test, cuts = seq(0, 1, by=0.1), class = 1)$data 

ggplot() + xlab("Bin Midpoint") +
  geom_line(data = cal_plot_data_lr, aes(midpoint, Percent),
            color = "#F8766D") +
  geom_point(data = cal_plot_data_lr, aes(midpoint, Percent),
            color = "#F8766D", size = 3) +
  geom_line(aes(c(0, 100), c(0, 100)), linetype = 2, 
            color = 'grey50')

랜덤포레스트 정확도

  • 랜덤포레스트의 경우 로지스틱 회귀분석보다 조금 작은 0.77 % 의 정확도를 보인다. 
confusionMatrix(test$rfclass, test$Outcome)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 213  51
         1  37  83
                                          
               Accuracy : 0.7708          
                 95% CI : (0.7255, 0.8119)
    No Information Rate : 0.651           
    P-Value [Acc > NIR] : 2.421e-07       
                                          
                  Kappa : 0.4831          
                                          
 Mcnemar's Test P-Value : 0.1658          
                                          
            Sensitivity : 0.8520          
            Specificity : 0.6194          
         Pos Pred Value : 0.8068          
         Neg Pred Value : 0.6917          
             Prevalence : 0.6510          
         Detection Rate : 0.5547          
   Detection Prevalence : 0.6875          
      Balanced Accuracy : 0.7357          
                                          
       'Positive' Class : 0               
                                          


랜덤포레스트 Calibration plot

  • 랜덤포레스트에서도 같은 방법으로 calibration plot 을 그릴 수 있다. 
  • 정확도는 랜덤포레스트에서 약간 작았지만, Calibration 은 더 좋은 모습을 보인다.
  • 하지만 train/test 의 비율, hyperparameter 구성에 따라 calibration 이 달라지니, 다양한 세팅에서 검증해볼 필요가 있다. 
cal_plot_data_rf = calibration(Outcome ~ rfmodel, 
  data = test, class = 1)$data

ggplot() + xlab("Bin Midpoint") +
  geom_line(data = cal_plot_data_rf, aes(midpoint, Percent),
            color = "#F8766D") +
  geom_point(data = cal_plot_data_rf, aes(midpoint, Percent),
            color = "#F8766D", size = 3) +
  geom_line(aes(c(0, 100), c(0, 100)), linetype = 2, 
            color = 'grey50')


https://medium.com/optima-blog/model-calibration-4d710a76c54

http://appliedpredictivemodeling.com/blog?offset=1532965627474


반응형
반응형


딥러닝을 통한 5년 뒤 유방암 발생 예측

A Deep Learning Mammography-based Model for Improved Breast Cancer Risk Prediction



딥러닝의 응용분야 중 대표적인 분야가 바로 Computer-aided diagnosis (CAD) 라고 하는 자동 진단 분야일 것이다. 대표적인 예로는 구글의 당뇨병 망막증 진단 시스템을 들 수 있다. 딥러닝을 통한 진단 시스템이 하는 일은 의료 영상에서 병변이 발생한 부위를 찾고 질병이 있는지 없는지를 판단하는 것인데, 핵심은 사람이 이미 하고 있는 것을 딥러닝에게 시켜서 사람과 동일한 수준, 혹은 '조금 더 높은 수준' 을 얻고자 하는 것이다. 


하지만 이 논문에서 구현한 딥러닝 모델은 진단을 넘어 미래에 유방암이 발생할지 안할지를 예측하는 모델이다. 미래 유방암 발생 예측이 진단 시스템과 다른 점은 사람이 아직까지 사람이 하기 힘든 분야, 즉 정확도가 높지 않은 분야라는 것이다. 영상의학전문의는 의료 영상을 보고 현재 병 여부에 대해 진단할 수는 있지만, 미래에 유방암이 발생할 확률이 높은지 낮은지에 대해서 판단하는 것은 상대적으로 매우 힘들다고 할 수 있다. 


지금까지 유방암의 위험도 예측에 있어서 임상 정보, 예를 들어, BMI, 나이, 가족력, 과거력, 호르몬 치료 여부, 폐경 나이, 첫출산 나이 등을 통해 미래의 유방암이 발생할 확률이 어느정도일 것이다를 예측하고, 고위험군에 속하는 사람들에게 주의를 주는 식으로 예방이 이루어졌다. 이 논문의 내용은 이러한 임상정보 기반 유방암 예측에 비해 유방 영상 기반의 위험도 평가가 더 정확하다는 것이다. 


데이터 수집


이 논문에서는 2009년 1월 -  2012년 12월 31일에 수집된 60886 명의 환자 (134924 개의 검진자료)에 대해서 연구가 수행되었다. 이 환자들 중, 5년 안에 유방암 (ductal carcinoma in situ or invasive breast carcinoma) 이 발생한 환자를 case 로, 또한 최소 5년 이상 follow-up 이 되었고, 5년 안에 유방암이 발생하지 않은 환자를 control 로 정의하였다. 


데이터 분할 및 분포


위 기준에 맞는 총 39558 명 (89112 개 검진자료) 을 트레이닝 셋 31,806 명, 검증 셋 3,804 명, 테스트셋 3,978 명으로 7:1.5:1.5  의 비율로 나누었다.


이미지 전처리


의영상 데이터 포맷은 Dicom 포맷이 주로 활용된다. Python 에서는 Dicom 포맷을 다룰 수 있는 패키지로는 pydicom 패키지가 많이 사용되는데, 이 논문에서는 DCMTK 이라는 프로그램을 통해 이미지 전처리를 수행했다. Dicom 파일을 PNG16 형태로 바꾸는 작업을 수행하였는데, 이 때 PNG16은 각 픽셀을 최대 16bit 로 나타내는 방법을 의미한다. 즉, gray-scale 이미지로서 각 픽셀이 0~65535 의 값을 갖는 이미지의 형태이다. 


위험도 예측 모형


이 논문에서는 총 4개의 유방암 위험도 예측 모형을 구축한 뒤 그 예측력을 비교한다. 한 가지 유의할 점은, 이 논문에서는 사람을 단위로 위험도 예측력을 비교한 것이아니라, 검진자료를 기준으로 위험도 예측력을 비교하였다. 


(1) Tyrer-Cuzick Model 


Tyrer-Cuzick Model (TC model) 은 Tyrer와 Cuzick 이라는 사람이 개발한 유방암 위험도 예측 모형으로, 일반적인 임상 정보 기반의 모형이다 (링크). GUI 프로그램 형태로 이용할 수 있는데, 이 논문은 연구자용 Command-line 프로그램을 이용해 유방암 위험도를 예측했다. 이 프로그램은 크게 세 가지 결과를 내준다. 


1) 85세까지 유방암 발생 위험을 동일한 나이의 일반 여성과 비교한 결과 

2) 10년 위험도 

3) 평생 위험도 


이 논문에서 따로 언급을 하고 있지는 않지만, 아마 10년 위험도를 결과로 이용했을 것으로 추정된다. 


(2) Risk Factor Logistic Regression Model (RF-LR)


두 번째로는, Risk factor 기반 Logistic regression model 을 만들었다. 이것이 Tyrer-Cuzick Model 과 다른점은 크게 두 가지로 볼 수 있다. 


1) RF-LR 모델은 현재 데이터를 통해 LR model 의 계수를 추정한다. 

2) TC 모델에 사용된 변수에 Prior history of breast cancer, Race 두 가지 변수를 추가하였다. 


일반적으로, 외부 데이터의 계수를 이용한 예측 모형의 경우 예측력이 높기는 쉽지 않다. TC model 은 유명한 유방암 위험도 예측모형이긴 하지만, 현재 데이터를 통해 모형을 구축하는 것이 더 예측력이 높을 것임을 예측해볼 수 있다. 이 때, Feature engineering 방법으로 연속형 변수를 포함한 모든 변수를 범주화한 후, one-hot encoding 을 이용하였다. 이렇게 한 이유는 아마 missing value 가 많았기 때문으로 예측된다. one-hot encoding 의 장점은 missing value 에 대해 모든 값을 0으로 주면 되기 때문에, imputation 등의 step 이 필요없이, 간단히 missing 을 고려한 데이터의 패턴을 찾을 수 있기 때문이다. 



위 표처럼 모든 변수를 범주화하였다. 논문에서 범주를 나누는 기준에 대한 언급은 없었다. 


(3) Image-only model


이 모델에 딥러닝 모델인 Resnet18 이 이용되었다. Resnet18 은 18 개의 레이어를 가진 Resnet 을 말하며 Imagenet 데이터로 트레이닝된 pretrained model을 이용하였다고 한다. 아래는 일반 CNN 과 비교하여 Resnet 의 아이디어를 나타낸 그림이다. Resnet 관련해서는 다른 포스트에서 한 번 다루어 보려고한다. 


일반적인 Resnet 의 인풋사이즈는 224 x 224 인데, 이 논문의 이미지의 사이즈는 1664 x 2048 를 사용하였다. 어떻게 이미지를 resizing 해서 사용했는지에 대해서 자세한 설명은 언급하고 있지 않다. 딥러닝 모델은 앞서 데이터 수집 부분에서 정의한 기준에 따라 "유방암 5년 이내 발생 여부" 를 class 로 하여 트레이닝 되었다. 보통 유방암 검진에서는 한 사람당 총 4장의 이미지 (RCC,RMLO,LCC,LMLO)를 촬영하게 되는데, 이 모델에서는 이 중에 가장 위험도가 높게 나온 이미지를 이용해 위험도 평가를 하였다. 그리고 한 사람당 여러번의 검진을 받을 수 있는데, 만약 2번의 검진을 받았으면 총 8장의 이미지 중 가장 위험도가 높게 나온 이미지를 이용했다고 보면 된다.  


(4) Hybrid DL model


다음은 RF-LR 와 Image-only model 을 결합하여 Hybrid DL model 을 구축하였다. 이 모델의 Input은 Risk factors 파트와 Image features 파트로 나누어 볼 수 있다. Risk factors 파트는 (2) 에서 이용한 feature 들을 그대로 가져왔고, image features 파트는 (3) 에서 구축한 image-only model 을 feature extractor 로 이용해서 이미지를 수백개의 feature (일반적으로 resnet 의 최종 feature 는 512개) 로 요약해 이를 risk factor 와 concatenate 시켜 모델의 인풋으로 투입했다. 


그 뒤로는 일반적인 Supervised neural network 를 구축해 "유방암 5년 이내 발생 여부" 를 예측했다. 



모델 평가


이 논문에서는 크게 3가지의 지표로 모델을 평가하였다. 


1) AUC (Area under curve) : AUC 의 경우, Future risk 를 구하기 위해 검진 이후 최소 3년 ~ 5년 내 유방암 발생을 case 로 하여 예측력을 구했다. 전체 테스트셋에 대한 AUC 를 4개의 위험도 모형에서 비교하였고, 또한 (인종, 가족력, 폐경여부) 로 층화하여, 각각 4개의 위험도 모형을 비교하였다. 

2) Confusion Matrix 

3) Top-decile, bottom-decile Hazard ratio & incidence 



결과


- 전체 테스트셋 (15%) 에 대한 위험도 평가 결과 


샘플 수 : 총 3937명 중 269명 case 

  • Hybrid DL 모델은 TC 모델, RF-LR 모델에 비해 AUC 가 유의하게 높았다. (DeLong test 결과)
  • Image-only 모델은 TC 모델에 비해 AUC 가 유의하게 높았다. 
  • Decile 분석에서 Hybrid 가장 좋은 성능을 보여주었다. (특히 classic model 인 TC 모델에 비해 Top decile 과 Bottom decile 에서의 성능이 매우 좋다.)

- 하위그룹 단위 (인종, 가족력, 폐경 여부) 위험도 평가 결과


  • 인종별 분석 : 백인 (총 3157명 중 233명 case) 과 아프리카계 미국인 (총 202명 중 11명 case)에 Hybrid DL 모델을 적용해 AUC 는 각각 0.71, 0.71 이였고, TC 모델의 경우, 0.62, 0.45 였다. TC 모델의 경우 인종별로 예측력이 상당한 차이를 보이는 잔면, Hybrid 모델은 인종에 상관없이 비슷한 예측력을 갖는다는 것을 알 수 있다. 또한 RF-LR 모델로 비교를 해보아도 AUC가 0.66, 0.58 로 Risk factor 기반의 모델에서 아프리카계 미국인은 예측력이 떨어지는 경향이 있는데, Image-only 모델과 Hybrid 모델은 이와 반대로 인종 별로 Robust 한 결과를 보여준다. 하지만 아프리카계 미국인의 샘플 수가 매우 작기 때문에, 다소 confidence interval 이 크다는 것을 알 수 있다. 
  • 가족력별 분석 : 가족력이 있는 사람 (총 1767 명 중 141명 case) 과 가족력이 없는 사람 (총 2170명 중 128명 case) 에 대해 예측력을 비교하였다. 가족력이 있는 사람의 경우, TC 와 Hybrid DL 의 AUC 증가값을 유의했다. 하지만 가족력이 없는 사람의 경우, TC 와 Hybrid DL 의 AUC 증가값은 유의하지 않았다.
  • 폐경 여부 별 분석 : 폐경전 여성 (1649 명 중 62명 case, figure에 오류가 있음), 폐경 여성 (2513명 중 207명  case) 별로 나누어 분석을 한 결과, Hybrid 모델은 각각 0.79, 0.70 의 AUC 를 보인 반면, TC 모델의 경우 각각 0.73, 0.58 로 폐경후 여성에 대해서는 예측력이 낮게 나타났다. 


Confusion matrix 를 통한 분석에서는 Hybrid model 의 예측력을 density 와 TC model 과 비교하여 보여주고 있다.  


Hybrid DL vs. breast density. 


결과를 보면 Hybrid DL 이 Breast density 에 비해 더욱 유방암 위험도에 관한 많은 정보를 준다는 것을 알 수 있다. row 별로 변하는 incidence 의 차이보다, column 별로 변하는 차이가 더 크다는 것을 볼 수 있다. 현재까지 맘모그램에서 확인할 수 있는 유방암 발생의 위험요인으로 가장 잘 알려진 것이 유방 밀도인데, 딥러닝 모델이 유방밀도를 넘어서는 유방의 특성을 찾아냈다고 해석할 수 있다. 왼쪽에서 두 번째 그림, High Risk, Non Dense 그림을 보면, breast density 가 낮은데도 불구하고 높은 위험도를 보이는 유방 영상의 예를 보여주고 있다. 

Hybrid vs. versus TC. 


TC 모델에 의해 높은 위험도를 갖는다고 예측되고, Hybrid DL 모델에 의해 낮은 위험도를 갖는다고 예측된 그룹은 1.6 %의 incidence 를 보였다. 반면, Hybrid 모델에 의해 높은 위험도를 갖는다고 예측되고, TC 모델에 의해 낮은 위험도를 갖는다고 예측된 그룹은 3.7 % 의 incidence 를 보여주었다. 단지 이 결과만 보더라도, Hybrid 모델이 TC 보다 유방암 위험도를 더 잘 예측한다는 것을 직관적으로 알 수 있다. 


고찰


요약 

  • Hybrid DL (딥러닝 기반 이미지 분석+Risk factor) 모형이 기존 클래식한 유방암 위험도 평가 모델에 비해 좋았다 (AUC 0.70 vs. 0.62). 
  • Hybrid DL 을 사용하면 고위험군을 효과적으로 선별할 수 있다. 
  • 또한 기존 유방암 예측모형의 경우 대부분 백인을 대상으로 구축된 것이기 때문에, 다른 인종에 대해 유방암을 예측할 때 한계가 있었는데, Hybrid DL 모델 또는 Image-only model 모두 인종에 robust 한 유방암 예측력을 보여주었다. 

연구의 의미 

  • 굳이 Hybrid LD 이 아니더라도 이미지만을 통해서 유방암 위험도를 예측했을 때, Risk factor 기반 모형보다 예측력이 좋았다.
  • Image-only 모델은 임상정보를 모두 번거롭게 수집할 필요가 없이, 유방암 검진 과정에서 유방 영상에 즉각적으로 사용할 수 있기 때문에 실제 적용이 어렵지 않다.
  • 현재 미국에서는 유방암 검진을 받는 여성에게 유방밀도를 의무적으로 공지해야하는 법안이 있는데, 50 % 정도의 여성이 치밀유방이기 때문에 유방암 위험도가 더 높다고 전달받는다. Image 기반의 위험도 예측모형이 적용된다면 보다 정밀한 위험도 공지가 가능할 것이다. 
  • 만약 다른 위험인자들을 수집할 수 있다면, 이미지 모델과 결합해 Hybrid model 처럼 더 정밀하게 위험도를 예측할 수 있을 것이다. 


향후 연구 과제


  • 이 연구에서 BRCA1/2 유전자를 변수로 포함하기는 했으나, 대부분의 경우 값이 없었다. 따라서 대규모 유전자 정보 (gene panel) 를 결합을 했을 때도 이러한 이미지 기반 위험도 평가가 가능할지에 대한 것도 향후 연구 과제이다. 
  • 이 연구로 알 수 있는 것은 이미지가 무언가 유방암 위험도 예측에 상보적인 정보를 준다는 것인데, 이것이 무엇인지가 중요한 주제이다. 논문에서는 단순히 유방 밀도을 통해서 딥러닝이 위험도를 예측하지 않는다고 주장하고 있고, 매우 세밀한 조직 패턴에 의존하는 것이 아닌가 추측하고 있다. 
  • 최근 딥러닝 연구에서 어떤 부분이 딥러닝의 판단에 영향을 주는지 localiazation 하는 것이 중요한 연구 주제이며, 이와 관련된 다양한 방법들이 많이 제시가 되고 있기 때문이 이를 이용하여 맘모그램의 어떤 부분이 informative 한지를 연구하는 것이 향후 연구 과제이다. 

연구 한계 및 결론

  • 이 연구의 한계는 한 기관의 데이터, 그리고 한 제조사의 유방 영상만 이용한 것이다. 실제로 임상에서 활용되기 위해서는 더 많은 기관, 더 많은 유방영상 촬영기기 제조사 데이터를 이용해서 검증될 필요가 있다.  
  • 이 연구의 새롭게 찾은 결론으로 볼 수 있는 것은, 유방 영상에는 traditional risk factor 에서 찾을 수 없는 미래 유방암 발생을 예측할 수 있는 정보가 있고, 이러한 패턴을 딥러닝이 찾아낼 수 있었다는 것이다.
  • 또한 결과로 미루어보아 유방영상 기반 모델이 전통적인 위험도 예측모형을 대체 혹은 보완할 수 있는 잠재력이 있다고 할 수 있다. 


반응형
반응형

딥러닝에서 클래스 불균형을 다루는 방법


현실 데이터에는 클래스 불균형 (class imbalance) 문제가 자주 있다. 어떤 데이터에서 각 클래스 (주로 범주형 반응 변수) 가 갖고 있는 데이터의 양에 차이가 큰 경우, 클래스 불균형이 있다고 말한다. 예를 들어, 병원에서 질병이 있는 사람과 질병이 없는 사람의 데이터를 수집했다고 하자. 일반적으로 질병이 있는 사람이 질병이 없는 사람에 비해 적다. 비단 병원 데이터뿐 아니라 대부분의 "현실 데이터" 에 클래스 불균형 문제가 있다. 


클래스 균형이 필요한가?


왜 데이터가 클래스 균형을 이루어야할까? 그리고 언제 클래스 균형이 필요할까? 핵심은 다음과 같다. 클래스 균형 클래스 균형은 소수의 클래스에 특별히 더 큰 관심이 있는 경우에 필요하다. 


예를 들어 현재 재정 상황 및 집의 특성 등을 토대로 집을 사야할지 말아야할지를 예측하는 모델을 만들고 싶다고 하자. 사지말라고 예측하는 것과 사라고 예측하는 것은 그 무게가 다르다. 집을 사라고 예측하는 것은 훨씬 더 큰 리스크를 수반한다. 잘못된 투자는 큰 손실로 이루어질 수 있기 때문이다. 따라서 '집을 사라' 라고 예측하는 것에 대해서는 더 큰 정확도를 가져야한다. 하지만 데이터가 '집을 사지마라' 클래스에 몰려있는 경우, '집을 사지마라' 예측에 있어서는 높은 정확도를 가질 수 있어도 '집을 사라' 라고 예측하는 것에 관해서는 예측 성능이 좋지 않게 된다. 따라서 클래스 불균형이 있는 경우, 클래스에 따라 정확도가 달라지게 된다. 이를 해결하기 위해서는 따라서 '집을 사라' 클래스에는 더욱 큰 비중 (weight) 를 두고 정확한 예측을 할 수 있도록 만들어야한다.   


만약 소수 클래스에 관심이 없다면 어떻게 할까? 예를 들어, 이미지 분류 문제를 예로 들어보자. 그리고 오직, 전체 예측의 정확도 (accuracy) 에만 관심이 있다고 하자. 이 경우에는 굳이 클래스 균형을 맞출 필요가 없다. 왜냐하면 트레이닝 데이터에 만에 데이터를 위주로 학습하면, 모델의 정확도가 높아질 것이기 때문이다. 따라서 이런 경우에는 소수 클래스를 무시하더라도 전체 성능에 큰 영향을 주지 않기 때문에, 클래스 균형을 맞추는 것이 굳이 필요하지 않다고 할 수 있다. 


클래스 균형이 필요한 상황과 불필요한 상황을 예로 들어 설명했다. 다음으로는 딥러닝에서 클래스 균형을 맞추기 위한 두 가지 테크닉을 소개한다. 


(1) Weight balancing


Weight balancing 은 training set 의 각 데이터에서 loss 를 계산할 때 특정 클래스의 데이터에 더 큰 loss 값을 갖도록 하는 방법이다. 예를 들어, 이전 예에서 집을 사라는 클래스에 관해서는 더 큰 정확도가 필요하므로, 트레이닝 할 때, 집을 사라는 클래스의 데이터에 관해서는 loss 가 더 크도록 만드는 것이다. 이를 구현하는 한 가지 간단한 방법은 원하는 클래스의 데이터의 loss 에는 특정 값을 곱하고, 이를 통해 딥러닝 모델을 트레이닝하는 것이다.  


예를 들어, "집을 사라" 클래스에는 75 %의 가중치를 두고, "집을 사지마라" 클래스에는 25 %의 가중치를 둘 수 있다. 이를 python keras 를 통해 구현하면 아래와 같다. class_weight 라는 dictionary 를 만들고, keas model 의 class_weight parameter 로 넣어주면 된다. 


import keras

class_weight = {"buy": 0.75,
                "don't buy": 0.25}

model.fit(X_train, Y_train, epochs=10, batch_size=32, class_weight=class_weight)


물론 이 값을 예를 든 값이며, 분야와 최종 성능을 고려해 가중치 비율의 최적 세팅을 찾으면 된다. 다른 한 가지 방법은 클래스의 비율에 따라 가중치를 두는 방법인데, 예를 들어, 클래스의 비율이 1:9 라면 가중치를 9:1로 줌으로써 적은 샘플 수를 가진 클래스를 전체 loss 에 동일하게 기여하도록 할 수 있다. 


Weight balancing 에 사용할 수 있는 다른 방법은 Focal loss 를 사용하는 것이다. Focal loss 의 메인 아이디어는 다음과 같다. 다중 클래스 분류 문제에서, A, B, C 3개의 클래스가 존재한다고 하자. A 클래스는 상대적으로 분류하기 쉽고, B, C 클래스는 쉽다고 하자. 총 100번의 epoch 에서 단지 10번의 epoch 만에 validation set 에 대해 99 % 의 정확도를 얻었다. 그럼에도 불구하고 나머지 90 epoch 에 대해 A 클래스는 계속 loss 의 계산에 기여한다. 만약 상대적으로 분류하기 쉬운 A 클래스의 데이터 대신, B, C 클래스의 데이터에 더욱 집중을 해서 loss 를 계산을 하면 전체적인 정확도를 더 높일 수 있지 않을까? 예를 들어 batch size 가 64 라고 하면, 64 개의 sample 을 본 후, loss 를 계산해서 backpropagation 을 통해 weight 를 업데이트 하게 되는데 이 때, 이 loss 의 계산에 현재까지의 클래스 별 정확도를 고려한 weight 를 줌으로서 전반적인 모델의 정확도를 높이고자 하는 것이다. 



Focal loss 는 어떤 batch 의 트레이닝 데이터에 같은 weight 를 주지 않고, 분류 성능이 높은 클래스에 대해서는 down-weighting 을 한다. 이 때, gamma (위 그림) 를 주어, 이  down-weighting 의 정도를 결정한다. 이 방법은 분류가 힘든 데이터에 대한 트레닝을 강조하는 효과가 있다. Focal loss 는 Keras 에서 아래와 같은 custom loss function 을 정의하고 loss parameter 에 넣어줌으로써 구현할 수 있다. 

import keras
from keras import backend as K
import tensorflow as tf

# Define our custom loss function
def focal_loss(y_true, y_pred):
    gamma = 2.0, alpha = 0.25
    pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))
    pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))
    return -K.sum(alpha * K.pow(1. - pt_1, gamma) * K.log(pt_1))-K.sum((1-alpha) * K.pow( pt_0, gamma) * K.log(1. - pt_0))

# Compile our model
adam = Adam(lr=0.0001)
model.compile(loss=[focal_loss], metrics=["accuracy"], optimizer=adam) 


(2) Over and under sampling


클래스 불균형을 다루기 위한 다른 방법은 바로 샘플링을 이용하는 것이다.


Under and and Over Sampling


예를 들어, 위 그림에서 파란색 데이터가 주황색 데이터에비해 양이 현저히 적다. 이 경우 두 가지 방법 - Undersampling, Oversampling 으로 샘플링을 할 수 있다. 


Undersampling 은 Majority class (파란색 데이터) 의 일부만을 선택하고, Minority class (주황색 데이터) 는 최대한 많은 데이터를 사용하는 방법이다. 이 때 Undersampling 된 파란색 데이터가 원본 데이터와 비교해 대표성이 있어야한다. Oversampling 은 Minority class 의 복사본을 만들어, Majority class 의 수만큼 데이터를 만들어주는 것이다. 똑같은 데이터를 그대로 복사하는 것이기 때문에 새로운 데이터는 기존 데이터와 같은 성질을 갖게된다.  


Reference

https://towardsdatascience.com/handling-imbalanced-datasets-in-deep-learning-f48407a0e758

https://towardsdatascience.com/methods-for-dealing-with-imbalanced-data-5b761be45a18

반응형
반응형

Adaptive Histogram Equalization 이란 무엇인가? 


Adaptive Histogram Equalization (AHE) 이란 이미지 전처리 기법으로 이미지의 contrast 를 늘리는 방법이다. Histogram Equalization (HE) 방법을 조금 더 개선해서 만든 방법이라고 할 수 있는데, 그 차이점은 HE 는 하나의 histogram 을 통해 uniform 분포를 가정한 equalization 을 수행하는 반면, AHE 는 여러개의 histogram 을 만든다는 차이점이 있다. HE 의 문제점은 하나의 histogram 으로 pixel intensity 의 redistribution 을 수행하므로, pixel intensity 의 분포가 이미지의 전 범위에 걸쳐서 동일해야 적절히 수행될 수 있는 방법이다. 만약 이미지의 일부분이 다른 지역과 비교해 다른 분포를 갖고 있을 경우, HE 를 적용한 이미지는 왜곡된다. 




AHE 방법은 이미지를 grid 를 이용해서 여러 개로 쪼개고 이 쪼갠 이미지에 대해서 각각 HE 를 적용한다. 따라서 그 grid 안에서 이미지의 contrast 가 좋아지기 때문에 이미지의 local contrast 를 조정하기에 좋은 방법이라고 할 수 있다. 위 그림처럼 어떤 pixel 의 AHE 를 적용한 값은 각 box 안에서 HE 를 수행한 값이다. 경계에 위치한 pixel 에 대한 transformation 은 특별하게 다루어지는데, 그 반대편에 위치한 pixel 값들을 mirroring 함으로써 가상의 픽셀 값을 만든 후, AHE 를 적용하게 된다. 


AHE 의 단점은 어떤 grid 안에 있는 pixel intensity 들이 매우 좁은 지역에 몰려있는 경우에 발생한다. 이 경우 AHE 는 매우 좁은 지역에 위치해 있는 pixel intensity 들을 넓은 지역으로 퍼트리기 때문에 이 안에 다른 지역과 매우 작은 차이를 보이는 noise 가 있다고 하더라도 상당한 크기의 peak 를 만들어내게 된다. 예를 들어, 8x8 grid 안에서 하나의 pixel 이 1이고 나머지는 0인 경우, 1이 255로 변환이 되게 된다. 즉, 의미 없는 pixel 의 값이 크게 변화되는 문제가 생긴다. 이를 noise amplification 이라고 부르기도 한다. 또한 의미없는 지역의 pixel intensity 를 enhance 시키기도 한다. 즉, 이로 인해 원래 이미지에 왜곡이 생기게된다. 


Contrast Limited Adaptive Histogram Equalization 



Adaptive Histogram Equalization 과 늘 따라다니는 것이 Contrast limited adaptive histogram equalization (CLAHE) 방법이다. 이 방법은 AHE 의 변형으로 AHE 의 중대한 문제점인 noise amplification 을 해결하기 위해 contrast limit 을 활용한다. 만약 pixel intensity 가 좁은 구역에 몰려있다면, 아래와 같은 두 가지 현상이 생긴다. 


  1. 그 부근에서 slope of cdf 가 급격하게 증가한다.

  2. histogram의 높이가 매우 높다.


1, 2 는 결국 같다. slope of cdf 가 급격하게 증가하는 부분이 histogram 의 높이가 높은 지점이다. 따라서 CLAHE 방법은 위 그림과 같이 cdf 를 계산하기 전에 histogram 에 높이에 제한을 걸어 특정 높이 이상에 있는 pixel 값들을 redistribution 하는 과정을 먼저 거치게 된다. 이 때 histogram 의 높이를 제한하는 값을 clip limit 이라고 부른다. redistribution 이후에, 다시 clip limit 의 값을 초과할 수 있는데, 이를 그대로 놔두고 할 수 있지만, 제거하고 싶은 경우, 반복적으로 redistribution 을 실시한 후, 초과하는 pixel 값들이 무시할만 한 정도까지 반복할 수 있다. 결국 이러한 과정은 cdf function 의 기울기가 너무 높지 않게 제한한다. 최종적으로 가상의 cdf 함수를 구할 수 있고, 이를 통해 HE 를 적용하면 CLAHE 를 적용한 이미지를 얻을 수 있다. 


그러면 이 이미지는 좁은 범위에 pixel intensity 가 몰려 있는 경우 생기는 noise 에 robust 하도록 만든다. 왜냐하면 몰려 있는 픽셀의 값을 redistribution 을 하기 때문에 급격한 기울기가 없는 cdf를 통해 pixel intensity 를 변환하기 때문에 noise 의 pixel intensity 를 너무 큰 값으로 변환시키지 않도록 만든다. 그렇기 때문에 CLAHE 를 실시한 후의 local region 의 pixel intensity 가 0~255 사이에 위치해 있는 것이 아니라, 더 좁은 범위에 몰려 있게 만들 수 있다. 즉 CLAHE 를 사용했을 때 장점은, contrast 가 낮은 지역에 위치한 noise 에 robust 하도록 변환함으로써, 변환된 이미지가 실제 이미지와 비슷한 특성을 갖도록 만드는 것이다. 


참고

https://en.wikipedia.org/wiki/Adaptive_histogram_equalization

반응형
반응형

Histogram Equalization 이란 무엇인가? 


IDEA



Histogram equalization (HE) 은 이미지를 전처리하는 방법이다. 위 그림만 보고도 HE 의 기본적인 아이디어를 알 수 있는데, HE 는 이미지의 contrast 가 적을 때 매우 유용하게 사용할 수 있는 방법이다. "Before Histogram Equalization" 이미지는 contrast 가 매우 떨어진다는 볼 수 있다. 오른쪽 histogram 을 보면 이미지 픽셀이 0~255에 고르게 퍼져있는 게 아니라, 일부분에 몰려있다는 것을 확인할 수 있다. "After Histogram Equalization" 을 보면, 이미지의 contrast 가 증가한 것을 확인할 수 있다. 이렇게 이미지의 밝기를 조정하는 것이 HE 로, HE 이후에는 밝기가 0~255 사이에 고르게 분포함을 알 수 있다. 이는 Cumulative density function (cdf) 을 통해 볼 수 있는데, 0~255 사이에서 cdf 가 일직선 형태를 나타내게 된다. 



Formula

L = 266 (일반적으로 0~255 사이에서 pixel intensity 를 표현하기 때문에)    


Example

 

HE 를 실제로 하는 방법은 해당 pixel intensity 의 cdf function 값을 구한 후, 0~255 사이의 uniform 분포에 맞게 값을 변환을 시켜서 넣어주면 된다. 예를 들어, 총 픽셀 수가 64 인 이미지가 있다고 하자 이 이미지에서 가장 낮은 pixel intensity 는 52 이다. 이를 어떻게 변환하는지를 보면 cdf(v) = 1, cdf_min = 1 MxN=64, cdf_min = 1, L-1 = 255 이고 분자가 0이므로 값은 0이 된다. pixel intensity 가 55 일 때, cdf(v) = 4, cdf_min = 1, MxN = 64 이므로, h(v) = 12 이다. cdf_min 은 cdf(v) 중 가장 작은 값으로 이 값을 분자 분모에서 빼주는 이유는 h(v) 를 0부터 시작하도록 하기 위함이다. 


v, Pixel Intensitycdf(v)h(v), Equalized v
5210
55412
58620
59932
601036
611453
621557
631765
641973
652285
662493
672597
6830117
6933130
7037146
7139154
7240158
7342166
7543170
7644174
7745178
7846182
7948190
8349194
8551202
8752206
8853210
9054215
9455219
10457227
10658231
10959235
11360239
12261243
12662247
14463251
15464255


참고

https://en.wikipedia.org/wiki/Histogram_equalization


반응형
반응형


Linearly weighted kappa 란 무엇인가?



Formula


$$ k_w = (P_0 - P_e) / (1 - P_e) $$



사용하는 이유


두 명의 측정자 (rater) 의 일치도를 평가 (inter-rater agreement) 할 때 쓰이며, 측정치가 순서가 있는 정성적 지표 (ordinal categorical variable) 일 때 쓰인다.  그냥 kappa coefficient 대신에 linearly weighted kappa 를 사용하는 이유는, 이러한 순서형 척도 변수에서 근접하게 측정된 값을 그냥 버리기 아깝기 때문에 이를 고려해서 일치도를 평가하기 위함이다. 


방법


P_0 =  proportion weighted observed agreement

P_e =  proportion weighted chance agreement


위의 두 값을 구하면 된다. 이를 위해 우선 아래와 같은 weight matrix 를 생성한다.  weight matrix는 측정치가 5개의 범주로 나누어지는 경우 아래와 같이 구할 수 있다. 



두 명의 측정자의 측정치가 아래와 같다고 한다. 예를 들어, 아래 테이블은 측정자 A와 측정자 B가 동시에 1이라고 판단한 경우는 8건이고 이는 전체의 0.07 이며, 측정자 A가 1, 측정자 B 가 2라고 판단한 경우는 2건으로 전체의 0.02 임을 의미한다.  





이 때, $$ P_0 = 0.07 * 1 + 0.02 * 0.75 + 0.009 * 0.5 + 0.026 * 0.75 + 0.09 * 1 ... + 0.02 * 1 = 0.93 $$ 로 구할 수 있다.


또한, $$ P_e =1 *(0.094 * 0.094) + 0.75 * (0.094 * 0.1709) + 0.50 * (0.094 * 0.530) ... + 0.02 * (0.0171*0.0171) = 0.78 $$ 로 구할 수 있다. 


결국 $$ k_w = (P_0 - P_e) / (1 - P_e) = (0.93 - 0.78) / (1 - 0.78) = 0.68 $$




Reference

http://www.anestesiarianimazione.com/DWLDocuments/The%20Linearly%20Weighted%20Kappa.pdf



반응형
반응형