前言
大家都知道在一个数据挖掘项目中,数据预处理经常花费我们大量的时间。高基数类别特征的数据往往非常棘手,而且它们大量的存在在现实生活中,例如邮编,IP地址,产品货号等等。
那么什么是高基数类别特征呢?
如果某一个特征是用来表示类别的/定性的 (categorical),而且这个特征的可能值非常多 (high-cardinality),通常用0到n的离散整数来表示,那么它就是高基数类别特征。
在这种情况下,常用的one-hot编码等方法都会不太合适,因此有人用一些统计学的方法–经验贝叶斯讲这种数据进行了一个map,得到数值数据。这种encoding的方式确实在实际应用中能够提升分类或预测的效果。那么什么时候可以对数据进行该encoding呢?需要满足以下几点:1. 数据会重复;2. 根据相同的值进行分组会超过一定数量(例如100)的组。
下文会主要通过三部分进行阐述,第一部分是对经典的类别特征处理方法的回顾,第二部分是本文重点,即阐述encoding方法,第三部分是对第二部分特殊情况的延伸。
1. 预处理方法回顾
对于低基数的类别特征,我们经常采用one-hot编码,即用N个二进制数值来表示该特征,这样会产生新的N个数据列。当N的值比较小的时候是可行的,但是当N值很大会增多过多的特征数。
目前来说,对高基数类别数据进行处理用的最多的是clustering方法,基本思想是将1-to-N的mapping问题转化成1-to-K的mapping问题 (K远小于N)。因此我们首先需要把高基数类别数据分成K个组 (grouping),然后对每个组进行独热编码。在这个过程中,最最重要的就是如何分组,以保证能最大限度的保留住原有数据的信息。
一个比较有效的方法就是:根据目标值 (Y)的相似度或者信息增益的提升度来进行分组,这可以通过层次聚类算法 (Hierarchical Clustering Algrithm)来实现,这种方法常出现在C4.5算法和一些商业数据挖掘库中。
本文介绍的处理高基数类别特征数据的方法类似于这种层次聚类算法,但是它不要求最后输出1-to-K的编码,另外它在保留原始数据信息上有一定优势。
2. 具体实现原理
主要思想是将高基数类别特征数据转化 (encoding) 为目标值 (dependent variable) 的概率估计值或者期望值(取决于是分类问题还是回归问题)。分为三种情况进行讨论,一是目标值为二元数值(分类),二是目标值为多元数值(分类),三是目标值为连续数值(回归)。
2.1 Binary Target
如果Y是二元的,即
Y
∈
{
0
,
1
}
Y\in\{0, 1\}
Y∈{0,1},令
S
i
S_i
Si代表给定
X
=
X
i
X=X_i
X=Xi时
Y
=
1
Y=1
Y=1的概率:
X
i
→
S
i
=
P
(
Y
∣
X
=
X
i
)
X_i\rightarrow S_i=P(Y|X=X_i)
Xi→Si=P(Y∣X=Xi)
接下来就是估算这个
S
i
S_i
Si,我们假设将数据分为训练集和测试集,分别包含
n
T
R
n_{TR}
nTR和
n
T
S
n_{TS}
nTS个样例,既然
S
i
S_i
Si的估算已经成为了模型训练中的一部分,那么我们应当只是用训练集的那部分数据。(注意一点,并不是所有X的取值都能在训练集观测到,有一部分可能只出现在测试集,因此我们的encoding模型必须有处理未见高基数类别特征值的能力)
如果训练样本足够多,