【问题标题】:Implementing Scikit Learn's FeatureHasher for High Cardinality Data为高基数数据实现 Scikit Learn 的 FeatureHasher
【发布时间】:2023-03-09 17:17:01
【问题描述】:

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

虚拟变量的替代方法: 我一直在阅读有关特征散列的内容,并了解到这种方法是一种替代方法,可用于快速且节省空间的特征向量化方法,并且适用于特殊性对于具有高基数的分类数据。我计划利用 Scikit Learn 的 FeatureHasher 对具有 100 多个唯一特征级别的分类特征执行特征散列(我将为具有少于 100 个唯一特征级别的剩余分类特征创建虚拟变量)。在我实现这个之前,我有几个与特征散列相关的问题,以及它与机器学习中的模型性能的关系:

  1. 相对于仅对最频繁出现的因子级别进行虚拟化,使用特征散列的主要优势是什么?我认为特征散列方法的信息丢失较少,但需要进一步说明散列在处理高基数时在机器学习算法中提供的优势。

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

抱歉,很长的帖子和问题。任何反馈/建议将不胜感激!

【问题讨论】:

    标签: python machine-learning scikit-learn categorical-data feature-engineering


    【解决方案1】:
    1. 特征散列可以在推理过程中支持训练中未发现的新类别。使用虚拟编码,您只能对一组固定的先前看到的类别进行编码。如果您遇到训练中未见的类别,那您就不走运了。

    2. 对于特征重要性,有两种典型的方法。

      a) 使用和不使用每个功能来训练/评估您的模型以查看其效果。这在计算上可能会很昂贵。

      b) 使用特征以及在所有样本中置换的特征来训练/评估您的模型。

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

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

    此外,您可能会在 Cross Validated 上获得有关 stackoverflow 机器学习问题的更好答案。

    【讨论】:

    • 谢谢!我有一个问题要跟进。在研究 Scikit Learn 的 FeatureHasher 时,我将其视为一种减少为我的每一列生成的编码表维度的方法。我如何才能最好地确定我的数据集中每一列的最佳 n_features(我有一些超过 1,000 个级别的特征),目的是获得一个不会以指数方式增加输入分类模型的特征数量的编码表?我觉得这有点平衡。
    • 您可能会接受 log(N) 维度,其中 N=分类值的数量。更重要的是,如果您使用默认的alternate_sign=True
    • 设置 n_features = np.log(N) 是否足以满足具有低基数(比如说少于 10 个级别)的分类特征,还是最好为这些列设置 n_features=N?
    猜你喜欢
    • 2019-01-07
    • 2015-04-07
    • 2015-09-16
    • 2015-05-22
    • 2023-03-09
    • 1970-01-01
    • 2021-11-22
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多