zoukankan      html  css  js  c++  java
  • xgboost 优势和常规步骤

    https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

     

    优势

    1、正则化

    2、并行计算

    3、可以处理空值(怎么处理?)

    5、不是贪心算法。会先分到最大深度max_depth然后再进行剪枝。可以得到增益最有解。

    6、有一个内置的交叉验证

    7、可以在原模型上接着训练(fine_tuning? 迁移学习?)

     

    短语参数命名规则。现在在xgboost的module中,有一个sklearn的封装。在这个module中命名规则和sklearn的命名规则一致。

    1. eta –> learning_rate
    2. lambda –> reg_lambda
    3. alpha –> reg_alpha

     

    参数

    1、基本配置参数

    booster: 基本使用gbtree,使用树模型,这个效果一般

    silent 通常设为0,方便我们查看每轮的loss

    nthread: 多线程,如果不设置,算法会自动查看核心数进行并行计算。

     

    2、Booster参数

    eta(learning rate):  学习率 0.01-0.2

    min_chile_weight: 子节点的最低sum of weights。 高的时候预防过拟合,太低了容易欠拟合。

    max_depth:树的最大深度,太高容易过拟合。通常3-10

    gamma: loss阈值,loss降低超过这个阈值,就继续切分

    max_delta_step:In maximum delta step we allow each tree’s weight estimation to be.,通常不用

    subsample: 通常0.5-1 构建每棵树时,只取一部分样本进行构建,避免过拟合

    colsample_bytree:[0.5-1] 特征抽样,

    colsample_bylevel : 通常不用

    lambda: L2 regularization term on weights (通常不用?)

    alpha: L1 regularization term

    scale_pos_weight

     

    3、训练参数

    objective 二分类使用'binary:logistic'  多分类使用 'multi:softmax' 直接返回标签, 也可以使用 'multi:softprob' 或者在训练后使用predict_prob输出类别的概率

    eval_metric: 用来评估validation data:rmse ,mae,logloss,error ,merror ,mlogloss,auc

    4、XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。而如果使用sklearn的kfold和cross_val_score,这个是每次模型训练只用一个固定的数据,而不是每轮boosting都交叉验证。

     5、关于特征工程

    XGBOOST是树的boosting模型,由于树的非线性特点,我们不需要对特征进行归一化(正态分布),缩放(到01区间),

    或者取log(这个存疑,我个人觉得取log可能有用?),但是我们应该关心创造特征。

    比如过去5天内均值,去年同期的数值,环比增长,同比增长。还比如说在租房的场景中,房租/卧室数,这些跟业务非常相关的特征,其实是需要不断的探索才能找到。XGBOOST里并不能帮我们获取这样的特征。

    同深度学习对比,深度学习本质上也是依靠如LSTM,CNN等特殊的结构,去获取到适合这个业务的特征。

    然后类别特征在XGBOOST里面并不是特别好用,如果相关性不大可以去掉。如果类别数并不是很多,比如只有个位数的类别,则可以加上。如果类别数很多,可以考虑使用CATBOOSTING或者LIGHTGBM

    xgboost无法处理类别特征,事实上,相比起强加类别特征,我们更需要思考类别特征背后的意义。比如数据有城市这一类别特征,但是城市背后的意义是什么,一线城市和二线城市区别在哪里?

    我们可以进行量化,将城市量化成为有具体数字的特征,如GDP,面积,人口,人口/平方公里、GDP/人,GDP/平方公里,构造尽可能多的特征用来代表类别特征。这样我们不会陷入标签陷阱,如果一个城市很接近于1线城市,但是却被分到了2线城市,

    直接使用标签会带来很多问题。

    还有比如星期特征,我们直觉上知道在个人消费领域,星期五六日是高峰,那么我们通过统计得到星期1、2、3、4、5、6、7他们的平均营业额,然后缩放到01区间,用来替代周几这个特征。

    而每个月的几号同样会有一些特征。

    也就是说,假如把类别特征当成一个分类器的分类结果,我们不直接使用这个结果,而是转而使用为了判别这个结果而使用到的特征。这个才是xgboost拿手的

    6、如何查看feature importance?

    1.xgb(原生).plot_importance(model)

    2.model.get_booster().get_score(importance_type="weight")

    'weight', 'gain', 'cover', 'total_gain', 'total_cover'

     但是这个feature_importance使用不同计算方法出来的结果可能完全不一样https://towardsdatascience.com/be-careful-when-interpreting-your-features-importance-in-xgboost-6e16132588e7

    一定使用合适的计算方法,否则可能会完全误导特征工程的方向

    6、数据量小的时候,early_stop_rounds一定要慎用!因为可能会让模型训练的不够。最理想的情况,应该是每10个n_estimators就计算一次k折的val_loss,然后取平均,loss最小的我们用来作为n_estimators

  • 相关阅读:
    Oracle 提示 用户在线,无法删除的清理方法
    拉格朗日乘子法和KKT条件
    主题模型及其在文本情感分析中的应用
    spring-data-elasticsearch整合elasticsearch
    自然数的K次幂的数列求和
    SVM 简要推导过程
    机器学习中导数最优化方法(基础篇)
    漫谈:机器学习中距离和相似性度量方法
    A geometric interpretation of the covariance matrix
    数据挖掘算法之协同过滤算法
  • 原文地址:https://www.cnblogs.com/yjybupt/p/12937286.html
Copyright © 2011-2022 走看看