二进制要素应该是单热编码的吗?

时间:2017-04-20 09:43:51

标签: python machine-learning scikit-learn

我正在使用包含几十个关于人的二元功能的数据,这些功能基本上归结为“人物有特征x”[真/假]。

从我所能发现的,在线分类数据应该是单热编码,而不是为每个类别分配任意值,因为你不能说“类别1小于类别2”。所以解决方案是为每个类别创建一个虚拟变量:

Cat || dummy 1 | dummy 2 | dummy 3
____||_________|_________|________
 1  ||   1     |   0     |   0
 2  ||   0     |   1     |   0
 3  ||   0     |   0     |   1

现在对于二进制特征,可以选择直接使用变量(1表示true,0表示false)或使用两个虚拟变量((1,0)表示true,(0,1表示)表示false。)。但我找不到任何显示/解释最佳方法的来源。

我自己也很矛盾,因为一方面,虚拟变量降低了每个变量的重要性,并且表明至少在某些情况下模型的准确性受到影响source。但另一方面,这也可以编码丢失的数据(以(0,0)的形式)。此外,是否可以说“假小于真”?

我实际上在python中使用了随机森林,我知道基于树的分类器(如Random Forests)支持分类数据,但Sklearn软件包还没有实现它。

我在Sklearn数字数据集上写了一个小测试。该数据集具有8×8个数字图像(0-9),每个像素具有0到16之间的值,并且简单模型可以使用它来学习识别数字。

对于我的测试,我更改了>的值8到True,< = 8到False。与原始数据相比,课程的准确性受到影响,但是当我实现单热编码时,因此将True更改为(1,0)并将False更改为(0,1),与二进制编码相比,我找不到显着差异

非常感谢对推荐方法的解释!

1 个答案:

答案 0 :(得分:2)

将采用[0,1]值的二进制变量转换为[(0,1),(1,0)]的一键编码是多余的,出于以下原因,不建议这样做(其中一些已经在上面的评论中提及,但只是为了对此进行扩展):

  1. 这是多余的,因为二进制变量已经采用类似于单次热编码的形式,最后一列被删除,因为使用或不使用它都不会有任何区别,因为可以从中推断出给定的第一列:如果我给您[[0,),(1,)],您可以知道互补列[(,1),(,0)]。

  2. 假设您有多个二进制变量,例如说4。如果将它们转换为一键编码格式,则尺寸将从4增加到8。由于以下原因,不建议使用后者:

    • 维数的诅咒:高维数据可能非常麻烦。那是因为许多算法(例如丛集演算法)都使用欧几里得距离(Euclidean Distance),由于平方项的缘故,它对噪声很敏感。实际上,随着尺寸的增加,数据点散布得太细,从而使数据变得异常嘈杂。此外,邻域的概念变得毫无意义,并且基于发现数据点距离之间的相对对比度的方法变得不可靠。

    • 时间和内存复杂度:直观的是,增加功能数量将使算法花费更多的执行时间和内存空间需求。仅举几例,在计算中使用协方差矩阵的算法将受到影响。 多项式算法将以太多的术语结束……等等。通常,学习较少的功能通常会更快,特别是如果多余的功能是多余的。

    • 多重直线度:由于二进制变量的一键编码形式的最后一列是多余的,并且与第一列有100%的相关性,因此这会给线性变量带来麻烦基于回归的算法。例如,由于普通最小二乘估计涉及对矩阵求逆,因此,如果许多特征相关,则计算机算法可能无法获得近似逆,因此该逆可能在数值上不准确。此外,线性模型的工作原理是,在将所有其他自变量保持为常数 之后,观察因变量y随单位自变量 的变化而发生的变化,如果自变量高度相关,则后者会失败(there are more other consequences of Multi-Collinearity)(尽管某些其他算法对此的敏感性不如决策树

    • 容易出现过度拟合:通常,太多的功能(无论它们是否相关)都可能过度拟合您的模型,因此无法归纳为新的示例,因为数据集中的每个数据点都可以通过给定的功能完全识别(搜索NG讲座,他对此进行了详细解释

摘要

简而言之,将二进制变量转换为单次热编码的变量是多余的,并且可能导致不必要的麻烦。尽管相关功能可能并不总是会使您的模型恶化,但它们也不总是会改善它。