为高基数数据实施 Scikit Learn 的 FeatureHasher

Implementing Scikit Learn's FeatureHasher for High Cardinality Data

背景: 我正在研究健康保险索赔的二元分类。我正在处理的数据大约有 100 万行,混合了数字特征和分类特征(所有这些都是名义上的离散特征)。我面临的问题是我的几个分类特征具有很高的基数,其中许多值非常不常见或独特。我在下面绘制了 8 个具有最高独特因子水平计数的分类特征:

虚拟变量的替代方法:我一直在阅读特征散列并了解此方法是一种可用于快速和 space-向量化特征的有效方法,特别适用于具有高基数的分类数据。我计划利用 Scikit Learn 的 FeatureHasher 对具有超过 100 个独特特征级别的分类特征执行特征散列(我将为具有少于 100 个独特特征级别的其余分类特征创建虚拟变量)。在我实现这个之前,我有几个与特征哈希相关的问题,以及它与机器学习中模型性能的关系:

  1. 与仅虚拟化最常出现的因子水平相比,使用特征散列的主要优势是什么?我假设特征散列方法的信息丢失较少,但需要更多地说明散列在处理高基数时在机器学习算法中提供的优势。

  2. 我有兴趣在评估几个单独的分类模型后评估特征重要性。有没有一种方法可以在哈希特征与原始分类级别的关系的背景下评估它们?有没有办法反转散列或者特征散列不可避免地导致模型可解释性的损失?

很抱歉 post 和问题。任何 feedback/recommendations 将不胜感激!

  1. 特征散列可以在推理过程中支持在训练中看不到的新类别。使用虚拟编码,您只能对一组固定的先前看到的类别进行编码。如果你遇到训练中没见过的类别,那你就倒霉了。

  2. 对于特征重要性,有两种规范方法。

    a) Train/evaluate 您的模型具有和不具有每个特征以查看其效果。这在计算上可能很昂贵。

    b) Train/evaluate 您的模型具有该特征以及该特征在所有样本中排列。

    使用特征散列,每个特征扩展到多个列,所以 b) 会很棘手,我还没有找到任何包对特征散列列的重要性进行排列。

    所以,我认为 a) 可能是您最好的选择,考虑到您只有 100 万行。

此外,对于 Whosebug 上的 ML 问题,您可能会在 Cross Validated 上获得更好的答案。