特征工程与类别编码实战
高基数类别:目标编码要防泄漏
对城市、设备编号这类高基数类别,独热编码会炸维度。目标编码更紧凑,但必须做交叉验证内拟合以防泄漏:
from sklearn.model_selection import KFold
import numpy as np
def target_encode(col, target, n_splits=5, smoothing=10.0):
out = np.full_like(col, np.nan, dtype=float)
kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)
global_mean = target.mean()
for tr, va in kf.split(col):
means = target.iloc[tr].groupby(col.iloc[tr]).mean()
out[va] = col.iloc[va].map(means).fillna(global_mean)
# 平滑:用全局均值拉住小样本
return (out * n_splits + global_mean * smoothing) / (n_splits + smoothing)
周期特征:别用线性编码
小时、月份是循环的,sin/cos 编码能保留邻接关系:
import numpy as np, pandas as pd
def cyclical(series: pd.Series, period: int):
t = 2 * np.pi * series / period
return np.sin(t), np.cos(t)
泄漏防御清单
- 所有基于目标的统计必须在训练折叠内计算;
- 滞后特征的时间戳必须严格早于预测时刻;
- 测试集的归一化统计量来自训练集,而非全量。
80% 的「线上掉点」最终都能在特征泄漏里找到原因。
小结
特征工程的收益往往高于换模型。先把编码与泄漏这两件事做对,再谈架构。
评论
评论系统待配置:请部署 Waline 服务并填写 walineServerURL。
详情见 README「Waline 配置步骤」。