🧩 特征编码技术

5 大核心方法
实战课程 特征工程 · 第4章
🎯 目标 提升预测准确率
🧪 难度 ⭐⭐⭐ 进阶
📅 更新 2025 · 春

🚀 将类别特征转化为数值,是模型理解数据的关键一步。不同编码方式携带不同的先验信息,
选对编码 = 精度提升 5%~15%

🏷️ 标签编码 Label

将类别映射为从 0 开始的整数。适合有序类别(如教育程度)。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['color'] = le.fit_transform(data['color'])
# 红→0, 蓝→1, 绿→2

⚠️ 无序类别使用可能引入虚假顺序。

🔥 独热编码 One‑Hot

每个类别生成一个二元特征。适用于无序类别,避免顺序偏差。

import pandas as pd
df = pd.get_dummies(data, columns=['city'])
# 北京 → [1,0,0] 上海 → [0,1,0]

📌 高基数类别会导致维度爆炸。

🎯 目标编码 Target

用目标变量(如均值)替换类别。适合高基数、有监督任务。

from category_encoders import TargetEncoder
te = TargetEncoder()
data['cat_encoded'] = te.fit_transform(
    data['category'], data['target'])

🧪 需配合交叉验证防止过拟合。

📊 频率编码 Frequency

用类别出现的频率/计数作为编码。反映分布信息,简单有效。

freq = data['brand'].value_counts(normalize=True)
data['brand_freq'] = data['brand'].map(freq)
# 高频类别获得较大数值

⚡ 对异常值不敏感,适合树模型。

🔢 有序编码 Ordinal

根据自定义顺序赋予整数。保留等级信息,如 小<中<大。

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列无⭐⭐⭐⭐
🧭 编码选择流程图 决策树
类别特征编码 有顺序? 是 有序编码 否 高基数? 是 目标 频率 否 独热编码 💡 频率编码可作基线,目标编码需交叉验证
🧪 综合代码片段 Python 示例
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())