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

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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来