🚀 将类别特征转化为数值,是模型理解数据的关键一步。不同编码方式携带不同的先验信息,
选对编码 = 精度提升 5%~15%
将类别映射为从 0 开始的整数。适合有序类别(如教育程度)。
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() data['color'] = le.fit_transform(data['color']) # 红→0, 蓝→1, 绿→2
⚠️ 无序类别使用可能引入虚假顺序。
每个类别生成一个二元特征。适用于无序类别,避免顺序偏差。
import pandas as pd df = pd.get_dummies(data, columns=['city']) # 北京 → [1,0,0] 上海 → [0,1,0]
📌 高基数类别会导致维度爆炸。
用目标变量(如均值)替换类别。适合高基数、有监督任务。
from category_encoders import TargetEncoder
te = TargetEncoder()
data['cat_encoded'] = te.fit_transform(
data['category'], data['target'])
🧪 需配合交叉验证防止过拟合。
用类别出现的频率/计数作为编码。反映分布信息,简单有效。
freq = data['brand'].value_counts(normalize=True) data['brand_freq'] = data['brand'].map(freq) # 高频类别获得较大数值
⚡ 对异常值不敏感,适合树模型。
根据自定义顺序赋予整数。保留等级信息,如 小<中<大。
from pandas.api.types import CategoricalDtype
cat_order = ['small','medium','large']
data['size'] = data['size'].astype(
CategoricalDtype(cat_order, ordered=True))
data['size_code'] = data['size'].cat.codes
✅ 必须已知合理的顺序。
| 编码方法 | 适用场景 | 维度变化 | 是否监督 | 模型友好度 |
|---|---|---|---|---|
| 标签编码 | 有序类别、树模型 | 1列 | 无 | ⭐⭐⭐⭐ |
| 独热编码 | 无序类别、线性模型 | K列 | 无 | ⭐⭐⭐ |
| 目标编码 | 高基数、有监督 | 1列 | 有 | ⭐⭐⭐⭐ |
| 频率编码 | 任意类别、稳健 | 1列 | 无 | ⭐⭐⭐⭐⭐ |
| 有序编码 | 已知顺序、等级数据 | 1列 | 无 | ⭐⭐⭐⭐ |
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from category_encoders import TargetEncoder
# 示例数据
df = pd.DataFrame({'color': ['红','蓝','绿','红','蓝'],
'size': ['S','M','L','M','L'],
'target': [1,0,1,1,0]})
# 1. 标签编码 (有序)
le = LabelEncoder()
df['color_label'] = le.fit_transform(df['color'])
# 2. 独热编码
onehot = pd.get_dummies(df['color'], prefix='color')
df = pd.concat([df, onehot], axis=1)
# 3. 目标编码 (需避免数据泄露)
te = TargetEncoder(cols=['size'])
df['size_target'] = te.fit_transform(df['size'], df['target'])
# 4. 频率编码
freq_map = df['color'].value_counts(normalize=True)
df['color_freq'] = df['color'].map(freq_map)
# 5. 有序编码 (自定义顺序)
from pandas.api.types import CategoricalDtype
size_order = CategoricalDtype(['S','M','L'], ordered=True)
df['size_ordinal'] = df['size'].astype(size_order).cat.codes
print(df.head())