본문 바로가기

자격증/빅데이터 분석기사

[분류] 2. 분류 모델 구현해보기 in R (랜덤포레스트,SVM)

 

 

# 처음부터 8009 건을 학습 데이터 (X_train.csv) 로 정시도착 가능여부 예측모델을 만들고,
# 학습 데이터 외의 평가 데이터 (X_test.csv)에 대하여 정시도착 여부를 예측

# 데이터 전처리
## 필요없는 변수 제거
df <- read.csv("sample_data/Train.csv")
df <- df[,-1]    # ID 변수 제거

# 종속변수 factor 전환
df$Reached.on.Time_Y.N <- as.factor(df$Reached.on.Time_Y.N)

# 범주형 변수 factor 전환 (Warehouse_block, Mode_of_Shipment, Product_importance, Gender)
df$Warehouse_block <- as.numeric(as.factor(df$Warehouse_block), levels=c("D","F","A","B","C"))
df$Mode_of_Shipment <- as.numeric(as.factor(df$Mode_of_Shipment), levels=c('Flight','Ship','Road'))
df$Product_importance <- as.numeric(as.factor(df$Product_importance), levels=c('low','medium','high'))
df$Gender <- as.numeric(as.factor(df$Gender),levels=c('F','M'))

# train, test 분리
train <- df[1:8009,]
test <- df[8010:nrow(df),]

# df_train, df_val 분리 (7:3)
idx <- sample(1:nrow(train),0.7*nrow(train))
df_train <- train[idx,]
df_val <- train[-idx,]

 

CSV 파일을 읽을 때 stringsAsFactor 옵션을 True 로 설정하면 문자변수가 Factor로 모두 변환된다.

 

     → Factor 변환 전처리를 따로 할 필요가 없음 !

 

 

# 모델 훈련 및 예측
library(randomForest)
library(e1071)
library(caret)
library(ModelMetrics)
library(ggplot2)

set.seed(1234)
m1 <- randomForest(Reached.on.Time_Y.N~., data=df_train, probability=T)   # 랜덤포레스트
m2 <- svm(Reached.on.Time_Y.N ~., data=df_train, probability=T)   # SVM 

pred1 <- predict(m1,df_val,probability = T, type="response")
pred2 <- predict(m2,df_val,probability=T)

caret::confusionMatrix(df_val$Reached.on.Time_Y.N,pred1)$overall[1]  # 랜덤포레스트 accuracy : 0.71
caret::confusionMatrix(df_val$Reached.on.Time_Y.N,pred2)$overall[1]   # SVM accuracy : 0.70

 

# 최종모델 - 랜덤포레스트
model <- randomForest(Reached.on.Time_Y.N~., data=train, probability=T)
pred <- predict(model,test,probability = T,type="prob")
head(pred)

# 정시도착 여부를 예측값을 CSV 로 저장하기
result <- data.frame(c(1:nrow(test)),pred[,2])
colnames(result) <- c("index","y_pred")
# head(result)

write.csv(result,"수험번호.csv",row.names=F)
read.csv("수험번호.csv")

 

ID 변수도 분석에 포함하여 CSV 파일로 저장한다면

# X_result <- cbind(test$ID, pred_prob)
# colnames(X_result) <- c("ID","pred")
# write.csv(X_result,"수험번호.csv",row.names=F)
# result <- read.csv("수험번호.csv")
# print(result)