决策树程序实验
基于决策树算法的Web用户行为分析

基于决策树算法的Web用户行为分析随着互联网技术的不断发展,现代化的互联网服务已经成为人们日常生活的重要组成部分。
Web应用程序的用户行为分析渐渐成为互联网企业进行业务决策、优化网站性能、提升用户体验的方式之一。
而决策树算法是一种广泛应用于数据挖掘和机器学习领域的算法,对于Web用户行为分析而言同样具有很大的应用价值。
在本文中,将阐述基于决策树算法的Web用户行为分析的原理和实现方法,以及该算法在Web应用程序开发中的实际应用场景。
一、决策树算法简介决策树算法是一种基于树形结构的分类算法,它的基本原理是将样本从根节点开始逐层划分,并最终使每个叶子节点代表一种类别。
对于Web用户行为分析而言,可以将用户在Web应用程序中的各种行为动作(比如点击、滑动、浏览等)看作是样本的属性值,而用户的行为分类则可以看作是决策树的叶子节点所代表的类别。
决策树算法的训练过程可以通过不断将数据集按照某种划分规则分成更小的数据集并建立子节点的方式来实现。
具体来说,可以使用信息增益、信息增益比或基尼指数等指标来进行划分属性的选择。
最终生成的决策树可以用于对新的用户行为数据进行分类预测。
二、基于决策树算法的Web用户行为分析原理基于决策树算法的Web用户行为分析原理可以归纳为以下三个步骤:1、数据预处理首先需要采集并存储用户在Web应用程序中的行为数据,这些数据包括网页访问记录、点击行为、购物车添加与删除、订单生成等信息。
同时,还需要对这些数据进行清洗和预处理,去除无用数据和异常值。
2、特征提取针对用户行为数据,需要提取出可以反映用户行为模式的特征值。
这些特征值可以包括用户行为频率、用户行为时段、用户行为距离、用户购买意愿等。
同时,还可以使用相关系数、PCA等技术进行特征的筛选和降维,使得决策树算法能够更加高效地进行分类学习。
3、决策树分类在完成特征提取后,就可以使用决策树算法来对用户行为数据进行分类预测。
具体来说,可以使用ID3算法、C4.5算法、CART算法等具有代表性的决策树算法,通过不断对特征进行选择和分裂,最终生成具有较高精确度的决策树模型。
ICHQ6A决策树(中文版)

决策树1:新原料药杂质标准的制定
备注:1 相关批次是指:研发、中试和规模化生产研究的批次
2 参阅ICH指南:新原料药中的杂质
定义:置信上限=批分析数据的3倍标准偏差
决策树2:新药产品中降解产物的标准的制定
备注:1 相关批次是指:研发、中试和规模化生产研究的批次
2 指在决策树1中确定的A和B
3 参阅ICH指南:新药品杂质
决策树3:制定原料药粒度分布标准
原料药
药品:固体制剂或还有不溶性药物的液体制剂
注:只有能通过技术手段进行多晶型含量测定的药品进行下列步骤
决策树5:建立新手性原料和含有手性原料药品中原料手性鉴别、含
量和对映体杂质程序
1 天然手性物质不未收录在本指南
2.由其他杂质产生或合成原料引入杂质,手性的质量控制选择使用在开发研究中被证明的起始原料和中间体来进行。
这样的情况,在多手性中心(3个或更多)或在最终产品前一步进行控制时是被认可的。
3一个手性含量或一个对映体杂质程序代替手性鉴别程序是可以接受的
4. 一个非手性检测结合一个相反对映体控制方法替代手性检测是被认可的
5.原料药中相反异构体水平应该来自手性检测数据或一个独立的程序
6. 如果在原料贮存条件下外消旋化很微小,并已经被证实,那么不需要进行立构体测定
决策树6:原料药和辅料的微生物限度检查
被认可的药物释放度标准类型
怎样的特定试验条件和标准是被认可的?(快速释放)
什么是合格的可接受范围?(缓慢释放)
决策树8:非无菌药品的微生物检查。
id3决策树算法python程序

id3决策树算法python程序关于ID3决策树算法的Python程序。
第一步:了解ID3决策树算法ID3决策树算法是一种常用的机器学习算法,用于解决分类问题。
它基于信息论的概念,通过选择最佳的特征来构建决策树模型。
ID3算法的核心是计算信息增益,即通过选择最能区分不同类别的特征来构建决策树。
第二步:导入需要的Python库和数据集在编写ID3决策树算法的Python程序之前,我们需要导入一些必要的Python库和准备好相关的数据集。
在本例中,我们将使用pandas库来处理数据集,并使用sklearn库的train_test_split函数来将数据集拆分为训练集和测试集。
pythonimport pandas as pdfrom sklearn.model_selection import train_test_split# 读取数据集data = pd.read_csv('dataset.csv')# 将数据集拆分为特征和标签X = data.drop('Class', axis=1)y = data['Class']# 将数据集拆分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) 第三步:实现ID3决策树算法的Python函数在此步骤中,我们将编写一个名为ID3DecisionTree的Python函数来实现ID3决策树算法。
该函数将递归地构建决策树,直到满足停止条件。
在每个递归步骤中,它将计算信息增益,并选择最佳特征作为当前节点的分裂依据。
pythonfrom math import log2from collections import Counterclass ID3DecisionTree:def __init__(self):self.tree = {}def calc_entropy(self, labels):label_counts = Counter(labels)entropy = 0for count in label_counts.values():p = count / len(labels)entropy -= p * log2(p)return entropydef calc_info_gain(self, data, labels, feature):feature_values = data[feature].unique()feature_entropy = 0for value in feature_values:subset_labels = labels[data[feature] == value]feature_entropy += len(subset_labels) / len(labels) * self.calc_entropy(subset_labels)return self.calc_entropy(labels) - feature_entropydef choose_best_feature(self, data, labels):best_info_gain = 0best_feature = Nonefor feature in data.columns:info_gain = self.calc_info_gain(data, labels, feature)if info_gain > best_info_gain:best_info_gain = info_gainbest_feature = featurereturn best_featuredef build_tree(self, data, labels):if len(set(labels)) == 1:return labels[0]elif len(data.columns) == 0:return Counter(labels).most_common(1)[0][0] else:best_feature = self.choose_best_feature(data, labels)sub_data = {}for value in data[best_feature].unique():subset = data[data[best_feature] == value].drop(best_feature, axis=1)sub_labels = labels[data[best_feature] == value]sub_data[value] = (subset, sub_labels)tree = {best_feature: {}}for value, (subset, sub_labels) in sub_data.items():tree[best_feature][value] = self.build_tree(subset, sub_labels)return treedef fit(self, data, labels):self.tree = self.build_tree(data, labels)def predict(self, data):predictions = []for _, row in data.iterrows():node = self.treewhile isinstance(node, dict):feature = list(node.keys())[0]value = row[feature]node = node[feature][value]predictions.append(node)return predictions第四步:使用ID3决策树模型进行训练和预测最后一步是使用我们实现的ID3DecisionTree类进行训练和预测。
决策的程序和方法

决策的程序和方法决策的程序和方法是指在面临问题、挑战或机会时,通过一定的步骤和方法来做出最佳的选择和方案。
决策程序是指按照一定的步骤进行决策的过程,而决策方法则是指在决策过程中采取的不同方法和技巧。
以下是常见的决策程序和方法:一、决策程序:1.定义问题/目标:明确问题或目标是决策中的首要步骤。
确保清楚地了解问题是什么,以及期望的目标是什么。
2.收集信息:收集与问题或目标相关的数据和信息。
可以通过调研、观察、问卷调查、统计数据等方法来收集信息。
3.生成解决方案:根据收集到的信息和数据,生成多个可能的解决方案。
可以通过头脑风暴、创造力工具等方法来产生创新和多样性的解决方案。
4.评估方案:对生成的解决方案进行评估和比较,考虑每个方案的优势、劣势、可行性和风险等因素。
可以使用决策矩阵、SWOT分析、成本效益分析等工具来评估方案。
5.选择最佳方案:根据评估的结果,选择最佳的解决方案。
在选择时需要考虑目标的实现程度、资源投入、风险承受能力等因素。
6.实施方案:将选定的解决方案付诸实施。
确保所有相关的资源和支持都得到充分的考虑和准备。
7.监测和调整:在方案实施的过程中,需要不断监测和评估方案的执行情况,以及实现目标的进展情况。
根据实际情况做出必要的调整和修正。
二、决策方法:1.启发式方法:采用经验、直觉和启示等非正式的决策方法。
在面对复杂和不确定的问题时,常常依赖自己的经验和直觉做出决策。
2.分析方法:基于系统和逻辑分析的方法。
通过收集和分析数据,运用统计学、数学模型等工具来解决问题和做出决策。
3.形式决策方法:采用一定的规则、流程和标准来做出决策。
例如,最小化最大损失原则、最大化最小收益原则等。
4.集体决策方法:通过集体讨论和协商来做出决策。
例如,投票、共识和协商等方法。
5.决策树方法:采用树形结构表示问题和决策的方法。
通过制定一系列的决策节点和选项来帮助分析和决策。
6.模拟方法:通过建立模型和模拟实验来模拟问题和决策的过程。
决策表 决策树 流程图 统称模型

决策表决策树流程图统称模型决策表:决策表又称判断表,是一种呈表格状的图形工具,适用于描述处理判断条件较多,各条件又相互组合、有多种决策方案的情况。
精确而简洁描述复杂逻辑的方式,将多个条件与这些条件满足后要执行动作相对应。
但不同于传统程序语言中的控制语句,决策表能将多个独立的条件和多个动作直接的联系清晰的表示出来。
决策树:决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。
由于这种决策分支画成图形很像一棵树的枝干,故称决策树。
在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。
Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。
这一度量是基于信息学理论中熵的概念。
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
分类树(决策树)是一种十分常用的分类方法。
它是一种监督学习,所谓监督学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。
这样的机器学习就被称之为监督学习。
流程图:流程图(Flowchart):使用图形表示算法的思路是一种极好的方法,因为千言万语不如一张图。
流程图在汇编语言和早期的BASIC 语言环境中得到应用。
相关的还有一种PAD图,对PASCAL或C语言都极适用。
统称模型:通过主观意识借助实体或者虚拟表现,构成客观阐述形态结构的一种表达目的的物件(物件并不等于物体,不局限于实体与虚拟、不限于平面与立体)。
模型≠商品。
任何物件定义为商品之前的研发过程中形态均为模型,当定义型号、规格并匹配相应价格的时候,模型将会以商品形式呈现出来。
决策树例题分析及解答

各点效益值计算过程是:
点2:13.5×0.8×3+172.9×0.8+25.5×0.2×3+206.5×0.2-25(投资)=202.3万元
点3:15×0.8×3+105×0.8+15×0.2×3+105×0.2-10(投资)=140万元
点4:21.5×0.6×7年+29.5×0.4×7年=172.9万元
例: 某农业企业有耕地面积33.333公顷,可供灌水量6300立方米,在生产忙季可供工作日2800个,用于种植玉米、棉花和花生三种作物。预计三种作物每公顷在用水忙季用工日数、灌水量和利润见表,在完成16.5万公斤玉米生产任务的前提下,如何安排三种作物的种植面积,以获得最大的利润。
作物类别
忙季需工作日数
建设大工厂需要投资600万元,可使用10年。销路好每年赢利200万元,销路不好则亏损40万元。
建设小工厂投资280万元,如销路好,3年后扩建,扩建需要投资400万元,可使用7年,每年赢利190万元。不扩建则每年赢利80万元。如销路不好则每年赢利60万元。
试用决策树法选出合理的决策方案。 经过市场调查,市场销路好的概率为0.7,销路不好的概率为0.3。
甲
乙
丙
丁
需求量较高 需求量一般 需求量较低 需求量很低
600 400 -150 -350
800 350 -350 -700
350 220 50 -100
40求量一般
需求量较低
需求量很低
max
甲
600
400
-150
-350
600
乙
800
350
-350
-700
800
*
1
4
2
3
6
5
决策树

例如:某纺织企业生产一种新产品,有两种方案供选择: 建大厂或建小厂,使用期限均为10年,大厂投资500 万元,小厂投资120万元。每一方案的损益值、状态 及概率如下表:
单位:万元
状态 销路好
销路差
方案
P1=0.7 P2=0.3
建大厂
250
-20
建小厂
50
10
决策点 方案枝
决策树法
决策树的构成要素
用 表示,有几次决策,就有几个决策点
用 表示,从决策点引出的分枝,并与 状态结点相连,每一个分枝代表一个方案。
状态结点 用 表示,处于方案枝的末端,每一方案
都有可能面临几种自然状态,由此结点引出 各种状态。
概率枝
从状态结点引出的分枝,每一分枝代表 一种自然状态。每一种自然状态的概率 可以估算,并在概率枝上标出。
E小=E2-120=260(万元)
第三步:剪枝(由右向左,剪去劣势方案分枝, 保存优势方案分枝),方案优选过程。
因为E大大于E小,所以根据决策树法,决策 方案为建大厂。
1690 好 250
大厂-580 好 50
小厂-120 2
差 10
课堂作业题
1.在决策中,管理者需要对各种可能进行估计,这种决策 称为:( )
(2)应用决策树决策的步骤
第一步:绘制决策树
好 250
大厂-500
1 差 -20
I
好 50
小厂-120
2 差 10
第二步:计算每一个方案的期望值(有由右向 左进行)
E1=[250*0.7+(-20)*0.3]*10=1690(万 元)
E2=(50*0.7+10*0.3)*10=380(万元)
决策树法

决策树法(Decision Tree)决策树(decision tree)一般都是自上而下的来生成的。
每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵树的枝干,故称决策树。
决策树就是将决策过程各个阶段之间的结构绘制成一张箭线图,我们可以用下图来表示。
选择分割的方法有好几种,但是目的都是一致的:对目标类尝试进行最佳的分割。
从根到叶子节点都有一条路径,这条路径就是一条“规则”。
决策树可以是二叉的,也可以是多叉的。
对每个节点的衡量:1) 通过该节点的记录数2) 如果是叶子节点的话,分类的路径3) 对叶子节点正确分类的比例有些规则的效果可以比其他的一些规则要好。
决策树的构成要素[1]决策树的构成有四个要素:(1)决策结点;(2)方案枝;(3)状态结点;(4)概率枝。
如图所示:总之,决策树一般由方块结点、圆形结点、方案枝、概率枝等组成,方块结点称为决策结点,由结点引出若干条细支,每条细支代表一个方案,称为方案枝;圆形结点称为状态结点,由状态结点引出若干条细支,表示不同的自然状态,称为概率枝。
每条概率枝代表一种自然状态。
在每条细枝上标明客观状态的内容和其出现概率。
在概率枝的最末稍标明该方案在该自然状态下所达到的结果(收益值或损失值)。
这样树形图由左向右,由简到繁展开,组成一个树状网络图。
决策树对于常规统计方法的优缺点优点:1)可以生成可以理解的规则;2)计算量相对来说不是很大;3) 可以处理连续和种类字段;4) 决策树可以清晰的显示哪些字段比较重要。
缺点:1) 对连续性的字段比较难预测;2) 对有时间顺序的数据,需要很多预处理的工作;3) 当类别太多时,错误可能就会增加的比较快;4) 一般的算法分类的时候,只是根据一个字段来分类。
决策树的适用范围[1]科学的决策是现代管理者的一项重要职责。
我们在企业管理实践中,常遇到的情景是:若干个可行性方案制订出来了,分析一下企业内、外部环境,大部分条件是己知的,但还存在一定的不确定因素。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
决策树程序实验众所周知,数据库技术从20世纪80年代开始,已经得到广泛的普及和应用。
随着数据库容量的膨胀,特别是数据仓库以及web等新型数据源的日益普及,人们面临的主要问题不再是缺乏足够的信息可以使用,而是面对浩瀚的数据海洋如何有效地利用这些数据。
从数据中生成分类器的一个特别有效的方法是生成一个决策树(Decision Tree)。
决策树表示方法是应用最广泛的逻辑方法之一,它从一组无次序、无规则的事例中推理出决策树表示形式的分类规则。
决策树分类方法采用自顶向下的递归方式,在决策树的内部结点进行属性值的比较并根据不同的属性值判断从该结点向下的分支,在决策树的叶结点得到结论。
所以从决策树的根到叶结点的一条路径就对应着一条合取规则,整棵决策树就对应着一组析取表达式规则。
决策树是应用非常广泛的分类方法,目前有多种决策树方法,如ID3、CN2、SLIQ、SPRINT等。
一、问题描述相关信息决策树是一个类似于流程图的树结构,其中每个内部结点表示在一个属性上的测试,每个分支代表一个测试输入,而每个树叶结点代表类或类分布。
数的最顶层结点是根结点。
一棵典型的决策树如图1所示。
它表示概念buys_computer,它预测顾客是否可能购买计算机。
内部结点用矩形表示,而树叶结点用椭圆表示。
为了对未知的样本分类,样本的属性值在决策树上测试。
决策树从根到叶结点的一条路径就对应着一条合取规则,因此决策树容易转化成分类规则。
图1ID3算法:■决策树中每一个非叶结点对应着一个非类别属性,树枝代表这个属性的值。
一个叶结点代表从树根到叶结点之间的路径对应的记录所属的类别属性值。
■每一个非叶结点都将与属性中具有最大信息量的非类别属性相关联。
■采用信息增益来选择能够最好地将样本分类的属性。
信息增益基于信息论中熵的概念。
ID3总是选择具有最高信息增益(或最大熵压缩)的属性作为当前结点的测试属性。
该属性使得对结果划分中的样本分类所需的信息量最小,并反映划分的最小随机性或“不纯性”。
问题重述1、目标概念为“寿险促销”2、计算每个属性的信息增益3、确定根节点的测试属性模型求解构造决策树的方法是采用自上而下的递归构造,其思路是:■以代表训练样本的单个结点开始建树(步骤1)。
■如果样本都在同一类,则该结点成为树叶,并用该类标记(步骤2和3)。
■否则,算法使用称为信息增益的机遇熵的度量为启发信息,选择能最好地将样本分类的属性(步骤6)。
该属性成为该结点的“测试”或“判定”属性(步骤7)。
值得注意的是,在这类算法中,所有的属性都是分类的,即取离散值的。
连续值的属性必须离散化。
■对测试属性的每个已知的值,创建一个分支,并据此划分样本(步骤8~10)。
■算法使用同样的过程,递归地形成每个划分上的样本决策树。
一旦一个属性出现在一个结点上,就不必考虑该结点的任何后代(步骤13)。
■递归划分步骤,当下列条件之一成立时停止:(a)给定结点的所有样本属于同一类(步骤2和3)。
(b)没有剩余属性可以用来进一步划分样本(步骤4)。
在此情况下,采用多数表决(步骤5)。
这涉及将给定的结点转换成树叶,并用samples中的多数所在类别标记它。
换一种方式,可以存放结点样本的类分布。
没有样本。
在这种情况下,以samples中的多数(c)分支test_attribute=ai类创建一个树叶(步骤12)。
算法Decision_Tree(samples,attribute_list)输入由离散值属性描述的训练样本集samples;候选属性集合attribute_list。
输出一棵决策树。
(1)创建节点N;(2)If samples 都在同一类C中then(3)返回N作为叶节点,以类C标记;(4) If attribute_list为空then(5)返回N作为叶节点,以samples 中最普遍的类标记;quals("")) { StringTokenizer tokenizer = new StringTokenizer(str);while ()) {());}}return candAttr;}/*** 读取训练元组* @return 训练元组集合* @throws IOException*/public ArrayList<ArrayList<String>> readData() throws IOException { ArrayList<ArrayList<String>> datas = new ArrayList<ArrayList<String>>();BufferedReader reader = new BufferedReader(new InputStreamReader);String str = "";while (!(str = ()).equals("")) {StringTokenizer tokenizer = new StringTokenizer(str);ArrayList<String> s = new ArrayList<String>();while ()) {());}(s);}return datas;}/*** 递归打印树结构* @param root 当前待输出信息的结点*/public void printTree(TreeNode root){"name:" + ());ArrayList<String> rules = ();"node rules: {");for (int i = 0; i < (); i++) {+ " ");}"}");"");ArrayList<TreeNode> children = ();int size =();if (size == 0) {"-->leaf node!<--");} else {"size of children:" + ());for (int i = 0; i < (); i++) {"child " + (i + 1) + " of node " + () + ": ");printTree(i));}}}/*** 主函数,程序入口* @param args*/public static void main(String[] args) {TestDecisionTree tdt = new TestDecisionTree();ArrayList<String> candAttr = null;ArrayList<ArrayList<String>> datas = null;try {"请输入候选属性");candAttr = ();"请输入训练数据");datas = ();} catch (IOException e) {();}DecisionTree tree = new DecisionTree();TreeNode root = (datas, candAttr);(root);}}package DecisionTree;import * 选择最佳分裂属性*/public class Gain {private ArrayList<ArrayList<String>> D = null; et(attrIndex);if (!(r)) {(r);}}return values;}/*** 获取指定数据集中指定属性列索引的域值及其计数* @param d 指定的数据集* @param attrIndex 指定的属性列索引* @return 类别及其计数的map*/public Map<String, Integer> valueCounts(ArrayList<ArrayList<String>> datas, int attrIndex){Map<String, Integer> valueCount = new HashMap<String, Integer>();String c = "";ArrayList<String> tuple = null;for (int i = 0; i < (); i++) {tuple = (i);c = (attrIndex);if (c)) {(c, (c) + 1);} else {(c, 1);}}return valueCount;}/*** 求对datas中元组分类所需的期望信息,即datas的熵* @param datas 训练元组* @return datas的熵值*/public double infoD(ArrayList<ArrayList<String>> datas){double info = ;int total = ();Map<String, Integer> classes = valueCounts(datas, ());Iterator iter = ().iterator();Integer[] counts = new Integer[()];for(int i = 0; (); i++){entry = ();Integer val = (Integer) ();counts[i] = val;}for (int i = 0; i < ; i++) {double base = (counts[i], total, 3);info += (-1) * base * (base);}return info;}/*** 获取指定属性列上指定值域的所有元组* @param attrIndex 指定属性列索引* @param value 指定属性列的值域* @return 指定属性列上指定值域的所有元组*/public ArrayList<ArrayList<String>> datasOfValue(int attrIndex, String value){ArrayList<ArrayList<String>> Di = new ArrayList<ArrayList<String>>();ArrayList<String> t = null;for (int i = 0; i < (); i++) {t = (i);if(attrIndex).equals(value)){(t);}}return Di;}/*** 基于按指定属性划分对D的元组分类所需要的期望信息* @param attrIndex 指定属性的索引* @return 按指定属性划分的期望信息值*/public double infoAttr(int attrIndex){double info = ;ArrayList<String> values = getValues(D, attrIndex);for (int i = 0; i < (); i++) {ArrayList<ArrayList<String>> dv = datasOfValue(attrIndex, (i));info += (), (), 3), infoD(dv));}return info;}/*** 获取最佳分裂属性的索引* @return 最佳分裂属性的索引*/public int bestGainAttrIndex(){int index = -1;double gain = ;double tempGain = ;for (int i = 0; i < (); i++) {tempGain = infoD(D) - infoAttr(i);if (tempGain > gain) {gain = tempGain;index = i;}}return index;}}package DecisionTree;import .*;/*** 决策树构造类*/public class DecisionTree {private Integer attrSelMode; terator();for(int i = 0; (); i++){entry = ();String key = (String)();Integer val = (Integer) ();if(val > max){max = val;maxC = key;}}return maxC;}/*** 构造决策树* @param datas 训练元组集合* @param attrList 候选属性集合* @return 决策树根结点*/public TreeNode buildTree(ArrayList<ArrayList<String>> datas, ArrayList<String> attrList){emove(bestAttrIndex);}if () == 0) {TreeNode leafNode = new TreeNode();(maxC);(di);(attrList);().add(leafNode);} else {TreeNode newNode = buildTree(di, attrList);().add(newNode);}}return node;}}package DecisionTree;importpublic class DecimalCalculate {/*** 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精* 确的浮点数运算,包括加减乘除和四舍五入。