决策树是一树状结构,它的每一个叶节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。对于非纯的叶节点,多数类的标号给出到达这个节点的样本所属的类。构造决策树的核心问题是在每一步如何选择适当的属性对样本做拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下,分而治之的过程。
常见的三类决策树:
C4.5算法
在R语言中,实现C4.5决策树建模是非常方便的,实现该算法主要是借助party包中的ctree()函数。
# C4.5决策树
# 设置工作空间
setwd("F:\\桌面") # 设置工作空间
Data <- read.csv("./test.txt",sep = '\t') # 读入数据
Data[, "MN"] <- as.factor(Data[, "MN"]) # 将目标变量转换成因子型
set.seed(1234) # 设置随机种子
# 数据集随机抽70%定义为训练数据集,30%为测试数据集
ind <- sample(2, nrow(Data), replace = TRUE, prob = c(0.7, 0.3))
traindata <- Data[ind == 1, ]
testdata <- Data[ind == 2, ]
# 建立决策树模型预测客户是否流失
library(party) # 加载决策树的包
ctree.model <- ctree(MN ~ ., data = traindata) # 建立C4.5决策树模型
plot(ctree.model, type = "simple") # 输出决策树图
# 预测结果
train_predict <- predict(ctree.model) # 训练数据集
test_predict <- predict(ctree.model, newdata = testdata) # 测试数据集
# 输出训练数据的分类结果
# 输出训练数据的分类结果
train_predictdata <- cbind(traindata, predictedclass = train_predict)
#输出训练数据的混淆矩阵
(train_confusion <- table(actual = traindata$MN, predictedclass = train_predict) )
# 输出测试数据的分类结果
test_predictdata <- cbind(testdata, predictedclass = test_predict)
# 输出测试数据的混淆矩阵
(test_confusion <- table(actual = testdata$MN, predictedclass = test_predict))
训练数据的混淆矩阵
predictedclass
actual 0 1
0 81 136
1 70 536
测试数据的混淆矩阵
predictedclass
actual 0 1
0 24 48
1 32 238
CART算法
R语言实现CART算法主要是依靠tree()的tree()函数来实现的
# CART算法
# 数据集随机抽70%定义为训练数据集,30%为测试数据集
ind <- sample(2, nrow(Data), replace = TRUE, prob = c(0.7, 0.3))
traindata <- Data[ind == 1, ]
testdata <- Data[ind == 2, ]
# 建立决策树模型预测客户是否流失
library(tree) # 加载决策树的包
tree.model <- tree(MN ~ ., data = traindata) # 建立CART决策树模型
plot(tree.model, type = "uniform") # 输出决策树图
text(tree.model)
# 预测结果
train_predict <- predict(tree.model, type = "class") # 训练数据集
test_predict <- predict(tree.model, newdata = testdata, type = "class") # 测试数据集
# 输出训练数据的分类结果
train_predictdata <- cbind(traindata, predictedclass = train_predict)
# 输出训练数据的混淆矩阵
(train_confusion <- table(actual = traindata$MN, predictedclass = train_predict))
# 输出测试数据的分类结果
test_predictdata <- cbind(testdata, predictedclass = test_predict)
# 输出测试数据的混淆矩阵
(test_confusion <- table(actual = testdata$MN, predictedclass = test_predict))
训练数据的混淆矩阵
predictedclass
actual 0 1
0 87 109
1 74 546
测试数据的混淆矩阵
predictedclass
actual 0 1
0 30 63
1 30 226
C 5.0算法
训练数据的混淆矩阵
predictedclass
actual 0 1
0 76 134
1 58 547
测试数据的混淆矩阵
predictedclass
actual 0 1
0 29 50
1 44 227