決策樹(Decision Tree)完整解析:原理 + 數學推導 + 剪枝 + 實戰

1?? 什么是決策樹?

決策樹(Decision Tree)是一種常見的監督學習方法,可用于分類回歸
其基本思想是:

通過特征條件的逐層劃分,將數據集分割成越來越“純凈”的子集,直到子集中的樣本幾乎屬于同一類別。

最終輸出是一個樹形結構,每個葉節點對應一個類別或預測值。

2?? 決策樹的構建思想

  1. 從根節點開始,選擇一個最佳特征來劃分數據集

  2. 對劃分后的子集遞歸構建子樹

  3. 當滿足停止條件時(子集純凈、特征用盡或達到深度限制)終止

3?? 特征選擇指標

決策樹核心在于:如何選擇最優的劃分特征?

(1) 信息增益(ID3算法)

熵(Entropy)定義:

H(D) = - \sum_{k=1}^K p_k \log_2 p_k?

其中 p_k? 是類別 k 在數據集 D 中的概率。?

信息增益定義:?

\text{Gain}(D, A) = H(D) - \sum_{v \in \text{Values}(A)} \frac{|D_v|}{|D|} H(D_v)?

  • A:特征

  • D_v:在特征A=v下的數據子集

優點:選擇信息增益最大的特征,降低數據的不確定性。

(2) 信息增益率(C4.5算法)

信息增益率定義:

\text{GainRatio}(D, A) = \frac{\text{Gain}(D, A)}{H_A(D)}?

其中?

H_A(D) = - \sum_{v \in \text{Values}(A)} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}?

(3) 基尼指數(CART算法)

基尼指數定義:

\text{Gini}(D) = 1 - \sum_{k=1}^K p_k^2?

某特征 A 的基尼指數:?

\text{GiniIndex}(D, A) = \sum_{v \in \text{Values}(A)} \frac{|D_v|}{|D|} \text{Gini}(D_v)?

4?? 決策樹生成與剪枝

4.1 生成過程

  • 遞歸劃分數據集

  • 根據指標(信息增益/基尼指數)選擇最優特征

  • 當樣本數量小于閾值或特征用盡,生成葉節點

4.2 剪枝(Pruning)

防止過擬合,主要有兩類:

  • 預剪枝(Pre-Pruning)
    在生成樹時提前終止劃分,例如:

    • 最大深度限制

    • 節點最小樣本數限制

    • 信息增益小于閾值

  • 后剪枝(Post-Pruning)
    完整生成樹后,再自底向上刪除不必要的分支。

5?? 決策樹的完整數學表達

分類決策函數為:

f(x) = \arg \max_{k} p(y = k \mid x)?

回歸任務可輸出均值:?

f(x) = \frac{1}{|D_{\text{leaf}}|} \sum_{x_i \in D_{\text{leaf}}} y_i?

6?? Python實現(Sklearn)?

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_text# 加載數據
X, y = load_iris(return_X_y=True)# 構建決策樹
clf = DecisionTreeClassifier(criterion="gini", max_depth=3, random_state=0)
clf.fit(X, y)# 輸出結構
print(export_text(clf, feature_names=["sepal_length","sepal_width","petal_length","petal_width"]))

如果需要可視化:?

from sklearn import tree
import matplotlib.pyplot as pltplt.figure(figsize=(12,8))
tree.plot_tree(clf, filled=True, feature_names=["sepal_length","sepal_width","petal_length","petal_width"])
plt.show()

7?? 優缺點總結

? 優點

  • 可解釋性強,輸出清晰的規則

  • 不需要大量特征工程(無需歸一化)

  • 能同時處理數值型和離散型特征

? 缺點

  • 容易過擬合,需要剪枝

  • 對數據微小波動敏感

  • 貪心選擇特征,可能不是全局最優

8?? 應用場景

  • 風控評分卡(可解釋性需求高)

  • 醫學診斷、臨床輔助

  • 客戶細分、市場營銷

  • 與集成學習(RandomForest、XGBoost)結合

📚 總結

  • ID3 用信息增益,C4.5 用信息增益率,CART 用基尼指數

  • 剪枝是防止過擬合的關鍵步驟

  • 決策樹是集成學習方法的核心基學習器

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

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

相關文章

C語言:20250728學習(指針)

回顧/*************************************************************************> File Name: demo01.c> Author: 阮> Description: > Created Time: 2025年07月28日 星期一 09時07分52秒**********************************************************…

esp32s3文心一言/豆包(即火山引擎)大模型實現智能語音對話--流式語音識別

一、引言 在之前的帖子《Esp32S3通過文心一言大模型實現智能語音對話》中,我們介紹了如何使用Esp32S3微控制器與文心一言大模型實現基本的智能語音對話功能,但受限于語音識別技術,只能處理2-3秒的音頻數據。為了提升用戶體驗,滿足…

面試150 最長遞增子序列

思路 定義 dp[i] 表示以第 i 個元素結尾的最長遞增子序列的長度&#xff0c;初始時每個位置的最長子序列長度為 1。然后通過雙重循環遍歷每一對元素 j < i&#xff0c;如果 nums[i] > nums[j]&#xff0c;說明 nums[i] 可以接在 nums[j] 的遞增序列之后&#xff0c;更新 …

TCP 套接字--服務器相關

1.創建 TCP 套接字int server_sockfd socket(AF_INET,SOCK_STREAM, 0);函數原型&#xff1a;#include <sys/socket.h>int socket(int domain, int type, int protocol);domain協議族&#xff08;地址族&#xff09;AF_INET&#xff08;IPv4&#xff09;type套接字類型SO…

六、搭建springCloudAlibaba2021.1版本分布式微服務-admin監控中心

前言Spring Boot Actuator 是 spring-boot 自帶監控功能 &#xff0c;可以幫助實現對程序內部運行情況監控&#xff0c;比如監控狀況、Bean 加載情況、環境變量、日志信息、線程信息等。 Spring Boot Admin是一個針對 spring-boot 的 actuator 接口進行 UI 美化封裝的監控工具。…

輕量級遠程開發利器:Code Server與cpolar協同實現安全云端編碼

前言&#xff1a;作為一款專為Web環境設計的VS Code托管方案&#xff0c;Code Server通過精簡架構重新定義了遠程開發體驗。其核心優勢在于將完整的編輯器功能封裝于輕量容器中——僅需不到200MB內存即可運行基礎服務&#xff0c;并支持在樹莓派等低性能設備上流暢操作。系統采…

圖論:最小生成樹

今天要介紹兩中最小生成樹的算法&#xff0c;分別是prim算法和kruskal算法。 最小生成樹是所有節點的最小連通子圖&#xff0c;即&#xff1a;以最小的成本&#xff08;邊的權值&#xff09;將圖中所有節點鏈接到一起。 圖中有n個節點&#xff0c;那么一定可以用n-1條邊將所有節…

haproxy七層代理

1、負載均衡Load Balance(LB) 概念 負載均衡&#xff1a;是一種服務或基于硬件設備等實現的高可用反向代理技術&#xff0c;負載均衡將特定的業務(web服務、網絡流量等)分擔給指定的一個或多個后端特定的服務器或設備&#xff0c;從而提高了 公司業務的并發處理能力、保證了業務…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博文章數據可視化分析-點贊區間實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博文章數據可視化分析-點贊區間實現 視頻…

Redis實戰(3)-- 高級數據結構zset

有序集合&#xff08;ZSET&#xff09;&#xff1a;可以用作相關有序集合相對于哈希、列表、集合來說會有一點點陌生,但既然叫有序集合,那么它和集合必然有著聯系,它保留了集合不能有重復成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標作為排序依據…

Mistral AI開源 Magistral-Small-2507

宣布Magistral——Mistral AI推出的首款推理模型&#xff0c;專精于垂直領域、具備透明化特性與多語言推理能力。 最優秀的人類思維并非線性——它穿梭于邏輯、洞見、不確定性與發現之間。推理型語言模型讓我們得以將復雜思考和深度理解交由AI增強或代勞&#xff0c;提升了人類…

【Kotlin】如何實現靜態方法?(單例類、伴生對象、@JvmStatic)

靜態方法 靜態方法&#xff08;類方法&#xff09;&#xff1a;不需要創建實例就可以調用&#xff08;直接通過類名調用&#xff09;的方法 Java 中的靜態方法&#xff08;static&#xff09; public class Util {public static void doAction() {//...} }調用&#xff1a;Util…

SQL Schema 和Pandas Schema什么意思

在數據處理和分析領域&#xff0c;SQL Schema 和 Pandas Schema 分別指的是在不同數據處理環境中數據的結構定義&#xff0c;以下為你詳細介紹&#xff1a;SQL Schema含義SQL Schema&#xff08;模式&#xff09;是數據庫對象的一個邏輯容器&#xff0c;它定義了數據庫中表、視…

機器學習(一)KNN,K近鄰算法(K-Nearest Neighbors)

&#x1f4a1; 建議初學者掌握KNN作為理解其他復雜算法&#xff08;如SVM、決策樹、神經網絡&#xff09;的基石。K近鄰算法&#xff08;K-Nearest Neighbors, KNN&#xff09;詳解&#xff1a;原理、實踐與優化K近鄰算法&#xff08;K-Nearest NeighboKrs&#xff0c;簡稱KNN&…

Qt 多線程數據庫操作優化

在多線程應用中&#xff0c;數據庫操作往往是性能瓶頸與穩定性風險的高發區。當多個線程同時讀寫數據庫時&#xff0c;若處理不當&#xff0c;輕則出現查詢卡頓、事務沖突&#xff0c;重則導致數據錯亂、連接泄漏甚至程序崩潰。Qt作為跨平臺框架&#xff0c;提供了QSql系列類支…

Qt 狀態機框架:復雜交互邏輯的處理

Qt狀態機框架&#xff08;Qt State Machine Framework&#xff09;是一個強大的工具&#xff0c;用于簡化復雜的交互邏輯和狀態管理。它基于UML狀態圖概念&#xff0c;提供了聲明式的方式來定義對象行為&#xff0c;特別適合處理具有多種狀態和轉換的場景&#xff08;如GUI交互…

【docker】DM8達夢數據庫的docker-compose以及一些啟動踩坑

摘要&#xff1a;本文介紹了通過docker-compose配置啟動達夢數據庫(DM8)的方法。配置包括容器鏡像、端口映射、數據卷掛載以及關鍵環境變量設置&#xff08;如字符集、大小寫敏感等&#xff09;。也說明了啟動過程可能遇到的一些問題。通過docker-compose啟動達夢數據庫可以按照…

服務器中的防火墻設置需要打開嗎

服務器中的防火墻屬于是一種保護計算機網絡不會受到未經授權的網絡設備所訪問的技術手段&#xff0c;防火墻還有著將內部網絡和外部網絡進行隔離的功能&#xff0c;在網絡之間創建安全屏障&#xff0c;以此來保護網絡中數據的安全。防火墻是一種網絡安全系統&#xff0c;可以幫…

Java項目:基于SSM框架實現的社區團購管理系統【ssm+B/S架構+源碼+數據庫+畢業論文+答辯PPT+遠程部署】

摘 要 使用舊方法對社區團購信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在社區團購信息的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。 這次開發的社區團購系統有…

介紹一下static關鍵字

在Java中&#xff0c;被static修飾的成員稱為靜態成員&#xff0c;static關鍵字可以用來修飾方法或者成員變量&#xff0c;且被static修飾的方法或者成員變量屬于類方法或者類屬性&#xff0c;也就是說被static修飾的方法或者成員變量不是單獨存儲在某一個對象的空間&#xff0…