日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

R语言随机森林

發布時間:2023/12/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 R语言随机森林 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
R語言隨機森林
回歸樹模型(CART)
決策樹是一種倒立的樹結構,它由內部節點、葉子節點和邊組成。其中最上面的一個節點叫根節點。 構造一棵決策樹需要一個訓練集,一些例子組成,每個例子用一些屬性(或特征)和一個類別標記來描述。構造決策樹的目的是找出屬性和類別間的關系,一旦這種關系找出,就能用它來預測將來未知類別的記錄的類別。這種具有預測功能的系統叫決策樹分類器。其算法的優點在于:1)可以生成可以理解的規則。2)計算量相對來說不是很大。3)可以處理多種數據類型。4)決策樹可以清晰的顯示哪些變量較重要。
實例
為了預測身體的肥胖程度,可以從身體的其它指標得到線索,例如:腰圍、臀圍、肘寬、膝寬、年齡
#首先載入所需軟件包
library(mboost)
library(rpart)
library(maptree)

#讀入樣本數據
data("bodyfat", package = "TH.data")

#肥胖程度DEXfat-年齡age、腰圍waistcirc、臀圍hipcirc、肘寬elbowbreadth、膝寬kneebreadth、
#建立公式DEXfat分類
formular=DEXfat~age+waistcirc+hipcirc+elbowbreadth+kneebreadth

#用rpart命令構建樹模型,結果存在fit變量中-method='anova'方差分析
fit=rpart(formular,method='anova',data=bodyfat)
#直接調用fit可以看到結果
fit
#也可以用畫圖方式將結果表達得更清楚一些
draw.tree(fit)
#建立樹模型要權衡兩方面問題,一個是要擬合得使分組后的變異較小,另一個是要防止過度擬合,而使模型的誤差過大,
#前者的參數是CP,后者的參數是Xerror。所以要在Xerror最小的情況下,也使CP盡量小。如果認為樹模型過于復雜,我們需要對其進行修剪
#首先觀察模型的誤差等數據
printcp(fit)
#調用CP(complexity parameter)與xerror的相關圖,一種方法是尋找最小xerror點所對應的CP值,并由此CP值決定樹的大小, #另一種方法是利用1SE方法,尋找xerror+SE的最小點對應的CP值。
plotcp(fit)


#用prune命令對樹模型進行修剪(本例的樹模型不復雜,并不需要修剪)
pfit=prune(fit,cp= fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])
#模型初步解釋:腰圍和臀圍較大的人,肥胖程度較高,而其中腰圍是最主要的因素。
#利用模型預測某個人的肥胖程度
ndata=data.frame(waistcirc=99,hipcirc=110,elbowbreadth=6,kneebreadth=8,age=60)
predict(fit,newdata=ndata)

回歸樹模型(CART)
裝袋算法與隨機森林相對而言會生成多個樹模型,再進行組合預測,其效果遠大于單個樹模型
裝袋算法(bagging)采取自助法的思路,從樣本中隨機抽樣,形成多個訓練樣本,生成多個樹模型。然后以多數投票的方式來預測結果。
隨機森林則(randomForest)更進一步,不僅對樣本進行抽樣,還對變量進行抽樣

預測
#首先讀入必要的程序包
library(DMwR)
library(rpart)
library(ipred)
library(randomForest)

#前二種算法可以計算缺失數據,但隨機森林不行,所以還需將數據進行清洗整理
data(algae) ?#讀入樣本數據--載入包才有該數據
algae <- algae[-manyNAs(algae), ] ?#去掉缺失值manyNAs返回缺失值的行數
clean.algae <- knnImputation(algae,k=10) ?#缺失值由距離最近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) ?#誤差比 0.354118

#裝袋算法計算
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) ? #誤差比0.3106142

#隨機森林計算
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) ?#誤差比 0.1002377

print(c(nmse1,nmse2,nmse3))

#用預測值與真值之間的相對離差平方和來作為測量誤差的指標,其結果分別為:0.3541180 0.3103366 0.1002235 可以看出隨機森林是最有效的。

#查看重要性
importance(model.forest?)

varImpPlot(model.forest?)


分類
再來看看處理分類數據的表現,利用iris數據來判斷花的種類
library(randomForest)
model.forest <-randomForest(Species ~ ., data = iris) #生成模型
pre.forest=predict(model.forest, iris) ?#模型預測
table(pre.forest,iris$Species) ? #table(a,b) ?a中的數據在b中位置出現的次數

library(rpart)
model.tree=rpart(Species ~ ., data = iris,method='class')
pre.tree=predict(model.tree, data = iris,type='class')
table(pre.tree,iris$Species)

隨機森林算法預測全對,而分類樹模型則有六處錯誤

library(randomForest)
library(foreign)
training <-iris
ind<-sample(2,nrow(training),replace=TRUE,prob=c(0.7,0.3)) #對數據分成兩部分,70%訓練數據,30%檢測數據
traindata<- training [ind==1,] ?#訓練集
testdata<- training [ind==2,] ?#測試集
rf <- randomForest(Species ~ ., data=training, ntree=100, proximity=TRUE) #Species是因變量
table(predict(rf), training$Species)
print(rf)
plot(rf)

importance(rf)

varImpPlot(rf)

預測概率

p<-predict(iris.rf,iris[,-5],type = "prob")


總結

以上是生活随笔為你收集整理的R语言随机森林的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。