DS&ML_分类算法笔记之随机森林、梯度提升树、XGBoost模型

其他相关文章

DS&ML_关联分析笔记
DS&ML_分类算法笔记之支持自动机SVM模型
DS&ML_分类算法笔记之k-近邻、KD-Tree模型
DS&ML_降维算法笔记之主成分分析PCA模型
DS&ML_分类算法笔记之朴素贝叶斯模型
DS&ML_聚类算法笔记之k-means模型
DS&ML_分类算法笔记之决策树模型
DS&ML_分类算法笔记之逻辑回归模型

对于以决策树为基础的模型的相关知识点的总结与整理

XGBoost、随机森林RF、梯度提升树GBDT&GBRT

简单描述一下这三类模型的思想,它们都是什么?

随机森林(RF)

随机森林=决策树+bagging策略

随机森林是以决策树为基础模型的分类模型。因为决策树算法尽管有剪枝等等方法,一棵树的生成肯定还是不如多棵树,因此就有了随机森林,解决决策树泛化能力弱的缺点。(可以理解成三个臭皮匠顶过诸葛亮)。随机森林内部包含了若干棵彼此独立的子决策树模型(通常CART算法决策树为基模型)

多个决策树组成森林,在预测过程中,所有的子决策树均会对预测数据输出一个预测结果,然后对结果进行汇总(分类问题通常采用投票的方式,回归模型输出的则是所有结果的均值),得到最后的预测结果。

梯度提升树(梯度迭代决策树、梯度迭代提升树)(GBDT、GBRT)

梯度提升树=决策树+Boosting策略(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

可用来分类(GBDT分类树)也可用来回归(CART回归树),我一般用来分类

通常CART算法决策树为基模型

  • 所以很好的处理离散型和连续型数据指标,包括缺失值,并且可以用于分类和回归

XGBoost

XGBoost=决策树+Boosting策略(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

GBDT的强力改进版。以损失函数的二阶泰勒展开式作为其替代函数,求解其最小化(导数为0)来确定回归树的最佳切分点和叶节点输出数值(这一点与CART不同)。

各自具体算法

随机森林(RF)

对于给定的训练数据集S,包含了n条样本,m个特征。
对于模型的参数,我们设子决策树的数量为c,决策树每个节点选择的特征树为f,并设置停止条件(树的深度,节点最小样本数等)

  • 在随机森林中的一个子模型训练过程中,对n个样本采用bootstrap有放回抽样的方式构造新的训练集(通常抽取的样本数等于n)。
  • 在子决策树的训练过程中,在每个节点分割之前,从总特征m中随机抽取c个特征作为本次分割的候选变量,持续训练直到满足当前模型的停止条件。
  • 对所有的子决策树建模重复前两步直到所有模型训练完毕。

在预测过程中,所有的子决策树均会对预测数据输出一个预测结果,然后对结果进行汇总(分类问题通常采用投票的方式,回归模型输出的则是所有结果的均值),得到最后的预测结果。

梯度提升树(梯度迭代决策树、梯度迭代提升树)(GBDT、GBRT)

XGBoost

针对传统GBDT算法做了很多细节改进,包括损失函数、正则化、切分点查找算法优化、稀疏感知算法、并行化算法设计等等

各自优点

随机森林(RF)优点

由于具备集成学习的特征,比单决策树等单一模型的优势

  • 能够达到更高的预测精确度
  • 随机森林泛化能力较强
    • 因为有多个独立的子模型,可以在内部对于一般话后的误差产生不偏差的估计,具有较强的泛化能力
  • 可以处理大量的变量输入,不需要特别的降维和特征选择工作,并且还能输出各个特征的重要性水平
  • 缺失值很多也不敏感,可以估计缺失值并仍能维持准确度
  • 先天并行优势,因为由很多子决策树组成
  • 对不平衡的数据集可以平衡误差

梯度提升树优点

  • 很好的处理离散型和连续型数据指标,包括缺失值
  • 是集成学习的模型,建模效果更好

各自缺点

随机森林(RF)缺点

  • 噪音太大的分类或回归问题上会过拟合
  • 一般子决策树采用CART算法,但CART在特征评估时会偏向类别数更多的特征。
    • 如对性别这种只有两类的特征,就很容易低估其重要性
  • 运行耗费资源

梯度提升树(梯度迭代决策树、梯度迭代提升树)(GBDT、GBRT)缺点

零碎的一些知识点积累

从集成学习的基本思想来看,将多个弱学习期组合作为新的模型来提升预测效果。组合方式可以分为boosting和bagging两大类

  • Bagging 是 Bootstrap Aggregating 的简称,意思就是再取样 (Bootstrap) 然后在每个样本上训练出来的模型取平均,所以是降低模型的 variance. Bagging 比如 Random Forest 这种先天并行的算法都有这个效果。
    • 均匀采样
    • 训练集选择:随机的,各轮训练集之前互相独立
  • Boosting 则是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行加权,把许多弱的分类器组合成一个强的分类器。所以随着迭代不断进行,误差会越来越小,所以模型的 bias 会不断降低。这种算法本来文献说不能并行,但是好像现在是通过异步随机梯度下降法可以实现并行,这块我不是很熟悉,例子比如 Adaptive Boosting在邮件过滤,文本分类中有很好的性能
    • 精度、准确性比Bagging更高
    • 根据错误率采样
    • 训练集选择:各轮训练集的选择与前面各轮的学习结果相关

随机森林(RF)

R中party包(cforest函数)、randomForest包(randomForest函数。基于rpart算法的集成算法)

在特征工程中的应用(因为可以输出各个字段的重要性指标值)

  • 平均准确度下降MDA-MeanDecreasingAccuracy:当某个字段失去原有的信息时(如变为随机变量),导致模型预测准确度下降的大小
  • 平均基尼指数下降MDG-MeanDecreasingGini:当某个字段失去原有的信息时(如变为随机变量)模型节点划分中基尼指数平均下降的大小。

梯度提升树

Python-sklearn库:GradientBoostingClassifier

主要参数为

  • 学习率learning_rate
  • 最小叶节点样本数min_samples_split
  • 最小划分叶节点样本数min_samples_leaf
  • 最大树深max_depth
  • 子采样比例subsample
  • 迭代次数n_estimators

XGBoost

Python-xgboost库

XGBoost和梯度提升的区别

  • 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑回归(分类问题)或者线性回归(回归问题)。
    • 正则化(目标函数加一个惩罚项)
  • 从最优化的角度来看
    • GBDT采用的是数值优化的思维, 用的梯度下降法去求解Loss Function的最优解, 其中用CART决策树去拟合负梯度, 用牛顿法求步长.、
      • 梯度下降和最速下降并不相同,梯度方向也不一定总是下降最快的方向。
      • 通常可能觉得最速下降的方向和梯度下降法的方向并没有差别,都是移动单位步长,下降最多的方向(即△nsd)。而差别就在单位步长这里,如果△nsd=argminv(∇f(x)Tv|‖v‖<=1)中‖v‖是欧式范数,那么最速下降法就是梯度下降法,也就是说梯度下降法是最速下降法使用欧式范数的特殊情况。
        • 欧几里得向量范数,即向量元素绝对值的平方和再开方
        • 范数,是具有“长度”概念的函数,是矢量空间内的所有矢量赋予非零的正长度或大小。半范数可以为非零的矢量赋予零长度。
          • 向量范数:向量的范数可以简单形象的理解为向量的长度,或者向量到零点的距离,或者相应的两个点之间的距离。
            • 1-范数
              • 向量元素绝对值之和,matlab函数为norm(x,1)
            • 2-范数
              • 向量各个元素平方和的1/2次方,L2范数又称Euclidean范数或者Frobenius范数,matlab函数为norm(x,2)
            • -inf-范数
              • 所有向量元素绝对值中的最大值,matlab调用函数norm(x, inf)
            • p-范数
              • 向量元素绝对值的p次方和的1/p次幂,matlab调用函数norm(x, p)
          • 矩阵范数
            • 1-范数
              • 列和范数,即所有矩阵列向量绝对值之和的最大值,matlab调用函数norm(A, 1)
            • 2-范数
              • 谱范数,即A’A矩阵的最大特征值的开平方。matlab调用函数norm(x, 2)
            • inf-范数
              • 行和范数,即所有矩阵行向量绝对值之和的最大值,matlab调用函数norm(A, inf)
            • F-范数
              • Frobenius范数,即矩阵元素绝对值的平方和再开平方,matlab调用函数norm(A, ’fro‘)
            • 核范数
              • 是A的奇异值
      • 梯度是函数对每个因子求偏导得到的列向量,表示着函数的变化趋势,
    • XGboost用的解析的思维, 在函数空间中用牛顿法(对Loss Function展开到二阶近似)求得解析解, 用解析解作为Gain来建立决策树, 使得Loss Function最优.
      • 不使用欧式范数而使用Hessian范数,牛顿法正是使用Hessian范数的最速下降法,所以牛顿法会比梯度下降法收敛更快!
  • XGB在代价函数里加入了正则项,普通GBDT没有。防止过拟合。因为正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单。
  • xgboost损失函数是误差部分是二阶泰勒展开,同时用到了一阶和二阶导数。GBDT 是一阶泰勒展开。所以损失函数定义的更精确。
  • XGB对每颗子树增加一个参数,使得每颗子树的权重降低,防止过拟合,增加这个参数叫shrinkage方法。对特征进行列抽样,灵感来源于随机森林,除了能降低计算量外,还能防止过拟合。
    • Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
    • 列抽样(column subsampling),xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
  • XGB对每个特征进行分块(block)并排序,使得在寻找最佳分裂点的时候能够并行化计算。这是xgboost比一般GBDT更快的一个重要原因。
    • xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
    • 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
  • XGB通过设置合理的block的大小,充分利用了CPU缓存进行读取加速(cache-aware access)。使得数据读取的速度更快。因为太小的block的尺寸使得多线程中每个线程负载太小降低了并行效率。太大的block尺寸会导致CPU的缓存获取miss掉。
  • XGB可以基于Spark或者基于RABIT搞分布式,速度更快
  • xgboost中树节点分裂时所采用的公式是用分裂后的某种值减去分裂前的某种值,从而得到增益。为了限制树的生长,我们可以加入阈值,当增益大于阈值时才让节点分裂,比如取正则项里叶子节点数T的系数为阈值,所以xgboost在优化目标函数的同时相当于做了预剪枝。公式中分母处还给叶节点分数加上了一个lamda,lamda是正则项里leaf score的L2模平方的系数,对leaf score做了平滑,也起到了防止过拟合的作用,这个是传统GBDT里不具备的特性。

(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)


visitor tracker
访客追踪插件


你可能感兴趣的:(学习笔记,D.S.,and,M.L.,R,Python,数据科学与机器学习)