独热编码和标签编码详解
简介
分类变量广泛应用于数据分析和机器学习中。许多算法无法直接处理这些变量,在使用之前必须将其编码或转换为数值数据。独热编码和标签编码是两种常用的分类数据编码方法。独热编码为分类变量中的每个类别提供一个二进制向量,指示该类别是否存在。
我们将讨论独热编码和标签编码的概念,以及它们的优缺点,并举例说明何时以及如何使用每种方法。
独热编码
分类变量经常用于机器学习和数据分析中。例如颜色、性别或年龄组,这些变量具有有限数量的不同值。然而,大多数机器学习算法需要数值输入,而分类变量不是数值型的。因此,我们需要将这些分类变量编码成数值表示。
独热编码是一种常用的将分类变量转换为数值值的方法。这是将分类数据转换为二进制数据,其中所有类别都由一个二进制值表示。为整个分类变量生成长度等于类别数的二进制向量。例如,假设你的分类变量有三个类别:“红色”、“绿色”和“蓝色”,则该变量的独热编码表示具有三个维度,每个维度代表一个类别。
在独热编码中,反映观测值所属类别的维度被赋予二进制值 1,所有其他维度被赋予二进制值 0。例如,如果一个观测值属于“红色”类别,则其独热编码向量的第一个维度将为 1,所有其他维度将为 0。如果一个观测值属于“绿色”类别,则其独热编码向量的第二个维度将具有值 1,而所有其他维度将具有值 0。
独热编码的一个优点是它使机器学习算法能够将分类输入视为连续变量,从而可能提高模型精度。它还可以避免为类别赋予任意数值的问题,这可能会导致不正确的推断。
但是,独热编码也有一些局限性。主要担忧之一是,特别是如果分类变量具有许多类别,它可能会产生大量的特征。当特征数量超过数据集大小时,就会出现“维度灾难”,导致过拟合和性能下降。独热编码也可能导致共线性,当两个或多个特征高度相关时,这会损害模型性能。
示例
import pandas as pd # create a sample dataframe with categorical variables df = pd.DataFrame({'Fruit': ['Apple', 'Orange', 'Banana', 'Banana', 'Orange', 'Apple']}) # perform one hot encoding one_hot_df = pd.get_dummies(df, columns=['Fruit']) # print the encoded dataframe print(one_hot_df)
输出
Fruit_Apple Fruit_Banana Fruit_Orange 0 1 0 0 1 0 0 1 2 0 1 0 3 0 1 0 4 0 0 1 5 1 0 0
此示例创建了一个包含名为“水果”的分类变量的 Pandas 数据框,该变量具有 6 个可用值。接下来,我们使用 Pandas 的 `get_dummies()` 方法对“水果”变量进行独热编码。`get_dummies` 是一个创建新列的函数()。此新列的每一行都有一个二进制值 1 或 0,并且包含不同的水果变量。该数字是 1 还是 0 取决于该特定行的水果是否与列中的值匹配。导出编码后的数据框后,将显示结果。
标签编码
另一种编码类别信息的方法是标签编码。它通过为每个类别分配一个数值来将其转换为序数数据。使用这种技术,每个类别都分配一个唯一的整数值。例如,如果分类变量“颜色”包含类别“红色”、“绿色”和“蓝色”,则标签编码将为“红色”、“绿色”和“蓝色”分别分配值 1、2 和 3。
标签编码易于实现,并保留类别的顺序,在某些情况下这可能是有利的。然而,标签编码也有局限性。通过为每个类别分配一个独特的整数值,它会在它们之间创建隐式的序数关系。如果类别之间没有自然的顺序,这可能会导致问题。此外,由于为类别分配的数值的任意性,标签编码可能无法始终有效地反映类别之间的潜在关系。
标签编码的另一个缺点是它可能会在与机器学习算法一起使用时导致问题。某些算法,如决策树和线性回归,可能会将数值视为连续变量,从而导致模型预测不准确。因此,必须谨慎使用标签编码,并在生产环境中使用之前仔细检查模型的性能。
示例
from sklearn.preprocessing import LabelEncoder # Sample data data = ['apple', 'banana', 'banana', 'orange', 'kiwi', 'mango', 'apple'] # Create label encoder object le = LabelEncoder() # Fit and transform the data encoded_data = le.fit_transform(data) print(encoded_data)
输出
[0 1 1 4 2 3 0]
在此示例中,我们从 `sklearn.preprocessing` 包中导入了 `LabelEncoder` 模块。接下来,我们创建一个 `LabelEncoder` 类的实例,并使用 `fit_transform()` 函数来拟合和转换样本数据。编码后的原始数据的版本作为输出返回。
请注意,标签编码为数据中每个类别分配唯一的数值,从 0 开始。在此示例中,“苹果”分配为 0,“香蕉”分配为 1,“橙子”分配为 2,“奇异果”分配为 3,“芒果”分配为 4。
结论
最后,独热编码和标签编码是机器学习中两种广泛使用的用于编码分类数据的策略。独热编码为每个类别生成二进制列,而标签编码为每个类别提供唯一的数值标签。这两种策略的选择取决于数据的性质和所使用的机器学习算法。为了确保准确和成功的分析,了解每种方法的优势和局限性至关重要。