Python算法:决策树分类

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 决策树是一种简单高效并且具有强解释性的模型,广泛应用于数据分析领域,如果你将来要从事数据方面的工作,那么就需要来了解一下。

一、前言

作为算法小白的我,现在要开始进行Python算法学习了,因为算法在今后的发展中实在是太重要了,刚好我们学校大数据平台上面有有关Python算法的实验,我打算挨个来学习。

可能有人会说为什么要Python进行算法练习,一般不都是使用C/C++和Java吗,我想说的是,因为我想做数据开发方面的工作,然后本人本身也是大数据专业的,后续考研也会选择有关大数据开发的方向进行深造,而在大数据方面、机器学习方面目前使用最多的语言也就是Python,所以我才进行Python的算法练习。

好啦,废话不多说,我们开始Python算法练习!

二、决策树算法原理介绍

1、决策树原理

决策树是一种比较常用的分类算法,理解起来也相对容易。所谓决策树分类就是用决策条件构成的一个树状预测模型,通过这个模型,我们可以对未知类别的数据进行分类。下面举一个简单的例子来说明。比如期末班级评选三好学生的时候,大家通过投票来评选自己心目中的优秀学生,你在考虑某位同学是否有资格成为三好学生时,可能会分别考虑他的品德、成绩和体育三个方面,你的决策过程可能如下图所示:

image-20220924093505745.png

上图表示你在考虑一位同学是否是三好学生时,先考虑他的品德,如果品德不好的话,直接认为他不是一位好学生,如果品德优良的话那再看他的成绩是否足够好,依此类推。图中蓝色的节点表示判断条件,红色表示决策结果,箭头表示在一个判断条件在不同情况下的决策路径。

上面的例子中只是用来说明,与实际的决策树还是有些差别。首先,在决策树中判断条件通常需要量化,其次,实际的决策树可能会更复杂,比如判断条件可能有多个分支等。

通过上面的例子,我们大概可以知道,决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

2、决策树构造

决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。

构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:

  • 属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。
  • 属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
  • 属性是连续值。此时确定一个值作为分裂点split point,按照>split point和<=split point生成两个分支。

构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,是将给定了类标记的训练集合划分,“最好”地分成个体类的启发式方法,它决定了拓扑结构及分裂点split point的选择。

属性选择度量算法有很多,一般使用自顶向下递归分治法,并采用不回溯的贪心策略,常用的算法有ID3和C4.5,有关这个两个算法的介绍大家可以去看看这篇文章,讲得还不错:

【机器学习】决策树(上)——ID3、C4.5、CART(非常详细)

在实际构造决策树时,通常要进行剪枝,这是为了处理由于数据中的噪声和离群点导致的过分拟合问题。剪枝有两种:

  • 预剪枝——在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造。预剪枝不仅可以降低过拟合的风险而且还可以减少训练时间,但另一方面它是基于“贪心”策略,会带来欠拟合风险。
  • 后剪枝——先构造完成完整的决策树,再通过某些条件遍历树进行剪枝。后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但同时其训练时间会大的多。

3、交叉验证

因为在实际的训练中,训练的结果对于训练集的拟合程度通常还是挺好的(初试条件敏感),但是对于训练集之外的数据的拟合程度通常就不那么令人满意了。因此我们通常并不会把所有的数据集都拿来训练,而是分出一部分来(这一部分不参加训练)对训练集生成的参数进行测试,相对客观的判断这些参数对训练集之外的数据的符合程度。这种思想就称为交叉验证。

交叉验证一般在数据不充足的时候使用,可以选择交叉验证来训练忧患选择模型,如果数据很充足则会选择将数据随机分成三份即训练集、验证集和测试集。

交叉验证有以下三种方法:

  • 简单交叉验证:也是最常用的交叉验证方法,我们在之前的深度学习中就曾使用过,那就是随机将样本数据分成两个部分,7:3的比例训练集和测试集,然后用训练集来训练模型,在测试集上验证模型及参数。接着,我们再把样本打乱,重新选择训练集和测试集,继续训练数据和检验模型。最后我们选择损失函数评估最优的模型和参数。
  • S折交叉验证:和第一种方法不同,S折交叉验证会把样本数据随机的分成S份,每次随机的选择S-1份作为训练集,剩下的1份做测试集。当这一轮完成后,重新随机选择S-1份来训练数据。若干轮(小于S)之后,选择损失函数评估最优的模型和参数。
  • 留一交叉验证:它是第二种情况的特例,此时S等于样本数N,这样对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。此方法主要用于样本量非常少的情况,比如对于普通适中的问题,N小于50时,我一般采用留一交叉验证。

通过反复的交叉验证,用损失函数来度量得到的模型的好坏,最终我们可以得到一个较好的模型。那这三种情况,到底我们应该选择哪一种方法呢?一句话总结,如果我们只是对数据做一个初步的模型建立,不是要做深入分析的话,简单交叉验证就可以了。否则就用S折交叉验证。在样本量少的时候,使用S折交叉验证的特例留一交叉验证。

三、决策树算法函数介绍

这里主要介绍其中两个函数。

1、 train_test_split函数

train_test_split来自sklearn.model_selection,是交叉验证中常用的函数,它能从样本中按比例随机选取训练集和测试集,它的用法如下:

X_train, X_test, y_train, y_test=cross_validation.train_test_split(train_data, train_target, test_size=0.25, random_state=None

其函数内参数介绍:

参数名 说明
train_data 所要划分的样本特征集
train_target 所要划分的样本结果
test_size 样本占比,如果是整数的话就是样本的数量
random_state 是随机数的种子

我们用代码来举个例子:

importnumpyasnpfromsklearn.model_selectionimporttrain_test_splitx, y=np.arange(10).reshape(5, 2), range(5)
print("原始数据为:\n x -> {} \n y -> {}".format(x, list(y)))
x_train, x_test, y_train, y_test=train_test_split(x, y, test_size=0.33, random_state=42)
print("得到的训练数据为:\n x_train -> {} \n y_train -> {}".format(x_train, y_train))
print("得到的测试数据为:\n x_text -> {} \n y_test -> {}".format(x_test, y_test))

它运行的结果是:

原始数据为:x-> [[01]
 [23]
 [45]
 [67]
 [89]]
y-> [0, 1, 2, 3, 4]
得到的训练数据为:x_train-> [[45]
 [01]
 [67]]
y_train-> [2, 0, 3]
得到的测试数据为:x_text-> [[23]
 [89]]
y_test-> [1, 4]

2、tree.DecisionTreeClassifier函数

DecisionTreeClassifier函数用于创建决策树分类器,默认使用CART算法。它的用法如下:

sklearn.tree.DecisionTreeClassifier(criterion=’gini’,splitter=’best’,max_depth=None,min_samples_split=2,min_samples_leaf=1,min_weight_fraction_leaf=0.0,max_features=None,random_state=None,max_leaf_nodes=None,min_impurity_decrease=0.0,min_impurity_split=None,class_weight=None,presort=False)

这个函数的参数很多,我们目前只介绍一下其中几个常用的参数:

参数名 说明
criterion string类型,可选(默认为"gini")。指定使用哪种方法衡量分类的质量。支持的标准有"gini"代表的是Gini impurity(不纯度)与"entropy"代表的是information gain(信息增益)
splitter string类型,可选(默认为"best")。指定在节点中选择分类的策略。支持的策略有"best",选择最好的分类,"random"选择最好的随机分类
max_depth int or None,可选(默认为"None")。表示树的最大深度
min_samples_split int,float,可选(默认为2)。一个内部节点需要的最少的样本数
max_features int,float,string or None类型,可选(默认为None)。在进行分类时需要考虑的特征数
random_state 可为int类型,RandomState 实例或None,可选(默认为"None")。如果是int,random_state是随机数字发生器的种子;如果是RandomState,random_state是随机数字发生器,如果是None,随机数字发生器是np.random使用的RandomState instance

我们也举个例子看看:

fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimportcross_val_scorefromsklearn.treeimportDecisionTreeClassifierclf=DecisionTreeClassifier(random_state=0)
iris=load_iris()
cross_val_score(clf, iris.data, iris.target, cv=10)
print("Cross-val score for iris: ", cross_val_score(clf, iris.data, iris.target, cv=10))

它运行的结果是:

Cross-valscoreforiris:  [1.0.933333331.0.933333330.933333330.866666670.933333331.1.1.        ]

四、数据说明

我们在使用决策树函数时,其中会用到一个数据集——iris,它是一个经典的用于多分类的数据集,通过sklearn.datasets.load_iris()函数可导入。sklearn中的iris数据集有5个key,分别如下:

key 说明
target_names 类别名称,分别为setosa、versicolor和virginica
data 特征集,5列,150行
target 样本类别值
DESCR 关于数据的描述信息
feature_names 特征名称,分别为sepal length (cm),sepal width (cm),petal length (cm)和petal width (cm)

iris.data前五条数据如下:

fromsklearn.datasetsimportload_irisdataset=load_iris()
print(dataset.data[0: 5])

它运行的结果是:

[[5.13.51.40.2]
 [4.93.1.40.2]
 [4.73.21.30.2]
 [4.63.11.50.2]
 [5.3.61.40.2]]

iris.target前五条数据如下:

fromsklearn.datasetsimportload_irisdataset=load_iris()
print(dataset.target[0: 5])

它运行的结果是:

[00000]

五、编写Python决策树程序并运行

我们仍然使用软件MobaXterm连接master服务器,然后使用如下命令开始编写我们的程序:

vi decisionTree.py

然后输入如下Python代码:

#!/usr/bin/env python# -*- coding: utf-8 -*-fromsklearnimporttreefromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpif__name__=="__main__":
# 加载数据dataset=load_iris()
# 提取属性数据X=dataset.data# 提取标签数据y=dataset.target# train_test_split函数用于划分数据集为训练集和测试集,其中参数test_size默认为0.25,表示将25%的数据划分为测试集Xd_train, Xd_test, y_train, y_test=train_test_split(X, y, random_state=14)
# 创建决策树分类器clf=tree.DecisionTreeClassifier()
# 训练分类器模型clf=clf.fit(Xd_train, y_train)
y_predicted=clf.predict(Xd_test)  
# 计算预测准确率  accuracy=np.mean(y_predicted==y_test) *100print("y_test     ",y_test)
print("y_predicted",y_predicted)
print("accuracy:",accuracy)

输入完之后保存退出。

然后在终端使用如下命令进行运行该程序:

python decisionTree.py

它运行的结果是:

[root@master ~]# python decisionTree.py('y_test     ', array([0, 0, 0, 1, 2, 1, 0, 1, 0, 1, 2, 0, 2, 2, 0, 1, 0, 2, 2, 1, 0, 0, 0,
1, 0, 2, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 2, 1]))
('y_predicted', array([0, 0, 0, 1, 2, 1, 0, 1, 0, 1, 1, 0, 2, 2, 0, 1, 0, 2, 2, 1, 0, 0, 0,
1, 0, 2, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 2, 1]))
('accuracy:', 97.368421052631575)

image-20220924104953575.png

六、最后我想说

有关决策树的优缺点大家可以去看一下这篇文章:关于决策树的优缺点

机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。

决策树是一种简单高效并且具有强解释性的模型,广泛应用于数据分析领域。 其本质是一颗由多个判断节点组成的树,可以是二叉树或非二叉树。 其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。

更多的知识大家自行上网学习,我就介绍这么多了,后续还会更新其他的Python算法的,期待得到大家的支持,谢谢!

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
11天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
24 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
9天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
27 2
|
11天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
22 1
|
12天前
|
算法 计算机视觉 Python
Python并查集大揭秘:让你在算法界呼风唤雨,秒杀一切复杂场景!
在编程与算法的广袤天地中,总有一些工具如同神兵利器,能够助你一臂之力,在复杂的问题前游刃有余。今天,我们就来深入探讨这样一件神器——Python并查集(Union-Find),看看它是如何让你在算法界呼风唤雨,轻松应对各种复杂场景的。
29 2
|
11天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
31 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
1月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
1月前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
1月前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。
下一篇
无影云桌面