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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;主要表现为数据处理平台与核心业务流程的架构隔离、分析成果与决策闭环的价值断层、以及双重数据维护带来的资源损耗。这种系统…