在本帖中,您将发现 8 种在 R 中使用决策树进行非线性回归的方法。
本帖中的每个示例都使用了 R 自带的 datasets 包 中提供的 longley 数据集。
longley 数据集描述了从 1947 年到 1962 年观察到的 7 个经济变量,用于预测每年的就业人数。
立即开始您的项目,阅读我的新书《R 语言机器学习精通》,其中包含分步教程和所有示例的R 源代码文件。
让我们开始吧。

决策树
照片作者:Katie Walker,部分权利保留
分类和回归树
分类和回归树 (CART) 根据使损失函数(如平方误差和)最小化的值来分割属性。
以下方法演示了在 longley 数据集上使用递归分割决策树方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载包 library(rpart) # 加载数据 data(longley) # 拟合模型 fit <- rpart(Employed~., data=longley, control=rpart.control(minsplit=5)) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, longley[,1:6]) # 总结准确度 mse <- mean((longley$Employed - predictions)^2) print(mse) |
了解更多关于 rpart 函数和 rpart 包 的信息。
条件决策树
条件决策树使用统计检验来选择属性的分割点,而不是使用损失函数。
以下方法演示了在 longley 数据集上使用条件推断树方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载包 library(party) # 加载数据 data(longley) # 拟合模型 fit <- ctree(Employed~., data=longley, controls=ctree_control(minsplit=2,minbucket=2,testtype="Univariate")) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, longley[,1:6]) # 总结准确度 mse <- mean((longley$Employed - predictions)^2) print(mse) |
了解更多关于 ctree 函数和 party 包 的信息。
需要更多关于R机器学习的帮助吗?
参加我为期14天的免费电子邮件课程,了解如何在您的项目中使用R(附带示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
模型树
模型树创建决策树,并在每个节点使用线性模型进行预测,而不是使用平均值。
以下方法演示了在 longley 数据集上使用 M5P 模型树方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载包 library(RWeka) # 加载数据 data(longley) # 拟合模型 fit <- M5P(Employed~., data=longley) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, longley[,1:6]) # 总结准确度 mse <- mean((longley$Employed - predictions)^2) print(mse) |
了解更多关于 M5P 函数和 RWeka 包 的信息。
规则系统
可以通过从决策树中提取和简化规则来创建规则系统。
以下方法演示了在 longley 数据集上使用 M5Rules 规则系统。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载包 library(RWeka) # 加载数据 data(longley) # 拟合模型 fit <- M5Rules(Employed~., data=longley) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, longley[,1:6]) # 总结准确度 mse <- mean((longley$Employed - predictions)^2) print(mse) |
了解更多关于 M5Rules 函数和 RWeka 包 的信息。
Bagging CART
自助聚合 (Bagging) 是一种集成方法,它从同一数据集的不同子样本中创建多个同类型的模型。将每个独立模型的预测组合起来以提供更优的结果。这种方法已被证明对高方差方法(如决策树)特别有效。
以下方法演示了将 bagging 应用于递归分割决策树。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载包 library(ipred) # 加载数据 data(longley) # 拟合模型 fit <- bagging(Employed~., data=longley, control=rpart.control(minsplit=5)) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, longley[,1:6]) # 总结准确度 mse <- mean((longley$Employed - predictions)^2) print(mse) |
了解更多关于 bagging 函数和 ipred 包 的信息。
随机森林
随机森林是决策树 bagging 的一种变体,它通过减少每次决策点可用于创建树的属性来提高树的方差,因此需要更多的树。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载包 library(randomForest) # 加载数据 data(longley) # 拟合模型 fit <- randomForest(Employed~., data=longley) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, longley[,1:6]) # 总结准确度 mse <- mean((longley$Employed - predictions)^2) print(mse) |
了解更多关于 randomForest 函数和 randomForest 包 的信息。
梯度提升机
提升是一种为分类设计的集成方法,用于减少偏差,其中模型会学习现有模型的错误分类。它已通过梯度提升机 (GBM) 的形式进行泛化和改编,用于分类和回归的 CART 决策树。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载包 library(gbm) # 加载数据 data(longley) # 拟合模型 fit <- gbm(Employed~., data=longley, distribution="gaussian") # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, longley) # 总结准确度 mse <- mean((longley$Employed - predictions)^2) print(mse) |
了解更多关于 gbm 函数和 gbm 包 的信息。
Cubist
Cubist 决策树是另一种集成方法。它们的构建方式类似于模型树,但涉及一种称为“委员会”的类似提升的程序,该程序会生成规则状模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载包 library(Cubist) # 加载数据 data(longley) # 拟合模型 fit <- cubist(longley[,1:6], longley[,7]) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, longley[,1:6]) # 总结准确度 mse <- mean((longley$Employed - predictions)^2) print(mse) |
了解更多关于 cubist 函数和 Cubist 包 的信息。
总结
在本帖中,您了解了 8 种在 R 中用于非线性回归的决策树方法。每种方法都已准备好供您复制粘贴到自己的工作空间中,并根据您的需求进行修改。
有关更多信息,请参阅 Kuhn 和 Johnson 的著作 《应用预测建模》的第 8 章,该书为 R 语言初学者提供了关于非线性回归与决策树的绝佳入门。
请告诉我 R 中的遗传算法代码,就像您上面提到的那样。
非常感谢这些指南。
不客气!
这里的 RMSE 应该是 sqrt(mean((actual-predicted)^2)) 吗?
你好!我想问一下,当数据高度量化时,使用哪种决策树最好?例如,一个天气数据集。谢谢!
很棒的指南和网站!
这句话有一个小小的拼写错误(crated -> created)
“Rule Systems can be crated by extracting and simplifying the rules from a decision tree。”
我在决策树的排序方面需要一些澄清。我有一些特征。X1、X2、X3 可以标记为 Y。构建模型后,我需要根据特征 X1 预测树的排名。您能就此提出一些好方法吗?
非常感谢您 🙂
简短但非常有用且全面
但这并不是非线性回归——如果我没记错的话,这不就是多元线性建模吗?
树方法(包括 RF、boosting 等)与实际的非线性回归(如酶动力学中使用的 Michaelis-Menton 模型、PK/PD 建模中使用的模型、非线性协同作用模型)之间有什么联系?
期待听到您的想法。
“Will 2015 年 5 月 15 日 上午 11:33 #
这里的 RMSE 不应该是
sqrt(mean((actual-predicted)^2))?”
Will 的评论(在上面)
绝对正确!
太可惜了,(这篇文章虽然很棒,但)作者
没有回答并纠正这个错误
在 rmse 计算中…
使用正确的 rmse 公式(上面)
会得到一个完全不同的 rmse 值…
请注意…
嗨 Jason,非常感谢您的示例。您如何处理这些模型大多无法很好地泛化到新的验证数据这一事实?——在您的示例中使用 subset = 选项。只有规则系统和模型树似乎能正确泛化到我的数据
data <- cbind(1:10000, -1:-10000,c(2:10001)+runif(10000,min=0,max=0.1))
data <- cbind(1:10000, c(-1:-10000)+runif(10000,min=0,max=0.1))
data <- cbind(data, 1000*c(1:10000)/10*sin(data[,1])+(data[,2]^2)/10+runif(10000,min=0,max=0.1)/100 ) #
colnames(data) <- c("x1","x2","y")
这真的很依赖于数据。
如果您发现一类适合您数据的方法,那就专注于它们。
嗨,Jason,
很棒的指南,感谢您让我们变得更强大。
快速提问:如何从 R 中的随机森林树中提取规则/路径以用于预测的行?
谢谢
谢谢。
我不确定这是否可行,因为个别决策的数量非常庞大。
非常感谢
不客气。