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