방명록

  1. 최성규 2019.09.08 22:59  수정/삭제  댓글쓰기

    피드백 주셔서 많은 부분을 개선해 나가고 있습니다. 정말 감사합니다.

    한가지 궁금한 점이 있어서 방명록에 글을 남기게 되었습니다.

    제가 XGBoost를 이용해서 데이터를 0.8:0.2로 나누었습니다. 10 교차 검증을 진행했는데, 테스트 적합도가 매우 좋게 나왔지만 교차검증의 결과는

    보다 낮게 나왔습니다. 이럴 때, 해석을 과적합 되었다 라고 봐야 하는지요,

    마지막으로 교차검증의 결과는 좋지 않지만, 테스트 데이터로 검증한 결과는 train data로 학습한 결과보다 좋진 않지만, 교차검증의 결과보다는 좋게 나왔습니다.. 좋게 나왔다는 의미가 정확도에서 3%의 차이가 납니다..

    지금까지 모델을 돌려본 결과로는, 이정도로 교차검증의 결과와 차이가 많이 나지 않았는데 방금 모델 학습 후에 결과가 이전과는 다르게 나오다 보니 질문을 하게 되었습니다.

    항상 좋은 글 남겨주셔서 감사드립니다.

    • R Friend R_Friend 2019.09.08 23:07 신고  수정/삭제

      안녕하세요 최성규님.

      학습하는 과정에서는 Test Set은 절대로 사용해서는 안되므로, Test Set에 대한 추정치로 Cross Validation을 사용해서 Hyper Parameter Tuning을 해가면서 모델을 선택합니다. 그리고 제일 마지막에 Test Set에 대해서 최종 모델 성과평가를 진행합니다. 즉, Test Set에 대한 평가결과가 최종의 모델 성적이 됩니다. 물론 Training/Validation에 사용한 dataset과 Test에 사용한 dataset이 서로 다르므로 모델성능평가는 다를텐데요, 이때 Test set에 대한 평가 결과치가 최종 결과치입니다.

  2. 최성규 2019.09.04 16:11  수정/삭제  댓글쓰기

    답변 감사합니다.
    댓글로 남길 수가 없어서 추가로 방명록을 남기게 되었습니다.

    교차 검증에 관한 질문입니다. 제가 0.8 : 0.2로 traindata와 testdata로 나눴습니다. 이때, nfolds=10의 옵션을 주어 교차 검증 10회를 진행하였습니다. 그렇다면 traindata의 90%로 교차검증의 모델을 학습하고 10%로 검증을 하는게 맞나요 ? 아니면 validation_frame = 의 옵션을 주어 따로 검증을 진행해야 하는지도 궁금합니다.. h2o document를 보면 traindata의 90%으로는 교차검증 모델의 학습에 사용되고, 10%로는 검증을 진행한다고 합니다. (h2o document의 일부를 아래에 첨부하였습니다.) 그러나, 교차검증 모델에 대한 검증 결과를 어떻게 찾아야 하는지 몰라서 질문하게 되었습니다.. 마지막으로, 교차 검증에 대한 결과를 표로 제시할때, traindata의 90%로 모델 학습에 대한 rmse, mse 등등의 결과를 제시해야 하는지, 아니면 traindata의 10%로 검증한 결과의 rmse, mse 등을 제시해야 하는지 궁금합니다. 너무 초보적인 질문으로 방명록을 난잡하게 하는 것 같아 죄송합니다.
    For example, for nfolds=5, 6 models are built. The first 5 models (cross-validation models) are built on 80% of the training data, and a different 20% is held out for each of the 5 models. Then the main model is built on 100% of the training data. This main model is the model you get back from H2O in R, Python and Flow (though the CV models are also stored and available to access later).

    This main model contains training metrics and cross-validation metrics (and optionally, validation metrics if a validation frame was provided). The main model also contains pointers to the 5 cross-validation models for further inspection.

    All 5 cross-validation models contain training metrics (from the 80% training data) and validation metrics (from their 20% holdout/validation data). To compute their individual validation metrics, each of the 5 cross-validation models had to make predictions on their 20% of of rows of the original training frame, and score against the true labels of the 20% holdout.

    h2o package를 사용하였고 R tool를 이용하고 있습니다.

    • R Friend R_Friend 2019.09.04 16:24 신고  수정/삭제

      안녕하세요 최성규님.

      train-validation-test set 관련된 내용은 rfriend.tistory.com/188 포스팅을 참고하시면 이해에 도움이 될거예요.

      from sklearn.model_selection import cross_val_predict 하시고,
      result = cross_val_predict(model, X, y, cv = 5) 이런식로 하시면 됩니다.

      sklearn.metrics에서 분석 목적에 적합한 펼가지표를 가져와서 실측치와 예측치 간 차이를 평가하시면 됩니다.

      CV는 분류 문제의 경우 보통 홀수(tie 방지)를 사용합니다. CV는 연산비용이 비싸므로 수행시간과 관측치 개수를 고려해서 적당한 수를 정하시기 바랍니다.

      도움이 되었기를 바랍니다.

  3. 최성규 2019.09.04 01:44  수정/삭제  댓글쓰기

    안녕하세요 ! deep learning에 대해서 구글링 하다가 들어오게 되었습니다.
    실례가 안된다면 저의 간단한 질문에 대해서 답변 해 주실수 있나요 ...

    제가 딥러닝과 머신러닝을 이용해서 multi classification을 하고 있습니다. 변수 중요도를 보기 위해서 h2o.varimp 을 이용해서 딥러닝과 머신러닝 모델의 변수 중요도를 확인했는데요, 랜덤 포레스트나 그래디언트 부스팅의 경우 독립변수(라고 표현하겠습니다.)에 범주형 변수가 있을 때, 그 변수의 필드명으로 변수 중요도를 확인할 수 있는데에 반해, 딥러닝의 경우 그 변수의 범주들 하나하나의 변수 중요도를 표현합니다.. 저는 그 변수 자체의 중요도를 파악하고 싶은데 딥러닝의 경우는 변수의 범주들 하나하나 중요도가 나와서 한눈에 파악하기가 힘듭니다.. 방법이 없을까요 ?

    • R Friend R_Friend 2019.09.04 09:35 신고  수정/삭제

      안녕하세요 최성규님.

      아래 링크이 답변 참조하시면 좋겠습니다.
      Gropued LASSO regularization 에 대한 논문 링크도 달려있습니다.

      https://stats.stackexchange.com/questions/314567/feature-importance-with-dummy-variables


      딥러닝 쪽은 Grad-CAM(class activation map)으로 image 데이터의 중요 영역 활성화시켜서 해석하는 방법을 텍스트 모델링에 응용한 사례로 아래 링크 참조하세요. (전희원님 블로그)

      freesearch.pe.kr/archives/4685

  4. 서현아빠 2019.09.02 14:40  수정/삭제  댓글쓰기

    안녕하세요. 훌륭한 포스팅 잘 보고 있습니다.
    R을 활용한 텍스트 마이닝 관련 도움을 얻고자 글을 남깁니다.

    서포트 벡터 머신과 랜덤포레스트를 써서 블로그 텍스트를 스팸과 스팸 아닌 것으로 구분하려는데, 둘 다 아래와 같은 에러가 뜹니다.

    svmPred_new = predict(svmModel, newDtmDf)
    "Error in eval(predvars, data, env) : object '03월' not found"

    rfPred = predict(rfModel_caret, testSet[,1:(ncol(testSet)-1)])
    "Error in eval(predvars, data, env) : object '꿈22' not found"

    03월과 꿈22는 블로그 콘텐츠를 파싱하여 추출한 형태소입니다.
    어떤 문제이며 해결방법은 무엇인지 알려 주시면 큰 도움이 되겠습니다.

    • R Friend R_Friend 2019.09.02 19:46 신고  수정/삭제

      객체가 없다고 하는고 보니 아무래도 training set과 test set의 데이터 구조가 서로 다른거 같습니다. 칼럼 비교해보시기 바랍니다.

  5. 꾸리꾸리 2019.08.12 11:14  수정/삭제  댓글쓰기

    duplicated를 이용한 중복 추출에 대해서는 이해하였습니다. 감사합니다.

    추가적으로 전처리 질문 드립니다.

    1. 3개의 파일에서 각각 하나의 column만을 선별하고 개별적인 파일 만듬
    2. 3개의 파일을 bind_row를 이용하여 하나의 column으로 만듬
    3. duplicated를 이용하여 총 60000개에서 32000개로 줄음
    4. 32000개의 rows에서 데이터값(문자) 사이사이에 . 가 있어 .를 제거하고 싶은데 어떻게 해야 할까요?

    • R Friend R_Friend 2019.08.12 11:53 신고  수정/삭제

      아래 코드 참고하세요.

      df <- transform(df,
      var_2 = gsub(".", "", var_1, fixed=TRUE))

    • 꾸리꾸리 2019.08.12 17:04  수정/삭제

      var_2랑 var_1에는 뭘 넣어야 하는거죠??

    • R Friend R_Friend 2019.08.12 17:06 신고  수정/삭제

      var_1 이 '.'가 포함된 칼럼이구요, var_2는 새로운 칼럼이름 아무거나 넣으면 됩니다.

    • 꾸리꾸리 2019.08.13 10:22  수정/삭제

      글을 늦게 확인하였습니다.
      다시 수정하여 올립니다.
      제 데이터셋이 1500행 1열 로 구성이 되어 있어 var_1에 '.'가 포함된 컬럼이라면
      df<-transform(df, var_2 = gsub(".", "", df$v1, fixed = TRUE)) 이렇게 진행하였 확인하니, 새로운 컬럼이 var_2라는 것으로 생기고 .은 지워진 상태 였습니다. 여기서 빈칸을 지워내려면 unique를 사용해야 하나요?

    • R Friend R_Friend 2019.08.13 18:55 신고  수정/삭제

      빈 칸이라 하면 결측값을 말씀하시는 건지요? 결측값 제거는 아래 링크 참고하세요.

      https://rfriend.tistory.com/34

  6. 꾸리꾸리 2019.08.09 11:03  수정/삭제  댓글쓰기

    안녕하세요 외부파일 출력에 대해 질문 드립니다.

    A B C D column 및 4 row의 데이터 프레임 형식이 있다고 가정할시, R studio에서는 View()/ head()로 확인하게 되면, 아래처럼 확인되어 외부파일(txt, csv ...)로 출력후, 엑셀이나 다른 워드파일 같은 프로그램으로 확인하게 되면 A열 왼쪽에 기재된 list number에 대해서는 나타나지 않으나, R 자체를 리눅스에서 실행하여 같은 데이터를 출력하면 list number가 나타나게 되는데..혹시 list number가 같이 안나오게끔 출력하는 방법이 있을까요?
    A B C D
    1 x x1 x2 x3
    2 y y1 y2 y3
    3 z z1 z2 z3
    4 a1 a2 a3 a4


    • R Friend R_Friend 2019.08.09 11:46 신고  수정/삭제

      안녕하세요.

      데이터프레임을 내보낼때
      write.table(df, "your_directory_filename", sep=",", row.names=FALSE)

      처럼 row.names=FALSE 옵션을 추가해보세요.

    • 꾸리꾸리 2019.08.09 12:04  수정/삭제

      답변 감사드립니다.

      말씀해주신 커맨드에서

      sep만 다시 탭형식으로 바꾸어서 하니 원하던 데이터 형식이 출력되었습니다 감사합니다

  7. soulspasm 2019.07.17 13:20  수정/삭제  댓글쓰기

    안녕하세요. 우연히 방문했다가 좋은 자료들이 너무 많아 자주 도움을 받고 있습니다.
    연산자 단축키에 관해 문의 드립니다. %in% 연산자를 단축키로 입력할 수 있는지요?

    • R Friend R_Friend 2019.07.17 16:56 신고  수정/삭제

      안녕하세요 soulspasm님,
      저도 %in% 연산자 단축키는 사용해본 적이 없어서 잘 모르겠습니다. ^^;

      dplyr 패키지의 chain pipe operator (%>%)의 단축키는 shift +ctrl + m 입니다. https://rfriend.tistory.com/236 참고하세요.

      그 외 RStudio 단축키 설명은 https://support.rstudio.com/hc/en-us/articles/200711853-Keyboard-Shortcuts 를 참고하시기 바랍니다.

  8. HOOOO 2019.06.10 19:39  수정/삭제  댓글쓰기

    전처리 관련 질문 남깁니다...
    CSV파일 불러올때, 한 cell안에 띄어쓰기가 있는 경우 어떻게 처리해야하나요?
    header는
    FACTORY / SITE / DEVICE GROUP / MCP SALE / CLASS /M201905 / M SUM / W201919 / W201920/ W201921/W201922 /W SUM

    Data는
    TEST/ NONE/ AB ABC E / A-EFGEH / Input (EA) / 102390 / 102390 / 87867 / 2403 / 0 / 0 / 90270

    이런식으로 되어있습니다. 그런데, 각 cell의 공백부분 때문에 밀려서 제대로 데이터를 불러올수가 없는데, 이런경우 어떻게 해야하나요?

    ===========================================================================
    Warning messages:
    1: In read.table("Raw_data.csv", header = TRUE, comment.char = "", :
    line 1 appears to contain embedded nulls
    2: In read.table("Raw_data.csv", header = TRUE, comment.char = "", :
    line 2 appears to contain embedded nulls
    3: In read.table("Raw_data.csv", header = TRUE, comment.char = "", :
    'Raw_data.csv'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다

    =========================혹은
    Error in read.table("Raw_data2.txt", header = T, fileEncoding = "EUC-KR") :
    열의 개수가 열의 이름들보다 많습니다

    • R Friend R_Friend 2019.06.10 19:54 신고  수정/삭제

      안녕하세요.
      혹시 파일이 크지 않고 공백이 일정(예: 스페이스 1개)하다면 텍스트 편집기(예: 울트라에디터, 노트패드++ 등)로 공백을 find-replace 하기로 편집후 R로 읽어보시지요.

      R에서 읽는 방법은 집에 가서 저도 테스트해봐야 하는데요, 밤 11시쯤 들어갈듯 하네요.

    • HOOOO 2019.06.10 20:07  수정/삭제

      공백이 여러개라서 R에서 불러오는 법이 필요합니다 ㅠㅠ 천천히 확인 해주셔도 됩니다!!

    • R Friend R_Friend 2019.06.10 20:14 신고  수정/삭제

      공백을 어떻게 처리해야 하나요? 제거하나요, 아니면 그대로 남겨두나요? 구분자(/) 앞뒤로도 공백이 있나요? 아니면 예로 든 data 예 중 AB ABC E 처럼 값의 중간에 공백이 있는건가요?

    • R Friend R_Friend 2019.06.11 00:05 신고  수정/삭제

      아래 2개 코드 참고해서 한번 해보시지요.


      (1) header 를 FALSE로 하고, 1번째 라인 skip하고, 칼럼이름을 직접 입력하되 칼럼이름의 공백은 '_'로 대체. sep="/" 지정, comment.char="" 를 지정해서 '#' 으로 인한 에러 방지, strip.white=TRUE로 지정해서 white space 제

      df <- read.table("C:/Users/admin/Documents/data.txt",
      sep = "/",
      header = FALSE,
      skip = 1,
      col.names = c("FACTORY", "SITE", "DEVICE_GROUP", "MCP_SALE",
      "CLASS", "M201905", "M_SUM", "W201919",
      "W201920", "W201921", "W201922", "W_SUM"),
      strip.white = TRUE,
      comment.char = "")

      (2) header=TRUE로 하되 sep="/" 로 구분자 지정, comment.char = "" 로 '#'으로 인한 에러 방지, strip.white=TRUE로 white space 제거

      df2 <- read.table("C:/Users/admin/Documents/data.txt",
      header = TRUE,
      sep = "/",
      strip.white = TRUE,
      comment.char = "")

      이래도 에러 나면 na.strings 옵션 참고해서 시도해보시기 바랍니다.

    • HOOOO 2019.06.11 10:33  수정/삭제

      공백 처리는 제거해도 되고, 남겨도 됩니다.
      구분자는 cell 구분을 위해 제가 임의로 넣은것입니다!
      AB ABC E처럼 중간에 공백이 존재합니다. 위에 알려주신 대로 해봤는데, 에러가 나네요 ㅠㅠ
      =========================
      'Raw_data.csv'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다

    • R Friend R_Friend 2019.06.11 10:37 신고  수정/삭제

      원본 파일을 열은 후에 마지막줄에 커서 위치 후, 엔터를 한번 쳐서 줄을 내리시고, 저장 후 파일을 닫고, 다시 한번 R 실행시켜 보실래요?

      sep 구분자는 sep="," 처럼 실제 사용하신 구분자 설정하시구요.

    • HOOOO 2019.06.11 16:19  수정/삭제

      CSV 파일이라 구분자는 따로 없이 다른 칸에 들어있는 것입니다..ㅠㅠ 원본파일에 마지막줄 엔터 치고 저장하고 말씀하신대로 해봤는데 안됩니다 ㅠㅠ

      Error in make.names(col.names, unique = TRUE) :
      invalid multibyte string 4
      In addition: Warning message:
      In read.table("Raw_data.csv", header = T, strip.white = TRUE, comment.char = "") :
      'Raw_data.csv'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다
      >

      =======================

      다른 PC에서 그냥
      read.csv("data.csv", header=T) 만했는데, 잘 불려오는데.....뭐가문제인걸까요?

    • R Friend R_Friend 2019.06.11 16:23 신고  수정/삭제

      첫번째 방법으로 해보시되, csv파일의 구분자가 콤마이므로 sep="," 로 설정하고 해보시지요.
      (마지막줄에서 엔터 치고 저장한 파일에 대해서요)

    • HOOOO 2019.06.11 17:00  수정/삭제

      동일합니다 ㅠ

    • R Friend R_Friend 2019.06.11 17:09 신고  수정/삭제

      아, 그럼 저도 도와드릴수가 없겠네요. 방명록에 남겨주신 데이터로 어제 밤에 테스트해봤는데요, 동일한 에러 재현이 안되더라구요. 그래서 가설적으로 의견드려봤던건데요, 죄송합니다. ㅜ.ㅜ

    • HOOOO 2019.06.11 17:11  수정/삭제

      아닙니다 바쁘실텐데 도와주셔서 감사합니다 ㅠㅠ

  9. 꾸리꾸리 2019.05.24 11:38  수정/삭제  댓글쓰기

    전처리 관련 질문 남깁니다.

    1.Dataframe 형식 (ex .5열 300행)
    2. 2열과 3열을 기준으로 하여 새롭게 필터링

    A B C D E
    . X Y . . (1col)
    . XX Y . . (2col)
    . Z X . . (3col)
    . XXXXX Z . . (4col)

    이러한 데이터 프레임에서 B와 C를 기준으로 하여 첫번째와 세번째 줄의 형식만 추출하려 합니다.
    즉, 문자가 하나만 나타난 B와 C를 추출하고 두번째와 네번째를 보게 되면 문자의 개수가 다른 부분은 제거하는 방법에 대해 도움을 주실 수 있는지 글을 남깁니다.
    최종적으로, A~E까지의 열이 나타내어 B와 C는 공통적으로 문자가 하나인 행만 필터 하려 합니다.
    subset을 이용하여 하려하는데 맞는 방향인지도 부탁드립니다..
    ( 필요에 의해 문자의 개수가 다른 부분도 뽑아낼 수 있기에 이와 관련하여서도 방법이 있는지 부탁 드립니다)

    • R Friend R_Friend 2019.05.24 11:46 신고  수정/삭제

      (1) 이전에 방명록에 남기셨던 몇 개의 질문들은 모두 해결이 되셨는지요? 잘 해결이 되었다면 그에 대한 답글을 달아주세요.

      (2) 이번 질문을 이해하기가 힘든데요, output 예시를 추가해주세요.

      (3) 제가 회사 일로 너무 바빠서 내일 오후나 저녁에 답변 가능합니다.

    • 꾸리꾸리 2019.05.24 11:58  수정/삭제

      1. 네 이전에 문제점은 해결이 되었습니다.
      바쁘신데 시간을 내어 도움을 주셔서 감사 드립니다.

      2. rawdata file
      A B C D
      C X Y -
      파이썬 Y ZZZZ -
      R XX Y -
      Java Z ZYYY -
      SQL Z X

      output file
      A B C D
      C X Y -
      SQL Z X -

      (B와C 처럼 문자의 형식에 상관없이 문자의 개수가 1개인 모든 행을 추려내어 나타내려 합니다.
      파이썬, R, 자바 같은 경우는 B와 C의 값을 비교하였을때 문자의 개수가 다르기 때문에 output파일에서 제거하여 나타내었습니다.
      추후에 반대로 문자의 개수가 다른것만으로도 추출을 하려 합니다)
      3. 도움을 주시는 것으로도 감사드립니다. 여유가 되시면 봐주시기 바랍니다.

    • R Friend R_Friend 2019.05.24 15:23 신고  수정/삭제

      이전 문제는 잘 해결되었다니 다행이네요.

      B, C 열의 문자열 길이가 같은 행만 선별하는 것은 아래 코드 참고하시기 바랍니다.

      library(dplyr)

      df_equal <- df %>% filter(nchar(as.character(B)) == nchar(as.character(C)))

      df_not_equal <- df %>% filter(nchar(as.character(B)) != nchar(as.character(C)))

    • 꾸리꾸리 2019.05.26 00:33  수정/삭제

      답변 감사드립니다.
      문제점은 잘 해결되었습니다.
      감사합니다.

  10. 꾸리꾸리 2019.05.22 17:37  수정/삭제  댓글쓰기

    확인번호를 확인 할 수 없어...부득이 하게 다시 글 남깁니다.

    1. Dataset은 7열 300,000행으로 구성되어 있습니다.
    2. A(ID) B(number)... 등으로 G 열까지 나누어져 있습니다.
    3. apple이라는 ID의 이름은 동일하지만 B, C, D ...이 값이 다르기 때문에 apple이라는 이름을 A열에서 이용할 수 있었습니다.
    ex)
    A B C D E F G
    apple a b c d e f
    apple b c d e f g
    banana c d e f g h
    apple d e f g h i j
    melon e f g h i j k
    apple f g h i j k l
    이런식으로 7행 300,000열이 구성되어 있습니다.

    4. 다시 예를 들면, A열은 1,2,3,4,5,ㄱ,ㄴ,ㄷ의 이름들로 300,000개의 행이 섞여 있습니다.
    5. 문제는 데이터를 처리를 위해 A열 (ID를 기준)을 기준삼아 처리를 하려 하는 도중 ㄱ,ㄴ,ㄷ 입니다. ㄱ->6 / ㄴ->7 / ㄷ->8 로 변경을 하려합니다.
    6. 전처리에 대한 글을 보며dimnames()를 이용하여 할 수 있지 않나 싶었으나, 동일한 이름으로 각각 나누어져 있는 행들을 한번에 변환하는 방법이 궁금합니다.

    • R Friend R_Friend 2019.05.22 17:53 신고  수정/삭제

      https://rfriend.tistory.com/235 의 mutate() 함수 & ifelse 조건문 같이 쓰는 예제 참고하셔서 새로운 열(column) 생성하면 되겠네요.