All life is game of luck,数据挖掘告诉你生存是不是考运气

    泰坦尼克号(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)

你可能感兴趣的:(All life is game of luck,数据挖掘告诉你生存是不是考运气)