为什么不应该为机器学习使用 pandas.get_dummies2025年6月24日 | 5 分钟阅读 引言在机器学习中使用文本内容类别将其转换为数字格式的编码策略至关重要。Pandas.Get_dummies() 是此目的最常用的 pandas 操作之一。分类变量可以轻松转换为独热编码的行,这使其适用于各种机器学习模型。然而,get_dummies() 并非总是机器学习应用程序的最佳选择,即使它易于使用。 使用 get_dummies() 可能会导致高维特征空间、对测试数据中不可见类别的处理效率低下以及内存使用浪费等问题。这些问题可能在实际的机器学习操作中导致重大问题,例如模型效率低下和错误预测,尤其是在处理大型数据集或动态分类变量时。 相反,更稳健的编码策略,例如 CategoryEncoders 包或 Scikit-learn 的 OneHotEncoder,可以提供对分类特征转换的更多控制,并确保训练集和测试集之间的一致性。构建在应用于新数据时性能良好的公平机器学习模型需要仔细考虑编码过程。 Pandas.Get_dummies:它是什么?pandas 库的 pandas.Get_dummies() 方法将分类变量转换为即时编码格式。它通常用于转换非数值型的分类数据,使其成为机器学习算法可处理的数值形式。 当对分类列应用 get_dummies() 时,原始数据中的每个唯一类别都由一个新的二进制列表示。当类别存在时,值为 1,当不存在时,值为 0。 用法示例Pandas.Get_dummies 在机器学习中的局限性- 高维性问题
当分类变量具有大量唯一值时,Get_dummies() 会为每个类别生成一个单独的列。因此,特征的数量可能会急剧增加,从而增加数据集的大小和处理复杂性。尤其是当处理有限的数据集时,高维数据可能会通过延长训练时间并增加过拟合的可能性来对模型性能产生负面影响。 - 训练和测试数据处理不一致
get_dummies() 使用编码期间数据集中存在的类别来识别新列。然而,在实际情况中,测试集中可能出现学习集中不存在的新类别。这可能会导致错误或需要进一步的预处理才能手动匹配测试集和训练集之间的特征空间,因为 get_dummies() 缺乏处理这种未知类别的方法。 - 稀有类别的处理不当
数据集中可能包含一些分类变量的实例非常少。get_dummies() 以相同的方式处理所有类别,因此即使仅出现一次的类别也会获得自己的列。这可能导致过拟合,即模型会学习到不易泛化到新数据的模式。更高级的编码策略,例如频率编码或目标编码,可以更好地处理稀有类别。 - 无内置特征缩放支持
特征缩放通常用于提高机器学习模型的性能和收敛速度。然而,get_dummies() 生成的二进制(0/1)数字与标准化或最小-最大缩放等常见缩放策略不兼容。由于不同特征对模型训练的贡献可能不一致,因此替代编码技术可能是更好的选择。 - 稀疏数据存储效率低下
当对具有大量唯一值的分类变量进行编码时,会生成一个稀疏矩阵,因为独热编码列的大部分包含零。这种稀疏表示会减慢计算速度并浪费 pandas DataFrame 中的不必要资源。使用更有效的策略,例如 Scikit-learn 的 OneHotEncoder(使用稀疏输出)或替换编码算法,可以最大化存储和处理性能。
pandas.get_dummies 的更好替代方案- Scikit-learn 中的 OneHotEncoder
虽然其功能与 get_dummies() 相当,但 Scikit-learn 的 OneHotEncoder 具有多项额外优势。一个关键优势是,通过设置 handle_unknown='ignore',它允许处理测试数据中未见的类别,从而在出现新类别时避免错误。它还允许稀疏矩阵输出,这在处理具有高基数的分类变量时大大减少了内存消耗。大型数据集和自动学习算法都受益于此。 - CategoryEncoders 库的高级编码
category_encoders 包提供了多种更适合机器学习的编码策略。例如,目标编码用目标变量的平均值替换分类值,这在处理具有高基数的分类数据时非常有用。通过在去除当前行时计算平均值,留一法编码(目标编码的一种变体)可减少过拟合。该库中的另一种技术是二元编码,它通过将类别转换为二元表示来降低维度,是独热编码的一种更紧凑的替代方案。 - 有序类别的序数编码
序数编码是分类数据的一个高级选项,这些数据确实显示出顺序。此方法通过根据类别排名分配数字值来确保编码值正确反映类别之间的基本关系。例如,可以分别为类别“低”、“中”和“高”分配值 0、1 和 2。使用 Scikit-learn 的 OrdinalEncoder 是实现此编码同时在测试集和训练集之间保持一致性的简单方法。 - 高基数数据的频率(计数)编码
在处理具有大量唯一值的分类变量时,独热编码可能导致特征维度增加。频率编码解决了这个问题,它用数据集中每个类别的出现次数替换类别。此方法在捕获有关类别的重要信息的同时减少了特征数量。它尤其适用于具有许多稀有值的分类变量,因为它避免了创建大量稀疏列。
|