决策树实验指导书-R
R语言-决策树算法知识讲解
R语言-决策树算法决策树算法决策树定义首先,我们来谈谈什么是决策树。
我们还是以鸢尾花为例子来说明这个问题。
观察上图,我们判决鸢尾花的思考过程可以这么来描述:花瓣的长度小于2.4cm的是setosa(图中绿色的分类),长度大于1cm的呢?我们通过宽度来判别,宽度小于1.8cm的是versicolor(图中红色的分类),其余的就是virginica(图中黑色的分类)我们用图形来形象的展示我们的思考过程便得到了这么一棵决策树:这种从数据产生决策树的机器学习技术叫做决策树学习, 通俗点说就是决策树,说白了,这是一种依托于分类、训练上的预测树,根据已知预测、归类未来。
前面我们介绍的k-近邻算法也可以完成很多分类任务,但是他的缺点就是含义不清,说不清数据的内在逻辑,而决策树则很好地解决了这个问题,他十分好理解。
从存储的角度来说,决策树解放了存储训练集的空间,毕竟与一棵树的存储空间相比,训练集的存储需求空间太大了。
决策树的构建一、KD3的想法与实现下面我们就要来解决一个很重要的问题:如何构造一棵决策树?这涉及十分有趣的细节。
先说说构造的基本步骤,一般来说,决策树的构造主要由两个阶段组成:第一阶段,生成树阶段。
选取部分受训数据建立决策树,决策树是按广度优先建立直到每个叶节点包括相同的类标记为止。
第二阶段,决策树修剪阶段。
用剩余数据检验决策树,如果所建立的决策树不能正确回答所研究的问题,我们要对决策树进行修剪直到建立一棵正确的决策树。
这样在决策树每个内部节点处进行属性值的比较,在叶节点得到结论。
从根节点到叶节点的一条路径就对应着一条规则,整棵决策树就对应着一组表达式规则。
问题:我们如何确定起决定作用的划分变量。
我还是用鸢尾花的例子来说这个问题思考的必要性。
使用不同的思考方式,我们不难发现下面的决策树也是可以把鸢尾花分成3类的。
为了找到决定性特征,划分出最佳结果,我们必须认真评估每个特征。
通常划分的办法为信息增益和基尼不纯指数,对应的算法为C4.5和CART。
r语言决策树代码
r语言决策树代码使用R语言进行决策树分析决策树是一种常用的机器学习算法,用于解决分类和回归问题。
在R语言中,我们可以使用多种包来构建和分析决策树模型,如rpart、party和randomForest等。
一、加载数据我们需要加载数据集,用于构建决策树模型。
假设我们有一个名为“iris”的数据集,它包含了鸢尾花的萼片和花瓣的长度和宽度等特征,以及它们所属的不同种类。
我们可以使用如下代码加载该数据集:```Rdata(iris)```二、数据预处理在构建决策树之前,我们通常需要对数据进行一些预处理。
其中,最常见的任务是将数据集划分为训练集和测试集,用于模型的训练和评估。
我们可以使用如下代码将数据集划分为训练集和测试集:```Rset.seed(123)train_indices <- sample(1:nrow(iris), nrow(iris) * 0.7)train_data <- iris[train_indices, ]test_data <- iris[-train_indices, ]```三、构建决策树模型在R语言中,我们可以使用rpart包来构建决策树模型。
rpart包提供了一个函数rpart(),它可以根据输入的数据和参数构建决策树模型。
下面是一个简单的示例代码:```Rlibrary(rpart)model <- rpart(Species ~ ., data = train_data)```在上述代码中,我们使用了“Species”作为目标变量,表示鸢尾花的种类。
而“~ .”表示使用除目标变量外的所有其他变量作为自变量。
rpart()函数会根据输入的数据和参数构建决策树模型,并将结果保存在model变量中。
四、可视化决策树模型一旦我们构建了决策树模型,我们通常希望能够可视化该模型,以便更好地理解和解释模型的结果。
在R语言中,我们可以使用rpart.plot包来可视化决策树模型。
数据挖掘决策树r语言
数据挖掘决策树r语言数据挖掘决策树是一种常用的机器学习算法,它能够从数据集中提取出有用的规律,帮助我们做出更好的决策。
在这篇文章中,我们将介绍如何使用R语言来构建决策树,并通过一个实例来演示其应用。
我们需要准备好数据集。
在这个例子中,我们将使用一个虚构的数据集,其中包含了一些人的个人信息和他们是否购买了某个产品的记录。
我们可以使用下面的代码来导入数据集:```rdata <- read.csv("data.csv",header=TRUE)```接下来,我们需要对数据集进行一些预处理。
首先,我们需要将一些非数值型的属性转换成数值型,这样才能在决策树中使用。
例如,性别属性通常可以转换成0/1表示男女。
我们还需要处理一些缺失值,通常使用均值或中位数进行填充。
我们可以使用下面的代码来进行预处理:```rdata$Sex <- ifelse(data$Sex == "Male", 0, 1) # 将性别转换为0/1data$Age[is.na(data$Age)] <- median(data$Age, na.rm=TRUE)# 使用中位数填充缺失值```接下来,我们可以开始构建决策树了。
在R语言中,我们可以使用rpart包来构建决策树。
这个包提供了一个rpart函数,它可以根据指定的属性和目标属性来生成决策树。
例如,我们可以使用下面的代码来生成一个决策树:```rlibrary(rpart)tree <- rpart(Bought ~ Sex + Age + Income, data=data, method="class")```这里,我们使用Bought作为目标属性,Sex、Age和Income作为属性。
method参数指定了我们要使用分类方法来构建决策树。
生成的决策树可以使用plot函数来可视化:```rplot(tree)```生成的决策树可以帮助我们理解属性之间的关系,以及如何根据属性来预测目标属性。
实验二决策树实验实验报告
实验二决策树实验实验报告
一、实验目的
本实验旨在通过实际操作,加深对决策树算法的理解,并掌握
决策树的基本原理、构建过程以及应用场景。
二、实验原理
决策树是一种常用的机器学习算法,主要用于分类和回归问题。
其基本原理是将问题划分为不同的决策节点和叶节点,通过一系列
的特征测试来进行决策。
决策树的构建过程包括特征选择、划分准
则和剪枝等步骤。
三、实验步骤
1. 数据收集:从开放数据集或自有数据中选择一个适当的数据集,用于构建决策树模型。
2. 数据预处理:对收集到的数据进行缺失值处理、异常值处理
以及特征选择等预处理操作,以提高模型的准确性和可靠性。
3. 特征选择:采用合适的特征选择算法,从所有特征中选择对
分类或回归任务最重要的特征。
4. 构建决策树模型:根据选定的特征选择算法,以及划分准则(如信息增益或基尼系数)进行决策树模型的构建。
5. 模型评估:使用交叉验证等方法对构建的决策树模型进行评估,包括准确率、召回率、F1-score等指标。
6. 模型调优:根据评估结果,对决策树模型进行调优,如调整模型参数、采用剪枝技术等方法。
7. 模型应用:将得到的最优决策树模型应用于实际问题中,进行预测和决策。
四、实验结果及分析
在本次实验中,我们选择了某电商网站的用户购买记录作为数据集,利用决策树算法构建用户购买意愿的预测模型。
经过数据预处理和特征选择,选取了用户地理位置、年龄、性别和购买历史等特征作为输入。
利用信息增益作为划分准则,构建了一棵决策树模型。
R中决策树的实现
一、R包中决策树的函数(1)ID3算法在R中我们使用rpart包中的rpart()函数实现树回归,应该使用的是ID3算法吧。
先把该包中两个十分重要的函数介绍如下:rpart(formula, data, weights, subset,na.action = na.rpart, method,model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)主要参数说明:formula回归方程形式,例如y~x1+x2+x3.data是数据,即包含前面formula中变量的数据框。
na.action是缺失数据的处理办法,默认办法为删除因变量缺失的观测,而保留自变量缺失的观测。
method根据树末端的数据类型选择相应变量分割方法,本参数有四种取值:连续型“anova”;离散型“class”;计数型(泊松过程)“poisson”;生存分析型“exp”。
程序会根据因变量的类型自动选择方法,但一般情况下最好还是指明本参数,以便让程序清楚做哪一种树模型parms用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法。
control控制每个节点上的最小样本量、交叉验证的次数、复杂性参量:即cp:complexitypamemeter,这个参数意味着对每一步拆分,模型的拟合优度必须提高的程度,等等。
另外一个函数是进行剪枝,即prune,如下prune(tree, cp, ...)主要参数说明:tree一个回归树对象,常是rpart()的结果对象。
cp复杂性参量,指定剪枝采用的阈值。
cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度,用来节省剪枝浪费的不必要的时间,R内部是怎么计算的我不知道,希望读者能够补充另外一个包是rpart.plot,里面的rpart.plot是用来将决策树可视化的。
如下rpart.plot(reg,type=2,faclen=3)参数解释reg是rpart产生的对象。
【最新】R语言 决策树数据统计分析课件教案讲义(附代码数据)
P. Davy and M. Hagenbuchner c ⃝ Week 6, Autumn 2017
INFO411/911 Data Mining and Knowledge Discovery
Slide 5
,
Tree Structure
Tree structure can be specified by a list of branching variables and cutpoints at each decision node. The tree structure consists of a single root node. Classification: Start at the root node, make decision at each node until a terminal (leaf) node is reached. The leaf node determines the class of the sample.
P. Davy and M. Hagenbuchner c ⃝ Week 6, Autumn 2017
INFO411/911 Data Mining and Knowledge Discovery
Slide 3
,
Decision Trees
Decision (or Classification and Regression) Trees involve hierarchical partition of a data set.
Slide 1
,
Decision Trees I
We want a rule for either (a) predicting a continuous variable Y, or (b) classifying into two or more classes, given the values of some explanatory variables. We call (a) a regression tree, and (b) a decision tree. Some of the discussion in this lecture comes from the book The Elements of Statistical Learning, 2nd ed, free version available online
多分类决策树r语言_R语言构造决策树
多分类决策树r语⾔_R语⾔构造决策树数据来源:决策树会⽤到基尼指数,信息增益等知识点,下⾯⽤R构建决策树:注:监督机器学习中会出现的问题:过拟合和⽋拟合,偏差和⽅差为了限制过拟合,可以限制⽣长,修剪树枝其他分类器:KNN和随机森林*[下⼀版我们将⽤KNN和随机森林进⾏数据分类]1. #读取数据2. >library(tree)3. >data<-read.csv('data.csv')4. #了解数据特征5. >View(data)6. >str(data)7. >table(data$是否预定)8. #将数据分为测试集和训练集,70:309. > set.seed(2134)10. > ind<-sample(2,nrow(data),replace=TRUE,prob=c(0.7,0.3))11. > train_set<-data[ind==1,]12. > test_set<-data[ind==2,]13. > nrow(train_set)14. [1] 2715. > nrow(test_set)16. [1] 1117. #使⽤tree函数构建决策树模型18. > #build decision tree model using tree()19. > str(data)20. 'data.frame': 38 obs. of 6 variables:21. $ 性别 : Factor w/ 2 levels "男","⼥": 1 1 2 2 1 2 1 2 2 1 ...22. $ 年龄 : Factor w/ 3 levels "00后","80后",..: 3 1 3 3 3 2 3 3 3 3 ...23. $ 价格敏感 : Factor w/ 2 levels "否","是": 1 1 2 2 1 1 2 1 1 1 ...24. $ 是否连住 : Factor w/ 2 levels "否","是": 1 1 1 2 2 1 1 2 1 1 ...25. $ 提各种问题: Factor w/ 2 levels "否","是": 1 1 1 1 1 2 1 1 1 1 ...26. $ 是否预定 : Factor w/ 2 levels "否","是": 2 2 2 1 2 1 2 2 2 2 ...27. > mytree<-tree(是否预定~性别+年龄+价格敏感+是否连住+提各种问题,data=train_set)28. > #summarize the model29. > summary(mytree)30.31. Classification tree:32. tree(formula = 是否预定 ~ 性别 + 年龄 + 价格敏感 + 是否连住 +33. 提各种问题, data = train_set)34. Variables actually used in tree construction:35. [1] "是否连住" "提各种问题"36. Number of terminal nodes: 337. Residual mean deviance: 0.4904 = 11.77 / 24Misclassification error rate: 0.07407 = 2 / 27模型结果显⽰,剩余偏差为0.4904,误分类误差为7.407%。
【原创】R语言决策树、随机森林案例报告附代码数据
【原创】R语⾔决策树、随机森林案例报告附代码数据决策树随机森林决策树是⼀种简单、常⽤的基础模型。
之所以说它简单,不仅因为它的思想原理简单具体、贴近实际,它并不需要像线性回归模型⼀样⽤⼀个数学公式来表征,⽽是由规则来抽象。
说它基础,是因为它是⼀系列复杂强⼤的模型的基础。
决策树的基本思想是通过将数据不断划分,使原来混乱的数据信息逐渐清晰。
举⼀个简单的例⼦:如果你去相亲,你可能以外貌为第⼀特征来决定是否继续往下考虑;如果外貌过关了,你可能还会考虑职位和收⼊⽔平;如果收⼊⽔平也过关了,再去考虑品质……这种层层筛选的过程就蕴含着决策树的朴素思想。
决策树不局限于数学模型的具体形式,它既可以⽤来作分类,也可以⽤来作回归,⼆者的基本思想类似,处理⽅法上有差别。
分类树根据前⽂的描述,应该有两个问题:1、如何表征数据的混乱或清晰的程度?2、如何将数据划分?⼀个分类变量,设想⼀下极端情况,如果都是True或False,那它取True或False的概率就是0或1,这些都是100%确定的,你⽆需做任何猜测,这种情况下数据就是最清晰的;反之,如果⼀个变量各有50%的True或False,你甚⾄没办法预测⼀个样本更有可能是True还是False,这种情况下数据就是最混乱的。
有两个指标可以⽤来衡量数据的不确定程度:熵和基尼系数(并⾮经济学上的概念),定义如下:熵:熵的定义基尼系数:基尼系数的定义具体就不推导了,可见当p接近0或1时,这两个指标都接近于0,表⽰不确定度最低,信息最为清晰;当p接近0.5时,不确定度最⾼,信息最为混乱。
第⼀个问题解答了,第⼆个问题如何来进⾏数据划分?分类树的主要过程如下:⾸先计算分类变量在不做任何划分下的熵或基尼系数计算每⼀个特征在各个⽔平下的划分的加权熵或基尼系数选择令分类变量熵或基尼系数减少得最多的特征作为节点往下划分?重复以上过程,直⾄数据被清晰划分以Carseats的座椅销量⽔平⾼低为⼆分类变量,演⽰构建分类树的过程。
r语言决策树模型预测实例
r语言决策树模型预测实例R语言是一种强大的数据分析和统计建模工具,它提供了丰富的函数和库来支持各种数据处理和预测分析任务。
其中,决策树模型是一种常用的预测建模方法,可以帮助我们从复杂的数据集中提取有用的信息,并进行预测和决策支持。
本文将以R语言决策树模型预测实例为主题,一步一步回答相关问题。
首先,我们需要了解决策树模型的基本原理和使用方法。
决策树是一种树状结构的预测模型,通过一系列的选项和决策节点来将数据集划分成不同的类别或者预测结果。
决策树的构建过程包括选择最佳的划分特征和划分点,以及确定每个节点的决策规则。
第一步,我们需要导入R语言的决策树库。
R语言中有多个决策树库可以选择,如“rpart”、“party”和“randomForest”等。
这里我们以“rpart”库为例进行讲解。
Rlibrary(rpart) # 导入rpart库第二步,我们需要加载实例数据集。
在R语言中,有很多免费的数据集可以使用,如“iris”数据集、“mtcars”数据集等。
这里我们以“iris”数据集为例进行讲解。
iris数据集是一个经典的分类数据集,包含了150个样本和4个特征,其中每个样本属于三个不同的类别之一。
Rdata(iris) # 加载iris数据集第三步,我们需要对数据集进行预处理和划分。
通常我们将数据集分成训练集和测试集两部分,用于模型的训练和评估。
这里我们将数据集划分为训练集和测试集,并进行必要的特征选择和缺失值处理。
Rset.seed(123) # 设置随机种子,保证实验可复现trainIndex <- sample(1:nrow(iris), 0.7*nrow(iris)) # 随机选取70%的样本作为训练集trainData <- iris[trainIndex, ] # 训练集testData <- iris[-trainIndex, ] # 测试集第四步,我们可以使用rpart函数构建决策树模型。
机器学习与数据挖掘实验-决策树
实验二决策树一、实验目的本实验课程是计算机、智能、物联网等专业学生的一门专业课程,通过实验,帮助学生更好地掌握数据挖掘相关概念、技术、原理、应用等;通过实验提高学生编写实验报告、总结实验结果的能力;使学生对机器学习算法、数据挖掘实现等有比较深入的认识。
1.掌握机器学习中涉及的相关概念、算法。
2.熟悉数据挖掘中的具体编程方法;3.掌握问题表示、求解及编程实现。
二、基本要求1.实验前,复习《机器学习与数据挖掘》课程中的有关内容。
2.准备好实验数据。
3.编程要独立完成,程序应加适当的注释。
4.完成实验报告。
三、实验软件使用Python语言实现。
四、实验内容:表4.1的西瓜数据集包括17个训练样例,请学习一个决策树,用于预测一个西瓜是不是好瓜。
具体要求如下:(1)在生成决策树的过程中,请分别使用ID3算法、C4.5算法、CART 算法,并对比三个算法结果。
其中,ID3算法在生成决策树的各结点使用信息增益准则进行特征选择;C4.5算法在生成决策树的过程使用信息增益比进行特征选择;CART算法假设决策树是一个二叉树,通过递归地二分每个特征,将特征空间划分为有限个单元,并在这些单元上确定预测的概率分布。
(2)请自己写程序实现决策树的生成过程,不要直接调用决策树算法包。
五、实验具体实现算法理论知识决策树的具体流程:(1)创建数据集(2)计算数据集的信息熵(3)遍历所有的特征,选择信息熵最小的特征,即为最好的分类特征(4)根据上一步得到的分类特征分割数据集,并将该特征从列表中移除(5)使用决策树执行分类,返回分类结果学习的伪代码:I if 每个子项属于同一个类,return 类标签II else(1)寻找划分数据集的最好特征(2)划分数据集(3) 创建分支结点①for 每个划分的子集②调用分支创建函数并增加返回结果到分支结点中(4)返回分支结点ID3算法生成决策树的各结点使用信息增益准则进行特征选择,存在偏向于选择取值较多的特征的问题在生成决策树的过程使用信息增益比进行特征选择;剪枝算法预剪枝:后剪枝:六、代码实现0、辅助画图# coding: utf-8import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文标签plt.rcParams['axes.unicode_minus'] = False # 这两行需要手动设置# 使用文本注解绘制树结点decisionNode = dict(boxstyle="sawtooth", fc="0.8")leafNode = dict(boxstyle="round4", fc="0.8")arrow_args = dict(arrowstyle="<-")def plotNode(nodeText, centerPt, parentPt, nodeType):createPlot.ax1.annotate(nodeText, xy=parentPt, xycoords='axes fraction', \xytext=centerPt, textcoords='axes fraction', va='center', ha='center', \bbox=nodeType, arrowprops=arrow_args)# 获取叶子节点的数目和树的层数def getNumLeaves(myTree):numLeaves = 0firstStr = list(myTree.keys())[0] # 决策树的第一个键值secondDict = myTree[firstStr] # 字典中第一个key所对应的value,即下面的目录for key in secondDict.keys():if type(secondDict[key]).__name__ == 'dict': # 如果是字典类型,则继续递归numLeaves += getNumLeaves(secondDict[key])else: # 如果不是字典类型,则停止递归numLeaves += 1return numLeavesdef getTreeDepth(myTree):maxDepth = 0thisDepth = 0firstStr = list(myTree.keys())[0]secondDict = myTree[firstStr]for key in secondDict.keys():if type(secondDict[key]).__name__ == 'dict':thisDepth += getTreeDepth(secondDict[key])else:thisDepth = 1if (thisDepth > maxDepth):maxDepth = thisDepthreturn maxDepth# 预先存储树的信息,方便读取测试def retrieveTree(i):listOfTrees = [{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}},{'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}}]return listOfTrees[i]def plotMidText(centerPt, parentPt, txtStr):xMid = (parentPt[0] + centerPt[0]) / 2.0yMid = (parentPt[1] + centerPt[1]) / 2.0createPlot.ax1.text(xMid, yMid, txtStr)def plotTree(myTree, parentPt, nodeTxt):firstStr = list(myTree.keys())[0]numLeaves = getNumLeaves(myTree)depth = getTreeDepth(myTree)centerPt = (plotTree.xOff + (1.0 + float(numLeaves)) / 2.0 / plotTree.totalW, plotTree.yOff)# centerPt = (0.5, plotTree.yOff)plotMidText(centerPt, parentPt, nodeTxt)plotNode(firstStr, centerPt, parentPt, decisionNode)secondDict = myTree[firstStr]plotTree.yOff -= 1.0 / plotTree.totalD # 由于绘图是自顶向下的,所以y的偏移要递减for key in secondDict.keys():if type(secondDict[key]).__name__ == 'dict':plotTree(secondDict[key], centerPt, str(key))else:plotTree.xOff += 1.0 / plotTree.totalWplotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), centerPt, leafNode)plotMidText((plotTree.xOff, plotTree.yOff), centerPt, str(key)) plotTree.yOff += 1.0 / plotTree.totalD # 在绘制了所有子节点后,增加y的偏移def createPlot(inTree):fig = plt.figure(1, facecolor='white')fig.clf()axprops = dict(xticks=[], yticks=[])createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)plotTree.totalW = float(getNumLeaves(inTree))plotTree.totalD = float(getTreeDepth(inTree))plotTree.xOff = -0.5 / plotTree.totalWplotTree.yOff = 1.0plotTree(inTree, (0.5, 1.0), '')plt.show()1.1、ID3算法代码:from pandas import read_excelfrom math import log2from copy import deepcopyimport treePlotter# 阶段一:特征选择# 1、创建数据集def createDataSet(filename, sheetName='Sheet1') -> '从excel中获取数据和标签属性': # 本实验调用获取数据案例: df = readFromExcelByPandas(r"watermelon_dataset.xlsx") df = read_excel(filename, sheet_name=sheetName, header=0)labels = df.columns.tolist()[1:-1]dataSet = df.values.tolist()dataSet = [example[1:] for example in dataSet] # 由于本数据集的第一项是编号,对实验结果影响不大,需要删除for data in dataSet:if data[-1] == '否':data[-1] = '坏瓜'else:data[-1] = '好瓜'return dataSet, labels# 2、求数据集D的经验熵H(D)def calcShannon(dataSet) -> '从数据集中计算':# 对类别计算dataSetLen = len(dataSet) # 行数p = {} # 获取{类别:个数}H = 0.0 # 熵值for data in dataSet: # 统计类别和对应出现次数key = data[-1]if key not in p.keys():p[key] = 0p[key] += 1for key in p:px = float(p[key]) / float(dataSetLen)if px > 0:H -= px * log2(px)return H# 3、根据给定的特征和特征值选择子数据集def splitDataSet(dataSet, axis, value) -> '第axis个标签为value的集合': subDataSet = []for feature_vector in dataSet:if feature_vector[axis] == value:reduce_vector = feature_vector[:axis]reduce_vector.extend(feature_vector[axis + 1:]) # 去除原来axis的属性subDataSet.append(reduce_vector)return subDataSet# 4、求特征A对数据集D的经验条件熵H(D|A)和信息增益g(D,A),选择最优的信息增益def chooseBestFeature(dataSet) -> '返回信息增益最大的标签属性序号':FeaturesNum = len(dataSet[0]) - 1 # 选择总特征值baseEntropy = calcShannon(dataSet) # H(D)bestInfoGain = 0.0 # 最佳信息增益,越大越好;初始默认为0bestFeature = -1 # 最佳划分属性dataSetLen = len(dataSet) # 行数for i in range(FeaturesNum): # 遍历每一个特征# 获取该特征的所有值,存入列表featureListfeatureList = [feature[i] for feature in dataSet]uniqueVals = set(featureList)sonEntropy = 0.0 # 经验条件熵H(D|A)for value in uniqueVals: # 遍历特征所有可能取值subDataSet = splitDataSet(dataSet, i, value) # 该特征对应的该值在的子集合prob = float(len(subDataSet)) / float(dataSetLen) # 该特征对应的该值的子集合在全部集合中所占比列sonEntropy += prob * calcShannon(subDataSet)# 计算信息增益g(D,A)InfoGain = baseEntropy - sonEntropyif InfoGain > bestInfoGain:bestInfoGain = InfoGainbestFeature = ireturn bestFeature# 阶段二:决策树生成# 5、没有特征时选择数目最多的类别返回def majorityCnk(classList) -> '返回次数最多的分类':p = {} # 获取{类别:个数}for data in classList: # 统计类别和对应出现次数key = data[-1]if key not in p:p[key] = 0p[key] += 1sortedClassDict = sorted(p.keys(), reverse=True)return sortedClassDict[0]# 6、创建决策树的函数代码def createTree(dataSet, labels) -> '返回决策树T':labelsTmp = deepcopy(labels)classList = [data[-1] for data in dataSet] # 统计dataSet中所有的标签# 结束条件1:若D中所有实例都是属于同一类Ck,则T为单结点树,将Ck作为该节点的类标识if classList.count(classList[0]) == len(classList):return classList[0]# 结束条件2:若特征集为空,则T为单结点树,将Ck作为该节点的类标识if len(labelsTmp) == 0:return majorityCnk(classList)# 否则计算特征集A中各特征对D的信息增益,选择信息增益最大的特征AgbestFeatureIndex = chooseBestFeature(dataSet)myTree = {bestFeature: {}} # 用字典构建树del (labelsTmp[bestFeatureIndex]) # 删除这个最佳划分的特征的标签# 获取当前最优特征所有可能取值featureList = [data[bestFeatureIndex] for data in dataSet]uniqueVals = set(featureList)# 只要还可以划分就继续递归调用for value in uniqueVals:sonTree = splitDataSet(dataSet, bestFeatureIndex, value)myTree[bestFeature][value] = createTree(sonTree, labelsTmp) return myTree# 阶段三:测试分类效果,使用决策树进行分类def classify_ID3(inputTree, labels, testFeature) -> 'feaLabels和testVec都是列表': firstStr = list(inputTree.keys())[0] # 第一个特征secondDict = inputTree[firstStr] # 子树字典featureIndex = labels.index(firstStr) # 将标签字符串转换为输入数据标签的索引下标for key in secondDict.keys():if type(secondDict[key]).__name__ == 'dict': # 如果还有节点,则继续递归classLabel = classify_ID3(secondDict[key], labels, testFeature)return classLabelelse: # 如果到达叶子节点,则返回当前节点的分类标签classLabel = secondDict[key]return classLabelreturn "Wrong Classified result.Have not defined this kind of feature."def main():dataSet, labels = createDataSet(r"../watermelon_dataset.xlsx")trees = createTree(dataSet, labels)treePlotter.createPlot(trees)print(classify_ID3(trees, labels, ['浅白', '稍蜷', '浊响', '清晰', '平坦', '软粘']))if __name__ == '__main__':main()1.2、ID3运行结果(截图同书上一样)拿一个这个图中没有的例子测试时,结果是2.1、C4.5算法代码:from pandas import read_excelfrom math import log2from copy import deepcopyimport treePlotter# 阶段一:特征选择# 1、创建数据集def createDataSet(filename, sheetName='Sheet1') -> '从excel中获取数据和标签属性': # 本实验调用获取数据案例: df = readFromExcelByPandas(r"watermelon_dataset.xlsx") df = read_excel(filename, sheet_name=sheetName, header=0)labels = df.columns.tolist()[1:-1]dataSet = df.values.tolist()dataSet = [example[1:] for example in dataSet] # 由于本数据集的第一项是编号,对实验结果影响不大,需要删除# 选择测试for data in dataSet:if data[-1] == '否':data[-1] = '坏瓜'else:data[-1] = '好瓜'return dataSet, labels# 2、求数据集D的经验熵H(D)def calcShannon(dataSet, feat=-1) -> '从数据集中计算':# 对类别计算dataSetLen = len(dataSet) # 行数p = {} # 获取{类别:个数}H = 0.0 # 熵值for data in dataSet: # 统计类别和对应出现次数key = data[feat]if key not in p:p[key] = 0p[key] += 1for key in p:px = float(p[key]) / float(dataSetLen)if px > 0:H -= px * log2(px)return H# 3、根据给定的特征和特征值选择子数据集def splitDataSet(dataSet, axis, value) -> '第axis个标签为value的集合': subDataSet = []for feature_vector in dataSet:if feature_vector[axis] == value:reduce_vector = feature_vector[:axis]reduce_vector.extend(feature_vector[axis + 1:]) # 去除原来axis的属性subDataSet.append(reduce_vector)return subDataSet# 4、求特征A对数据集D的经验条件熵H(D|A)和信息增益g(D,A):g(D,A)=H(D)-H(D|A)# 再求分裂信息H(A),求最优增益率gr(D,A):gr(D,A) = g(D,A)/H(A)def chooseBestFeature(dataSet) -> '返回信息增益率最大的标签属性序号':FeaturesNum = len(dataSet[0]) - 1 # 选择总特征值baseEntropy = calcShannon(dataSet) # H(D)bestInfoGainRate = 0.0 # 最佳信息增益率,越大越好;初始默认为0bestFeature = -1 # 最佳划分属性dataSetLen = len(dataSet) # 行数for i in range(FeaturesNum): # 遍历每一个特征# 获取该特征的所有值,存入列表featureListfeatureList = [feature[i] for feature in dataSet]uniqueVals = set(featureList)sonEntropy = 0.0 # 经验条件熵H(D|A)SplitInfo = 0.0 # 分裂信息H(A)for value in uniqueVals: # 遍历特征所有可能取值subDataSet = splitDataSet(dataSet, i, value) # 该特征对应的该值在的子集合prob = float(len(subDataSet)) / float(dataSetLen) # 该特征对应的该值的子集合在全部集合中所占比列sonEntropy += prob * calcShannon(subDataSet)if prob > 0:SplitInfo -= prob * log2(prob)# SplitInfo = calcShannon(dataSet, i) # 注释的功能和上面功能一样if SplitInfo == 0:continue# 计算信息增益g(D,A)InfoGain = baseEntropy - sonEntropy# 计算增益率InfoGainRate = float(InfoGain) / float(SplitInfo)if InfoGainRate > bestInfoGainRate:bestInfoGainRate = InfoGainRatebestFeature = ireturn bestFeature# 阶段二:决策树生成# 5、没有特征时选择数目最多的类别返回def majorityCnk(classList) -> '返回次数最多的分类':p = {} # 获取{类别:个数}for data in classList: # 统计类别和对应出现次数key = data[-1]if key not in p:p[key] = 1else:p[key] += 1sortedClassDict = sorted(p.keys(), reverse=True)return sortedClassDict[0]# 6、创建决策树的函数代码def createTree(dataSet, labels) -> '返回决策树T':labelsTmp = deepcopy(labels)classList = [data[-1] for data in dataSet] # 统计dataSet中所有的标签# 结束条件1:若D中所有实例都是属于同一类Ck,则T为单结点树,将Ck作为该节点的类标识if classList.count(classList[0]) == len(classList):return classList[0]# 结束条件2:若特征集为空,则T为单结点树,将Ck作为该节点的类标识if len(labelsTmp) == 0:return majorityCnk(classList)# 否则计算特征集A中各特征对D的信息增益,选择信息增益最大的特征AgbestFeatureIndex = chooseBestFeature(dataSet)bestFeature = labelsTmp[bestFeatureIndex]myTree = {bestFeature: {}} # 用字典构建树del (labelsTmp[bestFeatureIndex]) # 删除这个最佳划分的特征的标签# 获取当前最优特征所有可能取值featureList = [data[bestFeatureIndex] for data in dataSet]uniqueVals = set(featureList)# 只要还可以划分就继续递归调用for value in uniqueVals:sonTree = splitDataSet(dataSet, bestFeatureIndex, value)myTree[bestFeature][value] = createTree(sonTree, labelsTmp) return myTree# 阶段三:测试分类效果,使用决策树进行分类def classify_C45(inputTree, labels, testFeature) -> 'feaLabels和testVec都是列表': firstStr = list(inputTree.keys())[0] # 第一个特征secondDict = inputTree[firstStr] # 子树字典featureIndex = labels.index(firstStr) # 将标签字符串转换为输入数据标签的索引下标for key in secondDict.keys():if testFeature[featureIndex] == key:if type(secondDict[key]).__name__ == 'dict': # 如果还有节点,则继续递归classLabel = classify_C45(secondDict[key], labels, testFeature)return classLabelelse: # 如果到达叶子节点,则返回当前节点的分类标签classLabel = secondDict[key]return classLabelreturn "Wrong Classified result.Have not defined this kind of feature."# 阶段四:利用验证集对决策树后剪枝def prune(Tree, labels, testData):"""后剪枝:param inputTree:训练好但未剪枝的树:param testData: 验证集:return:"""if len(testData) == 0:raise Exception('请输入测试集')firstStr = list(Tree.keys())[0] # 第一个特征secondDict = Tree[firstStr] # 子树字典featureIndex = labels.index(firstStr) # 将标签字符串转换为输入数据标签的索引下标if not isTree(secondDict):return secondDictchange = FalsefirstError = 0for key in secondDict.keys():if isTree(secondDict[key]):change = TruesecondDict[key] = prune(secondDict[key], labels, testData)continueelse:tmpList = splitDataSet(testData,featureIndex, key)for lst in tmpList:if lst[-1] != secondDict[key]:firstError += 1if not change:secondError = 0classList = [[example[-1]] for example in testData]# 计划取代的特征值meanValue = majorityCnk(classList)for lst in testData:if lst[-1] != meanValue:secondError += 1if firstError >= secondError:print("merging")return meanValuereturn Treedef isTree(obj):return type(obj).__name__ == 'dict'def main():dataSet, labels = createDataSet(r"../watermelon_dataset.xlsx")# from random import sample# train_list = sample([i for i in range(len(dataSet))], len(dataSet) // 2 + 1) train_list = [1, 2, 3, 6, 7, 10, 14, 15, 16, 17, 4] # 指定测试案例train_list = [i - 1 for i in train_list]test_list = list(set([i for i in range(len(dataSet))]) - set(train_list))dataSet1 = []for i in train_list:dataSet1.append(dataSet[i]) # 训练集trees = createTree(dataSet1, labels)treePlotter.createPlot(trees)print(trees)dataSet2 = [] # 测试集for i in test_list:dataSet2.append(dataSet[i]) # 训练集trees = prune(trees, labels, dataSet2)treePlotter.createPlot(trees)print(trees)p rint(classify_C45(trees, labels, ['浅白', '稍蜷', '浊响', '清晰', '平坦', '软粘']))if __name__ == '__main__':main()2.2、C4.5算法运行结果(截图同书上一样):剪枝前:剪枝后:对于上次ID3算法没有解决的例子,C4..5测试出来的结果是坏瓜3.1、CART算法代码:from pandas import read_excelfrom copy import deepcopyimport treePlotter# 阶段一:特征选择# 1、创建数据集def createDataSet(filename, sheetName='Sheet1') -> '从excel中获取数据和标签属性': # 本实验调用获取数据案例: df = readFromExcelByPandas(r"watermelon_dataset.xlsx") df = read_excel(filename, sheet_name=sheetName, header=0)labels = df.columns.tolist()[1:-1]dataSet = df.values.tolist()dataSet = [example[1:] for example in dataSet] # 由于本数据集的第一项是编号,对实验结果影响不大,需要删除for data in dataSet:if data[-1] == '否':data[-1] = '坏瓜'else:data[-1] = '好瓜'return dataSet, labels# 2、求数据集D的基尼值属Gini(D)def calcGini(dataSet):# 对类别计算dataSetLen = len(dataSet) # 行数p = {} # 获取{类别:个数}G = 1.0 # 训练元组集D的不纯度for data in dataSet: # 统计类别和对应出现次数key = data[-1]if key not in p:p[key] = 0p[key] += 1for key in p:px = float(p[key]) / float(dataSetLen)G -= px * pxreturn G# 3、根据给定的特征和特征值选择子数据集def splitDataSet(dataSet, axis, value) -> '第axis个标签为value的集合':subDataSet = [] # 符合条件的子集otherDataSet = [] # 其他不符合的子集for feature_vector in dataSet:reduce_vector = feature_vector[:axis]reduce_vector.extend(feature_vector[axis + 1:]) # 去除原来axis的属性if feature_vector[axis] == value:subDataSet.append(reduce_vector)else:otherDataSet.append(reduce_vector)return subDataSet, otherDataSet# 4、求特征A对数据集D的最优划分属性min_Gini_value(D,a)的属性a:ax的基尼指数加权值# 返回最好的特征以及二分特征值def chooseBestFeature(dataSet) -> '返回不纯度下降最大的标签属性序号':min_Gini_value = float("inf") # 初始化最小的基尼指数FeaturesNum = len(dataSet[0]) - 1 # 选择总特征值dataSetLen = len(dataSet) # 行数bestFeatureIndex = -1 # 基尼指数最小的属性作为最优划分属性bestValue = Nonefor i in range(FeaturesNum): # 遍历每一个特征# 获取该特征的所有值,存入列表featureListfeatureList = [feature[i] for feature in dataSet]uniqueVals = set(featureList)for value in uniqueVals: # 遍历特征所有可能取值Gini_value = 0 # 基于当前属性的基尼值subDataSet, otherDataSet = splitDataSet(dataSet, i, value) # 该特征对应的该值在的子集合prob = float(len(subDataSet)) / float(dataSetLen) # 该特征对应的该值的子集合在全部集合中所占比列Gini_value += prob * calcGini(subDataSet)prob = float(len(otherDataSet)) / float(dataSetLen) # 该特征对应的该值的子集合在全部集合中所占比列Gini_value += prob * calcGini(otherDataSet)if min_Gini_value >= Gini_value:min_Gini_value = Gini_valuebestFeatureIndex = i # 特征下标bestValue = value # 特征对应值return bestFeatureIndex, bestValue# 阶段二:决策树生成# 5、没有特征时选择数目最多的类别返回def majorityCnk(classList) -> '返回出现次数最多的分类':p = {} # 获取{类别:个数}for data in classList: # 统计类别和对应出现次数key = data[-1]if key not in p:p[key] = 1else:p[key] += 1sortedClassDict = sorted(p.keys(), reverse=True)return sortedClassDict[0]# 6、创建决策树的函数代码def createTree(dataSet, labels) -> '返回决策树T':labelsTmp = deepcopy(labels)classList = [data[-1] for data in dataSet] # 统计dataSet中所有的标签# 结束条件1:若D中所有实例都是属于同一类Ck,则T为单结点树,将Ck作为该节点的类标识if classList.count(classList[0]) == len(classList):return classList[0]# 结束条件2:若特征集为空,则T为单结点树,将Ck作为该节点的类标识# 如果没有继续可以划分的特征,就多数表决决定分支的类别if len(labelsTmp) == 0:return majorityCnk(classList)# 否则计算特征集A中各特征对D的信息增益,选择信息增益最大的特征AgbestFeatureIndex, bestValue = chooseBestFeature(dataSet)bestFeature = labelsTmp[bestFeatureIndex]myTree = {bestFeature: {}} # 用字典构建树del (labelsTmp[bestFeatureIndex]) # 删除这个最佳划分的特征的标签sonTree, otherSonTree = splitDataSet(dataSet, bestFeatureIndex, bestValue)myTree[bestFeature][bestValue] = createTree(sonTree, labelsTmp)myTree[bestFeature]["Not " + bestValue] = createTree(otherSonTree, labelsTmp) return myTree# 阶段三:测试分类效果,使用决策树进行分类def classify_Gini(inputTree, labels, testFeature) -> 'feaLabels和testVec都是列表': firstStr = list(inputTree.keys())[0] # 第一个特征secondDict = inputTree[firstStr] # 子树字典featureIndex = labels.index(firstStr) # 将标签字符串转换为输入数据标签的索引下标ensure_key = list(secondDict.keys())[0]unsure_key = list(secondDict.keys())[1]if ensure_key.startswith('Not'):ensure_key, unsure_key = unsure_key, ensure_keykey = unsure_keyif testFeature[featureIndex] == ensure_key:key = ensure_keyif isTree(secondDict[key]): # 如果还有节点,则继续递归classLabel = classify_Gini(secondDict[key], labels, testFeature)return classLabelelse: # 如果到达叶子节点,则返回当前节点的分类标签classLabel = secondDict[key]return classLabeldef isTree(obj):return type(obj).__name__ == 'dict'# 阶段四:后剪枝def prune(Tree, labels, testData):"""后剪枝:param inputTree:训练好但未剪枝的树:param testData: 验证集:return:"""if len(testData) == 0:raise Exception('请输入测试集')firstStr = list(Tree.keys())[0] # 第一个特征secondDict = Tree[firstStr] # 子树字典featureIndex = labels.index(firstStr) # 将标签字符串转换为输入数据标签的索引下标if not isTree(secondDict):return secondDictensure_key = list(secondDict.keys())[0]unsure_key = list(secondDict.keys())[1]if ensure_key.startswith('Not'):ensure_key, unsure_key = unsure_key, ensure_key# 测试集if isTree(secondDict[ensure_key]):secondDict[ensure_key] = prune(secondDict[ensure_key], labels, testData) if isTree(secondDict[unsure_key]):secondDict[unsure_key] = prune(secondDict[unsure_key], labels, testData) if not isTree(secondDict[ensure_key]) and not isTree(secondDict[unsure_key]): # 比较误差,判断是否需要合并分支为标签lSet, rSet = splitDataSet(testData, featureIndex, ensure_key)firstError = 0for lst in lSet:if lst[-1] != secondDict[ensure_key]:firstError += 1for lst in rSet:if lst[-1] == secondDict[ensure_key]:firstError += 1secondError = 0classList = [[example[-1]] for example in testData]# 计划取代的特征值meanValue = majorityCnk(classList)for lst in testData:if lst[-1] != meanValue:secondError += 1if firstError >= secondError:print("merging")return meanValuereturn Treedef main():dataSet, labels = createDataSet(r"../watermelon_dataset.xlsx")# from random import sample# train_list = sample([i for i in range(len(dataSet))], len(dataSet) // 2 + 1) train_list = [1, 2, 3, 6, 7, 10, 14, 15, 16, 17, 4] # 指定测试案例train_list = [i-1 for i in train_list]test_list = list(set([i for i in range(len(dataSet))]) - set(train_list))dataSet1 = []for i in train_list:dataSet1.append(dataSet[i]) # 训练集trees = createTree(dataSet1, labels)treePlotter.createPlot(trees)print(trees)dataSet2 = [] # 测试集for i in test_list:dataSet2.append(dataSet[i]) # 训练集trees = prune(trees, labels, dataSet2)treePlotter.createPlot(trees)print(trees)print(classify_Gini(trees, labels, ['浅白', '稍蜷', '浊响', '清晰', '平坦', '软粘']))if __name__ == '__main__':main()3.2、CART算法运行结果剪枝前:剪枝后:对ID3测试不了的案例,在这里测试结果为坏瓜,结果和C4.5一样,但是很明显,树的结点都比C4.5的少,这个就是CART算法的一个优势。
《R语言数据挖掘》第五章 R的决策树:数据预测
分类回归树的交叉验证剪枝
CP参数值的典型代表值
《R语言数据挖掘》
分类回归树的R函数和应用
分类回归树的R函数
rpart(输出变量~输入变量,data=数据框名, method=方 法名,parms=list(split=异质性测度指标),control=参数 对象名)
printcp(决策树结果对象名) plotcp(决策树结果对象名)
小样本集下因测试样本集的样本量小,且训练样本集 和测试样本集的划分具有随机性,会导致CP参数值的 设定不恰当。为此,可采用N折交叉验证剪枝
N折交叉验证
首先,将数据集随机近似等分为不相交的N组,称为N折 然后,令其中的N-1组为训练样本集,用于建立模型。剩
余的一组为测试样本集,计算预测误差
N折交叉验证一般应用 第一,模型预测误差的估计,即模型评价 第二,确定合理的模型,即模型选择
推进技术的R函数
boosting(输出变量名~输入变量名,data=数据框名, mfinal=重复次数,boos=TRUE,coeflearn=模型权重调 整方法,control=参数对象名)
《R语言数据挖掘》
随机森林
随机森林是一种组合预测模型。用随机方式建立一片 森林,森林中包含众多有较高预测精度且弱相关甚至 不相关的决策树,并形成组合预测模型。后续,众多 预测模型将共同参与对新观测输出变量取值的预测
后修剪策略是在决策树生长到一定程度之后,根据 一定规则,剪去决策树中的那些不具有一般代表性 的叶节点或子树,是一个边修剪边检验的过程 分类回归树采用的后修剪技术称为最小代价复 杂度剪枝法(Minimal Cost Complexity Pruning,MCCP)
《R语言数据挖掘》
决策树决策分析实验
决策树决策分析实验公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]决策树决策分析实验一、实验目的和内容进一步了解模型及决策树的概念掌握决策支持系统决策分析建模的原理学习用决策树实现单级决策与多级决策的决策支持系统的方法二、方案设计1、单级决策问题单级决策问题是指在一个决策问题中只有一个层次的决策。
反映在决策树模型中,就是只有一个决策节点。
(1)背景及问题:为了适应市场的需求,某物流公司提出了两个扩大配送能力的方案。
一方案是建设新的物流中心,另一方案是扩建原有的物流中心。
建设新的物流中心需要投资600万元,扩建原有物流中心需要投资280万元,两个方案的每年益损值(以万元为单位)及自然状态的概率如表1所示。
试用决策树法确定应采用那种决策方案表1:每年益损值及自然状态的概率自然状态概率(%)新建物流中心年收益(万元)扩建原有物流中心年收益(万元)市场好20080市场差-4060(2)画出决策树,如下图1所示。
(3)计算事件节点的期望益损值:节点②:[]68060010)40(3.0102007.0=-⨯-⨯+⨯⨯节点③:[]46028010603.010807.0=-⨯⨯+⨯⨯故:最优方案为新建一个物流中心。
将节点①上方标上期望收益值680(万元),并剪去扩建原有物流中心方案枝。
2、多级决策问题多级决策问题是指在一个决策问题中有两个或两个以上层次的决策。
反映在决策树模型中,就是有两个或两个以上的决策节点。
绘制多级决策问题的决策树图时,一般常从第一级决策问题画起,然后发展到第二级决策问题,直至最后一级决策问题。
其结构与单级决策问题无本质的区别,只是比较复杂,计算量更大一些。
(1)背景及问题的提出为生产某种新型的港口装卸机械,提出了两个建厂方案(均考虑10年经营期):一是投资300万元建大厂;另一个方案是:先投资160万元建小厂,若产品销路好,则三年后考虑是否扩建成大厂,扩建投资为140万元。
决策树实验指导书R
决策树实验指导书实验目的:1掌握利用R进行决策树的基本步骤2更深入理解决策树的应用实验内容:说明:本实验采用iris数据集,下面中的数据集如无上下文说明,即就是指irisiris以鸢尾花的特征作为数据来源,数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性,就是在数据挖掘、数据分类中非常常用的测试集、训练集。
四个属性分别为:花萼长度、花萼宽带、花瓣长度、花瓣宽度三类分别为:setosa, versicolor, virginica(山鸢尾、变色鸢尾与维吉尼亚鸢尾)1、加载rpart包install、packages("rpart")2、构建决策树,并解释rpart中三个参数的含义iris、rp = rpart(Species~、, iris, method=“class”)3、画出决策树plot(iris、rp, uniform=T, branch=0, margin=0、1, main=" Classification Tree\nIris Species by Petal and Sepal Length")iris、4、添加决策树的标签text(iris、rp, use、n=T, fancy=T, col="blue")5、根据命令table(iris$Species)给出的结果,解释决策树的分类结果6、用决策树进行预测生成训练集ris、train=iris[2*(1:75)-1,]生成测试集iris、test= iris[2*(1:75),]iris、rp2=rpart(Species~、, iris、train, method=“class”)iris、rp3=predict(iris、rp2, iris、test[,-5], type="class")7、查瞧预测结果并对结果进行分析,计算出该决策树的accuracy(分类正确的样本数除以总样本数)table(iris、test[,5],iris、rp3)(25+24+22)/75=0、95。
【原创】R语言决策树、随机森林案例报告附代码数据
决策树随机森林决策树是一种简单、常用的基础模型。
之所以说它简单,不仅因为它的思想原理简单具体、贴近实际,它并不需要像线性回归模型一样用一个数学公式来表征,而是由规则来抽象。
说它基础,是因为它是一系列复杂强大的模型的基础。
决策树的基本思想是通过将数据不断划分,使原来混乱的数据信息逐渐清晰。
举一个简单的例子:如果你去相亲,你可能以外貌为第一特征来决定是否继续往下考虑;如果外貌过关了,你可能还会考虑职位和收入水平;如果收入水平也过关了,再去考虑品质……这种层层筛选的过程就蕴含着决策树的朴素思想。
决策树不局限于数学模型的具体形式,它既可以用来作分类,也可以用来作回归,二者的基本思想类似,处理方法上有差别。
分类树根据前文的描述,应该有两个问题:1、如何表征数据的混乱或清晰的程度?2、如何将数据划分?一个分类变量,设想一下极端情况,如果都是True或False,那它取True或False的概率就是0或1,这些都是100%确定的,你无需做任何猜测,这种情况下数据就是最清晰的;反之,如果一个变量各有50%的True或False,你甚至没办法预测一个样本更有可能是True还是False,这种情况下数据就是最混乱的。
有两个指标可以用来衡量数据的不确定程度:熵和基尼系数(并非经济学上的概念),定义如下:熵:熵的定义基尼系数:基尼系数的定义具体就不推导了,可见当p接近0或1时,这两个指标都接近于0,表示不确定度最低,信息最为清晰;当p接近0.5时,不确定度最高,信息最为混乱。
第一个问题解答了,第二个问题如何来进行数据划分?分类树的主要过程如下:•首先计算分类变量在不做任何划分下的熵或基尼系数•计算每一个特征在各个水平下的划分的加权熵或基尼系数•选择令分类变量熵或基尼系数减少得最多的特征作为节点往下划分•重复以上过程,直至数据被清晰划分以Carseats的座椅销量水平高低为二分类变量,演示构建分类树的过程。
剪枝前的决策树这个模型的训练误差为93.5%,测试误差却仅为70.5%,看到这棵树分支很多,说明什么?说明模型太复杂,过拟合了。
决策树分类实验报告
决策树分类实验报告决策树分类实验报告引言:决策树是一种常用的机器学习算法,它通过构建一棵树状的决策模型来进行分类。
在本次实验中,我们将使用决策树算法对一个数据集进行分类,并评估模型的性能和准确率。
数据集介绍:我们选择了一个包含多个特征的数据集,其中每个样本都有一个类别标签。
该数据集包含了不同类型的动物,并根据它们的特征进行分类。
特征包括动物的体重、身高、食性等。
我们的目标是根据这些特征来预测动物的类别。
实验步骤:1. 数据预处理:在进行决策树分类之前,我们首先对数据进行预处理。
这包括处理缺失值、标准化数据等操作。
缺失值的处理可以采用填充平均值或者使用其他样本的特征进行预测。
标准化数据可以使得不同特征之间的数值范围一致,避免某些特征对分类结果的影响过大。
2. 特征选择:在构建决策树模型之前,我们需要选择最具有分类能力的特征。
常用的特征选择方法包括信息增益、信息增益比等。
通过计算每个特征的分类能力指标,我们可以选择最优的特征作为分类依据。
3. 构建决策树模型:在选择了最优特征之后,我们可以开始构建决策树模型。
决策树的构建过程包括选择根节点、划分子节点等步骤。
通过递归地选择最优特征并划分子节点,我们可以构建一棵完整的决策树模型。
4. 模型评估:构建完决策树模型后,我们需要对其进行评估。
常用的评估指标包括准确率、精确率、召回率等。
准确率是指模型分类正确的样本数占总样本数的比例,精确率是指模型预测为正类的样本中真实为正类的比例,召回率是指真实为正类的样本中被模型预测为正类的比例。
实验结果:经过数据预处理、特征选择和模型构建,我们得到了一棵决策树模型。
通过使用测试集对模型进行评估,我们得到了如下结果:准确率:90%精确率:92%召回率:88%结论:本次实验中,我们成功地使用决策树算法对一个数据集进行了分类。
通过对数据进行预处理、特征选择和模型构建,我们得到了一棵准确率为90%的决策树模型。
该模型在分类任务中表现良好,具有较高的精确率和召回率。
决策树及R语言实现
决策树及R语⾔实现决策树是什么决策树是基于树结构来进⾏决策,这恰是⼈类在⾯临决策问题时⼀种很⾃然的处理机制。
例如,我们要对“这是好⽠吗?”这样的问题进⾏决策时,通常会进⾏⼀系列的判断或“⼦决策”:我们先看“它是什么颜⾊?”,如果是“青绿⾊”,则我们再看“它的根蒂是什么形态?”,如果是“蜷缩”,我们再判断“它敲起来是什么声⾳?”,最后我们得出决策:这是⼀个好⽠。
这个决策如图所⽰:决策树能做什么决策树能实现对数据的探索,能对数据轮廓进⾏描述,能进⾏预测和分类,了解哪些变量最重要决策树基本流程⼏种分列准则⼀信息增益⼆增益率三基尼系数停⽌条件1.如果节点中所有观测属于⼀类。
2.如果该节点中所有观测的属性取值⼀致。
3.如果树的深度达到设定的阈值。
4.如果该节点所含观测值⼩于设定的⽗节点应含观测数的阈值。
5.如果该节点的⼦节点所含观测数将⼩于设定的阈值。
6.如果没有属性能满⾜设定的分裂准则的阈值。
C4.5,对连续属性的处理在C4.5中,对连续属性的处理如下:1. 对特征的取值进⾏升序排序2. 两个特征取值之间的中点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益(InforGain)。
优化算法就是只计算分类属性发⽣改变的那些特征取值。
3. 选择修正后信息增益(InforGain)最⼤的分裂点作为该特征的最佳分裂点4. 计算最佳分裂点的信息增益率(Gain Ratio)作为特征的Gain Ratio。
注意,此处需对最佳分裂点的信息增益进⾏修正:减去log2(N-1)/|D|(N是连续特征的取值个数,D是训练数据数⽬,此修正的原因在于:当离散属性和连续属性并存时,C4.5算法倾向于选择连续特征做最佳树分裂点)R代码实现(C5.0)⼀.导⼊数据集,把⽬标变量转为因⼦setwd("D:\\R_edu\\data")rm(list=ls())accepts<-read.csv("accepts.csv")str(accepts)accepts$bad_ind<-as.factor(accepts$bad_ind)names(accepts)accepts=accepts[,c(3,7:24)]根据业务理解⽣成更有意义的衍⽣变量,不过这些变量都是临时的,因为没有经过数据清洗,此处仅作⼀个⽰例⼆.将数据分为训练集和测试集set.seed(10)select<-sample(1:nrow(accepts),length(accepts$bad_ind)*0.7)train=accepts[select,]test=accepts[-select,]summary(train$bad_ind)三.运⾏C50算法建模train<-na.omit(train)library(C50)ls('package:C50')tc<-C5.0Control(subset =F,CF=0.25,winnow=F,noGlobalPruning=F,minCases =20)model <- C5.0(bad_ind ~.,data=train,rules=F,control =tc)summary( model )四.图形展⽰plot(model)C5imp(model)五.⽣成规则rule<- C5.0(bad_ind ~.,data=train,rules=T,control =tc)summary( rule )CRAT算法处理离散型变量1. 记m为样本T中该属性取值的种类数2. 穷举将m种取值分为两类的划分3. 对上述所有划分计算GINI系数R代码实现CART算法rpart包中有针对CART决策树算法提供的函数,⽐如rpart函数以及⽤于剪枝的prune函数rpart函数的基本形式:rpart(formula,data,subset,na.action=na.rpart,method.parms,control,...)⼀.设置向前剪枝的条件tc <- rpart.control(minsplit=20,minbucket=20,maxdepth=10,xval=5,cp=0.005)rpart.control对树进⾏⼀些设置minsplit是最⼩分⽀节点数,这⾥指⼤于等于20,那么该节点会继续分划下去,否则停⽌minbucket:树中叶节点包含的最⼩样本数maxdepth:决策树最⼤深度xval:交叉验证的次数cp全称为complexity parameter,指某个点的复杂度,对每⼀步拆分,模型的拟合优度必须提⾼的程度⼆.建模rpart.mod=rpart(bad_ind ~.,data=train,method="class",parms = list(prior = c(0.65,0.35), split = "gini"),control=tc)summary(rpart.mod)#1.3看变量重要性rpart.mod$variable.importance#cp是每次分割对应的复杂度系数rpart.mod$cpplotcp(rpart.mod)三.画树图library(rpart.plot)rpart.plot(rpart.mod,branch=1, extra=106, under=TRUE, faclen=0,cex=0.8, main="决策树")四.CART剪枝prune函数可以实现最⼩代价复杂度剪枝法,对于CART的结果,每个节点均输出⼀个对应的cp prune函数通过设置cp参数来对决策树进⾏修剪,cp为复杂度系数我们可以⽤下⾯的办法选择具有最⼩xerror的cp的办法:rpart.mod.pru<-prune(rpart.mod, cp= rpart.mod$cptable[which.min(rpart.mod$cptable[,"xerror"]),"CP"])rpart.mod.pru$cp五.绘制剪枝后的树状图library(rpart.plot)rpart.plot(rpart.mod.pru,branch=1, extra=106, under=TRUE, faclen=0,cex=0.8, main="决策树")六.CART预测使⽤模型对测试集进⾏预测使⽤模型进⾏预测使⽤模型进⾏预测rpart.pred<-predict(rpart.mod.pru,test)可以看到,rpart.pred的结果有两列,第⼀列是为0的概率,第⼆列是为1的概率通过设定阀值,得到预测分类pre<-ifelse(rpart.pred[,2]>0.5,1,0)。
遥感RS决策树的实验报告
遥感RS决策树的实验报告
基于“envi”进行决策树分类,决策树分类的一般过程为先进行规则定义,将规则进行输入,输入待分类影像然后运行决策树,得到待分类结果。
接下来以一个实际操作过程来展示决策树分类。
其中每个内部结点表示在一个属性上的测试,决策树是一个类似于流程图的树结构,个分支代表一个测试输入,而每个树叶结点代表类或类分布。
数的最顶层结点是根结点。
一棵典型的决策树l所示。
它表示概念buyscomputer,它预测顾客是否可能购买计算机。
内部结点用矩形表示,而树叶结点用椭圆表示。
为了对未知的样本分类,样本的属性值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
决策树实验指导书
实验目的:
1掌握利用R进行决策树的基本步骤
2更深入理解决策树的应用
实验内容:
说明:本实验采用iris数据集,下面中的数据集如无上下文说明,即是指iris
iris以鸢尾花的特征作为数据来源,数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性,是在数据挖掘、数据分类中非常常用的测试集、训练集。
四个属性分别为:花萼长度、花萼宽带、花瓣长度、花瓣宽度
三类分别为:setosa, versicolor, virginica(山鸢尾、变色鸢尾和维吉尼亚鸢尾)
1、加载rpart包
("rpart")
2、构建决策树,并解释rpart中三个参数的含义
= rpart(Species~., iris, method=“class”)
3、画出决策树
plot, uniform=T, branch=0, margin=, main="
Classification Tree\nIris Species by Petal and Sepal Length")iris
.
4、添加决策树的标签
text, =T, fancy=T, col="blue")
5、根据命令table(iris$Species)给出的结果,解释决策树的分类结果
6、用决策树进行预测
生成训练集=iris[2*(1:75)-1,]
生成测试集= iris[2*(1:75),]
=rpart(Species~., , method=“class”)
=predict, [,-5], type="class")
7、查看预测结果并对结果进行分析,计算出该决策树的accuracy(分类正确的样本数除以总样本数)
table[,5],
(25+24+22)/75=。