决策树模型的使用
大家好,我是阿琛。在前面几次内容中,我们逐渐学习了几种常见的机器学习模型,包括KNN算法,K-means算法,以及三大经典预测模型(LASSO模型,随机森林模型,支持向量机模型)等等。紧接前面的内容,我们继续学习一种新的常见预测模型的构建方法,即决策树模型。
首先,简单介绍一下决策树模型。
决策树(Decision Tree),是一种应用十分广泛的归纳推理算法。通过不断的学习解析表达式的特征,找到针对目标的学习规律。而且,其最终计算得到的函数结果被表示成一棵树的形式,与流程图类似。在模型中,包含了一系列的逻辑决策,表示根据某一情况作出决定的决策节点,决策节点的不同分支表示不同的选择结果。
下面,我们来看下如何进行决策树模型的构建以及最优模型的筛选。
一、R包及数据集准备

1.1 R包读取

library(readr)library(VIM)library(caret)library(rpart)library(rpart.plot)library(Metrics)library(stringr)
首先,加载分析过程中所需要的相应R包。

1.2 数据读取

Ttrain <- read_csv("Titanic train.csv")dim(Ttrain)
在此,我们使用泰坦尼克号数据集来进行决策树模型的构建。通过read_csv()函数读取数据集,可以看到,其中包含了891个乘客,12个不同维度的信息。
colnames(Ttrain)
随后,我们通过colnames()函数查看了12个维度的具体具体信息内容。结果显示:其中包含了乘客ID(PassengerId),生存结局(Survived),姓名(Name),性别(Sex),年龄(Age)等内容。
Survived <- Ttrain$Survivedtable(Survived)
提取其中的生存结局数据Survived,可以看到,其中549名乘客存活,342名乘客死亡。在此,我们以Survived为结局变量,来进行模型的构建与预测。
二、数据预处理

2.1 数据分布可视化展示

aggr(Ttrain)
首先,我们使用VIM包的aggr()函数来对数据集中缺失值的分布情况进行可视化展示。结果显示:在Age,Cabin和Embarked列存在缺失值,其中Cabin列的缺失值数量较多。

2.2 缺失值和特殊值的处理

接下来,根据缺失值的分布情况,以及变量本身的特征,我们需要对缺失值进行不同的处理。
Ttrain$Cabin <- NULL
关于变量Cabin,考虑到其缺失值较多,在此选择直接剔除这一列信息。
Ttrain$PassengerId <- NULLTtrain$Ticket <- NULL
同时,由于船票和乘客ID具有识别性,所以需要剔除,防止对后续预测模型的构建产生干扰。
colnames(Ttrain)
到此,可以看到,变量Cabin,PassengerId,以及Ticket三列的信息已经被完全剔除。
Ttrain$Age[is.na(Ttrain$Age)] <- median(Ttrain$Age,na.rm = TRUE)
对于变量年龄Age,其缺失值使用中位数来进行填补。
Embarkedmod <- names(sort(table(Ttrain$Embarked),decreasing = T)[1])Embarkedmod
对于变量Embarked,缺失值可以使用众数来填补。通过table()函数对分布情况进行统计分析,结合sort()函数进行排序,选择最多的分类。结果显示,最终得到变量Embarked的众数为S。
Ttrain$Embarked[is.na(Ttrain$Embarked)] <- Embarkedmod

2.3 添加name新特征

newname <- str_split(Ttrain$Name," ")newname <- sapply(newname, function(x) x[2])sort(table(newname),decreasing = T)
接下来,我们对变量Name进行拆分,获取其中的称谓,并通过table()函数结合sort()函数进行统计和排序。
newnamepart <- c("Mr.","Miss.","Mrs.","Master.")newname[!(newname %in% newnamepart)] <- "other"table(newname)
根据不同的称谓,保留Mr.,Miss.,Mrs.,以及Master.外,其余均命名为other。
结果显示:

2.4 设置因子水平

Ttrain$Name <- as.factor(newname)Ttrain$Sex <- as.factor(Ttrain$Sex)Ttrain$Embarked <- as.factor(Ttrain$Embarked)str(Ttrain)
数据整理与清洗完成后,对变量设置不同的因子水平。
结果显示:
三、决策树模型的构建

3.1 数据集拆分

set.seed(123)CDP <- createDataPartition(Ttrain$Survived, p = 0.8)train_data <- Ttrain[CDP$Resample1,]test_data <- Ttrain[-CDP$Resample1,]
数据整理完成后,接下来开始决策树模型的构建。首先,使用caret包的createDataPartition()函数,将数据集按8:2的比例拆分成训练组和验证组,分别用于模型的构建和验证。
结果显示:

3.2 模型构建

mod1 <- rpart(Survived~., data = train_data, method = "class", cp = 0.000001)
以Survival为结局变量,使用rpart()函数,选择cp为0.000001,构建决策树模型。随后,我们进一步查看模型的相关系数。
mod1$variable.importance
首先查看变量的重要性。
结果显示:
mod1$cp
其次,我们来看下复杂系数cp的对应结果。
结果显示:

3.3 模型的可视化展示

###图1plotcp(mod1)
结果显示:在途中,每一个深度的决策树(size of tree)都对应着一个复杂性程度的阈值(cp),并且每一个复杂系数cp取值对应着一个相对误差值(Error)。随着cp值的较少,决策树的深度增加,而相对误差呈现出先快速下降后一个轻微升高的趋势。
###图2rpart.plot(mod1, type = 2, extra="auto", under=TRUE, fallen.leaves = FALSE, cex=0.7, main="Decision Tree")
同时,使用rpart.plot()函数对决策树进行可视化展示。
结果显示:

3.4 验证集效能检测

pre_train <- predict(mod1, train_data, type = "prob")pre_train2 <- as.factor(as.vector(ifelse(pre_train[,2] > 0.5, 1, 0)))pre_test <- predict(mod1, test_data)pre_test2 <- as.factor(as.vector(ifelse(pre_test[,2] > 0.5, 1, 0)))accuracy(train_data$Survived, pre_train2)accuracy(test_data$Survived, pre_test2)
最后,我们使用predict()函数用于训练集和验证集的应用。结果显示:该决策树模型在训练集和验证集中的准确性分别为0.867和0.820。
4.决策树模型的优化
在模型的优化过程中,可以通过设置参数cp的取值来对决策树模型进行剪枝优化。

4.1 选取最佳cp值

bestcp <- mod1$cptable[which.min(mod1$cptable[,"xerror"]), "CP"]bestcp
在此,我们提取模型的最佳cp值。结果显示,最佳复杂系数cp值为0.01465。

4.2 优化模型

mod1.pruned <- prune(mod1, cp = bestcp)
随后,将最佳cp值bestcp应用于模型中,以构建新的决策树模型。
plotcp(mod1.pruned)
结果显示:
rpart.plot(mod1.pruned, type = 2, extra = "auto", under = TRUE, fallen.leaves = FALSE, cex=0.7, main="The Decision Tree from best cp")
结果显示:

4.3 模型验证

pre_train_p <- predict(mod1.pruned, train_data)pre_train_p2<-as.factor(as.vector(ifelse(pre_train_p[,2] > 0.5, 1, 0)))pre_test_p <- predict(mod1.pruned,test_data)pre_test_p2<-as.factor(as.vector(ifelse(pre_test_p[,2]>0.5,1,0)))accuracy(train_data$Survived, pre_train_p2)accuracy(test_data$Survived, pre_test_p2)
我们也可以将新建立得到的决策树模型应用于训练集和验证集中。结果显示,新模型的准确率为0.829和0.809,反而略低于之前的模型。当然,我们也可以通过调整前面的随机种子,以获得最佳的决策树模型。
好啦,今天的分享就到此为止啦~
回复“阿琛69”即可获得本次的数据和代码~
系列传送门
R语言小白入门课|一刻钟带你学会R数据转化
END

撰文丨阿   琛
排版丨四金兄
主编丨小雪球
继续阅读
阅读原文