【機器學習筆記 Ⅱ】12隨機森林

隨機森林(Random Forest)詳解

隨機森林是一種基于集成學習(Ensemble Learning)的高性能分類/回歸算法,通過構建多棵決策樹并綜合其預測結果,顯著提升模型的準確性和魯棒性。其核心思想是“集體智慧優于個體決策”。


1. 核心思想
  • Bagging(Bootstrap Aggregating):通過有放回抽樣生成多個訓練子集,每棵樹獨立訓練。
  • 隨機特征選擇:每個節點分裂時,僅考慮隨機子集的特征(進一步增加多樣性)。
  • 投票/平均機制
    • 分類任務:多數投票(Majority Voting)。
    • 回歸任務:預測均值。

2. 算法步驟
  1. 數據采樣
    • 從原始訓練集中通過Bootstrap抽樣(有放回)生成 ( T ) 個子集(每子集≈63.2%原始數據)。
  2. 構建決策樹
    • 對每個子集訓練一棵決策樹,節點分裂時從隨機選擇的 ( m ) 個特征中找最優劃分(通常 ( m = \sqrt{\text{總特征數}} ))。
  3. 聚合結果
    • 分類:統計所有樹的預測類別,取票數最多的類別。
    • 回歸:計算所有樹的預測平均值。

3. 關鍵特性
特性說明
降低方差多棵樹平均減少過擬合風險(相比單棵決策樹)。
抗噪聲通過多數投票抑制異常值影響。
并行化訓練各樹獨立訓練,適合分布式計算。
特征重要性基于特征在分裂時的貢獻度(如基尼下降)自動評估。

4. 代碼實現
(1) Scikit-learn分類
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris# 加載數據
data = load_iris()
X, y = data.data, data.target# 訓練模型
rf = RandomForestClassifier(n_estimators=100,      # 樹的數量max_depth=5,           # 單樹最大深度max_features='sqrt',   # 每節點分裂考慮的特征數(sqrt為特征數平方根)random_state=42
)
rf.fit(X, y)# 預測
y_pred = rf.predict(X)
(2) Scikit-learn回歸
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_errorrf_reg = RandomForestRegressor(n_estimators=200)
rf_reg.fit(X_train, y_train)
mse = mean_squared_error(y_test, rf_reg.predict(X_test))
(3) 特征重要性可視化
import matplotlib.pyplot as pltplt.barh(data.feature_names, rf.feature_importances_)
plt.xlabel("Feature Importance")
plt.show()

特征重要性


5. 超參數調優
參數作用推薦范圍
n_estimators樹的數量100-500(越多越好,但計算成本增加)
max_depth單棵樹的最大深度5-30(防過擬合)
max_features節點分裂時的特征子集大小'sqrt'(分類)、'log2'或0.3-0.8
min_samples_split節點分裂所需最小樣本數2-10
bootstrap是否使用Bootstrap抽樣True(默認)

網格搜索示例

from sklearn.model_selection import GridSearchCVparam_grid = {'n_estimators': [100, 200],'max_depth': [5, 10, None],'max_features': ['sqrt', 'log2']
}
grid_search = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
print("最佳參數:", grid_search.best_params_)

6. 優缺點對比
優點缺點
1. 高準確性:優于單棵決策樹和許多其他算法。1. 計算成本高:樹數量多時訓練慢。
2. 抗過擬合:通過隨機性降低方差。2. 內存占用大:需存儲多棵樹。
3. 無需特征縮放:對數據分布不敏感。3. 可解釋性弱:相比單棵樹更難解釋。

7. 進階應用
(1) 異常檢測

利用樣本在所有樹中的平均深度(Isolation Forest原理相近)。

(2) 缺失值處理

通過隨機森林的相似性矩陣估算缺失值。

(3) 分類-回歸混合任務

使用MultiOutputRegressor處理多目標預測。


8. 與梯度提升樹(GBDT/XGBoost)對比
特性隨機森林梯度提升樹(如XGBoost)
訓練方式并行獨立訓練多棵樹串行訓練,每棵樹修正前序錯誤
偏差-方差主要降低方差同時降低偏差和方差
參數敏感性相對不敏感需精細調參(如學習率、樹深度)
適用場景高維數據、快速原型開發高精度需求、中小規模數據

9. 總結
  • 隨機森林 = Bagging + 隨機特征選擇 + 決策樹,通過“集體決策”提升泛化能力。
  • 核心優勢:抗過擬合、處理高維數據、天然支持特征重要性評估。
  • 適用場景
    • 分類/回歸任務(尤其特征間存在復雜交互)。
    • 需要快速基線模型或特征重要性分析的場景。
  • 升級方向
    • 對速度要求高時→ 使用RandomForestwarm_start增量訓練。
    • 對精度要求高時→ 嘗試XGBoostLightGBM

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88055.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88055.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

問題 1:MyBatis-plus-3.5.9 的分頁功能修復

問題 1:MyBatis-plus-3.5.9 的分頁功能修復 使用 Sw?agger 接口文檔?依次對上述接口進行測 試,發現 listU?serVOByPage 接口有一些問題! 分頁好像沒有生效,還是查出了全部數據: 由于我們用的是 MyBatis Plus 來操…

Qt 如何提供在線幫助

Qt 如何提供在線幫助一、概述二、工具提示、狀態提示和"Whats This?"幫助1、工具提示(Tool Tips)添加工具提示到控件富文本工具提示全局工具提示設置延遲顯示控制自定義工具提示窗口禁用工具提示工具提示與狀態欄聯動特點:2、狀態提示(Status Tips)3、&q…

Typecho站點關閉插件開發全指南:從原理到實現

文章目錄 開發Typecho站點關閉插件:從原理到實現一、背景與需求分析二、插件設計思路2.1 技術選型2.2 功能模塊設計三、插件開發實現3.1 插件基礎結構3.2 插件主文件實現3.3 核心功能實現3.4 后臺管理界面3.5 關閉頁面模板四、插件配置完善4.1 配置表單實現4.2 定時任務處理五…

詳細解析 .NET 依賴注入的三種生命周期模式

文章目錄一、Transient(瞬時生命周期)原理使用方式核心特性適用場景優勢劣勢二、Scoped(作用域生命周期)原理使用方式核心特性適用場景優勢劣勢三、Singleton(單例生命周期)原理使用方式核心特性適用場景優…

軟件工程經濟與倫理

前言 各位帥哥美女,能看到這篇博客的都有口福了,學習這門課程就像遨游在大份的海洋,一不小心就吃上一口。能看到這篇博客說明我們是有緣人可以點贊收藏一下,這篇博客可以在你無比饑餓的時候給你送上一坨!(香…

AI 體驗走查 - 火山引擎存儲的 AI UX 探索之路

01 概述 火山引擎存儲技術團隊驅動 AI 自主完成用戶體驗走查 / 可用性測試的執行與評價,幫助業務改善交互體驗。 立項“故事走查”的背景訴求和 AI 機遇 如何搭建“AI 評價”能力,精準識別交互問題 讓交互體驗故事走查變為技術產品,講解系…

【世紀龍科技】汽車零部件檢驗虛擬實訓室-助力汽車職教實訓

在汽車產業加速向電動化、智能化轉型的背景下,職業院校汽車專業教學面臨新的挑戰:傳統實訓受限于設備數量不足、操作風險高、標準化程度低等問題,導致學生實踐機會有限,技能掌握不扎實。如何讓學生在有限資源下高效掌握零部件檢驗…

MySQL常用操作 查看表描述以及表結構、連接數及緩存和性能指標

查看表描述以及表結構查看數據庫名SHOW DATABASES; SELECT DATABASE(); SELECT DATABASE() AS current_database;查看數據庫中表的列表SHOW TABLES; SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA your_database_name; SELECT TABLE_NA…

音視頻學習(三十六):websocket協議總結

概述項目描述標準RFC 6455使用端口默認 80(ws),443(wss)基于協議TCP特性全雙工、低開銷、持久連接、可穿透代理特點 全雙工通信: WebSocket 允許客戶端和服務器之間建立一個持久的連接,并且數據…

docker版本nacos的搭建

1.下載鏡像2.拷貝出容器中對應的配置文件,logs,data,conf3.編寫yaml配置文件version: 3.8 services:nacos-server:image: nacos/nacos-server:v2.4.0container_name: nacos-serverrestart: unless-stoppedports:- "8848:8848" # …

【機器學習深度學習】 如何解決“宏平均偏低 / 小類識別差”的問題?

目錄 🧩 場景 一、先問清楚:小類差,到底差在哪? 二、對癥下藥:六大優化策略(分類任務專用) ? 1. 處理類別不平衡(最常見) ? 2. 優化數據質量 ? 3. 更強的模型結…

數據結構 --- 棧

棧 --- stack前言一、棧結構二、相關方法1.初始化2.入棧3.出棧4.判空5.獲取棧頂元素6.獲取棧大小7.銷毀前言 棧是一個特殊的線性表,遵循一個先進后出的特性,即操作數據(入棧,出棧)只能從棧頂操作,棧底是一…

【uniapp】---- 在 HBuilderX 中使用 tailwindcss

1. 前言 接手了一個uniapp的微信小程序項目,因為在上一個 taro 的項目中使用的 tailwindcss,感覺比較方便,又不想動項目中原來的代碼,因此就配置 tailwindcss,在新創建的子包中使用。 2. 分析 vue2 版本的 uni-app 內置的 webpack 版本為 4 , postcss 版本為 7, 所以還是…

Spring Boot + Easy Excel 自定義復雜樣式導入導出

tips&#xff1a;能用模板就用模板&#xff0c;當模板不適用的情況下&#xff0c;再選擇自定義生成 Excel。官網&#xff1a;https://easyexcel.opensource.alibaba.com安裝<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</arti…

Spark從入門到實戰:安裝與使用全攻略

目錄一、Spark 簡介1.1 Spark 的概念1.2 Spark 的優勢1.3 Spark 的應用場景二、安裝前準備2.1 硬件要求2.2 軟件要求2.3 下載 Spark三、Spark 安裝步驟3.1 解壓安裝包3.2 配置環境變量3.3 配置 spark-env.sh3.4 配置 slaves 文件&#xff08;分布式模式&#xff09;3.5 啟動 Sp…

Python 進程間的通信:原理剖析與項目實戰

在 Python 編程中,當涉及多進程編程時,進程間的通信(Inter-Process Communication,簡稱 IPC)是一個重要的課題。多個進程在運行過程中,常常需要交換數據、傳遞狀態或協同工作,這就離不開進程間通信機制。本文將深入講解 Python 進程間通信的原理,并結合實際項目案例,展…

神經網絡之BP算法

一、正向傳播正向傳播&#xff08;Forward Propagation&#xff09;是神經網絡中數據從輸入層流向輸出層的過程。輸入數據通過各層的權重和激活函數逐層計算&#xff0c;最終得到預測輸出。數學表示&#xff1a; 對于第 ( l ) 層的神經元&#xff0c;其輸出計算如下&#xff1a…

Ubuntu 版本號與別名對照表(部分精選)

Ubuntu 的別名遵循 形容詞 動物名 的命名規則&#xff0c;且兩個單詞首字母相同&#xff0c;按字母表順序循環使用&#xff08;從 Ubuntu 6.06 開始&#xff09;。 &#x1f4c5; Ubuntu 版本號與別名對照表&#xff08;部分精選&#xff09; 版本號別名 (開發代號)發布時間…

實驗03-Spark批處理開發

使用Spark Shell探索RDD 啟動并使用Scala Spark Shell 在終端窗口&#xff0c;啟動Scala Spark shell&#xff1a; spark-shell --master local查看對象&#xff1a; scala> sc scala> spark輸入spark.[TAB]然后可以看到所有可用的方法。 讀并顯示文本文件 查看文本…

【R語言】Can‘t subset elements that don‘t exist.

Error in select(): ? In argument: all_of(label_col). Caused by error in all_of(): ! Cant subset elements that dont exist. ? Element Label doesnt exist. Run rlang::last_trace() to see where the error occurred.原文中文解釋涉及關鍵詞Error in select()報錯發生…