从零开始用例子解释决策树。
从零开始用例子解释决策树。
决策树 是数据科学领域中流行使用的模型之一。决策树也称为管理工具,管理人员必须根据理性决策做出决策。它是一种用于分类和回归问题的监督机器学习算法。
大多数情况下,决策树用于分类问题,例如二元分类( 例子- 贷款申请人是否违约 )。它也可以用于多类分类。
决策树算法是其中的一部分 监督学习 取因变量和自变量,试图找出自变量和因变量之间的关系,并将其表示为树形结构。
在决策树中,使用类似树结构的流程图,它显示基于拆分的预测,它从根节点开始,到叶节点结束。
让我们通过拆分节点来了解决策树是如何工作的,假设我们得到了一个关于汽车的数据,我们的目标是找出模式存在于 马力、重量和车型 .我们的目标变量将是 车型 具有二进制值 大号 和 小号 .( 图-A )
现在,决策树所做的是它获取我们的数据集并在这个数据集上应用函数,给出为( 重量 >2000 ),在此基础上,我们的表将与数据分叉为 2 个不同的表,其中第一个表的权重超过 2000,另一个表的权重小于 2000。
我们的目标是拥有 叶节点 我们的 车型 变得完全 **** 同质的,要达到那个级别,这棵树会进一步分布我们的数据 马力 之后我们可以在下表中看到我们的数据进一步不需要拆分,因为它是完全同质的。因此,我们的决策树以同样的方式工作。
Figure-A
如果允许决策树增长到最大深度,决策树通常会遇到过度拟合的问题。
当我们将决策树增长到其深度时,我们得到 低偏差和高方差 ,我们可以说我们的模型将在训练数据集上表现完美,但是它的效率落在测试数据集上。
防止决策树也称为 贪心模型 从过拟合开始,我们应用正则化,这是一种控制其过拟合行为的方法。
在决策树中,目标列的杂质/纯度表示的损失函数。损失函数有助于减少目标柱的杂质,即通过增加目标柱的同质性。
要了解损失函数,我们需要了解它如何估算目标列的纯度/杂质。有两种测量杂质的方法。
- 熵:- 熵是从物理学中借来的,在决策树中,熵主要用于选择最佳拆分器,它可以帮助我们衡量拆分的纯度。一个 纯分裂 意味着要么你应该得到 是的 或者 不。
熵的公式如下:-
这里,p+是正类的概率
p– 是负类的概率
S 是训练样例的子集
决策树如何使用熵?
假设我们有 运输方式 在我们必须通过以下方式交付客户包裹的数据中 普通空气 或者 Express Air,在下面的树中,我们可以看到我们已经进行了拆分以制作决策树。
我们在这里看到拆分不是纯的,因为我们的决策树中仍然有一些负类。
Figure-2
始终牢记熵越高,纯度越低,杂质越高。 记笔记 ,机器学习的目标是降低数据集中的不确定性或杂质。为此,一个名为 信息增益(Info Gain) 在上面的图 2 中告诉我们在分割特征后父熵减少了多少。
笔记-:
有关更多数学概念,请访问 😕/towardsdatascience.com/entropy-how-decision-trees-make-decisions-2946b9c18c8
- 基尼指数:- Gini 还用于衡量我们拆分的不纯度,选择要拆分的特征我们需要知道我们拆分的纯或不纯程度。 它是通过从 1 中减去每个类别的概率平方和来计算的。它由给定的公式表示。
纯粹的分裂意味着要么你得到 是的 或者 不
Figure 3
我们通常使用基尼指数,因为它在计算上是有效的,并且执行时间更短,因为没有像它们的熵那样的对数,因此我们的数据集的杂质可以很容易地通过基尼指数来理解。
什么时候停止分裂?
您一定在想,我们什么时候停止生长树,通常在现实世界中,我们拥有足够大的数据,这将导致大量分裂并最终导致过度拟合。这意味着树将在训练数据集和测试数据集上提供非常好的准确性。
为了克服这个问题,我在这里引入了一个新术语,称为 ** 超参数调整也称为正则化**
正则化参数包括:-
1.max_depth — 它是从根到叶的路径的最大长度(就决策点的数量而言)。叶节点不会进一步分裂。它可能导致一棵树的叶子节点在树的一侧包含许多观察值,而在另一侧,包含更少观察值的节点被进一步分裂。
2.min_sample_split — 当节点中的观察数低于此值时,停止进一步分裂节点的限制。
3.min_sample_leaf — 叶节点必须具有的最小样本数。当叶子包含的观察值太少时,进一步分裂将导致过度拟合(数据中的噪声建模)。
4.min_weight_fraction_leaf — 与 min_sample_leaf 相同,但以加权实例总数的分数表示。
5.max_leaf_nodes — 树中叶节点的最大数量。
6.max_feature_size — 为分割每个节点而评估的最大特征数。
现在让我们在 Python 上工作,看看决策树的实际实现。在这里向您展示,我正在使用 Credit Card Defaulter 数据集。
有关数据集,请访问:- https://www.kaggle.com/umangsaluja/credit-card-defaulters
导入所需的库。
%matplotlib 内联
将 numpy 导入为 np
将熊猫导入为 pd
# 计算准确度度量和混淆矩阵
从 sklearn 导入指标 从 sklearn.tree 导入 DecisionTreeClassifier
从 sklearn.feature_extraction.text 导入 CountVectorizer
导入 pydotplus
从 IPython.display 导入图像
从 sklearn.metrics 导入分类报告
加载数据集并检查前五个观察值。
**# 读取数据集
** credit_df = pd.read_csv("credit.csv")
credit_df.head()
**输出:-**
**# 数据信息
** credit_df.info()
**# 许多列是对象类型,即字符串。这些需要转换为序数类型。**
Figure 4
执行 EDA 步骤后,我们将目标列(“默认”)捕获到单独的向量中,用于训练集和测试集。
**# 将目标列(“默认”)捕获为训练集和测试集的单独向量** X = credit_df.drop("默认" , axis=1) y = credit_df.pop("默认")
使用 (“test_train_split”) 我们将数据拆分为 70:30 以进行训练和测试。
**# 将数据拆分为独立属性的训练集和测试集**
从 sklearn.model_selection 导入 train_test_split xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size=.30, random_state=1)
我们的下一步是申请 决策树算法。
**# 调用决策树分类器函数。使用“熵”方法查找拆分列。其他选项
# 可以是基尼指数。将树的深度限制为 5(没有特别的理由选择这个)
**
dt_model = DecisionTreeClassifier(标准 = '熵')
DT=dt_model.fit(xtrain, ytrain) **输出:-
决策树分类器(标准='熵')**
让我们构建树。
标签 = xtrain.columns **# 以 DOT 格式导出决策树
# 传递 'decision_tree' 以将其导出到 Graphviz
# 将列名传递给'feature_names'
# 将所需的类标签传递给 'class_names'**
dot_data = tree.export_graphviz(DT, feature_names = 标签, class_names = ["0","1"]) **# 在 'dot_data' 中使用 DOT 格式绘制决策树**
图 = pydotplus.graph_from_dot_data(dot_data) **# 显示决策树**
图片(graph.create_png()) **输出:-**
Figure 5, Full Grown Decision Tree.
y_predict = DT.predict(xtrain)
打印(dt_model.score(xtrain,ytrain))
打印(dt_model.score(xtest,ytest)) **输出:-
1.0 # 训练
0.6533333333333333#测试**
在这里,我们可以看到成熟的树容易过拟合。过拟合是指模型完全拟合训练数据但未能泛化测试未见数据的情况 .当模型记住了训练数据的噪声并且未能捕捉到重要的模式时,就会出现过拟合情况。
如果您喜欢这篇文章,请确保拍手直到您的手开始疼痛 😃。保重,保持健康,保持安全并继续学习。
谢谢。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明