机器学习-sklearn第十七天——笔记

目录

  • XGBoost(2)
    • 3 XGBoost的智慧
      • 3.1 选择弱评估器:重要参数booster
      • 3.2 XGB的目标函数:重要参数objective
      • 3.3 求解XGB的目标函数
      • 3.4 参数化决策树fk(x) :参数alpha,lambda
      • 3.5 寻找最佳树结构:求解 ω与Τ
      • 3.6 寻找最佳分枝:结构分数之差
      • 3.7 让树停止生长:重要参数gamma

XGBoost(2)

3 XGBoost的智慧

class xgboost.XGBRegressor (kwargs,max_depth=3, learning_rate=0.1, n_estimators=100, silent=True,
objective=‘reg:linear’, booster=‘gbtree’, n_jobs=1, nthread=None, gamma=0, min_child_weight=1,
max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1,
scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, missing=None, importance_type=‘gain’)

3.1 选择弱评估器:重要参数booster

梯度提升算法中不只有梯度提升树,XGB作为梯度提升算法的进化,自然也不只有树模型一种弱评估器。在XGB中,除了树模型,我们还可以选用线性模型,比如线性回归,来进行集成。虽然主流的XGB依然是树模型,但我们也可以使用其他的模型。基于XGB的这种性质,我们有参数“booster"来控制我们究竟使用怎样的弱评估器。
机器学习-sklearn第十七天——笔记_第1张图片

两个参数都默认为"gbtree",如果不想使用树模型,则可以自行调整。当XGB使用线性模型的时候,它的许多数学过程就与使用普通的Boosting集成非常相似,因此我们在讲解中会重点来讲解使用更多,也更加核心的基于树模型的XGBoost。简单看看现有的数据集上,是什么样的弱评估器表现更好:

3.2 XGB的目标函数:重要参数objective

梯度提升算法中都存在着损失函数。不同于逻辑回归和SVM等算法中固定的损失函数写法,集成算法中的损失函数是可选的,要选用什么损失函数取决于我们希望解决什么问题,以及希望使用怎样的模型。比如说,如果我们的目标是进行回归预测,那我们可以选择调节后的均方误差RMSE作为我们的损失函数。如果我们是进行分类预测,那我们可以选择错误率error或者对数损失log_loss。只要我们选出的函数是一个可微的,能够代表某种损失的函数,它就可以是我们XGB中的损失函数。
在众多机器学习算法中,损失函数的核心是衡量模型的泛化能力,即模型在未知数据上的预测的准确与否,我们训练模型的核心目标也是希望模型能够预测准确。在XGB中,预测准确自然是非常重要的因素,但我们之前提到过,XGB的是实现了模型表现和运算速度的平衡的算法。普通的损失函数,比如错误率,均方误差等,都只能够衡量模型的表现,无法衡量模型的运算速度。回忆一下,我们曾在许多模型中使用空间复杂度和时间复杂度来衡量模型的运算效率。XGB因此引入了模型复杂度来衡量算法的运算效率。因此XGB的目标函数被写作:传统损失函数 + 模型复杂度。

目标函数:可能的困惑
与其他算法一样,我们最小化目标函数以求模型效果最佳,并且我们可以通过限制n_estimators来限制我们的迭代次数,因此我们可以看到生成的每棵树所对应的目标函数取值。目标函数中的第二项看起来是与 棵树都相关,但我们的第一个式子看起来却只和样本量相关,仿佛只与当前迭代到的这棵树相关,这不是很奇怪么?
机器学习-sklearn第十七天——笔记_第2张图片

由于xgb中所有的参数都需要自己的输入,并且objective参数的默认值是二分类,因此我们必须手动调节。试试看在其他参数相同的情况下,我们xgboost库本身和sklearn比起来,效果如何:
机器学习-sklearn第十七天——笔记_第3张图片

3.3 求解XGB的目标函数

在求解XGB的目标函数的过程中,我们考虑的是如何能够将目标函数转化成更简单的,与树的结构直接相关的写法,以此来建立树的结构与模型的效果(包括泛化能力与运行速度)之间的直接联系。也因为这种联系的存在,XGB的目标函数又被称为“结构分数”。

机器学习-sklearn第十七天——笔记_第4张图片

3.4 参数化决策树fk(x) :参数alpha,lambda

class xgboost.XGBRegressor (max_depth=3, learning_rate=0.1, n_estimators=100, silent=True,
objective=‘reg:linear’, booster=‘gbtree’, n_jobs=1, nthread=None, gamma=0, min_child_weight=1,
max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1,
scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, missing=None, importance_type=‘gain’,*kwargs)

在参数化决策树之前,我们先来简单复习一下回归树的原理。对于决策树而言,每个被放入模型的任意样本 最终一个都会落到一个叶子节点上。对于回归树,通常来说每个叶子节点上的预测值是这个叶子节点上所有样本的标签的均值。但值得注意的是,XGB作为普通回归树的改进算法,在 上却有所不同。
机器学习-sklearn第十七天——笔记_第5张图片

当有多棵树的时候,集成模型的回归结果就是所有树的预测分数之和,假设这个集成模型中总共有 棵决策树,则整个模型在这个样本 上给出的预测结果为:
机器学习-sklearn第十七天——笔记_第6张图片

对于两种正则化如何选择的问题,从XGB的默认参数来看,我们优先选择的是L2正则化。当然,如果想尝试L1也不是不可。两种正则项还可以交互,因此这两个参数的使用其实比较复杂。在实际应用中,正则化参数往往不是我们调参的最优选择,如果真的希望控制模型复杂度,我们会调整 而不是调整这两个正则化参数,因此大家不必过于在意这两个参数最终如何影响了我们的模型效果。对于树模型来说,还是剪枝参数地位更高更优先。大家只需要理解这两个参数从数学层面上如何影响我们的模型就足够了。如果我们希望调整 和 ,我们往往会使用网格搜索来帮助我们。在这里,为大家贴出网格搜索的代码供大家分析和学习。

机器学习-sklearn第十七天——笔记_第7张图片

3.5 寻找最佳树结构:求解 ω与Τ

在上一节中,我们定义了树和树的复杂度的表达式,树我们使用叶子节点上的预测分数来表达,而树的复杂度则是叶子数目加上正则项:
机器学习-sklearn第十七天——笔记_第8张图片

3.6 寻找最佳分枝:结构分数之差

贪婪算法指的是控制局部最优来达到全局最优的算法,决策树算法本身就是一种使用贪婪算法的方法。XGB作为树的集成模型,自然也想到采用这样的方法来进行计算,所以我们认为,如果每片叶子都是最优,则整体生成的树结构就是最优,如此就可以避免去枚举所有可能的树结构。
机器学习-sklearn第十七天——笔记_第9张图片

回忆一下决策树中我们是如何进行计算:我们使用基尼系数或信息熵来衡量分枝之后叶子节点的不纯度,分枝前的信息熵与分治后的信息熵之差叫做信息增益,信息增益最大的特征上的分枝就被我们选中,当信息增益低于某个阈值时,就让树停止生长。在XGB中,我们使用的方式是类似的:我们首先使用目标函数来衡量树的结构的优劣,然后让树从深度0开始生长,每进行一次分枝,我们就计算目标函数减少了多少,当目标函数的降低低于我们设定的某个阈值时,就让树停止生长。来个具体的例子,在这张图中,我们有中间节点“是否是男性”,这个中间节点下面有两个叶子节点,分别是样本弟弟和妹妹。我们来看看这个分枝点上,树的结构分数之差如何表示。
机器学习-sklearn第十七天——笔记_第10张图片

3.7 让树停止生长:重要参数gamma

机器学习-sklearn第十七天——笔记_第11张图片

如此,我们可以直接通过设定 的大小来让XGB中的树停止生长。 因此被定义为,在树的叶节点上进行进一步分枝所需的最小目标函数减少量,在决策树和随机森林中也有类似的参数(min_split_loss,min_samples_split)。 设定越大,算法就越保守,树的叶子数量就越少,模型的复杂度就越低。
在这里插入图片描述

如果我们希望从代码中来观察 的作用,使用sklearn中传统的学习曲线等工具就比较困难了。来看下面这段代码,这是一段让参数 在0~5之间均匀取值的学习曲线。
机器学习-sklearn第十七天——笔记_第12张图片

可以看到,我们完全无法从中看出什么趋势,偏差时高时低,方差时大时小,参数 引起的波动远远超过其他参数(其他参数至少还有一个先上升再平稳的过程,而 则是仿佛完全无规律)。在sklearn下XGBoost太不稳定,如果这样来调整参数的话,效果就很难保证。因此,为了调整 ,我们需要来引入新的工具,xgboost库中的类
xgboost.cv。
xgboost.cv (params, dtrain, num_boost_round=10, nfold=3, stratified=False, folds=None, metrics=(), obj=None,
feval=None, maximize=False, early_stopping_rounds=None, fpreproc=None, as_pandas=True, verbose_eval=None,
show_stdv=True, seed=0, callbacks=None, shuffle=True)
机器学习-sklearn第十七天——笔记_第13张图片

为了使用xgboost.cv,我们必须要熟悉xgboost自带的模型评估指标。xgboost在建库的时候本着大而全的目标,和sklearn类似,包括了大约20个模型评估指标,然而用于回归和分类的其实只有几个,大部分是用于一些更加高级的功能比如ranking。来看用于回归和分类的评估指标都有哪些:
机器学习-sklearn第十七天——笔记_第14张图片
机器学习-sklearn第十七天——笔记_第15张图片
机器学习-sklearn第十七天——笔记_第16张图片

你可能感兴趣的:(机器学习,sklearn,人工智能)