从零开始基于树的建模完整教程(R&Python)(下)

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

    1.首先,我们使决策树到一个很大的深度。    

    2.然后,我们开始在底部删除与顶部相比给我们负回报的叶子。    

    3.假设一个分裂给我们增加-10(损失10),然后下一个分裂我们获得了10。一个简单的决策树将停止在步骤1剪枝,我们会看到整体收益是10,并保留两个叶子。

注意,sklearn的决策树分类器目前不支持剪枝。像xgboost这样先进的包在它们的实现里已经采用剪枝。R中的rpart库提供了一个函数来剪枝。对R用户是好消息!

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

我们中的很多人都有这个疑问“如果分类问题我可以使用逻辑回归,回归问题可以使用线性回归,为什么需要使用树?”而且,这也是一个有效的一个。

事实上,你可以使用任何算法。它取决于你正在解决的问题的类型。让我们看一些关键因素,这将有助于你决定使用哪种算法:    

    1.如果因变量和自变量之间的关系是近似一个线性模型,线性回归将优于树模型。    

    2.如果因变量与自变量之间的是一个高非线性并复杂的关系,树模型将优于经典的回归方法。    

    3.如果你需要建立一个易于向人们解释的模型,决策树模型将永远比线性模型做得好。决策树模型比线性回归解释起来更简单!

6、在R和Python中使用决策树

对于R用户和Python用户,决策树很容易实现。让我们快速看一组代码,它可以让你开始使用这个算法。为了便于使用,我分享标准代码,你需要更换你的数据集名和变量来开始。对于R用户,有多个 包可以实现决策时,如ctree,rpart,tree等。
c1.png

在上面的代码中:
y_train — 代表因变量
x_train — 代表自变量
x — 代表训练数据
对于Python用户,下面是代码:

c2.png

7、基于树的建模的集成方法是什么?

词“集合”的字面意思是。集成方法涉及到预测模型,以实现精度更高和模型稳定性。集成方法以授予最高提升树的基本模型而著称。
像其他模型,树模型也存在偏差和方差的烦扰。偏差的意思是,‘预测值的平均值不同于实际值是多少。’方差的意思是,‘相同人口的不同样本在相同点上模型预测的差异’。
你建立一个小树,你会得到一个低方差和高偏差的模型。你如何权衡偏差和方差?
通常,当增加模型的复杂性,由于模型中较低的偏差,你将看到预测误差减少。当继续让模型更复杂,模型最终会过拟合而且开始遭遇高方差。
一流的模型应该保持这两种类型错误的平衡。这就是所谓的偏差方差权衡管理。集成学习是实现这种权衡分析的一种方法。

14.png

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

8、什么是Bagging?它是如何工作的?

Bagging是一种技术,通过结合相同数据集的不同子样本的多分类器模型的结果,以减少我们预测的方差。下图将使它更清晰:

15.png

bagging的步骤是:
1.创建多个数据集:

  • 采样在原数据有放回和形成新数据完成。

  • 新数据集可以有列和行的一部分,这通常是bagging模型中的超参数

  • 取行和列部分小于1有助于模型健壮,不易于过拟合

2.建立多个分类器:

  • 分类器建立在每个数据集。

  • 通常相同的分类器在每个数据集建模并预测。

3.组合分类器:

  • 所有分类器的预测进行组合,根据手头的问题通过平均值,中值或模值。

  • 组合值一般比单一模型更健壮。

注意,这里建造的模型的数量不是超参数。模型数量较多比较少总是更好或可能会提供类似性能。理论上可以证明,在一些假设条件下,组合预测的方差减少到原方差的1/n(n: 分类器的数量)。

bagging模型有各种不同的实现。随机森林是其中之一,接下来我们将讨论它。

9、什么是随机森林?它是如何工作的?

随机森林被认为是所有数学科学问题的灵丹妙药。一个有趣的注意点,当你想不出任何算法(无论什么情况),使用随机森林!
随机森林是一种多功能的机器学习方法能够执行回归和分类任务。它还承担降维方法,处理缺失值,离群值以及数据探索的其它必要措施,并做一个相当好的工作。它是一种集成学习的方法,一群弱模型相结合形成强大的模型。

它是如何工作的?

随机森林中,我们种植多棵树与CART模型中种一棵树相反(看CART和随机森林的比较,第一部分第二部分)。为了一个新对象基于属性进行分类,每棵树给出一个分类,我们说树为该分类“投票”。森林选择有最多票数的分类(森林中的所有树),在回归时,它取不同树输出的平均值。

16.png

它以下列方式工作。每棵树种植和成长如下:
    1.假设训练集的个数是N。这N个样本采取随机但有放回。此样本用于生长树的训练集。
    2.如果有M个输入变量,每个节点指定一个数m<M,m变量从M中随机选择出的。在这些m上最好的分裂时用来分裂节点。当我们生长森林的时候,m的值是恒定的。
    3.每棵树都长到最大程度,而且没有剪枝。
    4.通过聚合n棵树的预测值预测新数据(例如,分类的多数票,回归的平均值)。

17.jpeg

通过案例研究更详细的了解该算法,请阅读这篇文章“随机森林概论-简明版”。

随机森林的优点

  • 该算法可以解决分类和回归两种类型的问题并且在这两方面做适当的估计。

  • 最让我兴奋的随机森林的好处之一是,高维处理大数据集的能力。它可以处理成千上万的输入变量并识别最重要的变量,因此它被认为是降维方法之一。而且,该模型输出变量的重要性,这可以是一个非常方便的特性(在一些随机数据集)。

18.png

  • 它有一个有效的方法来估计丢失的数据,并且大部分数据丢失时保持精度。

  • 它平衡数据集中分类不平衡地方的错误。

  • 上述功能可以扩展到未标记数据,导致无监督聚类,数据视图和异常值检测。

  • 随机森林涉及到输入数据的重复抽样称为bootstrap抽样。这里有三分之一的数据不用于训练,可用于测试。这些被称为袋外样本。这些袋外样本的误差估计值被称为袋外错误率。通过袋外误差估计的研究,提供证据表明袋外估计与使用相同大小的测试集作为训练集一样准确。因此,使用袋外估计消除了备用测试集的必要性。

随机森林的缺点

  • 分类它肯定工作的很好,但不及回归问题,因为它不提供精确的连续性的预测。对于回归,它不预测超出训练数据的范围,它们可能是特别噪的过拟合数据集。

  • 随机森林感觉就像是统计建模的黑盒子方法——你对模型几乎没有控制。你最好的——尝试不同的参数和种子!

Python和R实现

R包和Python scikit-learn中,随机森林有常见的实现。下面我们看看R和Python中加载随机森林模型的代码:

Python

c3.png

R代码

c31.png

10、什么是Boosting?它是如何工作的?

定义:术语‘Boosting’是指一系列将弱学习器转化为强学习器的算法。

通过解决垃圾邮件识别这个问题来详细了解该定义:如何将一封邮件分为是否是垃圾?和其他人一样,我们最初的方法是通过以下标准识别‘垃圾邮件’和‘不是垃圾邮件’。如果:
    1.电子邮件只有一个图像文件(宣传图片),是垃圾邮件。
    2.电子邮件只有链接,是垃圾邮件。
    3.电子邮件正文包含句子“你赢得了XXXXXX奖金”,是垃圾邮件
    4.电子邮件来自我们官方域名“Analyticsvidhya.com”,不是垃圾邮件
    5.电子邮件来自已知源,不是垃圾邮件
以上,我们已经定义了多个规则来分类一封邮件是“垃圾邮件”或者“不是垃圾邮件”。但是,你认为这些规则单独地是否足够强大到足以成功地分类一封邮件?不能。
这些规则没有强大到足以将一封邮件分类为‘垃圾邮件’或者‘不是垃圾邮件’。因此,这些规则被称为弱学习器
为了将弱学习器转化为强学习器,我们会使用像下面的方法,组合每个弱学习器的预测值:

  • 使用平均值/加权平均值

  • 考虑具有较高投票的预测

例如:以上,我们定义了5个弱学习器。这5个中,有3个投票是‘垃圾邮件’,2个投票‘不是垃圾邮件’。在这种情况下,默认,我们会考虑一封电子邮件是垃圾邮件因为’垃圾邮件‘的投票更高(3)。

它是如何工作的?

现在我们知道,boosting组合弱学习器又称基学习器形成一个强规则。你脑海中应该立即提出一个问题,“boosting如何识别弱规则?”
为了寻找弱规则,我们应用有不同分布的基学习(ML)算法。每次应用基学习算法,它产生一个新弱预测规则。这是一个迭代的过程。经过多次迭代,boosting算法将这些弱规则组合成一个强预测规则。

另一个问题可能会困扰你,‘我们如何为每一轮选择不同的分布?’
为了选择正确的,这里有以下步骤:
步骤1:基学习器需要所有的分布,每个观察分配相等的权重或关注。
步骤2:如果第一基学习算法引起任何预测误差,那么我们更关注有预测误差的观测。然后,我们应用下一个基学习算法。
步骤3:重复步骤2直到达到基学习算法的限制或达到更高精度。
最后,它组合弱学习器的输出,并创建一个最终提升模型预测能力的强学习器。Boosting更高关注分类错误或通过前面的弱规则有更高错误的例子。
本教程中,我们将学习两种最常用的算法,即Gradient Boosting (GBM)和XGboost。

11、GBM和Xgboost哪个更强大?

我一直很欣赏boostring的能力—xgboost算法。与GBM的实现相比,有时它提供了更好的结果,有时收获可有可无。当我更多地探索它的性能和高精度背后的科学,我发现很多Xgboost相对于GBM的优势:
    1.正则化

  • 标准的GBM实现没有像XGBoost的正则化,正则化有助于减少过拟合。

  • 实际上,XGBoost也被称为‘正则化boosting’技术。

    2.并行处理

  • XGBoost实现并行处理,相比GBM飞快。

  • 不过,众所周知,boosting是顺序处理的,它怎么可能并行呢?每棵树的构造在前一棵树之后,因此什么阻止我们使用所有的内核构造一棵树?我希望你理解了这句话的意思。看看这个链接,进一步探索。

  • Hadoop上也支持XGBoost实现。

    3.高灵活性

  • XGBoost允许用户定义自定义优化目标和评定标准。

  • 这增加了一个全新的维度,我们的处理不会受到任何限制。

    4.处理缺失值

  • XGBoost有内置的缺失值处理程序。

  • 用户需要提交与观测值不同的值,该值作为参数传递。XGBoost在每个节点遇到缺失值时会尝试不同的事情,并学习以后如何处理缺失值。

    5.剪枝:

  • 当分裂遇到负损失时,GBM将停止分裂节点。因此,它是一个贪婪算法。

  • XGBoost分裂到指定的max_depth,反向剪枝,去掉不再有正值的分裂。

  • 这种做法的另一个优点是,有时分裂负损失如-2后面有个正损失+10。GBM在-2处停下,XGBoost将继续分裂,它将发现这两个分裂共同影响+8,保留这两个。

    6.内置交叉验证

  • XGBoost允许在boosting处理中每轮迭代进行交叉验证,因此,很容易得到boosting迭代单次运行的最佳数。

  • 而GBM使用网格搜索,只能检测有限个值。

    7.在已有模型上继续

  • XGBoost模型可以从上一轮的结果上继续训练。这在某些特定的应用上是一个显著的优势。

  • sklearn中的GBM实现也有这个功能,两种算法在这一点是一致的。

12、R和Python中使用GBM

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

1.初始化结果
2.迭代从1到树的总数
  2.1 根据之前的运行更新目标权重(更高的分类错误)
  2.2 用选择的子样本数据拟合模型
  2.3 对全部观测值进行预测
  2.4 用当前结果更新输出,考虑学习速率
3. 返回最终输出

这是一个非常简单(也许幼稚)的GBM工作说明。它有助于每一个初学者了解这个算法。
Python中,提高模型性能的GBM参数:
    1.learning_rate 

  • 该参数决定每棵树最终结果(步骤2.4)的影响。GBM设定了初步估计值,用每棵树的输出更新该值。learning参数控制这种变化的幅度。

  • 较低的值通常是首选,因为它们使模型更健壮针对树的具体特征,从而更好地概况。

  • 较低的值需要更多的树来建模所有的关系,并将需要大量计算。

    2.n_estimators

  • 模型化的序列树的个数(步骤2)

  • 虽然GBM在有很多树时依然稳健,但还是可能过拟合。应该用CV调整一个特定的学习速率。

    3.subsample

  • 每棵树选择的部分观察值。随机采样的。

  • 用稍小于1的值通过减少方差使模型更稳健。

  • 典型值~0.8就可以,可以进一步微调。

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

    1.loss 

  • 每个分裂中被最小化的损失函数。

  • 分类和回归中它有不同的值。一般默认值就可以。只有当你理解它们对模型的影响时,才选择其它值。

    2.init    

  • 该参数影响输出的初始化。

  • 如果我们有其他模型,其结果作为GBM初步估计,这时就可以用init。

    3.random_state

  • 随机数种子,每次产生相同的随机数。

  • 对于参数调优重要。如果不固定这个随机数,后续相同的参数运行得到不同的结果,这样很难比较模型。

  • 一个特定的随机样本可能导致过拟合。可以尝试用不同随机样本运行模型,这需要大量计算,因而一般不采用。

    4.verbose

  • 建模完成时打印的输出类型。取值如下:
    0:无输出(默认)
    1:某些区间的树输出
    >1:所有树输出

    5.warm_start

  • 这个参数用起来有趣,公正地使用可以有很大的帮助。

  • 使用它可以用一个建好的模型来训练额外的树。这可以节省大量时间,对于高级应用应该探索这个选项。

    6.presort

  • 为了更快分裂,选择是否对数据进行预排序。

  • 默认自动选择,如果需要可以更改。

参数列表很长,我将它简化到一个Excel文件中,可以从GitHub仓库 下载。
R用户使用caret包,有3个主要调优参数:
    1.n.trees — 迭代次数即用于生长树的树
    2.interaction.depth – 它决定树的复杂性即一棵树必须执行的拆分总数(从一个单一节点开始)
    3.shrinkage – 学习速率,类似python中的learning_rate(如上所示)。
    4.n.minobsinnode – 在一个节点执行分裂所需的最小数量的训练样本

GBM在R中(用交叉验证)

我已分享R和Python的标准代码。下面的代码需要修改因变量的值和数据集名。鉴于R中容易实现GBM,用此包很容易执行像交叉验证和网格搜索那样的任务。

c4.png

GBM在Python中

c5.png

13、在R和Python中使用XGBoost

XGBoost (eXtreme Gradient Boosting) 是gradient boosting算法的先进实现。并行计算的特点使它比现有的gradient boosting实现至少快10倍。它支持各种目标函数,包括回归,分类和排名。

R教程:这是针对R用户的R语言解释代码和参数的XGboost的完整教程。查看教程。

Python教程:这是针对Python用户的XGBoost的全面教程。查看教程。

14、在哪里实践?

实践是掌握任何概念的正确方法。因此,想要掌握这些算法,需要练习。

关于树模型的具体实现,已取得重要认识。可以参与开放的实践问题,检查你在排行榜上的排名:

回归:大卖场销售预测

分类:贷款预测

尾注

基于树的算法对每个数据科学家学习很重要。实际上,树模型号称在所有机器学习算法中提供最佳性能。本教程学习了GBM和XGBoost,并以此为止。

我们讨论srcatch的树模型。得知决策树的重要性和简化概念如何用于boosting算法。建议在实际中继续练习这些算法。注意boosting算法相关参数。希望本教程在树模型方面全面的知识充实你。

你认为这个教程有用吗?如果你有这方面的经验,使用树模型时你用到的最好诀窍是什么?欢迎在下面的评论部分,分享你的诀窍,建议和意见。

 

2月15日11:00到13:00网站停机维护,13:00前恢复