0Pricing
Learn AI with Python · 课时

目标编码与高级分类变量处理

目标编码、频率编码、二进制编码,以及用于高基数列的嵌入

目标编码与高级分类变量处理 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

类别编码问题

模型需要数字,但类别是文本。类别较少时,独热编码很有效;但高基数特征(数千个城市或产品)会创建过多列。

独热编码和标签编码的局限

独热编码会使维度爆炸。普通标签编码会凭空制造错误的顺序(城市 5 并不比城市 2 大)。对于高基数数据,我们需要更智能的编码方式。

什么是目标编码

目标编码会将每个类别替换为该类别的目标均值。例如,一个城市会变成该城市客户的平均流失率,即一个包含丰富信息的数值。

import pandas as pd

means = df.groupby("city")["target"].mean()
df["city_encoded"] = df["city"].map(means)

过拟合风险

样本行数很少的稀有类别会得到极端均值,从而泄露目标并导致过拟合。只出现过一次的类别会完全复制那一个样本的标签。我们可以通过平滑来解决这个问题。

平滑估计

平滑会根据类别包含的样本数量,对类别均值和全局均值进行加权融合。样本稀少的类别会向全局平均值靠拢,从而降低方差。

import pandas as pd

global_mean = df["target"].mean()
agg = df.groupby("city")["target"].agg(["mean", "count"])
smoothing = 10
agg["enc"] = (agg["count"] * agg["mean"] + smoothing * global_mean) / (agg["count"] + smoothing)
df["city_enc"] = df["city"].map(agg["enc"])

category_encoders 库

category_encoders 软件包使用 scikit-learn API 实现这些编码器,因此它们可以嵌入流水线,并一致地应用于训练集和测试集。

import category_encoders as ce

encoder = ce.TargetEncoder(cols=["city", "product"], smoothing=10)
X_enc = encoder.fit_transform(X_train, y_train)
X_test_enc = encoder.transform(X_test)

实际避免数据泄漏

请始终只在训练数据上对编码器执行 fit,然后对验证集/测试集执行 transform。更好的做法是使用交叉验证或折外编码,使每一行都由不包含该行的数据进行编码。

import category_encoders as ce
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression

pipe = make_pipeline(
    ce.TargetEncoder(cols=["city"]),
    LogisticRegression(),
)
# fit inside CV to encode without leakage

二进制编码

BinaryEncoder将类别转换为二进制数字,只使用 log2(N) 列,而不是 N 列。它是独热编码与目标编码之间的一种紧凑折中方案。

import category_encoders as ce

encoder = ce.BinaryEncoder(cols=["product_id"])
X_enc = encoder.fit_transform(X_train)
# 256 categories -> 8 binary columns

其他实用编码器

category_encoders还提供CountEncoder(每个类别的频次)、LeaveOneOutEncoder(排除当前行后的目标均值)以及CatBoostEncoder(有序目标统计量)。

import category_encoders as ce

count_enc = ce.CountEncoder(cols=["city"])
loo_enc = ce.LeaveOneOutEncoder(cols=["city"])

处理高基数

对于极高基数的特征:目标编码/计数编码会将其压缩为一列,二进制编码保持紧凑,而将稀有类别归入“其他”类别可以降低噪声。请根据基数和数据泄漏风险进行选择。

import pandas as pd

freq = df["product"].value_counts()
rare = freq[freq < 20].index
df["product"] = df["product"].replace(rare, "other")

选择编码器

类别较少:独热编码。包含许多类别的树模型:目标编码或 CatBoost 编码。需要紧凑表示:二进制编码。请始终通过只在训练集上执行 fit,并使用平滑或折外方案来防止数据泄漏。

快速检查

请测试您对分类编码的了解。

回顾

回顾:目标编码会用目标均值替换类别,并使用平滑来减弱稀有类别的影响。请使用category_encoders(TargetEncoder、BinaryEncoder、CatBoost/LeaveOneOut),并且只在训练集上或以折外方式执行 fit,以避免数据泄漏。紧凑型编码器可以处理独热编码无法处理的高基数特征。

常见问题解答

「目标编码与高级分类变量处理」课时是免费的吗?

是的 — 「目标编码与高级分类变量处理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「目标编码与高级分类变量处理」这节课中我会学到什么?

目标编码、频率编码、二进制编码,以及用于高基数列的嵌入 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「目标编码与高级分类变量处理」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn AI with Python 课中编写并运行代码吗?

能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 特征选择方法
  2. 创建交互特征与多项式特征
  3. 目标编码与高级分类变量处理
  4. 使用 Featuretools 自动进行特征工程
← 返回 Learn AI with Python