XGboost常见特征处理及其他问题

1. Bagging 和Boosting区别

   RF,GBDT,XGBoost,lightGBM都属于集成学习(EnsembleLearning),集成学习的目的是通过结合多个基学习器的预测结果来改善基本学习器的泛化能力和鲁棒性。

(1)形式上

  Bagging:基本学习器之间不存在强依赖关系、必须并行生成的序列化方法;
                   例如:随机森林
                   bagging主要关注降低方差
  Boosting:基本学习器间存在强依赖关系、可同时生成的串行化方法;
                   例如:XGBoost

(2)随机森林

 RF包括四个部分:
          a、随机选择样本(放回抽样);
          b、随机选择特征属性;
          c、构建决策树;
          d、随机森林投票(平均) 因此防止过拟合能力更强,降低方差。

          
 优点:
         a)随机森林算法能解决分类与回归两种类型的问题,表现良好,由于是集成学习,方差和偏差都比较低,泛化性能优越;
         b)随机森林对于高维数据集的处理能力很好,它可以处理成千上万的输入变量,并确定最重要的变量,因此被认为是一个不错的降维方法。此外,该模型能够输出特征的重要性程度,这是一个非常实用的功能。
         c) 可以应对缺失数据;
         d)当存在分类不平衡的情况时,随机森林能够提供平衡数据集误差的有效方法;
         e) 高度并行化,易于分布式实现
        *f)  由于是树模型,不需要归一化即可之间使用*
缺点:
       *a) 随机森林在解决回归问题时并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续型的输出。当进行回归时,随机森林不能够作出超越训练集数据范围的预测,这可能导致在对某些还有特定噪声的数据进行建模时出现过度拟合。*
        b)  忽略属性之间的相关性
        c)  在噪声较大的分类或者回归问题上容易过拟合

(3)XGBoost

        **XGBoost与GBDT的区别**:
        a、GBDT是机器学习算法,XGBoost是该算法的工程实现;
        b、正则项:在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,降低方差,从而提高模型的泛化能力。
        c、导数信息:GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
      d、基分类器:传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
      e、子采样:传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据支持列抽样,不仅防止过拟合,还能减少计算;
      f、缺失值处理:传统GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略;
      g、XGBoost最大的认知在于其能够自动地运用CPU的多线程进行并行计算,同时在算法精度上也进行了精度的提高。由于GBDT在合理的参数设置下,往往要生成一定数量的树才能达到令人满意的准确率,在数据集较复杂时,模型可能需要几千次迭代运算。但是XGBoost利用并行的CPU更好的解决了这个问题;
      
      **Xgboost 可以做那些预处理:**
      a、缺失值处理,补全缺失值可以增加特征的预测能力,这与 Xgboost 可以处理缺失值不冲突;
      b、异常值处理,原理同上;
      c、数据不平衡:虽然 Xgboost 也可以处理数据不平衡...;
      d、数据分桶:虽然...;(分桶(均匀分桶、分位点分桶):异常值检测,分布调整(BOX-COX 转换调整有偏分布、正态分布标准化,幂律分布取 log 等),除此之外,也可以构造新特征。。。)
      e、数据分布调整:转换为正在分布等等;
      f、获取更多的数据:增加泛化能力。
      g、构造新特征:Xgboost 本身也具有特征组合的能力,所以我们可以结合具体业务去横向或者纵向的抽特征。

2. XGboost对于文本变量是否需要one-hot处理

 **第一种解答**:不提倡对离散值特别多的特征通过one-hot的方式进行处理。因为one-hot进行特征打散的影响,其实是会增加树的深度。针对取值特别多的离散特征,我们可以通过embedding的方式映射成低纬向量。与单热编码相比,实体嵌入不仅减少了内存使用并加速了神经网络,更重要的是通过在嵌入空间中映射彼此接近的相似值,它揭示了分类变量的内在属性。
 **第二种解答**:
   决策树模型不推荐对离散特征进行 one-hot。 主要有两个原因:
   会产生样本不平衡问题,本来特征是:红的白的绿的,现在变为是否红的、是否白的、是否绿的。。只有少量样本为 1,大量样本为 0。这种特征的危害是,本来节点的划分增益还可以,但是拆分后的特征,占总样本的比例小的特征,所以无论增益多大,乘以该比例之后会很小,占比例大的特征其增益也几乎为 0,影响模型学习;决策树依赖的是数据的统计信息,one-hot 会把数据切分到零散的小空间上,在这些零散的小空间上,统计信息是不准确的,学习效果变差。

3.XGBoost是否需要对数值变量做处理

可以对数据进行分桶处理:
   分桶(均匀分桶、分位点分桶):异常值检测,分布调整(BOX-COX 转换调整有偏分布、正态分布标准化,幂律分布取 log 等),除此之外,也可以构造新特征。。。

4. XGboost是否需要对特征做相关性处理

    特征重要性的有效性变差:比如某个强特本来特征重要性是很高的,但是因为存在多组相关性很强的强特,极端的例子,直接赋值几列取值完全相同的特征列,则在feature importance中,这个强特的特征重要性将被稀释;具体测试案例可见: 
    https://datascience.stackexchange.com/questions/12554/does-xgboost-handle-multicollinearity-by-itself
    共线性会影响模型的泛化性能:正如这个作者所说,太多共线性特征的存在确实会使得模型的泛化性能下降,当然,这里指的是“过多”,如果是很少量共线性特征存在其实对于模型影响很轻微,但是如果存在大量共线性特征,尤其是比赛的时候暴力的特征衍生,会产生相当多相关性很高的特征,从而导致gbdt在训练的过程中重复采样相关性很高的特征,使得模型的效果变差,具体可见kaggle_ieee的kris分享的方案,通过删除大量冗余的V特征,local cv上升了千五,b榜上涨千4(事后分别测试的)。   
    https://www.kaggle.com/c/quora-question-pairs/discussion/33876

XGboost常见特征处理及其他问题_第1张图片
5. XGboost是否需要对不重要的(噪声)特征是否需要删除

 gbdt算法的分裂的过程中可以自动做到特征选择那么是否意味着我可以无限做特征衍生,反正模型会自动筛选其中的好坏特征?
    (1)首先,暴力衍生不太可取,一方面太耗时间和内存,一方面容易产生高相关性(或者高局部相关的)特征与噪声,高相关性特征可以通过相关系数来剔除,但是高局部相关特征的检验很复杂并且麻烦,而噪声特征的处理也比较繁琐耗时;https://datascience.stackexchange.com/questions/17364/gradient-boosting-tree-the-more-variable-the-better(噪声变量不会带来大的增益,所以实际上树在分裂的时候不会考虑他们从而也不会影响树的分裂,因此无限大的特征维度对tree 没有影响)
    备注:这仅对于非常巨大的的数据集是正确的,因为大量的训练集中的样本数量可以很好地涵盖所有特征空间由于引入新特征而产生的变化。但是在实践中,样本数量往往有限,如果特征维数足够大(比如暴力的特征衍生),最终会带来很多采样噪声,因为数据越多维数,对可能的分布空间的覆盖范围的能力就越弱。
    (2)添加的变量越多,弱相关变量就越有可能恰好适合某些特定组合的分割选择,然后创建新的分支,但是这是噪声产生的模型分支对于未来的预测有很大偏误。
    (3)实际上,我发现XGBoost在小范围内对噪声非常鲁棒。但是,我也发现,出于类似的原因,它有时会选择质量较差的特征变量,而不是关联性更好的数据。因此,这不是“变量越多对XGBoost越好”的算法,您确实需要考虑可能的低质量功能。https://datascience.stackexchange.com/questions/17364/gradient-boosting-tree-the-more-variable-the-better
       1)更多内存占用,更慢的装载速度,更慢的处理速度等。
       2)每个功能需要最少数量的样本才能有效学习模型。通过包含冗余特征,此样本:特征比率得以减小,这使许多模型更难确定特征是否是有用的预测因子。(补充一下,这里作者的意思是这样的,就是假设存在过多的垃圾特征,那么树在分裂的过程中难免会用到这些垃圾特征导致树的分裂,继而导致每个新的分支的样本数量的减少,那么比如我们设置叶子节点最小样本数量、最大叶子节点数量等超参数的时候就很容易导致树因为达到了预设条件而提前终止分裂,退一步说,即使没有超参数的限制,因为被垃圾特征“抢走”了不少分裂的样本,可能导致真正有效的特征最终只能在少数样本上分裂,这将导致模型无法正确评估这类实际上有效的特征并且也无法正确利用有效的特征)。

总结:

  1、随机森林更适合做分类预测
  2、XGBoost更合适做回归预测
  3、XGBoost在做特征处理时:
       (1) 当文本特征较多时或者该特征的,不建议使用one-hot处理,可以使用embbeding或者其他方式处理;
      (2)对于数值型特征, 可以做分桶(均匀分桶、分位点分桶):异常值检测,分布调整(BOX-COX 转换调整有偏分布、正态分布标准化,幂律分布取 log 等),除此之外,也可以构造新特征。。。
      (3) 可以做特征相关性分析:比如某个强特本来特征重要性是很高的,但是因为存在多组相关性很强的强特,极端的例子,直接赋值几列取值完全相同的特征列,则在feature importance中,这个强特的特征重要性将被稀释;备注:与某个重要性很高的特征,若存在大量的相关特征是才会出现该现象;
       (4)需要对不重要的特征进行筛出:添加的变量越多,弱相关变量就越有可能恰好适合某些特定组合的分割选择,然后创建新的分支,但是这是噪声产生的模型分支对于未来的预测有很大偏误,并且消耗内存。

参考链接:

http://www.shouhuola.com/q-26136.html
https://blog.csdn.net/weixin_46649052/article/details/115213618
https://www.zhihu.com/question/333379525/answer/759350110
https://zhuanlan.zhihu.com/p/105094131

你可能感兴趣的:(机器学习--数据处理,机器学习,机器学习,算法,人工智能,python)