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

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

相关文章

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操