Author: byun1114

  • UUID

    UUID는 범용 고유 식별자이다.

    Python에서는 uuid 로 import 하면 바로 사용할 수 있다. 임의성을 필요로 한다면 uuid.uuid1() 과 uuid.uuid4()를 이용해서 사용할 수 있다. uuid1()의 경우 MAC 주소가 이용되기 때문에 보다 임의성을 부여하기 위하여 uuid4() 사용을 권고 하고 있다. 목적에 따라서 임의성 보다는 익명성(?) 정도만 부여되어도 괜찮다고 한다면 uuid3()이나 uuid5() 등도 이용해 볼 수 있다.

    통상적인 사용 환경에서 중복은 매우매우 드물게 발생한다. 그럼에도 불구하고 찜찜하다면 salt 같은 방법으로 추가 문구를 덧붙여 주는 것을 고려해 보면 될 것이다.

    파일 이름에 이용하기 위해서는 문자열로 변환해서 이용하면 된다.

    import uuid
    str(uuid.uuid4())
  • 거츠: 네이비실의 이기는 습관

    https://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791190600606&orderClick=LAG&Kc=#N

    거츠라는 것은 Greatness Under Tremendous Stress 의 약자이다.

    저자가 네이비실 출신이라는 것을 보자. 네이비실은 세계 최정상급 특수 부대 중 하나이다. 그 부대에서 장기간 복무하였다. 전장에서 여러 번 파견된 것 같다. 그리고 군 생활 후반부에는 교관으로서 상당한 능력을 발휘하였다. 물론 다년간의 전쟁 경험으로 인한 PTSD 이야기도 몇 번 나온다. 본인의 이야기도 있고, 그로 인해 죽은 동료들의 이야기도 나온다.

    특수 부대 훈련이라는 것이 사실 많이 알려져 있지는 않다. 작전 성공을 위해서 무엇보다도 많은 노력을 기울일 것이라는 것은 자명하다. 그러한 과정에서 본인에게 도움이 되었던 여러 가지 이야기들을 하고 있다. 단순히 전쟁에 참전한 군인으로서 도움이 된 부분에 대해서만 이야기를 했다면 그저 영웅담일 수도 있다. 그보다는 교관으로서 특수 부대원들을 훈련시켰을 때 경험이 보다 도움이 될 것이다. 성공적인 부대원을 교육시키기 위해서는 정말로 좋은 교관이 필요한 것은 너무나도 당연하다.

  • 틀 밖에서 놀게 하라

    http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788965709596&orderClick=LEa&Kc=#N

    일단 아이의 창의력을 키우기 위해서는 부모부터 말랑말랑한 사고 방식을 가지고 있어야 한다. 그래야 아이가 주도적으로 활동할 수 있게 할 수 있다. 아이의 의견을 존중하는 것부터 시작해야 한다.

  • 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를 이용할 것이라고 적어둔다.