特征与预处理管线
特征不是“越多越好”
特征是模型实际接收的数字表示。原始数据需要转换,但任何转换都必须在预测时可重复,并且不能偷看未来。
| 原始字段 | 常见转换 | 风险 |
|---|---|---|
| 数值 | 缺失填充、缩放、对数变换 | 极端值、单位混用 |
| 类别 | one-hot 编码 | 未知类别、高基数 |
| 文本 | 词袋、TF-IDF、Embedding | 近重复、隐私信息、长度偏差 |
| 时间 | 小时、星期、距事件时间 | 时区、预测后信息 |
特征工程不是美化数据,而是把与决策有关、预测时可获得的信息表达成模型可学习的形式。
fit 与 transform
fit:从数据学习状态,例如均值、词表、类别集合。transform:用已学状态转换新数据。fit_transform:先学再转,只适合训练区。
如果测试集参与 fit,就发生泄漏。scikit-learn 的 Pipeline 将预处理和模型绑定,可在交叉验证中保持边界。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
model = Pipeline(
steps=[
("tfidf", TfidfVectorizer(analyzer="char", ngram_range=(2, 4))),
("classifier", LogisticRegression(max_iter=1000)),
]
)
model.fit(train_texts, train_labels)
predictions = model.predict(test_texts)这里 TF-IDF 的词表只从 train_texts 学习;测试文本只被转换。
Pipeline 能把“在每个训练折 fit、在对应验证折/测试集 transform”放进同一个可复制对象,但它不会替你判断字段是否在预测时可得、时间窗口是否正确、服务端 schema 是否一致,或文本中是否含有不该进入模型的个人与机密信息。这些边界仍需在数据契约和部署审查中单独验证。
文本特征的直觉
词袋统计词是否出现;TF-IDF 进一步降低“到处都出现的词”的权重。它不真正理解语义,却常是短文本分类的强基线。Embedding 把文本映射到稠密向量,能表示语义相近,但依赖外部模型、版本和推理成本。
先建立简单、可解释、可复现的基线,再判断 Embedding 是否带来稳定收益。
常见错误
- 把标签编码进文本,例如在训练语料前加真实类别名。
- 手工清洗训练数据,却忘记在服务端应用同一规则。
- 对树模型、线性模型不加区分地套同一种缩放。
- 把 ID 当连续数值;模型会虚构大小关系。
- 只保存模型权重,不保存预处理器与类别顺序。
练习
为“Agent 运行是否需要人工复核”设计五个候选特征。逐个写出:预测时是否可用、是否含敏感信息、如何转换、可能怎样泄漏。
掌握检查
- 能用一句话区分
fit与transform。 - 能解释为什么 Pipeline 能降低泄漏风险。
- 能为数值、类别、文本字段各选择一种合理表示。
下一步:训练验证与调参。
参考资料
核验日期:2026-07-22。