隨機森林r語言實現(超詳細)

2021-08-14 01:11:36 字數 4131 閱讀 4093

演算法介紹:

簡單的說,隨機森林就是用隨機的方式建立乙個森林,森林裡面有很多的決策樹,並且每棵樹之間是沒有關聯的。得到乙個森林後,當有乙個新的樣本輸入,森林中的每一棵決策樹會分別進行一下判斷,進行類別歸類(針對分類演算法),最後比較一下被判定哪一類最多,就**該樣本為哪一類。

隨機森林演算法有兩個主要環節:決策樹的生長和投票過程。

決策樹生長步驟:

從容量為n的原始訓練樣本資料中採取放回抽樣方式(即bootstrap取樣)隨機抽取自助樣本集,重複k(樹的數目為k)次形成乙個新的訓練集n,以此生成一棵分類樹;

每個自助樣本集生長為單棵分類樹,該自助樣本集是單棵分類樹的全部訓練資料。設有m個輸入特徵,則在樹的每個節點處從m個特徵中隨機挑選m(m < m)個特徵,按照節點不純度最小的原則從這m個特徵中選出乙個特徵進行分枝生長,然後再分別遞迴呼叫上述過程構造各個分枝,直到這棵樹能準確地分類訓練集或所有屬性都已被使用過。在整個森林的生長過程中m將保持恆定;

分類樹為了達到低偏差和高差異而要充分生長,使每個節點的不純度達到最小,不進行通常的剪枝操作。

投票過程:

隨機森林採用bagging方法生成多個決策樹分類器。

基本思想:

給定乙個弱學習演算法和乙個訓練集,單個弱學習演算法準確率不高,可以視為乙個窄領域專家;

將該學習演算法使用多次,得出**函式序列,進行投票,將多個窄領域專家評估結果彙總,最後結果準確率將大幅提公升。

隨機森林的優點:

缺點

尋找最優引數mtry,即指定節點中用於二叉樹的最佳變數個數

library("randomforest")

n<-length(names(train_data)) #計算資料集中自變數個數,等同n=ncol(train_data)

rate=1 #設定模型誤判率向量初始值

for(i in 1:(n-1))

rate #展示所有模型誤判率的均值

plot(rate)

尋找最佳引數ntree,即指定隨機森林所包含的最佳決策樹數目

set.seed(100)

rf_train<-randomforest(as.factor(train_data$is_liushi)~.,data=train_data,mtry=12,ntree=1000)

plot(rf_train) #繪製模型誤差與決策樹數量關係圖

legend(800,0.02,"is_liushi=0",cex=0.9,bty="n")

legend(800,0.0245,"total",cex=0.09,bty="n")

隨機森林模型搭建

set.seed(100)

rf_train<-randomforest(as.factor(train_data$is_liushi)~.,data=train_data,mtry=12,ntree=400,importance=true,proximity=true)

輸出變數重要性:分別從精確度遞減和均方誤差遞減的角度來衡量重要程度。

importance<-importance(rf_train) 

write.csv(importance,file="e:/模型搭建/importance.csv",row.names=t,quote=f)

barplot(rf_train$importance[,1],main="輸入變數重要性測度指標柱形圖")

box()

提取隨機森林模型中以準確率遞減方法得到維度重要性值。type=2為基尼係數方法

importance(rf_train,type=1)
varimpplot(x=rf_train,sort=true,n.var=nrow(rf_train$importance),main="輸入變數重要性測度散點圖")
資訊展示

print(rf_train)    #展示隨機森林模型簡要資訊

hist(treesize(rf_train)) #展示隨機森林模型中每棵決策樹的節點數

max(treesize(rf_train));min(treesize(rf_train))

mdsplot(rf_train,train_data$is_off_user,palette=rep(1,2),pch=as.numeric(train_data$is_liushi)) #展示資料集在二維情況下各類別的具體分布情況

檢測

pred<-predict(rf_train,newdata=test_data)  

pred_out_1<-predict(object=rf_train,newdata=test_data,type="prob") #輸出概率

table <- table(pred,test_data$is_liushi)

sum(diag(table))/sum(table) #**準確率

plot(margin(rf_train,test_data$is_liushi),main=觀測值被判斷正確的概率圖)

randomforest包可以實現隨機森林演算法的應用,主要涉及5個重要函式,語法和引數請見下

1:randomforest()函式用於構建隨機森林模型

randomforest(formula, data=null, ..., subset, na.action=na.fail)

randomforest(x, y=null, xtest=null, ytest=null, ntree=500,

mtry=if (!is.null(y) && !is.factor(y))

max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x))),

replace=true, classwt=null, cutoff, strata,

sampsize = if (replace) nrow(x) else ceiling(.632*nrow(x)),

nodesize = if (!is.null(y) && !is.factor(y)) 5 else 1,

maxnodes = null,

importance=false, localimp=false, nperm=1,

proximity, oob.prox=proximity,

norm.votes=true, do.trace=false,

keep.forest=!is.null(y) && is.null(xtest), corr.bias=false,

keep.inbag=false, ...)

2:importance()函式用於計算模型變數的重要性

importance(x, type=null, class="null", scale=true, ...)
3:mdsplot()函式用於實現隨機森林的視覺化

mdsplot(rf, fac, k=2, palette=null, pch=20, ...)
4:rfimpute()函式可為存在缺失值的資料集進行插補(隨機森林法),得到最優的樣本擬合值

rfimpute(x, y, iter=5, ntree=300, ...)

rfimpute(x, data, ..., subset)

5:treesize()函式用於計算隨機森林中每棵樹的節點個數

treesize(x, terminal=true)

R語言 隨機森林演算法

在隨機森林方法中,建立大量的決策樹。每個觀察被饋入每個決策樹。每個觀察的最常見的結果被用作最終輸出。新的觀察結果被饋入所有的樹並且對每個分類模型取多數投票。對構建樹時未使用的情況進行錯誤估計。這稱為oob 袋外 誤差估計,其被提及為百分比。r語言包 randomforest 用於建立隨機森林。安裝r...

R語言 訓練隨機森林模型

隨機森林演算法涉及對樣本單元和變數進行抽樣,從而生成大量決策樹。對於每個樣本單元,所有決策樹依次對其進行分類,所有決策樹 類別中的眾數類別即為隨機森林所 的這一樣本單元的類別。假設訓練集中共有n個樣本單元,m個變數,則隨機森林演算法如下 1 從訓練集中隨機有放回地抽取n個樣本單元,生成大量決策樹 2...

R語言 隨機森林mtry,ntree優化

隨機森林引數 1 mtry節點值,可確定每次迭代的變數抽樣數值,用於二叉樹的變數個數 1 一般可預設為2。2 改為資料集變數個數的二次方根 分類模型 或三分之一 回歸模型 3 實際可以for迴圈找到最佳 2 ntree指定隨機森林所包含的決策樹數目,預設為500 最好在確定mtry之後,帶入嘗試,取...