YOGYUI

빅데이터분석기사 실기 제2유형 문제 풀이 예시 Final 본문

Study/자격증

빅데이터분석기사 실기 제2유형 문제 풀이 예시 Final

요겨 2021. 6. 13. 12:43
반응형

공부 정리하면서 쓰다보니 어느새 예시 문제 하나가지고 4번째 글을 쓰게 됐다 (개꿀...?)

앞서 문제가 발생했던거 별다른 해결책은 떠오르지 않아서 그냥 훈련용 데이터에 주구매속성 및 주구매지점의 모든 도메인의 레코드가 적어도 1개 이상씩 포함되도록 시드값을 변경했다

 

시험장에서 시간이 충분하다면 레코드를 옮기는 작업을 하면 될텐데, R-Studio 환경도 아니니 이래저래 힘들것 같다 (아마 시험 당일에는 train-validation 홀드아웃도 진행못할 가능성이 높다)

 

set.seed(1234)

X_train <- read.csv('./data/X_train.csv')
y_train <- read.csv('./data/y_train.csv')
X_test <- read.csv('./data/X_test.csv')

#################### Pre-Processing ################################################
library(dplyr)
# 주구매상품 = '소형가전' 레코드 제외
X_train <- X_train %>% filter(!cust_id %in% c(1521, 2035))
X_train$주구매상품 <- as.factor(X_train$주구매상품)
X_train$주구매지점 <- as.factor(X_train$주구매지점)
X_train[is.na(X_train$환불금액),]$환불금액 <- 0  # 환불금액 NA 처리

X_test$주구매상품 <- as.factor(X_test$주구매상품)
X_test$주구매지점 <- as.factor(X_test$주구매지점)
X_test[is.na(X_test$환불금액),]$환불금액 <- 0  # 환불금액 NA 처리

# 주구매상품 = '소형가전' 레코드 제외
y_train <- y_train %>% filter(!cust_id %in% c(1521, 2035))
y_train$genfac <- ifelse(y_train$gender == 1, "남자", "여자")
y_train$genfac <- as.factor(y_train$genfac)

# Hold-Out: split train data to (train, validation)
library(caret)
split <- createDataPartition(y_train$gender, p=0.9)  # 9:1 Train-Validation Split
X_validation <- X_train[-split$Resample1,]
y_validation <- y_train[-split$Resample1,]
X_train <- X_train[split$Resample1,]
y_train <- y_train[split$Resample1,]

# Data Pre-processing
model_proc <- preProcess(X_train[,c(-1)], method=('range'))  # Normalization
X_train_proc <- predict(model_proc, X_train)
X_validation_proc <- predict(model_proc, X_validation)
X_test_proc <- predict(model_proc, X_test)

# up-sampling
temp <- X_train_proc
temp$genfac <- y_train$genfac
temp2 <- upSample(subset(temp, select=-genfac), temp$genfac)

X_train_proc <- subset(temp2, select=-Class)
y_train <- subset(temp2, select=c(cust_id, Class))
names(y_train) <- c('cust_id', 'genfac')
y_train$gender <- ifelse(y_train$genfac == '남자', 1, 0)

#################### Modeling ####################################################
# logistic regression
model_glm <- glm(y_train$gender ~ .-cust_id, data=X_train_proc, family='binomial')
y_pred_glm <- predict(model_glm, newdata=X_validation_proc, type='response')
pred_glm <- prediction(y_pred_glm, y_validation$gender)
perf_glm <- performance(pred_glm, measure='tpr', x.measure='fpr')

# random forest
library(randomForest)
model_rf <- randomForest(y_train$genfac ~ .-cust_id, X_train_proc)
y_pred_rf <- predict(model_rf, newdata=X_validation_proc, type='prob')[,'남자']
pred_rf <- prediction(y_pred_rf, y_validation$gender)
perf_rf <- performance(pred_rf, measure='tpr', x.measure='fpr')

#decision tree
library(rpart)
model_tree <- rpart(y_train$genfac ~ .-cust_id, X_train_proc)
y_pred_tree <- predict(model_tree, newdata=X_validation_proc, type='prob')[,'남자']
pred_tree <- prediction(y_pred_tree, y_validation$gender)
perf_tree <- performance(pred_tree, measure='tpr', x.measure='fpr')

#svm
library(e1071)
model_svm <- svm(y_train$genfac ~ .-cust_id, X_train_proc, probability = TRUE)
y_pred_svm <- predict(model_svm, newdata=X_validation_proc, probability = TRUE)
y_pred_svm <- attr(y_pred_svm, 'probabilities')[,'남자']
pred_svm <- prediction(y_pred_svm, y_validation$gender)
perf_svm <- performance(pred_svm, measure='tpr', x.measure='fpr')

일단은 GLM, Random Forest, Decision Tree 정도까지만 준비해가보도록 하자

(SVM이나 GBM은 하이퍼파라미터 튜닝이나 모델 구축 시간 등 이슈가 발생할 수 있다)

※ e1071 SVM은 probability 인수와 predict 시 확률 추출 방식 등에 대한 구문 숙지가 필요하다

 

performance(pred_glm, "auc")@y.values[[1]]
> [1] 0.6654731

performance(pred_rf, "auc")@y.values[[1]]
> [1] 0.6110556

performance(pred_tree, "auc")@y.values[[1]]
> [1] 0.6375327

performance(pred_svm, "auc")@y.values[[1]]
> [1] 0.6658862

검증용 데이터에서의 AUC는 SVM > GLM> Decision Tree > Random Forest 순으로 측정되었다

(역시 훈련용 데이터에서 ROC를 그렸을 때 0.99가 나오는건 의미가 없는 것이었어!)

 

plot(perf_glm, col='black', main='ROC Curve in Validation Dataset')
plot(perf_rf, col='red', add=TRUE)
plot(perf_tree, col='blue', add=TRUE)
plot(perf_svm, col='green', add=TRUE)
abline(0,1)
legend('bottomright', inset=.1, legend=c('GLM', 'RF', 'Tree', 'SVM'), col=c('black', 'red', 'blue', 'green'), lty=1, lwd=2)

모델들간의 성능은 랜덤포레스트를 제외하면 거기서 거기다

시간이 남는다 싶으면 파생변수 생성, 변수선택, 주성분분석 등 다양한 기법을 동원하면 분류 성능을 끌어올릴 수는 있을 것 같은데... 그런걸 하기에는 3시간은 충분치 않은 시간일 것 같다 (애초에 시험환경은 반응형 IDE가 아니라서 굉장히 고통스러울 것 같다... 준비하다보니 ADP 실기가 쉬운 시험처럼 느껴진다...)

 

테스트데이터의 분류 결과를 모델별로 추출해보자

result <- as.data.frame(cbind(X_test$cust_id, y_pred_glm_test, y_pred_rf_test, y_pred_tree_test, y_pred_svm_test))
names(result) <- c('cust_id', 'GLM', 'RF', 'TREE', 'SVM')
head(result)
>  cust_id       GLM    RF      TREE       SVM
1    3500 0.6572339 0.606 0.3542857 0.6008150
2    3501 0.2170233 0.160 0.3542857 0.1820857
3    3502 0.2836843 0.178 0.3542857 0.3576464
4    3503 0.4891047 0.322 0.6696774 0.5803261
5    3504 0.5291117 0.336 0.6696774 0.6216005
6    3505 0.3644685 0.438 0.4112150 0.4107317

모델을 여러개 만들었다면, 그 결과를 어떻게 활용해서 답안으로 제출할지는 수험자의 판단이 작용해야 할 것 같다 (훈련 시 분류 성능이 가장 높은 모델의 분류 결과를 사용할지, 여러 모델의 vote를 통한 앙상블 기법을 활용할지 등)

 

마무리

  • R Studio의 인메모리 변수 확인, 코드 자동 완성, 데이터 시각화 기능은 모두 없다고 생각하고 준비해야 한다
    즉, 반드시 써야 하는 코드를 완전히 외워가야만 한다 (외운다기보다는 손이 저절로 코딩을 하는 수준?)
    캐글에서 심플한 데이터 몇 개 가져와서 자기 나름대로의 코드를 만들어보고, 결과물이 마음에 든다면 반복 코딩해보자
  • 제1유형 문제는 데이터 표준화/정규화 및 파생변수 생성, 통계 검정(?) 혹은 상관관계 분석이 주로 출제될 것 같다
    제2유형 문제만 준비했다가 제1유형에서 기본적인 함수명이나 사용법이 기억나지 않아 낭패를 당하지 않도록 하자
    (dplyr만 알차게 준비해가도 충분히 대응가능할 것 같다)
  • 제2유형 문제는 '분류분석' 혹은 '회귀분석' 두 유형의 문제 중 하나가 출제될 것 같다 (채점의 용이성)
    회귀분석이 나온다면 lm, 분류분석이 나온다면 glm 모델을 가장 기본적으로 구축한 뒤, 의사결정나무, 랜덤포레스트, SVM, GBM, NN 등 다양한 모델을 2~3개 구축할 수 있다면 최소 점수는 획득할 수 있을 것 같다
  • read.csv, write.csv 두 함수 사용법은 확실히 익히고 가야 한다
    (아마 인코딩이 꼬여있다거나 그런 이슈는 발생하지 않을 것 같다)
  • 구축한 모델에 대한 성능 평가는 시험 도중에 한번은 해봐야 속이 편할 것 같다
    (테스트 데이터에 대한 정답은 당연히 주어지지 않을테니)
    분류분석이라면 혼동행렬 작성 후 Accuracy 지표정도는 뽑아봐야 될 듯... (ROCR 패키지가 제공된다면 AUC도 구해보고)
    회귀분석이라면 간단하게 RMSE 계산하면 될듯
  • MASS 패키지가 주어지니 stepAIC로 lm이나 glm 모델의 변수 선택은 준비해가는게 좋을 것 같다
    (데이터 전처리를 깔끔하게 하지 않았다면 변수 선택 후 보통은 성능이 좋아진다)
  • 릿지나 라쏘 (glmnet) 모형은 시간이 허락한다면 준비해가서 구현해보도록 하자
  • 부스팅 (gbm)은 모형 적합 시간이 오래 걸리니 시험장에서 쓰긴 부적합해 보인다
  • 인공신경망 (nnet)은 많이 써본사람이라면 써보는 것도 나쁘지 않을듯? (과적합만 피하면 된다)

 

[시리즈]

빅데이터분석기사 실기 제2유형 문제 풀이 예시 (1)

빅데이터분석기사 실기 제2유형 문제 풀이 예시 (2)

빅데이터분석기사 실기 제2유형 문제 풀이 예시 (3)

빅데이터분석기사 실기 제2유형 문제 풀이 예시 Final

반응형