機器學習回顧——決策樹詳解

決策樹基礎概念與應用詳解

1. 決策樹基礎概念

1.1 什么是決策樹

決策樹是一種樹形結構的預測模型,其核心思想是通過一系列規則對數據進行遞歸劃分。它模擬人類決策過程,廣泛應用于分類和回歸任務。具體結構包括:

  • 內部節點:表示對某個特征的條件判斷,例如"年齡>30歲?"或"收入<5萬?"
  • 分支:代表判斷結果的可能取值,如"是/否"或離散特征的各個類別
  • 葉節點:包含最終的預測結果。在分類任務中可能輸出"批準貸款"或"拒絕貸款";在回歸任務中可能輸出具體數值如"房價=45.6萬"

1.2 決策樹的主要組成部分

  1. 根節點:位于樹的最頂端,包含完整的訓練數據集。例如在客戶信用評估中,根節點可能包含所有申請人的特征數據
  2. 決策節點:進行條件判斷的內部節點,通常會選擇最具區分度的特征進行判斷。如選擇"信用評分"而非"性別"作為關鍵判斷標準
  3. 葉節點:終止節點,存儲最終決策結果。在醫療診斷中,可能輸出"良性"或"惡性"的診斷結論
  4. 分支:連接節點的路徑,表示決策條件的具體取值。例如"體溫>38.5℃"的分支可能導向"疑似感染"的子節點

1.3 決策樹的工作流程

決策樹的構建遵循以下詳細步驟:

  1. 特征選擇:在當前節點計算所有特征的分裂質量(使用信息增益、基尼指數等指標),選擇最優特征
  2. 數據分割:根據選定特征的取值將數據集劃分為若干子集。例如將"收入"特征按閾值50k劃分為高/低收入兩組
  3. 遞歸構建:對每個子節點重復步驟1-2,直到滿足以下任一停止條件:
    • 節點樣本數小于預設閾值(如min_samples_leaf=5)
    • 所有樣本屬于同一類別(純度達到100%)
    • 樹達到最大深度限制(如max_depth=10)
    • 繼續分裂不能顯著改善模型性能
  4. 剪枝處理:為防止過擬合,可能進行預剪枝或后剪枝操作

2. 決策樹構建算法

2.1 ID3算法

核心思想:通過最大化信息增益來選擇特征分裂點,傾向于選擇能夠最有效降低不確定性的特征。

信息熵計算: H(S) = -∑ p_i log? p_i 其中p_i是第i類樣本在集合S中的比例。例如對于一個二分類問題(正例60%,負例40%): H(S) = -0.6log?0.6 - 0.4log?0.4 ≈ 0.971

信息增益計算: Gain(S, A) = H(S) - ∑ (|S_v|/|S|) * H(S_v) 其中S_v是特征A取值為v的子集。例如,對于包含100個樣本的節點,按特征A分為兩個子集(60個和40個),分別計算其熵值后加權平均。

實際應用中的局限性

  1. 偏向于選擇取值較多的特征(如"用戶ID"這種唯一標識符)
  2. 無法直接處理連續型特征,需要預先離散化
  3. 對缺失值敏感,缺乏有效的處理機制
  4. 沒有剪枝步驟,容易生成過深的樹導致過擬合

2.2 C4.5算法

核心改進

  1. 信息增益率:解決ID3對多值特征的偏好問題 GainRatio(S, A) = Gain(S, A) / SplitInfo(S, A) 其中SplitInfo(S, A) = -∑ (|S_v|/|S|) * log?(|S_v|/|S|) 這相當于對信息增益進行標準化處理

  2. 連續特征處理:采用二分法自動離散化連續特征

    • 對特征值排序后,取相鄰值的中點作為候選分割點
    • 選擇信息增益率最大的分割點
  3. 缺失值處理

    • 在計算信息增益時,僅使用特征A不缺失的樣本
    • 預測時,如果遇到缺失值,可以按照分支樣本比例分配
  4. 剪枝策略

    • 采用悲觀剪枝(PEP)方法
    • 基于統計顯著性檢驗決定是否剪枝

2.3 CART算法

算法特點

  1. 二叉樹結構:每個節點只產生兩個分支,簡化決策過程

    • 對于離散特征:生成"是否屬于某類別"的判斷
    • 對于連續特征:生成"是否≤閾值"的判斷
  2. 基尼指數(用于分類): Gini(S) = 1 - ∑ p_i2 基尼指數表示從數據集中隨機抽取兩個樣本,其類別不一致的概率。值越小表示純度越高。

  3. 回歸樹實現

    • 分裂標準:最小化平方誤差 MSE = 1/n ∑ (y_i - ?)2
    • 葉節點輸出:該節點所有樣本的目標變量均值
    • 特征選擇:選擇使MSE降低最多的特征和分割點

3. 決策樹的關鍵技術

3.1 特征選擇標準

分類任務

  1. 信息增益(ID3):

    • 優點:理論基礎強,符合信息論原理
    • 缺點:對多值特征有偏好
  2. 信息增益率(C4.5):

    • 優點:解決了多值特征偏好問題
    • 缺點:可能過度補償,傾向于選擇分裂信息小的特征
  3. 基尼指數(CART):

    • 優點:計算簡單,不涉及對數運算
    • 缺點:沒有信息增益的理論基礎

回歸任務

  1. 方差減少:選擇使子節點目標變量方差和最小的分裂
  2. 最小二乘偏差:直接優化預測誤差的平方和

3.2 剪枝技術

預剪枝(提前停止樹的生長):

  1. 最大深度限制(max_depth):控制樹的層數
  2. 最小樣本分裂數(min_samples_split):節點樣本數少于該值則不再分裂
  3. 最小葉節點樣本數(min_samples_leaf):確保葉節點有足夠樣本支撐
  4. 最大特征數(max_features):限制每次分裂考慮的特征數量

后剪枝(先構建完整樹再修剪):

  1. 代價復雜度剪枝(CCP):

    • 計算各節點的α值:α = (R(t)-R(T_t))/(|T_t|-1)
    • 剪去使整體代價函數Cα(T)=R(T)+α|T|最小的子樹
    • 通過交叉驗證選擇最優α
  2. 悲觀錯誤剪枝(PEP):

    • 基于統計檢驗,認為訓練誤差是樂觀估計
    • 使用二項分布計算誤差上限,決定是否剪枝

3.3 連續值和缺失值處理

連續值處理流程

  1. 對特征值排序(如年齡:22,25,28,30,36,...)
  2. 取相鄰值中點作為候選分割點(如(22+25)/2=23.5)
  3. 計算每個候選點的分裂質量指標
  4. 選擇最佳分割點構建決策節點

缺失值處理策略

  1. 替代法

    • 分類:用眾數填充
    • 回歸:用均值填充
    • 優點:實現簡單
    • 缺點:可能引入偏差
  2. 概率分配

    • 根據特征值分布概率將樣本分配到各分支
    • 保持樣本權重不變
    • 更合理但實現復雜
  3. 特殊分支

    • 為缺失值創建專用分支路徑
    • 需要足夠多的缺失樣本支持

4. 決策樹的優缺點

4.1 優勢分析

  1. 模型可解釋性

    • 決策路徑可以直觀展示,適合需要解釋預測結果的場景
    • 例如在信貸審批中,可以明確告知客戶"因收入不足被拒"
  2. 數據處理優勢

    • 不需要特征縮放(如標準化)
    • 能同時處理數值型(年齡、收入)和類別型(性別、職業)特征
    • 自動進行特征選擇(忽略無關特征)
  3. 計算效率

    • 預測時間復雜度為O(樹深度),通常非常高效
    • 適合實時預測場景,如欺詐檢測
  4. 多功能性

    • 可處理多輸出問題(同時預測多個目標變量)
    • 適用于分類和回歸任務
  5. 可視化能力

    • 可通過圖形展示決策流程
    • 便于向非技術人員解釋模型邏輯

4.2 局限性

  1. 過擬合風險

    • 可能生成過于復雜的樹,捕捉數據中的噪聲
    • 需要通過剪枝、設置最小葉節點樣本數等約束控制
  2. 模型不穩定性

    • 訓練數據的微小變化可能導致完全不同的樹結構
    • 可通過集成方法(如隨機森林)緩解
  3. 局部最優問題

    • 貪心算法無法保證全局最優
    • 可能錯過更好的特征組合分裂方式
  4. 連續變量處理

    • 需要將連續特征離散化
    • 可能丟失連續特征的精細信息
  5. 忽略特征相關性

    • 獨立考慮每個特征的分裂效果
    • 無法捕捉特征間的交互作用

5. 決策樹的實際應用

5.1 分類任務實現(乳腺癌診斷)

from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import matplotlib.pyplot as plt# 加載威斯康星乳腺癌數據集
data = load_breast_cancer()
X = data.data  # 包含30個特征(半徑、紋理等)
y = data.target  # 0=惡性,1=良性
feature_names = data.feature_names# 劃分訓練測試集(70%訓練,30%測試)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)# 設置參數網格進行調優
param_grid = {'criterion': ['gini', 'entropy'],'max_depth': [3, 5, 7, None],'min_samples_split': [2, 5, 10],'min_samples_leaf': [1, 2, 5]
}# 創建決策樹分類器
clf = DecisionTreeClassifier(random_state=42)# 使用網格搜索尋找最優參數
grid_search = GridSearchCV(clf, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)# 最佳參數模型
best_clf = grid_search.best_estimator_
print(f"最佳參數:{grid_search.best_params_}")# 在測試集上評估
y_pred = best_clf.predict(X_test)
print(f"測試集準確率:{accuracy_score(y_test, y_pred):.4f}")
print(classification_report(y_test, y_pred))# 可視化混淆矩陣
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6,6))
plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
plt.title("Confusion Matrix")
plt.colorbar()
plt.xticks([0,1], ["Malignant", "Benign"])
plt.yticks([0,1], ["Malignant", "Benign"])
plt.xlabel("Predicted")
plt.ylabel("Actual")
for i in range(2):for j in range(2):plt.text(j, i, str(cm[i,j]), ha="center", va="center", color="white" if cm[i,j] > cm.max()/2 else "black")
plt.show()# 導出決策樹圖形(需要graphviz)
export_graphviz(best_clf, out_file="breast_cancer_tree.dot",feature_names=feature_names,class_names=data.target_names,filled=True, rounded=True)

5.2 回歸任務實現(房價預測)

from sklearn.datasets import fetch_california_housing
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
import numpy as np
import pandas as pd# 加載加州房價數據集
housing = fetch_california_housing()
X = housing.data  # 8個特征(經度、緯度、房齡等)
y = housing.target  # 房價中位數(單位:10萬美元)
feature_names = housing.feature_names# 轉換為DataFrame便于分析
df = pd.DataFrame(X, columns=feature_names)
df['MedHouseVal'] = y# 劃分訓練測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 設置參數分布進行隨機搜索
param_dist = {'criterion': ['mse', 'friedman_mse', 'mae'],'max_depth': np.arange(3, 15),'min_samples_split': np.arange(2, 20),'min_samples_leaf': np.arange(1, 15),'max_features': ['auto', 'sqrt', 'log2', None]
}# 創建決策樹回歸器
reg = DecisionTreeRegressor(random_state=42)# 隨機參數搜索
random_search = RandomizedSearchCV(reg, param_dist, n_iter=100, cv=5,scoring='neg_mean_squared_error',random_state=42)
random_search.fit(X_train, y_train)# 最佳參數模型
best_reg = random_search.best_estimator_
print(f"最佳參數:{random_search.best_params_}")# 在測試集上評估
y_pred = best_reg.predict(X_test)
print(f"測試集MSE:{mean_squared_error(y_test, y_pred):.4f}")
print(f"測試集MAE:{mean_absolute_error(y_test, y_pred):.4f}")
print(f"測試集R2:{r2_score(y_test, y_pred):.4f}")# 特征重要性分析
importance = pd.DataFrame({'feature': feature_names,'importance': best_reg.feature_importances_
}).sort_values('importance', ascending=False)# 繪制特征重要性
plt.figure(figsize=(10,6))
plt.barh(importance['feature'], importance['importance'])
plt.xlabel("Feature Importance")
plt.title("Decision Tree Feature Importance")
plt.gca().invert_yaxis()
plt.show()

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

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

相關文章

Linux開發必備:yum/vim/gcc/make全攻略

目錄 1.學習yum、apt?具&#xff0c;進?軟件安裝 1-1 什么是軟件包 1-2 yum/apt具體操作 2. 編輯器Vim 2-1 Linux編輯器-vim的引入 2-2 vim的基本概念 2-3 vim的基本操作 2-4 vim正常模式命令集 2-5 vim末?模式命令集 3. 編譯器gcc/g 3-1 背景知識 3-2 gcc編譯選…

【Linux系統】萬字解析,進程間的信號

前言&#xff1a; 上文我們講到了&#xff0c;進程間通信的命名管道與共享內存&#xff1a;【Linux系統】命名管道與共享內存-CSDN博客?????? 本文我們來講一講&#xff0c;進程的信號問題 點個關注&#xff01; 信號概念 信號是OS發送給進程的異步機制&#xff01;所謂異…

AI時代SEO關鍵詞實戰解析

內容概要 隨著人工智能技術深度融入搜索引擎的運行機制&#xff0c;傳統的SEO關鍵詞研究方法正經歷著根本性的變革。本文聚焦于AI時代背景下&#xff0c;如何利用智能化的策略精準定位目標用戶&#xff0c;實現搜索可見度的實質性躍升。我們將深入探討AI技術如何革新關鍵詞研究…

Spring Boot + Spring MVC 項目結構

下面一個既能返回 JSP 頁面&#xff0c;又能提供 JSON API 的 Spring Boot Spring MVC 項目結構&#xff0c;這樣你就能同時用到 Controller 和 RestController 的優勢。 &#x1f3d7; 項目結構 springboot-mvc-mixed/ ├── src/main/java/com/example/demo/ │ ├── …

通俗易懂的講解下Ceph的存儲原理

Ceph存儲原理解析 要理解 Ceph 的存儲原理&#xff0c;我們可以用一個 “分布式倉庫” 的比喻來拆解 —— 把 Ceph 想象成一個由多個 “倉庫管理員”&#xff08;硬件節點&#xff09;共同打理的大型倉庫&#xff0c;能高效存儲、管理海量貨物&#xff08;數據&#xff09;&…

軟件測試小結(1)

一、什么是測試&#xff1f;1.1 生活中常見的測試例如去商場買衣服&#xff1a;①、選擇一件符合審美的衣服 -> 外觀測試&#xff1b;②、穿上身上試試是否合身 -> 試穿測試&#xff1b;③、 看看衣服的材料是否純棉 -> 材料測試&#xff1b;④、 詢問衣服的價格 ->…

Python未來3-5年技術發展趨勢分析:從AI到Web的全方位演進

Python作為全球最流行的編程語言之一&#xff0c;在開發者社區中占據核心地位。其簡潔語法、豐富庫生態和跨領域適用性&#xff0c;使其在AI、Web開發、數據科學等領域持續領先。本文基于當前技術演進趨勢&#xff08;如2023-2024年的開源項目、社區討論和行業報告&#xff09;…

【ComfyUI】SDXL Turbo一步完成高速高效的圖像生成

今天演示的案例是一個基于 ComfyUI 與 Stable Diffusion XL Turbo 的圖生圖工作流。整體流程通過加載輕量化的 Turbo 版本模型&#xff0c;在文本編碼與調度器的配合下&#xff0c;以極快的推理速度完成從提示詞到高質量圖像的生成。 配合演示圖可以直觀感受到&#xff0c;簡潔…

基于 GPT-OSS 的在線編程課 AI 助教追問式對話 API 開發全記錄

本文記錄了如何在 3 天內使用 GPT-OSS 開源權重搭建一個 在線編程課 AI 助教追問式對話 API&#xff0c;從需求分析、數據準備到微調與部署全流程實戰。 1?? 需求與指標 回答準確率 ≥ 95%響應延遲 < 1 秒支持多學生并發提問 2?? 數據準備 收集課程問答對清理無效數據…

YOLO v11 目標檢測+關鍵點檢測 實戰記錄

流水賬記錄一下yolo目標檢測 1.搭建pytorch 不做解釋 看以往博客或網上搜都行 2.下載yolo源碼 &#xff1a; https://github.com/ultralytics/ultralytics 3.樣本標注工具&#xff1a;labelme 自己下載 4.準備數據集 4.1 新建一個放置數據集的路徑4.2 構建訓練集和測試集 運行以…

uniApp 混合開發全指南:原生與跨端的協同方案

uniApp 作為跨端框架&#xff0c;雖能覆蓋多數場景&#xff0c;但在需要調用原生能力&#xff08;如藍牙、傳感器&#xff09;、集成第三方原生 SDK&#xff08;如支付、地圖&#xff09; 或在現有原生 App 中嵌入 uniApp 頁面時&#xff0c;需采用「混合開發」模式。本文將系統…

【大模型】使用MLC-LLM轉換和部署Qwen2.5 0.5B模型

目錄 ■準備工作 下載模型 安裝依賴 安裝基礎依賴 安裝mlc-llm ■權重轉換 ■生成配置文件 ■模型編譯 GPU版本編譯 CPU版本編譯 ■啟動服務 啟動GPU服務 啟動CPU服務 ■服務測試 ■擴展 優化量化版本(可選,節省內存) INT4量化版本 調整窗口大小以節省內存…

云計算學習100天-第43天-cobbler

目錄 Cobbler 基本概念 命令 搭建cobbler 網絡架構 Cobbler 基本概念 Cobbler是一款快速的網絡系統部署工具&#xff0c;比PXE配置簡單 集中管理所需服務&#xff08;DHCP、DNS、TFTP、WEB&#xff09; 內部集成了一個鏡像版本倉庫 內部集成了一個ks應答文件倉庫 提供…

接口測試:如何定位BUG的產生原因

1小時postman接口測試從入門到精通教程我們從在日常功能測試過程中對UI的每一次操作說白了就是對一個或者多個接口的一次調用&#xff0c;接口的返回的內容(移動端一般為json)經過前端代碼的處理最終展示在頁面上。http接口是離我們最近的一層接口&#xff0c;web端和移動端所展…

GPIO的8種工作方式

GPIO的8種工作方式&#xff1a;一、4 種輸入模式1.1 Floating Input 浮空輸入1.2 Pull-up Input 上拉輸入1.3 Pull-down Input 下拉輸入1.4 Analog Input 模擬輸入二、4種輸出模式2.1 General Push-Pull Output 推挽輸出2.2 General Open-Drain Output 開漏輸出2.3…

LeetCode算法日記 - Day 29: 重排鏈表、合并 K 個升序鏈表

目錄 1. 重排鏈表 1.1 題目解析 1.2 解法 1.3 代碼實現 2. 合并 K 個升序鏈表 2.1 題目解析 2.2 解法 2.3 代碼實現 1. 重排鏈表 143. 重排鏈表 - 力扣&#xff08;LeetCode&#xff09; 給定一個單鏈表 L 的頭節點 head &#xff0c;單鏈表 L 表示為&#xff1a; L…

算法模板(Java版)_前綴和與差分

ZZHow(ZZHow1024) &#x1f4a1; 差分是前綴和的逆運算。 前綴和 &#x1f4a1; 前綴和作用&#xff1a;快速求出 [l, r] 區間的和。 一維前綴和 例題&#xff1a;AcWing 795. 前綴和 import java.util.Scanner;public class Main {public static void main(String[] args)…

openssl使用SM2進行數據加密和數據解密

一、準備工作 1. 安裝依賴 sudo apt-get update sudo apt-get install libssl-dev2. 確認 OpenSSL 版本 openssl version如果是 1.1.1 或 3.0&#xff0c;就支持 SM2/SM3/SM4。二、C 語言示例代碼 這個程序會&#xff1a; 生成 SM2 密鑰對使用公鑰加密一段明文使用私鑰解密恢復…

用滑動窗口與線性回歸將音頻信號轉換為“Token”序列:一種簡單的音頻特征編碼方法

在深度學習和語音處理領域&#xff0c;如何將原始音頻信號有效地表示為離散的“Token”序列&#xff0c;是語音識別、音頻生成等任務中的關鍵問題。常見的方法如Mel頻譜圖向量量化&#xff08;VQ&#xff09;、wav2vec等已經非常成熟&#xff0c;但這些模型通常依賴復雜的神經網…

Vue開發準備

vs code VSCode的下載地址https://code.visualstudio.com/Download Node.js node.js的下載地址 https://nodejs.org/zh-cn/download 注意&#xff1a;nodejs安裝路徑不要和vscode安裝到同一個文件夾&#xff0c;兩個應用分別裝到兩個不同的文件夾 npm config set cache &q…