R code for Kaggle Tabular Playground Series - May 2021

giyu11·2021년 6월 5일
0

R 기술 블로그

목록 보기
2/3
post-thumbnail
library(tidyverse)
library(tidymodels)
library(caret)


train <- read.csv("train.csv")

test <- read.csv("test.csv")

str(train)


colSums(is.na(train))

colSums(is.na(test))


train <- train %>% select(-1)

str(train)

custid <- test$id

test <- test %>% select(-1)

str(test)

test$target <- 0

str(test)


summary(train)

summary(train)


train$feature_19 <- ifelse(train$feature_19 < 0, 0, train$feature_19)

train$feature_30 <- ifelse(train$feature_30 < 0, 0, train$feature_30)

train$feature_31 <- ifelse(train$feature_31 < 0, 0, train$feature_31)

train$feature_32 <- ifelse(train$feature_32 < 0, 0, train$feature_32)

train$feature_35 <- ifelse(train$feature_35 < 0, 0, train$feature_35)

train$feature_38 <- ifelse(train$feature_38 < 0, 0, train$feature_38)

train$feature_39 <- ifelse(train$feature_39 < 0, 0, train$feature_39)

train$feature_42 <- ifelse(train$feature_42 < 0, 0, train$feature_42)


str(train)

summary(train)

summary(test)


test$feature_14 <- ifelse(test$feature_14 < 0, 0, test$feature_14)

test$feature_19 <- ifelse(test$feature_19 < 0, 0, test$feature_19)

test$feature_30 <- ifelse(test$feature_30 < 0, 0, test$feature_30)

test$feature_31 <- ifelse(test$feature_31 < 0, 0, test$feature_31)

test$feature_32 <- ifelse(test$feature_32 < 0, 0, test$feature_32)

test$feature_38 <- ifelse(test$feature_38 < 0, 0, test$feature_38)

test$feature_39 <- ifelse(test$feature_39 < 0, 0, test$feature_39)

summary(test)



recipe <- train %>% recipe(target ~.) %>% 
  
  step_mutate_at(all_predictors(), fn=factor) %>%
  
    step_other(all_nominal(), -target) %>%
  
      step_dummy(all_nominal(), one_hot = T, -target) %>%
  
        prep(training = train)


train1 <- juice(recipe)

str(train1)

test1 <- bake(recipe, test)

str(test1)

test1 <- test1 %>% select(-1)

str(test1)


levels(train1$target)

table(train1$target)

levels(train1$target) <- c("0", "1", "2", "3")

levels(train1$target)


xgm <- xgboost::xgboost(data = as.matrix(train1[, -1]), label = as.matrix(train1[,1]), 
                        objective = "multi:softprob", num_class = 4,
                        nrounds = 100)


pred.xgm <- predict(xgm, as.matrix(test1), reshape = T)

pred.xgm

pred.xgm <- data.frame(pred.xgm)

str(pred.xgm)

names(pred.xgm) <- c("Class_1", "Class_2", "Class_3", "Class_4")

pred.xgm


str(pred.xgm)

pred.xgm$id <- custid

str(pred.xgm)

pred.xgm <- pred.xgm[, c(5,1,2,3,4)]

pred.xgm

str(pred.xgm)


colSums(is.na(pred.xgm))

write.csv(pred.xgm, "kagglesub.csv", row.names = F)

이번 데이터는 다항 분류 예측 유형이기 때문에 xgboost multi:softprob 모델을 사용하였다.

연속형 변수들을 범주형 변수들로 바꾸기 위해 summary() 함수를 통해 전체적인 요약 통계량을 보았는데, 일부 변수에서 음수의 값이 존재하였기 때문에 이들의 값을 0으로 대체하였다.

데이터 전처리로는 일단 연속형 변수들을 범주형 변수들로 바꾸고, 변수별 레벨이 너무 많았기 때문에 step_other 함수를 통해 일정 레벨만 뽑아낸 다음 더미화를 진행하였다.

그리고 xgboost 모델을 사용했는데 여기서 오류가 났다. train1 데이터의 타겟 변수 target의 레벨명 error 때문에 num_class 파라미터에서도 문제가 생겼다.

따라서 train1 데이터의 타겟 변수 target의 레벨명을 임시로 바꾸었고, 그러고 나자 모형 학습이 잘 돌아갔다.

다만 예측 모형에서 다시 레벨명을 원 상태로 복귀시켜야 한다는 점 또한 잊으면 안 될 것이다.

최종 Score는 Multiclass Loss 값이 1.10986로 중간 정도의 결과가 나온 것 같다.

일단 다항 분류 학습의 전체적인 흐름을 파악할 수 있어서 좋은 공부였다.

profile
R과 SQL을 활용한 데이터 분석을 지향합니다.

0개의 댓글