R

[R 프로그램] Kaggle 타이타닉 생존자 예측(6) - Modeling(Logistic Regression) 및 Submission

Yeenn 2021. 12. 7. 17:32
728x90

Modeling 전 최종 data 확인

#Feature Engineering 이후 data
str(data)
'data.frame':	1309 obs. of  14 variables:
 $ PassengerId: int  1 2 3 4 5 6 7 8 9 10 ...
 $ Survived   : Factor w/ 2 levels "No","Yes": 1 2 2 2 1 1 1 1 2 2 ...
 $ Pclass     : Factor w/ 3 levels "1","2","3": 3 1 3 1 3 3 1 3 3 2 ...
 $ Sex        : chr  "male" "female" "female" "female" ...
 $ Age        : num  22 38 26 35 35 ...
 $ SibSp      : int  1 1 0 1 0 0 0 3 0 1 ...
 $ Parch      : int  0 0 0 0 0 0 0 1 2 0 ...
 $ Fare       : num  2.11 4.28 2.19 3.99 2.2 ...
 $ Embarked   : Factor w/ 3 levels "C","Q","S": 3 1 3 3 3 2 3 3 3 1 ...
 $ Baby       : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
 $ Group_size : Factor w/ 3 levels "Single","Small",..: 2 2 1 2 1 1 1 3 2 2 ...
 $ T_group    : chr  NA "Couple_T" NA "Couple_T" ...
 $ T_Group    : Factor w/ 3 levels "Single_T","Couple_T",..: 1 2 1 2 1 1 2 3 3 2 ...
 $ Crew       : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 
#PassengerID 변수 삭제
data$PassengerId <- NULL

 

Feature Engineering까지 모두 마친 후, 모델링에 들어가기 전 최종 data의 모습을 확인하였으며, 필요없는 PassengerID 변수는 제거하였다.

 

 

 

Train, Test 데이터 만들기

#Train, Test 
train <- data[1:split_num, ]
test <- data[-(1:split_num), ]

head(train)
 Survived Pclass    Sex      Age SibSp Parch     Fare Embarked Baby Group_size  T_group  T_Group Crew
1       No      3   male 22.00000     1     0 2.110213        S    0      Small     <NA> Single_T    0
2      Yes      1 female 38.00000     1     0 4.280593        C    0      Small Couple_T Couple_T    0
3      Yes      3 female 26.00000     0     0 2.188856        S    0     Single     <NA> Single_T    0
4      Yes      1 female 35.00000     1     0 3.990834        S    0      Small Couple_T Couple_T    0
5       No      3   male 35.00000     0     0 2.202765        S    0     Single     <NA> Single_T    0
6       No      3   male 29.88114     0     0 2.246893        Q    0     Single     <NA> Single_T    0
head(test)
 Survived Pclass    Sex  Age SibSp Parch     Fare Embarked Baby Group_size  T_group  T_Group Crew
892     <NA>      3   male 34.5     0     0 2.178064        Q    0     Single     <NA> Single_T    0
893     <NA>      3 female 47.0     1     0 2.079442        S    0      Small     <NA> Single_T    0
894     <NA>      2   male 62.0     0     0 2.369075        Q    0     Single     <NA> Single_T    0
895     <NA>      3   male 27.0     0     0 2.268252        S    0     Single     <NA> Single_T    0
896     <NA>      3 female 22.0     1     1 2.586824        S    0      Small Couple_T Couple_T    0
897     <NA>      3   male 14.0     0     0 2.324836        S    0     Single     <NA> Single_T    0

 

train과 test 데이터를 나눈 후, head()를 통해 확인해보았다.

차이점은 Survived 변수에서 확인할 수 있는데, test셋에는 train셋과 달리 Survived 변수의 값이 NA로 채워져 있다.

train셋을 통해 test데이터를 예측하는 것이 이번 모델링의 목표이다.

 

 

 

Data Split

#시드 설정 후 7:3 분할
set.seed(1)
train_idx<-createDataPartition(train$Survived, p=0.7, list=F)

train_M<-train[train_idx, ]
val_M<-train[-train_idx, ]

 

validation set을 통해 모형을 평가할 수 있도록 하기 위해 caret패키지의 createDataPartition 함수를 사용해 7:3의 비율로 분할한 후, train_M과 val_M데이터를 설정하였다. 

 

 

 

1차 모형 적합

#Logistic 회귀모형 적합
fit_Logistic <- glm(Survived~.,
                    data=train_M,
                    family='binomial')

# validation의 경우 예측값 출력
pred_Logistic <- predict(fit_Logistic, newdata = val_M, type = 'response')

#출력 타입변경
Logistic_val <- ifelse(pred_Logistic > 0.5, 1, 0)
Logistic_val <- factor(Logistic_val, levels = c(0, 1), labels = c('No', 'Yes'))

#예측정확도 확인
confusionMatrix(Logistic_val, val_M$Survived)
Confusion Matrix and Statistics

          Reference
Prediction  No Yes
       No  141  32
       Yes  23  70
                                          
               Accuracy : 0.7932  #예측정확도        
                 95% CI : (0.7395, 0.8403)
    No Information Rate : 0.6165          
    P-Value [Acc > NIR] : 4.694e-10       
                                          
                  Kappa : 0.5553          
                                          
 Mcnemar's Test P-Value : 0.2807          
                                          
            Sensitivity : 0.8598          
            Specificity : 0.6863          
         Pos Pred Value : 0.8150          
         Neg Pred Value : 0.7527          
             Prevalence : 0.6165          
         Detection Rate : 0.5301          
   Detection Prevalence : 0.6504          
      Balanced Accuracy : 0.7730          
                                          
       'Positive' Class : No

 

예측정확도는 내부적으로 약 79%인 것을 확인할 수 있었다. 

이제 최종 모형을 train전체를 활용하여 적합하겠다.

 

 

 

최종 모형 적합

#최종모형적합
fit_final <- glm(Survived~.,
                 data=train,
                 family='binomial')

pred_final <- predict(fit_final, newdata=test, type='response')

final_val <- ifelse(pred_final>0.5, 1, 0)
final_val <- factor(final_val, levels=c(0,1), labels=c('No', 'Yes'))

 

최종모형을 적합해주고 예측을 진행하였다.

 

 

 

제출용 파일 만들기 및 제출

#SUbmission 파일
submission <- read.csv('gender_submission.csv')
submission$Survived <- (as.integer(final_val)-1)

write.csv(submission, 'submisison.csv', row.names=F)

 

Kaggle의 submisison 파일 제출 형식에 따라 write.csv로 재출용 파일을 만들어주었다.

작업디렉토리를 확인해보면, submission.csv 파일이 저장되어있는 것을 확인할 수 있다.

 

 

 

최종 스코어는 0.76076을 기록하였다.

 

728x90