隨機森林(Random Forest)是一種經(jīng)典的機器學習算法,是數(shù)據(jù)科學家中最受歡迎和常用的算法之一,最早由Leo Breiman和Adele Cutler于2001年提出。它是基于集成學習(Ensemble Learning)的一種方法,通過組合多個決策樹來進行預測和分類,在回歸問題中則取平均值。其最重要的特點之一是能夠處理包含連續(xù)變量和分類變量的數(shù)據(jù)集。在本文中,我們將詳細了解隨機森林的工作原理,介紹其在R中的實現(xiàn)及其優(yōu)缺點。
1. 算法基本原理
1) 隨機抽樣:在隨機森林中,每個決策樹的訓練樣本都是通過隨機抽樣得到的。隨機抽樣是指從原始訓練集中有放回地抽取一部分樣本,構成一個新的訓練集。這樣做的目的是使得每個決策樹的訓練樣本略有差異,增加決策樹之間的多樣性。
2) 隨機特征選擇:在每個決策樹的節(jié)點上,隨機森林算法會從所有特征中隨機選擇一部分特征進行分割。這樣做的目的是增加每個決策樹之間的差異性,防止某些特征過于主導整個隨機森林的決策過程。
3) 決策樹構建:使用隨機采樣的數(shù)據(jù)和隨機選擇的特征,構建多個決策樹。決策樹的構建過程中,采用通常的決策樹算法(如ID3、CART等)。
4) 隨機森林的預測:當新的樣本輸入到隨機森林中時,它會經(jīng)過每個決策樹的預測過程,最后根據(jù)決策集成的方式得到最終的預測結(jié)果。對于分類問題,最常見的集成方式是采用多數(shù)投票,即根據(jù)每個決策樹的分類結(jié)果進行投票,選擇獲得最多票數(shù)的類別作為最終的預測結(jié)果。對于回歸問題,可以采用平均預測的方式,即將每個決策樹的預測值取平均作為最終的預測結(jié)果。n
通過隨機抽樣和隨機特征選擇,隨機森林算法能夠減少過擬合風險,提高模型的泛化能力。同時,通過集成多個決策樹的預測結(jié)果,隨機森林能夠獲得更穩(wěn)定和準確的預測。
2. 隨機森林算法的R實現(xiàn)
以鳶尾花數(shù)據(jù)集為例,加載需要的包及數(shù)據(jù)集,未安裝的需要先安裝。
library(randomForest)
library(datasets)
library(caret)
data<-iris
str(data)
數(shù)據(jù)集包含150個觀測值和5個變量。物種被視為響應變量,為因子變量。
data$Species <- as.factor(data$Species)
table(data$Species)
可以看到結(jié)局變量各個分類分布平衡。
1)首先進行隨機抽樣。
set.seed(222)
ind <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3))
train <- data[ind==1,]
test <- data[ind==2,]
其中測試集中有106個sample,訓練集中有44個sample。
2)然后進行模型構建,這里使用默認參數(shù)擬合隨機森林模型。
rf <- randomForest(Species~., data=train, proximity=TRUE)
3)參數(shù)調(diào)整
參數(shù)調(diào)整是優(yōu)化隨機森林模型性能的重要步驟。下面是一些常用的參數(shù)調(diào)整方法:
樹的數(shù)量(ntree):增加樹的數(shù)量可以提高模型的穩(wěn)定性和準確性,但也會增加計算時間。一般來說,增加樹的數(shù)量直到模型性能趨于穩(wěn)定為止。
特征數(shù)(mtry):mtry參數(shù)控制每個決策樹在分裂節(jié)點時隨機選擇的特征數(shù)。較小的mtry值會增加樹之間的差異性,但可能會降低模型的準確性。較大的mtry值會增加模型的穩(wěn)定性,但可能會導致模型過度擬合。一般推薦使用默認值sqrt(p),其中p是特征的總數(shù)。
決策樹的最大深度(max_depth):限制決策樹的最大深度可以防止過度擬合。通過限制最大深度,可以控制模型的復雜度并提高泛化能力。
節(jié)點分割的最小樣本數(shù)(min_samples_split):限制節(jié)點分割所需的最小樣本數(shù)可以控制決策樹的生長。較小的值會增加模型的復雜性,可能導致過度擬合。較大的值會限制模型的生長,可能導致欠擬合。選擇合適的值需要根據(jù)數(shù)據(jù)集的大小和特征的分布進行調(diào)整。
節(jié)點分割的最小準則(criterion):決定節(jié)點分割的準則,常用的有基尼系數(shù)(gini)和信息增益(entropy)。這兩個準則在大多數(shù)情況下表現(xiàn)相似,通常選擇默認值基尼系數(shù)。
其他參數(shù):還有其他一些參數(shù)可以調(diào)整,如樣本權重、葉節(jié)點最小樣本數(shù)等,根據(jù)具體問題進行調(diào)整。
# 如果需要調(diào)整參數(shù),可以使用tuneRF()函數(shù)進行自動調(diào)參。
tuned_rf_model <- tuneRF(train[, -5], train[, 5], ntreeTry = 500,
? ? ? ? ? ? ? ? ? ? ? ?stepFactor = 1.5, improve = 0.01, trace = TRUE,
? ? ? ? ? ? ? ? ? ? ? ?plot = TRUE)
可以看到mtry=3時,OOBerror最小,因此模型中應該設置mtry=3。
在進行參數(shù)調(diào)整時,可以使用交叉驗證來評估模型性能,并選擇表現(xiàn)最好的參數(shù)組合。例如,可以使用k折交叉驗證,將訓練集分成k個子集,每次使用其中k-1個子集作為訓練數(shù)據(jù),剩余一個子集作為驗證數(shù)據(jù),重復進行k次并計算平均性能指標。
R中的caret包為調(diào)整機器學習算法的參數(shù)提供了一個很好的工具。但并非所有的機器學習算法都可以在caret中進行調(diào)整。只有那些影響較大的算法參數(shù)才可以在caret中進行調(diào)整。因此,caret中只有mtry參數(shù)可供調(diào)諧。原因是它對最終準確度的影響,而且它必須根據(jù)經(jīng)驗為一個數(shù)據(jù)集找到。ntree參數(shù)則不同,它可以隨心所欲地放大,并在一定程度上繼續(xù)提高精度。它的調(diào)整不那么困難或關鍵,而且可能更多的是受到可用計算時間的限制。
R中實現(xiàn)方式如下:
# 定義參數(shù)網(wǎng)格
rf_grid <- expand.grid(mtry = seq(2, 6, by = 1))
# 設置交叉驗證方案
control <- trainControl(method = "cv", number = 10)
# 運行交叉驗證
rf_model <- train(Species ~ ., data = train, method = "rf", trControl = control, tuneGrid = rf_grid, importance = TRUE)
# 輸出最佳參數(shù)組合和性能指標
print(rf_model$bestTune)
print(rf_model$results)
可以看到在mtry=3時,Accuracy最高。
best_model <- rf_model$finalModel
將調(diào)優(yōu)后的參數(shù)賦值給best_model。
在上面的代碼中,我們首先將數(shù)據(jù)集劃分為訓練集和測試集。然后定義了一個包含參數(shù)范圍(mtry)的網(wǎng)格。接下來,使用trainControl()函數(shù)設置了一個十折折交叉驗證方案,并運行train()函數(shù)來進行模型擬合和性能評估。最后,輸出了最佳參數(shù)組合和各個參數(shù)組合下的性能指標。需要注意的是,在實際應用中,可能需要嘗試多個不同的參數(shù)網(wǎng)格,并對每個網(wǎng)格進行交叉驗證以選擇最優(yōu)參數(shù)組合。
3)接下來在測試集中進行預測。
# 預測測試集數(shù)據(jù)
predictions <- predict(best_model, newdata = test)
# 繪制混淆矩陣
result_matrix<-confusionMatrix(table(predictions, test$Species))
result_matrix
混淆矩陣中顯示了預測各個類別的敏感性,特異性等指標,總體Accuracy為0.9388,具有很好的預測效能。
#模型的各個類別預測效能
result_matrix$byClass
#預測各個類別概率
rf_pred <- predict(best_model, test, type = 'prob')
rf_pred <- data.frame(rf_pred)
colnames(rf_pred) <- paste0(colnames(rf_pred), "_pred_RF")
構建繪圖數(shù)據(jù),該部分在我前面的博客里也講過做法,詳情見,這里再呈現(xiàn)一下。
Library(multiROC)
true_label <- dummies::dummy(test_df$Species, sep = ".")
true_label <- data.frame(true_label)
colnames(true_label) <- gsub(".*?\\.", "", colnames(true_label))
colnames(true_label) <- paste(colnames(true_label), "_true")
final_df <- cbind(true_label, rf_pred)
roc_res <- multi_roc(final_df, force_diag=F)
pr_res <- multi_pr(final_df, force_diag=F)
plot_roc_df <- plot_roc_data(roc_res)
plot_pr_df <- plot_pr_data(pr_res)
##AUC值
auc_value<-roc_res_value$AUC
auc_num<-unlist(auc_value)
# 繪制ROC曲線
require(ggplot2)
ggplot(plot_roc_df, aes(x = 1-Specificity, y=Sensitivity)) +
?geom_path(aes(color = Group), size=1.5) +
?geom_segment(aes(x = 0, y = 0, xend = 1, yend = 1),
? ? ? ? ? ? ? colour='grey', linetype = 'dotdash') +
?theme_bw() +
? theme(plot.title = element_text(hjust = 0.5),
? ? ? ?legend.justification=c(1, 0), legend.position=c(.95, .05),
? ? ? ?legend.title=element_blank(),
? ? ? ?legend.background = element_rect(fill=NULL, size=0.5,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?linetype="solid", colour ="black"))
評估變量重要性
Importance(best_model)
此處“Mean Decrease Accuracy”和“Mean Decrease Gini”為隨機森林模型中的兩個重要指標。其中,“mean decrease accuracy”表示隨機森林預測準確性的降低程度,該值越大表示該變量的重要性越大;“mean decrease gini”計算每個變量對分類樹每個節(jié)點上觀測值的異質(zhì)性的影響,從而比較變量的重要性。該值越大表示該變量的重要性越大。
3. 算法優(yōu)缺點
1)隨機森林算法相比于其他機器學習算法具有以下優(yōu)勢:
高準確性:通過組合多個決策樹,利用集成學習的方式提高了預測的準確性。它能夠處理大量的訓練數(shù)據(jù),并且對于噪聲和缺失數(shù)據(jù)具有較好的魯棒性。
可擴展性:可以有效地處理具有大量特征的數(shù)據(jù)集,并且能夠處理高維度的輸入。它可以在較短的時間內(nèi)對大規(guī)模數(shù)據(jù)集進行訓練,并且具有較快的預測速度。
特征選擇:可以通過計算特征的重要性來評估每個特征對于預測的貢獻程度。這可以幫助我們識別出對于問題最為重要的特征,從而進行特征選擇和降維,提高模型的效率和性能。
抗過擬合:通過隨機選擇訓練樣本和特征的方式,降低了單個決策樹過擬合的風險。同時,隨機森林中的多個決策樹進行投票或平均預測,可以減少模型的方差,提高了泛化能力。
處理非線性關系:能夠有效地處理非線性關系,不需要對數(shù)據(jù)進行過多的預處理或進行特征工程。它可以捕捉到特征之間的復雜非線性關系,從而更好地擬合數(shù)據(jù)。
魯棒性:對于缺失值和噪聲具有較好的魯棒性。它可以處理具有缺失值的數(shù)據(jù),并且對于噪聲和異常值的影響較小。
總的來說,隨機森林算法在準確性、可擴展性、特征選擇、抗過擬合、處理非線性關系和魯棒性等方面都具有優(yōu)勢,因此在許多實際應用中被廣泛采用。
2)缺點:
決策邊界的不連續(xù)性:由于隨機森林是由多個決策樹組成的,因此它的決策邊界是由決策樹的集合構成的。這可能導致決策邊界出現(xiàn)不連續(xù)的情況,對于某些問題可能不夠精細。
訓練時間較長:相比于一些簡單的線性模型,隨機森林的訓練時間可能較長。因為它需要構建多個決策樹并進行集成,每個決策樹的構建都需要消耗時間。
難以解釋性:算法的預測結(jié)果可能較難以解釋。由于它是由多個決策樹集成而成,決策樹之間的復雜關系可能使得解釋模型的預測過程變得困難。
對于高維稀疏數(shù)據(jù)不太適用:在處理高維稀疏數(shù)據(jù)時可能表現(xiàn)不佳。由于決策樹在高維空間中容易出現(xiàn)過擬合問題,而隨機森林的集成學習也無法完全克服這個問題。
超參數(shù)調(diào)優(yōu)的挑戰(zhàn):有多個超參數(shù)需要調(diào)優(yōu),如決策樹數(shù)量、最大深度等。在實際應用中,選擇合適的超參數(shù)可能需要一定的經(jīng)驗和調(diào)試,增加了調(diào)優(yōu)的難度。
需要注意的是,隨機森林算法的優(yōu)勢和缺點是相對于其他機器學習算法而言的,不同的算法在不同的問題和數(shù)據(jù)集上可能具有不同的表現(xiàn)。在實際應用中,選擇合適的算法要根據(jù)具體問題的特點和需求進行綜合考量。
Reference:
https://linuxcpp.0voice.com/?id=89171
https://stackoverflow.com/questions/34169774/plot-roc-for-multiclass-roc-in-proc-package
http://t.csdn.cn/T6mFJ
更多信息與交流,歡迎關注公眾號:單細胞學會文章來源:http://www.zghlxwxcb.cn/news/detail-708570.html
直接掃描下方二維碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-708570.html
到了這里,關于隨機森林算法介紹及多分類預測的R實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!