LR(Logistic Regression) & XGBOOST 学习笔记

LR(Logistic Regression) & XGBOOST 在 CTR中的应用

此文将持续更新,欢迎指导交流~

立志要成为一位优秀炼丹师的我搞起 CTR 来突然压力山大。数据是最最主要的原因,而且毕竟调得少,慢慢攒点经验吧。

在 CTR 中,最大的两个问题就是:

  • 数据不均衡。在投放的大量广告中真正转化的样本数量很少。
  • 数据稀疏。每个样本的特征信息都不太全。

LR 和 XGOOST 是 CTR 中常用的两种模型,二者各有优缺点,在 facebook 中使用 XGBOOST(提取特征) + LR(预测) 的方式。GBDT 模型擅长处理连续特征值,而 LR 则擅长处理离散特征值。在 XGBOOST 中,将连续特征值输入 XGBOOST 中,训练好模型以后,得到 K 棵数,每棵树上分别有 n 1 , n 2 , . . . , n K n_1, n_2, ..., n_K n1,n2,...,nK 个叶子结点。每个预测样本在每棵树中都会落在一个叶子结点上面,那么以落在棵树上的叶子结点 ID 作为该样本的特征值,就得到了一个 n 1 + n 2 + . . . + n K n_1 + n_2 + ... + n_K n1+n2+...+nK 维的稀疏特征,其中有 K 个值为 1, 其余值全部为 0。得到这样的特征以后,再结合其他一些离散的特征一起输入到 LR 中进行二次训练。

逻辑回归LR的特征为什么要先离散化

在工业界,很少直接将连续值作为特征喂给逻辑回归模型,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:

1.稀疏向量内积乘法运算速度快,计算结果方便存储,容易scalable(扩展)。
2.离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰。
3.逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合。
4.离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力。
5.特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问。
大概的理解:

  • 计算简单
  • 简化模型
  • 增强模型的泛化能力,不易受噪声的影响

XGBOOST 多分类问题的损失函数是 softmax 函数吗?

在XGBOOST 中,如果是二分类,那么每轮迭代中只有一棵回归数,使用的是 logistic cross entripy loss。但是如果是多分类问题的话,假设是 十个类别,那么每一轮迭代都会有十棵树,这是后每棵树对应一个类别的概率,计算的应该是 softmax loss(待考究确认)。

LR 和 XGBOOST 怎么处理缺失值?

LR 一般对特征先做 one-hot 处理,在处理的过程中,每个特征的缺失值会单独作为 1 列,是否缺失。在 XGBOOST 中,缺失值使用 np.nan 来替代。在训练的过程中,xgboost 在计算某列特征重要度的时候,应该不考虑缺失了该特征的样本。

LR 和 XGBOOST 怎么解决数据不均衡问题?

LR 调参需要注意什么?

LR 中的参数其实比较少,就是比较基础的正则化方式,惩罚因子,特别是在二分类问题的时候要调的参数更少。更重要的是做特征处理,特征选择。

  • c: 惩罚因子,根据测试集验证集的表现来调整就可以了。
  • tol: 当两次迭代的差异小于 tol 的时候,停止迭代。这个要根据自己的数据调整。
  • verbose: 输出训练内容,在开始实验的时候一般看看训练内容更容易帮助找到改进方法。

在 LR 中,划分好 一般来说,很多其他模型都可以做到比 LR 更好,所以也很少有人专门就 LR 的调参做非常多的工作。如果我们的项目中,正负样本应该是线性不可分的,这样,无论使用什么求解算法应该都能得到比较精确的解。

关于LR中数据可分性的理解,还有 LR 和 perceptron 的区别,参考:线性可分的数据集下,感知机模型是否是凸优化问题?

xgboost 调参需要注意什么?

xgboost 的参数比较多,相比 LR 来说,要复杂很多,但是效果一般也会更好些。在 xgboost 的训练中,我们一般划分训练集测试集以后,会设置一个 watch_list,在训练的过程中,通过观察在测试集上面的表现,取最优的模型。如:

watchlist = [(dm_train, 'train'), (dm_test, 'test')]
best_model = xgb.train(params, dm_train, n_round, evals=watchlist, early_stopping_rounds=n_stop_round)
y_pred_prob = best_model.predict(dm_test, ntree_limit=best_model.best_ntree_limit)

这样有个问题就是得到的模型本来就是根据测试集来选择的,很容易就造成在测试集上面过拟合。所以我们需要使用交叉验证的方式来选择最优模型。单独对训练集进行交叉验证,选择表现最好的模型来预测测试集。但是这样操作只是说,在我们选好参数以后,通过这种方式来得到最优的迭代轮次,而不是利用 early_stopping_rounds 选择测试集上的最优迭代次数。那么对于参数调优还是需要使用 grid search 的方式来实现。

  • early_stopping_rounds,早期停止次数 ,这要求evals 里至少有 一个元素,如果有多个,按最后一个去执行。如 evals = [(dtrain, ’train’),(dval, ’val’)]
  • verbose_eval (可以输入布尔型或数值型),也要求evals 里至少有 一个元素。如果为True ,则对evals中元素的评估结果会输出在结果中;如果输入数字,假设为5,则每隔5个迭代输出一次。

至于 xgboost 的调参,现在还是新手,Mark 些大佬们的笔记,慢慢学习。感觉比训网络好不了多少,貌似比 NN 炼丹还要麻烦。

xgboost 调参经验
论XGBOOST科学调参
Kaggle进阶系列:zillow竞赛特征提取与模型融合(LB~0.644)

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值