Author: byun1114

  • Random Forest without ‘caret’

    caret 패키지 설치가 안되는 곳에서 ML 분석을 하려면, 해당 패키지를 직접 설치하고 직접 분석 코드를 작성해야 한다. caret이 설치가 안되는 이유는 패키지 설치에 필요한 gcc 등의 컴파일러와 R 버젼의 문제이다. 하아..

    어쨋든, 쉬운 random forest 부터 해결해보자. 직접 코딩해 주어야 하는 것은 다음과 같다. caret을 이용할 경우에도 hyperparameter tuning은 직접 해줘야 하기는 하지만 말이다.

    • mtry나 ntree 튜닝
    • 최적의 mtry와 ntree 값
    • training과 validation 셋 분할
    • cross validation 과정과 결과 취합

    공식 문서를 참고하면 다음과 같이 설정해 주면 될 것이다.

    우선 training과 validation 셋 분할

    ind <- sample(2, nrow(iris), replace = TRUE, prob=c(0.8, 0.2))
    iris.rf <- randomForest(Species ~ ., data=iris[ind == 1,])
    iris.pred <- predict(iris.rf, iris[ind == 2,])

    그리고 결과 확인.

    > table(observed = iris[ind==2, "Species"], predicted = iris.pred)
                predicted
    observed     setosa versicolor virginica
      setosa         10          0         0
      versicolor      0          6         1
      virginica       0          1        15

    Accuracy는 직접 구해야 한다. 편하게 다음과 같이 해본다.

    > a = table(observed = iris[ind==2, "Species"], predicted = iris.pred)
    > suma = 0 ;for (i in seq(nrow(a))){suma = suma + a[i, i]}
    > suma/sum(a)
    [1] 0.9393939
    

    파라미터 튜닝은 다음과 같이 하는 것 같다. Ntree와 Mtry의 값을 변수로 입력하고 결과를 반복한 다음 최적의 결과가 나오는 것을 선택한다. OOB가 낮은 것을 선택한다고 한다.

    > a = randomForest(Species ~. , data=iris, ntree=i, mtry=j, na.action = na.omit)
    ## a$err.rate의 마지막 열의 첫 번째 값이다. 따라서,
    > tail(a, 1)[1]
    [1] 0.04666667
    

    Kappa 상관 계수도 구해보자. 참값과 예측값이 있으니까 관찰자는 2개로 보면 된다. 그러면 그룹을 어떻게 나누느냐에 따라서 계산을 해주면 된다. 2×2 형식은 unconquered (daum.net), 3×3 형식은 hckappa (unl.edu)를 참고했다. 코딩하기에 편한 쪽은 오히려 3×3에서의 설명이다.

    Kappa를 구하기 위해서 필요한 것은 N, sum(a), sum(ef) 이다. N과 sum(a)는 쉽게 구할 수 있으니 sum(ef)를 보자. 2×2 쪽 블로그 설명에 의하면 관찰자가 우연히 그것으로 판단할 확률을 구하는 것이라고 보면 된다. 그래서 expected frequency의 약자를 이용했다. [1,1]이 9가 왜 5.42로 계산이 되는지만 알면 된다.

    (9+3+1)*(9+4+2)/36 = 5.42

    배울 수록 느는 것은 요령이라서, R의 함수로 만들어 본다. 입력값은 NxN 테이블 형식이다.

    kappa = function(table){
      total_number = sum(table)
      agree_number = 0; expected_number = 0
      for (X in seq(nrow(table))){
        agree_number = agree_number + table[X, X]
        expected_number = expected_number + 
                          (sum(table[X, ])*sum(table[, X]))/total_number
      }
      print((agree_number-expected_number)/(total_number-expected_number))
    }
    

    이와 같은 방법으로 앞서 예시로 든 자료의 Kappa를 측정하면 0.935로 계산된다.

  • 죽음의 수용소에서, 빅터 프랭클

    의미를 부여하는 방식으로 환자를 치료하는 로고테라피의 창시자인 ‘빅터 프랭클’의 저서이다. 아우슈비치에서 살아온 것에서 알 수 있듯이 유대인이다. 오스트리아 유대인으로 여러 수용소를 전전하는 과정 중에서도 살아남은 생존자 중 하나이다.

    하지만, 수용소에서의 생활을 너무나도 담담하게 저술하고 있다. 전후 수용소 생활을 한 사람들을 치료하면서 이야기를 서술한 것처럼 느껴질 정도이다.

    이 책은 개정판이며, 개정판은 로고테라피에 대한 설명이 좀 더 되어 있다. 이 책에서 언급하고 있는 로고테라피의 특징은 환자의 미래에 촛점을 맞추는 것이다. 미래에 환자가 이루어야 할 과제가 갖고 있는 의미에 촛점을 맞춘다. 그래서 단편적으로 언급하고 있는 방식이 환자로 하여금 죽기 직전의 미래에 있다고 가정해보라고 한다. 그래서 그 순간 자신의 삶을 떠올려 본다. 그리고, 그 삶에서 현재의 고민이나 문제가 어떠한 의미가 있는지, 내가 어떠한 삶을 살아야 하겠는지 스스로 생각할 수 있게 만들어준다. 즉, 보기보다 의사의 개입이 없는 방식으로 환자가 현재 당면하고 있는 어려움을 극복할 수 있게 만들어 준다고 할 수 있다.

    1부와 2부로 구성되어 있데, 모두 언급하고 있는 짧은 구절이 2개가 있다. 이 구절이 로고테라피를 잘 설명하는 것이라고 생각한다.

    ‘왜 살아야 하는지 아는 사람은 그 어떤 상황도 견딜 수 있다’ – 니체

    ‘두 번째 인생을 사는 것처럼 살아라. 그리고 지금 당신이 막 하려고 하는 행동이 첫 번째 인생에서 그릇되게 했던 바로 그 행동이라고 생각하라.’

  • 임상연구의 요양급여 적용에 관한 기준

    임상연구를 할 때 요양급여를 적용해야 할 경우에 대한 절차 안내이다.

    원칙적으로 임상 연구를 할 경우 보험 적용을 받을 수 없다. 의료 보험은 진료를 위하여 비용은 지불하는 것이지, 연구를 위하여 비용이 지불되어서는 안된다는 것이다. 물론, 그럼에도 불구하고 예외 규정이 있다. 공익적이거나 긴급해야 한다.

    먼저 기본적인 내용부터 확인해 보자. 요양급여의 일반 원칙은 다음과 같다.

    국민건강보험 요양급여의 기준에 관한 규칙
    제5조(요양급여의 적용기준 및 방법) ①요양기관은 가입자등에 대한 요양급여를 별표 1의 요양급여의 적용기준 및 방법에 의하여 실시하여야 한다.

    별표 1. 요양급여의 적용기준 및 방법
    1. 요양급여의 일반원칙
    자. 요양급여는 연구 또는 시험(제8조의2에 따른 임상연구는 제외한다)의 목적으로 이루어지는 의료행위 등에는 실시해서는 아니된다. 다만, 보건복지부장관이 정하여 고시하는 기준 및 절차 등에 따라 이루어지는 임상연구 또는 임상시험과 관련하여 해당 연구 또는 시험에 참여하는 환자의 질병이나 부상 등을 위한 진료 및 치료 등의 통상적 요양급여로서 보건복지부장관이 정하는 요양급여는 그렇지 않다.

    보건복지부 장관이 정하는 기준은 다음과 같다.

    임상연구의 요양급여 적용에 관한 기준
    제3조(요양급여 적용 대상연구) ① 「국민건강보험 요양급여의 기준에 관한 규칙」제5조제2항 및 별표 1 제1호 자목에 따라 요양급여 적용 대상이 되는 임상연구 또는 임상시험(이하 “임상연구”라 한다)은 연구자 주도로 공익적 목적을 위하여 실시하는 임상연구로 한다.
    ② 제1항에도 불구하고 의뢰자 주도 임상연구 중 공중 보건위기 대응 등 긴급히 요양급여를 적용해야 할 필요성이 있거나 희귀난치성 질환 관련 연구 등 공익적 목적이 큰 경우에는 요양급여 적용 대상이 될 수 있다.

    제도를 알았으니 그 다음에는 신청을 어디에 어떻게 해야한지 알아야 한다. 보험비용을 지급하는 건강보험심사평가원에 신청한다.

    https://cris.nih.go.kr/cris/board/board_view.jsp?board_seq=2&sTop=&pageNum=1&ltype=&article_seq=2868

    해당 연구에 대한 IRB 승인과 CRIS(https://cris.nih.go.kr)에 등록이 선행되어야 하지만, 추후 제출을 조건으로 조건부 승인을 받을 수 있음.

    CRIS 등록은 IRB 승인이 되어야 함.

  • YOLO annotation

    YOLO에서 annotation은 다음과 같이 한다. 가장 먼저 명심해두어야 하는 것은 좌상단을 (0,0), 우하단이 (1,1)인 사각형 형태이며, 비율로 해야한다는 것이다.

    • 좌상단을 (0,0), 우하단이 (1,1)인 사각형 형태이다.
    • 입력되는 값은 비율에 해당하는 값이다.
    • txt 포맷(TSV)로 입력할 수 있다.
    • 첫 번째는 클래스
    • 두 번째는 형태 중심의 X
    • 세 번째는 형태 중심의 Y
    • 네 번째는 가로 폭
    • 다섯 번째는 세로 폭

    OpenCV에서 boundingRect 를 이용할 경우 출력 값은 Contour의 좌상단 X좌표, Y좌표, 폭, 높이이다. 보통 x y, w, h로 결과를 받는다.

    x, y, w, h = cv2.boundingRect(contour)

    간단한 식으로 결과를 변환하여 입력해주면 된다.