问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

机器学习中的决策树算法:从原理到实战

创作时间:
作者:
@小白创作中心

机器学习中的决策树算法:从原理到实战

引用
1
来源
1.
https://www.cnblogs.com/Codewar/p/18625008

决策树是一种直观且强大的机器学习算法,广泛应用于分类和回归任务。本文将详细介绍决策树的基本概念、构建过程、剪枝方法以及如何使用R语言进行实际操作。通过本文的学习,读者将能够全面理解决策树的工作原理,并掌握其在实际项目中的应用。

决策树的基本概念

决策树是一种树形结构的预测模型,用于分类和回归任务。它通过一系列的决策规则将数据集分割成更小的子集,最终形成一个树状结构。决策树的构建过程类似于人类做决策的过程,通过逐步排除可能的选项,最终得出结论。

一个典型的决策树包括以下几个组成部分:

  • 根节点(Root Node):代表决策过程要问的第一个问题。
  • 内部节点(Internal Nodes):代表依据特征决策的后续过程,每一个节点根据结果有不同的分支。
  • 分支(Branches):代表决策的结果,通常会指向下一个节点。
  • 叶节点(Leaf Nodes):代表最终决策结果,叶节点不会出现分支。

决策树具有以下优点:

  • 直观易懂:决策树的结构就像一棵树,每个节点代表一个属性测试,每条边代表一个测试结果,叶子节点代表最终的分类结果。这种结构非常符合人类的思维方式,让我们很容易理解模型是如何做出决策的。
  • 可解释性强:通过观察决策树,我们可以清晰地看到哪些特征对分类结果影响最大,从而帮助我们更好地理解数据。

决策树的构建过程

决策树的构建过程主要包括以下几个步骤:

  1. 选择根节点:选择对模型贡献最大的特征作为根节点。常用的评估标准包括熵值(Entropy)、信息增益(Information Gain)和基尼纯度(Gini Impurity)。
  2. 划分数据集:根据根节点的取值,将数据集分成若干个子集。
  3. 递归划分:对每个子集重复上述过程,直到满足停止条件。

以一个简单的例子来说明决策树的构建过程:

假设我们想根据天气情况决定是否去打篮球。我们收集了一些历史天气数据以及是否打篮球的记录,包括天气、温度、风力、是否下雨等特征。使用ID3算法构建决策树:

  1. 选择根节点:计算每个属性的信息增益,选择信息增益最大的属性作为根节点。假设“是否下雨”的信息增益最大,因此选择“是否下雨”作为根节点。
  2. 划分数据集:根据“是否下雨”将数据集分为两个子集:下雨和不下雨。
  3. 递归划分:对每个子集重复上述过程,直到满足停止条件。

决策树的剪枝

为了防止过拟合,通常需要对决策树进行剪枝。剪枝的方法主要分为预剪枝和后剪枝:

  • 预剪枝:在树生成过程中提前停止分支生长。比如可以设置最大深度、设置节点包含的最小样本数、设置信息增益阈值。
  • 后剪枝:先生成一棵完整的树,然后自底向上地剪掉一些分支。比如错误率降低剪枝(Reduced-Error Pruning, REP)和代价复杂度剪枝(Cost-Complexity Pruning, CCP)都属于后剪枝。

决策树实操

我们使用R语言和iris数据集进行决策树的实践。以Species作为因变量,其余变量作为自变量构建决策树:

library(partykit)
data(iris)

# 划分训练集和测试集
set.seed(123)
train_index <- sample(1:nrow(iris), size = 0.7 * nrow(iris))
iris_train <- iris[train_index, ]
iris_test <- iris[-train_index, ]

# 构建决策树模型
tree_model <- ctree(Species ~ ., data = iris_train)
plot(tree_model)

运行代码得到决策树如下:

训练好的模型在验证集中的表现如下:

针对连续特征的回归树

决策树也可以用于回归任务,即处理连续型目标变量。回归树的构建过程与分类树类似,但叶节点输出的是该节点包含的所有训练样本目标值的平均值或中位数。

例如,我们使用波士顿房价数据集构建回归树:

library(rpart)
data(Boston)

# 构建回归树模型
fit <- rpart(medv ~ ., data = Boston, method = "anova")
rpart.plot(fit, type = 4, extra = 101)

运行代码后输出结果如下:

模型的均方误差(MSE)为16.24467。通过剪枝优化模型:

# 剪枝后的模型
fit.pruned <- prune(fit, cp = 0.01)
rpart.plot(fit.pruned, type = 4, extra = 101)

# 计算剪枝后模型的MSE
predictions <- predict(fit.pruned, newdata = Boston)
mse <- mean((predictions - Boston$medv)^2)
print(mse)

剪枝后的模型MSE降低到10.3362,说明剪枝确实提高了拟合效果。

交叉验证剪枝实操

使用交叉验证选择最佳的代价复杂度因子(α)值:

# 构建决策树模型
fit <- rpart(Species ~ ., data = iris)
plotcp(fit)
rpart.plot(fit, type = 4, extra = 101)

# 使用1-SE规则选择cp值
bestcp <- fit$cptable[which.min(fit$cptable[,"xerror"] + fit$cptable[,"xstd"]), "CP"]
# 剪枝
fit.pruned <- prune(fit, cp = bestcp)
predicted.classes <- fit.pruned %>% predict(iris,type = "class")
tab_tree <- table(predicted.classes, iris$Species)
caret::confusionMatrix(tab_tree)    

运行代码输出结果如下:


可以看到模型整体的正确性提升到了96%,比未剪枝时的93%有了显著提高。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号