빅분기

제4회 빅데이터분석기사 실기 만점 후기 3/3 (작업형 2형)

멋쟁이천재사자 2022. 7. 9. 00:02

작업형 2는 일단 결론부터 말씀드리면, R을 이용하여 가장 기본적인 형태의 randomForest 로 작성했고 AUC 0.52 정도였는데 만점이 나왔어요.

 

 

 

 

시험을 준비하는 단계에서 작업형 2는 단답형 작업형1 작업형2 세 가지중 부담이 가장 큰 부분이었습니다.

groom (https://dataq.goorm.io/exam/116674/체험하기/quiz/3)에서 다양한 연습을 해본 결과, 새로운 유형의 이상한 문제가 나온다면 (R Studio에서는 풀 수 있을지 몰라도) groom 에서는 빵점을 맞을 수도 있다는 생각이 들었습니다.

 

--------------------------------------------------------------------------------------------------------------

1. 시험전 준비하고 연습한 작전

--------------------------------------------------------------------------------------------------------------

디버깅이 불가능한 groom 에서의 전략은 1단계 -> 2단계 -> 3단계를 각각 아래와 같이 설정해서 연습했어요

 

1단계 (성공하면 어쩌면 10점 예상)

 - 코드 : csv 읽고 -> 0 이나 1 등의 가짜 데이터로 칼럼 추가하고 -> csv 제출

 - 주의 사항 : test 데이터의 건수와 맞는지, 칼럼 이름 등 문제 지시사항을 준수하였는지 필수 체크

 

2단계 (성공하면 최소 20점 예상)

 - 코드 : 1단계 코드에, 7:3 나누고 랜포로 기본 모델 만들고 predict 추가 하여 제출

 - 주의 사항 : 결측치가 있다면 na.omit 등 가장 손쉬운 방법으로 처리

 

3단계 (최적화 시도/SVM/XGBoost 등 다른 방법 수행후 비교 등등)

 - 결측치가 있다면 적절한 처리 (필수)

 - caret::train 을 이용한 mtry 등 하이퍼 파라미터 최적값 구하기 (구한 후에는 1분 초과 Risk 없애기 위해 관련 부분 주석처리하고 최적값을 직접 모델에 반영해서 제출)

 - recipes 를 이용한 불필요 변수 제거 또는 파생변수 생성 후 성능 비교

 - 클래스불균형심하면 caret::upSample 등 처리

 

--------------------------------------------------------------------------------------------------------------

2. 실전은 어떠했는지

--------------------------------------------------------------------------------------------------------------

단답형 - 1유형 - 2유형 빠른 1회 과정에서는 실제 연습한 1단계 코드로 작성해서 제출했어요.

 

두번째 턴에서 2단계 작성을 했는데, 결측치가 없어서 너무너무 좋았으나 다중분류라서 당황했어요.

이진 분류만 연습한 상태였는데 다중분류 문제가 나왔고, AUC score 가 0.52 정도 밖에 나오지 않아 크게 당황했습니다.  

4가지 분류문제로서 랜덤으로 찍는다면 0.25 이니 0.5는 어쩌면 우수한 결과라고 할 수 있겠네요. 

그러나 시험보는 중간에는 랜덤으로 찍을때 0.5라고 착각을 했고 뭔가 심각한 실수가 있는 것은 아닐까  고민을 하게 되었어요.

 

3번째 4번째 반복해서 코드를 다시 보았지만 수정하지 않았어요.

이런 저런 생각을 하다가 그냥 제출하는 것이 최선이라는 판단을 했어요.

1:1 또는 1:다 방식으로 이진분류를 여러번 수행하여 결과를 종합하는 코드를 작성해볼까 생각을 잠시했어요.

시간이 많이 남아있었기 때문에 R Studio 였다면 시도를 해봤을지도 모르겠네요.

그런데 다시 생각하니 패캐지에 구현된 로직이 제가 작성하는 것보다 못할리 없을 것이라고 깨달았지요. 또한 groom 에서는 Error 없는 코드를 완성할 수 없을 것이라는 판단이 들어요.

그리고 0.52 라는 Score 가 그렇게 나쁘지만은 않다는 사실을 간파^^했지요.

튜닝으로 성능을 올리는 것은 쉽지 않습니다.

 

 

--------------------------------------------------------------------------------------------------------------

3. 시험을 끝나고

--------------------------------------------------------------------------------------------------------------

write.csv(변수명,'003000000.csv',row.names=F,quote = F) 와 같이 quotation 을 빼는 옵션을 주지 않아서 0점 나오면 어쩌나 걱정을 했어요.

https://cafe.naver.com/sqlpd/36576

 

칼럼명 "Segmentation_pred" 는 괜찮을까요

R 응시자입니다. 칼럼명은 문제의 지시에 따라 Segmentation_pred 로 정확히 저정했습니다만 혹시 0점 처리 될까 걱정이 좀 됩니다. 답안 작성 영역에 있는...

cafe.naver.com

 

--------------------------------------------------------------------------------------------------------------

4. R 로 시험을 처음보는 분들께

--------------------------------------------------------------------------------------------------------------

만약에 R 사용자가 체험환경(https://dataq.goorm.io/exam/116674/체험하기/quiz/3)에서 충분히 연습하지 않고 시험을 본다면 십중 팔구는 0점을 받을 것이 분명합니다.

일부러 오타를 내서 스샷을 떳어요.

 

groom 은 에러메시지 하나밖에 몰라요.

Makefile:5: recipe for target 'R_run' failed

무슨 말인지 어떻게 알까요. 

 

 

X_test.csv 등 파일을 groom 과 똑같은 경로에 똑같은 이름으로 제 로칼에 가져다 두고 R Studio에서 해보면 

Error in as.facotr(train$gender) : could not find function "as.facotr"

as.facotr 라는 함수가 없다고 알려주잖아요. 

 

groom 에서 예제를 풀다가 어려워서 R Studio 도움을 받아 해결한 오류들은 아래와 같습니다.

 

One or more factor levels in the outcome has no data
number of rows of result is not a multiple of vector length 
class levels is not a valid R variable name 
New factor levels not present in the training data 
There are new levels in a factor 

 

결측치 관련문제, train test 셋의 level 이 다른 factor 로 발생하는 오류들이 Makefile:5: recipe for target 'R_run' failed 라는 오류메시지만으로는 도저히 디버깅을 할수 없었어요. 그래서 R로 응시하시려는 분들은 groom 에서의 연습은 필수이며, 코드는 최대한 단순하게 작성하도록 하세요. 

 

--------------------------------------------------------------------------------------------------------------

5. 연습했던 코드들 남기고 마무리할께요

--------------------------------------------------------------------------------------------------------------

##### 단순 버전 
library(caret) 
library(recipes) 
library(dplyr) 
library(stringr) 
library(randomForest) 
  
X_test = read.csv('data/X_test.csv')  
X_train = read.csv('data/X_train.csv')  
y_train = read.csv('data/y_train.csv') 
  
# rbind(X_train,X_test) # format ok 
  
train <- left_join(X_train,y_train,by="cust_id") #3500 
train$y <- as.factor(train$gender) # ifelse(gender ... 
levels(train$y) <- c("female","male") 
  
#head(train[,1:10]) 
train <- cbind(train[,1:10],y=train[,12])  
str(train) 
train <- na.omit(train) # 임시 처리 
  
test <- X_test 
test <- na.omit(test) # 임시 처리 
  
answer <- cbind(cust_id = X_test[,1],gender = 0.5) 
  
write.csv(answer,"000000.csv",row.names=F) 
head(read.csv("000000.csv")) 


#####  recipe juice bake train predict 버전
library(caret) 
library(recipes) 
library(dplyr) 
library(stringr) 
library(randomForest) 
  
X_test = read.csv('data/X_test.csv')  
X_train = read.csv('data/X_train.csv')  
y_train = read.csv('data/y_train.csv') 
  
# rbind(X_train,X_test) # format ok 
train <- left_join(X_train,y_train,by="cust_id") #3500 
train$y <- as.factor(train$gender) # ifelse(gender ... 
levels(train$y) <- c("female","male") 

train <- cbind(train[,1:10],y=train[,12])
str(train) 
test <- X_test 

# train ##################################################################
formula <- y ~ 최대구매액 + 환불금액 
recipe_pp <- train %>% recipe(formula) %>%  
step_mutate(환불금액 = ifelse(is.na(환불금액),0,환불금액)) %>% 
#step_other(주구매상품,주구매지점) %>% 
#step_dummy(주구매상품,주구매지점, one_hot=T) %>% 
prep() 
  
finaltrain <- juice(recipe_pp) 
finaltest <- bake(recipe_pp, test) 
fitControl <- trainControl(method = "cv", number=3, verboseIter = T,classProbs = T,summaryFunction = twoClassSummary) 

model <- train(formula,method = "rf",finaltrain,trControl=fitControl,metric="ROC") 
pred <- predict(model, newdata = finaltest, type="prob") 
  
# 제출 ##################################################################
write.csv(answer,"000000.csv",row.names=F) 
head(read.csv("000000.csv")) 

 

 

 

빅분기 작업형 1유형 연습 문제[R]