catboost对类别特征处理的简单总结

时间:2024-03-29 12:36:09

catboost对类别特征处理简单总结

ctb针对类别特征的处理

怎么样做,使类别特征有更为丰富的表达?

1、Mean Encoding

1、【针对高基数的类别特征】
Mean Encoding:均值编码
场景:
如果某一个特征是定性的(categorical),
而这个特征的可能值非常多(高基数),
那么平均数编码(mean encoding)是一种高效的编码方式。
在实际应用中,这类特征工程能极大提升模型的性能。

LabelEncoder:存在一种顺序关系
定性特征的基数(cardinality)指的是这个定性特征所有可能的不同值的数量。
在高基数(high cardinality)的定性特征面前,这些数据预处理的方法往往得不到令人满意的结果
高基数定性特征的例子:IP地址、电子邮件域名、城市名、家庭住址、街道、产品号码

主要原因:

  • LabelEncoder编码高基数定性特征,
    虽然只需要一列,但是每个自然数都具有不同的重要意义,
    对于y而言线性不可分。使用简单模型,容易欠拟合(underfit),
    无法完全捕获不同类别之间的区别;使用复杂模型,容易在其他地方过拟合(overfit)

  • OneHotEncoder编码高基数定性特征,必然产生上万列的稀疏矩阵,
    易消耗大量内存和训练时间

类别特征编码:
Mean Encoding:
对于每个类别,将它的值设置为训练数据上目标变量的平均值

但是在实际过程中,特别是处理高基数特征时,这样简单的处理会增加过拟合的风险。因为在高基数的特征内,很容易存在一些看起来预测能力很强的类别。

最简单的正则化技术是将稀有类别的编码移动到更接近数据集目标均值的位置。这样,我们希望模型就不太可能对小类别学习非常高或非常低的概率:
它们的编码更接近于中间均值,并与平均值目标值更小的类别的编码混合在一起。

基于先验概率的正则化
比如,某个标称值xi只有一条记录,则这个标称值转换成数字后就等于该记录的标签值。

这样的处理还存在一个缺点,获得的编码仍然是伪连续的,每个类别都将用一个不同的实数编码
这仍然会允许树模型将任何类别放在一个不同的叶子中,并为叶子设置一个极端的目标概率,
目标是在一个类别中以某种方式随机编码,但仍然让模型知道类别编码和目标变量之间存在相关性。
减少过拟合的风险

catboost先验概率减少过拟合:
贝叶斯的思想:
监督学习的思想,已经知道label,先验概率P,后验概率P(y=target|x=variable)
catboost对类别特征处理的简单总结

a为参数a>0

其中P为先验值,它有助于减少从低频类别中获得的噪音。对应回归任务,计算标签的平均值作为先验值;对于二分任务,将正类的出现概率作为先验值。

基于K-fold的正则化
k折正则化背后的思想是仅使用类别示例的一部分来估计该类别的编码。通过将数据分割成k-fold,对于每个待编码的样本,使用除待编码样本之外的所有fold样本来估计它的编码。
通过全局均值正则化和k-折叠相结合的方法,我们可以实现更健壮的编码。
对于训练集,这里使用5-K,将数据分成5组
对于第一折,使用除第一折之外的数据进行Mean Target Encoding进行编码
对于测试数据集,对训练集的编码取均值,作为其编码

2、它用特殊的方式处理categorical features

  • 统计次数:首先他们会计算一些数据的statistics。
    计算某个category出现的频率,
    加上超参数,生成新的numerical features。
    这一策略要求同一标签数据不能排列在一起(即先全是0之后全是1这种方式),训练之前需要打乱数据集
  • 不同排列:使用数据的不同排列(实际上是4个)。在每一轮建立树之前,先扔一轮骰子,决定使用哪个排列来生成树

3、Catboost使用对称树。

XGboost一层一层地建立节点,lightGBM一个一个地建立节点,
而Catboost总是使用完全二叉树。它的节点是镜像的。
Catboost称对称树有利于避免overfit,增加可靠性,
并且能大大加速预测等等。

训练是必须对类别变量进行声明:
如果未在cat_features参数中传递任何内容,
CatBoost会将所有列视为数值变量。
注意,如果某一列数据中包含字符串值,CatBoost 算法就会抛出错误。另外,带有默认值的 int 型变量也会默认被当成数值数据处理。
在 CatBoost 中,必须对变量进行声明,
才可以让算法将其作为分类变量处理。

4、贪心选择组合特征

多个标称特征的组合可以作为一个新的特征(交互特征)。但是,组合的数量随着数据集中的标称特征的数量呈指数增长,所以不可能在算法中考虑所有这些交互特征。在创建当前树的分割节点时,CatBoost 以贪婪的方式考虑组合。在构建树的第一个分割节点时不考虑组合特征。对于下一个拆分,CatBoost 将当前树中存在的所有组合和分类特征与数据集中的所有分类特征组合在一起。组合值即时转换为数字。CatBoost 还以下列方式生成数字和分类特征的组合:在树中选择的所有分割都被视为具有两个值的分类,并以与分类相同的方式组合使用。

参考资料:
https://zhuanlan.zhihu.com/p/26308272

https://www.cnblogs.com/nxf-rabbit75/p/10923549.html#auto_id_0

https://blog.csdn.net/juzexia/article/details/78581462

https://77qingliu.com/2019/05/12/Improving-model-performance-with-mean-target-encoding/