楼主: 时光永痕
662 0

[数据挖掘新闻] 有关从头开始使用Python实现的决策树的全部信息 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

68%

威望
0
论坛币
26 个
通用积分
49.7576
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-28

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有关从头开始使用Python实现的决策树的全部信息
如果您看到了,您会发现今天,集成学习在Kaggle上更受行业和排名者的欢迎和使用。自举聚合,随机森林,梯度提升,XGboost都是非常重要且广泛使用的算法,要详细了解它们,需要深入了解决策树。在本文中,我们将仅讨论这一点。无需进一步说明,让我们直接研究一下。
表中的内容
决策树简介
决策树的类型
如何从数据构建决策树
避免过度适合决策树
决策树的优缺点
使用Python实施决策树
决策树简介
?F ormally决策树是一个决策的所有可能的解决方案的图形表示。如今,在监督学习场景下,基于树的算法是最常用的算法。它们更易于解释和可视化,适应性强。我们可以将基于树的算法用于回归和分类问题,但是,大多数时候它们都用于分类问题。
让我们从一个示例中了解一个决策树:昨天晚上,由于我忙于处理一些事情,所以我通常不参加晚餐。晚上晚些时候,我感到肚子里有蝴蝶。我以为只有不饿,我可以照原样睡觉,但事实并非如此,我决定吃点东西。我有两种选择,可以从外面点菜或自己做饭。
我确定如果订购的话,我将不得不至少节省250印度卢比。我终于决定订购它,因为已经很晚了,而且我没有做饭的心情。完整的事件可以用图形表示,如下图所示。
决策树
这种表示不过是决策树。
与决策树相关的术语
决策树
父节点:在任何两个连接的节点中,层次较高的一个是父节点。
子节点:在任何两个连接的节点中,层次较低的一个是子节点。
根节点:树从其开始的起始节点,它只有子节点。根节点没有父节点。(上图中的深蓝色节点)
叶子节点/叶子:树尾没有任何子节点的节点是叶子节点或简称为叶子。(上图中的绿色节点)
内部节点/节点:根节点和叶节点之间的所有节点都是内部节点或简称为节点。内部节点有一个父节点和至少一个子节点。(上图中的红色节点)
拆分:将一个节点划分为两个或多个太阳节点,或向一个节点添加两个或多个子节点。
决策节点:当父节点拆分为两个或更多子节点时,该节点称为决策节点。
修剪:当我们删除决策节点的子节点时,称为修剪。您可以将其理解为拆分的相反过程。
分支/子树:整个树的子部分称为分支或子树。
决策树的类型
回归树
阿当因变量是回归树用于连续。叶节点在训练数据中获得的值是该区域内观测值的平均响应。因此,如果看不见的数据观测值落在该区域中,则将使用平均值进行预测。这意味着即使训练数据中的因变量是连续的,它也只会在测试集中采用离散值。回归树遵循自上而下的贪婪方法。
分类树
阿当因变量是分类树被用于分类。叶节点在训练数据中获得的值是该区域内观测值的模式响应。它遵循自上而下的贪婪方法。
它们一起被称为CART(分类和回归树)
根据数据构建决策树
决策树
^ h OW创建从表格数据一棵树?应该选择哪个功能作为根节点?应该在什么基础上拆分节点?对于所有这些问题,答案在本节中
进行战略分割的决定会严重影响一棵树的准确性。每次拆分后,节点的纯度应相对于目标变量增加。决策树在所有可用变量上拆分节点,然后选择拆分,从而生成大多数同构子节点。
以下是最常用的分割算法
1.基尼杂质
基尼说,如果我们从总体中随机选择两个项目,那么它们必须属于同一类别,如果总体是纯的,则概率为1。
它与分类目标变量“成功”或“失败”一起使用。
它仅执行二进制分割
基尼值越高,同质性越高。
CART(分类和回归树)使用Gini方法创建二进制拆分。
计算拆分的基尼杂质的步骤
使用公式从一个中减去成功和失败的概率平方之和,计算子节点的Gini杂质。
1-(p2+q2)
,其中p = P(成功)&q = P(失败)
使用该拆分的每个节点的加权Gini分数计算拆分的Gini
选择拆分中具有最小基尼杂质的特征。
2.卡方
它是一种算法,用于找出子节点与父节点之间的差异之间的统计显着性。我们通过观察和预期目标变量频率之间的标准化差的平方和来度量它。
它与分类目标变量“成功”或“失败”一起使用。
它可以执行两个或多个拆分。
卡方值越高,子节点和父节点之间差异的统计显着性越高。
使用公式计算每个节点的卡方,
卡方=((实际-预期)2/预期)1/ 2
它生成一个称为CHAID(卡方自动互动检测器)的树
计算拆分的卡方的步骤:
通过计算成功和失败的偏差来计算单个节点的卡方
使用拆分的每个节点的成功和失败的所有卡方的总和来计算拆分的卡方
选择最大卡方的分割。
3.信息获取
杂质较少的节点需要较少的信息来描述它,杂质较多的节点需要更多的信息。信息论是在称为熵的系统中定义这种混乱程度的一种措施。如果样本完全均匀,则熵为零;如果样本均分(50%— 50%),则熵为1。熵的计算如下。
决策树-熵
计算拆分熵的步骤:
计算父节点的熵
计算拆分的每个单独节点的熵,并计算拆分中可用的所有子节点的加权平均值。熵越小越好。
如下计算信息增益,并选择具有最高信息增益的节点进行拆分
图片发布
4.减少方差
到目前为止,我们已经讨论了分类目标变量的算法。方差减少是用于连续目标变量(回归问题)的算法。
用于连续变量
该算法使用标准方差公式选择最佳分割。
选择方差较小的分割作为分割总体的标准
计算方差的步骤:
计算每个节点的方差。
图片发布
计算每个拆分的方差作为每个节点方差的加权平均值。
选择方差较小的节点作为分割条件。
综上所述:
图片发布
在实践中,大部分时间都使用Gini杂质,因为它给出了良好的拆分结果,并且计算成本不高。让我们用笔和纸搭建一棵树。我们在下面有一个虚拟数据集,特征(X)是胸痛,血液循环良好,动脉阻塞,并且要预测的列是心脏病(y)。每列都有两个可能的选项,是和否。
我们的目标是建立一个决策树,在此树上,我们会得到有关胸痛,血液循环和动脉阻塞的新记录,我们应该能够判断出该人是否患有心脏病。首先,我们所有的样本都在根节点中。我们必须决定应首先分割根节点的特征。
图片发布
我们将首先关注心脏病随着胸痛的改变(忽略良好的血液循环和动脉)。虚拟数字如下所示
图片发布
同样,我们根据良好的沟通进行划分,如下图所示。
图片发布
并且关于动脉阻塞如下图。
图片发布
下图将所有三个拆分都放在一个位置。我们可以观察到,对于心脏病来说,单独对任何特征进行分割都不是很大,是或否,这意味着其中一个可以是根节点,但不是完整的树,我们将不得不再次将其分解希望更好地分裂。
图片发布
为了确定根节点应该分割为哪一个特征,我们需要计算所有叶节点的基尼杂质,如下所示。在计算叶节点后,我们将其加权平均值用于获得有关父节点的Gini杂质。
图片发布
我们对所有三个功能都执行此操作,并选择一个具有最小Gini杂质的功能,因为它以三种方式中的最佳方式分割了数据集。因此,我们选择良好的血液循环作为根结点。
图片发布
现在,我们对血液循环良好的子节点执行相同的操作。在下面的图片中,我们将根据阻塞的动脉将左孩子分为164个样本,因为其基尼杂质小于胸痛(我们使用与上述相同的公式再次计算基尼系数,只是样本的一小部分- 164)。
图片发布
下图中要注意的一件事是,当我们尝试根据胸痛分裂阻塞的右动脉子女时,基尼系数为0.29,而阻塞的树本身的右子女基尼系数为0.20。这意味着进一步拆分该节点不会改善杂质。所以这将是一个叶节点。
图片发布
我们对所有节点重复相同的过程,然后得到以下树。这看起来很适合我们的训练数据。
图片发布
这就是我们根据数据创建树的方式。如果我们有一个带有数值的列该怎么办?很简单,按升序排列。计算每两个连续数字的平均值。在此基础上进行分割,并使用相同的方法计算基尼杂质。我们一如既往地选择基尼杂质最少的拆分。
图片发布
如果我们对数据集中的数字列进行了排名,则将对每个等级进行分割,并为每个分割计算基尼杂质,然后选择基尼杂质最少的杂质。
图片发布
如果我们在数据集中有分类选择,则需要对选择的每种可能组合进行拆分和基尼杂质计算
图片发布
避免在决策树中过度拟合
O拟合是基于树的算法中的关键挑战之一。如果未设置限制,它将给出100%的拟合度,因为在最坏的情况下,最终将为每个观察值创建一个叶节点。因此,我们需要采取一些预防措施以避免过度拟合。它主要通过两种方式完成:
对树大小设置约束
修剪树木
让我们简要地讨论这两个。
在树大小上设置约束
参数在树建模中起重要作用。通过使用用于定义树的各种参数,可以避免过度拟合。
节点拆分的最小样本
定义要考虑拆分的节点中所需的最少观察数。(这确保了上述最坏情况)。
较高的此参数值会阻止模型学习可能对于特定于为树选择的特定样本高度特定的关系。
值太高会导致拟合不足,因此应使用交叉验证对其进行适当调整。
叶节点的最小样本
定义叶子中所需的最小观测值。(这同样可以防止最坏的情况发生)
通常,对于阶级不平衡的问题,应选择较低的值,因为少数派占多数的地区的规模较小。
树的最大深度(垂直深度)
随着深度的增加,用于控制过度拟合将允许模型学习非常特定于特定样本的关系。
应该使用交叉验证正确调整,因为太低的高度会导致拟合不足。
最大叶节点数
一棵树中叶节点或叶的最大数量。
可以代替max_depth进行定义。由于创建了二叉树,深度为n会产生最多的2^n叶子。
要考虑的最大功能
搜索最佳分割时要考虑的功能数量。这些将是随机选择的。
作为一个经验法则,要素总数的平方根很有效,但我们最多应检查要素总数的30–40%。
较高的值可能导致过度拟合,但要视情况而定。
图片发布
修剪
回想一下术语,修剪与拆分相反。现在,我们看情况到底如何。让我们看下面的例子,其中将药物效力与药物剂量作图。所有红点都是训练数据集。我们可以看到,对于非常小和非常大的剂量,药物有效性几乎可以忽略不计。在10–20mg之间,几乎100%,然后在20到30之间逐渐减少。
图片发布
我们为一棵树建模,得到以下结果。我们在三个地方进行了分割,并得到了4个叶节点,当我们增加时,它们的输出分别为0(y):0–10(X),100:10–20、70:20–30、0:30–40剂量。非常适合训练数据集,为节点输出黑色水平线。
图片发布
让我们在训练数据集上对其进行测试(下图中的蓝点是测试数据集)。这对于测试数据是不合适的。良好适合训练数据而不适用于测试数据意味着过度拟合。
图片发布
为了克服树的过拟合问题,我们决定在中间合并两个线段,这意味着从树中删除两个节点,如您在下图中看到的(上面带有红叉的节点被删除)。现在我们再次将此树拟合到训练数据集上。现在,这棵树不太适合训练数据。
图片发布
但是,当我们引入测试数据时,它的性能比以前更好。
图片发布
这基本上是修剪。使用修剪,我们可以避免过度拟合训练数据集。
决策树的优缺点
决策树的优势
易于可视化和解释:其图形表示非常直观,不需要任何统计知识即可解释。
在数据探索中很有用:我们可以轻松地通过决策树确定最重要的变量以及变量之间的关系。它可以帮助我们创建新变量或将某些功能放在一个存储桶中。
所需的数据清除次数更少:它可以不受异常值和丢失数据的影响,因此需要的数据清除次数也更少。
数据类型不是约束:它可以处理分类数据和数字数据。
决策树的缺点
过度拟合:单个决策树往往会过度拟合数据,这可以通过在模型参数上设置约束来解决,例如树的高度和修剪(我们将在本文稍后详细讨论)
不完全适合连续数据:将数字变量分为不同类别时,它会丢失一些与数字变量相关的信息。
使用Python实施决策树
在本节中,我们将看到如何使用python实现决策树。我们将使用著名的IRIS数据集。目的是,如果我们向该分类器提供任何新数据,则它应能够相应地预测正确的分类。
您可以在此处获取此实现的完整代码
导入所需的库并读取数据
第一件事是导入所有必需的库和类。
将熊猫作为pd导入
将numpy导入为np
导入matplotlib.pyplot作为plt
将seaborn导入为sns
%matplotlib内联#用于编码
从sklearn.preprocessing导入LabelEncoder #用于火车测试拆分
从sklearn.model_selection导入train_test_split #用于决策树对象
从sklearn.tree导入DecisionTreeClassifier #用于检查测试结果
从sklearn.metrics导入category_report,confusion_matrix #用于可视化树
从sklearn.tree导入plot_tree
现在加载数据集。IRIS数据集也可以从seaborn库中获得。您可以使用以下命令将其导入
#读取数据
df = sns.load_dataset('iris')
df.head()
图片发布
您应该能够获得上述数据。在这里,我们有4个特征列sepal_length,sepal_width,花瓣长度和花瓣宽度以及一个目标列种类。
EDA
现在对其执行一些基本操作。
#获取数据集信息
df.info()
图片发布
df.shape
图片发布
图片发布
我们知道该数据集具有150条记录,5列,其中前四列为float类型,最后四列为object str类型,并且以下命令没有NAN值
df.isnull()。any()
图片发布
现在,我们对该数据集执行一些基本的EDA。让我们检查所有功能之间的相关性
#让我们绘制一对图以一次可视化所有属性
sns.pairplot(数据= df,色相='种')
决策树
我们共有3种我们要预测的物种:setosa,versicolor和virginica。我们可以看到setosa总是与其他两个形成不同的集群。
#相关矩阵
sns.heatmap(df.corr())
决策树
我们可以从以上两个图中观察到:
Setosa总是形成不同的集群。
花瓣长度与花瓣宽度高度相关。
隔片的长度与隔片的宽度无关。
数据预处理
现在,我们将目标变量(y)和特征(x)分开,如下所示
目标= df ['种']
df1 = df.copy()
df1 = df1.drop('species',axis = 1)
最好不要在原始数据集中删除或添加新列。对其进行复制,然后进行修改,以防万一我们无法正常工作,我们将使用不同的方法重新开始原始数据。
只是为了遵循最常用的约定,我们将其存储df在X
#定义属性
X = df1
现在让我们看一下目标变量
目标
决策树
target 其中存储有分类变量,我们将其编码为数字值以便工作。
#label编码
le = LabelEncoder()
目标= le.fit_transform(目标)
目标
图片发布
我们得到上面的编码,setosa:0,versicolor:1,virginica:2
再次,为了遵循以下标准命名约定,命名target为y
y =目标
将数据集分为训练和测试集。随机选择20%记录进行测试
#拆分数据-80:20的比例
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 42)print(“ Training split input-”,X_train.shape)
print(“ Testing split input-”,X_test.shape)
决策树
分割数据集后,我们有120条记录(行)用于训练,有30条记录用于测试。
建模树并对其进行测试
#定义决策树算法dtree = DecisionTreeClassifier()
dtree.fit(X_train,y_train)print('决策树分类器已创建')
在上面的代码中,我们创建了类的对象DecisionTreeClassifier,并将其地址存储在变量中dtree,因此我们可以使用来访问该对象dtree。然后我们用X_train和拟合这棵树y_train。最后,我们Decision Tree Classifier Created在构建决策树后打印语句。
#预测测试数据的值
y_pred = dtree.predict(X_test)
打印(“分类报告-\ n”,category_report(y_test,y_pred))
决策树
我们在30条记录的测试数据集中的准确性为100%。
让我们如下绘制混淆矩阵
cm = confusion_matrix(y_test,y_pred)
plt.figure(figsize =(5
plt.xlabel('预测的标签')all_sample_title ='准确性得分:{0}'。format(dtree.score(X_test,y_test))
plt.title(all_sample_title,size = 15)
决策树
可视化决策树
我们可以使用以下命令直接绘制我们构建的树
#在不使用graphviz plt.figure(figsize =(20
dec_tree = plot_tree(decision_tree = dtree,feature_names = df1.columns,
                     class_names = [“ setosa”,“ vercicolor”,“ verginica”],填充= True,精度= 4,四舍五入= True)
决策树
我们可以看到树是如何分割的,节点的gini是什么,这些节点中的记录及其标签。
除非明确注明,否则所有图片均来自作者。
如果您想使用seaborn或EDA学习可视化的基础知识,可以在这里找到它-
使用Seaborn和Matplotlib进行数据可视化简介
Scratch的EDA:动手指南
除非注明出处,否则所有图片均来自作者
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 决策树 classifier Matplotlib Processing

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-5 16:54