网站首页 / 育儿 / 正文

决策树代码实现(决策树算法测试代码)

时间:2022-04-14 18:40:09 浏览:5070次 作者:用户投稿 【我要投诉/侵权/举报 删除信息】

多条告白如次剧本只需引入一次

本教程引见了用来分门别类的计划树,即分门别类树,囊括分门别类树的构造,分门别类树怎样举行猜测,运用scikit-learn结构分门别类树,以及超参数的安排。

本教程精细引见了计划树的处事道理

因为百般因为,计划树一种时髦的监视进修本领。计划树的便宜囊括,它既不妨用来回归,也可用来分门别类,容易证明而且不须要特性缩放。它也有少许缺陷,比方简单过拟合。本教程引见了用来分门别类的计划树,也被称为分门别类树。

除此除外,本教程还将涵盖:

分门别类树的构造(树的深度,根节点,计划节点,叶节点/结尾节点)分门别类树怎样举行猜测怎样经过Python中的scikit-learn结构计划树超参数安排与平常一律,本教程顶用到的代码不妨在我的github(构造,猜测)中找到,咱们发端吧!

什么是分门别类树?

分门别类和回归树(CART)是由Leo Breiman引入的,用一种于处置分门别类或回归猜测建立模型题目的计划树算法。正文只引见分门别类树。

分门别类树

从实质上讲,分门别类树将分门别类变化为一系列题目。下图是在IRIS数据集(花草品种)上演练的一个分门别类树。根节点(棕色)和计划节点(蓝色)中包括了用来分割子节点的题目。根节点即为最尖端的计划节点。换句话说,它即是你遍历分门别类树的开始。叶子节点(绿色),也叫作结尾节点,它们不复分割成更多节点。在叶节点处,经过普遍开票确定分门别类。

将三个花草种类(IRIS数据集)逐一举行分门别类的分门别类树

怎样运用分门别类树

运用分门别类树,要从根节点(棕色)发端,逐层遍历整棵树,直到达到叶节点(结尾节点)。如次图所示的分门别类树,假如你有一朵花瓣长度为4.5cm的花,想对它举行分门别类。开始从根节点发端,先回复“花瓣长度(单元:cm)≤ 2.45吗?”由于宽窄大于2.45,以是回复否。而后加入下一个计划节点,回复“花瓣长度(单元:cm)≤ 4.95吗?”。谜底为是,以是你不妨猜测这朵花的种类为变色鸢尾(versicolor)。这即是一个大略的例子。

分门别类树怎样成长(非数学版)

分门别类树从数据国学到了一系列“即使…那么…”的题目,个中每个题目都波及到一个特性和一个分隔节点。从下图的限制树(A)可看出,题目“花瓣长度(单元:cm)≤ 2.45”将数据鉴于某个值(本例中为2.45)分红两个局部。这个数值叫作分隔点。对分隔点而言,一个好的值(使得消息增值最大)可将类与类之间分摆脱。查看下图中的B局部可知,坐落分隔点左侧的一切点都被归为山鸢尾类(setosa),右侧的一切点则被归为变色鸢尾类(versicolor)。

从图中可看出,山鸢尾类(setosa)中一切的38个点都已被精确分门别类。它是一个纯节点。分门别类树在纯节点上不会分割。它不复爆发消息增值。然而不纯节点不妨进一步分割。查看图B的右侧可知,很多点被缺点归类到了变色鸢尾类(versicolor)。换而言之,它包括了分属于两个各别类(setosa和versicolor)的点。分门别类树是个贪心算法,这表示着它会默许从来分割直到获得纯节点。并且,该算法会为不纯节点采用最好分隔点(咱们会鄙人节引见数学本领)。

在上海图书馆中,树的最大深度为2。树的深度是对一棵树在举行猜测之前可分割度数的襟怀。树可举行屡次分割,直到树的纯度越来越高。屡次反复此进程,会引导树的深度越来越大,节点越来越多。这会惹起对演练数据的过拟合。倒霉的是, 大普遍分门别类树的实行都承诺遏制树的最大深度,进而缩小过拟合。换而言之,不妨经过树立计划树的最大深度进而遏止树的成长胜过某个一定深度。可经过下图直觉地领会最大深度。

采用规则

本节回答了消息增值、基尼指数和熵是怎样计划出来的。

在本节,你不妨领会到什么是分门别类树中根节点/计划节点的最好分隔点。计划树在某个特性和对立应的分隔点长进行分割,进而按照给定的规则(本例中为基尼指数或熵)爆发最大的消息增值(IG)。不妨将消息增值大略设置为:

IG = 分割前的消息(父) – 分割后的消息(子)

经过下图的计划树,咱们不妨更明显的领会父与子。

下图为更精确的消息增值公式。

由于分门别类树是二元分割,上述公式不妨简化为以次公式。

基尼指数和熵是两个用来测量节点不纯度的常用规则。

为了更好的领会那些公式,下图展现了怎样运用基尼指数规则计划计划树的消息增值。

下图展现了怎样运用熵来计划计划树的消息增值。

我不安排对详细举行过多的阐明,然而你该当领会,各别的不纯度襟怀(基尼指数和熵)常常会爆发一致的截止。下图就展现了基尼指数和熵是极端一致的不纯度襟怀。我探求,基尼指数之以是是scikit-learn的默许值,是由于熵的计划进程略慢少许(由于它运用了对数)。

各别的不纯度襟怀(基尼指数和熵)常常会爆发一致的截止。感动Data Science StackExchange 和 Sebastian Raschka为本图供给的灵感。

在中断本节之前,我应证明,百般计划树算法相互各别。比拟时髦的算法有ID3,C4.5和CART。Scikit-learn运用了CART算法的优化本子。你不妨点击此处领会它的功夫搀杂度。

运用Python实行分门别类树

咱们在上节引见了分门别类树的表面。之以是须要进修怎样运用某个编制程序谈话来实行计划树,是由于处置数据不妨扶助咱们来领会算法。

加载数据

Iris数据集是scikit-learn自带的数据集之一,不须要从外部网站载入。经过下列代码载入数据。

import pandas as pdfrom sklearn.datasets import load_irisdata = load_iris()df = pd.DataFrame(data.data, columns=data.feature_names)df['target'] = data.target原始Pandas df(特性和目的)

将数据分别为演练集和尝试集

下述代码将75%的数据分别到为演练集,25%的数据分别到尝试汇合。

X_train, X_test, Y_train, Y_test = train_test_split(df[data.feature_names], df['target'], random_state=0)图中的脸色标明了数据框df中的数据分别到了哪类(X_train, X_test, Y_train, Y_test)变量

提防,计划树的便宜之一是,你不须要规范化你的数据,这与PCA和论理回归各别,没有规范化的数据对它们的感化特殊大。

Scikit-learn建立模型的四个办法

第一步:导出你想运用的模子

在scikit-learn中,一切的呆板进修模子都被封装为Python中的类。

from sklearn.tree import DecisionTreeClassifier第二步:结构模子的范例

鄙人列代码中,我经过设定max_depth=2来预剪枝我的树,进而保证它的深度不会胜过2。请提防,这个教程的下一节将引见怎样为你的树采用适合的max_depth值。

还需提防,鄙人列代码中,我设定random_state=0,以是你也不妨获得和我一律的截止。

clf = DecisionTreeClassifier(max_depth = 2, random_state = 0)第三步:鉴于数据演练模子

该模子将进修X (sepal length, sepal width, petal length, and petal width) 和 Y(species of iris)之间的联系。

clf.fit(X_train, Y_train)第四步:猜测未知(尝试)数据的标签

# Predict for 1 observationclf.predict(X_test.iloc[0].values.reshape(1, -1))# Predict for multiple observationsclf.predict(X_test[0:10])请记取,猜测不过叶节点中范例的普遍类。

评价模子本能

纵然有很多评价模子本能的办法(精度,调回率,F1得分,ROC弧线等),咱们仍旧维持大略的基调,运用精确率动作评价的规范。

精确率的设置为:(精确猜测的比率):精确猜测的数目/总额据量

# The score method returns the accuracy of the modelscore = clf.score(X_test, Y_test)print(score)安排树的深度

探求max_depth最优值的进程即是安排模子的进程。下列代码输入了各别max_depth值所对应的计划树的精确率。

# List of values to try for max_depth:max_depth_range = list(range(1, 6))# List to store the accuracy for each value of max_depth:accuracy = []for depth in max_depth_range: clf = DecisionTreeClassifier(max_depth = depth, random_state = 0)clf.fit(X_train, Y_train) score = clf.score(X_test, Y_test) accuracy.append(score)由下图可看出,当max_depth的值大于或即是3时,模子的精确率最高,以是采用max_depth=3,在精确率同样高的情景下,模子的搀杂度最低。

采用max_depth=3由于此时模子的透彻率高且搀杂度较低。

你须要牢记,max_depth和计划树的深度并不是一回事。Max_depth是对计划树举行预剪枝的一个本领。换而言之,即使一棵树在某个深度纯度仍旧充满高,将会遏止分割。下图辨别展现了当max_depth的值为3,4,5时的计划树。由下图可知,max_depth为4和5时的计划树是如出一辙的。它们的深度沟通。

请查看咱们是怎样获得两棵如出一辙的树

即使想领会你演练的计划树的深度是几何,不妨运用get_depth本领。除此除外,不妨经过get_n_leaves本领获得叶子节点的数目。

纵然本教程仍旧引见了少许采用规则(基尼指数,熵等)和树的max_depth,请记取你也不妨安排要分割的节点的最小样品(min_samples_leaf),最大叶子节点数目(max_leaf_nodes)等。

特性要害性

分门别类树的便宜之一是,它们对立容易证明。鉴于scikit-learn的分门别类树不妨计划出特性的要害性,即在给定特性上分割而引导基尼指数或熵减小的总量。Scikit-learn对每个特性输入一个0和1之间的数值。一切特性的要害性之和为1。下列代码展现了在计划树模子中每个特性的要害性。

importances = pd.DataFrame({'feature':X_train.columns,'importance':np.round(clf.feature_importances_,3)})importances = importances.sort_values('importance',ascending=False)在上述例子中(iris的某个一定的演练集尝试集分别),花瓣宽窄的特性要害性权重最高。咱们不妨经过查看相映的计划树来确认。

这个计划树仅鉴于两个特性举行分割,辨别是花瓣宽窄(单元:cm)和花瓣长度(单元:cm)

请提防,即使一个特性的要害性分值较低,也并不表示着这个特性对猜测而言不要害,不过证明在树的较早阶段,它未被采用到。该特性也大概与另一个消息量较高的特性实足沟通或莫大关系。特性要害性值不许证明它们对哪个类型具备很好的猜测性,也不会证明大概感化猜测的特性之间的联系。要提防的是,在举行穿插考证或一致的考证时,不妨运用来自各别演练集尝试集分别的特性要害性值的平衡值。

版权声明:
本文内容由互联网用户自发贡献,该文观点仅代表作者本人,因此内容不代表本站观点、本站不对文章中的任何观点负责,内容版权归原作者所有、内容只用于提供信息阅读,无任何商业用途。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站(文章、内容、图片、音频、视频)有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至353049283@qq.com举报,一经查实,本站将立刻删除、维护您的正当权益。