R

[빅분기 실기] GLM, 랜덤포레스트 최종 시험환경 버전

한번해보즈아 2021. 6. 18. 12:15
library(randomForest)
library(dplyr)
library(pROC)
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")

full_train <- left_join(x_train,y_train, by="cust_id")

full_train$환불금액 <- ifelse(is.na(full_train$환불금액),0,full_train$환불금액)
full_train$gender <- as.factor(full_train$gender)
full_train$총구매액 <- scale(full_train$총구매액)
full_train$최대구매액 <- scale(full_train$최대구매액)
full_train$환불금액 <- scale(full_train$환불금액)
full_train$내점일수 <- scale(full_train$내점일수)
full_train$내점당구매건수 <- scale(full_train$내점당구매건수)
full_train$주말방문비율 <- scale(full_train$주말방문비율)
full_train$구매주기 <- scale(full_train$구매주기)

idx <-sample(1:nrow(full_train), 0.7*nrow(full_train), replace=F)
pre_train <- full_train[idx,]
pre_test <- full_train[-idx,]

rf.model <- randomForest(gender~.,
						data=pre_train,
						ntree=50,
						mtry=sqrt(10),
						importance=T)
pred.rf <- predict(rf.model, pre_test[,-11],type="prob")

auc(pre_test[,11], pred.rf[,2])

##############test 데이터 전처리시작
x_test$gender <- NA
final_test <- rbind(full_train[1,], x_test)[-1,]

final_test$환불금액 <- ifelse(is.na(final_test$환불금액),0,final_test$환불금액)
final_test$총구매액 <- scale(final_test$총구매액)
final_test$최대구매액 <- scale(final_test$최대구매액)
final_test$환불금액 <- scale(final_test$환불금액)
final_test$내점일수 <- scale(final_test$내점일수)
final_test$내점당구매건수 <- scale(final_test$내점당구매건수)
final_test$주말방문비율 <- scale(final_test$주말방문비율)
final_test$구매주기 <- scale(final_test$구매주기)

final_pred <- predict(rf.model, final_test[,-11], type="prob")
final <- data.frame(custid=final_test$cust_id,
										gender=final_pred[,2])

write.csv(final,"1234.csv",row.names=F)
aaa <- read.csv("1234.csv")
head(aaa)

 

랜덤포레스트는 소수점이 둘째짜리까지 밖에 안나오는 단점이 있으며 중간에 rbind를 이용하여 수준수를 맞춰줘야한다 

pre_test, pre_train을 나눠서 auc를 산출한 결과 약 0.65가 나옵니다. 조금더 높이기 위해서는 시험날에는 전체 데이터를 이용하여 학습한다음에 예측하는것도 괜찮을거같습니다.

 

 

library(randomForest)
library(dplyr)
library(pROC)
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")

full_train <- left_join(x_train,y_train, by="cust_id")

full_train$환불금액 <- ifelse(is.na(full_train$환불금액),0,full_train$환불금액)
full_train$gender <- as.factor(full_train$gender)
full_train$총구매액 <- scale(full_train$총구매액)
full_train$최대구매액 <- scale(full_train$최대구매액)
full_train$환불금액 <- scale(full_train$환불금액)
full_train$내점일수 <- scale(full_train$내점일수)
full_train$내점당구매건수 <- scale(full_train$내점당구매건수)
full_train$주말방문비율 <- scale(full_train$주말방문비율)
full_train$구매주기 <- scale(full_train$구매주기)

idx <- sample(1:nrow(full_train), 0.7 * nrow(full_train), replace=F)

pre_test <- full_train[-idx,]

glm.model <- glm(gender~.,
								data=full_train,
								family="binomial")

pred.glm <- predict(glm.model, pre_test[,-11], type="response")


auc(pre_test[,11], pred.glm)


### 전체 데이터를 가지고 학습할수밖에없다...
##test 전처리
x_test$gender <-NA 
final_test <- rbind(full_train[1,], x_test)[-1,]
final_test$환불금액 <- ifelse(is.na(final_test$환불금액),0,final_test$환불금액)
final_test$주구매상품 <- as.factor(final_test$주구매상품)
final_test$주구매지점 <- as.factor(final_test$주구매지점)
final_test$총구매액 <- scale(final_test$총구매액)
final_test$최대구매액 <- scale(final_test$최대구매액)
final_test$환불금액 <- scale(final_test$환불금액)
final_test$내점일수 <- scale(final_test$내점일수)
final_test$내점당구매건수 <- scale(final_test$내점당구매건수)
final_test$주말방문비율 <- scale(final_test$주말방문비율)
final_test$구매주기 <- scale(final_test$구매주기)

pred_final <- predict(glm.model, final_test[,-11], type="response")


final <- data.frame(custid=x_test$cust_id,
                    gender=pred_final)


write.csv(final, "exam.csv", row.names=F)

aaa <- read.csv("exam.csv")
head(aaa)
tail(aaa)


 

로지스틱 회귀분석으로 분석할때는 사전에 pre_train, pre_test를 나눠서 하면 sample할때 수준수가 일정하게 추출되지 않아 에러가 뜨게 됩니다. 따라서 그냥 전체 데이터를 이용해 학습한 다음에 예측 하는 코드입니다. 이거는 전체데이터를 이용해서 학습한다음 예측한거라서 auc는 0.69정도 나오게 됩니다.