SciKit学习中的LabelEncoder和OneHotEncoder之间的区别

如果您最近刚开始机器学习之旅,那么您可能会在LabelEncoderOneHotEncoder之间感到困惑。 两种编码器都是Python的SciKit Learn库的一部分,并且都用于将分类或文本数据转换为我们的预测模型最能理解的数字。 让我们通过一个简单的示例找出编码器之间的差异。




字符编码


首先,可以在这里找到LabelEncoder的SciKit Learn文档。 现在考虑以下数据:


来自SuperDataScience的数据

在此示例中,第一列(国家/地区)为全文。 您可能已经知道,我们不能在数据中使用文本来训练模型。 因此,在我们开始该过程之前,我们需要准备这些数据。


并将这些类别转换为可理解的数值数据模型,我们使用LabelEncoder类。 因此,要获取第一列的属性,我们要做的就是从sklearn库中导入类,使用fit_transform函数处理该列并使用新的编码文本替换现有的文本数据。 让我们看一下代码。


from sklearn.preprocessing import LabelEncoder labelencoder = LabelEncoder() x[:, 0] = labelencoder.fit_transform(x[:, 0]) 

假定数据在变量x中 。 运行上面的代码后,如果检查x值,您将看到第一列中的三个国家已被数字0、1和2代替。



通常,这是标志的编码。 但是根据数据,这种转换会产生新的问题。 我们已经将一组国家转换为一组数字。 但这只是分类数据,实际上数字之间没有任何联系。


这里的问题是,由于同一列中有不同的数字,因此模型将错误地认为数据是按某种特殊顺序排列的-0 <1 <2尽管这当然不是全部。 为了解决这个问题,我们使用OneHotEncoder




OneHotEncoder


如果您有兴趣阅读文档,可以在此处找到。 现在,正如我们已经讨论过的,根据所拥有的数据,我们可能会遇到一种情况,即在对属性进行编码之后,我们的模型会变得混乱,错误地假设数据是由一个不存在的顺序或层次结构连接的。 为了避免这种情况,我们将使用OneHotEncoder


该编码器使用一列包含先前已编码为特征的分类数据,并为其创建几个新列。 数字将用一和零替换,具体取决于哪一列是固有值。 在我们的示例中,我们获得了三个新列,每个列对应一个国家(法国,德国和西班牙)。


对于第一列是法国的行,列“法国”将设置为“ 1”,其他两列设置为“ 0”。 类似地,对于第一列为德国的行,德国列将具有“ 1”,而其他两列将具有“ 0”。


这非常简单地完成:


 from sklearn.preprocessing import OneHotEncoder onehotencoder = OneHotEncoder(categorical_features = [0]) x = onehotencoder.fit_transform(x).toarray() 

在构造函数中,我们指示OneHotEncoder应该处理哪一列,在本例中为[0] 。 然后,使用刚刚创建的编码器对象的fit_transform函数转换x数组。 就是这样,现在我们在数据集中有了三个新列:



如您所见,我们没有使用一个国家的一栏,而是使用三个新的国家编码。


这与LabelEncoderOneHotEncoder有所不同。

Source: https://habr.com/ru/post/zh-CN456294/


All Articles