基于决策树预测获救乘客
1)构建一个数据划分函数split.data
该函数有三个输入参数:data,p和s.其中data代表输入数据集,参数p从输入集中生成的子集比重,参数s为随机种子。
split.data = function(data,p = 0.7,s = 666){
set.seed(s)
index = sample(1:dim(data)[1])
train = data[index[1:floor(dim(data)[1] * p)],]
test = data[index[((ceiling(dim(data)[1] * p))+1):dim(data)[1]], ]
return(list(train = train,test = test))
}
2)数据分类
allset = split.data(train.data,p=0.7)
trainset = allset$train
testset = allset$test
3)加载决包树包
library(grid)
library(mvtnorm)
library(modeltools)
library(stats4)
library(strucchange)
library(zoo)
library(sandwich)
library(party)
4)进行决策树分析并做图
train.ctree = ctree(Survived ~ Pclass + Sex + Age + SibSp + Fare + Parch + Embarked,data=trainset)
plot(train.ctree,main = "Conditional inference tree of Titanic Dataset")
分析
介绍了如何使用条件推理树(决策树)ctree来预测乘客的逃生结果,尽管这不是解决分类的唯一办法,不过使用这个方法简单与易于理解。
首先,我们使用自建函数split.data将数据划分为数据集与测试集,我们基于训练集构成一个预测模型,在模型评估环节中将预测模型用于测试集上。将Survived作为类标签,没有考虑任务具体的属性,我们将Pclass,Sex,Age,SibSp,Parch,Embark和Fare属性作为训练集,Carbin由于太多缺失值而放弃。
当建好模型之后,我们可以文本形式输出树的预测节点,也可以使用绘图函数直接画出该决策树。由决策树模型可以知道,属性的组合可能对预测乘客逃生有作用。Pclass与Sex组合可以作为比较好的决策分支,从图可以知道,位于一等及二等舱中的女生基本获救,位于二等及三等舱的年龄大于9岁的男性乘客不幸遇难。我们还发现诸如Embarked和Parch这样的属性被丢弃了,这是因为条件推理树认为条件推理树认为对分类作用不明显。
从决策树我们还发现,变量的组合对预测逃生的概率有一定的影响,条件推理树对选择重要的分类变量也有一定的作用,我们可以检查所建立的树的结构查看被选择出来的属性是否符合我们的猜想。
除去ctree之后,我们还可以使用函数支持向量机svm(支持向量机)来构建预测模型,之后介绍。
基于混淆矩阵验证预测结果的准备性
library("lattice")
library("ggplot2")
library("caret")
library("e1071")
ctree.predict = predict(train.ctree,testset)
confusionMatrix(ctree.predict,testset$Survived)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 160 23
1 16 68
Accuracy : 0.8539
95% CI : (0.8058, 0.894)
No Information Rate : 0.6592
P-Value [Acc > NIR] : 5.347e-13
Kappa : 0.6688
Mcnemar's Test P-Value : 0.3367
Sensitivity : 0.9091
Specificity : 0.7473
Pos Pred Value : 0.8743
Neg Pred Value : 0.8095
Prevalence : 0.6592
Detection Rate : 0.5993
Detection Prevalence : 0.6854
Balanced Accuracy : 0.8282
'Positive' Class : 0
分析
评估模型预测性能是完成模型构建后的一个重要工作,可以使用测试数据集的预测结果与实际类标签匹配程序作为评估依据,并使用caret包提供的预测准确评价工具——混淆矩阵来完成评估工具。
单纯的使用ctree函数可以达到84%准备度,我们可以通过属性调优,或者改用SVM,glm或者随机森林来形成更好的预测模型。
caret包,分类和回归训练简化了反复比较不同的预测模型的过程,该包还包括以下的一些函数:
*数据分析
*普通预处理:包括构建虚拟变量,确定零方差和方差极小的预测的变量,寻找相关的预测变量,居中变量,扩展变量
*训练(使用交叉检验)
*常规可视化(featurePlot)
使用ROC曲线评估性能
#准备概率矩阵
train.ctree.pred = predict(train.ctree,testset)
train.ctree.prob = 1 - unlist(treeresponse(train.ctree,testset),use.names = F)[seq(1,nrow(testset)*2,2]
#导入ROCR包
library("gplots")
library("ROCR")
#根据概率生成ROCR预测对象
train.ctree.prob.rocr = prediction(train.ctree.prob,testset$Survived)
#准备好ROC曲线的ROCR的性能对象(tpr = true postive rate,fpr = false postive rate)
train.ctree.perf = performance(train.ctree.prob.rocr,"tpy","fpy")
train.ctree.auc.perf = performance(train.ctree.prob.rocr,measure = "auc",x.measure = "cutoff")
#绘制ROC曲线 ,colorize参数设置为TRUE,标出AUC值作为标题
plot(train.ctree.perf,col=2,colorize = T,main = paste("AUC:",train.ctree.auc.perf@y.values))
分析
首先依据概率矩阵生成预测对象,然后准备ROC曲线所需的ROCR性能对象,(tpr = true postive rate,fpr = false postive rate)
以及AUC值,最后,使用绘图函数来画ROC曲线。
在ROC曲线中,曲线下的面积越大(AUC = 1 预测效果最优),模型的预测准确度越高。