Python 实现独热编码的方法

Python 实现独热编码的方法

技术背景

在机器学习分类问题中,当数据集中存在大量分类变量时,独热编码(One-Hot Encoding)是一种常用的数据预处理技术。独热编码可以将分类变量转换为二进制向量,使得分类变量能够被机器学习模型正确处理。然而,独热编码可能会导致特征数量的指数级增长,增加计算复杂度和内存需求。因此,选择合适的独热编码方法至关重要。

实现步骤

方法一:使用 Pandas 的 pd.get_dummies

  1. 示例 1:对 Series 进行独热编码
1
2
3
4
import pandas as pd
s = pd.Series(list('abca'))
encoded_s = pd.get_dummies(s)
print(encoded_s)
  1. 示例 2:对 DataFrame 的指定列进行独热编码
1
2
3
4
5
6
7
8
9
import pandas as pd
df = pd.DataFrame({
'A': ['a', 'b', 'a'],
'B': ['b', 'a', 'c']
})
one_hot = pd.get_dummies(df['B'])
df = df.drop('B', axis=1)
df = df.join(one_hot)
print(df)

方法二:使用 Scikit-learn 的 OneHotEncoder

1
2
3
4
5
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
transformed_data = enc.transform([[0, 1, 1]]).toarray()
print(transformed_data)

方法三:使用 Numpy 的 np.eye

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
nb_classes = 6
data = [[2, 3, 4, 0]]

def indices_to_one_hot(data, nb_classes):
"""Convert an iterable of indices to one-hot encoded labels."""
targets = np.array(data).reshape(-1)
return np.eye(nb_classes)[targets]

encoded_data = indices_to_one_hot(data, nb_classes)
print(encoded_data)

核心代码

封装的 Pandas 独热编码函数

1
2
3
4
5
6
7
8
9
10
def one_hot(df, cols):
"""
@param df pandas DataFrame
@param cols a list of columns to encode
@return a DataFrame with one-hot encoding
"""
for each in cols:
dummies = pd.get_dummies(df[each], prefix=each, drop_first=False)
df = pd.concat([df, dummies], axis=1)
return df

封装的 Scikit-learn 独热编码函数

1
2
3
4
5
6
from sklearn.preprocessing import OneHotEncoder

def sklearn_one_hot(data):
enc = OneHotEncoder()
enc.fit(data)
return enc.transform(data).toarray()

最佳实践

  • 简单场景:如果只是进行简单的独热编码,且数据量较小,使用 Pandas 的 pd.get_dummies 是最简单快捷的方法。
  • 需要复用编码器:如果需要在训练数据和测试数据上使用相同的编码规则,建议使用 Scikit-learn 的 OneHotEncoder
  • 自定义编码:如果需要对特定类型的数据进行独热编码,或者不想使用第三方库,可以使用 Numpy 实现自定义的独热编码函数。

常见问题

内存问题

当分类变量的类别数量较多时,独热编码会导致特征数量的指数级增长,从而占用大量内存。可以考虑使用稀疏矩阵(如 pd.get_dummies 中的 sparse=True 参数)来减少内存占用。

特征选择问题

独热编码会增加特征数量,可能导致过拟合。在进行特征选择时,可以使用一些特征选择方法(如相关性分析、递归特征消除等)来选择重要的特征。

未见过的类别问题

在使用 Scikit-learn 的 OneHotEncoder 时,如果测试数据中出现了训练数据中未见过的类别,可能会导致错误。可以通过设置 handle_unknown='ignore' 来忽略这些未见过的类别。


Python 实现独热编码的方法
https://119291.xyz/posts/2025-04-11.python-one-hot-encoding-methods/
作者
ww
发布于
2025年4月22日
许可协议