注:我们整理了机器学习建模的步骤和实例,供需要快速入门的同行参考。提供互动程序和实例,因为笔记内容和格式的限制,有些内容的显示请移步至外部连接。
原文连接:
https://www.ainumeric.com/ml_training/course/machinelearning.php
机器学习模型分类
机器学习模型可以分为三大类:
监督性学习(supervised learning):训练数据的标识(目标值)是已知的,机器模型对训练数据以外的新数据进行标记。常用的监督学习模型有:
- Support vector machine
- Decision trees
- K-nearest neighbor
- Neural network
其中,Neural Network可以用于监督学习,也可用于非监督学习。
非监督性学习(unsupervised learning):对没有给定标记(目标值)的训练样本进行学习,以发现训练样本集中的结构性知识。典型的非监督学习有:
- Clustering
- Neural network
强化学习(Reinforcement learning):智能体(agent)从环境(environment)中积累知识,学习最优的策略,从而决定下一个合适的动作(action),目的是最大化长期总收益。强化学习中的关键组成部分:
- 环境(Environment):是智能体的工作环境。
- 模型(model):环境的描述可以是已知的或者未知的。它由两个组成部分:
Transition:从一种状态到另一个状态的概率;
Reward:智能体工作的反馈信息; - 状态(State):环境的状态;
策略(Policy):从State到Action的映射;
强化学习常用的描述方式是:Markov Decision Process; Bellman equation。常用的解决方法有:
Brute force
- Value function: Dynamic programming;Monte-Carlo method;Temporal-difference learning
- Direct policy search
机器模型的分类方法有很多,比如下图将强化学习,集成学习和神经网络与经典的模型分别归类。
XGBoost 简介
XGBoost (Extreme Gradient Tree Boosting) 是集成模型(Ensemble Model)的一种,是在 Gradient Model 的基础上发展起来的,可用作回归或者分类。在很多实际问题中,尤其是近年的keggle等竞赛中,它的性能优于其他模型。
按照子模型的集成方式,集成模型分为两大类:
平均 (averaging):首先创立独立的子模型,然后按照加权平均的方式集成子模型。一般来说,模型的性能优于每个独立的子模型。这一类的代表有:Bagging, Forests of Randomized Trees, ...
提升 (boosting):按次序构造子模型,有选择地使用子模型构造最终的集成模型。最终目的是使得集成模型的估计偏差最小化。这一类的代表有:AdaBoost, Gradient Tree Boosting, ...
XGBoost 模型是按照 Boosting 方法构造的,它的主要优点有:运算速度快:它是用 C++ 写成的。
高性能:利用 GPU 和网络进行并行计算。
在近年的许多竞赛和项目中性能优于其他模型。
灵活的超参数设置。
XGBoost 模型描述
在集成模型 (Ensemble Model) 中,最后的结果是多个子模型的结果的整合,这些子模型被称为基本模型,或者弱模型 (weak estimators)。集成模型的目地是使得最后的整合模型的性能优于每个子模型。而子模型的选择也是有条件的,子模型的选择取决于不同的集成模型算法,对子模型的最低要求是他们的性能优于随机模型。
对于 XGBoost,它的子模型是 CART,即 classification and regression tree。我们可以认为 CART 就是运用于分类和回归的决策树 (decision tree)。下面是一个简单的 CART:用体重和身高作为衡量性别的特征值。
[https://ainumeric.com/ml_training/course/machinelearning_xgboost.php]
树的最后一层称为结点,结点的值就是分数,或者结论。给定特征值,树的构造方法是非常多的。以上的例子从特征值“身高”开始分裂为树。如果从特征值“体重”开始分裂将会得到另一个树。也就是说,给定同样的特征值集合,可以运用不同的决策树,两棵树的结论累加就是最终的结论,即,同一个样本在不同树的结点的分数相加,即是最后的分数。
定义了决策树之后,XGBoost 的主要流程可以归结为一个不断迭代的过程,在步骤 t:
增加新的树,记为 ft(x),用于拟合上次预测(步骤 t−1)的残差。关于树的选择,以最小化目标函数为目的。
预测每个样本的分数:根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数。
每棵树对应的分数加起来就是该样本的预测值。
计算损失函数,检查迭代终止条件,进入下一步迭代。
增加一个树 ft(x) 时,ft(x) 的选择使得以下的目标函数最小化:
objt=∑i=1nL(yi,y^i+ft(xi))+Ω(ft)
其中, yi 是样本真实标签,y^i 是样本预测标签。目标函数中主要项的说明:
L(yi,y^i) 是损失函数,有不同的选择,比如 RMSE, Logistic 等等。
Ω(ft) 是具有以下形式的正则函数,
Ω(ft)=γT+12λ||w||2
上式中 T 是叶子结点的总数, w 是所有叶子结点的得分。这里我们使用 L2 范数,也可以使用 L1 范数。正则项定义了树的复杂度,目标函数在最小化损失函数的同时最小化复杂度,同时避免过度拟合。复杂度越低,模型的泛化能力也越强。
XGBoost 特性
顾名思义,XGBoost = Gradient Tree Boosting + Extreme,其中的 X 就是 Extreme 的意思。
Gradient Tree Boosting 是集成模型的一种,使用 CART 作为它的基本模型,从而定义损失函数 (loss function)。损失函数是度量模型性能的重要参数,而模型的最终目的是最小化损失。在 XGBoost 模型的迭代中,降低损失函数所用的算法是 Gradient Descent,而以下算法的引入使得普通的 Gradient Boosting 成为 Extreme Gradient Boosting,也就是 XGBoost 中 X 的含义:
- Newton boosting and regularization (Newton Rhapson Method),在算法中同时利用损失函数的一阶和二阶泰勒展开。在以上的目标函数中,利用 f(x) 的泰勒展开:
f(x+Δx)= f(x)+f′(x)Δx+12f′′(x)Δx2
将目标函数写为
objt= ∑i=1n[L(yi,y^t−1i)+gift(xi)+12hif2t(xi)]+Ω(ft)
其中,
gi=∂L(yi,y^t−1)∂y^t−1,hi=∂2L(yi,y^t−1)∂(y^t−1)2
这里使用了一阶和二阶偏导,可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算,本质上也就把损失函数的选取和模型算法优化/参数选择分开了。这样的处理使得梯度下降的更快更准,同时增加了XGBoost的适用性。
自定义的 loss function (损失函数的泰勒展开),从而使得运算加快。
引入并行计算 (GPU, TPU),使得算法的实现适用于并行计算,加快运算速度。
一棵树的形成,是从一个结点一分为二,从而不断分裂形成一棵完整的树。以上的身高/体重例子中,从一个特征值分裂形成一棵树。当特征值众多的时候,分裂树结构的方法也变得多样化。在 XGBoost中,分裂结点的方法是枚举所有树结果的贪心算法。
在选择合适的树添加到模型中的迭代过程中,算法选择特征值进行分裂,计算损失函数;这样的操作重复多次,选择损失函数最小的树,将它添加到模型中。这个过程就是贪心算法,也就是遍历所有所有特征值的分裂形式,也就是子树,从中选择最优。
每次迭代,是在上一次预测基础上添加最优的特征值分裂形成的子树,直到满足迭代停止的条件。
迭代算法的终止条件
满足以下条件则迭代终止:
树的深度达到预设的最大深度参数时,迭代停止。这样的设置用于避免过度拟合。
每次迭代计算增益,当迭代所带来的增益小于预设的阈值时停止迭代。。
当最小样本权重之和小于预设的阈值时,停止迭代。这样时为了防止叶子结点的样本太少,避免过度拟合。
参数设置参考下面的 Python 实例。
XGBoost Python 实例
假设已有以下的训练和测试数据:
训练数据:trainx: features of training data (ndarray)
训练数据标签:trainy: targets of training data (ndarray)
测试数据:mergeed_test: features of test data (no targets)
以下的命令行调用 XGBoost 回归模型:
# 加载软件包
import xgboost as xgb
# 初始化模型
model = XGBRegressor(max_depth=11, n_estimators=1000, min_child_weight=0.5, colsample_bytree=colsample, subsample=0.8, eta=0.04, seed=42)
# 调用模型拟合训练数据
model.fit(trianx, triany, eval_metric = 'rmse')
# 利用模型预测新数据
preds = model.predict(merged_test.values)
回归模型的主要参数设置:
max_depth: 每棵树的最大深度,可用于设置迭代终止条件
min_child_weight: 样本在子树中的最小权重之和,用于控制过度拟合
subsample: 每棵树的样本比率
eta: learning rate, robustness of shrinking weights each step. Usually: 0.01 – 0.2
seed: 随机数种子,缺省值=0
使用kaggle平台演示XGBoost的python实例:
https://www.kaggle.com/scratchpad/notebookeb4c164b1b/edit