我试图理解
- 编码背后的原因(one-hot encoding 和 dummy encoding)
- one-hot 和 dummy 有何不同
我试图理解
大多数机器学习模型只接受数值变量。这就是为什么将分类变量转换为数字以便模型可以更好地理解的原因。
现在让我们解决您的第二个查询让我们看看是什么one-hot encoding
然后dummy encoding
看看区别
一种热门编码:以列名 Fruit 为例,它可以有不同类型的水果,如黑莓、葡萄、橙子。在这里,每个类别都映射到包含 0 或 1 的二进制变量。当特征是名义上的时广泛使用。
水果 | 价格(美元/磅) |
---|---|
黑莓 | 3.82 |
葡萄 | 1.2 |
橘子 | .64 |
发布一个热编码表现在如下所示
黑莓 | 葡萄 | 橘子 | 价格(美元/磅) |
---|---|---|---|
1 | 0 | 0 | 3.82 |
0 | 1 | 0 | 1.2 |
0 | 0 | 1 | .64 |
虚拟编码:类似于一种热编码。而一种热编码将N
二进制变量用于变量中的N
类别。虚拟编码使用N-1
特征来表示N
标签/类别
柱子 | 一个热门代码 | 虚拟代码 |
---|---|---|
黑莓 | 100 | 10 |
葡萄 | 010 | 01 |
橘子 | 001 | 00 |
从我遇到的情况来看,最大的优势sklearn.preprocessing.OneHotEncoder
是您可以将其保存为scikit-learn编码器,因此您可以在训练集上对其进行训练,并根据您训练的内容将其应用于您的测试(您将重新创建相同的列)。另一方面,pandas.get_dummies
仅直接应用于您的数据框,因此您将无法在一个集合上对其进行训练,然后根据您首先训练的内容将其应用于另一个。这会导致机器学习问题。基本上总是使用one-hot。
例子:
训练集:
Dog
Cat
Rabbit
在此基础上训练你的 one-hot 编码器并应用它:
Dog Cat Rabbit
1 0 0
0 1 0
0 0 1
测试集:
Dog
Horse
Cat
从您的训练集中训练的 one-hot 编码器应用于您的测试:
Dog Cat Rabbit
1 0 0
0 0 0
0 1 0
如果您使用 Pandas pandas.get_dummies
,则只能将其直接应用于您的测试:
Dog Horse Cat
1 0 0
0 1 0
0 0 1
你的火车和测试之间会有一个列不匹配:['Dog', 'Cat', 'Rabbit']
不同于['Dog', 'Horse', 'Cat']
one-hot 编码的目的是将数字分配给不会创建错误、无意义的数字模式的分类变量。
如果您有分类变量“Apple”、“Orange”、“Cherry”、“Tomato”,并为它们分配数值 0、1、2、3,那么这些数值的解释类似于“Cherry 在 Tomato 和 Apple 之间,但是更接近番茄”,因为 2 介于 0 和 3 之间,但更接近于 3。这是胡说八道。这是很糟糕的废话,因为分析这些数据的算法(如回归或其他)可能会吸收它并对其进行过多的解读。
如果您将“Apple”、“Orange”、“Cherry”和“Tomato”表示为 4 元组 (1,0,0,0), (0,1,0,0), (0,0, 1,0) 和 (0,0,0,1),那么你就没有这个问题。每个坐标为 0 或 1,用于衡量水果的“Appleness”或“Orangeness”或“Cherriness”或“Tomatoness”。那是单热编码。
例如,假设苹果平均重 200 克,橙子平均重 150 克,樱桃平均重 30 克,番茄平均重 100 克。使用 one-hot 编码,这个平均权重是编码的线性函数: . 这是回归可以从数据中得出的结论。使用 0、1、2、3 编码,没有一个很好的函数可以给你一个水果的平均重量。
现在,对于dummy encoding:one-hot encoding还有一个问题,就是线性函数不是唯一的。功能在点 (1,0,0,0)、(0,1,0,0)、(0,0,1,0) 和 (0,0,0,1) 处给出与前一个函数相同的值)。那是因为每个有效点 满足 .
(同样,这不仅仅是一种好奇心;这会影响我们分析数据的方式。例如,线性回归在 维度输入实际上并没有在所有范围内自由地变化 方面。)
虚拟编码丢弃了一个坐标,因为它可以从其他三个中推断出来,以避免这个问题。四种水果可能编码为 (1,0,0)、(0,1,0)、(0,0,1) 和 (0,0,0)。