从0开始学习R语言--Day64--决策树回归

对于没有特征或者说需要寻找另类关系的数据集,我们通常会用聚合或KNN近邻的方法来分类,但这样的分类或许在结果上是好的,但是解释性并不好,有时候我们甚至能看到好的结果反直觉;而决策树回归做出的结果,由于其树的结构,我们能看到每一步的决策,也就能推测出树这么做的原因,还能进一步地调整树的深度,使得结果更好。

以下是一个例子:

复制代码
# 加载必要的包
library(rpart)      # 决策树
library(rpart.plot) # 可视化树

# 1. 生成模拟数据集(非线性关系)
set.seed(123)
n <- 200
x <- runif(n, 0, 10)          # 特征x:0到10的随机数
y <- sin(x) + rnorm(n, 0, 0.3) # 目标y:sin(x)加噪声
data <- data.frame(x, y)

# 2. 划分训练集和测试集
train_idx <- sample(1:n, 0.7 * n)
train_data <- data[train_idx, ]
test_data <- data[-train_idx, ]

# 3. 训练决策树回归模型
tree_model <- rpart(y ~ x, data = train_data, 
                    method = "anova",  # 回归任务
                    control = rpart.control(maxdepth = 3)) # 限制树深度

# 4. 可视化树结构
rpart.plot(tree_model, main = "决策树回归")

# 5. 预测并计算误差
predictions <- predict(tree_model, test_data)
mse <- mean((predictions - test_data$y)^2)
cat("测试集均方误差(MSE):", round(mse, 3), "\n")

# 6. 绘制真实值与预测值对比
plot(test_data$x, test_data$y, col = "blue", pch = 19, 
     main = "真实值 vs 预测值", xlab = "x", ylab = "y")
points(test_data$x, predictions, col = "red", pch = 4)
legend("topright", legend = c("真实值", "预测值"), col = c("blue", "red"), pch = c(19, 4))

输出:

可以看到图中的决策树对于每一步的分支,都能看到分离之后两边的方差变化;而分布图则表明决策树对于波动较大的数据分布很难捕捉到趋势,很容易出现欠拟合的现象,但是由于其可以根据结果反推进一步调参,反而能加深其结果的解释性。

相关推荐
视觉小萌新8 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
yyyang8812 小时前
蓝牙系统整体架构详解
学习·信息与通信
Linux-lucky12 小时前
46-Linux学习之旅之LVS负载均衡与keepalived高可用
linux·运维·学习·ubuntu·负载均衡·lvs
金色光环14 小时前
【DSP学习】C2000_ADC中断_笔记
笔记·学习
Дерек的学习记录14 小时前
Unreal Engine 5:第三人称运动系统和人物动画
开发语言·学习·ue5
zhangrelay14 小时前
mrpt杂乱笔记-26-10-31
笔记·学习
衡石科技15 小时前
让多轮问数保持口径一致:Data Agent 的上下文、偏好与学习开关
人工智能·学习·安全
東隅已逝,桑榆非晚16 小时前
算法2. 双指针法-复写零
c++·笔记·学习·算法
Star(up up up)16 小时前
Docker系列---Docker容器基本命令(新手小白保姆级实操教程)
运维·学习·程序人生·青少年编程·docker·容器·dubbo
无心水16 小时前
22、数学与经济管理(运筹学) 核心考点与学习笔记
人工智能·笔记·学习·架构师·软考·软考架构师·软考系统架构师