图解机器学习 | XGBoost模型详解

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: XGBoost一个非常强大的Boosting算法工具包,本文讲解XGBoost的算法原理和工程实现,包括监督学习、回归树、集成、Gradient Boosting详细步骤,以及XGBoost的并行列块涉及、缓存访问等工程优化知识。

ShowMeAI研究中心

作者:韩信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/34
本文地址http://www.showmeai.tech/article-detail/194
声明:版权所有,转载请联系平台与作者并注明出处

收藏 ShowMeAI 查看更多


引言

XGBoost 是 eXtreme Gradient Boosting 的缩写称呼,它是一个非常强大的 Boosting 算法工具包,优秀的性能(效果与速度)让其在很长一段时间内霸屏数据科学比赛解决方案榜首,现在很多大厂的机器学习方案依旧会首选这个模型。

XGBoost 在并行计算效率、缺失值处理、控制过拟合、预测泛化能力上都变现非常优秀。本文我们给大家详细展开介绍 XGBoost,包含「算法原理」和「工程实现」两个方面。

关于XGBoost的工程应用实践,欢迎大家参考ShowMeAI的另外一篇实战文章 XGBoost工具库建模应用详解

(本篇 XGBoost 部分内容涉及到机器学习基础知识、决策树/回归树/GBDT算法,没有先序知识储备的宝宝可以查看ShowMeAI的文章 图解机器学习 | 机器学习基础知识决策树模型详解回归树模型详解)及图解机器学习 | GBDT模型详解)。

1.算法原理可视化解读

关于 XGBoost 的原理,其作者陈天奇本人有一个非常详尽的Slides做了系统性的介绍,我们在这里借助于这个资料给大家做展开讲解。

1)监督学习中的一些重要概念

在开始介绍 Boosted Tree 之前,我们先来回顾一下机器学习中的一些重要的概念。

(1)监督学习核心要素

XGBoost最全解析; 监督学习重要概念; 监督学习核心要素; 10-1

符号(Notations):equation?tex=x_i%20%5Cin%20R%5Ed 表示训练集中的第 equation?tex=i 个样本。

模型(Model):对于已知的 equation?tex=x_i 如何预测 equation?tex=%5Chat%7By%7D_i

线性模型(Linear Model) equation?tex=%5Chat%7By%7D_%7Bi%7D%3D%5CSigma_%7Bj%7D%20w_%7Bj%7D%20x_%7Bij%7D (包括线性回归和逻辑回归),预测值 equation?tex=%5Chat%7By%7D_i 根据不同的任务有不同的解释:

  • 线性回归(Linear Regression):equation?tex=%5Chat%7By%7D_i 表示预测的分数。
  • 逻辑回归(Logistic Regression):%281%2Be%5E%7B-%5Chat%7By%7D_i%7D%29 预测了实例为正的概率。
  • 其他:例如在排名任务中 equation?tex=%5Chat%7By%7D_i 可以是排名分数。

XGBoost最全解析; 监督学习重要概念; 监督学习进阶知识; 10-2


参数(Parameters):需要从数据中学习的东西。

  • 线性模型(Linear Model):equation?tex=%5CTheta%20%3D%5Cleft%5C%7Bw_j%7Cj%3D1%2C2%2C%5Cdots%2Cd%5Cright%5C%7D


目标函数(Objective function) equation?tex=Obj%28%5CTheta%20%29%3DL%28%5CTheta%20%29%2B%5COmega%20%28%5CTheta%20%29

  • equation?tex=L%28%5CTheta%20%29 代表训练损失函数(Training Loss),表示模型多好的拟合了训练数据。
  • equation?tex=%5COmega%20%28%5CTheta%20%29 为正则化项(Regularization)衡量了模型的复杂程度。


训练数据损失函数(Training Loss) equation?tex=L%3D%5CSigma_%7Bi%3D1%7D%5E%7Bn%7Dl%28y_i%2C%5Chat%7By%7D_i%29


  • 平方损失(Square Loss):equation?tex=l%28y_i%2C%5Chat%7By%7D_i%29%3D%28y_i-%5Chat%7By%7D_i%29%5E2


  • 逻辑损失(Logistic Loss):equation?tex=l%28y_i%2C%5Chat%7By%7D_i%29%3Dy_iln%281%2Be%5E%7B-%5Chat%7By%7D_i%7D%29%2B%281-y_i%29ln%281%2Be%5E%7B%5Chat%7By%7D_i%7D%29


正则化项(Regularization):描述了模型的复杂程度。

  • L1 Norm(lasso)equation?tex=%5COmega%20%28w%29%3D%5Clambda%7C%7Cw%7C%7C_1
  • L2 Normequation?tex=%5COmega%20%28w%29%3D%5Clambda%7C%7Cw%7C%7C%5E2

(2)监督学习进阶知识

XGBoost最全解析; 算法原理可视化; 目标函数; 10-3


Ridge回归equation?tex=%5CSigma_%7Bi%3D1%7D%5E%7Bn%7D%28y_i-w%5ETx_i%29%5E2%2B%5Clambda%7C%7Cw%7C%7C%5E2

  • Ridge 是线性模型(Linear Model),用的是平方损失(Square Loss),正则化项是 L2 Norm。


Lassoequation?tex=%5CSigma_%7Bi%3D1%7D%5E%7Bn%7D%28y_i-w%5ETx_i%29%5E2%2B%5Clambda%7C%7Cw%7C%7C_1

  • Lasso是线性模型(Linear Model),用的是平方损失(Square Loss),正则化项是L1 Norm。


逻辑回归(Logistic Regression):equation?tex=%5CSigma_%7Bi%3D1%7D%5E%7Bn%7D%28y_iln%281%2Be%5E%7B-w%5ETx_i%7D%29%2B%281-y_i%29ln%281%2Be%5E%7Bw%5ETx_i%7D%29%29%2B%5Clambda%7C%7Cw%7C%7C%5E2

  • 逻辑回归是线性模型(Linear Model),用的是逻辑损失(Logistic Loss),正则化项是 L2 Norm。

(3)目标函数及偏差方差权衡

回顾一下目标函数 equation?tex=Obj%28%5CTheta%20%29%3DL%28%5CTheta%20%29%2B%5COmega%20%28%5CTheta%20%29,为什么目标函数需要两部分组成呢?

XGBoost最全解析; 监督学习重要概念; 目标函数; 10-4

  • 优化训练损失函数(Training Loss)有助于建立预测模型,很好地拟合训练数据至少能让你更接近潜在的训练数据的分布。
  • 优化正则化项(Regularization)有助于建立简单的模型:模型越简单,未来预测的方差越小,预测越稳定。

2)回归树(Regression Tree)和集成(Ensemble)

(1)回归树(Regression Tree)

回归树,也就是分类回归树(Classification and Regression Tree)(详情请查看ShowMeAI文章回归树模型详解

  • 决策规则和决策树一样
  • 每个叶子结点有一个值

(2)回归树集成(Regression Tree Ensemble)

XGBoost最全解析; 回归树和集成; 回归树集成; 10-5

从上图的左图可以看出,共有 equation?tex=5 个训练样本。

从上图的中图可以看出,每个叶子节点都有预测值:第一个叶子结点的预测值是 equation?tex=2,第二个叶子结点的预测值是 equation?tex=0.1,第三个叶子结点的预测值是 equation?tex=-1

  • 小男孩被分到第一个叶子结点中,所以小男孩的预测值是 equation?tex=2
  • 小女儿被分到第二个叶子结点,她的预测值是 equation?tex=0.1
  • 剩余的三个人(样本)被分到第三个叶子结点中,他们的值都是 equation?tex=-1

最终的预测值就是样本在每颗树中所在的叶子结点的预测值的和。

(3)树集成方法

树集成的方法使用非常广泛,像GBM、随机森林等(详见ShowMeAI文章 图解机器学习 | GBDT模型详解图解机器学习 | 随机森林分类模型详解)。多达半数的数据挖掘竞赛通过使用各种各样的树集成方法而获胜。

  • 不受输入量纲的影响,因此不需要对特性进行细致的标准化。
  • 学习特征之间的高阶交互(高阶交叉特征)。
  • 可以扩展,用于不同的行业。

(4)Boosted Tree的模型和参数

XGBoost最全解析; 回归树和集成; Boosted Tree; 10-6

模型:假设我们有 equation?tex=K 棵树:equation?tex=%5Chat%7By%7D_i%3D%5CSigma_%7Bk%3D1%7D%5EKf_k%28x_i%29%2C%20f_k%5Cin%20F。其中,equation?tex=F 为包含所有回归树的函数空间。

  • 回归树是一个将属性映射到分数的函数。


参数:包括每棵树的结构和叶子结点中的分数。或者使用函数当作参数:equation?tex=%5CTheta%20%3D%5Cleft%5C%7Bf_1%2Cf_2%2C%E2%80%A6%2Cf_K%5Cright%5C%7D

  • 这里我们不学习 equation?tex=R%5Ed 的权重,我们在Boosted Tree中学习函数(树)。

(5)在单变量上学习Boosted Tree

单变量也就是单个特征,通过了解如何在单变量上学习 Boosted Tree,我们可以对 Boosted Tree 的学习模式有个简单的概念。

举例:假设回归树只有一个输入变量 equation?tex=t (时间),希望预测小哥在 equation?tex=t 时刻有多喜欢浪漫音乐

XGBoost最全解析; 回归树和集成; Boosted Tree; 10-7

从上左图可以看到,这位小哥在单身的时候,对浪漫音乐的喜欢程度很低;但是当他遇到了女朋友,随着体内荷尔蒙的分布增加,他对浪漫音乐的喜欢程度增加了;但是有一天分手了,他对浪漫音乐的喜欢程度又变低了。当然,我们也可以发现,上右图的回归树很容易能表达上左图。


为了构建上右图的树,我们需要学习两个东西:

  • 1、分裂的点;
  • 2、每个分段上的高。

XGBoost最全解析; 回归树和集成; Boosted Tree; 10-8

单变量回归树的目标(阶跃函数)

  • 训练损失:函数如何拟合点?
  • 正则化:如何定义函数的复杂度?(分裂点的个数和每段高度的L2 Norm?)

XGBoost最全解析; 回归树和集成; Boosted Tree; 10-9

  • 图(1)是小哥在每个时间上对浪漫音乐的喜欢程度的散点图;
  • 图(2)可以看到有太多的分割,模型的复杂度很高,所以模型的 equation?tex=%7B%20%5COmega%20%28f%29%7D 很高;
  • 图(3)可以看到模型的拟合程度很差,所以 equation?tex=%7BL%20%28f%29%7D 很高;
  • 图(4)是最好的,无论是拟合程度和复杂程度都非常合适;

(6)一般情形的Boosted Tree

首先回顾上面我们对Boosted Tree的定义:


模型:假设我们有 equation?tex=K 棵树:equation?tex=%5Chat%7By%7D_i%20%3D%20%5CSigma_%7Bk%3D1%7D%5E%7BK%7D%20f_k%28x_i%29%2C%20f_k%5Cin%20F


目标函数equation?tex=Obj%3D%5CSigma_%7Bi%3D1%7D%5Enl%28y_i%2C%5Chat%7By%7D_i%29%2B%5CSigma_%7Bk%3D1%7D%5EK%5COmega%20%28f_k%29

  • equation?tex=%5CSigma_%7Bi%3D1%7D%5Enl%28y_i%2C%5Chat%7By%7D_i%29 是成本函数
  • equation?tex=%5CSigma_%7Bk%3D1%7D%5EK%5COmega%20%28f_k%29 是正则化项,代表树的复杂程度,树越复杂正则化项的值越高(正则化项如何定义我们会在后面详细说)。


当我们讨论树的时候,通常是启发式的:

XGBoost最全解析; 回归树和集成; Boosted Tree; 10-10

  • 通过信息增益来做分裂
  • 修剪树木
  • 最大深度
  • 平滑叶值

大多数启发式算法都能很好地映射到目标函数,采用形式(目标)视图让我们知道我们正在学习什么:

XGBoost最全解析; 回归树和集成; Boosted Tree; 10-11

  • 信息增益 → 训练损失
  • 修剪 → 对节点的正则化
  • 最大深度 - 函数空间上的约束
  • 平滑叶片值 - L2正则化对叶片的权重


回归树集成定义了如何得到预测值,它不仅仅可以做回归,同样还可以做分类和排序。具体做什么任务依赖于「目标函数」的定义:

  • 使用平方误差:可以得到用于回归问题的 gradient boosted machine。
  • 使用对数损失:可以得到 LogitBoost 用于分类。

3)Gradient Boosting(如何学习)

在这一节中我们将正式学习 Gradient Boosting。这里,xgboost的处理大家可以对比 GBDT 模型(可参考ShowMeAI文章 图解机器学习 | GBDT模型详解)来理解核心差异。

(1)解决方案

目标函数equation?tex=Obj%3D%5CSigma_%7Bi%3D1%7D%5Enl%28y_i%2C%5Chat%7By%7D_i%29%2B%5CSigma_%7Bk%3D1%7D%5EK%5COmega%20%28f_k%29

在做 GBDT 的时候,我们没有办法使用 SGD,因为它们是树,而非数值向量——也就是说从原来我们熟悉的参数空间变成了函数空间。

  • 参数空间:学习模型中的权重。
  • 函数空间:学习函数 equation?tex=f,包括函数的结构和其中的权重。

XGBoost最全解析; Gradient Boosting; 解决方案; 10-12

解决方案:初始化一个预测值,每次迭代添加一个新函数( equation?tex=f ):

equation?tex=%5Cbegin%7Baligned%7D%20%20%5Chat%7By%7D_i%5E%7B%280%29%7D%20%26%20%3D%200%20%5C%5C%20%5Chat%7By%7D_i%5E%7B%281%29%7D%20%26%20%3D%20f_1%28x_i%29%3D%5Chat%7By%7D_i%5E%7B%280%29%7D%2Bf_1%28x_i%29%20%5C%5C%20%5Chat%7By%7D_i%5E%7B%282%29%7D%20%26%20%3D%20f_1%28x_i%29%2Bf_2%28x_i%29%3D%5Chat%7By%7D_i%5E%7B%281%29%7D%2Bf_2%28x_i%29%20%5C%5C%20%5Cdots%20%5C%5C%20%5Chat%7By%7D_i%5E%7B%28t%29%7D%20%26%20%3D%20%5CSigma_%7Bk%3D1%7D%5Etf_k%28x_i%29%3D%5Chat%7By%7D_i%5E%7B%28t-1%29%7D%2Bf_t%28x_i%29%20%5C%5C%20%5Cend%7Baligned%7D

  • equation?tex=%5Chat%7By%7D_i%5E%7B%28t%29%7D 是第 equation?tex=t 次迭代的预测值。
  • equation?tex=%5Chat%7By%7D_i%5E%7B%28t-1%29%7Dequation?tex=t-1 次迭代的预测值。
  • equation?tex=f_t%28x_i%29 是第 equation?tex=t 颗树,也就是我们第 equation?tex=t 次迭代需要得到的树。

(2)目标函数变换

第一步:根据上面的公式,目标函数可以做如下变形

equation?tex=%5Cbegin%7Baligned%7D%20%20Obj%5E%7B%28t%29%7D%20%26%20%3D%5CSigma_%7Bi%3D1%7D%5Enl%28y_i%2C%5Chat%7By%7D_i%5E%7B%28t%29%7D%29%2B%5CSigma_%7Bk%3D1%7D%5Et%5COmega%20%28f_k%29%5C%5C%20%26%20%3D%5CSigma_%7Bi%3D1%7D%5Enl%28y_i%2C%5Chat%7By%7D_i%5E%7B%28t-1%29%7D%2Bf_t%28x_i%29%29%2B%5COmega%20%28f_t%29%2Bconstant%20%5Cend%7Baligned%7D


这里我们考虑平方损失,此时目标函数又可以变形为:

equation?tex=Obj%5E%7B%28t%29%7D%3D%5CSigma_%7Bi%3D1%7D%5En%282%28y_i-%5Chat%7By%7D_i%5E%7B%28t-1%29%7D%29f_t%28x_i%29%2Bf_t%28x_i%29%5E2%29%2B%5COmega%20%28f_t%29%2Bconstant

XGBoost最全解析; Gradient Boosting; 目标函数变换; 10-13

第二步:所以我们的目的就是找到 equation?tex=f_t 使得目标函数最低。然而,经过上面初次变形的目标函数仍然很复杂,目标函数会产生二次项。


在这里我们引入泰勒展开公式:

2f%28x%29%5CDelta%20x%5E2

equation?tex=f%28x%29%3D%5CSigma_%7Bi%3D1%7D%5Enl%28y_i%2C%5Chat%7By%7D_i%5E%7B%28t%29%7D%29,令 equation?tex=%5CDelta%20x%3Df_t,目标函数利用泰勒展开式就可以变成:

2h_if_t%28x_i%29%5E2%29%2B%5COmega%20%28f_t%29%2Bconstant

equation?tex=g_i%20%3D%20%5Cpartial%20_%7B%5Chat%7By%7D%5E%7B%28t-1%29%7D%7Dl%28y_i%2C%5Chat%7By%7D%5E%7B%28t-1%29%7D%29equation?tex=h_i%20%3D%20%5Cpartial%20_%7B%5Chat%7By%7D%5E%7B%28t-1%29%7D%7D%5E2l%28y_i%2C%5Chat%7By%7D%5E%7B%28t-1%29%7D%29

XGBoost最全解析; Gradient Boosting; 目标函数变换; 10-14


第三部:把常数项提出来,目标函数可以简化为

2h_if_t%28x_i%29%5E2%5D%2B%5COmega%20%28f_t%29%2Bconstant

XGBoost最全解析; Gradient Boosting; 目标函数变换; 10-15


思考:为什么要做这么多变化而不直接生成树?

  • 理论好处:知道我们在学习什么,收敛。
  • 工程好处:回顾监督学习的要素。

    • equation?tex=g_i%2C%20h_i 都来自损失函数的定义。
    • 函数的学习只通过 equation?tex=g_i%2C%20h_i 依赖于目标函数。
    • 当被要求为平方损失和逻辑损失实现 Bootsted Tree 时,可以考虑如何分离代码模块。

(3)重新定义树

在前面,我们使用 equation?tex=f_t%28x%29 代表一颗树,在本小节,我们重新定义一下树:我们通过叶子结点中的分数向量和将实例映射到叶子结点的索引映射函数来定义树:(有点儿抽象,具体请看下图)

equation?tex=f_t(x)%3Dw_q(x)%2C%20w%5Cin%20R%5ET%2C%20q%3AR%5Ed%5Crightarrow%20%5Cleft%5C%7B1%2C2%2C3%2C%E2%80%A6%2CT%5Cright%5C%7D

  • equation?tex=w 代表树中叶子结点的权重
  • equation?tex=q 代表的是树的结构

XGBoost最全解析; Gradient Boosting; 重新定义树; 10-16

从上图可以看出,共有 equation?tex=3 个叶子结点,第一个叶子结点的权重为 equation?tex=+1,第二个叶子结点的权重为 equation?tex=0.1,第三个叶子结点的权重为 equation?tex=-1;其中,小男孩属于第 equation?tex=1 个叶子结点,老奶奶属于第 equation?tex=3 个叶子结点。

(4)定义树的复杂程度

通过下面的式子定义树的复杂程度(定义并不是唯一的)

equation?tex=%5COmega%20%28f_t%29%3D%5Cgamma%20T%2B%5Cfrac%7B1%7D%7B2%7D%5Clambda%5CSigma_%7Bj%3D1%7D%5ETw_j%5E2

  • equation?tex=%5Cgamma%20T 代表了叶子结点的个树
  • equation?tex=%5Cfrac%7B1%7D%7B2%7D%5Clambda%5CSigma_%7Bj%3D1%7D%5ETw_j%5E2 叶子结点分数的 L2 Norm

XGBoost最全解析; Gradient Boosting; 定义树的复杂程度; 10-17

(5)重新审视目标函数

XGBoost最全解析; Gradient Boosting; 重新审视目标函数; 10-18

定义在叶子结点 equation?tex=j 中的实例的集合为:

equation?tex=I_j%3D%5Cleft%5C%7Bi%7Cq%28x_i%29%3Dj%20%5Cright%5C%7D


根据每棵叶子重新定义目标函数:

equation?tex=%5Cbegin%7Baligned%7D%20%20Obj%5E%7B%28t%29%7D%26%20%20%5Csimeq%20%5CSigma_%7Bi%3D1%7D%5En%5Bg_if_t%28x_i%29%2B%5Cfrac%7B1%7D%7B2%7Dh_if_t%28x_i%29%5E2%5D%2B%5COmega%20%28f_t%29%2Bconstant%20%5C%5C%20%26%20%3D%20%5CSigma_%7Bi%3D1%7D%5En%5Bg_iw_q%28x_i%29%2B%5Cfrac%7B1%7D%7B2%7Dh_iw_q%28x_i%29%5E2%5D%2B%5Cgamma%20T%2B%5Cfrac%7B1%7D%7B2%7D%5Clambda%5CSigma_%7Bj%3D1%7D%5ETw_j%5E2%2Bconstant%20%5C%5C%20%26%20%3D%20%5CSigma_%7Bj%3D1%7D%5ET%5B%28%5CSigma_%7Bi%5Cepsilon%20I_j%7D%20g_i%29w_j%2B%5Cfrac%7B1%7D%7B2%7D%28%5CSigma_%7Bi%5Cepsilon%20I_j%7D%20h_i%2B%5Clambda%29w_j%5E2%5D%2B%5Cgamma%20T%2Bconstant%20%5Cend%7Baligned%7D

  • 上式是 equation?tex=T 个独立二次函数的和

(6)计算叶子结点的值

一些知识需要先了解。对于一元二次函数:equation?tex=Gx%2B%5Cfrac%7B1%7D%7B2%7DHx%5E2,我们很容易得到这个函数的最小值和最小值对应的 equation?tex=x

XGBoost最全解析; Gradient Boosting; 计算叶子结点的值 ; 10-19

  • 最小值对应的 equation?tex=x 相当于求 equation?tex=Gx%2B%5Cfrac%7B1%7D%7B2%7DHx%5E2 的导数,使导数等于 equation?tex=0 时的值,即 equation?tex=Gx%2BHx%3D0,所以 H
  • H,对应的 equation?tex=Gx%2B%5Cfrac%7B1%7D%7B2%7DHx%5E2 的值为:H


也就是:

equation?tex=%5Cbegin%7Baligned%7D%20%20argmin_x%20Gx%2B%5Cfrac%7B1%7D%7B2%7DHx%5E2%20%26%20%3D-%5Cfrac%7BG%7D%7BH%7D%2C%20H%3E0%20%5C%5C%20min_x%20Gx%2B%5Cfrac%7B1%7D%7B2%7DHx%5E2%20%26%20%3D-%5Cfrac%7B1%7D%7B2%7D%5Cfrac%7BG%5E2%7D%7BH%7D%20%5Cend%7Baligned%7D


如何求叶子结点最优的值?接着继续变化目标函数:

  • 定义 equation?tex=G_j%3D%20%5CSigma_%7Bi%5Cepsilon%20I_j%7Dg_i
  • 定义 equation?tex=H_j%20%3D%20%5CSigma_%7Bi%5Cepsilon%20I_j%7Dh_i

equation?tex=%5Cbegin%7Baligned%7D%20Obj%5E%7B%28t%29%7D%26%3D%20%5CSigma_%7Bj%3D1%7D%5ET%5B%28%5CSigma_%7Bi%5Cepsilon%20I_j%7D%20g_i%29w_j%2B%5Cfrac%7B1%7D%7B2%7D%28%5CSigma_%7Bi%5Cepsilon%20I_j%7D%20h_i%2B%5Clambda%29w_j%5E2%5D%2B%5Cgamma%20T%2Bconstant%5C%5C%20%26%20%3D%20%5CSigma_%7Bj%3D1%7D%5ET%5BG_jw_j%2B%5Cfrac%7B1%7D%7B2%7D%28H_j%2B%5Clambda%29w_j%5E2%5D%2B%5Cgamma%20T%2Bconstant%20%5Cend%7Baligned%7D

XGBoost最全解析; Gradient Boosting; 计算叶子结点的值; 10-20


假设树的结构 equation?tex=q%28x%29 是固定的,那么每一个叶子结点的权重的最优值

%28H_j%2B%5Clambda%29


目标函数的最优值

equation?tex=Obj%3D-%5Cfrac%7B1%7D%7B2%7D%5CSigma_%7Bj%3D1%7D%5ET%5Cfrac%7BG_j%5E2%7D%7BH_j%2B%5Clambda%7D%2B%5Cgamma%20T


下图是前面公式讲解对应的一个实际例子。

XGBoost最全解析; Gradient Boosting; 计算叶子结点的值; 10-21

这里再次总结一下,我们已经把目标函数变成了仅与 equation?tex=G%E3%80%81H%E3%80%81%5Cgamma%E3%80%81%5Clambda%E3%80%81T 这五项已知参数有关的函数,把之前的变量 equation?tex=f_%7Bt%7D 消灭掉了,也就不需要对每一个叶子进行打分了!

那么现在问题来,刚才我们提到,以上这些是假设树结构确定的情况下得到的结果。但是树的结构有好多种,我们应该如何确定呢?

(7)贪婪算法生成树

上一部分中我们假定树的结构是固定的。但是,树的结构其实是有无限种可能的,本小节我们使用贪婪算法生成树:

  • 首先生成一个深度为 equation?tex=0 的树(只有一个根结点,也叫叶子结点)
  • 对于每棵树的每个叶子结点,尝试去做分裂(生成两个新的叶子结点,原来的叶子结点不再是叶子结点)。在增加了分裂后的目标函数前后变化为(我们希望增加了树之后的目标函数小于之前的目标函数,所以用之前的目标函数减去之后的目标函数):

equation?tex=Gain%3D%5Cfrac%7B1%7D%7B2%7D%28%5Cfrac%7BG_L%5E2%7D%7BH_L%2B%5Clambda%7D%2B%5Cfrac%7BG_R%5E2%7D%7BH_R%2B%5Clambda%7D-%5Cfrac%7B%28G_L%2BG_R%29%5E2%7D%7BH_L%2BH_R%2B%5Clambda%7D%29-%5Cgamma

  • equation?tex=%5Cfrac%7BG_L%5E2%7D%7BH_L%2B%5Clambda%7D 是左面叶子结点的值
  • equation?tex=%5Cfrac%7BG_R%5E2%7D%7BH_R%2B%5Clambda%7D 是右面叶子结点的值
  • equation?tex=%5Cfrac%7B%28G_L%2BG_R%29%5E2%7D%7BH_L%2BH_R%2B%5Clambda%7D 是未分裂前的值
  • equation?tex=%5Cgamma 是引入了多一个的叶子结点增加的复杂度


接下来要考虑的是如何寻找最佳分裂点。

例如,如果 equation?tex=x_j 是年龄,当分裂点是 equation?tex=a 的时候的增益 equation?tex=Gain 是多少


我们需要做的仅仅只是计算每一边的 equation?tex=gequation?tex=h,然后计算

equation?tex=Gain%3D%5Cfrac%7B1%7D%7B2%7D%28%5Cfrac%7BG_L%5E2%7D%7BH_L%2B%5Clambda%7D%2B%5Cfrac%7BG_R%5E2%7D%7BH_R%2B%5Clambda%7D-%5Cfrac%7B%28G_L%2BG_R%29%5E2%7D%7BH_L%2BH_R%2B%5Clambda%7D%29-%5Cgamma

XGBoost最全解析; Gradient Boosting; 贪婪算法生成树; 10-22

对排序后的实例进行从左到右的线性扫描就足以决定特征的最佳分裂点。

所以,分裂一个结点的方法是:

XGBoost最全解析; Gradient Boosting; 贪婪算法生成树; 10-23

  • 对于每个节点,枚举所有特性
  • 对于每个特性,按特性值对实例排序
  • 使用线性扫描来决定该特征的最佳分裂点
  • 采用所有特征中最好的分裂方案


时间复杂度

  • 对于一个有 equation?tex=d 个特征,深度为K的树,计算的时间复杂度为:equation?tex=O(dKnlog%20n)。其中每一层需要花费 equation?tex=O(nlog%20n) 的时间做排序。
  • 可以进一步优化(例如使用近似或缓存排序的特性)。
  • 可以扩展到非常大的数据集。

(8)如何处理分类型变量

一些树学习算法分别处理分类变量和连续变量,我们可以很容易地使用我们推导出的基于分类变量的评分公式。但事实上,我们没有必要单独处理分类变量:

我们可以使用 one-hot 方式处理分类变量:

equation?tex=z_%7Bj%7D%3D%5Cleft%5C%7B%5Cbegin%7Barray%7D%7Bll%7D%201%20%26%20%5Ctext%20%7B%20if%20%7D%20x%20%5Ctext%20%7B%20is%20in%20category%20%7D%20j%20%5C%5C%200%20%26%20%5Ctext%20%7B%20otherwise%20%7D%20%5Cend%7Barray%7D%5Cright.

如果有太多的分类的话,矩阵会非常稀疏,算法会优先处理稀疏数据。

(9)修剪和正则化

回顾之前的增益,当训练损失减少的值小于正则化带来的复杂度时,增益有可能会是负数:

equation?tex=Gain%3D%5Cfrac%7B1%7D%7B2%7D%28%5Cfrac%7BG_L%5E2%7D%7BH_L%2B%5Clambda%7D%2B%5Cfrac%7BG_R%5E2%7D%7BH_R%2B%5Clambda%7D-%5Cfrac%7B%28G_L%2BG_R%29%5E2%7D%7BH_L%2BH_R%2B%5Clambda%7D%29-%5Cgamma

XGBoost最全解析; Gradient Boosting; 修剪和正则化; 10-24

此时就是模型的简单性和可预测性之间的权衡。

  • 前停止(Pre-stopping):当最佳分裂是负数时,停止分裂;但是一个分裂可能会对未来的分裂有益;
  • 后剪枝(Post-Pruning):把一颗树生长到最大深度,递归修剪所有分裂为负增益的叶子。

2.XGBoost核心原理归纳解析

1)目标函数与泰勒展开

XGBoost 也是一个 Boosting 加法模型,每一步迭代只优化当前步中的子模型。

equation?tex=m 步我们有:

equation?tex=F_m%28x_i%29%20%3D%20F_%7Bm-1%7D%28x_i%29%20%20%2B%20f_m%28x_i%29

  • equation?tex=f_m%28x_i%29 为当前步的子模型。
  • equation?tex=F_%7Bm-1%7D%28x_i%29 为前 equation?tex=m-1 个完成训练且固定了的子模型。


目标函数设计为「经验风险」+「结构风险」(正则项):

equation?tex=%5Cbegin%7Baligned%7D%20O%20b%20j%20%26%3D%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20L%5Cleft%5BF_%7Bm%7D%5Cleft%28x_%7Bi%7D%5Cright%29%2C%20y_%7Bi%7D%5Cright%5D%2B%5Csum_%7Bj%3D1%7D%5E%7Bm%7D%20%5COmega%5Cleft%28f_%7Bj%7D%5Cright%29%20%5C%5C%20%26%3D%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20L%5Cleft%5BF_%7Bm-1%7D%5Cleft%28x_%7Bi%7D%5Cright%29%2Bf_%7Bm%7D%5Cleft%28x_%7Bi%7D%5Cright%29%2C%20y_%7Bi%7D%5Cright%5D%2B%5Csum_%7Bj%3D1%7D%5E%7Bm%7D%20%5COmega%5Cleft%28f_%7Bj%7D%5Cright%29%20%5Cend%7Baligned%7D

  • 正则项 equation?tex=%5COmega%20%28f%29 表示子模型 equation?tex=f 的复杂度,用于控制过拟合。

XGBoost最全解析; 核心原理归纳解析; 目标函数与泰勒展开; 10-25

在数学中,我们可以用泰勒公式近似 equation?tex=f%28x%29,具体如下式。XGBoost 对损失函数运用二阶展开来近似。

equation?tex=f%28x_0%2B%5CDelta%20x%29%20%5Capprox%20f%28x_0%29%2Bf%5E%7B%27%7D%28x_0%29%20%5CDelta%20x%20%2B%20%5Cfrac%7Bf%5E%7B%27%27%7D%28x_0%29%7D%7B2%7D%20%28%5CDelta%20x%29%5E2

(更多数学知识推荐阅读ShowMeAI的AI数学基础系列教程 图解AI数学基础:从入门到精通系列教程)。


对应XGBoost的损失函数,我们在上式里将 equation?tex=F_%7Bm-1%7D%28x_i%29 视作 equation?tex=x_0equation?tex=f_%7Bm%7D%28x_i%29 视作 equation?tex=%5CDelta%20xequation?tex=L%28%5Chat%7By_i%7D%2Cy_i%29 视作关于 equation?tex=%5Chat%7By_i%7D 的函数,得到:

equation?tex=Obj%20%3D%20%5Csum_%7Bi%3D1%7D%5EN%20%5CBig%5B%20L%5BF_%7Bm-1%7D%28x_i%29%2Cy_i%5D%20%2B%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20F_%7Bm-1%7D%28x_i%29%7D%20f_m%28x_i%29%20%2B%20%5Cfrac%7B1%7D%7B2%7D%20%5Cfrac%7B%5Cpartial%5E2%20L%7D%7B%5Cpartial%5E2%20F_%7Bm-1%7D%28x_i%29%7D%20f_m%5E2%28x_i%29%20%5CBig%5D%20%2B%5Csum_%7Bj%3D1%7D%5Em%20%5COmega%20%28f_j%29

XGBoost最全解析; 核心原理归纳解析; 目标函数与泰勒展开; 10-26

又因前 equation?tex=m-1 个子模型已经确定了,故上式中除了关于 equation?tex=f_%7Bm%7D%20%28x%29 的部分都是常数,不影响对 equation?tex=f_%7Bm%7D%20%28x%29 的优化求解。目标函数可转化为:

equation?tex=O%20b%20j%3D%5Csum_%7Bi%3D1%7D%5E%7BN%7D%5Cleft%5Bg_%7Bi%7D%20f_%7Bm%7D%5Cleft%28x_%7Bi%7D%5Cright%29%2B%5Cfrac%7B1%7D%7B2%7D%20h_%7Bi%7D%20f_%7Bm%7D%5E%7B2%7D%5Cleft%28x_%7Bi%7D%5Cright%29%5Cright%5D%2B%5COmega%5Cleft%28f_%7Bm%7D%5Cright%29

  • equation?tex=g_i%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20F_%7Bm-1%7D%28x_i%29%7D
  • equation?tex=h_i%20%3D%20%5Cfrac%7B%5Cpartial%5E2%20L%7D%7B%5Cpartial%5E2%20F_%7Bm-1%7D%28x_i%29%7D
  • 这里的 equation?tex=L 代表损失函数,衡量一次预测的好坏程度
  • equation?tex=F_%7Bm-1%7D%28x%29 确定了的情况下,对每个样本点 equation?tex=i 都可以轻易计算出一个 equation?tex=g_iequation?tex=h_i

2)XGBoost的正则化

实际上,XGBoost的基分类器对决策树和线性模型都支持,这里我们只讨论更常见的「基于树」的情况。为防止过拟合,XGBoost设置了基于树的复杂度作为正则项:

equation?tex=%5COmega%28f%29%20%3D%20%5Cgamma%20T%20%2B%20%5Cfrac%7B1%7D%7B2%7D%20%5Clambda%20%7C%7Cw%7C%7C%5E2

  • equation?tex=T 为树 equation?tex=f 的叶节点个数
  • equation?tex=w 为所有叶节点输出回归值构成的向量,equation?tex=%7C%7Cw%7C%7C%5E2 为该向量 L2范数(模长)的平方
  • equation?tex=%5Cgammaequation?tex=%5Clambda 为超参数


作为回归树,叶子节点越多、输出的回归值越大,树的复杂度越高。

最终目标函数如下:

equation?tex=Obj%20%3D%20%5Csum_%7Bi%3D1%7D%5EN%20%5CBig%5Bg_i%20f_m%28x_i%29%2B%5Cfrac%7B1%7D%7B2%7D%20h_i%20f_m%5E2%28x_i%29%5CBig%5D%2B%5Cgamma%20T%20%2B%20%5Cfrac%7B1%7D%7B2%7D%20%5Clambda%20%5Csum_%7Bj%3D1%7D%5ET%20w_j%5E2

XGBoost最全解析; 核心原理归纳解析; XGBoost的正则化; 10-27


下面是一个数学转换处理,为了使正则项和经验风险项合并到一起。我们把在样本层面上求和的经验风险项,转换为叶节点层面上的求和。

定义节点 equation?tex=j 上的样本集为 equation?tex=I%28j%29%3D%5C%7Bx_i%7Cq%28x_i%29%3Dj%5C%7D,其中 equation?tex=q%28x_i%29 为将样本映射到叶节点上的索引函数,叶节点 equation?tex=j 上的回归值为 equation?tex=w_j%3Df_m%28x_i%29%2Ci%20%5Cin%20I%28j%29

equation?tex=Obj%20%3D%20%5Csum_%7Bj%3D1%7D%5E%7BT%7D%20%5CBig%5B%20%28%5Csum_%7Bi%5Cin%20I%28j%29%7D%20g_i%29%20w_j%20%2B%20%5Cfrac%7B1%7D%7B2%7D%28%5Csum_%7Bi%5Cin%20I%28j%29%7D%20h_i%20%2B%20%5Clambda%29%20w_j%5E2%20%5CBig%5D%20%2B%20%5Cgamma%20T


进一步简化表达,令 equation?tex=%5Csum_%7Bi%5Cin%20I%28j%29%7D%20g_i%3DG_jequation?tex=%5Csum_%7Bi%5Cin%20I%28j%29%7D%20h_i%3DH_j 注意这里 equation?tex=Gequation?tex=H 都是关于 equation?tex=j 的函数:

equation?tex=Obj%20%3D%20%5Csum_%7Bj%3D1%7D%5E%7BT%7D%20%5CBig%5B%20G_j%20w_j%20%2B%20%5Cfrac%7B1%7D%7B2%7D%28H_j%20%2B%20%5Clambda%29%20w_j%5E2%20%5CBig%5D%20%2B%20%5Cgamma%20T

XGBoost最全解析; 核心原理归纳解析; XGBoost的正则化; 10-28

转化到这个形式后,我们可以看出,若一棵树的结构已经确定,则各个节点内的样本 equation?tex=%28x_i%2Cy_i%2Cg_i%2Ch_i%29 也是确定的,即 equation?tex=G_jequation?tex=H_jequation?tex=T 被确定,每个叶节点输出的回归值应该使得上式最小,由二次函数极值点:

equation?tex=w_j%5E%2A%3D-%5Cfrac%7BG_j%7D%7BH_j%2B%5Clambda%7D

XGBoost最全解析; 核心原理归纳解析; XGBoost的正则化; 10-29

按此规则输出回归值后,目标函数值也就是树的评分如下公式,其值越小代表树的结构越好。观察下式,树的评分也可以理解成所有叶节点的评分之和:

equation?tex=Obj%5E%2A%20%3D%20%20%5Csum_%7Bj%3D1%7D%5ET%20%5CBig%28%20-%5Cfrac%7B1%7D%7B2%7D%5Cfrac%7BG_j%5E2%7D%7BH_j%20%2B%20%5Clambda%7D%20%2B%20%5Cgamma%20%5CBig%29

3)节点分裂准则

我们之前文章决策树模型详解里给大家讲到了决策树模型是递归生长形成的,而XGBoost的子模型树也一样,需要要依赖节点递归分裂的贪心准则来实现树的生成。

(1)贪心准则

XGBoost 子树的基本处理思路和 CART 一样,会对特征值排序后遍历划分点,将其中最优的分裂收益作为该特征的分裂收益,选取具有最优分裂收益的特征作为当前节点的划分特征,按其最优划分点进行二叉划分,得到左右子树。

XGBoost最全解析; 核心原理归纳解析; 节点分裂准则-贪心准则; 10-30


上图是一次节点分裂过程,很自然地,分裂收益是树A的评分减去树B的评分。虚线框外的叶节点,即非分裂节点的评分均被抵消,只留下分裂后的 equation?tex=LR 节点和分裂前的 equation?tex=S 节点进行比较,因此分裂收益的表达式为:

equation?tex=Gain%20%3D%20%5Cfrac%7B1%7D%7B2%7D%20%5CBig%5B%20%5Cfrac%7BG_L%5E2%7D%7BH_L%2B%5Clambda%7D%20%2B%20%5Cfrac%7BG_R%5E2%7D%7BH_R%2B%5Clambda%7D%20-%5Cfrac%7B%28G_L%2BG_R%29%5E2%7D%7BH_L%2BH_R%2B%5Clambda%7D%5CBig%5D-%5Cgamma

(2)近似算法

基于性能的考量,XGBoost 还对贪心准则做了一个近似版本,简单说,处理方式是「将特征分位数作为划分候选点」。这样将划分候选点集合由全样本间的遍历缩减到了几个分位数之间的遍历。

展开来看,特征分位数的选取还有 global 和 local 两种可选策略:

  • global 在全体样本上的特征值中选取,在根节点分裂之前进行一次即可;
  • local 则是在待分裂节点包含的样本特征值上选取,每个节点分裂前都要进行。

这两种情况里,由于global只能划分一次,其划分粒度需要更细。


XGB 原始 paper 中对 Higgs Boson 数据集进行了实验,比较了精确贪心准则、global 近似和 local 近似三类配置的测试集 AUC,用 eps 代表取分位点的粒度,如 equation?tex=eps%3D0.25 代表将数据集划分为 equation?tex=1%2F0.25%3D4 个buckets,发现 global( equation?tex=eps%3D0.05 )和local( equation?tex=eps%3D0.3 )均能达到和精确贪心准则几乎相同的性能。

XGBoost工具包支持上述提到的3类配置。

(3)加权分位数

查看目标函数 equation?tex=Obj%3D%5Csum_%7Bi%3D1%7D%5E%7BN%7D%5Cleft%5Bg_%7Bi%7D%20f_%7Bm%7D%5Cleft%28x_%7Bi%7D%5Cright%29%2B%5Cfrac%7B1%7D%7B2%7D%20h_%7Bi%7D%20f_%7Bm%7D%5E%7B2%7D%5Cleft%28x_%7Bi%7D%5Cright%29%5Cright%5D%2B%5COmega%5Cleft%28f_%7Bm%7D%5Cright%29,令偏导为0易得 equation?tex=f_m%5E%2A%28x_i%29%3D-%5Cfrac%7Bg_i%7D%7Bh_i%7D,此目标函数可理解为以 equation?tex=h_i 为权重,equation?tex=-%5Cfrac%7Bg_i%7D%7Bh_i%7D 为标签的二次损失函数:

equation?tex=%5Cbegin%7Baligned%7D%20Obj%20%26%3D%20%5Csum_%7Bi%3D1%7D%5EN%20%5CBig%5Bg_i%20f_m%28x_i%29%2B%5Cfrac%7B1%7D%7B2%7D%20h_i%20f_m%5E2%28x_i%29%5CBig%5D%2B%5COmega%20%28f_m%29%20%5C%5C%20%26%20%3D%20%5Csum_%7Bi%3D1%7D%5EN%20%5Cfrac%7B1%7D%7B2%7D%20h_i%5CBig%5B%20f_m%28x_i%29-%28-%5Cfrac%7Bg_i%7D%7Bh_i%7D%29%20%5CBig%5D%5E2%2B%5COmega%20%28f_m%29%20%2B%20C%20%5Cend%7Baligned%7D

在近似算法取分位数时,实际上 XGBoost 会取以二阶导 equation?tex=h_i 为权重的分位数(Weighted Quantile Sketch),如下图表示的三分位。

XGBoost最全解析; 核心原理归纳解析; 节点分裂准则-加权分位数; 10-31

4)列采样与学习率

XGBoost为了进一步优化效果,在以下2个方面进行了进一步设计:

  • 列采样

    • 和随机森林做法一致,每次节点分裂并不是用全部特征作为候选集,而是一个子集。
    • 这么做能更好地控制过拟合,还能减少计算开销。
  • 学习率

    • 也叫步长、shrinkage,具体的操作是在每个子模型前(即每个叶节点的回归值上)乘上该系数,不让单颗树太激进地拟合,留有一定空间,使迭代更稳定。XGBoost默认设定为 equation?tex=0.3

5)特征缺失与稀疏性

XGBoost 也能对缺失值处理,也对特征稀疏问题(特征中出现大量的 equation?tex=0 或one-hot encoding结果)做了一些优化。XGBoost 用「稀疏感知」策略来同时处理这两个问题:

  • 简单说,它的做法是将缺失值和稀疏 equation?tex=0 值等同视作缺失值,将其「绑定」在一起,分裂节点的遍历会跳过缺失值的整体。这样大大提高了运算效率。

    equation?tex=0 值在XGB中被处理为数值意义上的 equation?tex=0 还是 equation?tex=NA,需要结合具体平台的设置,预处理区分开作为数值的 equation?tex=0 (不应该被处理为 equation?tex=NA )和作为稀疏值的 equation?tex=0 (应该被处理为 equation?tex=NA )。

XGBoost最全解析; 核心原理归纳解析; 特征缺失与稀疏性; 10-32

依然通过遍历得到分裂节点,equation?tex=NA 的方向有两种情况,在此基础上对非缺失值进行切分遍历。

如上图所示,若某个特征值取值为 equation?tex=1equation?tex=2equation?tex=5 和大量的 equation?tex=NA,XGBoost 会遍历以上 equation?tex=6 种情况( equation?tex=3 个非缺失值的切分点×缺失值的两个方向),最大的分裂收益就是本特征上的分裂收益,同时,equation?tex=NA 将被分到右节点。

3.XGBoost工程优化

1)并行列块设计

XGBoost 将每一列特征提前进行排序,以块(Block)的形式储存在缓存中,并以索引将特征值和梯度统计量对应起来,每次节点分裂时会重复调用排好序的块。而且不同特征会分布在独立的块中,因此可以进行分布式或多线程的计算。

XGBoost最全解析; XGBoost工程优化; 并行列块设计; 10-33

2)缓存访问优化

特征值排序后通过索引来取梯度 equation?tex=g_i%EF%BC%8Ch_i 会导致访问的内存空间不一致,进而降低缓存的命中率,影响算法效率。为解决这个问题,XGBoost为每个线程分配一个单独的连续缓存区,用来存放梯度信息。

3)核外块计算

数据量非常大的情形下,无法同时全部载入内存。XGBoost 将数据分为多个 blocks 储存在硬盘中,使用一个独立的线程专门从磁盘中读取数据到内存中,实现计算和读取数据的同时进行。
为了进一步提高磁盘读取数据性能,XGBoost 还使用了两种方法:

  • ① 压缩 block,用解压缩的开销换取磁盘读取的开销。
  • ② 将 block 分散储存在多个磁盘中,提高磁盘吞吐量。

4.XGBoost vs GBDT

我们对之前讲解过的 GBDT(参考ShowMeAI文章GBDT算法详解)和这里的 XGBoost 做一个对比总结:

XGBoost最全解析; XGBoost V.S. GBDT; 10-34

  • GBDT 是机器学习算法,XGBoost 在算法基础上还有一些工程实现方面的优化。
  • GBDT 使用的是损失函数一阶导数,相当于函数空间中的梯度下降;XGBoost 还使用了损失函数二阶导数,相当于函数空间中的牛顿法。
  • 正则化:XGBoost 显式地加入了正则项来控制模型的复杂度,能有效防止过拟合。
  • 列采样:XGBoost 采用了随机森林中的做法,每次节点分裂前进行列随机采样。
  • 缺失值:XGBoost 运用稀疏感知策略处理缺失值,GBDT无缺失值处理策略。
  • 并行高效:XGBoost 的列块设计能有效支持并行运算,效率更优。

更多监督学习的算法模型总结可以查看ShowMeAI的文章 AI知识技能速查 | 机器学习-监督学习

机器学习【算法】系列教程

机器学习【实战】系列教程

ShowMeAI 系列教程推荐

ShowMeAI用知识加速每一次技术成长

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
目录
相关文章
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
实战派教学:掌握Scikit-learn,轻松实现数据分析与机器学习模型优化!
【10月更文挑战第4天】Scikit-learn凭借高效、易用及全面性成为数据科学领域的首选工具,简化了数据预处理、模型训练与评估流程,并提供丰富算法库。本文通过实战教学,详细介绍Scikit-learn的基础入门、数据预处理、模型选择与训练、评估及调优等关键步骤,助你快速掌握并优化数据分析与机器学习模型。从环境搭建到参数调优,每一步都配有示例代码,便于理解和实践。
91 2
|
2月前
|
机器学习/深度学习 数据采集 监控
如何使用机器学习模型来自动化评估数据质量?
【10月更文挑战第6天】如何使用机器学习模型来自动化评估数据质量?
|
8天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的线性回归模型
本文深入探讨了机器学习中广泛使用的线性回归模型,从其基本概念和数学原理出发,逐步引导读者理解模型的构建、训练及评估过程。通过实例分析与代码演示,本文旨在为初学者提供一个清晰的学习路径,帮助他们在实践中更好地应用线性回归模型解决实际问题。
|
16天前
|
机器学习/深度学习 数据采集 监控
如何使用机器学习模型来自动化评估数据质量?
如何使用机器学习模型来自动化评估数据质量?
|
13天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
46 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
17天前
|
机器学习/深度学习 算法 PyTorch
用Python实现简单机器学习模型:以鸢尾花数据集为例
用Python实现简单机器学习模型:以鸢尾花数据集为例
42 1
|
2月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
69 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
26天前
|
机器学习/深度学习 数据采集 Python
从零到一:手把手教你完成机器学习项目,从数据预处理到模型部署全攻略
【10月更文挑战第25天】本文通过一个预测房价的案例,详细介绍了从数据预处理到模型部署的完整机器学习项目流程。涵盖数据清洗、特征选择与工程、模型训练与调优、以及使用Flask进行模型部署的步骤,帮助读者掌握机器学习的最佳实践。
68 1
|
1月前
|
机器学习/深度学习 数据采集 监控
如何使用机器学习模型来自动化评估数据质量?
如何使用机器学习模型来自动化评估数据质量?
|
11天前
|
机器学习/深度学习 自然语言处理 语音技术
探索机器学习中的深度学习模型:原理与应用
探索机器学习中的深度学习模型:原理与应用
25 0
下一篇
无影云桌面