데이터 전처리에 대한 sbML 예측력 비교

rpart 학습 모델을 가지고 원시 데이터를 그대로 학습한 경우와 전처리를 과정을 통해 잡음을 제거한 데이터 간에 예측력을 비교한다.

학습 데이터로는 UCI 저장소에 있는 반도체 생산 공정 데이터( Data from a semi-conductor manufacturing process)를 이용한다. 데이터 설명은 좌측에 있는 반도체 공정 데이터 메뉴를 참조 가능한다. 반도체 공정 데이터를 모델 학습용 그리고 검증용으로 나누어 진행했다.
1. 전처리 과정이 없는 rpart 학습 모델 사용
원시 데이터를 그대로 학습 시킨 후 검증 데이터를 가지고 예측력을 확인했다. 학습 control 옵션을 변경하여 학습을 시킨 후 예측력을 확인 해 본 결과, 예측력이 미세하게 변경되는 것을 확인했다.
rpart 학습 control을 cp = 0.001, minsplit = 5 로 진행
# sbML 패키지에서 반도체 공정 데이터 로드 # 학습 데이터 sc.train 데이터 프레임, 검증 데이터 sc.test 데이터 프레임이 로드 됨 data("semiconductor") library(rpart) # rpart 학습 조건 수정 후 모델 생성 pure.rpart <- rpart(LABELS ~ . , data = sc.train, method = "class", control = rpart.control(cp = 0.001, minsplit = 5)) pure.pred <- predict(pure.rpart, sc.test, type = "class") table(pure.pred) # Pass Fail # 449 20 pure.insp <- table(OBSV = sc.test$LABELS, PRED = pure.pred) pure.insp # PRED # OBSV Pass Fail # Pass 421 17 # Fail 28 3 # 에러율 1 - sum(diag(pure.insp))/sum(pure.insp) # 0.09594883 # Fail 예측 비율 table(pure.pred)["Fail"]/sum(table(pure.pred)) # 0.04264392 # Fail 검출율 pure.insp[2, 2] / sum(pure.insp[2, ]) # 0.0967741 table(sc.test$LABELS) # Pass Fail # 438 31
rpart 학습 control을 cp = 0.01, minsplit = 10 로 진행
pure.rpart <- rpart(LABELS ~ . , data = sc.train, method = "class", control = rpart.control(cp = 0.01, minsplit = 10)) pure.pred <- predict(pure.rpart, sc.test, type = "class") table(pure.pred) # Pass Fail # 444 25 pure.insp <- table(OBSV = sc.test$LABELS, PRED = pure.pred) pure.insp # PRED # OBSV Pass Fail # Pass 417 21 # Fail 27 4 # 에러율 1 - sum(diag(pure.insp))/sum(pure.insp) # 0.1023454 # Fail 예측 비율 table(pure.pred)["Fail"]/sum(table(pure.pred)) # 0.0533049 # Fail 검출율 pure.insp[2, 2] / sum(pure.insp[2, ]) # 0.1290323 table(sc.test$LABELS) # Pass Fail # 438 31
원시 데이터를 가지고 학습 control 옵션을 변경해서 검증한 결과 예측 결과가 미세하게 변경되었다.
2. sbML 패키지를 이용하여 전처리 과정 진행 후 rpart 학습 모델 사용
sbML 패키지에 있는 전처리 기능을 사용하여 학습을 시킨 후 예측력을 확인했다. 여기서는 예측력 비교를 모적으로 해서 전처리 기능에 대한 설명은 생략했다.
library("sbML") # 전처리기 설정을 생략 # 예측자(Row)에서 유효한 변수(Column)를 가지는 정도에 따라 처리 sbML.fullfill.ctrl <- preprocess.control.fullfill( skip = T, method=c("NA"), limit = c(lower = 5, upper = 50), target=NA ) # 전처리기 설정 정보를 생략 # .......................................... # 희소 데이터 전처리 sbML.sparse.ctrl <- preprocess.control.sparse(skip = T, method=c("RM"), breaks = c("Sturges"), target="Pass", exclude = NULL) # 전체 전처리기 수행 정보는 아래 명령에서 보이는 것 처럼 6가지를 사용 sbML.preprocess.controls <- preprocess.control( list(type = "fullfill", control = sbML.fullfill.ctrl ), list(type = "normality", control = sbML.normal.ctrl ), list(type = "distribu", control = sbML.distribu.ctrl ), list(type = "pairs", control = sbML.pairs.ctrl), list(type = "pairs", control = sbML.pairs.ctrl.02), list(type = "sparse", control = sbML.sparse.ctrl) ) # ------------------------------------------------------------------------------------------------------ # 전처리기(Preprocessor) 작업 수행 library("sbML") data(semiconductor) sbml.data.obj <- new("sbML.data", formula = LABELS ~ ., data=sc.train) sbml.obj <- new("sbML", data = sbml.data.obj, directory = "./sbml01.data", preprocess.save.count = 10L, training.save = T) sbml.obj <- initialize.do(sbml.obj) # 전처리 작업 수행 start_time <- Sys.time() sbml.obj <- preprocess.do(sbml.obj, controls = sbML.preprocess.controls, verbose = T) end_time <- Sys.time() cat(end_time - start_time) gc() # ----------------------------------------------------------------------------------------------------- # 훈련(Training) rpart.train.ctrl <- training.control.rpart(complexities = c(0.001), splites = c(10, 5, 3)) sbML.training.controls <- training.control( rpart = rpart.train.ctrl) # Training start_time <- Sys.time() sbml.obj <- training.do(sbml.obj, controls = sbML.training.controls, verbose = T, models=c("rpart")) end_time <- Sys.time() cat(end_time - start_time) gc() # ----------------------------------------------------------------------------------------------------- # 검증 sbml.obj <- predict.do(sbml.obj, data = sc.test, verbose = T, models = c("rpart")) # 오류율 20% 내에서 Fail 검출이 많은 결과 sbml.pred.eval@rpart[sbml.pred.eval@rpart$error.rate <= 0.20 & sbml.pred.eval@rpart$OBSRV.F_PRED.F >= 19, -which(colnames(sbml.pred.eval@rpart) %in% c("training.name", "preprocess.name", "model.control", "preprocess.routes"))] # name error.rate ALL.F OBSRV.F_PRED.F OBSRV.F_PRED.T OBSRV.T_PRED.T OBSRV.T_PRED.F # 127 predict_rpart_0064_0001 0.1663113 31 19 12 372 66 # 131 predict_rpart_0066_0001 0.1663113 31 19 12 372 66 # 133 predict_rpart_0067_0001 0.1449893 31 19 12 382 56 # 135 predict_rpart_0068_0001 0.1663113 31 19 12 372 66 # 137 predict_rpart_0069_0001 0.1449893 31 19 12 382 56 # .......................... # 311 predict_rpart_0156_0001 0.1556503 31 19 12 377 61 # 313 predict_rpart_0157_0001 0.1513859 31 20 11 378 60 # 314 predict_rpart_0157_0002 0.1535181 31 20 11 377 61 # 315 predict_rpart_0158_0001 0.1577825 31 20 11 375 63 # 319 predict_rpart_0160_0001 0.1556503 31 19 12 377 61 # ----------------------------------------------------------------------------------------------------- # 에러율 15% 이하에서 가장 높은 Fail을 검출하는 결과 obj.pred <- get.objects(sbml.obj, "predict_rpart_0154_0001") obj.pred@fitting@contingeny # OBSERV # PRED Fail Pass # Fail 19 45 # Pass 12 393 # 에러율 obj.pred@fitting@error.rate # 0.1215352 # Fail 예측 비율 sum(obj.pred@fitting@contingeny[1, ])/sum(obj.pred@fitting@contingeny) # 0.1364606 # Fail 검출율 sum(obj.pred@fitting@contingeny[1, 1]) / sum(obj.pred@fitting@contingeny[, 1]) # 0.6129032 # ---------------------------------------------------------------------------------------------------- # 에러율 10% 이하에서 가장 높은 Fail을 검출하는 결과 obj.pred <- get.objects(sbml.obj, "predict_rpart_0035_0001") obj.pred@fitting@contingeny # OBSERV # PRED Fail Pass # Fail 10 18 # Pass 21 420 # 에러율 obj.pred@fitting@error.rate # 0.08315565 # Fail 예측 비율 sum(obj.pred@fitting@contingeny[1, ])/sum(obj.pred@fitting@contingeny) # 0.05970149 # Fail 검출율 sum(obj.pred@fitting@contingeny[1, 1]) / sum(obj.pred@fitting@contingeny[, 1]) # 0.3225806
3. 예측 결과 비교
검증 데이터는 Fail 31개, Pass 448개 전체 479개를 가진다.
  sbML 검증 결과 순수 rpart
설명 오류율 10% 내
Fail 검술 수량 최고
오류율 15% 내
Fail 검술 수량 최고
cp = 0.001, minsplit = 3 cp = 0.001, minsplit = 5
에러율 8.3% 12.2% 9.6% 10.2%
Fail 예측 비율 6.0% 13.6% 4.3% 5.3%
Fail 검출율 32.3% (10/31) 61.3% (19/31) 10% (3/31) 13% (4/31)
오류율 10% 근처에서는 전처리를 수행한 데이터로 예측한(sbML 패키지) Fail 검출력이 약 3배 증가한다. 그리고 Fail(고위험) 오류률 15% 내에서 Fail 검출율은 61.3%가 됨을 확인했다.

실제 업무에서는 기본적 학습 옵션으로는 만족할 수 있는 결과를 내기 힘들다. 반드시 전처리 과정을 통해 예측력을 향상해야 한다.

sbML 전처리 방법을 이용한 검증 결과에서, 에러율 최소인 경우는 아래와 같다.
obj.pred <- get.objects(sbml.obj, "predict_rpart_0021_0001") obj.pred@fitting@contingeny # OBSERV # PRED Fail Pass # Fail 9 16 # Pass 22 422 # 에러율: 8.1 % obj.pred@fitting@error.rate # 0.08102345 # Fail 예측 비율: 5.3 % sum(obj.pred@fitting@contingeny[1, ])/sum(obj.pred@fitting@contingeny) # 0.0533049 # Fail 검출율: 29 % sum(obj.pred@fitting@contingeny[1, 1]) / sum(obj.pred@fitting@contingeny[, 1]) # 0.2903226
4. tensorFlow 수행 결과
여기서 사용한 데이터는 tensorFlow 에서 수행하기에 좋은 데이터가 아니다. tensorFlow 에서 학습을 수행하기에는 데이터 수가 부족했다. NA(Not Availabel, NULL) 데이터가 존재하여 데이터 수집 후 바로 학습을 실행할 수 없다. 그래서 NA 데이터를 채우는 방식을 평균값, 그리고 상관관계가 높은 예측 변수를 찾아 leanear method를 활용하여 대체했다. leanear method 은 상관관계를 찾지 못한 예측자(Row)는 제거되었다. Pass 52 개, Fail 2개 의 데이터가 검증 과정에서 제외되었다.

tensorFlow 학습 방식은 3단 망 구성, softmax, Xavier 초기값 설정, reLU 를 사용했다.
그리고 앙상블은 모델을 10개 생성하여 검증했다.
NA 처리 방식 평균값 leanear method
설명 신경망 신경망 앙상블
에러율 13.0% 11.6% 14.0%
Fail 예측 비율 7.7% 6.5% 9.4%
Fail 검출율 9.7% (3/31) 13.8% (4/29) 17.2%
데이터 수가 적어 tensorFlow 의 강점인 더 깊고 넓게 망을 구성하여 테스트 할 수 없었다.

댓글 없음:

댓글 쓰기