python 如何编码具有高基数的分类特征?

esbemjvw  于 2023-06-28  发布在  Python
关注(0)|答案(5)|浏览(140)

我被一个包含一些具有高基数的分类特征的数据集卡住了。类似'item_description' ...我读到了一些叫做哈希的技巧,但它的主要思想仍然是模糊和不可理解的,我也读到了一个叫做“特征引擎”的库,但我没有真正找到可以解决我的问题的东西。有什么建议吗?

qni6mghb

qni6mghb1#

您可以查看category_encoders。这里有许多不同的编码器,可以使用它们将具有高基数的列编码为单个列。其中有所谓的贝叶斯编码器,它使用来自目标变量的信息来转换给定的特征。例如,TargetEncoder,它使用贝叶斯原理将分类特征替换为给定目标的期望值,然后类别采用的值,这与LeaveOneOut非常相似。您还可以检查基于catboostCatBoostEncoder,这是功能编码的常见选择。

0x6upsns

0x6upsns2#

对于像“item_description”这样本质上是文本变量的变量,检查this paper和相应的Python package
或者简单地在网上搜索“dirty categorical variables”,如果有疑问,这篇文章和软件包来自Gal Varoquaux,Sklearn的主要开发人员之一。

zsbz8rwp

zsbz8rwp3#

这篇文章可能也有帮助:4 ways to encode categorical features with high cardinality。它探索了应用于具有26个分类特征的数据集的四种编码方法,其基数高达40 k(包括代码):

目标编码

  • PROS:参数自由;不增加特征空间
  • CONS:目标泄漏的风险(目标泄漏是指使用来自目标的一些信息来预测目标本身);当类别具有很少的样本时,目标编码器将用非常接近目标的值来替换它们,这使得模型倾向于过拟合训练集;不接受测试集中的新值
    计数编码
  • 优点:易于理解和实施;参数自由;不增加特征空间
  • 缺点:碰撞时信息丢失的风险;可能过于简单化(我们从分类特征中保留的唯一信息是它们的频率);不接受测试集中的新值
    特征哈希
  • PROS:特征空间的有限增加(与一个热编码相比);在推理过程中不会增加大小并接受新值,因为它不维护观察到的类别的字典;当要素哈希应用于所有分类要素组合以创建单个哈希时,捕获要素之间的交互
  • 缺点:需要调整哈希空间维数的参数;当散列空间的维度不够大时的碰撞风险
    嵌入
  • PROS:特征空间的有限增加(与一个热编码相比);在推断期间接受新值;捕获要素之间的交互并了解类别之间的相似性
  • 缺点:需要调整嵌入大小的参数;嵌入和逻辑回归模型不能在一个阶段中协同训练,因为逻辑回归不使用反向传播进行训练。相反,嵌入必须在初始阶段进行训练,然后用作决策森林模型的静态输入。
xqnpmsa8

xqnpmsa84#

哈希是一种用于将分类数据转换为数值数据的技术。哈希背后的主要思想是通过应用哈希函数将每个类别Map到一个唯一的整数。然后,所得整数可以用作机器学习算法的输入。
用于此目的的一个常见散列函数是MurmurHash算法,其被设计为提供具有良好性能的高质量散列。散列有几个应用,包括数据检索,检查数据损坏和数据加密。我们有多个哈希函数,如消息摘要(MD,MD2,MD5),安全哈希函数(SHA0,SHA1,SHA2)等等。
哈希在较小的维度上转换数据,它可能导致信息丢失。然而,散列的一个潜在缺点是,不同的类别可能最终被Map到相同的整数,这可能导致冲突。这可以通过使用更大的散列空间(即,更多位)或通过使用不同的散列函数来缓解。
处理高基数分类变量的另一种方法是使用目标编码或均值编码。这涉及将每个类别替换为训练数据中该类别的平均目标值。这可能是有效的,但它也可能导致过度拟合,特别是如果类别的数量非常大。

资源
wmtdaxz3

wmtdaxz35#

选项:
i)使用目标编码。

  • 关于目标编码的更多信息:https://maxhalford.github.io/blog/target-encoding/
  • 关于分类变量的好教程在这里:https://www.coursera.org/learn/competitive-data-science#syllabus [部分:关于模型的特征预处理和生成,第3视频]

ii)使用实体嵌入:简而言之,这种技术用一个向量来表示每个类别,然后训练以获得类别的特征。

1.笔记本实现:

  1. https://www.kaggle.com/aquatic/entity-embedding-neural-net
  2. https://www.kaggle.com/abhishek/same-old-entity-embeddings
    iii)使用Catboost:

额外:有一个哈希技巧可能也很有帮助:https://booking.ai/dont-be-tricked-by-the-hashing-trick-192a6aae3087?gi=3045c6e13ee5

相关问题