为什么独热编码会引起维度诅咒,以及避免他的几个办法

特征工程是数据科学模型开发的重要组成部分之一。数据科学家把大部分时间花在数据处理和特征工程上,以便训练一个鲁棒模型。数据集由各种类型的特征组成,包括类别、数字、文本、日期时间等。

由于大多数机器学习模型只理解数值向量,所以各种特征需要被设计成数值格式。有各种编码技术可以将文本数据转换为数字格式,包括词袋、Tf-Idf矢量化等等。分类特征可以编码成数字格式,独热编码就是其中一种方式。

什么是独热编码?

独热编码,又称虚拟编码,是一种将分类变量转换为数值向量格式的方法。每个类别在数值向量中都有自己的列或特征,并被转换为0和1的数值向量。

为什么独热编码对于有许多类的列是不可行的?

对于一个有许多类别或层次的分类特征,从机器学习的角度来看独热编码不是一个很好的选择,最明显的原因是它加起来有大量的维度。例如,pin码有大量的级别或类别。创建一个单热编码的向量的Pincode列将使所有的值加起来都为零,只有1列除外。这个数字向量包含的信息不多,只有一大堆0。

数据集维数的增加会引起维数诅咒,从而导致并行性和多重共线性问题。

基本有两种类型的分类特征:

  • 有序变量:离散值的有限变量集,值之间按等级排序。例如:学历、工资等。
  • 标称变量:离散值之间没有关系的有限变量集。例如:国家、Pin码等。

有序分类特征在它们的层次之间有一个已知的关系,使用标签编码是最好的选择。而对于标称变量来说,类别之间没有关系。但是有各种已知的技术来编码标称分类变量,例如独热编码就是其中之一。

但是,对多层分类变量的进行独热编码会导致维度诅咒。在本文中,您可以阅读一些技巧/技巧,这些技巧可以用于多层编码分类变量。

限制X个最常见的类别

独热编码具有多个层次的全部标称分类变量增加了许多的维度。这里有个更好的选择是采用最常见的x个类别,并创建一个虚拟编码或一个独热编码。

例如,我们使用世界城市数据库进行演示,从simple maps网站下载。

数据集中的“国家/地区”列具有224个唯一特征,如果使用独热编码产生224个维度。 在下面可以看到,“国家/地区”列的频率分布非常偏斜,很少有类别具有最高频率。

从频率分布来看,几乎没有类别具有高频,而大多数类别具有非常低的频率。 因此,我们可以将“独热编码”限制为仅出现在前x个频繁出现的类别。 在此可以对x进行试验并确定。

Concluding from the above PDF: 50 top occuring countries covers almost 85% of rows. 100 top occuring countries covers almost 95% of the rows.

因此,限制为100个类别可以覆盖95%的行,并将224个国家的一键编码的维度减少到101个国家(其他100个国家/地区排名最高,其他1个国家/地区)。

频率编码

频率编码是Kaggle比赛中大量使用的一种技术或技巧。 想法是用其计数或频率替换每个类别。

可以使用pandas函数生成“国家/地区”列的频率分布:data ['country'].value_counts()

现在用数据中的频率替换每个类别,例如,美国将被7768取代,俄罗斯将被1161取代。这项技术实施起来非常广泛,并且在Kagglers中非常流行。

使用此技术的缺点是,如果某些类别具有相同的计数,则模型将对它们进行类似的处理,因此会丢失一些信息。

目标编码

目标编码也称为平均编码是Kagglers广泛使用的一种流行技术,该技术将分类变量表示为一维数值向量。

每个类别都是将变量替换为该类别的平均目标值。 这种技术使我们在目标变量和分类变量之间形成直接关系。

嵌入

对于文本数据类型或具有字符串值且不特定于领域的类别变量,可以使用预先训练的模型(如Word2Vec)将它们转换为词嵌入。如果数据集具有较长的文本类别,则可以对Word2Vec取加权平均值或使用预先训练过的Sent2Vec。

因此,使用预训练的嵌入模型,您可以将分类变量的文本类别转换为数值向量。

使用领域知识

最后还可以使用领域知识对分类特征进行编码。 可以根据多种因素(例如GDP,人口,人均纯收入等)对“国家/地区”列进行编码。 这种编码根据案例研究和要求而有所不同。

同样,您也可以使用领域知识将标称变量转换为序数变量,标签会对其进行编码,以将其转换为数字格式。

总结

具有多个类别的一键编码类别变量会导致编码的维数增加。 这引起了维度诅咒,因此产生了并行性和多重共线性的问题。在本文中,我们讨论了几种编码具有多个级别的分类变量的技术,能够部分解决维度诅咒的问题。

(0)

相关推荐