Spark2.1.0入门:决策树分类器(Python版)

决策树(decisiontree)是一种基本的分类与回归方法,这里主要介绍用于分类的决策树。决策树模式呈树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。学习时利用训练数据,根据损失函数最小化的原则建立决策树模型;预测时,对新的数据,利用决策树模型进行分类。

决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的剪枝。

特征选择在于选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率。通常特征选择的准则是信息增益(或信息增益比、基尼指数等),每次计算每个特征的信息增益,并比较它们的大小,选择信息增益最大(信息增益比最大、基尼指数最小)的特征。下面我们重点介绍一下特征选择的准则:信息增益。

首先定义信息论中广泛使用的一个度量标准——熵(entropy),它是表示随机变量不确定性的度量。熵越大,随机变量的不确定性就越大。而信息增益(informationalentropy)表示得知某一特征后使得信息的不确定性减少的程度。简单的说,一个属性的信息增益就是由于使用这个属性分割样例而导致的期望熵降低。信息增益、信息增益比和基尼指数的具体定义如下:

信息增益:特征A对训练数据集D的信息增益

,定义为集合D的经验熵

与特征A给定条件下D的经验条件熵

之差,即

信息增益比:特征A对训练数据集D的信息增益比

定义为其信息增益

与训练数据集D关于特征A的值的熵

之比,即

其中,

,n是特征A取值的个数。

基尼指数:分类问题中,假设有K个类,样本点属于第K类的概率为

,则概率分布的基尼指数定义为

从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点,再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增均很小或没有特征可以选择为止,最后得到一个决策树。

决策树需要有停止条件来终止其生长的过程。一般来说最低的条件是:当该节点下面的所有记录都属于同一类,或者当所有的记录属性都具有相同的值时。这两种条件是停止决策树的必要条件,也是最低的条件。在实际运用中一般希望决策树提前停止生长,限定叶节点包含的最低数据量,以防止由于过度生长造成的过拟合问题。

决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化,这个过程称为剪枝。

决策树的剪枝往往通过极小化决策树整体的损失函数来实现。一般来说,损失函数可以进行如下的定义:

其中,T为任意子树,

为对训练数据的预测误差(如基尼指数),

为子树的叶结点个数,

为参数,

为参数是

时的子树T的整体损失,参数

权衡训练数据的拟合程度与模型的复杂度。对于固定的

,一定存在使损失函数

最小的子树,将其表示为

。当

大的时候,最优子树

偏小;当

小的时候,最优子树

偏大。

frompyspark.ml.linalgimportVector,Vectorsfrompyspark.sqlimportRowfrompyspark.mlimportPipelinefrompyspark.ml.featureimportIndexToString,StringIndexer,VectorIndexer2.读取数据,简要分析:读取文本文件,第一个map把每行的数据用“,”隔开,比如在我们的数据集中,每行被分成了5部分,前4部分是鸢尾花的4个特征,最后一部分是鸢尾花的分类;我们这里把特征存储在Vector中,创建一个Iris模式的RDD,然后转化成dataframe;然后把刚刚得到的数据注册成一个表iris,注册成这个表之后,我们就可以通过sql语句进行数据查询;选出我们需要的数据后,我们可以把结果打印出来查看一下数据。

//分别获取标签列和特征列,进行索引,并进行了重命名。labelIndexer=StringIndexer().setInputCol("label").setOutputCol("indexedLabel").fit(df)featureIndexer=VectorIndexer().setInputCol("features").setOutputCol("indexedFeatures").setMaxCategories(4).fit(df)//这里我们设置一个labelConverter,目的是把预测的类别重新转化成字符型的。labelConverter=IndexToString().setInputCol("prediction").setOutputCol("predictedLabel").setLabels(labelIndexer.labels)//接下来,我们把数据集随机分成训练集和测试集,其中训练集占70%。trainingData,testData=data.randomSplit([0.7,0.3])4.构建决策树分类模型:

evaluatorClassifier=MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction").setMetricName("accuracy")accuracy=evaluatorClassifier.evaluate(predictionsClassifier)print("TestError="+str(1.0-accuracy))TestError=0.05882352941176472treeModelClassifier=modelClassifier.stages[2]print("Learnedclassificationtreemodel:\n"+str(treeModelClassifier.toDebugString))Learnedclassificationtreemodel:DecisionTreeClassificationModel(uid=DecisionTreeClassifier_4e57b26beacfd363271a)ofdepth3with7nodesIf(feature2<=1.9)Predict:2.0Else(feature2>1.9)If(feature3<=1.6)If(feature2<=4.9)Predict:0.0Else(feature2>4.9)Predict:1.0Else(feature3>1.6)Predict:1.0从上述结果可以看到模型的预测准确率为0.94以及训练的决策树模型结构。

6.构建决策树回归模型:

evaluatorRegressor=RegressionEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction").setMetricName("rmse")rmse=evaluatorRegressor.evaluate(predictionsRegressor)print("RootMeanSquaredError(RMSE)ontestdata="+str(rmse))RootMeanSquaredError(RMSE)ontestdata=0.24253562503633297treeModelRegressor=modelRegressor.stages[2]print("Learnedregressiontreemodel:\n"+str(treeModelRegressor.toDebugString))Learnedregressiontreemodel:DecisionTreeRegressionModel(uid=DecisionTreeRegressor_4325a44aff74cf6ff7b3)ofdepth3with7nodesIf(feature2<=1.9)Predict:2.0Else(feature2>1.9)If(feature3<=1.6)If(feature2<=4.9)Predict:0.0Else(feature2>4.9)Predict:1.0Else(feature3>1.6)Predict:1.0从上述结果可以看到模型的标准误差为0.75以及训练的决策树模型结构。

THE END
1.Microsoft决策树算法MicrosoftLearnMicrosoft 决策树算法是由 Microsoft SQL Server Analysis Services 提供的分类和回归算法,用于对离散和连续属性进行预测性建模。 对于离散属性,该算法根据数据集中输入列之间的关系进行预测。它使用这些列的值(也称之为状态)预测指定为可预测的列的状态。具体地说,该算法标识与可预测列相关的输入列。例如,在预测哪些https://msdn.microsoft.com/zh-cn/beginner/ms175312(SQL.105).aspx
2.决策树的剪枝问题PEP剪枝算法是在C4.5决策树算法中提出的, 把一颗子树(具有多个叶子节点)用一个叶子节点来替代(我研究了很多文章貌似就是用子树的根来代替)的话,比起REP剪枝法,它不需要一个单独的测试数据集。PEP算法首先确定这个叶子的经验错误率(empirical)为(E+0.5)/N,0.5为一个调整系数。对于一颗拥有L个叶子的子树,则子树https://www.jianshu.com/p/794d08199e5e
3.决策树——剪枝决策树剪枝算法本文介绍了决策树的剪枝技术,包括预剪枝和后剪枝,以降低过拟合风险。通过西瓜数据集展示了预剪枝和后剪枝的过程,解释了如何在划分前后比较泛化性能来决定是否剪枝。预剪枝在划分前判断是否提升泛化性能,后剪枝则在完整决策树构建后自底向上检查非叶节点。通过实例,预剪枝和后剪枝分别生成了更简洁的决策树,提高了模型的https://blog.csdn.net/qq_52380049/article/details/128069957
4.python机器学习笔记:深入学习决策树算法原理特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准,从而衍生出不同的决策树算法。 1.2 决策树生成 根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。树结构来说,递归结构是最容易理解的方式。 https://www.flyai.com/article/622
5.决策树剪枝策略决策树剪枝算法原理 算法目的: 决策树的剪枝是为了简化决策树模型,避免过拟合。 同样层数的决策树,叶结点的个数越多就越复杂;同样的叶结点个数的决策树,层数越多越复杂。 剪枝前相比于剪枝后,叶结点个数和层数只能更多或者其中一特征一样多,剪枝前必然更复杂。 层数越多,叶结点越多,分的越细致,对训练数据分的https://www.pianshen.com/article/6068101200/
6.在Python中实现决策树算法的示例代码python决策树(Decision Tree)是一种常见的机器学习算法,被广泛应用于分类和回归任务中,并且再其之上的随机森林和提升树等算法一直是表格领域的最佳模型,所以本文将介绍理解其数学概念,并在Python中动手实现,这可以作为了解这类算法的基础知识+ 目录在深入研究代码之前,我们先要了解支撑决策树的数学概念:熵和信息增益https://www.jb51.net/python/294651gm9.htm
7.基于DTBNN的双阈值图像分割方法AET圆形节点为决策树的内部判定节点,m和s在各自范围域内构成判定分支,方形节点为决策树的分类信息。根据工程中图像特点,将满足{Gi(m,s):50≤m<200,20≤s<150}条件的分支保留,将其余分支剪去,以减小分类决策树的冗余度。 图2分类决策树逻辑结构由图2所示的分类决策树,经过剪枝算法和映射关系合并,最终生成低冗余http://www.chinaaet.com/article/3000024039
8.图解机器学习算法(6)决策树模型详解(机器学习通关指南·完结1.决策树算法核心思想 1)决策树结构与核心思想 决策树(Decision tree)是基于已知各种情况(特征取值)的基础上,通过构建树型决策结构来进行分析的一种方式,是常用的有监督的分类算法。 决策树模型(Decision Tree model)模拟人类决策过程。以买衣服为例,一个顾客在商店买裤子,于是有了下面的对话: https://zhuanlan.zhihu.com/p/526729734
9.一文详尽XGBOOST的前世今生腾讯云开发者社区决策树剪枝算法的根本目的是极小化损失函数(经验损失+结构损失),基本策略有”预剪枝“和”后剪枝“两种策略:①预剪枝:是在决策树生成过程中,限制划分的最大深度、叶子节点数和最小样本数目等,以减少不必要的模型复杂度;②后剪枝:先从训练集生成一棵完整的决策树,然后用用验证集自底向上地对非叶结点进行考察,若https://cloud.tencent.com/developer/article/2014060
10.从监督学习说起:算法模型有哪几种?看上面的图,这也可以是CART算法的生成模式。当我们判断的最终结果不止两个的时候,可能这棵树就会变得很庞大(节点和圈圈都很多),这个时候就需要“剪枝”——去掉多余的节点。剪枝方法有两种:预剪枝和后剪枝。预剪枝即在决策树生成前,通过一定规则,避免某些节点的生成;后剪枝则是在决策树生成之后进行剪枝。预http://baijiahao.baidu.com/s?id=1604033222953680327&wfr=spider&for=pc
11.随机森林算法demopythonspark但值得注意的是,随机森林算法和单一决策树算法对该参数有不同的要求。由于随机森林是多个决策树预测结果的投票或平均投票,预测结果的方差降低,因此与单个决策树相比,不容易拟合。因此,随机森林可以选择比决策树模型中更大的maxDepth。甚至有文献说,随机森林中的每一棵决策树都最有可能在不剪枝的情况下生长。但无论https://www.tulingxueyuan.cn/tlzx/jsp/3100.html
12.C4.5算法剪枝2C4.5算法剪枝2 悲观错误剪枝 在讲解悲观剪枝思路的时候,将会运用统计学的相关知识,所以我们将对这部分知识进行粗略的复习,再进行悲观错误剪枝的学习。 首先,我们认为决策树构建期间的错分样本数分布近似于二项分布X~b(n,p),那么其均值与方差可得:u=np , σ2=npq(其中q=1-p)。若np≥4且nq≥4,二项概率https://www.bilibili.com/read/cv12062329/
13.决策树——(三)决策树的生成与剪枝CART51CTO博客CART剪枝算法由两部组成:(1)首先是从之前生成的决策树 T 0 T_0 T0底端开始不断剪枝,直到 T 0 T_0 T0的根结点,形成一个子序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,,T_n\} {T0,T1,,Tn};(2)然后通过交叉验证对这一子序列进行测试,从中选择最优子树。https://blog.51cto.com/ylkz/5028777