机器学习-决策树与随机森林
一、决策树
决策树是一种基于树形结构的监督学习算法,用于分类和回归任务。 将数据逐步划分成子集,从特征中学习简单的决策规则,最终将样本归类或预测目标值。

决策树:从训练数据中学习得出一个树状结构的模型。 属于判别模型。是一种树状结构,通过做出一系列决策来对数据进 行划分,类似于针对一系列问题进行选择。决策过程就是从根节点开始,测试待分类项中对应的特征属性,并按照其值选择输出分支,直到叶子节点,将叶子节点的存放的类别作为决策结果。
1)优劣
优势:
简单直观:易于理解和解释,可以通过树形结构直接观察决策过程。
无需特征标准化:决策树对数据的分布和尺度不敏感,不需要对特征 进行归一化或标准化处理。 适应性强:能处理分类和回归问题,且适用于多分类任务。
特征选择自动化:能够自动选择最重要的特征构建模型,无需手动选 择特征。
非参数模型:不依赖数据分布假设,能够处理非线性数据和复杂关系
劣势:
容易过拟合:如果不剪枝或控制树的生长条件,可能会过度拟合训练数据。
对噪声敏感:可能对数据中的噪声和小样本数据过于敏感,导致分支过多。
计算量大:针对大规模数据集,构建和评估成本较高。
局 限 性:容易偏向于那些具有更多类别的特征,可能需要特征选择方法(如 信息增益率)进行优化。
2)决策树的模型的优化与集成
剪 枝 : 一优化决策树的重要步骤,旨在减少树的复杂性,防止过拟合 法学论 一后剪枝是在树构建完成后,逐步移除一些节点或分支。通过评估每个节点的贡献来决定这些部分是否保留,以提高模型的泛化能力。
集成方法: -通过组合多个决策树模型以提升整体性能(稳定性和预测能力), 常见的集成方法包括随机森林和梯度提升树等。
3)决策树类型
建立决策树的关键,即在当前状态下选择哪个属性作为分类依据。
根据不同的目标函数,建立决策树主要有一下三种算法。

4)决策树-CART
可以创建分类树和回归树(目标变量是离散/连续)。
采用的是一种二分循环分割的方法,每次都把当前样本集划分为两个子样本集,使生成的决策树的结点均有两个分支,显然,这样就构造了一个二叉树。如果分支属性有多于两个取值,在分裂时会对属性值进行组合,选择最佳的两个组合分支。
用基尼指数来选择性(分类),或用均方差来选择属性(回归)。
5)CART剪枝类型
1*.预剪枝·:在树的构建过程中提前终止分裂。
优点:节省计算时间。
缺点:可能过早终止分裂,导致模型欠拟合。
2*.后剪枝:首先生成一棵完全树,然后从叶节点开始逐层向上移除复杂度较高的子树。
优点:可以找到更优化的子树。
缺点:计算成本较高。
CART 模型的剪枝主要采用后剪枝,并使用复杂度参数(Complexity Parameter,cp) 来衡量剪枝标准。
CP值是特定于CART模型的一个参数,用于优化决策树的结构,确保模型具有良好的泛化能力。 CP值平衡了模型的复杂度与泛化能力:1.较小的CP值:允许更多分裂,生成复杂的树,可能过拟合;2.较大的CP值:限制分裂,生成简单的树,可能欠拟合er)R语言实现

二、随机森林
随机森林用随机的方式建立一个森林。随机森林算法由多个决策树组成,每一棵决策树之间没有关联。建立完森林后,当有新样 本进入时,每棵决策树都会分别进行判断,然后基于投票法给出分类结果。
优 点 : 在数据集生表现良好,相对于其他算法有较大的优势;易于并行化,在大数据集上有很大的优势; 能够处理高维度数据,不用做特征选择。
1)bagging和随机森林
随机森林是Bagging的扩展变体,它在以决策树为基学习器构建Bagging 集成的基础上, 进一步在决策树的训练过程中引入了随机特征选择,因此可以概括随机森林包括四个部分:1.随机选择样本(放回抽样)。2.随机选择特征。3.构建决策树。4.随机森林投票(平均)。
随机选择样本和Bagging 相同,采用的是Bootstraping自助采样法;随机选择特征是指在每个节点在分裂过程中都是随机选择特征的(区别与每棵树随机选择一批特征)。
这种随机性导致随机森林的偏差会有稍微的增加(相比于单棵不随机树),但是由于随 机森林的“平均”特性,会使得它的方差减 小,而且方差的减小补偿了偏差的增大,因此总体而言是更好的模型。
2)随机森林的重要参数
树的数量:决定随机森林中树的数量,越多越稳定,但珠算开销也越大。
每次分裂的特征数量:决定随机选择的特征子集大小。
树的最大深度:限制树的深度,避免单棵树过拟合。
节点样本最小数:控制树的分裂与叶子节点的最小样本数。
变量重要性:提供特征对预测结果的贡献度。
3)优劣
1*.优势
高精度:结合了多棵决策树的预测结果,减少单棵树的误差。
抗过拟合:通过引入随机性和多样性,避免单棵决策树过拟合的问题。
处理高维数据:在特征选择时,只使用部分特征,有效处理高维特征空间。
鲁棒性:对缺失数据和噪声有一定的容忍能力。
2*.劣势
计算复杂度高:训练和预测时间较长,尤其是树的数量较多时。
可解释性差:随机森林是“黑箱模型”,难以清晰解释具体的决策过程。
4)随机森林的特点
随机森林与单一决策树的对比
决策树易过拟合,而随机森林通过集成学习降低过拟合风险。
决策树训练速度快,但单一模型稳定性差。
随机森林通过多数表决提升准确率,但计算时间较长。
5)R语言实现

三、R语言实践
# 加载所需R包
library(rpart) # 决策树模型
library(partykit) # 决策树可视化
library(randomForest) # 随机森林模型
library(caret) # 模型训练和调参
# 读取数据
tlog <- read.csv("tlog.csv", row.names = 1)
# 定义筛选特征集合
selected_vars <- c("exercise", "hyperlip", "pregnant",
"age", "glucose", "bmi", "pedigree")
selected_vars_scaled <- c("exercise", "hyperlip", "pregnant", "age_scaled",
"glucose_scaled", "bmi_scaled", "pedigree_scaled")
# 将结局变量因子化
tlog$diabetes <- factor(tlog$diabetes, levels = c(0, 1), labels = c("No", "Yes"))
# 注意:以下valdata部分在实际使用时需要取消注释并确保valdata存在
# valdata$diabetes <- factor(valdata$diabetes, levels = c(0,1), labels = c("No","Yes"))
####################### 3.2 决策树:分类回归树 #######################
# 构建基础CART模型
tree_model1 <- rpart(
diabetes ~ exercise + hyperlip + pregnant + age + glucose + bmi + pedigree,
data = tlog,
method = "class"
)
tree_model1$cptable # 查看复杂度表
# 设置交叉验证和参数网格
set.seed(111)
ctrl <- trainControl(method = "cv", number = 10)
param_grid <- expand.grid(cp = seq(0.001, 0.3, by = 0.002))
# 交叉验证调优
fit_cv_rpart <- train(
diabetes ~ exercise + hyperlip + pregnant + age + glucose + bmi + pedigree,
data = tlog,
method = "rpart",
trControl = ctrl,
tuneGrid = param_grid
)
best_cp <- fit_cv_rpart$bestTune$cp # 获取最佳cp值
# 使用最佳参数构建模型
tree_model <- rpart(
diabetes ~ exercise + hyperlip + pregnant + age + glucose + bmi + pedigree,
data = tlog,
method = "class",
cp = best_cp
)
# 查看模型信息
print(tree_model$control)
print(tree_model)
# 可视化决策树
png("tree_model.png", width = 1000, height = 800)
plot(as.party(tree_model))
dev.off()
####################### 3.3 随机森林(RF)模型 #######################
# 构建基础随机森林模型
set.seed(123)
rf_model0 <- randomForest(
diabetes ~ exercise + hyperlip + pregnant + age + glucose + bmi + pedigree,
data = tlog,
importance = TRUE
)
print(rf_model0)
# 参数调优 - mtry
ctrl <- trainControl(method = "cv", number = 10, search = "grid")
tuneGrid <- expand.grid(mtry = 1:floor(sqrt(7))) # 7个特征
rf_model1 <- train(
diabetes ~ exercise + hyperlip + pregnant + age + glucose + bmi + pedigree,
data = tlog,
method = "rf",
trControl = ctrl,
tuneGrid = tuneGrid
)
best_mtry <- rf_model1$bestTune$mtry
# 参数调优 - ntree
ntree_values <- seq(50, 1000, by = 50)
oob_errors <- numeric(length(ntree_values))
for (i in seq_along(ntree_values)) {
rf_temp <- randomForest(
diabetes ~ exercise + hyperlip + pregnant + age + glucose + bmi + pedigree,
data = tlog,
mtry = best_mtry,
ntree = ntree_values[i]
)
oob_errors[i] <- rf_temp$err.rate[ntree_values[i], "OOB"]
}
best_ntree <- ntree_values[which.min(oob_errors)]
# 使用最佳参数构建最终模型
rf_model <- randomForest(
diabetes ~ exercise + hyperlip + pregnant + age + glucose + bmi + pedigree,
data = tlog,
ntree = best_ntree,
mtry = best_mtry,
importance = TRUE
)
# 输出模型结果
print(rf_model)
# 直接保存为图像文件
png("variable_importance.png", width = 1000, height = 800)
varImpPlot(rf_model)
dev.off()
四、结果展示


DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)