机器学习:决策树分类代码实现

2024-08-23 23:20

本文主要是介绍机器学习:决策树分类代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、概念

        决策树分类是一种监督学习算法,用于分类问题,即预测离散标签。其核心原理是通过树状图模型来模拟决策过程,从而对数据进行分类。

2、数据准备

        收集数据集,并对其进行清洗和预处理。

        将数据集分为特征(X)和目标变量(y)

datas=pd.read_excel("电信客户流失数据.xlsx")data=datas.iloc[:,:-1]
target=datas.iloc[:,-1]

3、特征选择

        决策树通过选择最能区分数据的特征来构建模型。特征选择的标准通常基于信息增益、基尼不纯度或熵等指标。

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=42)

4、构建树模型

        根节点:从整个数据集开始,选择一个特征及其阈值作为根节点,这个特征应该能够最大程度地减少数据的不确定性。

        分裂:根据根节点的特征值将数据集分割成若干子集,每个子集对应树的一个分支。

        递归构建:对每个子集重复上述过程,选择新的最优特征进行分裂,直到满足停止条件。

5、停止条件

        树达到最大深度。

        节点中的样本数量小于预设的最小分割阈值。

        节点中的样本全部属于同一类别。

6、剪枝:剪枝是决策树优化的重要步骤,它通过移除树的部分分支来减少模型复杂度。

        预剪枝:在树完全生长之前就停止生长,以避免过拟合。

        后剪枝:先让树完全生长,然后从底部开始剪除那些对分类贡献不大的分支。

7、运用交叉验证找到最合适的tree.DecisionTreeClassifier

参数

from sklearn.model_selection import cross_val_score
# 导入交叉验证评分函数scores = []
# 初始化一个空列表,用于存储每个max_depth参数下的模型平均召回率c_param_range = [8, 9, 10, 11, 12, 13, 14]
# 定义一个列表,包含要测试的max_depth参数值for i in c_param_range:# 遍历c_param_range中的每个max_depth值dtr = tree.DecisionTreeClassifier(criterion="gini", max_depth=i, random_state=51, min_samples_leaf=2)# 创建决策树分类器实例,设置分裂标准为"gini",最大深度为当前的i,随机种子为51,叶子节点最小样本数为2score = cross_val_score(dtr, data, target, cv=8, scoring='recall')# 对决策树模型进行8折交叉验证,评分标准为召回率score_mean = sum(score) / len(score)# 计算交叉验证得到的召回率分数的平均值scores.append(score_mean)# 将计算出的平均召回率添加到scores列表中best_c = c_param_range[np.argmax(scores)]
# 使用np.argmax找到scores列表中最大值的索引,这个索引对应的max_depth值即为最佳的max_depth参数

8、训练模型

        使用训练数据集来训练决策树模型。

dtr=tree.DecisionTreeClassifier(criterion="gini",max_depth=best_c,random_state=51,min_samples_leaf=2)
dtr.fit(x_train,y_train)

9、预测

        在决策树构建完成后,新样本通过树的路径进行分类。从根节点开始,根据样本的特征值沿着树向下移动,直到到达叶节点,叶节点的类别即为样本的预测类别。

test_predict=dtr.predict(x_test)
print(metrics.classification_report(y_test,test_predict))

10、评估

        使用准确率、召回率、F1分数等指标来评估决策树模型的性能。

10、优化

        通过调整模型参数(如树的深度、最小分割样本数等)和使用交叉验证等方法来优化模型。

tree.DecisionTreeClassifier(criterion=’gini’splitter=’best’max_depth=Nonemin_samples_split=2min_samples_leaf=1min_weight_fraction_leaf=0.0max_features=Nonerandom_state=Nonemax_leaf_nodes=Nonemin_impurity_decrease=0.0min_impurity_split=Noneclass_weight=Nonepresort=False)

树模型参数:

        1.criterion :gini or entropy 【采用基尼系数还是熵值衡量,默认基尼系数

        2.splitter: best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)【默认best无需更改

        3.max_features:(所有),log2,sqrt,N 特征小于50的时候一般使用所有的 【默认取所有特征,无需更改

        4.max_depth: 数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下如果没有设置,那么将会节点完全展开,直到所有的叶子节点都是纯的,或者达到最小叶子节点的个数阈值设置。

        5.min_samples_split :内部节点再划分所需最小样本数),如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。【控制内部节点分裂的情况;假设<10,那么分裂的数量小于10就不会再次分裂了默认2个

        6.min_samples_leaf :叶子节点最少样本数),这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值【先构成决策树,再剪枝,当小于某个设定值后,删除此节点以及此节点的分支节点】        

        7.min_weight_fraction_leaf:叶子节点最小的样本权重和),这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

        8.max_leaf_nodes :最大叶子节点数),通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到。【假设限制最大的叶子节点数为10个,那么就不会再次分裂了

        9. min_impurity_decrease :

        10.min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。

        11.class_weight 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。

        12.random_state是用来设置决策树分枝中随机模式的参数。当数据集中的特征数量较少时,随机性不会很明显。但是,当特征数量较多时,随机性就会变得明显。random_state参数可以确保每次运行代码时都得到相同的结果。

这篇关于机器学习:决策树分类代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100788

相关文章

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被