【人工智能-18】機器學習:決策樹、隨機森林

上一期【人工智能-17】機器學習:KNN算法、模型選擇和調優、樸素貝葉斯分類

文章目錄

  • 一、決策樹
    • 1.使用理由
    • 2.技術
  • 二、隨機森林
    • 1.使用理由
    • 2.原理核心:Bagging + 隨機特征子集
    • 3.優點和缺點

一、決策樹

決策樹是一種監督學習算法,主要用于分類(預測離散標簽,如“是/否”、“貓/狗/鳥”)和回歸(預測連續值,如房價、溫度)任務。

它的模型結構像一棵倒置的樹:

  • 根節點 (Root Node): 包含整個數據集,代表最開始要判斷的特征。

  • 內部節點 (Internal Node / Decision Node): 代表一個特征或屬性上的測試。基于測試結果,數據被分割到不同的子節點。

  • 分支 (Branches): 代表一個特征測試的可能結果(例如,特征“年齡”的分支可能是“年齡<30”和“年齡>=30”)。

  • 葉節點 (Leaf Node / Terminal Node): 代表最終的決策結果(分類標簽或回歸值)。數據到達葉節點后不再分割。

構建決策樹的過程就是通過一系列“如果…那么…”的規則,將復雜的數據集逐步分割成更小、更“純凈”的子集,直到達到停止條件(如子集足夠純凈、達到最大深度、包含樣本數太少等)。

1.使用理由

高度可解釋性: 這是決策樹最核心的優勢!生成的樹結構可以被直觀地可視化和理解,決策規則清晰透明(白盒模型),容易向非技術人員解釋預測背后的邏輯。這在需要理解模型決策過程的應用中(如金融風控、醫療診斷輔助)至關重要。

對數據預處理要求相對較低:

  • 能直接處理分類特征和數值特征(數值特征需要選擇分割點)。

  • 對特征的尺度(量綱)不敏感(因為決策是基于值比較,而不是距離計算)。

  • 對缺失值有一定容忍度(可以通過特定策略處理,如分配到出現頻率最高的分支,或單獨創建分支)。

能夠捕捉特征之間的非線性關系: 通過樹的分支結構,可以自然地建模特征之間復雜的相互作用和非線性模式。

計算效率較高(訓練和預測): 訓練算法(如ID3, C4.5, CART)相對高效,預測新樣本的速度非常快,只需要沿著樹從根節點走到一個葉節點即可。

2.技術

決策樹構建的核心在于如何選擇“最佳”特征和分割點來分裂節點,目標是讓分裂后的子節點盡可能“純凈”。衡量“純凈度”的標準主要有兩種:

  • 基于信息增益 (Information Gain )
    1. 信息熵 (Entropy): 衡量數據集 D 的不確定性(混亂度)。熵越高,表示數據類別越混雜;熵為0,表示所有樣本都屬于同一類。公式核心思想:對每個類別 k,計算其占比 p_k,然后求和 -p_k * log2(p_k)p_k 越平均(接近0.5),熵越大。
    2. 信息增益 (IG): 衡量使用某個特征 A 對數據集 D 進行分割后,不確定性減少的程度。
      • 計算分裂數據集 D 的熵 H(D)
      • 根據特征 A 的每個可能取值(或分割點)將 D 分成若干子集 D_v
      • 計算分裂所有子集的熵的加權平均值 H(D|A)(權重是子集樣本數占總樣本數的比例)。
      • 信息增益 IG(D, A) = H(D) - H(D|A)
    3. 特征選擇: 選擇能帶來最大信息增益的特征進行當前節點的分裂。信息增益越大,意味著使用該特征分裂后,子集變得更“純凈”(不確定性降低得最多)。
    4. 缺點: 信息增益傾向于選擇取值數目多的特征(如“身份證號”),因為分裂后子集純度容易更高(極端情況每個樣本一個子集,熵為0),但這會導致過擬合且沒有泛化能力。
    5. 改進:信息增益率 (Gain Ratio - C4.5算法): 引入一個懲罰項,稱為“分裂信息” SplitInfo(A),它衡量按特征 A 分裂時產生的分支數量的多少(分支越多,SplitInfo(A) 越大)。信息增益率 GR(D, A) = IG(D, A) / SplitInfo(A)。這抑制了對取值多特征的偏好。
  • 基于基尼指數 (Gini Index / Gini Impurity )
    1. 基尼指數: 衡量從數據集 D 中隨機抽取兩個樣本,它們屬于不同類別的概率。概率越大,基尼指數越高,數據越不純。公式核心思想:對每個類別 k,計算其占比 p_k,然后求和 1 - Σ(p_k2)p_k 越平均(接近0.5),基尼指數越高(最大0.5);p_k 越偏向0或1(純),基尼指數越低(最小0)。
    2. 特征選擇:
      • 計算分裂數據集 D 的基尼指數 Gini(D)
      • 根據特征 A 的每個可能取值(或分割點)將 D 分成若干子集 D_v
      • 計算分裂所有子集的基尼指數的加權平均值 Gini(D|A)
      • 選擇能使 Gini(D|A) 最小(即分裂后子集純度提升最大)的特征進行分裂。等價于選擇能使基尼指數減少量(基尼增益)最大的特征。
    3. 特點: 基尼指數計算比熵稍快(不用算log),實踐中效果通常與信息增益/信息增益率相似。CART算法使用基尼指數,并且其構建的樹是二叉樹(每次分裂只產生兩個子節點),對數值特征處理更自然(尋找一個最佳分割點)。
# 決策樹 對葡萄酒進行分類
# 基于信息增益的決策樹
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
# 獲取數據
x,y = load_wine(return_X_y=True)# 劃分數據集
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.8,random_state=22)# 模型訓練
# 當模型訓練時,criterion參數可以指定信息增益的計算方式,默認是gini,也可以指定為entropy
model = DecisionTreeClassifier(criterion='entropy')
model.fit(x_train,y_train)
print('準確率\n',model.score(x_test,y_test))
print('預測結果\n',model.predict(x_test))# 基于基尼指數的決策樹
# 當criterion='gini'時,使用基尼指數
gini = DecisionTreeClassifier(criterion='gini')
gini.fit(x_train,y_train)
print('準確率\n',gini.score(x_test,y_test))
print('預測結果\n',gini.predict(x_test))

二、隨機森林

  • 隨機森林是一種基于Bagging(Bootstrap Aggregating)集成學習思想,并引入了隨機特征選擇的算法。它的核心是構建多棵決策樹(稱為“森林”),并通過投票(分類)或平均(回歸)的方式結合這些樹的預測結果,從而獲得比單一決策樹更優、更穩定的性能。
  • 簡單來說:隨機森林 = Bagging + 隨機特征子集 + 決策樹(通常是CART樹)。

1.使用理由

  • 顯著提高泛化能力,減少過擬合: 這是使用隨機森林最根本的理由。單一決策樹容易過擬合。通過集成大量略微不同且不完全過擬合的樹,隨機森林能夠有效地降低模型的方差(Variance),提高在未知數據上的預測精度和魯棒性。
  • 提升預測準確性和穩定性: 通過“眾人智慧”(多棵樹投票/平均),隨機森林通常能獲得比單棵決策樹以及其他許多單一模型更高的預測準確率。同時,它對訓練數據的小擾動不敏感,結果更穩定。
  • 處理高維特征: 在每棵樹分裂節點時只考慮隨機選取的部分特征(而不是全部),這在高維數據中非常有效,能降低計算量并減少不相關特征的干擾。
  • 提供特征重要性評估: 隨機森林可以方便地計算出每個特征對預測結果的相對重要性,有助于特征選擇和理解數據。
  • 保留決策樹的部分優點: 雖然可解釋性不如單棵樹,但仍然能處理混合類型特征、對量綱不敏感、能捕捉非線性關系等。

2.原理核心:Bagging + 隨機特征子集

隨機森林的訓練過程如下:

  1. Bagging (Bootstrap Aggregating):
    • 從原始訓練集 D有放回地隨機抽取 N 個樣本(形成一個Bootstrap樣本集 D_i)。這意味著每個樣本集 D_i 的大小與 D 相同,但包含重復樣本,且平均約有 63.2% 的原始樣本會被抽中,剩下的約 36.8% 成為該樹的袋外樣本 (Out-Of-Bag, OOB),可用于評估該樹的性能或特征重要性。
    • 重復上述過程 T 次,得到 T 個不同的 Bootstrap 訓練集 {D_1, D_2, ..., D_T}
  2. 構建決策樹 (使用隨機特征子集):
    • 對于每個 Bootstrap 訓練集 D_i,獨立地訓練一棵決策樹。
    • 關鍵點:在訓練每棵樹的每個內部節點進行分裂時不是從所有 M 個特征中選擇最優特征,而是先隨機選取 m 個特征m 通常遠小于 M,如 m = sqrt(M)m = log2(M) + 1),然后從這 m 個特征中選擇最優特征進行分裂。
    • 讓樹完全生長或接近完全生長(通常不剪枝或輕微剪枝),以達到低偏差(Bias)。通過集成來降低方差。
  3. 聚合預測 (Aggregation):
    • 分類任務: 對于新樣本,讓 T 棵樹分別進行預測,然后采用多數投票法(Majority Voting)決定最終的類別標簽。
    • 回歸任務: 對于新樣本,讓 T 棵樹分別進行預測,然后取所有預測值的平均值作為最終預測值。

核心思想:

  • Bagging: 通過 Bootstrap 抽樣引入樣本擾動,構建多樣化的樹(減少因數據擾動引起的方差)。
  • 隨機特征子集: 在節點分裂時隨機選擇特征子集,強制樹之間產生差異(降低樹與樹之間的相關性),進一步增加模型的多樣性(減少因特征選擇相關性引起的方差)。
  • 集成: 結合多個獨立、多樣化且具有低偏差的弱學習器(樹)的預測結果,通過“平均”效應顯著降低整體模型的方差,提高泛化能力。
# 隨機森林
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split,GridSearchCV# 獲取數據
x,y = load_wine(return_X_y=True)# 劃分數據集
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.8,random_state=22)# 模型訓練
# n_estimators: 樹的數量 默認100 max_depth: 樹的最大深度 默認None criterion: 決策樹屬性劃分算法選擇 默認gini enteropy是信息增益
Model = RandomForestClassifier(n_estimators=100,max_depth=None,criterion='gini') 
param_grid = {'max_depth':[3,5,10,20],'n_estimators':[100,200,300,400,500]}
# 使用超參數網格搜索,尋找最佳參數
enstimators = GridSearchCV(Model,param_grid=param_grid,cv=5)
enstimators.fit(x_train,y_train)# 模型評估
print('準確率:\n',enstimators.score(x_test,y_test))
print('預測結果:\n',enstimators.predict(x_test))# 獲取最佳參數
print('最佳參數:\n',enstimators.best_params_)
# 獲取最佳模型
print('最佳模型:\n',enstimators.best_estimator_)

3.優點和缺點

  • 優點:
    • 高精度: 通常在分類和回歸任務中表現出色,預測準確性高。
    • 魯棒性強: 對噪聲數據和異常值不太敏感。
    • 不易過擬合: 得益于Bagging和特征隨機性,即使樹很深,整體模型也較難過擬合(相比單棵樹)。
    • 處理高維特征: 能有效處理特征數量很多的數據集。
    • 提供特征重要性: 可以評估特征對預測的貢獻度。
    • 并行化訓練: 每棵樹的訓練是完全獨立的,可以輕松并行化,加速訓練過程。
    • 內置驗證: 袋外樣本 (OOB) 可以用于無偏估計模型的泛化誤差,無需額外驗證集。
    • 保留決策樹部分優點: 處理混合特征、非線性關系等。
  • 缺點:
    • 模型可解釋性降低: 雖然比“黑箱”模型(如神經網絡)稍好,但由成百上千棵樹組成的森林難以直觀解釋單個預測(犧牲了單棵樹的最大優勢)。
    • 訓練時間和內存消耗較大: 需要訓練多棵樹,尤其是在樹很深或樹的數量 T 很大時。預測速度雖然單次很快,但需要遍歷所有樹,比單棵樹慢 T 倍(但仍通常很快)。
    • 可能產生偏差較大的模型: 如果數據噪聲很大或特征與目標關系很弱,隨機森林可能會學到有偏差的模型(雖然方差低)。
    • 對某些類型的數據關系(如線性關系)可能不如專門模型高效: 雖然能處理,但可能不如線性模型簡單直接。
    • 超參數需要調整: 樹的數量 T、每次分裂考慮的特征數 m、樹的最大深度等超參數需要調整以獲得最佳性能(盡管通常比SVM等調參簡單,且 T 越大一般越好,但有計算成本)。

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

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

相關文章

RFID高頻讀寫器在工業生產線的使用優勢

在工業4.0浪潮下&#xff0c;智能制造對生產效率與精準度的要求日益提升。RFID技術憑借其獨特的技術優勢&#xff0c;成為工業場景中實現數據實時采集與流程優化的關鍵工具。本文主要從RFID高頻讀寫器出發&#xff0c;系統解析其在工業生產線中的使用優勢。RFID高頻讀寫器一、技…

大模型學習筆記

prompt 提示詞的構成&#xff1a; 指示&#xff1a;描述讓它做什么上下文&#xff1a;給出與任務相關的背景信息輸入&#xff1a; 任務的輸入信息輸出&#xff1a;輸出的格式 生成與檢索 生成&#xff1a; 優點&#xff1a;內容的多樣性、創造性缺點&#xff1a;存在不可控制 檢…

龍虎榜——20250806

上證指數繼續收陽線&#xff0c;創新高的概率較大&#xff0c;個股上漲多于下跌&#xff0c;但板塊輪動較明顯&#xff0c;高位板塊注意風險。深證指數較昨天放量收陽線&#xff0c;站上5日和10日均線繼續上線&#xff0c;大科技方向資金關注更多。2025年8月6日龍虎榜行業方向分…

數據可視化發展歷程

數據可視化是數據描述的圖形表示&#xff0c;是當今數據分析發展最快速、最引人注目的領域之一。借助于可視化工具的發展&#xff0c;或樸實&#xff0c;或優雅&#xff0c;或絢爛的可視化作品給我們講述著各種數據故事。在這個領域中&#xff0c;科學、技術和藝術完美地結合在…

深入理解C++中的stack、queue和priority_queue

目錄 前言 1. stack&#xff08;棧&#xff09; 1.1 基本概念 1.2 常用接口 1.3 應用示例&#xff1a;最小棧 1.4 模擬實現 2. queue&#xff08;隊列&#xff09; 2.1 基本概念 2.2 常用接口 2.3 模擬實現 3. priority_queue&#xff08;優先隊列&#xff09; 3.1…

C++ 操作 Redis 客戶端

引言 前面幾篇文章都在介紹 Redis 原生命令行客戶端&#xff0c;在實際應用開發中&#xff0c;開發人員更希望使用針對特定編程語言的專用客戶端&#xff0c;通過編程的方式操作 Redis 數據庫。因此&#xff0c;Redis 支持多種編程語言。本文將介紹 如何使用 C 語言來操作 Red…

批量提問程序開發方案:基于Python的百度文小言接口實現

批量提問程序開發方案&#xff1a;基于Python的百度文小言接口實現 1. 項目概述 1.1 項目背景 在現代信息檢索和自動化辦公場景中&#xff0c;批量提問功能已成為提高工作效率的重要工具。本項目旨在開發一個基于Python的批量提問程序&#xff0c;專門針對百度文小言平臺&am…

Apollo中三種相機外參的可視化分析

Apollo中三種相機外參的可視化分析一、什么是相機外參&#xff1f;為什么需要可視化&#xff1f;二、不同外參來源對比三、詳細操作步驟1. 環境準備2. 獲取 NuScenes外參數據3. 外參到空間位置的轉換及可視化四、可視化對比1. NuScenes數據集外參2. Apollo BEV模型外參3. Apoll…

虛擬化KVM常用命令匯總

KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一種開源的硬件虛擬化解決方案&#xff0c;它是 Linux 內核的一部分&#xff0c;允許在支持虛擬化技術的硬件&#xff08;如 Intel VT-x 或 AMD-V&#xff09;上運行虛擬機。KVM 將 Linux 內核轉變為一個裸機虛擬機監…

6s081環境配置以及使用vscode連接本地wsl2

6s081環境配置以及使用vscode連接wsl2 本人環境&#xff1a;windows11、wsl2ubuntu20.04 課程&#xff1a;6s081的2020版本的:https://pdos.csail.mit.edu/6.S081/2020/schedule.html 一、wsl2ubuntu20.04配置6s081環境 注&#xff1a;關于如何在window中安裝wsl&#xff0c;這…

C++實現線程池(3)緩存線程池

三. CachedThreadPool 的實現3.1 需求:動態調整線程數量&#xff1a;與 FixedThreadPool 不同&#xff0c;CachedThreadPool 的線程數量是動態調整的。當有新任務提交時&#xff0c;如果線程池中有空閑的線程&#xff0c;則會立即使用空閑線程執行任務&#xff1b;如果線程池中…

WMS+自動化立庫:無人倉的現在進行時

傳統倉庫正面臨嚴峻挑戰&#xff1a;效率瓶頸日益凸顯&#xff0c;人力成本持續攀升&#xff0c;空間利用率逼近極限&#xff0c;而訂單響應速度卻難以滿足市場需求。如何破局&#xff1f;WMS&#xff08;倉庫管理系統&#xff09;與自動化立體庫&#xff08;AS/RS&#xff09;…

多模態大模型研究每日簡報【2025-08-05】

訓練數據相關 EditGarment: An Instruction-Based Garment Editing Dataset Constructed with Automated MLLM Synthesis and Semantic-Aware Evaluation (https://arxiv.org/abs/2508.03497)&#xff1a;提出了一種自動化的流程&#xff0c;用于構建服裝編輯數據集EditGarmen…

4、docker數據卷管理命令 | docker volume

1、命令總覽命令作用出現頻率備注★ docker volume create新建卷高-d 指定驅動&#xff0c;-o 指定驅動選項★ docker volume ls列出卷高--filter danglingtrue 查孤兒卷★ docker volume inspect查看卷詳情高輸出 JSON&#xff0c;可加 --format★ docker volume rm刪除卷高只…

計數組合學7.14(對偶 RSK 算法)

7.14 對偶 RSK 算法 存在 RSK 算法的一種變體&#xff0c;其與乘積 ∏i,j(1xiyj)\prod_{i,j}(1 x_{i}y_{j})∏i,j?(1xi?yj?) 的關系類似于 RSK 算法本身與 ∏i,j(1?xiyj)?1\prod_{i,j}(1 - x_{i}y_{j})^{-1}∏i,j?(1?xi?yj?)?1 的關系。我們稱此變體為對偶 RSK 算法…

C語言中的進程、線程與進程間通信詳解

目錄 引言 基本概念 1. 進程&#xff08;Process&#xff09; 2. 線程&#xff08;Thread&#xff09; 線程編程實戰 1. 常見線程庫 2. 合理設置線程數 3. pthread 創建線程 線程同步機制 1. 互斥鎖 pthread_mutex_t 2. 條件變量 pthread_cond_t 3. 讀寫鎖 pthread…

[假面騎士] 555淺談

假面騎士555(faiz)是我最先接觸的一部平成系列的假面騎士&#xff0c;同時也是我個人最喜歡的一部假面騎士。一、大綱簡介震驚&#xff0c;人類最新的進化形態——奧菲一諾&#xff0c;橫空出世&#xff01;日本的頂級財團&#xff0c;Smart Brain&#xff0c;的前任社長&#…

Vue Router 路由的創建和基本使用(超詳細)

一、路由的基本概念 你是否好奇單頁應用&#xff08;SPA&#xff09;是如何在不刷新頁面的情況下實現頁面切換的&#xff1f;這就離不開路由的功勞。 路由&#xff1a;本質是一組 key-value 的對應關系&#xff0c;在前端領域中&#xff0c;key 通常是路徑&#xff0c;value …

深入理解設計模式:策略模式的藝術與實踐

在軟件開發中&#xff0c;我們經常會遇到需要根據不同情況選擇不同算法或行為的場景。傳統的做法可能是使用大量的條件語句&#xff08;if-else或switch-case&#xff09;&#xff0c;但隨著需求的增加和變化&#xff0c;這種硬編碼的方式會導致代碼難以維護和擴展。策略模式&a…

概率/期望 DP llya and Escalator

題目鏈接&#xff1a;Problem - D - Codeforces 看了這篇文章來的&#xff1a;【算法學習筆記】概率與期望DP - RioTian - 博客園 這篇博客寫得挺好的&#xff0c;講了一些常見方法&#xff0c;概率 / 期望的題多練練就上手了。 題目大意&#xff1a; n 個人排隊上電梯&…