基于树模型的学习算法是最受欢迎的有监督学习方法之一,如决策树模型、随机森林、梯度提升树等算法,树模型能够使预测模型的精度更高、性能更稳定,模型结构也更方便解释和分析,对数据分析者来说学习如何在自己的模型中使用这些算法是很重要的。本案例主要是帮助数据分析初学者从零学习树模型,读者在学习完本案例后能够熟练的运用树模型以及构建预测模型。

1.什么是决策树?工作原理是什么?

决策树是一种主要用于解决分类问题(具有预定义的目标变量)的监督学习算法。决策树适用于分类变量和连续变量,我们根据输入变量中最重要的区分器(即变量),将样本分成两个或多个同构集合(或子类)。 png 举例:
假设我们有30个学生的样本,有三个变量:性别(男孩/女孩),班级(IX/X)和身高(5~6英尺)。这30个人中有15个人在业余时间打板球。现在,我们想创建一个模型来预测谁将在业余时间玩板球?这个问题中,我们需要根据三个特别显著的输入变量,区分出在业余时间玩板球的学生。

这就是决策树的作用,他能够通过三个变量值来区分学生,创建最好的同构集合(彼此是异质的)。如图所示,我们可以看到性别变量相较于其他两个变量选出的同构集合最好。 png 综上所述,决策树能够识别出最重要的变量及变量值,并给出最优的同构集合。现在的问题是,他是如何识别变量然后进行分类的?在识别变量和判断分类时,决策树使用了各种算法,我们将在下面的章节中讨论。

1.1 决策树的分类

决策树的类型取决于目标变量的类型。可以分为两种:

  • 分类变量决策树:具有分类目标变量的决策树,称为分类变量决策树。示例:在上面的学生问题中,目标变量是“学生是否玩板球”,即分类为“是”或“否”。
  • 连续变量决策树:决策树具有连续的目标变量,被称为连续变量决策树。

举例:
假设我们要预测客户是否会向保险公司支付续保保费(是/否)。我们知道客户的收入是一个重要的变量,但保险公司没有所有客户的收入明细。我们知道这是一个重要的变量,然后建立一个决策树,根据职业、产品和各种其他变量来预测客户的收入。在这种情况下,我们预测的是连续变量的值。

1.2 与决策树相关的重要术语

决策树所使用的基本术语:

  • 1.根节点:代表整个分类或样本,并且被进一步划分为两个或多个同构集合。
  • 2.分裂:将节点划分成两个或多个子节点的过程。
  • 3.决策节点:当一个子节点进一步分裂成更多的子节点时,则称该子节点为决策节点。
  • 4.叶子/终端节点:不再分裂的节点称为叶子节点或终端节点。 png
  • 5.剪枝:删除决策节点的子节点的过程被称为剪枝,反之称为分裂过程。
  • 6.分支/子树:整个树的子段称为分支或子树。
  • 7.父节点和子节点:分裂出子节点的节点称为父节点,子节点是父节点分裂出的节点。

以上是常用于决策树的术语。众所周知,每一种算法都有优点和缺点,下面介绍决策树的优缺点。

优点:

  • 1.容易理解:即使没有数据分析背景的人,决策树也很容易理解。不需要任何统计知识来阅读和解释,其图形表示是非常直观的。
  • 2.在数据探索中有用:决策树是识别重要变量或两个或多个变量之间关系的最快方法之一。有了决策树模型,我们可以创建新的变量/特征来更好的预测目标变量。例如,我们正在研究一个问题,我们有数百个包含信息的变量,决策树可以帮助我们识别出最重要的变量。
  • 3.不需要复杂的数据清洗:与其他建模方法相比,决策树不需要复杂的数据清理,不受异常值和缺失值的影响。
  • 4.数据类型不受限制:决策树可以处理数值变量和分类变量。
  • 5.非参数方法:决策树被认为是一种非参数方法。这意味着决策树没有关于空间分布和分类器结构的假设。

缺点:

  • 1.过拟合:过拟合是决策树模型最现实的困难之一。可以通过对模型参数的约束和剪枝来解决这个问题(下面详细讨论)。
  • 2.不适合于连续变量:对于处理连续数值变量,决策树在对不同类别的变量分类时,会丢失信息。

2.回归树与分类树

我们都知道,终端节点(或叶子)位于决策树的底部。这意味着决策树通常被倒置,使得叶子是底部而根是顶部(如下图所示)。 png 回归树与分类树的工作方式相似,下面看看两者之间主要的差异性和相似性:

  • 1.当变量连续取值时,使用回归树。当变量是按类别取值时,使用分类树。
  • 2.在回归树的情况下,训练数据的终端节点所获得的值是该区域中观察值的平均差值响应。因此,如果该区域有未知类别的观测数据,我们将用平均值进行预测。
  • 3.在分类树的情况下,终端节点在训练数据中获得的值(类)是落在该区域的观测值的众数。因此,如果一个未知类别的数据落在该区域,我们将用众数进行预测。
  • 4.这两个树模型都将预测空间(独立变量)划分为不同的、不重叠的区域。方便起见,可以将这些区域视为高维框或框。
  • 5.这两种树模型都遵循的自上而下的贪婪方法称为递归二分分裂。之所以叫他“自上而下”,是因为当所有的观察值都在单个区域时他先从树的顶端开始,然后向下将预测空间分为两个分支。他被称为“贪婪”,是因为该算法(寻找最佳变量可用)关心的是目前的分裂,而不是将来能否构建一个更好的树。
  • 6.分裂过程会持续到满足用户定义的停止标准为止。例如,我们可以设置只要每个节点观测数据的数量小于50,算法就可以停止。
  • 7.分裂过程达到停止标准后会构建出一棵决策树。但是,这棵树很可能会过度拟合数据,导致无法确定数据的精度差。此时必须进行“剪枝”。“剪枝”是一种用于解决过度拟合的技术。我们将在下面的章节中进行详细介绍。

3.树模型如何确定在哪里进行分裂?

分裂会严重影响决策树的准确性,分类树和回归树的决策标准有所不同。

决策树使用多个算法来决定在两个或多个子节点中对某一个节点进行分裂,子节点的创建增加了子节点间的同质性。决策树在所有可用的变量上分裂节点,然后选择使结果最均匀的子节点进行分裂。

算法的选择基于目标变量的类型,下面是决策树中最常用的四种算法:

3.1.基尼系数

基尼指数指出,如果分类中同质性很高,那么我们从分类中随机选择两个元素,他们肯定是相同的类别,并且概率为1。

  • 1.他影响着分类目标变量的“成功”或“失败”。
  • 2.只进行二叉分裂。
  • 3.基尼值越高,同质性越高。
  • 4.CART(分类和回归树)使用基尼系数创建二叉分裂。

使用基尼系数进行分裂的计算步骤:

  • 1.用成功和失败的概率的平方和求子节点的基尼系数$(p^2+q^2)$。
  • 2.使用加权尼基系数计算每个节点的分裂值。

举例:

参照上面的例子,我们基于目标变量(或不玩板球)区分学生。在下图中,我们使用性别和班级做为输入变量。然后使用基尼系数确定哪些分裂产生了更均匀的子节点。 png

在性别属性上分裂:

  • 1.计算女性子节点的基尼系数$Female = (0.2)*(0.2)+(0.8)*(0.8)=0.68$。
  • 2.计算男性子节点的基尼系数$Male = (0.65)*(0.65)+(0.35)*(0.35)=0.55$。
  • 3.计算性别分裂的加权基尼系数$Gender = (10/30)*0.68+(20/30)*0.55=0.59$。

在班级属性上分裂:

  • 1.IX班级的基尼系数$Class IX = (0.43)*(0.43)+(0.57)*(0.57)=0.51$。
  • 2.X班级的基尼系数$Class X = (0.56)*(0.56)+(0.44)*(0.44)=0.51$。
  • 3.计算班级分裂的加权基尼系数$ Class = (14/30)*0.51+(16/30)*0.51 = 0.51$。

可以看出,按性别分裂的基尼系数高于按班级分裂。因此,节点分裂将发生在性别属性上。

3.2.卡方

这是一种计算子节点和父节点间差异的统计学算法。计算方法是求目标变量观察频率和预期频率之间的标准差之和。

  • 1.适用于分类目标变量“成功”或“失败”。
  • 2.可以进行两个或多个分裂。
  • 3.卡方值越高,子节点和父节点之间统计学差异越显著。
  • 4.利用公式计算各节点的卡方值。
  • 5.卡方计算公式:$Chi-square = ((Actual – Expected)^2 / Expected)^{1/2}$。
  • 6.其生成树被称为CHAID(卡方自动交互检测器)。

使用卡方计算分裂的步骤:

  • 1.通过计算成功和失败的偏差得到单个节点的卡方值。
  • 2.通过对所有分裂节点的成功与失败的卡方值求和,得到属性分裂的卡方值。

举例:

使用卡方来计算上面的例子。

在性别属性上分裂:

  • 1.首先我们填充女性节点,填充的实际内容为“打板球”和“不打板球”,分别为2和8。
  • 2.计算“玩板球”和“不打板球”的预期值,这里都应该是5。因为父节点有50%的概率,我们对女性计数使用了相同的概率。
  • 3.用公式计算偏差:实际值-期望值,$Actual – Expected$。即,“玩板球”$(2–5=-3)$和“不打板球”$(8–5=3)$。
  • 4.根据卡方计算公式计算节点卡方值:$Chi-square = ((Actual – Expected)^2 / Expected)^{1/2}$,可以参考下表中的计算结果。
  • 5.使用类似的步骤计算男性节点的卡方值。
  • 6.现在所有卡方值相加计算按性别分裂的卡方值。 png

在班级属性上分裂:

通过类似按性别分裂的计算步骤,得到下表。 png 由此可以看出,卡方计算方法也认为按性别分裂比按班级分裂更有效。

3.3.信息增益

看看下面的图片,想想我们可以很容易地描述出来哪个节点。我想你的答案肯定是C,因为所有的值都是相似的,需要的描述的信息最少。而B需要更多的信息来描述,A则需要最多的信息。可以说,C是纯度最高的节点集合,B是纯度不太高的集合,A是纯度最低的集合。

png

现在,我们可以得出这样的结论:纯度较高的节点只需要很少的信息来描述,反之则需要更多的信息来描述。信息论中用来衡量一个系统混乱程度的理论被称为熵。如果样本是完全同构的,那么熵是零,并且如果样本是均分的,则熵为1。

熵的计算公式:$Entropy=-p\log_2{p}-q\log_2{q}$。

这里的$p$和$q$分别为节点的成功和失败概率。熵也用于分类目标变量。选择相比父节点和其他节点分裂最低的熵。熵值越小越好。

通过熵进行分裂的计算步骤:

  • 1.计算父节点的熵。
  • 2.计算根据某个属性分裂出的每个子节点的熵,并求出子节点熵的加权平均值。

举例:
接下来我们使用这个方法对学生案例进行最佳分裂。

  • 1.计算父节点的熵:$$Entropy for parent node = -(15/30)\log_2(15/30)–(15/30)\log_2(15/30)=1$$ 这里1表明是纯度较低的节点。

  • 2.计算女性节点的熵:$$Entropy for Female node = -(2/10)\log_2(2/10)–(8/10)\log_2(8/10)=0.72$$ 男性节点的熵:$$Entropy for male node=-(13/20)\log_2(13/20)–(7/20)\log_2(7/20)=0.93$$

  • 3.计算性别分裂的熵:$$Entropy for split Gender = Weighted entropy of sub-nodes = (10/30)*0.72 + (20/30)*0.93 = 0.86$$

  • 4.班级IX节点的熵:$$Entropy for Class IX node=-(6/14)\log_2(6/14)–(8/14)\log_2(8/14) = 0.99$$ X班级的熵:$$Entropy for Class X node=-(9/16)\log_2(9/16)–(7/16)\log_2(7/16) = 0.99$$

  • 5.计算班级分裂的熵:$$Entropy for split Class=(14/30)*0.99 +(16/30)*0.99 = 0.99$$

从上可以看到,性别分裂的熵是最低的,所以树会在性别属性上进行分裂。我们可以获得信息增益为$1- Entropy$。

3.4.方差减少

现在,我们已经讨论了分类目标变量的算法。方差减少是一种用于连续目标变量(回归问题)的算法。该算法通过计算方差的标准公式来选择最佳分裂,选择具有较低方差的属性作为分裂准则。

$variance=\frac{\sum({X-\overline{X}})^{2}}{n}$

$\overline{X}$表示平均值,$X$表示实际值,$n$表示变量个数。

方差的计算步骤:

  • 1.计算每个节点的方差。
  • 2.计算每个分裂的方差作为每个节点方差的加权平均值。

举例:
我们为“玩板球”分配数值1,为“不打板球”分配数值0。现在按照步骤来识别分裂。

  • 1.根节点的方差,平均值为$(15*1 + 15*0)/30 = 0.5$,我们有15个0和15个1,那么方差为: $((1-0.5)^2+(1-0.5)^2+…15 times+(0-0.5)^2+(0-0.5)^2+…15 times) / 30$,
    即,$(15*(1-0.5)^2+15*(0-0.5)^2) / 30 = 0.25$。

  • 2.女性节点的均值$=(2*1+8*0)/10=0.2$,
    女性节点的方差$=(2(1-0.2)^2+8(0-0.2)^2) / 10 = 0.16$。

  • 3.男性节点的均值$= (13*1+7*0)/20=0.65$,
    男性节点的方差$=(13*(1-0.65)^2+7*(0-0.65)^2) / 20 = 0.23$。

  • 4.性别分裂的方差=加权子节点方差$= (10/30)*0.16 + (20/30) *0.23 = 0.21$。

  • 5.IX班级的均值$=(6*1+8*0)/14=0.43$,
    方差$=(6*(1-0.43)^2+8*(0-0.43)^2) / 14= 0.24$。

  • 6.X班级的均值$=(9*1+7*0)/16=0.56$,
    方差$=(9*(1-0.56)^2+7*(0-0.56)^2) / 16 = 0.25$。

  • 7.性别分裂的方差$ = (14/30)*0.24 + (16/30) *0.25 = 0.25$。

从上面的计算可以看到性别分裂方差比父节点低,所以分裂选择在性别属性上。

到这里,我们了解了基本的决策树和如何选择最好的分裂,建立树模型的决策过程。决策树可以应用在回归和分类问题上,下面我们详细了解这些方面。

4.树模型的关键参数是什么?如何避免决策树中的过拟合?

使用决策树建模时,过拟合是一个关键挑战。如果一个决策树没有极限集,那么训练集准确度为100%。因此,决策树建模的关键是防止过拟合,可以从2个方面来进行:

  • 1.限制树大小。
  • 2.树的剪枝。

接下来详细介绍这两部分。

4.1.限制树大小

可以通过使用定义树的各种参数来完成。首先,我们看看决策树的一般结构:

png

下面进一步解释用于定义树的参数,与描述参数的工具无关。了解树建模中参数的作用很重要,这些参数在R和Python中均可以使用。

(1).节点分裂的最小样本

  • 定义节点中需要用于分裂的样本(或观测)的最小数目。
  • 用于控制过拟合。较高的值可以防止学习关系模型对于特定的树选择特定的样本。
  • 过高的值会导致欠拟合,此时应使用CV进行调整。

(2).终端节点(叶子节点)的最小样本

  • 定义终端节点中所需的最小样本(或观测值)。
  • 使用类似min_samples_split的方法防止过拟合。
  • 对于不平衡类的问题,一般应选择较低的值。因为数量少的类占只占非常小的一部分。

(3).树的最大深度(垂直深度)

  • 树的最大深度。
  • 使用最大深度控制过拟合,能够根据特定样本得到确定的学习关系。
  • 可以使用CV进行调整。

(4).终端节点的最大数目

  • 树中终端节点的最大数目。
  • 可以代替max_depth的定义,由于创建二叉树,深度为$n$的数会产生最大的$2×N$个叶子节点。

(5).分裂的最大特征

  • 寻找最佳分裂时要考虑多个特征,这些将随机选择。
  • 作为经验法则,特征中总数的平方根效果很好,但是我们还是要检查特征总数30%-40%的特征。
  • 较大的值可能会导致过拟合,具体取决于实际情况。

4.2.树的剪枝

正如前面所讨论的,设置约束是种贪婪法。换言之,他能够及时检查最佳分裂并向前移动直到达到指定的停止条件之一。我们需要考虑以下情况:

png

有2个车道:

  • 1.一个是$80km/h$的小汽车道。
  • 2.一个时$30km/h$的卡车车道。

在这一刻,假设你是黄色车,你有2种选择:

  • 1.左转,赶超其他2辆车。
  • 2.继续走在当前的车道上。

让我们分析一下这些选择。在前一个选择中,你会立即超过前面的车,到达卡车后面,开始移动30公里/小时,寻找机会回到右边。在你身后的所有汽车都在前进。如果你的目标是在接下来的10秒最大限度的拉开距离,这将是最佳选择。在第二个选择中,你以同样的速度行驶,与卡车相遇,能否超车取决于后来的情况。贪婪的你!

普通决策树和剪枝的区别:带约束的决策树不会看到前方的卡车,而是采取贪婪的方法向左拐。 另一方面,如果我们使用剪枝,我们只要很少的步骤就能做出选择。

所以我们知道修剪更好。但如何在决策树中实现呢?这个想法很简单。

  • 1.首先假设决策树深度极大。
  • 2.然后,从底部开始,去除给了我们负面回应的叶子节点。
  • 3.假设一个分裂给我们一个增益为$-10$(损失10),然后下一个分裂使我们得到20的增益。一个简单的决策树将在第1步停止,但在剪枝时,我们会看到整体增益是10,保留两个叶子节点。

注意,Sklearn中的决策树分类器目前不支持剪枝,而XGBoost中支持进行剪枝。

5.基于树的模型优于线性模型吗?

“如果我可以使用逻辑回归来解决分类问题,使用线性回归来解决回归问题,还为什么需要使用树模型?”我们很多人都有这个问题。

实际上,您可以使用任何算法。这取决于您要解决的问题类型。让我们来看一些关键因素,他们将帮助您决定使用哪种算法:

  • 1.如果使用线性模型因变量和自变量近似,则线性回归将优于基于树的模型。
  • 2.如果因变量和自变量之间存在较复杂的逻辑关系并且非线性程度较高,则树模型优于经典回归方法。
  • 3.如果你需要建立一个易于解释的模型,决策树模型总是比线性模型好。决策树模型比线性回归更容易解释!

6.使用Python实现决策树

对于Python用户来说,决策树是很容易实现的。让我们快速地查看一组代码,方便您开始使用这个算法。我们已经共享了标准代码,您只需要替换自己的数据集名称和变量即可开始。

在下面代码中,X代表训练数据集:

# 导入库文件
from sklearn import tree
# 假设训练集有X(预测器)和Y(目标),测试集有x_test(预测器)
# 构造树模型
model = tree.DecisionTreeClassifier(criterion='gini') 
# model = tree.DecisionTreeRegressor() 回归
# 使用训练集训练模型
model.fit(X, y)
model.score(X, y)
# 输出预测值
predicted= model.predict(x_test)

7.基于树模型的集成方法是什么?

“集成”的可以理解为群,集成方法包括一组预测模型,以达到更好的精度和模型稳定性。已知的集成方法最大限度的提高了树模型的效果。

像所有其他模型一样,基于树的模型也遭受着偏差和方差的困扰。偏差是指预测值的平均值与实际值之间的差异;方差是指,如果不同的样本来自同一个样本集,那么模型在同一点上的预测会有多大的不同。

我们建立一棵小树,然后得到一个低方差和高偏差的模型。该如何来平衡模型?

通常,当增加模型的复杂性时,由于模型中的偏差降低会导致预测误差降低。但当继续使模型变得更复杂时,最终模型会过拟合,模型的方差会越来越大。

一个好的模型应该保持这两种类型的错误之间的平衡,称为偏差和方差的权衡管理。集成学习则是实现这种平衡的一种方式。

png

一些常用的集成方法包括:Bagging,Boosting和Stacking。在本教程中,我们将详细讨论Bagging和Boosting。

8.什么是Bagging?工作原理是什么?

Bagging是一种通过组合相同数据集中不同子集上多分类器的方法降低预测方差的技术,下图表示的比较清楚:

png

Bagging计算步骤:

(1).创建多个数据集:

  • 对原始数据进行替换,形成新的数据集。
  • 新的数据集可以有一小段列和行,这通常是Bagging模型中的超参数。
  • 行和列的分数低于1,有助于鲁棒模型,不容易过拟合。

(2).建立多个分类器:

  • 分类器建立在每个数据集上。
  • 通常,在每个数据集上对同一分类器进行建模并进行预测。

(3).组合分类器:

  • 所有分类器的预测可以使用平均值、中值或模式值的组合,具体取决于实际问题。
  • 组合分类器通常比单个模型更健壮。

注意,在这里建立的模型的数量不是一个超参数。数量多的模型总是比数量少的模型更好,或者说可以更优的性能。理论上看,在某些假设下,组合预测的方差将减小到原始方差的$\frac{1}{N}$($n$:分类器的数量)。

Bagging模型有多种实现方式。随机森林是其中之一,我们将在下一步讨论。

9.什么是随机森林?工作原理是什么?

随机森林被认为是数据科学的“灵丹妙药”,有趣的是,当你想不到其他算法时(不管情况如何),使用随机森林!

随机森林是一种通用的机器学习方法,能够处理回归和分类问题。他还负责数据降维,缺失值处理、离群值处理以及数据分析的其他基本步骤。他是一种集成学习方法,将一组效果一般的模型组合成一个强大的模型。

9.1.工作原理

在随机森林中,与CART模型单个树不同,随机森林里我们生成有多棵决策树。为了根据属性对新对象进行分类,每个树都给出自己的分类意见,称为“投票”。在回归的情况下,森林选择选票最多的分类。

png

工作原理如下。每棵树的建立和生长如下:

  • 1.设训练集中的样本数是N,那么,这N例样本是随机抽取的,但存在被更换过的情况。这些样本就是生成树的训练集。
  • 2.如果有M个输入变量,指定每个节点上的m小于M,这m个变量是从M个变量中随机选择出来的。这m个变量上的最佳分裂方法可用于节点分裂。直到生成森林,m的值一直保持不变。
  • 3.每棵树都没有剪枝,可以尽可能生长到最大。
  • 4.通过多个树的预测结果来预测新的数据。

随机森林的优点:

  • 1.该算法可以解决分类和回归两类问题,并获得不错的评价。
  • 2.随机森林的好处之一是有处理更高维度的大数据集的能力。他可以处理数以千计的输入变量,并识别最重要的变量,因此被认为是一种降维方法。此外,该模型可以给出变量的重要性,使数据处理更加方便(在一些随机数据集上)。

  • 3.当很大一部分数据丢失时,他能有效估计丢失值,并保持较高准确性。
  • 4.他有处理不平衡类中数据集上平衡错误的方法。
  • 5.上面的功能可以扩展到未标记的数据,可用于无监督聚类、数据视图和离群点检测。
  • 6.随机森林输入替换后数据样本称为自助抽样。其中三分之一的数据不用于训练但是可以用于测试。被称为袋外样本(out-of-bag)。在这些袋外样本上估计的误差称为袋外误差。对袋外误差估计的研究表明,袋外估计与使用与训练集相同大小的测试集一样准确,使用袋外误差估计可以去除备用测试集。

随机森林的缺点:

  • 1.在分类方面做得很好,但在回归问题上并不是,因为他没有给出精确的连续性预测。在回归问题上,预测范围只在训练数据上,而且可能会过度拟合噪音数据集。
  • 2.随机森林统计建模方法像个黑盒子---很少能控制模型。最多可以尝试不同的参数和随机的种子!

9.2.Python实现

随机森林可以使用Python scikit-learn包实现,下面是Python加载随机森林模型的代码:

Python

# 导入库文件
from sklearn.ensemble import RandomForestClassifier 
# 使用随机森林解决回归问题
# 假设训练集有X(预测器)和Y(目标),测试集有x_test(预测器)
# 构建随机森林模型
model= RandomForestClassifier(n_estimators=1000)
# 使用训练数据集训练模型
model.fit(X, y)
# 输出预测结果
predicted= model.predict(x_test)

10.什么是Boosting?工作原理是什么?

定义:“Boosting”指的是将弱学习算法转化为强学习算法的一系列算法。

我们通过识别垃圾邮件问题来详细理解这个定义:

你怎么把电子邮件分类成垃圾邮件?和其他人一样,我们最初都是使用以下标准来识别“垃圾邮件”和“垃圾邮件”。如果:

  • 1.电子邮件只有一个图像文件(促销图像),他是一个垃圾邮件。
  • 2.电子邮件只有一个链接,他是一个垃圾邮件。
  • 3.邮件正文包括这样的句子“你赢得了一xxxxxx美元”的奖金,这是一个垃圾邮件。
  • 4.有我们的官方域名“cookdata.cn”,不是垃圾邮件。
  • 5.来自已知来源的电子邮件,不是垃圾邮件。

上面,我们已经定义了多个规则来将电子邮件分类成“垃圾邮件”或“垃圾邮件”。但是,你认为这些规则是否足够强大,能够成功地对电子邮件进行分类?答案是否定的。

单独地这些规则不足以将电子邮件归类为“垃圾邮件”或“垃圾邮件”。因此,这些规则被称为弱学习法。

为了将弱学习方法转变为强学习方法,我们使用如下方法将每个弱学习方法联合起来进行预测:

  • 使用平均/加权平均。
  • 考虑具有较高投票的预测结果。

例如,我们定义了5个弱学习器。在这5个弱学习器中,3个投“垃圾邮件”,2个投“不是垃圾邮件”。一般情况下,我们认为这个邮件是垃圾邮件,因为“垃圾邮件”的得票更高。

工作原理

现在我们知道,Boosting将多个弱学习器集合成一个强学习器。你应该会想到的一个问题是:“Boosting”如何识别弱学习?。

为了找到弱规则,我们在不同的分布上应用基础学习(ML)算法。应用基础学习算法生成一个新的弱预测规则。这是一个迭代过程, 经过多次迭代,Boosting将这些弱学习方法组合成单个强学习方法。

另一个困扰你的问题:“我们如何选择每一轮不同的分配?”。

为了选择正确的分布,有以下步骤:

  • 第1步:基础学习方法包含所有的分布,并且分配相等的权重或重视在每个观察项上。
  • 第2步:如果第一个基础学习方法引起预测误差,我们会对观测误差更敏感。然后再使用下一个基础学习方法。
  • 第3步:迭代步骤2直到达到基础学习方法的极限,或者达到更高的精度。

最后,结合弱学习方法的输出,创建一个强学习方法,最终提高模型的预测能力。Boosting更关注被错误分类或者弱学习方法误差较高的样本。

有许多Boosting算法,可以用来提高模型精度。在本教程中,我们了解最常用的两种算法,即梯度(GBM)和XGBoost。

11.GBM与XGBoost哪一个更优?

我一直很钦佩XGBoost算法的增强功能。有时,与GBM实现相比,XGBoost提供了更好的结果。但有时,会发现这只是微不足道的。当我探索更多关于他的性能和高准确性背后的科学,我发现在XGBoost相比GBM有很多优点:

(1).正则化:

  • 标准的GBM实现时没有像XGBoost使用正则化,所以他也有助于减少过拟合。
  • 事实上,XGBoost也被称为“正则化提升”技术。

(2).并行处理:

  • XGBoost可以并行处理,相比GBM速度要快。
  • 但是,我们知道“Boosting”是连续的过程,所以怎么可以并行?每棵树只能在前一棵树之后才能构建,是什么阻止我们使用所有的核心来制作一棵树呢?
  • XGBoost可以用Hadoop实现。

(3).灵活性高:

  • XGBoost允许用户自定义的优化目标和评价标准。
  • 给模型增加了一个全新的维度,做什么都没有限制。

(4).处理缺失值:

  • XGBoost有一个内置的常规程序处理缺失值。
  • 用户需要提供与其他观察值不同的值,并将其作为参数传递。当XGBoost遇到节点上的缺失值会尝试不同方法,学习如何选一个方法处理缺失值。

(5).树的剪枝:

  • GBM在分裂中遇到负损失时会停止分裂。因此,他是一个贪婪算法。
  • XGBoost使分裂达到指定的Max深度,然后开始向后剪枝并移除没有正增益的分裂。
  • 另一个好处是,有时负损失的分割说是-2,也许会带来正损失+10。GBM遇到-2时会停止,但XGBoost会深入,并且会得到分裂的+8联合效应。

(6).交叉验证:

  • XGBoost允许用户在Boosting进程的每次迭代中运行交叉验证,这样单次运行中很容易得到精确的最佳迭代次数。
  • 与GBM不同,XGBoost必须运行网格搜索,只有有限的值才能被测试。

(7).可扩展现有模型:

  • 用户可以从上次运行的最后一次迭代开始训练XGBoost模型。在某些特定的应用中具有显著的优点。
  • SKLean实现的GBM也具有这一特点。

12.使用Python实现GBM

在我们开始工作之前,让我们快速了解这个算法的重要参数和工作。这对R和Python用户都很有帮助,下面是GBM算法伪代码:

  • 1.初始化结果。
  • 2.从1迭代到树的总数:
    • 2.1 根据之前的运行更新目标的权重(被误分类的目标的权重会更高)。
    • 2.2 在选定的数据子样本上拟合模型。
    • 2.3 对完整的观测结果作出预测。
    • 2.4 根据学习结果更新输出。
  • 3.返回最终输出。

这是对GBM工作的一种极其简化的解释,有助于每个初学者理解这个算法。

使用重要的GBM参数在Python中改进模型性能:

(1).学习率

  • 这就决定了每棵树对最终结果的影响(步骤2.4)。GBM通过使用每个树输出更新后的初始值开始工作,学习参数控制变化的幅度。
  • 通常值越小越好,因为可以使模型对树的特性具有鲁棒性,然后很好地进行推广。
  • 较低的值将需要更多的树来模拟所有的关系,并且计算量较大。

(2).n-估计量

  • 要建模的树的数量(步骤2)。
  • 虽然GBM在较多数量的树上是相当健壮的,但他仍然会在一个点上过拟合。因此,需要使用特定学习速率的CV来调整。

(3).子样本

  • 通过随机抽样,为每个树选择的观测部分,
  • 小于1的值通过减小方差使模型具有鲁棒性。
  • 特定值~0.8通常工作良好,但可以进一步调整。

除此之外,还有一些影响整体功能的其他参数:

(1).损失

  • 指在每个分裂中最小化损失函数。
  • 他在分类和回归情况下有不同的的值。通常默认值工作正常,只有了解了他们对模型的影响,才能选择。

(2).初始化

  • 这会影响输出的初始化。
  • 如果我们做出另一个模型,其结果将被用作GBM的初始估计,则可以使用这一模型。

(3).随机状态

  • 随机数种子,每次产生相同的随机数。
  • 参数调整非常重要,如果我们不固定随机数,那么,相同的参数将会输出不同的结果,模型变得难以比较。
  • 可能会导致所选的特定随机样本过度拟合,我们可以尝试不同随机样本的运行模型,但是计算代价太大,一般不使用。

(4).冗余

  • 模型拟合时要打印的输出类型。不同值的意义:

    • 0:没有产生输出(默认);
    • 1:在一定时间间隔内为树生成输出;
    • 大于1:为所有树生成输出。

(5).热启动

  • 这个参数有应用有趣,对实际问题有很多帮助。
  • 我们可以在先前拟合的模型上拟合额外的树,他可以节省大量的时间。

(6).预选

  • 选择是否为更快的分裂预置数据。
  • 默认情况下已自动选择,但如果需要的话可以更改。

我知道他有一长串的参数,我已经在Excel文件中简化了,可以从这个GitHub repository下载。

我已经在Python中共享了标准代码。在末尾,需要在代码中添加自己使用的因变量和数据集名称。

Python实现GBM

# 导入库文件
from sklearn.ensemble import GradientBoostingClassifier # 分类
from sklearn.ensemble import GradientBoostingRegressor # 回归
# 使用GBM函数
clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1)
clf.fit(X_train, y_train)

尾注

基于树的算法对于每个数据科学家来说都是很重要的。事实上,树模型在整个机器学习算法家族中性能最好。在本教程中,我们学习了GBM和XGBoost。现在已到了本教程的结尾。我们从零开始讨论基于树的建模,了解了决策树的重要性,以及如何使用简单的概念来改进算法。为了更好的理解,我们建议你进一步实践这些算法。此外,请注意与Boosting算法相关的参数,希望本教程能增加你对树模型的了解。


源自: ANALYTICS VIDHYA CONTENT TEAM——A Complete Tutorial on Tree Based Modeling from Scratch (Python)