R語言實現(xiàn)隨機森林的方法示例
隨機森林算法介紹
算法介紹:
簡單的說,隨機森林就是用隨機的方式建立一個森林,森林里面有很多的決策樹,并且每棵樹之間是沒有關(guān)聯(lián)的。得到一個森林后,當有一個新的樣本輸入,森林中的每一棵決策樹會分別進行一下判斷,進行類別歸類(針對分類算法),最后比較一下被判定哪一類最多,就預(yù)測該樣本為哪一類。
隨機森林算法有兩個主要環(huán)節(jié):決策樹的生長和投票過程。
決策樹生長步驟:
- 從容量為N的原始訓(xùn)練樣本數(shù)據(jù)中采取放回抽樣方式(即bootstrap取樣)隨機抽取自助樣本集,重復(fù)k(樹的數(shù)目為k)次形成一個新的訓(xùn)練集N,以此生成一棵分類樹;
- 每個自助樣本集生長為單棵分類樹,該自助樣本集是單棵分類樹的全部訓(xùn)練數(shù)據(jù)。設(shè)有M個輸入特征,則在樹的每個節(jié)點處從M個特征中隨機挑選m(m < M)個特征,按照節(jié)點不純度最小的原則從這m個特征中選出一個特征進行分枝生長,然后再分別遞歸調(diào)用上述過程構(gòu)造各個分枝,直到這棵樹能準確地分類訓(xùn)練集或所有屬性都已被使用過。在整個森林的生長過程中m將保持恒定;
- 分類樹為了達到低偏差和高差異而要充分生長,使每個節(jié)點的不純度達到最小,不進行通常的剪枝操作。
投票過程:
隨機森林采用Bagging方法生成多個決策樹分類器。
基本思想:
- 給定一個弱學(xué)習(xí)算法和一個訓(xùn)練集,單個弱學(xué)習(xí)算法準確率不高,可以視為一個窄領(lǐng)域?qū)<遥?/li>
- 將該學(xué)習(xí)算法使用多次,得出預(yù)測函數(shù)序列,進行投票,將多個窄領(lǐng)域?qū)<以u估結(jié)果匯總,最后結(jié)果準確率將大幅提升。
隨機森林的優(yōu)點:
- 可以處理大量的輸入變量;
- 對于很多種資料,可以產(chǎn)生高準確度的分類器;
- 可以在決定類別時,評估變量的重要性;
- 在建造森林時,可以在內(nèi)部對于一般化后的誤差產(chǎn)生不偏差的估計;
- 包含一個好方法可以估計遺失的資料,并且,如果有很大一部分的資料遺失,仍可以維持準確度;
- 提供一個實驗方法,可以去偵測 variable interactions;
- 對于不平衡的分類資料集來說,可以平衡誤差;
- 計算各例中的親近度,對于數(shù)據(jù)挖掘、偵測偏離者(outlier)和將資料視覺化非常有用;
- 使用上述??杀谎由鞈?yīng)用在未標記的資料上,這類資料通常是使用非監(jiān)督式聚類。也可偵測偏離者和觀看資料;
- 學(xué)習(xí)過程很快速。
缺點
- 隨機森林已經(jīng)被證明在某些噪音較大的分類或回歸問題上會過擬合;
- 對于有不同級別的屬性的數(shù)據(jù),級別劃分較多的屬性會對隨機森林產(chǎn)生更大的影響,所以隨機森林在這種數(shù)據(jù)上產(chǎn)出的屬性權(quán)值是不可信的。
R語言實現(xiàn)
尋找最優(yōu)參數(shù)mtry,即指定節(jié)點中用于二叉樹的最佳變量個數(shù)
library("randomForest") n<-length(names(train_data)) #計算數(shù)據(jù)集中自變量個數(shù),等同n=ncol(train_data) rate=1 #設(shè)置模型誤判率向量初始值 for(i in 1:(n-1)){ set.seed(1234) rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=i,ntree=1000) rate[i]<-mean(rf_train$err.rate) #計算基于OOB數(shù)據(jù)的模型誤判率均值 print(rf_train) } rate #展示所有模型誤判率的均值 plot(rate)
尋找最佳參數(shù)ntree,即指定隨機森林所包含的最佳決策樹數(shù)目
set.seed(100) rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntree=1000) plot(rf_train) #繪制模型誤差與決策樹數(shù)量關(guān)系圖 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設(shè)定是否輸出因變量在模型中的重要性,如果移除某個變量,模型方差增加的比例是它判斷變量重要性的標準之一;
- proximity參數(shù)用于設(shè)定是否計算模型的臨近矩陣;
- ntree用于設(shè)定隨機森林的樹數(shù)。
輸出變量重要性:分別從精確度遞減和均方誤差遞減的角度來衡量重要程度。
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為基尼系數(shù)方法
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)) #展示隨機森林模型中每棵決策樹的節(jié)點數(shù) 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)) #展示數(shù)據(jù)集在二維情況下各類別的具體分布情況
檢測
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) #預(yù)測準確率 plot(margin(rf_train,test_data$IS_LIUSHI),main=觀測值被判斷正確的概率圖)
randomForest包可以實現(xiàn)隨機森林算法的應(yīng)用,主要涉及5個重要函數(shù),語法和參數(shù)請見下
1:randomForest()函數(shù)用于構(gòu)建隨機森林模型
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, ...)
- formula指定模型的公式形式,類似于y~x1+x2+x3…;
- data指定分析的數(shù)據(jù)集;
- subset以向量的形式確定樣本數(shù)據(jù)集;
- na.action指定數(shù)據(jù)集中缺失值的處理方法,默認為na.fail,即不允許出現(xiàn)缺失值,也可以指定為na.omit,即刪除缺失樣本;
- x指定模型的解釋變量,可以是矩陣,也可以是數(shù)據(jù)框;
- y指定模型的因變量,可以是離散的因子,也可以是連續(xù)的數(shù)值,分別對應(yīng)于隨機森林的分類模型和預(yù)測模型。這里需要說明的是,如果不指定y值,則隨機森林將是一個無監(jiān)督的模型;
- xtest和ytest用于預(yù)測的測試集;
- ntree指定隨機森林所包含的決策樹數(shù)目,默認為500;
- mtry指定節(jié)點中用于二叉樹的變量個數(shù),默認情況下數(shù)據(jù)集變量個數(shù)的二次方根(分類模型)或三分之一(預(yù)測模型)。一般是需要進行人為的逐次挑選,確定最佳的m值;
- replace指定Bootstrap隨機抽樣的方式,默認為有放回的抽樣
- classwt指定分類水平的權(quán)重,對于回歸模型,該參數(shù)無效;
- strata為因子向量,用于分層抽樣;
- sampsize用于指定樣本容量,一般與參數(shù)strata聯(lián)合使用,指定分層抽樣中層的樣本量;
- nodesize指定決策樹節(jié)點的最小個數(shù),默認情況下,判別模型為1,回歸模型為5;
- maxnodes指定決策樹節(jié)點的最大個數(shù);
- importance邏輯參數(shù),是否計算各個變量在模型中的重要性,默認不計算,該參數(shù)主要結(jié)合importance()函數(shù)使用;
- proximity邏輯參數(shù),是否計算模型的臨近矩陣,主要結(jié)合MDSplot()函數(shù)使用;
- oob.prox是否基于OOB數(shù)據(jù)計算臨近矩陣;
- norm.votes顯示投票格式,默認以百分比的形式展示投票結(jié)果,也可以采用絕對數(shù)的形式;
- do.trace是否輸出更詳細的隨機森林模型運行過程,默認不輸出;
- keep.forest是否保留模型的輸出對象,對于給定xtest值后,默認將不保留算法的運算結(jié)果。
2:importance()函數(shù)用于計算模型變量的重要性
importance(x, type=NULL, class="NULL", scale=TRUE, ...)
- x為randomForest對象;
- type可以是1,也可以是2,用于判別計算變量重要性的方法,1表示使用精度平均較少值作為度量標準;2表示采用節(jié)點不純度的平均減少值最為度量標準。值越大說明變量的重要性越強;
- scale默認對變量的重要性值進行標準化。
3:MDSplot()函數(shù)用于實現(xiàn)隨機森林的可視化
MDSplot(rf, fac, k=2, palette=NULL, pch=20, ...)
- rf為randomForest對象,需要說明的是,在構(gòu)建隨機森林模型時必須指定計算臨近矩陣,即設(shè)置proximity參數(shù)為TRUE;
- fac指定隨機森林模型中所使用到的因子向量(因變量);
- palette指定所繪圖形中各個類別的顏色;
- pch指定所繪圖形中各個類別形狀;
- 還可以通過R自帶的plot函數(shù)繪制隨機森林決策樹的數(shù)目與模型誤差的折線圖
4:rfImpute()函數(shù)可為存在缺失值的數(shù)據(jù)集進行插補(隨機森林法),得到最優(yōu)的樣本擬合值
rfImpute(x, y, iter=5, ntree=300, ...) rfImpute(x, data, ..., subset)
- x為存在缺失值的數(shù)據(jù)集;
- y為因變量,不可以存在缺失情況;
- iter指定插值過程中迭代次數(shù);
- ntree指定每次迭代生成的隨機森林中決策樹數(shù)量;
- subset以向量的形式指定樣本集。
5:treesize()函數(shù)用于計算隨機森林中每棵樹的節(jié)點個數(shù)
treesize(x, terminal=TRUE)
- x為randomForest對象;
- terminal指定計算節(jié)點數(shù)目的方式,默認只計算每棵樹的根節(jié)點,設(shè)置為FALSE時將計算所有節(jié)點(根節(jié)點+葉節(jié)點)。
- 一般treesize()函數(shù)生成的結(jié)果用于繪制直方圖,方面查看隨機森林中樹的節(jié)點分布情況。
到此這篇關(guān)于R語言實現(xiàn)隨機森林的方法示例的文章就介紹到這了,更多相關(guān)R語言 隨機森林內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
R語言學(xué)習(xí)Rcpp基礎(chǔ)知識全面整理
這篇文章主要介紹了R語言學(xué)習(xí)Rcpp知識的全面整理,包括相關(guān)配置說明,常用數(shù)據(jù)類型及建立等基礎(chǔ)知識的全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11R語言rhdf5讀寫hdf5并展示文件組織結(jié)構(gòu)和索引數(shù)據(jù)
這篇文章主要為大家介紹了R語言rhdf5讀寫hdf5并展示文件組織結(jié)構(gòu)和索引數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06