sklearn.preprocessing.OneHotEncoder
OneHotEncoder
是 sklearn.preprocessing
提供的 独热编码(One-Hot Encoding) 方法,用于将分类变量转换为数值型独热编码,适用于 机器学习模型训练。
1. OneHotEncoder
计算原理
假设有一个分类变量:
Color
=
[
"Red"
,
"Blue"
,
"Green"
,
"Blue"
]
\text{Color} = [\text{"Red"}, \text{"Blue"}, \text{"Green"}, \text{"Blue"}]
Color=["Red","Blue","Green","Blue"]
使用独热编码后:
Red
=
[
1
,
0
,
0
]
,
Blue
=
[
0
,
1
,
0
]
,
Green
=
[
0
,
0
,
1
]
\text{Red} = [1, 0, 0], \quad \text{Blue} = [0, 1, 0], \quad \text{Green} = [0, 0, 1]
Red=[1,0,0],Blue=[0,1,0],Green=[0,0,1]
解释
- 每个类别变成一个二进制向量(One-Hot 形式)。
- 适用于机器学习算法(如决策树、线性回归、SVM)。
2. OneHotEncoder
代码示例
(1) 基本使用
from sklearn.preprocessing import OneHotEncoder
import numpy as np
# 示例分类数据
X = np.array([["Red"], ["Blue"], ["Green"], ["Blue"]])
# 初始化 OneHotEncoder
encoder = OneHotEncoder()
# 进行独热编码
X_encoded = encoder.fit_transform(X).toarray()
print("独热编码:\n", X_encoded)
输出
独热编码:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]
[0. 1. 0.]]
解释
- 每个类别转换为独热向量。
- “Red” 对应
[1, 0, 0]
,“Blue” 对应[0, 1, 0]
,“Green” 对应[0, 0, 1]
。
(2) 查看类别索引
print("类别索引:", encoder.categories_)
输出
类别索引: [array(['Blue', 'Green', 'Red'], dtype='<U5')]
解释
- 类别按照字母顺序编码(
Blue -> 0, Green -> 1, Red -> 2
)。
(3) 处理多个分类特征
X = np.array([["Red", "S"], ["Blue", "M"], ["Green", "L"], ["Blue", "XL"]])
encoder = OneHotEncoder()
X_encoded = encoder.fit_transform(X).toarray()
print("多个分类变量的独热编码:\n", X_encoded)
输出
多个分类变量的独热编码:
[[0. 0. 1. 0. 0. 1.]
[1. 0. 0. 0. 1. 0.]
[0. 1. 0. 1. 0. 0.]
[1. 0. 0. 0. 0. 0.]]
解释
Red, Blue, Green
变为 3 个特征。S, M, L, XL
变为 4 个特征。
3. OneHotEncoder
的参数
OneHotEncoder(categories="auto", drop=None, sparse_output=True, dtype=np.float64, handle_unknown="error")
参数 | 说明 |
---|---|
categories | 指定类别顺序(默认 "auto" ) |
drop | 是否 删除一个类别(避免多重共线性)(默认 None ) |
sparse_output | 是否返回 稀疏矩阵(默认 True ) |
dtype | 数据类型(默认 np.float64 ) |
handle_unknown | 处理未知类别的方法("error" 报错,"ignore" 忽略) |
(4) 删除一个类别(避免多重共线性)
encoder = OneHotEncoder(drop="first") # 删除第一个类别
X_encoded = encoder.fit_transform(X).toarray()
print("去掉一个类别后的独热编码:\n", X_encoded)
输出
去掉一个类别后的独热编码:
[[0. 1. 0. 0.]
[1. 0. 1. 0.]
[0. 0. 0. 1.]
[1. 0. 0. 0.]]
解释
- 减少了一个特征,避免线性模型中的多重共线性问题。
(5) 处理未知类别
X_train = np.array([["Red"], ["Blue"], ["Green"]])
X_test = np.array([["Yellow"]]) # 训练集中没有的类别
encoder = OneHotEncoder(handle_unknown="ignore") # 忽略未知类别
encoder.fit(X_train)
X_test_encoded = encoder.transform(X_test).toarray()
print("未知类别 Yellow 编码:\n", X_test_encoded)
输出
未知类别 Yellow 编码:
[[0. 0. 0.]]
解释
- “Yellow” 是新类别,不会报错,而是返回
[0, 0, 0]
。
4. 适用场景
- 分类变量转换(决策树、SVM、逻辑回归等)
- 处理非数值型数据
- 避免类别变量在模型中被误解为有序变量
5. OneHotEncoder
vs. LabelEncoder
vs. OrdinalEncoder
方法 | 适用情况 | 计算方式 |
---|---|---|
OneHotEncoder | 类别之间无大小关系 | 独热编码([0, 1, 0] ) |
LabelEncoder | 单个分类变量 | 整数编码([0, 1, 2] ) |
OrdinalEncoder | 类别有顺序关系 | 序数编码([1, 2, 3] ) |
示例:
from sklearn.preprocessing import LabelEncoder, OrdinalEncoder
# LabelEncoder(仅适用于单个特征)
label_encoder = LabelEncoder()
labels = label_encoder.fit_transform(["Red", "Blue", "Green"])
print("LabelEncoder:", labels)
# OrdinalEncoder(适用于多个特征)
ordinal_encoder = OrdinalEncoder()
X_encoded = ordinal_encoder.fit_transform([["Red"], ["Blue"], ["Green"]])
print("OrdinalEncoder:\n", X_encoded)
6. 结论
OneHotEncoder
将分类变量转换为独热编码,适用于 机器学习建模(SVM、决策树、逻辑回归)。- 如果类别变量 有序,可使用
OrdinalEncoder
,如果只需要 整数编码,可使用LabelEncoder
。 - 如果数据可能包含 未知类别,应设置
handle_unknown="ignore"
以避免报错。