Strategies to encode categorical variables with many categories
对具有许多类别的分类变量进行编码的策略
提问:
RandomForestGump · 4 years ago
我正在看benchmark scripts,其中一种处理分类变量的方法是将变量替换为其在列中对应的计数频率(respective count frequencies of the variables in the column)。
我理解为什么我们需要转换变量,但有人可以解释为什么使用这种方法, 它背后的逻辑究竟是什么?
其次,我想知道是否有人愿意分享处理分类变量的其它技术(不包括直观的one-hot encoding),或者向我介绍一些以前的比赛中,获胜的队伍使用了哪些有趣的方法来处理分类变量。 谢谢!
Comments (6)
wacax ? (552nd in this Competition) ? 4 years ago
++++第一个问题:
一般来说,类别计数变换(categorical count transformation) 的逻辑基于这样一个现象:具有相似频率的特征往往具有相似的行为(features with similar frequencies tend to behave similarly)。 以语料库(corpus)中的单词为例,常用单词很少或根本没有真正的信息,而不常见的单词则与算法共享更多信息。
具体而言,某些算法(基于树的方法)甚至可以从事件计数(event count)中生成未指定类别(unspecified category)的规则。 比如说,我们有一个未知类别,其数量为4。算法可能会给出这样一个规则:
if Column Counts is < 5 and N is > 3 =X.
这和算法采用One-Hot编码列并给出如下规则完全相同:
If One-Hot-Encoded-Column is > 0 = X
在这种情况下,基于树的算法将使用相同的计数列从许多类别中制定若干规则。 但是正如我在开始时所说,算法泛化到具有相似计数的人群中(algorithms generalize among populations of similar),所以很可能你会发现如下规则:
If Column Counts is < 10 and N is > 3 =X.
其中通常包含行为相似的不同类别。 只需检查模型(models),并查找相关列的参数/重要性(parameters/ importance of the column),你就可以看到了。
++++第二个问题
特征哈希(Feature hashing) 不久前在这里非常流行。Hashing具有非常好的属性,这在学校里是一个完整主题,但主要原则是如果你有一个具有高基数的类别(category with high cardinality),你需要决定a minimum number of reduced categories (hashes) that all the categories will have to share。(就是从原始的高类别数,哈希到低类别数的多少)
如果两个类共享同一个的散列(hash)或存储桶(bucket),则称为哈希冲突(hash collision)。但是Feature hashing不处理hash collision,因为根据一些作者(我这里没有参考资料)的观点,可以通过强制算法更仔细地选择特征来提高准确性(improve accuracy by forcing the algorithm pick more carefully the features.)。
我最近遇到的另一种技术,是使用每个类别的平均响应(mean response per category)(也可以使用其它指标)。Owen, 现在的Kaggle number one,有在使用这种技术,你可以在这里找到他:
(Slide 25-26).
- http://www.slideshare.net/OwenZhang2/tips-for-data-science-competitions (OwenZhang’ slides)
- https://www.kaggle.com/rocelot/liberty-mutual-group-property-inspection-prediction/factortonumeric
把它想成“给定类别的平均响应/目标是什么”( “what is the average response/target of a given category”)。因此,取平均响应(浮点数),并在找到给定类别时使用它。还有一个稍微复杂一点的variation,它省略了一个值,但原理是相同的。(slide 26)
wacax ? (552nd in this Competition) ? 4 years ago
[quote=marbel;88608]
I think he is talking of “out of sample” in terms of computing the mean response for each level of a categorical variable. 我不知道他具体是如何做到的。
[/quote]
在我看来,这个名称有点误导人。如果你从一个类别的平均响应(average response of a category)开始,这个过程相当简单,它与类别编码有关,而与交叉检验(cross validation)或n-folds关系不大。
[quote=omgponies;88415]
我搜索过这个词,它只在构造CV(交叉检验)的时候出现过,而不是他似乎在谈论的内容。
[/quote]
是的,你是对的。我怀疑这是一种新颖的分类编码方法,因为除了slides和源代码,我还没有找到其他信息。
Anyway, the process could be summarized like this.
Take the slide from the presentation as an example:
Leave-one-out encoding
我们将“User 1”类别的average response值设为0.5。我们把它作为测试集(testing dataset)中所有单元格的特性传递给“User 1”所在的单元格。而在训练数据(training data)中,我们省略了自身所在行的响应,只计算在 其它行 中出现“User 1”的所有响应的平均值(mean of all responses where “User 1” is found in other rows), 这得到了slide上第一行的mean(Y)。 mean(1, 1, 0) = 0.66。然后我们添加了一点噪音(noise),我们最终得到了第一行最后一列的0.70035。
这背后的逻辑是:如果我们发现一个极端值(extreme value)或一个离群点(outlier),那么其他行里具有相同类别的相似数据点所提供的信息仍然可用于这一行…… 此外,这只适用于高基数的情况,因为从长向量中删除一行再计算平均响应不会造成太大的破坏,事实上,在末尾添加的随机噪声将有更大的影响。
我相信还有更多内容,所以请随意尝试和分析源代码。
- https://github.com/owenzhang/kaggle-avazu/blob/master/utils.py
- https://github.com/owenzhang/Kaggle-AmazonChallenge2013
marbel ? (229th in this Competition) ? 4 years ago
I think he is talking of “out of sample” in terms of computing the mean response for each level of a categorical variable. 我不知道他具体是如何做到的。我想有很多方法,但我认为主要的思想是,如果使用相同的数据来计算(每个类别的响应的)平均值并训练模型,那么仅仅取平均值就会使数据过拟合(overfit)。
我认为通过这种预处理进行cross validation的一种方法是::
1)分离数据的一个"fold",计算每个分类特征的平均响应
2) 用其他3个folds训练模型
3) 用第5个fold对模型进行validate。
还有其他想法吗?
Randombishop ? (7th in this Competition) ? 4 years ago
我尝试了对materialID,endA 和 endX列进行Owen所说的 average-leaving-one-out加上noise处理,但是对score没有改进。
有没有人用这种方法有更好的结果?(…i am not sure i implemented it properly, and want to know if i should spend more time on it…)