LR(Logistic Regression) & XGBOOST 调参

转:https://blog.csdn.net/Jerr__y/article/details/78924485

在 CRT 中,最大的两个问题就是: 
- 数据不均衡。在投放的大量广告中真正转化的样本数量很少。 
- 数据稀疏。每个样本的特征信息都不太全。

LR 和 XGOOST 是 CTR 中常用的两种模型,二者各有优缺点,在 facebook 中使用 XGBOOST(提取特征) + LR(预测) 的方式。GBDT 模型擅长处理连续特征值,而 LR 则擅长处理离散特征值。在 XGBOOST 中,将连续特征值输入 XGBOOST 中,训练好模型以后,得到 K 棵数,每棵树上分别有 n1,n2,...,nKn1,n2,...,nK 个叶子结点。每个预测样本在每棵树中都会落在一个叶子结点上面,那么以落在棵树上的叶子结点 ID 作为该样本的特征值,就得到了一个 n1+n2+...+nKn1+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个迭代输出一次。
--------------------- 
作者:永永夜 
来源:CSDN 
原文:https://blog.csdn.net/Jerr__y/article/details/78924485 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/orangefly0214/article/details/88862889
今日推荐