처음에 왜 문제가 발생하지 않았는지 모르겠다. Jupyterlab과 마찬가지로 subfolder를 지정해서 reverse proxy를 하기 위해서는 rserver.conf 설정이 필요하다.
www-root-path=rstudio
처음에 왜 문제가 발생하지 않았는지 모르겠다. Jupyterlab과 마찬가지로 subfolder를 지정해서 reverse proxy를 하기 위해서는 rserver.conf 설정이 필요하다.
www-root-path=rstudio
caret 패키지는 분류(classification)에서는 기본적으로 accuracy를 기준으로 이용한다. 별다른 다른 기준을 제시하지 않는다면 accuracy가 높은 쪽으로 모델을 튜닝한다는 뜻이다.
그렇다면 다른 지표를 기준으로 삼아야 할 경우에는 어떻게 할 수 있을까? 지금 분석 중인 자료에서는 PPV를 기준으로 삼는 것이 필요하다. 그래서 관련 자료를 검색하여 보았다. 검색으로 알 수 있는 것은 학습 과정에서 PPV 수치를 제공하면 된다는 것이다.
여기에 적힌대로 하면 정말로 PPV가 높은 쪽으로 모델이 튜닝된다. 단, 하나 주의해야 할 부분이 있다. 본인이 분석해야 하는 자료에서 Positive 항목을 제대로 지정해 주어야 한다. 위 페이지 내용대로 한다면 참값의 기준은 해당 항목의 첫 번째가 기준이 된다. 나의 자료는 neg 와 pos 로 되어 있다. pos는 알파벳 순으로 2번째이다. 그렇기 때문에 이럴 고려하여 PPV를 계산하도록 해야 한다.
PPV = function(data, lev = NULL, model = NULL) {
value = posPredValue(data$pred,
data$obs,
positive = lev[which(lev == 'pos')]
)
c(PPV = value)
}
자료의 형식을 data$pred나 data$obs로 변경해야 할 필요는 없다. 수정해야 하는 부분은 positive 부분이다. 본인의 자료에 맞추어서 정확한 숫자로 입력해 주면 된다.
fitControl = trainControl(method='repeatedcv', number = 10, repeats = 100, summaryFunction = PPV)
trainControl 에서도 앞서 만든 PPV를 이용할 것이라고 summaryFunction 을 이용해서 정의한다.
caret::train(true_positive ~ ., method = 'rpart', trControl = fitControl, data = trainset, metric = 'PPV')
train 과정에서도 metric을 이용해서 PPV를 이용할 것이라고 적어둔다.
Shiny 에서 Table을 출력하는 방법은 크게 두 가지로 기본적인 renderTable을 이용하는 방법과 DT 패키지의 renderDT를 이용하는 것이다. 그리고 숫자를 출력함에 있어서 기본적으로 둘 다 소수점 2자리가 출력이 된다. 이러면 보기에 안좋은 경우가 있기 때문에 소수점을 변경하도록 한다.
우선 renderTable 의 경우이다. 일괄적으로 조정하는 방법은 다음과 같다. 소수점 첫 째 자리 반올림 결과를 보고 싶으면 다음과 같이 한다.
renderTable({}, digits = 1)
renderTable을 이용하면서 컬럼마다 다른 것을 적용하고 싶다면 formatC 를 이용한다. 도움말을 이용하면 기본적인 사용법을 알 수 있으나, 내가 이용한 것 2개는 다음과 같다. 우선 정수로 표현하고자 할 때이다. digits = 0 은 생략해도 된다.
dat$col = formatC(dat$col, digits = 0, format='d')
소수점 첫 번째 자리의 결과로 보고 싶으면 다음과 같이 한다.
dat$col = formatC(dat$col, digits = 1, format='f')
DT::renderDT를 이용하는 방법은 다음과 같다. columns 에는 숫자가 들어가야 한다ㅓ.
dat %>% formatRound(columns = 1, digits = 1)
Shiny server 에서 일정 시간 간격으로 다시 실행시키기를 원할 때에 invalidateLater 와 reactiveTimer를 이용할 수 있다. 그 동안 가만히 있어도 CPU 이용률이 높아져서 걱정하고 있었는데, reactiveTimer 대신 invalidateLater 를 이용하니 확실히 그런 현상이 사라졌다. 쿠버네티스를 이용해야 하나 고민하고 있었는데, 급하게 공부해야 할 정도는 아닌 것으로 순위가 바뀌었다. 😉