30天打牢數模基礎-決策樹講解

?

案例代碼

一、代碼說明

本代碼針對員工離職預測問題,使用CART決策樹算法(基尼指數)實現分類,并包含特征重要性評估樹結構可視化。數據為模擬的10個員工樣本,特征包括工作年限、月薪、是否加班、團隊氛圍評分,目標是預測是否離職。代碼邏輯清晰,適合數模小白入門。

二、完整代碼

# 導入必要的庫
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder  # 用于 categorical 特征轉數值
from sklearn.model_selection import train_test_split  # 劃分訓練集/測試集
from sklearn.tree import DecisionTreeClassifier, plot_tree  # 決策樹模型及可視化
from sklearn.metrics import accuracy_score  # 計算準確率
import matplotlib.pyplot as plt  # 繪圖庫def prepare_data():"""生成并預處理模擬數據(修正后的數據:使“是否加班”與“是否離職”不完全相關)返回:特征矩陣X,目標向量y,特征名稱feature_names,類別名稱class_names"""# 1. 模擬員工離職數據(修正:調整2個樣本的離職狀態,使特征與目標不完全相關)data = pd.DataFrame({'工作年限(年)': [1, 3, 2, 5, 1, 4, 2, 3, 1, 5],'月薪(元)': [5000, 8000, 6000, 10000, 5500, 9000, 6500, 7000, 4500, 11000],'是否加班': ['是', '否', '是', '否', '是', '否', '否', '是', '是', '否'],'團隊氛圍評分(1-5)': [3, 4, 2, 5, 3, 4, 3, 2, 1, 5],'是否離職': ['是', '否', '是', '是', '是', '否', '否', '否', '是', '否']  # 修正:索引3(不加班)離職,索引7(加班)不離職})# 2. 處理 categorical 特征(將文字轉為數值,決策樹需要數值輸入)le_overtime = LabelEncoder()  # 處理“是否加班”data['是否加班'] = le_overtime.fit_transform(data['是否加班'])  # 否→0,是→1le_leave = LabelEncoder()  # 處理“是否離職”(目標變量)data['是否離職'] = le_leave.fit_transform(data['是否離職'])  # 否→0,是→1# 3. 劃分特征(X)和目標(y)feature_names = ['工作年限(年)', '月薪(元)', '是否加班', '團隊氛圍評分(1-5)']X = data[feature_names]y = data['是否離職']# 4. 返回預處理后的數據return X, y, feature_names, le_leave.classes_  # classes_是類別名稱(['否', '是'])def train_and_evaluate(X, y, feature_names, max_depth=3):"""訓練決策樹模型并評估性能參數:X(特征)、y(目標)、feature_names(特征名稱)、max_depth(樹最大深度,防止過擬合)返回:訓練好的模型clf,測試集準確率accuracy"""# 1. 劃分訓練集(80%)和測試集(20%)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42  # random_state固定隨機種子,結果可重復)# 2. 初始化決策樹分類器(CART算法,使用基尼指數)clf = DecisionTreeClassifier(criterion='gini',  # 分裂準則:基尼指數(衡量混亂程度)max_depth=max_depth,  # 預剪枝:限制樹的最大深度,防止過擬合random_state=42)# 3. 訓練模型clf.fit(X_train, y_train)# 4. 用測試集預測并評估準確率y_pred = clf.predict(X_test)accuracy = accuracy_score(y_test, y_pred)# 5. 輸出結果print(f"測試集準確率:{accuracy:.2f}")  # 打印準確率(保留兩位小數)return clf, accuracydef plot_feature_importance(clf, feature_names):"""可視化特征重要性(決策樹認為哪些特征對預測最有用)參數:clf(訓練好的模型)、feature_names(特征名稱)"""# 1. 獲取特征重要性(數值越大,特征越重要)importances = clf.feature_importances_# 2. 繪制柱狀圖plt.figure(figsize=(10, 6))  # 設置圖的大小plt.bar(feature_names,  # x軸:特征名稱importances,    # y軸:重要性得分color='skyblue' # 柱子顏色)plt.xlabel('特征名稱', fontsize=12)  # x軸標簽plt.ylabel('重要性得分', fontsize=12)  # y軸標簽plt.title('員工離職預測特征重要性', fontsize=14)  # 圖標題plt.xticks(rotation=45)  # 旋轉x軸標簽,避免重疊plt.tight_layout()  # 自動調整布局,防止標簽截斷plt.show()  # 顯示圖def plot_tree_structure(clf, feature_names, class_names):"""可視化決策樹結構(直觀看到決策過程)參數:clf(訓練好的模型)、feature_names(特征名稱)、class_names(類別名稱,如['否', '是'])"""# 1. 設置圖的大小plt.figure(figsize=(20, 12))# 2. 繪制決策樹plot_tree(clf,                      # 訓練好的模型feature_names=feature_names,  # 特征名稱(顯示在節點上)class_names=class_names,      # 類別名稱(顯示在葉節點上,如['否', '是'])filled=True,               # 用顏色填充節點(顏色越深,節點越純)rounded=True,              # 節點邊框用圓角fontsize=10,               # 字體大小proportion=True            # 顯示樣本比例(如“3/5”表示該節點有3個正例,5個總樣本))# 3. 設置圖標題plt.title('員工離職預測決策樹結構', fontsize=14)# 4. 顯示圖plt.show()# 主程序(入口函數)
if __name__ == "__main__":# 1. 準備數據X, y, feature_names, class_names = prepare_data()print("數據預處理完成!")# 2. 訓練模型并評估print("\n=== 模型訓練與評估 ===")clf, accuracy = train_and_evaluate(X, y, feature_names, max_depth=3)# 3. 特征重要性分析print("\n=== 特征重要性評估 ===")plot_feature_importance(clf, feature_names)# 4. 決策樹結構可視化print("\n=== 決策樹結構可視化 ===")plot_tree_structure(clf, feature_names, class_names)

三、代碼使用說明

1.環境準備

需要安裝以下Python庫(用pip命令安裝):

pPip?install?pandas?numpy?scikit-learn?matplotlib

2.運行代碼

將代碼保存為employee_turnover_prediction.py,在終端或IDE中運行:

python?employee_turnover_prediction.py

3.輸出解釋

數據預處理完成:提示數據生成和轉換成功(將“是否加班”“是否離職”轉為0/1)。

模型訓練與評估:輸出測試集準確率(如測試集準確率:0.50或1.00,取決于測試集樣本分布)。

特征重要性評估:彈出柱狀圖,顯示每個特征對預測的影響(數值越大,特征越重要,修正后“是否加班”仍為關鍵特征,但需結合其他特征判斷)。

決策樹結構可視化:彈出決策樹圖,解讀方式如下:

根節點:第一個決策(如“是否加班≤0.5”,即“否”),分裂后左邊是“否”的樣本(部分離職),右邊是“是”的樣本(部分離職)。

內部節點:中間決策(如“團隊氛圍評分(1-5)≤2.5”),分裂后左邊是評分≤2的樣本(高離職率),右邊是評分≥3的樣本(低離職率)。

葉節點:最終結論(如“否”表示不離職,“是”表示離職),節點中的數字表示樣本比例(如“1/3”表示該節點有1個正例,3個總樣本)。

4.調參建議

max_depth:樹的最大深度(默認3),如果過擬合(訓練準確率100%,測試準確率低),可以減小max_depth;如果欠擬合(準確率低),可以增大max_depth。

criterion:分裂準則(默認gini),可以嘗試entropy(信息增益),兩者結果通常一致。

四、關鍵結論(修正后)

特征重要性:“是否加班”仍是預測離職的最關鍵特征,但“團隊氛圍評分”和“月薪”也能輔助區分(如加班但團隊氛圍好的員工可能不離職)。

決策邏輯(以修正后的數據為例):

首先判斷“是否加班”:不加班的員工中,部分因其他原因離職(如索引3的高月薪員工)。

對于加班的員工,再判斷“團隊氛圍評分”:評分≤2的員工離職率高(如索引2、8的低評分員工),評分≥3的員工需進一步判斷。

對于加班且團隊氛圍評分≥3的員工,最后判斷“月薪”:月薪≤5750元的員工離職(如索引0、4的低薪員工),月薪>5750元的員工可能不離職(如索引7的高薪員工)。

通過本代碼,你可以快速掌握決策樹的實現流程,并直觀看到決策樹如何“思考”問題,非常適合數模比賽中的分類問題!

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

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

相關文章

React與jQuery全棧實戰指南

以下是為React工程師優化的jQuery全棧指南,結合Thymeleaf項目需求與React思維模式,整合核心概念、避坑策略及實戰技巧。內容依據官方文檔與多篇技術文章優化補充,保留原有框架并深化關鍵細節: ?一、jQuery核心設計哲學 vs React?…

Redis分布式鎖的學習(八)

一、分布式鎖 1.1、分布式鎖是什么? 是一種在分布式系統中協調多個進程/服務對共享資源進行互斥訪問的機制;確保在任意時刻,只有一個客戶端可以訪問資源。 1.2、為什么需要分布式鎖? 解決多個服務/進程對同共享資源競爭&…

spring的常用注解匯總

在 Spring 和 Spring Boot 框架中,有許多核心注解被廣泛應用。以下是常用的關鍵注解分類詳解:一、組件聲明與依賴注入注解作用示例Component通用組件聲明 (Bean 的泛化形式)Component public class ServiceImpl {...}Service標記服務層(業務邏…

Claude4、GPT4、Kimi K2、Gemini2.5、DeepSeek R1、Code Llama等2025主流AI編程大模型多維度對比分析報告

2025主流AI編程大模型多維度對比分析報告引言:AI編程大模型的技術格局與選型挑戰一、核心模型概覽:技術定位與市場份額1.國際第一梯隊(1)Claude 4系列(Anthropic)(2)GPT-4.1&#xf…

Overleaf中下載.aux和.bbl文件

有些會議提交終稿的時候,可能會讓上傳.bbl和.aux文件,但是使用Overleaf下載下來的壓縮包中缺沒有這些文件在網上搜了一下都是用的舊版的Overleaf的教程,或者教程比較繁瑣,其實新版的Overleaf也可以直接下載 打開你的論文編譯好&am…

uniapp寫app做測試手機通知欄展示內容

uniapp寫app做測試手機通知欄展示內容 以下代碼:只是個簡單測試能不能給手機發送消息,能不能引導打開通知權限,能不能進行跳轉的功能, 增加 notify.js 以下文件 // 模擬本地通知功能 export function showNotification() {// 1. 檢查通知…

分布式云計算:未來計算架構的全新演進

隨著信息技術的不斷發展,尤其是云計算技術的飛速進步,企業和個人對計算資源的需求已經從傳統的單一數據中心向更為靈活、可擴展的分布式架構轉變。分布式云計算作為一種新興的云計算模型,旨在將計算資源和數據存儲分布在多個地理位置上,從而提供更加高效、安全和可靠的服務…

2025年海外短劇獨立站開發:H5+PC端雙平臺技術實踐與增長策略

引言在全球化內容消費浪潮下,海外短劇市場正經歷爆發式增長。據DataEye《2025H1海外微短劇行業數據報告》顯示,2025年海外短劇市場規模預計突破45億美元,其中東南亞、拉美等新興市場貢獻超30%增量。本文將以某頭部短劇平臺的雙平臺開發實踐為…

OpenAI發布ChatGPT Agent,AI智能體迎來關鍵變革

注:此文章內容均節選自充電了么創始人,CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》(跟我一起學人工智能)【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

企業級安全威脅檢測與響應(EDR/XDR)架構設計

在這個網絡威脅如洪水猛獸的時代,企業的安全防護不能再像守城門的老大爺一樣只會喊"什么人?口令!"了。我們需要的是一套像FBI一樣具備全方位偵察能力的智能防護系統。 📋 文章目錄 1. 什么是EDR/XDR?別被這…

Stream流-Java

Stream流的作用&#xff1a;結合了Lambda表達式&#xff0c;簡化集合&#xff0c;數組的操作Stream流的使用步驟&#xff1a;1. 先得到一條Stream流&#xff08;流水線&#xff09;&#xff0c;并把數據放上去獲取方式方法名說明單列集合default Stream<E> stream()Colle…

Leetcode 327. 區間和的個數

1.題目基本信息 1.1.題目描述 給你一個整數數組 nums 以及兩個整數 lower 和 upper 。求數組中&#xff0c;值位于范圍 [lower, upper] &#xff08;包含 lower 和 upper&#xff09;之內的 區間和的個數 。 區間和 S(i, j) 表示在 nums 中&#xff0c;位置從 i 到 j 的元素…

MinIO 版本管理實踐指南(附完整 Go 示例)

? 前言 在構建企業級對象存儲系統時,“對象的版本管理”是一個關鍵特性。MinIO 作為一款高性能、Kubernetes 原生的 S3 兼容對象存儲系統,也支持強大的版本控制功能。 本文將通過 Go 示例代碼 + 實操講解 的形式,手把手帶你掌握 MinIO 的版本控制能力,包括開啟版本控制、…

數組toString方法及類型檢測修復方案

在 JavaScript 中&#xff0c;數組的 toString() 方法被覆蓋&#xff08;重寫&#xff09;為返回數組元素的逗號分隔字符串&#xff0c;而不是原始的 [object Array] 類型標識。以下是詳細解釋和修復方案&#xff1a;問題原因Array.prototype.toString 被覆蓋數組繼承自 Object…

mysql索引底層B+樹

B樹勝出的關鍵特性&#xff1a;矮胖樹結構&#xff1a;3-4層高度即可存儲2000萬條記錄&#xff08;假設每頁存1000條&#xff09; 葉子鏈表&#xff1a;所有數據存儲在葉子節點&#xff0c;并通過雙向鏈表連接 非葉導航&#xff1a;非葉子節點僅存儲鍵值&#xff0c;不保存數據…

AI開放課堂:釘釘MCP開發實戰

我們正處在AI技術爆發的時代&#xff0c;也處于企業數字化蓬勃發展的時代。如何利用AI技術&#xff0c;突破模型自身知識的局限&#xff0c;安全、高效地與外部世界連接和交互&#xff0c;是當前所有AI開發者在企業數字化中面臨的問題之一。 MCP&#xff08;Model Context Prot…

DigitalOcean 一鍵模型部署,新增支持百度開源大模型ERNIE 4.5 21B

使用過DigitalOcean GPU Droplet 服務器的用戶應該對我們的一鍵模型部署功能不陌生。DigitalOcean 的一鍵模型部署 (1-Click Models) 功能是 DO 為開發者和企業提供的一種便捷方式&#xff0c;用于快速部署和運行預訓練的生成式 AI 模型&#xff0c;尤其是大型語言模型 (LLM)。…

【嵌入式面試】嵌入式筆試與面試寶典(offer必來)

&#x1f48c; 所屬專欄&#xff1a;【嵌入式面試】 &#x1f600; 作??者&#xff1a;蘭舟比特 &#x1f43e; &#x1f680; 個人簡介&#xff1a;熱愛開源系統與嵌入式技術&#xff0c;專注 Linux、網絡通信、編程技巧、面試總結與軟件工具分享&#xff0c;持續輸出實用干…

企業級數據分析創新實戰:基于表格交互與智能分析的雙引擎架構

引言&#xff1a;數字化轉型中數據協同困境與系統融合挑戰 在數字化轉型實踐中&#xff0c;企業普遍面臨數據系統與業務運營的協同困境&#xff0c;主要表現為數據處理平臺與核心業務流程的架構隔離、分析成果與決策閉環的價值斷層、以及雙重數據維護帶來的資源損耗。這種系統…