决策树详细解释

Tavish Aggarwal.

决策树(基于树的算法)是高解释性和直观算法。它与人类思维工作的工作几乎与决策制定相同。我们可以将其视为嵌套的IF和否则陈述形成颠倒的树。

因此,很容易向业务团队解释模型的结果。

二进制决策树

正如您在上面所示的图表中看到的,我们在每个节点上询问问题并根据答案,我们要么左转。另外,请注意决策树的叶子是实际决定的地方。

在图中,我们只将节点拆分为创建二进制决策树的两个子节点。还可以将节点拆分为多个分区,这被称为多个决策树。

决策树

回归决策树

有时,我们有一种问题声明和数据,以便在应用线性回归之前,我们需要将数据集分为子集。

例如,预测各个年龄和高度的人的重量。

决策树分类和决策树回归之间的区别在于,在回归中,每个叶子表示线性回归模型,而不是类标签。

决策树建设的算法

为了构建决策树,少量使用了一些学习算法。这些都是:

  • 均匀性措施
    • 基尼指数
    • 熵和信息增益
    • 通过r形摆线分裂

让我们详细了解这些学习算法。

均匀性措施

考虑一下我们有很多功能的场景,如何确定我们需要拆分数据的第一个功能? (是否应该是随机选择,或者应该有一些标准来决定第一个分裂的节点?)

这取决于特征的均匀性。我们尝试将数据拆分在功能上并检查数据的同质性​​。我们在每个特征上都这样做并比较同质性。具有最高均匀性的特征是我们首先拆分数据的特征。

我们的目标是具有高的同质性,因此我们继续在每个节点上进行分裂,使得同质性增加。我们定义了使用我们确定进一步拆分的停止点的阈值。如果同质性>门槛我们停止进一步分裂。 

我们有理解,我们需要最大限度地提高同质性,但如何衡量同质性?有各种方式来量化/测量同质性,例如:

  • 基尼指数
  • 信息收益
  • r平方

让我们详细了解。

基尼指数

基尼索引表示为:

$$ gini index = \ sum_ {i = 1} ^ kp_i ^ 2 $$

其中\(p_i \)是查找标签i的点的概率,并且k是不同标签的数量。

考虑下面显示的一个例子,我们有两个特征性别和年龄。我们需要找到申请人是否将提供贷款。历史数据的求和结果如下:

贷款数据集摘要

我们的系统中有1000名贷款申请人。

现在我们的目标是找到,两个特征在哪个特征首先拆分,以便我们具有高的同质性?如果在性别和年龄分裂,让我们找到基尼指数:

$$ gini索引(性别)= {[{500 \超过1000}]} * {[({10 \超过500})^ 2 +({490 \超过500})^ 2]} + {[{500 \超过1000}]} * {[({300 \超过500})^ 2 +({200 \超过500})^ 2]} = 0.74 $$

$$ gini索引(年龄)= {[{700 \超过1000}]} * {[({260 \超过700})^ 2 +({440 \超过700})^ 2]} + {[{300 \超过1000}]} * {[({500 \超过300})^ 2 +({250 \超过300})^ 2]} = 0.59 $$

GINI指数越高,均匀性越高。因此,我们选择具有更高的GINI索引的功能。因此,我们将在上面的例子中选择性别属性。

或者换句话说,预计对性别的分裂预计比年龄更丰富。

熵和信息增益

熵是衡量无序的,被认为是: 

$$ \ epsilon [d] = \ sum_ {i = 1} ^ kp_ilog_2p_i $$

其中\(p_i \)是使用标签i找到点的概率,k是不同标签的数量,ε[d]是数据集D的熵。

笔记: 较小的疾病,降低熵,更大的均匀性和更大的基尼指数。 (即,如果数据集是完全均匀的,则这种数据集的熵为0)

信息增益是父集之间熵减少的衡量标准和分裂后获得的分区。信息增益表示为:

$$增益(d,a)= \ epsilon [d] - \ epsilon [d_a] = \ epsilon [d] - \ sum_ {i = 1} ^ k(({| d_ {a = i} | \ over | d |})\ epsilon [d_ {a = i}])$$

其中ε[d]是父集D的熵(分裂前的数据),\(\ epsilon [d_a] \)是在属性a,\(\ epsilon [d_ {a = = i}] \)是分区的熵,其中数据点的属性a的值是i,\(d_ {a = i} \)是属性a的值的数据点的数量, k是不同标签的数量。

笔记: 信息增益等于从父级设置为分区的熵变更。因此,它是最大的当父集中的熵减去分区的熵最大。

让我们考虑贷款申请人的相同例子:

数据集的熵为:

$$ entropy = { - ({300 \超过1000})} * \ log_2({310 \超过1000}){ - ({690 \超过1000})} * \ log_2({690 \超过1000})= 0.89317 $$

如果我们在性别上拆分数据集,则熵是:

$$熵(性别)= 0.5 * [{ - ({10 \超过500})} * \ log_2({10 \超过500}){ - ({490 \超过500})} * \ log_2({490 \超过500})] + 0.5 * [{ - ({300 \超过500})} * \ log_2({300 \超过500}){ - ({200 \超过500})} * \ log_2({200 \结束500})= 0.5562 $$

如果我们在年龄拆分数据集,则熵是:

$$熵(年龄)= 0.7 * [{ - ({260 \超过700})} * \ log_2({260 \超过700}){ - ({440 \超过700})} * \ log_2({440 \超过700})] + 0.3 * [{ - ({50 \超过300})} * \ log_2({50 \超过300}){ - ({250 \超过300})} * \ log_2({250 \结束300})= 0.861241 $$

和信息增益计算为:

  • 原始数据集的熵 - 分裂后获得的分区熵= 0.89317 - 0.5562 = 0.33697
  • 原始数据集的熵 - 在“年龄”= 0.89317的分裂后获得的分区熵= 0.031241 = 0.031929

我们拆分在最大化信息增益的属性上。性别的信息增益大于年龄的信息增益。因此,我们分裂了性别。

通过r形摆线分裂

到目前为止,我们已经看到了将数据拆分为离散目标变量的节点。但是如何为连续变量创建一个决策树?

我们以类似的方式计算数据集(之前和拆分之前和后和拆分)的线性回归模型。我们将数据拆分在特征上并计算分割后获得的分区的R平方。如果R平方大于原始或父数据集的R,则我们接受拆分。

我们继续进行分裂,直到我们达到可接受的r平方的阈值。

截断和修剪

决策树倾向于过度使用数据。如果允许在没有检查其复杂性的情况下成长,一棵树将保持分裂,直到它已正确分类(或相反,超出)训练集中的所有数据点。这需要解决。

我们有两种不同的技术来处理过度装备。这些是截断和修剪的。

截断

它停止了树仍在增长,使得它可能不会最终包含含有很少的数据点的叶子。截断也称为预灌注。

有各种方法可用于控制树或截断的大小。一些方法是:

  • 拆分后限制分区的最小大小:我们可以限制叶子应该必须分割的数据数量。
  • 最大限度地减少均匀性度量的变化:如果同质性措施不会改变我们不会进一步拆分。
  • 限制树的深度
  • 在叶子中出现的样本数量设置最小阈值
  • 设置树中存在的最大叶子数的限制。

修剪

让树增长到任何复杂性。然后,从叶子开始以自下而上的方式切割树的分支。更常见的是使用修剪策略来避免在实际实现中的过度装备。

切断树枝导致树木复杂性的降低。并且肯定有助于克服过度装备。但是如何确定是否应该修剪分支?

我们将DataSet划分为三个部分,培训,验证和测试数据集。我们修剪模型并在修剪和修剪后计算准确性。如果修剪树的准确性高于验证集上的原始树的准确性,则我们将该分支保留切碎。

笔记: 修剪后,将为新的叶子分配一个标签,就像其所属的多数类中具有更多数据点的标签。

决策树的优势

  • 决策树的预测很容易解释。
  • 决策树不假设任何关于数据集中属性的性质的任何特定。它可以无缝处理各种数据 - 数字,分类,字符串,布尔值等。
  • 它不需要归一化,因为它必须仅比较属性中的值。
  • 决策树经常让我们了解用于预测的解释性属性的相对重要性。

决策树的缺点

  • 决策树倾向于过度使用数据。
  • 决策树往往是非常不稳定的,这是过度装备的含义。数据的一些更改可以大大改变树。

Sklearn实施

我们使用Sklearn Package DecigetTreeClassifier使用决策树算法生成分类器模型。很少有封闭的超级计需要旋转其中一些是:

  1. max_depth. - max_depth参数表示树的最大深度。默认情况下,它需要“无”值。
  2. min_samples_split. - 它讲述了最低的号码。拆分内部节点所需的样本。默认 - 2
  3. 标准 - gini/entropy or IG
  4. min_samples_leaf - 它讲述了在叶节点处所需的最小样本数。默认情况下,它将“1”作为值。

让我们看到一个演示用Sklearn包来构造决策树:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_wine
from sklearn.tree import DecisionTreeClassifier

data = load_wine()
X = data.data
y = data.target

# You can try with changing the hyperparameter or adding new one
dt_default = DecisionTreeClassifier(max_depth=3)
dt_default.fit(X, y)

# Importing required packages for visualization
from IPython.display import Image  
from sklearn.externals.six import StringIO  
from sklearn.tree import export_graphviz
import pydotplus, graphviz

# Putting features
features = list(bunch.feature_names[0:])

dot_data = StringIO()  
export_graphviz(dt_default, out_file=dot_data,
                feature_names=features, filled=True,rounded=True)

graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
graph.write_pdf("dt_wine.pdf")

输出:

葡萄酒决策树

该产出指出最重要的特征是具有0.658基尼指数的脯氨酸。

笔记: 我们应该避免使用单热编码创建虚拟变量,然后使用标签编码将分类变量转换为决策树的数字。如在基于树的模型的情况下,1,2,3并不意味着3个超过1.它只是我们将其划分的标签。

概括

在这篇文章中,我们看到,与逻辑回归或SVM等其他算法不同,决策树在独立和目标变量之间找不到线性关系。相反,它们可用于建模高度非线性数据。我们看到用于构造决策树的学习算法:

  • 均匀性措施
    • 基尼指数
    • 熵和信息增益
    • 通过r形摆线分裂

我们看到了决策树的优点和局限性。在熟悉这些概念之后,我们确实在我们建立决策树的地方进行动手。

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal.是一个数据科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。