Category: R

  • caret 메세지 안보이게 하기

    caret 패키지에서 분석을 할 경우 특히 neuralnet 기반의 분석에서 메세지가 길게 출력된다. 그냥 두어도 문제는 없으나 반복하여 결과를 실행할 경우 현재 어느 정도 진행되었는지 알기가 어렵다. 그럴 경우 출력 메세지가 안보이도록 하는 요령이다.

    capture.output을 이용하여 출력 메세지를 변수로 받아버린다. 😉

    그런데 이럴 경우 train 결과가 이용되지 않는 것 같다. 아니면 내가 <- 대신 =로 해서 그럴 수도 있겠다.

    garbage <- capture.output(train <- train(Species~.,data=iris,method="nnet",trControl=tc))
    
  • RStudio Server, Reverse Proxy, Nginx, Subfolder

    처음에 왜 문제가 발생하지 않았는지 모르겠다. Jupyterlab과 마찬가지로 subfolder를 지정해서 reverse proxy를 하기 위해서는 rserver.conf 설정이 필요하다.

    www-root-path=rstudio
  • caret 에서 PPV (positive predictive value)로 학습하기

    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 마다 소수점 지정하기

    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)