泰坦尼克号(RMS Titanic):20世纪初,由英国白星航运公司制造的一艘巨大豪华客轮。是当时世界上最大的豪华客轮,被称为是“永不沉没的”或是“梦幻客轮”。但她却在1912年4月15日从南安普顿至纽约的处女航中,在北大西洋撞上冰山而沉没,由于缺少足够的救生艇,1500人葬生海底,造成了在和平时期最严重的一次航海事故,也是迄今为止最著名的一次。派拉蒙电影公司与20世纪福克斯电影公司于1997年将“泰坦尼克号”的事件改编为电影,在全球各地上映,轰动全球,也让她变得家喻户晓。
根据kaggle提供的数据集 ,总共样本1392,分为训练集,892个样本,其中存活乘客392人,测试样本,419个。数据集可以从kaggle官方网站下载,也可以从我的百度云盘下载。
首先对数据进行概览,数据集中包含字段,
PassengerId:乘客编号
Survived :存活情况(存活:1 ; 死亡:0)
Pclass:客舱等级(1,2,3)
Name:乘客姓名(姓+称谓+名)
Sex:性别(male男,female女性)
Age:年龄(乘客年龄)
SibSp:同乘的兄弟姐妹/配偶数()
Parch:同乘的父母/小孩数(小孩和保姆会算为0)
Ticket:船票编号(船票号,有多个人公用一个船票号)
Fare:船票价格(乘船费用)
Cabin:客舱号(客舱编号)
Embarked : 登船港口(C = Cherbourg, Q = Queenstown, S = Southampton)
其中根据数据概览中可以看出,其他Age、Fare、Cabin和Embarked有缺失值:
下面对缺失值进行处理:
乘客年龄:由于缺失值较多,暂不做处理。
Fare根据kaggle上的多种模型验证一致认为缺失的乘客的数值为:8.05,
Cabin有相同Ticket号的具有相同的Cabin,根据这条规则填充了12条数据,其余填充为Unknown;
Embarked有两个缺失值,用C进行填充;
trainset <- read.csv('./train.csv', stringsAsFactors = F)
testset <- read.csv('./test.csv', stringsAsFactors = F)
fullset <-bind_rows(trainset, testset)#
str(fullset)#
fullset$Embarked[c(62,830)] <-'C'
fullset$Fare[1044] <-median(fullset[fullset$Pclass =='3'&fullset$Embarked =='S', ]$Fare,na.rm =TRUE)
CabinNA<-subset(fullset,fullset$Cabin=="")
CabinY<-subset(fullset,fullset$Cabin!="")
samet<-intersect(CabinNA$Ticket,CabinY$Ticket)
x<-match(samet,CabinY$Ticket)
for (i in x) {CabinNA$Cabin[i]<-CabinY$Cabin[i]}
fullset<- rbind(CabinNA,CabinY)
fullset$Cabin[fullset$Cabin=="NA"]<-"Unknown"
age预测
factor_vars <-c('PassengerId','Pclass','Sex','Embarked')
fullset[factor_vars] <-lapply(fullset[factor_vars], function(x)as.factor(x))
# Set a random seed
set.seed(129)
# Perform mice imputation, excluding certain less-than-useful variables:
mice_mod <- mice(fullset[, !names(fullset) %in% c('PassengerId','Name','Ticket','Cabin','Survived')], method='rf')
mice_output <-complete(mice_mod)
fullset$Age <-mice_output$Age
trainfullc <-full[1:891,]
testfullc <-full[892:1309,]
下面我选择随机森林(RandomForest)、决策树(DecisionTree)、logit 模型和支持向量机,建立模型,先建立一个预测的基准。
# Set a random seed
set.seed(754)
# Build the model (note: not all possible variables are used)
rf_model <-randomForest(factor(Survived) ~Pclass +Sex +Age +SibSp +Parch +Fare +Embarked +Title +FsizeD +Child +Mother,data =train)
# Show model errorplot(rf_model,ylim=c(0,0.36))legend('topright',colnames(rf_model$err.rate),col=1:3,fill=1:3)
# Get importanceimportance <-importance(rf_model)
varImportance <-data.frame(Variables =row.names(importance),Importance =round(importance[ ,'MeanDecreaseGini'],2))
# Create a rank variable based on importance
rankImportance <-varImportance %>%mutate(Rank =paste0('#',dense_rank(desc(Importance))))# Use ggplot2 to visualize the relative importance of variables
ggplot(rankImportance,aes(x =reorder(Variables, Importance),y =Importance,fill =Importance)) +geom_bar(stat='identity') +geom_text(aes(x =Variables,y =0.5,label =Rank),hjust=0,vjust=0.55,size =4,colour ='red') +labs(x ='Variables') +coord_flip() +theme_few()
# Predict using the test set
prediction <-predict(rf_model, test)
# Save the solution to a dataframe with two columns: PassengerId and Survived (prediction)
solution <-data.frame(PassengerID =test$PassengerId,Survived =prediction)
# Write the solution to file
write.csv(solution,file ='rf_mod_Solution.csv',row.names =F)