简洁安装程序包:将提供的程序包手动复制到R的镜像下的library下:
例如我的路径:D:\R-4.1.3\library,将重复的程序包替换即可。底部提供资料
library(ISLR)
library(TH.data)
library(MASS)
library(multcomp)
library(matrixStats)
library(libcoin)
library(survival)
library(coin)
library(zoo)
library(strucchange)
library(modeltools)
library(mvtnorm)
library(party)
library(grid)
#party包中的ctree():
#1.用于创建决策树
#2.提供用于控制决策树训练的几个参数,例如 midSplit、Min Busket、MaxSurrogate 和 MaxDepth
#查看iris数据集
str(iris)
在许多的科研著作中都在iris数据集上做分类操作。该数据集由3种不同类型的鸢尾花的50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。这个数据集包含了5个属性:
#拆分数据集
ind <- sample(2, nrow(iris), replace= TRUE, prob=c(0.7, 0.3))
#同ind <- sample(x = 2,size = nrow(iris),replace=TRUE,prob = c(0.7,0.3))
trainData <- iris[ind==1,]
testData <- iris[ind==2,]
#sample():
#x即拆分为两部分
#size即抽样大小
#replace = TRUE
#有放回抽样,“replace”就是重复的意思,即可以重复对元素进行抽样,也就是所谓的有放回抽样。
#prob即“probability”(概率)
#查看拆分后的数据
str(trainData)
str(testData)
#myFormula指定了Species为目标变量,其余所有变量为自变量
myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
iris_ctree <- ctree(myFormula, data=trainData)
#检查预测结果
table(predict(iris_ctree),trainData$Species)
#Setosa鸢尾花:37条
#Versicolour鸢尾花:34条
#Virginica鸢尾花:34条
#既是Versicolour鸢尾花也是Virginica鸢尾花:4条
#共109条数据
#查看已经训练过的决策树
print(iris_ctree)
#绘制决策树
plot(iris_ctree)
#决策树简化形式
plot(iris_ctree,type="simple")
#predict()进行预测
testPred <- predict(iris_ctree,newdata = testData)
#查看预测结果
table(testPred,testData$Species)
#Setosa鸢尾花:13条
#Versicolour鸢尾花:11条
#Virginica鸢尾花:15条
#既是Versicolour鸢尾花也是Virginica鸢尾花:1条
#既是Virginica鸢尾花也是Versicolour鸢尾花:1条
#共41条数据
install.package('rpart')
library(rpart)
#rpart这个包被用来在'bodyfat'这个数据集的基础上建立决策树。
#函数raprt()可以建立一个决策树,并且可以选择最小误差的预测。
data("bodyfat", package = "TH.data")
dim(bodyfat) #查看数据尺寸
attributes(bodyfat) #查看数据变量名、行名称、数据类型等
bodyfat[1:5,] #查看前五行数据
set.seed(1234) #设置随机种子
ind <- sample(2, nrow(bodyfat), replace=TRUE, prob=c(0.7, 0.3))
bodyfat.train <- bodyfat[ind==1,]
bodyfat.test <- bodyfat[ind==2,]
#查看拆分后的数据
str(bodyfat.train)
str(bodyfat.test)
#将DEXfat设置为因变量,age、waistcirc、hipcirc、elbowbreadth、kneebreadth为自变量
myFormula <- DEXfat ~ age + waistcirc + hipcirc + elbowbreadth + kneebreadth
bodyfat_rpart <- rpart(myFormula, data = bodyfat.train,control = rpart.control(minsplit = 10))
#函数格式rpart(formula, data, weights, subset, na.action = na.rpart, method,
model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)
#control设置决策树的参数
#minsplit用于指定节点的最小样本量,默认为20.当节点样本量小于指定值时将不再继续分组
print(bodyfat_rpart)
plot(bodyfat_rpart)
#为决策树添加文本标签
text(bodyfat_rpart, use.n=T)
#选择预测误差最小值的预测树,从而优化模型
opt <- which.min(bodyfat_rpart$cptable[,"xerror"])
cp <- bodyfat_rpart$cptable[opt, "CP"]
#prune函数可以实现最小代价复杂度剪枝法
bodyfat_prune <- prune(bodyfat_rpart, cp = cp)
#cp为复杂度系数,上面的办法选择具有最小xerror的cp的办法
这里最开始不太明白“bodyfat_rpart$cptable”,简单查看一下:
#绘制决策树
plot(bodyfat_prune)
#添加文本标签
text(bodyfat_prune, use.n=T)
对比结果就会发现,优化模型后,就是将hipcirc<99.5这个分层给去掉了,也许是因为这个分层没有必要,可以思考一下为什么选择预测误差最小的结果的决策树的分层反而没有那么细。
DEXfat_pred <- predict(bodyfat_prune, newdata=bodyfat.test)
xlim <- range(bodyfat$DEXfat)
#绘制散点图
plot(DEXfat_pred ~ DEXfat,data=bodyfat.test,xlab="Observed",ylab="Predicted",ylim=xlim,xlim=xlim)
#此处plot(纵坐标数据~横坐标数据,数据,横坐标名称,纵坐标名称,纵坐标轴数值取bodyfat$DEXfat范围,横坐标轴数值取bodyfat$DEXfat范围)
#添加对角线
abline(a=0, b=1)
优化后的决策树将会用来预测,预测的结果会与实际的值进行对比。
上面的代码中,使用函数abline()绘制一条斜线。
一个好的模型的预测值应该是约接近真实值越好,也就是说大部分的点应该落在斜线上面或者在斜线附近。
install.packages('randomForest')
library(randomForest)
我们使用包randomForest并利用鸢尾花数据建立一个预测模型,包里面的randomForest()函数有两点不足:
ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.7, 0.3))
trainData <- iris[ind==1,]
testData <- iris[ind==2,]
rf <- randomForest(Species ~ ., data=trainData, ntree=100, proximity=TRUE)
#Species ~ .指的是Species与其他所有属性之间的等式
# ntree:指定随机森林所包含的决策树数目,默认为500
# proximity:逻辑参数,是否计算模型的临近矩阵,主要结合MDSplot()函数使用
#查看预测结果
table(predict(rf), trainData$Species)
由上图的结果可知,即使在决策树中,仍然有误差,第二类和第三类话仍然会被误判
#查看模型
print(rf)
#绘制每一棵树的误判率的图
plot(rf)
最后,在测试集上测试训练集上建立的随机森林,并使用table()和margin()函数检测预测结果。
irisPred <- predict(rf, newdata=testData)
#查看测试集预测结果
table(irisPred, testData$Species)
#绘制每一个观测值被判断正确的概率图
plot(margin(rf, testData$Species))
实验资料/阿里云盘
程序包/百度网盘
提取码:h030(无需提取码,以防万一)
【R语言进行数据挖掘】决策树和随机森林/文博客园@tjxj666
决策树与随机森林的R语言实现/文数据分析师
决策树及R语言实现/文博客园@数学男
决策树与R语言(RPART)/文CSDN@tarim
R语言笔记:机器学习【决策树(Decision Tree】/文CSDN@LdyInG_
Learn R | Random Forest of Data Mining(下)/文知乎@Jason
《R语言与数据挖掘最佳实践和经典案例》—— 1.3 数据集/文阿里云开发者社区@华章出版社
分类-回归树模型(CART)在R语言中的实现/文CSDN@周小馬
分类-回归树模型(CART)在R语言中的实现/文博客园@刘小子
鸢尾花数据集/文简书@littlehei
R语言sample()函数/文简书@tianzhanlan