机器学习(ML)(七) — 探析
介绍
什么是决策树?学习算法输出的模型看起来像一棵树。这里有一个新的测试示例,有一只猫,耳朵形状尖尖的,脸形圆润,有胡须。该模型学习此示例并做出分类决策,从树的最顶端节点开始,这称为树的根节点,然后查看写在里面的特征,即耳朵形状。根据此示例的耳朵形状的值向左或向右走。耳朵形状的值是尖的,所以将沿着树的左边分支向下走,最后到达椭圆形节点。然后查看脸部形状,脸部是圆形的,所以将沿着这里的箭头向下走。算法会推断这是一只猫。树中最上面的节点称为根节点。所有这些节点都称为决策节点。它们之所以是决策节点,是因为它们会查看特定特征,然后根据特征的值,来决策是沿着树向左走还是向右走。最后,这些底部的节点称为叶节点。它们会做出预测。
给定训练集构建决策树有几个步骤。给定一个包含 10 个猫和狗示例的训练集,就像您在上一个视频中看到的那样。决策树学习的第一步是决定在根节点使用什么特征。这是决策树最顶端的第一个节点。假设选择耳朵形状作为根节点的特征。并查看所有训练示例,根据耳朵形状特征的值对它们进行拆分。具体来说,选出五个尖耳朵的例子并将它们移到左边。然后选出五个松软耳朵的例子并将它们移到右边。第二步是只关注决策树的左侧部分,根据指定(根据一种算法)的特征进行拆分。假设使用脸型特征。接下来要做的是根据这五个示例的脸型值,将它们拆分成两个子集。然后从这五个示例中取出四个脸型为圆脸的示例并将它们移到左侧。将一个脸型不圆的示例移到右侧。最后,观察到到这四个示例都是猫。这时不再进一步拆分,而是创建一个叶节点,该节点预测猫的分布。在决策树左侧分支的左侧部分完成此操作后,在决策树的右侧部分重复类似的过程。关注这五个示例,其中包含一只猫和四只狗。选择某个特征来进一步拆分这五个示例,如果选择了胡须特征,那么根据胡须存在或不存在拆分这五个示例,如下图所示:
左侧的示例只有一个是猫。创建叶节点,在左侧进行猫预测,在右侧进行狗预测。这是一个构建决策树的过程。在此过程中,需要在算法的各个步骤中做出几个关键决策。第一个关键决策是选择在每个节点上使用哪些特征进行拆分?在根节点以及决策树的左分支和右分支上需要确定该节点上是否有一些由猫和狗混合而成的示例。目的是尽可能接近所有猫或所有狗的子集。例如,如果我们有一个特征表示这种动物是否有猫。根节点可以根据这个特征进行拆分,这样左分支中会有五只猫,而右分支中会有五只猫。这些数据的左子集和右子集都是完全纯净的,意味着在左子分支和右子分支中只有一个类别,要么只有猫,要么不是只有猫,那么这个特征将是一个很好的使用特征。但是对于实际拥有的特征,如果根据年份形状进行划分,这会导致左侧五个例子中有四个是猫,而右侧五个例子中有一个是猫,或者根据脸部形状进行划分,这会导致左侧七个例子中有四个是猫,而右侧三个例子中有一个是猫,这会导致左侧四个例子中有三个是猫,而右侧六个例子中有两个不是猫。决策树学习算法必须在耳朵形状、脸部形状和胡须之间选择。这些特征中的哪一个会导致左侧和右侧子分支上的标签纯度最高?如果可以得到高度纯净的样本子集,那么就可以预测猫或预测不是猫,并且大部分都是正确的。学习决策树时,我们必须做出的第一个决定是如何选择在每个节点上分割哪个特征。如下图所示:
构建决策树时需要做出的第二个关键决策是何时停止分割。在决策树中,节点的深度从最顶端的根节点到该特定节点所需的跳数。因此,根节点经过零跳即可到达自身,深度为0
。它下面的注释深度为1
,再往下注释深度为2
。如果决定了决策树的最大深度为2
,那么将不拆分此级别以下的任何节点,以便树永远不会达到深度3
。其次,通过保持树较小,它不太容易过度拟合。决定停止拆分的另一个指标是纯度值是否低于某个阈值。同样,这既是为了保持树较小,也是为了降低过度拟合的风险。最后,如果节点的示例数量低于某个阈值,则会停止拆分。例如,如果我们在根节点上根据脸部形状特征进行拆分,那么右分支将只有三个训练示例,其中一只猫和两只狗,如果不再拆分仅包含三个示例的示例集,而不是将其拆分成更小的子集,并创建一个决策节点,则会预测不是猫。
决策树
如何测量一组示例的纯度(quantify
)?如果这些示例都是同一类的猫,那么它们就非常纯净;如果不是猫,那它们也很纯净;但如果介于两者之间,那么如何量化示例集的纯度?让我们来看看熵的定义,它是衡量一组数据不纯度的指标。给定一组六个示例,例如三只猫和三只狗,我们将1
的示例比例。此示例中的3/6
。这里使用熵函数来测量一组示例的不纯度。熵函数通常用大写字母50:50
时,这条曲线最高,它的熵为1
的比例是5/6
,50:50
变为全是猫,纯度会增加。再看几个例子,这是另一个包含两只猫和四只狗的样本,因此这里的50:50
的混合。最后一个例子,如果我们有一组六只狗,那么
现在,让我们看看熵函数2/3
是猫的样本,那么该样本必须有1/3
不是猫的。这里将2
为底而不是以e
为底的对数。如果要在计算机中绘制此函数,会发现它恰好就是左侧的这个函数。我们取1
,如果我们取0
,表达式将看起来像0
或1
。熵函数是一组数据的不纯度的度量。它从0
开始,上升到1
,然后又下降到0
。
在构建决策树时,在节点上决策哪个特征进行分割基于最小化熵值来选择。最小化熵或减少杂质,或最大化纯度。在决策树学习中,熵的减少称为信息增益。如果在根节点使用耳朵形状特征进行分割,则左边有五个示例,右边有五个示例。在左边,有五只猫中的四只,因此1/3
是猫,因此右侧的4/7
的熵和1/3
的熵分别为0.99
和0.92
,而右节点的杂质程度为0.72
和0.72
。
事实证明,与其查看这些熵值并进行比较,不如对它们进行加权平均值。熵作为杂质的度量,如果数据集非常大且不纯,相比于只有几个示例和一个非常不纯的树分支,熵会更差。关键的决策是在根节点使用的这三种特征选择中,我们要使用哪一个?与每个分割相关的是两个数字,即左子分支的熵和右子分支的熵。为了从中挑选将这两个数字合并为一个数字。将这两个数字合并的方法是取加权平均值。因为在左子分支或右子分支中拥有低熵的重要性还取决于有多少示例进入左子分支或右子分支。如果左子分支中有很多示例,那么确保左子分支的熵值较低似乎更为重要。在这个例子中,10
个例子中有5
个进入了左子分支,计算加权平均值,即10
个例子中的7
个。即
我们从根节点10
个示例开始,根节点中有五只猫和五只狗,因此在根节点,0.5
的熵,然后减去这个公式:0.28、0.03
和0.12
,被称为信息增益(information gain
),它衡量的是分裂后树中熵的减少。因为熵最初在根节点是1
,通过分裂,最终会得到一个较低的熵值,这两个值之间的差就是熵的减少,在耳朵形状分裂的情况下,这个差值为0.28
。为什么要费心计算熵的减少,而不是只计算左、右子分支的熵?事实证明,决定何时不再进一步分裂的停止标准之一是熵的减少是否太小。计算信息增益公式。使用根据耳朵形状特征进行拆分的示例,将
信息增益可以决定如何选择一个特征来分割一个节点。从树根节点的所有训练示例开始,计算所有特征的信息增益,并选择提供最高信息增益的特征进行分割。选择此特征后,根据所选特征将数据集拆分为两个子集,并创建树的左分支和右分支,并将训练示例移动到左分支或右分支。在根节点进行分割,之后,在树的左分支、树的右分支等上重复分割过程。直到满足停止标准。停止标准是:当节点100%
为单个子句时,某个节点的熵值为0
,或者当进一步拆分节点超出设置的最大深度时,或者额外拆分的信息增益小于阈值时,或者当节点中的示例数量低于阈值时。不断重复拆分过程,直到满足选择的停止标准(可能是这些标准中的一个或多个)。如下图所示:
从根节点开始所有示例,并根据计算所有三个特征的信息增益,决定耳朵形状是最佳的拆分特征。基于此,创建左子分支和右子分支,并将具有尖耳朵和松软耳朵的数据子集移动到左子分支和右子分支。当前只关注左子分支,这里有五个示例。继续拆分,直到节点中的所有内容都属于一个类。查看此节点并查看它是否满足拆分标准。下一步是选择一个特征进行拆分。然后,计算每个特征的信息增益,计算胡须特征上的拆分信息增益,以及脸部形状特征上的拆分信息增益。耳朵形状上的拆分信息增益将为0
。在胡须和脸部形状之间,脸部形状的信息增益最高。根据脸部形状进行拆分,按如下方式构建左子分支和右子分支。对于左子分支,我们检查是否停止拆分的标准。停止标准满足,创建一个预测为猫的叶节点。对于右子分支,我们发现所有都是狗。由于已经满足了分裂标准,因此也将停止分裂,并放置一个预测不是猫的叶节点。构建完这棵左子树后,可以将注意力转向构建右子树。要构建右子树,同样有这五个示例。先检查是否满足停止分裂的标准是否满足。所有示例都是一个类,没有满足该标准。继续在这个右子分支中分裂。构建右子分支的过程将很像训练决策树学习算法,数据集仅包含这五个训练示例。计算所有可能分裂的特征的信息增益,你会发现胡须特征使用的信息增益最高。检查此处的左子分支和右子分支是否满足停止分割的标准,最终将得到预测猫和狗猫的叶节点。这是构建决策树的总体过程。在根部构建决策树的方式是通过在左分支和右分支中构建较小的决策树。在构建决策树时,这种方式是通过构建较小的子决策树然后将它们放在一起来构建整体决策树。如何选择最大深度参数。有很多不同的选择,但一些开源库会有很好的默认选择供你使用。一个直觉是,最大深度越大,你构建的决策树就越大。它让决策树学习更复杂的模型,但如果将非常复杂的函数拟合到数据中,它也会增加过度拟合的风险。理论上,使用交叉验证来选择参数,比如最大深度,你可以尝试不同的最大深度值,然后选择在交叉验证集上效果最好的值。虽然在实践中,开源库甚至有更好的方法来为你选择这个参数。或者,你可以使用另一个标准来决定何时停止拆分,即从额外拆分中获得的信息是否小于某个阈值。如果任何特征被拆分,只实现了熵的轻微减少或非常小的信息增益。最后,当节点中的示例数量低于某个阈值时,你可以决定停止拆分。这就是构建决策树的过程。
目前看到的例子中,每个特征只能采用两个可能值中的一个。耳朵形状要么尖要么软,脸形要么圆要么不圆,胡须要么有要么没有。但是,如果您的特征采用两个以上的离散值,耳朵形状不仅尖而软,现在还可以采用椭圆形。因此,初始特征仍然是分类值特征,但它可以采用三个可能值,而不仅仅是两个可能值。当拆分此特征时,最终会创建三个数据子集,并最终为这棵树构建三个子分支。使用one-hot
编码。它们不是使用耳朵形状特征,而是可以采用三个可能值中的任意一个。将创建三个新特征,其中一个特征动物是否有尖耳朵,第二个特征是它们的耳朵是否有松软,第三个特征是它是否有椭圆形耳朵。因此,对于第一个例子,我们之前将耳朵形状定为尖形,现在我们改为说这种动物的尖耳朵特征值为1
,松软和椭圆形的值为0
。对于第二个例子,椭圆形的耳朵,现在会说它的尖耳朵特征值为0
,因为它没有尖耳朵。它也没有松软的耳朵,但它有椭圆形的耳朵。这里不再让一个特征具有三个可能的值,而是构建了三个新特征,每个特征只能采用两个可能值中的一个,即0
或1
。更详细地说,如果分类特征可以采用1
个值等于1
。这就是one-hot
编码的原因。由于这些特征之一将始终采用1
,因此它是热特征。通过这种特征选择,回到了原始设置,即每个特征只能采用两个可能值中的一个,因此之前看到的决策树学习算法将适用于此数据,而无需进一步修改。三个来自耳朵形状的one-hot
编码,一个来自脸部形状,一个来自胡须,现在这五个特征的列表也可以输入到新网络中,训练猫分类器。one-hot
编码是一种适用于决策树学习的技术,还可以使用1
和0
对分类特征进行编码输入到神经网络中,该神经网络也需要数字作为输入。
如何修改决策树以处理连续值的特征。这些特征可以是任何数值。不是仅根据耳朵形状、脸型和胡须进行约束分割。必须根据耳朵形状、脸型胡须或体重进行分割。如果根据体重特征进行分割比其他选项提供更好的信息增益。则根据体重特征进行分割。但是如何根据体重特征进行分割呢?如下图所示:
动物的位置和纵轴是猫在上面而不是猫在下面。所以纵轴表示标签,1
或0
。根据权重特征进行分割。根据权重特征进行约束分割时应该考虑这个阈值的不同值,然后选择最好的一个。最好是产生最佳信息增益的那个。具体来说,如果考虑权重是8
个例子中的3
只猫。根据权重是否小于等于8
进行分割,这将是信息增益。根据权重是否小于等于9
进行分割。计算信息增益为0.24
。或者我们可以尝试另一个值,计算结果如下X
轴的多个值。按照权重或根据此特征的值对所有示例进行排序,并取排序后的训练示例列表中间点的所有值作为此处阈值的考虑值。如果有10
个训练示例,测试此阈值的九个不同可能值,然后选择最高信息增益值。最后,根据此阈值的给定值进行拆分所获得的信息优于根据其他特征进行拆分所获得的信息增益。在这个例子中,0.61
的信息增益比任何其他特征都高。假设算法选择这个特征进行分割,最终会根据动物的重量是
总结一下,让决策树在每个步骤上都处理连续值特征。在进行分割时,只需考虑不同的值进行分割,计算信息增益,并决定在该连续值特征上进行分割(如果它能提供最高的信息增益)。这就是决策树使用连续值特征的方法。尝试不同的阈值,计算信息增益,如果它能从所有特征中选择最佳的信息增益,则根据连续值特征进行分割(使用所选阈值)。
在这里,为回归问题构建了一棵树,其中根节点根据耳朵形状分裂,然后左右子树根据脸部形状分裂。如下图所示,下面的节点将有这四只动物,体重分别为7.2、7.6
,9.2
和10.2
。决策树将根据下面训练示例中的权重平均值进行预测。通过对这四个数字取平均值,结果是8.35
。如果一只动物有尖耳朵,脸型不圆,那么它的体重被预测为9.2
磅。因此,这个模型将给出一个新的测试示例,像往常一样沿着决策节点向下,直到到达叶节点,然后预测叶节点的值,这个值是通过对训练期间到达同一叶节点的动物的体重取平均值而计算出来的。因此,如果使用这个数据集从头开始构建决策树以预测体重。关键决策是如何选择要拆分的特征?用一个例子来说明如何做出决策。在根节点可以做的一件事是按耳朵形状进行拆分,最终会得到树的左右分支,左右各有五只动物。接下来如果选择按脸部形状进行拆分,如下图所示,最终会得到左右两边的这些动物:
给定这三个特征在根节点上进行分割,想选择哪一个来对动物的体重做出最佳预测?在构建回归树时,不是为了降低熵(即分类问题的杂质度量),而是为了降低每个数据子集8.84
。同样,其他的方差减少量分别为0.64,6.22
。在这三个分割示例中,8.84
是方差减少最多的。因此,选择方差减少最多的特征,这就是选择耳朵形状作为特征分割的原因。选择耳朵形状特征进行分割后,在左侧和右侧分支中有两个子集,每个子集各有五个示例,然后,再次使用递归方法,将这五个示例作为分割依据,并创建一个新的决策树,仅关注这五个示例,再次评估要分割的不同特征选项,然后选择使方差减少最多的特征。右侧也类似。继续分割,直到满足不再进一步分割的标准。使用这种技术,决策树不仅用于执行分类问题,还可以用于执行回归问题。
树集成(Tree Ensembles)
使用单个决策树的缺点是决策树对数据的细微变化非常敏感。使算法不那么敏感或更强大的一个解决方案是构建许多决策树,我们称之为树集成(Tree Ensembles
)。上一个示例中,在根节点处进行拆分的最佳特征是耳朵形状,从而产生两个数据子集,然后在这两个数据子集上构建进一步的子树。如果只从十个示例中选择一个并将其更改为另一只猫,这只新猫就不再有尖耳朵、圆脸、没有胡须,而是有松软的耳朵、圆脸、有胡须,拆分时信息增益最高的特征就变成了胡须特征,而不是耳朵形状特征。因此,在左子树和右子树中获得的数据子集变得完全不同,随着继续递归执行决策树学习算法,左子树和右子树上构建出了完全不同的子树。仅仅改变一个训练示例就会导致算法在根部产生不同的分割,从而产生完全不同的树,这使得该算法不那么健壮。也就是说,如果训练的不仅仅是一棵决策树,而是一大堆不同的决策树,会得到更准确的预测。这就是我们所说的树集成(Tree Ensembles
),它只是多棵树的集合。如果有三棵树,每棵树都是将猫和非猫分类的合理方法。如果有一个新的测试样本需要分类,那么需要做的就是在新的样本上运行这三棵树,并让它们投票来决定预测。这个测试样本有尖尖的耳朵、不圆的脸型,还有胡须,所以第一棵树会进行这样的推断,并预测它是一只猫。第二棵树的推断会沿着这条路径穿过树,因此预测它不是猫。第三棵树会沿着这条路径,预测它是一只猫。这三棵树做出了不同的预测,然后让它们投票。这三棵树中大多数预测的票数是猫。这组树的最终预测就是一只猫,这恰好是正确的预测。我们使用树集成(Tree Ensembles
)的原因在于,通过拥有大量决策树并进行投票,可以使算法对任何单个树的行为不那么敏感、更加稳健。
为了说明替换取样的工作原理,使用四个颜色为红色、黄色、绿色和蓝色的标记替换取样的演示。这里有一个空的黑色天鹅绒袋。将四种颜色的标记放入袋中。挑选出一个token
,结果是绿色的。放回一词的意思是,取出下一个token
,然后放回去,再次摇晃,然后取出另一个黄色的token
。然后放回去,取出下一个蓝色的token
,然后再来一次,用蓝色token
替换它,然后再挑选一个,它又是蓝色token
。得到的token
序列是绿色、黄色、蓝色、蓝色。请注意,这里得到了两次蓝色token
,没有得到红色token
。如果重复多次这个替换取样,可能会得到红色、黄色、红色、绿色,绿色、绿色、蓝色、红色,或者红色、蓝色、黄色、绿色。替换取样适用于构建树集成(Tree Ensembles
)。这里构建多个随机训练集,它们都与原始训练集略有不同。具体来说,就是选取10
个猫和狗样本。把这10
个训练样本放入一个理论袋中。创建一个新的随机训练集,其中包含10
个样本,其大小与原始数据集完全相同。随机挑选一个训练样本,然后将其放回袋子中,然后再次随机挑选一个训练样本,将其放回袋中。我们会得到另一个重复的样本,依此类推。直到有10
个训练样本,其中一些是重复的。替换取样的过程可以构建一个与原始训练集略有相似但也有很大不同的新训练集。
我们可以使用替换取样来创建新的训练集,这些训练集与原始训练集有点相似,但也有很大不同。接下来构建第一个树集成(Tree Ensembles
)算法(随机森林算法),这是一种功能强大的树集成算法,其效果比使用单个决策树要好得多。如果给定一个大小为10
个训练示例,则将这10
个训练示例放入虚拟袋中并进行10
次替换取样以生成同样包含10
个示例的新训练集,然后在此数据集上训练决策树。如果用这些数据训练,那么最终会得到决策树。完成一次之后,我们会再重复第二次。使用替换取样的方法来生成另一个包含100
,推荐64~128
之间的任何值。构建了100
棵不同决策树的集合后,这些决策树投票支持预测。将1000
棵树,因为这样只会显著减慢计算速度,而不会提高算法的性能。这个树集合的实例创建有时也称为袋装决策树。这指的是将训练示例放入那个虚拟袋子里。对算法进行了一项修改,以进一步尝试随机化每个节点的特征选择,这会导致树集成(Tree Ensembles
)和学习到的特征变得更加不同。因此,当投票时,会得到更准确的预测。因此,不是从所有特征中进行选择,而是选择少于
多年来,机器学习研究人员想出了很多不同的方法来构建决策树和决策树集合。如今,决策树最常用的方法是一种名为XGBoost
的算法。它运行速度快,开源实现易于使用,也非常成功地赢得了许多机器学习竞赛以及许多商业应用。让我们来看看XGBoost
的工作原理。这里再次是我们之前写下的算法。给定大小为决策树
。即每次循环,除了第一次,就是第二次、第三次等等。在采样时,不是在所有概率相等的XGBoost
,它代表极端梯度提升,这是一种非常快速和高效的提升树的开源实现。 XGBoost
还提供了很好的默认分割标准和何时停止分割的标准选择。XGBoost
的创新之一是它还内置了正则化以防止过度拟合,XGBoost
是一种竞争激烈的算法。XGBoost
和深度学习算法似乎是赢得很多此类竞赛的两种算法。XGBoost
不是替换取样,而是为不同的训练示例分配不同的权重。因此它实际上不需要生成很多随机选择的训练集,这使得它比使用替换取样更有效。
1 | from xgboost import XGBClassifier |
结论
决策树(包括树集成(Tree Ensembles
))和神经网络都非常强大、非常有效的学习算法。在什么场景下使用?来看看它们各自的优缺点。决策树和树集成(Tree Ensembles
)通常适用于结构化数据。如果数据集看起来像一个巨大的电子表格,那么决策树就值得考虑。相比之下,不建议在非结构化数据上使用决策树和树集成(Tree Ensembles
)。这些数据包括图像、视频、音频和文本等。神经网络更适合处理非结构化数据任务。决策树和树集成(Tree Ensembles
)的优势是训练速度非常快。最后,小型决策树具有可解释性。XGBoost
可以替代决策树。树集成(Tree Ensembles
)的一个缺点是它比单个决策树成本要高一点。如果计算预算非常有限,建议使用单个决策树,除此之外,建议使用使用XGBoost
。神经网络与决策树和树集成(Tree Ensembles
)相比,它适用于所有类型的数据,包括结构化数据和非结构化数据。以及包含结构化和非结构化的混合数据。神经网络通常在非结构化数据(如图像、视频、音频和文本)上具有竞争力。但缺点是,神经网络可能比决策树慢。大型神经网络可能需要花费很长时间训练。神经网络的其他好处包括它与迁移学习一起工作,对于许多应用程序来说使用迁移学习,在更大的数据集上进行预训练,并在小数据集上进行微调。最后,如果正在构建一个由多个机器学习模型协同工作的系统,可以串联并训练多个神经网络。对于决策树一次只能训练一个决策树。