一种处理高维categorical特征的处理方法-TBS (Target based statistic)

首先要说的是这篇paper主要参考了2001年SIGKDD的论文《A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems》。确实,从时间上来看这篇paper已经属于一篇比较老的paper了,我之所以能翻到这么老的paper是因为在2017年的几个俄罗斯专家提出的《CatBoost: unbiased boosting with categorical features》中重新用到了这个比较老的处理高维categorical特征的方法(CatBoost是一种GBDT的实现方式,他的其中一个创新优势就是使用了本文要讲的对待类别特征的处理方法,这种GBDT的实现框架要优于XGBOOST和LIGHTGBM),我花时间仔细看了一下,感觉还是很有借鉴意义的,这里就总结一下。

其实对待高维类别特征,我们之前都知道一般业界有两种比较通用的处理方式,1 one-hot编码;2 采用embedding策略。 对于one-hot编码方式来说,如果类别种类过多,会导致输入向量维度过高,这样不利于后续的模型进行训练;同样对于embedding策略来说,如果类别种类过多会大大加重模型的参数复杂度,对于这样的模型一定要使用较大的数据量来进行训练才可以达到比较好的效果(阿里系统的广告推荐模型对于商品和用户的编码基本采用的都是这样的方式,毕竟人家有海量的用户浏览和点击数据)。但是如果我们数据量并不是特别大,输入特征的类别数又比较多,其实可以采用本文介绍的策略-TBS(Target based statistic),下面就来详细介绍这种策略的计算方式:

以二分类为例,Y是数据的label,一个类别特征是X,其中一个类别取值是xi,那么在TBS的方式下对于它的编码值就是:si=p(Y=1|x=xi)=niYni,其中分子代表了整个数据集中类别特征X取值xi中的样本中lable为1的数量,分母代表了整个数据集中类别特征X取值xi的所有样本数。很显然,这个公式反应了特征xi和label 1之间的关联程度。上述公式也有不合理的情况,就是当ni比较小的时候,会导致si估计的不准确,于是上述式子更改为如下形式:
si=λ(ni)niYni+(1λ(ni)nYnTR)
其中nY是所有样本中label 为1的数量,nTR是所有的样本数量,其中λ(ni)是一个取值在[0,1]范围内的函数,其函数形式为:λ(n)=11+e(nik)f,k和f都是提前需要确定的超参数,可以看书如果当ni比较大的时候,λ(n)的值趋近于1,而当ni比较小的时候,λ(n)趋近于0,整个式子的理解还是比较容易的。如果是多分类问题,就把上述的统计方式以每一维类别进行统计,比方说是k分类问题,那么转化之后一个categorical特征的取值就会对应一个k1维的向量。

同样的原理如果是回归问题,目标值Y就变成了连续值,计算公式如下:
si=λ(ni)Ykni+(1λ(ni)YpnTR)

毕竟我们在做机器学习模型解决问题的时候,更在意的是这些特征和最终label之间的关系,之前的one-hot和embedding策略相当于让机器自己去学习这种潜在的关联关系;而这种TBS策略就相当于人为的去统计这种关联关系,这在数据量不是很大的时候应该会比之前的one-hot和embedding策略更好(这也是catboost性能更好的原因之一吧),同时也给我们提供了一种解决问题的思路。

没有更多推荐了,返回首页