【scikit-learn】sklearn.preprocessing.OneHotEncoder 类:独热编码(One-Hot Encoding)

sklearn.preprocessing.OneHotEncoder

OneHotEncodersklearn.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" 以避免报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值