분류 전체보기 (303)

Pandas 에서 반복을 효율적으로 처리하는 방법


Pandas 를 통해 데이터 프로세싱을 할 때 종종 해야할일은 행에 반복적으로 접근을 하면서 그 값을 조작하는 일이다. 예를 들어, missing value 가 0 으로 코딩이 되어있는데, 이를 다른 값으로 바꾸고 싶을 경우 또는 A 컬럼의 값이 missing 일 때, B 컬럼의 값을 수정하고 싶은 경우 등이 있다. 이러한 작업을 하기 위해서는 모든 행을 조회 하면서 값을 조회하고 수정하는 일이 필요하다. 이번 포스팅에서는 이러한 반복작업이 필요한 상황에서 어떤 방법이 가장 효율적일지에 대해 정리해보려고한다.


사용할 데이터

diabetes.csv


1) pd.iterrows()


가장 기본적이고 많이 사용하는 방법이 iterrows 함수를 이용하는 것이다. 하지만 iterrows 함수는 다른 방법에 비해 느린 편이다. 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

diabetes = pd.read_csv("diabetes.csv")
diabetes.head()


PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAgeOutcome
061487235033.60.627501
11856629026.60.351310
28183640023.30.672321
318966239428.10.167210
40137403516843.12.288331


missing value 가 0 으로 코딩이 되어있는데, 이를 nan 으로 바꾸는 코드를 iterrows 를 이용해서 짜보자. 

def fix_missing(df, col):
    for i, row in df.iterrows():
        val = row[col]
        if val == 0:
            df.loc[i, col] = np.nan

%timeit fix_missing(diabetes, "SkinThickness")


33.9 ms ± 1.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)



2) pd.loc[]/pd.iloc[]


두 번째 방법은 index 를 통해 for 문을 돌면서, loc 또는 iloc 함수를 이용해 dataframe의 row에 접근하는 방법이다. 

def fix_missing2(df, col):
    for i in df.index:
        val = df.loc[i, col]
        if val == 0 :
            df.loc[i, col] = np.nan

%timeit fix_missing2(diabetes, "Insulin")


9.54 ms ± 130 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)


1) iterrow 방법에 비해 약 3배 빨라졌다는 것을 알 수 있다. 따라서 iterrows 가 익숙하다고 하더라도 다른 방법으로 바꾸는 것이 같은 작업을 더 빠르게 실행할 수 있어 효율적이다.  


3) pd.get_value()/pd.set_value()


다음은 위 방법과 마찬가지로 index를 통해 for 문을 돌면서 get_value 와 set_value 함수를 이용하는 방법이다. 2) 방법이 내부적으로 get_value, set_value를 호출하는 것이기 때문에 3) 이를 직접적으로 호출하는 방법이므로 더욱 빠르다. 

def fix_missing3(df, col):
    for i in df.index:
        val = df.get_value(i, col)
        if val == 0:
            df.set_value(i, col, np.nan)

%timeit fix_missing3(diabetes, "BMI")


3.65 ms ± 31.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


2)에 비해 3배 정도 빨라졌으며, 1)에 비해서는 거의 10배 정도의 속도차이가 난다. 


4) pd.apply()


네 번째 방법은 apply 를 이용하는 것이다. apply 를 이용하는 것은 특별한 형태의 function 을 필요로 하는데 (이를 helper function 이라고도 한다), 이것은 Series 혹은 Dataframe의 각 원소마다 적용시킬 함수이다. 

def fix_missing4(x):
    if x == 0 : 
        return -999
    else: return x
    
%timeit diabetes.Age.apply(fix_missing4)
483 µs ± 3.89 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3) 방법과 비교하여 3650/484 = 7.5 배 속도가 증가했다. apply 함수를 이용하는 것의 장점은 작업이 "비교적 간단할 때" 유용하다. 만약, 여러개의 column 에서 if 문을 적용하서 값을 다이나믹하게 바꾸어야하는 작업에 있어서는 apply 함수보다 for 문을 이용하는 방법이 더 적절할 수 있다. 

정리 
  • Default 방법으로 index 를 돌면서 set_value 와 get_value 를 호출하는 방법을 추천
  • 비교적 큰 데이터에셋에서 비교적 간단한 작업을 할 때, apply 함수가 가장 효율적


참고

https://medium.com/@rtjeannier/pandas-101-cont-9d061cb73bfc

  • 죠옹 2020.04.24 04:02 신고

    유용한 글 잘 읽고 갑니다!

  • 티비다시보기 2020.06.11 16:11

    많은 것을 배워갑니다

  • kann 2020.09.17 22:43

    좋은 글 감사드립니다.
    글 중 pd.get_value() 는 안되길래 찾아봤더니 pd.at()으로 대체되었더군요.
    따라서 하시다 막히시는 분들은 참고하세요.

    • 슨년 2020.10.12 14:02

      지나가다 댓글 남깁니다. 저도 막혀서 찾아보니 get_value()가 deprecated라고 하네요. at[]이나 iat[]사용하라고 합니다. 출처 남깁니다.
      https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.get_value.html

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

  • GyeongHo Kim 2020.08.27 19:55

    좋은 정보와 글 감사합니다

  • 김병현 2021.05.09 16:28

    많은 도움 됐습니다.

영어 학술 프리젠테이션에서 자주 쓰는 문구 정리


본 포스팅에서는 학술 영어의 특징과 영어 학술 프리젠테이션에서 자주 쓰이는 문구를 정리해보고자 합니다. 물론 중요한 것은 내용이겠지만 자주 쓰이는 표현을 익혀둔다면, 내용과 내용사이의 연결을 매끄럽게 할 수 있을 것이고, 전달력 좋은 프리젠테이션을 할 수 있을 것입니다. 


학술 영어의 특징


학술 영어의 특징은 아래와 같이 정리해볼 수 있습니다. 
  • 학술영어는 구어체보다는 형식적인 언어를 사용한다. 
  • I 를 피하고, 제 3자의 입장인것처럼 쓴다. (수동태를 많이 쓴다.)
  • 객관적이고, 공정한 표현을 쓴다.
  • 단정적인 표현을 삼가하고, 조심스러운 표현을 많이 쓴다. 

아래에 프리젠테이션의 각 단계 별로 자주 쓰이는 표현을 정리하였으며, 내용들은 https://englishforuniversity.com 을 참고하여 작성 되었습니다. 

Introduction


Greeting your audience, introducing yourself and giving the topic of your presentation. 

  • My name’s ............. and I’m going to talk about ... 
  • Good morning everybody. 
  • Thank you for coming to my talk today. 
  • My name is …… and I’m from ... 
  • Hello. I’m .............. and welcome to my presentation about ...
  • Hello. My name’s .................... and today I’m going to be talking about ... 
  • I’d like to start by introducing myself. 
  • My name’s … and the topic for my presentation today is … 
  • The theme of my talk is … 
  • My presentation this morning concerns … 
  • This afternoon I would like to talk to you about … 
  • I shall be looking at the following areas:… 
  • What I’d like to do is to discuss ... 
  • I intend to discuss ... 
  • I hope to consider the main issues around ... 
  • This morning I am going to talk about an issue which concerns everyone … 
  • This presentation focuses on the issue of…


Justifying the topic of your presentation

  • There are many concerns regarding … 
  • … has been the subject of much debate recently and this is the topic of my presentation.
  • Recent research has shown that… 
  • Did you know...........? This is the reason for my talk today. ... 
  • and this is the theme for my presentation today. 
  • … so the purpose of my presentation today is to inform/discuss/present/analyse … 
  • … is a growing problem in the world. For this reason I intend to focus on the issue of …


Giving the outline of your presentation

  • Firstly, I’m going to look at ... 
  • Secondly, I’ll move on to the issue of ... 
  • Then I’ll move on to examine ... 
  • Lastly/Finally, I’ll look at / focus on ...
  • I have divided my talk into the following main areas: ... 
  • I am going to divide my presentation into two main parts. First I’m going to describe … 
  • and then I’ll move on to look at … 
  • And in this part of my presentation I’ll be showing you some data/charts/tables … 
  • I’ll also try to explain my findings … 
  • In the third part of my presentation I’ll put forward some ideas about … 
  • I’ll also be offering some recommendations on how we can solve/address/tackle the issues of … 
  • ...then I’m going to suggest some possible measures to solve these difficulties. We’ll finish off with a question and answer session. 
  • My talk will last about ........... minutes and there’ll be time at the end for questions. 
  • At the end of my talk, which will last about ten minutes, I’ll be happy to answer any questions you may have.
  • If you have any questions please do not hesitate to ask. 
  • Please just put your hand up if you would like to ask a question. 
  • I’d like the presentation to be as interactive as possible, so please chip in as we go along. 
  • I’ve got quite a lot to get through, so I’d appreciate it if you kept your questions until the end of the presentation. 
  • I’m happy to let you have any of the slides or information in my presentation if you would like. 
  • If you leave your contact details I’ll be happy to send you any of the information here. 


Main Parts


Introducing your first main point 

  • Now, I’m going to start by … 
  • Now I’d like to focus on … 
  • First we’re going to look at … 
  • Let’s start with … 
  • The first problem I’d like to focus on is that of … 
  • Turning then to my first point, ... 
  • To begin with I’d like to say a few things about… 
  • I’d like to begin by … 
  • OK, so let’s start by looking at .... 
  • I’d like to take a minute or two to define what exactly we mean by ... 
  • I’d like to mention three points here, ...


Referring to research

  • Researchers have identified three key issues here, they are … 
  • Researchers have shown quite conclusively that … 
  • A number of recent studies, notably the ones by … and …, have shown that … 
  • A number of studies have shown that ... 
  • A study by … shows that ... 
  • Research suggests/indicates that … 
  • According to … Figures from … show/suggest/indicate that ... 
  • A very interesting study by … shows that… 
  • The study by … is on your reading list and I encourage you to take a look at it. 
  • Basically, what he found was that … 
  • One of the most interesting studies carried out in this area by … showed that …


Referring to visual data

  • If you look at this table you can see that ... 
  • The data here shows that... 
  • Please take a handout and pass them on. 
  • There are some handouts coming round on … 


Presenting a point of view

  • Those in favour of … argue that … 
  • Advocates of … claim that ... 
  • Some people claim that … but others … 
  • Most people/scientists would argue that … 
  • I think it’s fair to say that ... 
  • Personally, I think there is overwhelming evidence that ... 
  • Evidence does seem to show that ...


Analysing an argument

  • Let’s take a closer look at the argument put forward by ... His main contention is that ... but he fails to consider ... 
  • Even if we accept the point that ... that still leaves the question of ... 
  • The argument put forward by ... doesn’t explain ... 
  • The weakness in this argument is that ... 
  • This point of view is very appealing because ...


Emphasizing important points

  • It must be remembered that … 
  • It should be emphasised that … 
  • I would like to draw your attention to this point …


Losing your way

  • Now, where was I? Oh yes, … 
  • If you’ll bear with me for a moment while I just glance at my notes, right, … 
  • Erm, I’ll just need a minute to sort out the technology and I’ll be with you ... 


Moving to another main point

  • OK, so now I’d like to turn to my next point, which is ... 
  • Moving on, I’d like to take a look at …. 
  • Now I’d like to move on to ... 
  • Now let’s turn to the issue of ... 
  • I’ll come back to that issue later... 
  • I want to turn now to ... 
  • Turning now to ... 
  • Moving on now to ... 
  • Having looked at ….. 
  • let’s now think about ... 
  • My next point is in regards to … T
  • hat brings me to … 
  • My final point is in regard to…


Making recommendations

  • Now I’d like to look at some of the measures that can be taken to alleviate the problems of … 
  • In order to solve these problems, the following action should be considered: ... 
  • Firstly, the government should … 
  • The most important thing that should be done to combat the problem of ... is... 
  • Other possible solutions would be to ...


Conclusion


Making conclusions and summarising your main points 

  • To conclude my presentation, ... 
  • In conclusion, ... 
  • To summarise the main points of my presentation … 
  • In view of the evidence I have presented I think it is fair to say that … 
  • After all is said and done I think we can conclude that … 
  • This is clearly a very complex issue but on the strength of the evidence I have seen I would say that …/it seems that …


Finishing your presentation

  • OK we’re coming to the end of the presentation so I’d just like to thank you for listening ... 
  • OK. That bring us to the end of my presentation. 
  • Thank you for listening. 
  • I hope you found it interesting. 


Questions


Asking for questions 

  • Would anyone like to ask any questions? 
  • I’m ready to take any questions now. 
  • If anyone has questions I’ll be happy to answer them. 


Answering questions

  • Thanks for your question ... 
  • Good question. I think ... 
  • That’s an interesting question! As I see it ... 
  • Yes, that’s an interesting point ...

Dealing with difficult questions 

  • Hmm, that’s a good question. I don’t have the information to answer that question right now, but I’d be happy to find out and get back to you later. 
  • I don’t think we have enough time to go into that right now, but I’ll be happy to speak to you one-to-one after the presentation if you would like. 
  • That’s an interesting point, but I do think I have shown that ... 


Asking questions to the presenter

  • Excuse me. Can you say a bit more about ... 
  • Can you repeat your point about ... 
  • Excuse me. I have a question about ...
  • I didn’t catch what you said about .... 
  • Can you repeat it please? 
  • Are you saying that ...? 
  • Can you suggest some reading on that topic?



출처

https://englishforuniversity.com


Presentation phrasebook.pdf


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

실제 능력과 남이 보는 능력 


「어떻게 능력을 보여줄 것인가?」 작가 잭 내셔 (1979~)


사람은 진짜 능력이 아니라 보이는 능력으로 판단 받는다. 이 책에서는 이를 2007년 최고의 바이올린 연주자인 조슈아 벨이 길거리에서 바이올린 연주를 하도록 한 실험을 통해 소개하였다. 유명한 연주자가 출근길 지하철에서 바이올린을 연주를 해도, 아무도 멈춰서서 그것을 감상하지 않았다. 이 실험에서 말하고자 하는 것은 아무리 최고의 능력을 갖고 있는 사람이더라도, 이 능력을 포장하지 않으면 사람들은 훨씬 덜 좋은 평가를 내린다는 것이다. 


실제 능력과 남이 보는 능력 (perceived competence)은 다르다. 이 책은 어떻게 하면 능력을 '포장' 해서 능력있고, 가치있어 보일 수 있는지에 대한 구체적인 방법을 제시한다. 사람은 '보이는 능력' 에 의해 평가 받기 때문에 능력을 잘 포장하는 것은 사회적 평판을 높일 수 있는 길이다. 


챕터 구성


1. 능력 있다는 평가를 이끌어 내는 법

2. 의심 많은 상사도 나를 믿게 하는 법

3. 나의 장점만 떠오르게 만든는 법

4. 운과 재능을 내 편으로 만드는 법

5. 마음을 훔치는 말하기 비법

6. 열마디 말보다 강력한 몸짓 사용법

7. 볼수록 매력 넘치는 사람들의 비밀

8. 아무도 흉내낼 수 없는 아우라는 만드는 법

 

이 책은 어떻게 능력을 보여줄 것인가? 라는 물음에 대해 위의 8개의 챕터로 구성하여 각 챕터에 대한 명확한 가이드를 제공한다. 본 포스팅에서는 이 중에서 몇 가지 인상 깊었던 부분을 정리해보려고 한다. 


열심히 일하는 것과 유능해 보이는 것


열심히 일하는 것은 나의 사회적 평판을 좋게하지 못할까? 이 책은 그렇지 않다고 말한다. 열심히 일하는 것이 중요하지 않다는 것은 아니다. 하지만 더 중요한 것은 "일을 잘해보이는 것" 이다. 사람들은 내가 열심히한 것에 관심이 없다. '내가 한 일' 이 아니라 '유능해 보이는지' 를 통해 평가하는 경우가 많다. 동일한 일이라고 하더라도, A 라는 사람은 열심히 밤을 새워 결과를 냈고, B 라는 사람은 대충 놀면서 결과를 냈다고 했을 때, 대부분의 사람은 B를 더 유능하게 평가한다. 즉, 동일한 결과물이 있을 때 '열심히 했다는 것' 은 오히려 그 사람의 유능함을 평가하는데 반대로 작용한다. 


신뢰성 있게 내가 한 것을 전달하는 방법


이 책의 모든 부분이 이러한 물음에 대한 간접적인 해법이 될 것이다. 하지만 챕터 5 의 어떻게 말하는 것이 사람의 마음을 움직이고 신뢰성 있게 보일 수 있는지에 대해 많은 도움을 줄 것이라 생각한다. 


  • 자신의 주장을 복잡하게 만들고, 숫자로 뒷받침하면 도움이 된다. 
  • 파워토킹을 할 것. 더듬는 말투, 과장된 존대법 등 군더더기를 걷어낼 것. 
  • 명료한 발음과 정확한 분절에 주의할 것.
  • 보통보다 조금 빠른 속도로 말해라.
  • 단조롭게 말하지 말고, 높은 어조와 낮은 어조를 번갈아 사용해라.
  • 보통보다 조금 더 큰 목소리로 말해라.
  • 자주 대화에 참여하되, 중간 정도의 시간을 써라.
  • 가장 중요한 논지를 내세우기 직전에 잠깐 침묵할 것!
  • 했던 말을 여러 번 되풀이하지 마라.
  • 상대방의 말을 끊지 마라.
  • 가능한 한 다양한 어휘를 사용해라.
  • 사투리는 충성심, 정직성 등을 어필해야 하는 경우에만 유리하다. 


첫 번째, '자신의 주장을 복잡하게 만들라.' 라는 것이 다소 직관과 거리가 멀어 보인다. 자신의 의견을 명료하게 말하면 듣는 사람에게 더 도움을 줄 수 있지 않을까? 하지만 말하기나 글쓰기의 목적이 단지, '능력있게 평가받기 위해서' 라면 자신의 주장을 다소 복잡하게 만들어, 듣는 사람이 이를 '스스로' 이해하게 만드는 것이 좋다는 것이 이 책의 주장이다. 


'파워토킹' 이라는 것은 '불필요한 요소' 가 없는 말하기를 말한다. 이 책에서 언급한 5가지 군더더기는 '강조하기', '망설임', '확인', '과도한 존대', '부가 의문문' 이다. 이러한 불필요한 요소가 많은 낮은 교육 수준 및 무능함을 연상시킨다. 즉,이러한 '군더더기'의 여부는 사회적 지위를 연상시키는 것으로 작용한다는 것이다 (참고). 


행동과 사회적 지위 평가


위의 '파워토킹' 의 예처럼, 사람의 행동은 사회적 지위를 평가하는 기준이 되기도 한다. 이 책의 챕터 8 '아무도 흉내낼 수 없는 아우라를 만드는 법' 에서는 어떻게 자신의 품격을 높이거나 높은 사회적 지위를 연상시키는 행동을 할 수 있는지에 대한 가이드를 제시한다. 

  • 관례를 따르지 않는 파격이 긍정적인 효과를 가져올 수도 있다. 단, 당신이 이미 높은 지위를 누리고 있는 경우에만!
  • 옷과 같이 당신을 둘러싼 모든 물건을 신중하게 고를 것.
  • 지루한 싸움을 피하고, 싸우기 좋아하는 사람들을 화해시켜라.
  • 남들이 너무 쉽게 접근하게 하지 마라.
  • 졸업장, 자격증, 상장 등을 눈에 띄게 전시할 것.
  • 가능한 한 전문 분야의 책을 집필해라.
  • 당신의 지적인 면모를 보여줄 '교양 게임' 을 벌일 것.
  • 높은 지위의 사람, 기관들과 함께 연상되도록 해라.
  • 권위를 지닌 존재와의 공통점을 만들어라.
  • 당신과 관계가 있는 모든 것을 찬양해라.


관례를 따르니 않는 파격적 등장에 관한 것은 '빨간 하이힐 효과' 를 예로 들 수 있다. 사람들은 오히려 후줄근한 모습으로 다니는 사람에 대해 유능하고 사회적 지위가 높은 사람이라는 평가를 내리기도 한다. 오히려 깔끔한 정장을 입고 다니는 사람에게는 상식과는 반대로 무능하다고 평가한다. 그리고 이러한 역설적인 평가는 '지적으로 뛰어난 집단 (혹은 적어도 자신이 똑똑하다고 생각하는 집단)' 으로 갈수록 그 경향이 심해진다.  빨간 하이힐 효과의 예는 많이 찾아볼 수 있다. 대표적으로 마크 저버커그는 맨발에 삼선 슬리퍼를 신고 다보스포럼 (세계 경제 포럼) 에 등장했다. 학회에서는 가장 많은 성과를 낸 학자들이 가장 편안한 복장으로 학회에 나타난다는 연구 결과도 있다. 왜 빨간 하이힐 효과가 발생할까? 핵심은 '관습과의 불일치' 이다. 관습과의 불일치는 '독립성' 을 의미하며, 이러한 개인주의와 독립성은 더 높은 지위와 능력을 연상시켜, 보이는 능력을 직접적으로 높인다. 다만, 이 책에 의하면 이미 어느정도 높은 지위를 누리고 있을 때, 이러한 '관습과의 불일치' 가 효과를 발휘한다. 


이외에도 이 책에 나온 내용 중 인상 깊은 것은 행동의 품격을 높이기 위해서 사소한 실수를 줄이라는 것이다. 하위 계층임을 암시하는 한 마디, 몸짓 하나에 보이는 능력이 땅으로 떨어질 수 있다. 물론 반대의 경우도 많다. 우선 자신의 거동을 면밀히 검토하고, 자신이 되고 싶은 사람의 거동과 행동을 자신의 것으로 만들면, 그에 걸맞는 대접을 받을 수 있다. 이와 관련해서 챕터 2에서 언급한 해리 벡위드의 말을 인용하고 싶다. '가장 좋은 선택지가 되려 하지 말고, 당신을 나쁜 선택지로 만들만한 모든 것을 없애라.' 



한 분야의 전문가로 인정받고 싶다면


이 책의 챕터  2에서는 직업적 측면에서 어떻게 인정받을 수 있는지에 대해 말하고 있다. 우선 '겸손' 에 대해 서술한 부분은 '어떻게 잘 겸손 할 수 있을까?' 에 대한 가이드를 준다. 때론, 겸손함은 불확실함 및 비겁함과 동일시되며, 실패에 대한 방어라고 해석되기도 한다. 겸손함이란 종종 그 목적이 자신을 향한 비판을 막으려는 계산에서 나오기 때문이다. 예를 들어, 프리젠테이션 도중 지나치게 겸손하며, 발표가 끝난 후, '충분한 준비를 하지 못해 죄송하다.' 라고 하는 경우, 사람들은 그를 겸손한 프로페셔널로 기억하지 않는다. 이 책에서는 겸손에 대해 '필요한 날에만 걸고 다니는 장신구' 라고 표현한다. 겸손은 필요할 때만 사용하면 되는데, 절대 자신의 핵심 능력을 방해하지 않는 선에서 해야한다. 자신의 직업 영역에서 겸손한 것은 오히려 보이는 능력을 하락시킨다. 


아무도 의사가 되고 싶었던 회계사를 높게 쳐주지 않는다. 남에게 자신이 능력있고 전문성 있는 사람으로 보이고 싶다면 Born to be 임을 어필하는 것이 좋다. 어떠한 직업군에 대한 고정관념이 있다. 예를 들어, 우리는 학자는 산만하고 괴짜이며, 변호사는 이성적이고, 유창한 언변을 갖추었을 것이라고 생각한다. 어떤 사람들은 직업에 대한 고정관념을 깨고 싶어, 그와 정반대 되는 모습을 드러내려고 하는 사람들이 있다. 이와 관련해서는 챕터 4에 나온 '애완견이 되고 싶었던 당나귀' 이야기를 언급하고 싶다.


당나귀는 저녁마다 우리에 서서 자고, 하루 종일 주인을 위해 열심히 일해야 했다. 그에 반해 애완견은 집안에서 잠을 자고, 아무 일도 하지 않아도 맛있는 사료와 간식을 먹었다. 그 모습을 본 당나귀는 주인에게로 달려가 애완견처럼 꼬리를 흔들고, 그의 가슴으로 뛰어오르려 했다. 놀란 주인은 당나귀를 우리에 더욱 단단히 묶어 두었다. 


이 이야기 말해주듯, 세상은 감상에 젖어 본분을 잊어버린 변호사를 바라지 않는다. 자신의 직업군에 관해 사람들이 기대하는 바를 잘 알고, 그에 맞게 행동하는 이들은 같은 일을 해도 더욱 많은 결실을 건져 올리게 된다. 만약, IT 에 종사하는 사람이라면, 스마트 워치를 차고, 스마트 태블릿에 메모를 하라. 이는 보이는 능력을 높여줄 것이다. 



정리


이 책은 보이는 능력을 키울 수 있도록 실제로 일상 생활에서 실천할 수 있는 것을 명확하게 열거하고 있다. 많은 사람들이 노력을 통해 자신의 전문성을 키우고, 남한테 인정받는 사람이 되고자 한다. 이 책은 능력으로 인정받고 싶은 사람들에게 보이는 능력을 높임으로써 더욱 쉽게 인정받을 수 있는 방법을 제시했다고 생각한다. 한 편, 이 책의 내용은 어떤 면에서는 다소 불쾌한 느낌이 들 수도 있다고 생각한다. '상위 계층' 과 '하위 계층' 을 나누어서 상위 계층으로 가기 위한 방법을 설명하고 있는듯 하다는 점 때문일 것이다. 하지만, 스스로 사회를 변화시키는 것은, 사회에 적응하는 것보다 힘들다. 사회를 변화시키는 더 쉬운 방법은 우선 사회에 적응해 자신처럼 생각하는 사람을 많아지게 하는 것일 것이다.  만약 내가 무언가가 간절히 되고 싶고, 이에 대한 암묵적인 사회적 규범이 존재한다면, 적어도 이를 파악하고 극복하기 위해 노력한다면 실제로 더 많은 보수를 가져다 줄 것이다. 


  • 더 쇼 다시보기 2020.04.09 16:49

    잘보고 갑니다

  • 지나가다가 2020.06.08 18:00

    좋은글 잘 읽고 갑니다.
    딥러닝에 대한 리뷰들도 굉장히 큰 도움이 되었습니다.
    감사합니다.

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




R - Windows 에서 source 로부터 패키지 설치하기 



devtools 를 통해 최신 개발 버전의 tidyr 을 설치 



devtools::install_github("tidyverse/tidyr")

Downloading GitHub repo tidyverse/tidyr@master

Error: Could not find tools necessary to compile a package


그냥 설치하면 위와 같은 에러가 나오면서 설치되지 않음 


아래 옵션 추가함으로써 무엇이 잘못되었는지, 어떤 dependencies 를 설치할 때 오류가 발생한 것인지 확인 가능

options(buildtools.check = function(action) TRUE )


다시 아래 코드 실행 
devtools::install_github("tidyverse/tidyr")

These packages have more recent versions available.
Which would you like to update?

1:   rlang    (0.3.4 -> 6a232c019...) [GitHub]
2:   ellipsis (0.1.0 -> d8bf8a34e...) [GitHub]
3:   CRAN packages only
4:   All
5:   None

4. All 을 입력해줌 

WARNING: Rtools is required to build R packages, but is not currently installed.

Please download and install Rtools 3.5 from http://cran.r-project.org/bin/windows/Rtools/.


Rtools 가 소스를 컴파일할 때 필요함 


RTools 설치 - 버전에 맞는 R tools 를 설치함

https://cran.r-project.org/bin/windows/Rtools/


Rtools 폴더를 환경변수 걸기 

예를 들어 C:/Rtools 를 환경변수로 잡음


Permission denied error 가 뜰 수 있는데 공용폴더로 lib path 를 지정하면 된다.

아래처럼 공용 폴더에 install_github 를 통해 패키지를 설치할 수 있음 

with_libpaths(new = "C:/Program Files/R/R-3.5.3/library", install_github('tidyverse/tidyr')) 


결국 소스를 컴파일 하면서 잘 설치가 되는 것을 확인할 수 있음 


C:/Rtools/mingw_64/bin/g++  -I"C:/PROGRA~1/R/R-35~1.3/include" -DNDEBUG  -I"C:/Users/JuYoungAhn/Documents/R/win-library/3.5/Rcpp/include"        -O2 -Wall  -mtune=generic -c RcppExports.cpp -o RcppExports.o

C:/Rtools/mingw_64/bin/g++  -I"C:/PROGRA~1/R/R-35~1.3/include" -DNDEBUG  -I"C:/Users/JuYoungAhn/Documents/R/win-library/3.5/Rcpp/include"        -O2 -Wall  -mtune=generic -c fill.cpp -o fill.o

C:/Rtools/mingw_64/bin/g++  -I"C:/PROGRA~1/R/R-35~1.3/include" -DNDEBUG  -I"C:/Users/JuYoungAhn/Documents/R/win-library/3.5/Rcpp/include"        -O2 -Wall  -mtune=generic -c melt.cpp -o melt.o

C:/Rtools/mingw_64/bin/g++  -I"C:/PROGRA~1/R/R-35~1.3/include" -DNDEBUG  -I"C:/Users/JuYoungAhn/Documents/R/win-library/3.5/Rcpp/include"        -O2 -Wall  -mtune=generic -c simplifyPieces.cpp -o simplifyPieces.o


......


library("tidyr", lib.loc="C:/Program Files/R/R-3.5.3/")


이렇게 path 를 지정해주면 라이브러를 로딩할 수 있음