决策树模型

article/2025/10/4 12:44:26

本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》

决策树模型的建树依据主要用到的是基尼系数的概念。基尼系数(gini)用于计算一个系统中的失序现象,即系统的混乱程度。基尼系数越高,系统的混乱程度就越高,建立决策树模型的目的就是降低系统的混乱程度,根据基尼系数判断如何划分节点,从而得到合适的数据分类效果。采用基尼系数进行运算的决策树也称为CART决策树。
回归决策树模型的概念和分类决策树模型基本一致,最大的不同就是其划分标准不是基尼系数或信息熵,而是均方误差MSE。

案例实战:员工离职预测模型搭建

# 1.数据读取与预处理
import pandas as pd
df = pd.read_excel('员工离职预测模型.xlsx')
print(df.head())

运行结果:
在这里插入图片描述
原始数据中的“工资”数据被分为“高”“中”“低”3个等级,而Python数学建模中无法识别这种文本内容,所以“工资”列的内容需要进行数值化处理。这里用pandas库中的replace()函数将文本“高”“中”“低”分别替换为数字2、1、0。

df = df.replace({'工资': {'低': 0, '中': 1, '高': 2}})# 2.提取特征变量和目标变量
X = df.drop(columns='离职')
y = df['离职']# 3.划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

为了保证程序每次运行时都能采用相同的节点划分方式,以获得相同的决策树,就需要设置random_state参数。这里设置的数字123没有特殊含义,它只是一个随机数种子,也可以设置成其他数字。

# 4.模型训练及搭建
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth=3, random_state=123) 
model.fit(X_train, y_train)

至此,一个决策树模型便搭建完成了。这里把测试集中的数据导入模型中进行预测,通过打印y_pred[0:100]查看预测结果的前100项。

# **1.直接预测是否离职**
y_pred = model.predict(X_test)
print(y_pred[0:100])

运行结果:
在这里插入图片描述
接着将模型的预测值y_pred和测试集的实际值y_test进行汇总。其中y_pred是一个numpy.ndarray类型的一维数组结构,y_test为Series类型的一维序列结构,用list()函数将它们都转换为列表,并将它们集成到一个DataFrame中,代码如下。

a = pd.DataFrame() 
a['预测值'] = list(y_pred)
a['实际值'] = list(y_test)

运行结果:
在这里插入图片描述

#查看模型评分
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)model.score(X_test, y_test)

将score打印输出,结果为0.9573,也就是说,模型对整个测试集的预测准确度为0.9573,即在3000组测试集数据中有约2872组数据的预测结果和实际结果相符。

# **2.预测不离职&离职概率**
y_pred_proba = model.predict_proba(X_test)
print(y_pred_proba[0:5])
#获得的y_pred_proba是一个二维数组,数组左列为分类为0的概率,右列为分类为1的概率;也可以通过如下代码将其转换为DataFrame格式以方便查看。
b = pd.DataFrame(y_pred_proba, columns=['不离职概率', '离职概率']) 
print(b.head())
#提取离职概率
print(y_pred_proba[:,1])

运行结果:
在这里插入图片描述

# **3.模型预测效果评估**
from sklearn.metrics import roc_curve
fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:,1])a = pd.DataFrame()
a['阈值'] = list(thres)
a['假警报率'] = list(fpr)
a['命中率'] = list(tpr)
a.head()

运行结果:
在这里插入图片描述

#绘制ROC曲线
import matplotlib.pyplot as plt
plt.plot(fpr, tpr)
plt.show()#求出模型的AUC值
from sklearn.metrics import roc_auc_score
score = roc_auc_score(y_test, y_pred_proba[:,1])
print(score)

运行结果:
在这里插入图片描述
AUC=0.9736722483245008。
模型搭建完成后,有时还需要知道各个特征变量的重要程度,即哪些特征变量在模型中发挥的作用更大,这个重要程度称为特征重要性。在决策树模型中,一个特征变量对模型整体的基尼系数下降的贡献越大,它的特征重要性就越大。

# **4.特征重要性评估**
print(model.feature_importances_)features = X.columns
importances = model.feature_importances_importances_df = pd.DataFrame()
importances_df['特征名称'] = features
importances_df['特征重要性'] = importances
importances_df.sort_values('特征重要性', ascending=False) #设置ascending参数为False表示进行降序排序

运行结果:
在这里插入图片描述
可以看到,特征重要性最高的是“满意度”,这一点的确符合常理,因为员工对工作的满意度高,其离职的概率就相对较低,反之则较高。其次重要的是“考核得分”和“工龄”。
“工资”在该模型中的特征重要性为0,也就是说它没有发挥作用,这并不符合常理。之所以会有这个结果,在某种程度上是因为我们限制了决策树的最大深度为3层(max_depth=3),所以“工资”没有发挥作用的机会,如果增大决策树的最大深度,那么它可能会发挥作用。
另一个更重要的原因是本案例中的“工资”不是具体的数值,而是“高”“中”“低”3个档次,这种划分方式过于宽泛,使得该特征变量在决策树模型中发挥的作用较小,如果“工资”是具体的数值,如10000元,那么该特征变量应该会发挥更大的作用。

决策树可视化插件Graphviz的安装

首先下载Graphviz插件,下载地址为https://graphviz.gitlab.io/download/。以Windows版本为例,在如下图所示的网页中单击相应的链接,进入Windows版本的下载页面。
在这里插入图片描述
下载完成后运行exe文件。
在这里插入图片描述
记住文件的安装位置,本文直接装在D盘,路径为:D:\Graphviz。安装完成后在anaconda安装graphviz库。
在这里插入图片描述
安装完成后就可以使用了,注意代码中的路径修改,本文的环境为D:\Graphviz\bin。

# **决策树模型可视化呈现及决策树要点理解**
# 1.如果不用显示中文,那么通过如下代码即可:
# !pip3 install pygraphvizfrom sklearn.tree import export_graphviz
import graphviz
import os
#将Graphviz插件安装路径下的bin文件夹部署到环境变量中
os.environ['PATH'] = os.pathsep + r'D:\Graphviz\bin'#用export_graphviz()函数将之前搭建的决策树模型model转换为字符串格式并赋给变量dot_data
#其中需要设定out_file参数为None,转换后获得的内容才为字符串格式
dot_data = export_graphviz(model, out_file=None, class_names=['0', '1'])#将dot_data转换成可视化的格式
graph = graphviz.Source(dot_data)#导出成PDF文件
graph.render("result")
print('可视化文件result.pdf已经保存在代码所在文件夹!')

运行结果:
在这里插入图片描述
其中X[1]表示第2个特征变量“满意度”,X[2]表示第3个特征变量“考核得分”,X[3]表示第4个特征变量“工程数量”,X[4]表示第5个特征变量“月工时”,X[5]表示第6个特征变量“工龄”;gini表示该节点的基尼系数;samples表示该节点中的样本数,例如,根节点中的12000即训练集中的样本数;value表示样本中各类别的数量,例如,根节点的value后面的中括号中,左边的9120表示不离职员工的数量,右边的2880表示离职员工的数量;class表示分类类别,例如,class=0表示判定该节点为“不离职”节点。

dot_data = export_graphviz(model, out_file=None, feature_names=['income', 'satisfication', 'score', 'project_num', 'hours', 'year'], class_names=['0', '1'], filled=True)
graph = graphviz.Source(dot_data)
graph.render("result")
print('可视化文件result.pdf已经保存在代码所在文件夹!')

也可修改以上代码,把变量名添进图中,并添加颜色。运行结果:
在这里插入图片描述
因为Graphviz插件不直接支持中文,所以需要进行特殊处理,可以采用如下代码:

#2.如果想显示中文,需要使用如下代码
from sklearn.tree import export_graphviz
import os  
# 以下这行是手动进行环境变量配置,防止在本机环境的变量部署失败
os.environ['PATH'] = os.pathsep + r'D:\Graphviz\bin'dot_data = export_graphviz(model, out_file=None, feature_names=X_train.columns, class_names=['不离职', '离职'], rounded=True, filled=True)
# rounded与字体有关,filled设置颜色填充
f = open('dot_data.txt', 'w')
f.write(dot_data)
f.close()#修改字体设置,避免中文乱码
import re
f_old = open('dot_data.txt', 'r')
f_new = open('dot_data_new.txt', 'w', encoding='utf-8')
for line in f_old:if 'fontname' in line:font_re = 'fontname=(.*?)]'old_font = re.findall(font_re, line)[0]line = line.replace(old_font, 'SimHei')f_new.write(line)
f_old.close()
f_new.close()os.system('dot -Tpng dot_data_new.txt -o 决策树模型.png')
print('决策树模型.png已经保存在代码所在文件夹!')os.system('dot -Tpdf dot_data_new.txt -o 决策树模型.pdf')
print('决策树模型.pdf已经保存在代码所在文件夹!')

运行结果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/lp4yQgHD.shtml

相关文章

新版HyperMesh的Assemblies中调出下拉菜单查看Component(装配关系模型树)

新版HyperMesh的Assemblies中调出下拉菜单查看Component(装配关系模型树) 从Altair更新的2019版本开始,在Model模型树中找不到Assemblies了,这样导致好多用户一直在用14或者17版本,其实这次更新不是把这个功能取消掉了…

Cesium bim模型加载并与模型树关联(分层加载)

很久都没写文章了,最近实在是太忙了,向各位关注我的小伙伴致个歉! 最近没事儿写了个模型树和模型关联的功能,处理工具是用的cesiumlab。 说明一下为什么要用cesiumlab: 网上现在有很多的模型转换工具,如…

举例讲清楚模型树和回归树的区别

根据上面图中的一个例子,我们来分析下,假设A、B两点是曲线上的噪声点。 模型树的叶子节点是一个分段线性函数[1]。 回归树的叶子节点是取一个区间的平均(一个常数值)。 上述图中AB区间的均值是一个暗点。 所以: 对于节点A而言,模…

[Ansys Workbench] Mechanical 界面显示模型树窗口和详细信息窗口

根据这个回答才找到的……我之前也没注意,别人问我我才去想的 https://forum.ansys.com/discussion/8740/workbench-tree-outline 一般的方法是在 主页 - 布局 - 管理 里面选择显示哪个视窗 如果就是想显示模型树窗口和详细信息窗口,可以使用快捷键 Ctr…

creo文件如何检入服务器,CREO模型树配置的保存与检索

保存模型树配置 (1)单击 然后单击“保存设置文件”(Save Settings File)。“保存模型树配置”(Save Model Tree Configuration) 对话框打开。 (2)接受默认文件名 tree.cfg 或键入新名称。 (3)单击“保存”(Save)。 手动检索模型树配置 (1)单击 然后单击“打开设置文件”(Open S…

Graphviz绘制模型树2——XGBoost模型的可解释性

从二分类模型中的树重新理解XGBoost算法 一.对绘制的树简单解释1.1类别判断1.2树的最大层级1.3效果较差情况 二.从数据来解释一棵树2.1EXCEL构建第1颗树2.2第1棵树的数据解释2.3效果较差的节点解释 三.N颗树如何预测样本3.1样本22数据3.2样本22落入叶子情况3.3样本22的总结 四.…

决策树(二):回归树和模型树

下面介绍的回归树和另一篇文章介绍的分类树,都属于决策树范畴。分类树的模型是每个非叶子节点都是一个分类特征,按照该分类特征的不同取值,将数据集分为多少个子集;并且分类树模型我们要找的是测试数据集的最终分类结果&#xff0…

模型树——就是回归树的分段常数预测修改为线性回归 对于非线性回归有较好的预测效果...

说完了树回归,再简单的提下模型树,因为树回归每个节点是一些特征和特征值,选取的原则是根据特征方差最小。如果把叶子节点换成分段线性函数,那么就变成了模型树,如(图六)所示: &…

《机器学习实战》9.3树回归之模型树和项目案例

《机器学习实战》9.3树回归之模型树和项目案例 搜索微信公众号:‘AI-ming3526’或者’计算机视觉这件小事’ 获取更多人工智能、机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github:https://github.com/aimi-cn/AILearners 本文出现的所有…

模型树–M5

模型树–M5 模型树推广了回归树的概念,它与回归树的2个重要不同在于: 叶节点上不是常量,而是一个线性函数模型。分割空间的标准不是降低平方误差,而是降低样本标准差。 相比于回归树,模型树的优点在于:回…

机器学习——模型树

和回归树(在每个叶节点上使用各自的均值做预测)不同,模型树算法需要在每个叶节点上都构建出一个线性模型,这就是把叶节点设定为分段线性函数,这个所谓的分段线性(piecewise linear)是指模型由多…

深度学习人脸检测与人脸识别

一、概述 1. 基本概念 人脸是个人重要的生物特征,业界很早就对人脸图像处理技术进行了研究。人脸图像处理包括人脸检测、人脸识别、人脸检索等。人脸检测是在输入图像中检测人脸的位置、大小;人脸识别是对人脸图像身份进行确认,人脸识别通常…

各类人脸识别算法的总体分析

一、人脸识别算法之特征脸方法(Eigenface) 1、原理介绍及数据收集 特征脸方法主要是基于PCA降维实现。 详细介绍和主要思想可以参考 http://blog.csdn.net/u010006643/article/details/46417127 上述博客的人脸数据库打不开了,大家可以去下…

人脸识别算法初次了解

人脸识别算法初次了解 这是转载别人的帖子,觉得好,大家一块学习http://www.cnblogs.com/guoyiqi/archive/2011/07/28/2129300.html 前言 在写此文之前,先扯点东西。我一直在找一个东西,让我思考,让我久久的深陷其…

深扒人脸识别技术,原理、算法深度解析

在深度学习出现后,人脸识别技术才真正有了可用性。这是因为之前的机器学习技术中,难以从图片中取出合适的特征值。轮廓?颜色?眼睛?如此多的面孔,且随着年纪、光线、拍摄角度、气色、表情、化妆、佩饰挂件等…

基于特征脸的人脸识别算法概述

基于特征脸的人脸识别算法概述 —— 才疏学浅, 难免有错误和遗漏, 欢迎补充和勘误. 特征脸识别算法(EigenFaceRecognizer)是一种在主成分分析(PCA)中进行人脸辨识的技术。基于特征脸的驾驶人身份识别流程图为: 图1 …

人脸检测与识别

人脸检测( Face Detection )和人脸识别技术是深度学习的重要应用之一。本章首先会介绍MTCNN算法的原理, 它是基于卷积神经网络的一种高精度的实时人脸检测和对齐技术。接着,还会介绍如何利用深度卷积网络提取人脸特征,…

人脸检测算法综述

其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。 书的购买链接书的勘误,优化,源代码资源导言 人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一,它在安防监控,人证比对…

现在人脸识别最好的算法是哪种?

目前看来,基于深度学习是在人脸识别领域效果比较出色的机器学习方法。 但从学术的角度来讲,“最好”是一个谨慎的词语,深度学习从以往不被认可逐渐成长为机器学习的主流,同样,也难保未来会有其它方法会取代深度学习。 …

经典人脸识别算法(特征脸,FISHERFACE,LBP)

首先,只是基于对算法的主要是想的介绍和理解,对于涉及到的PCA以及直方图比较提到的方法等等可以自己再去深入研究。 其次,只是用作笔记记录。 参考了CSDN博客:https://blog.csdn.net/smartempire/article/details/23377385 htt…