首先读入必要的程序包
library(DMwR)
library(rpart)
library(ipred)
library(randomForest)
前二种算法可以计算缺失数据,但随机森林不行,所以还需将数据进行清洗整理
data(algae)
algae <- algae[-manyNAs(algae), ]
clean.algae <- knnImputation(algae,k=10)
回归树模型计算
model.tree=rpart(a1 ~ ., data = clean.algae[, 1:12])
pre.tree <- predict(model.tree, clean.algae)
plot(pre.tree~clean.algae$a1)
nmse1 <- mean((pre.tree- clean.algae[,'a1'])^2)/
mean((mean(clean.algae[,'a1'])- clean.algae[,'a1'])^2)
装袋算法计算
model.bagging <- bagging(
a1 ~ ., data = clean.algae[, 1:12], nbagg=1000)
pre.bagging=predict(model.bagging,clean.algae)
plot(pre.bagging~clean.algae$a1)
nmse2 <- mean((pre.bagging- clean.algae[,'a1'])^2)/
mean((mean(clean.algae[,'a1'])- clean.algae[,'a1'])^2)
随机森林计算
model.forest <-randomForest(a1 ~ ., data = clean.algae)
#若有缺失数据需加入: na.action=na.omit
pre.forest=predict(model.forest, clean.algae)
plot(pre.forest~ clean.algae$a1)
(nmse3 <- mean((pre.forest- clean.algae[,'a1'])^2)/
mean((mean( clean.algae[,'a1'])- clean.algae[,'a1'])^2)
print(c(nmse1,nmse2,nmse3))
用预测值与真值之间的相对离差平方和来作为测量误差的指标,其结果分别为:0.3541180 0.3103366 0.1002235 可以看出随机森林是最有效的。
再来看看处理分类数据的表现,利用iris数据来判断花的种类
library(randomForest)
model.forest <-randomForest(Species ~ ., data = iris)
pre.forest=predict(model.forest, iris)
table(pre.forest,iris$Species)
pre.forest setosa versicolor virginica setosa 50 0 0 versicolor 0 50 0 virginica 0 0 50
library(rpart)
model.tree=rpart(Species ~ ., data = iris,method='class')
pre.tree=predict(model.tree, data = iris,type='class')
table(pre.tree,iris$Species)
pre.tree setosa versicolor virginica setosa 50 0 0 versicolor 0 49 5 virginica 0 1 45
随机森林算法预测全对,而分类树模型则有六处错误。
关于用鸢尾花数据使用随机森林算法预测
回复删除您这里没有把数据分为训练集和测试集,当划分为这两类后,分别进行预测,都有一定的错误,并不是100%正确。
我以为是分为两类后的数据量小,把源数据扩为两倍,300个观测量。但是还是一样,虽然扩充后预测效果好一些,还不是100%分类正确。
当然,如果不分为训练集和测试集,是100%分类正确。
为什么数据随机分组和不分组后的预测结果不一样呢?
期待您的回复!
注:我是参考赵教授那本《R Data Mining》决策树例子做的,结果也和书上的一样。
祝:身体健康!工作顺利!
R 初学者
我这个例子是偷懒,没有划分数据,应该是要划分数据的。
删除数据如果不分组就会形成模型的过度拟合,造成百分百正确的假象。为了避免过度拟合,一个法子就是保留数据,只用一部分数据建模,另一部分来检验,这样出来的预测结果才是比较可靠的。检验数据的一个用法就是用来调模型参数,使检验数据误差最低的参数是最优的。
划分数据有很多法子,划分成两组是最简单的,也有划成三组的(train,validation,test),或者是多重交叉检验等等。很多数据挖掘书上都会提到这方面问题。
原來如此,呵呵,一直不知道什麽是過度擬合,這次知道了。
删除另:非常感謝您的回覆!謝謝!
随机森林也会出现overfitting?
回复删除只要涉及到参数训练都会有overfitting,不过随机森林比较不容易就是的。
删除肖凯兄,我有一个疑问,有可能是我哪里理解错了,您在model.forest <-randomForest(Species ~ ., data = iris)时,用table(pre.forest,iris$Species)得到的结果正确率是100%,而如果直接观测model.forest,得到的结果如下:
回复删除setosa versicolor virginica class.error
setosa 50 0 0 0.00
versicolor 0 47 3 0.06
virginica 0 3 47 0.06
比较奇怪,都是对原数据做的,怎么结果会不一样,请您有空是解答我一下
直接看model.forest得到的只是OOB误差。
删除