题目重点:PhD DS Intern OA 第三题要处理 train/test CSV 并输出 processed 文件;用只在训练集 fit 的预处理管线防泄漏。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版 target 列只在 train 出现,test 无标签;预处理参数必须只从 train 特征拟合。
- 类别映射按训练集已见类别构建;未知 test 类别映到 OTHER/明确缺失码,选择由评测契约决定。
- 数值列缺失值用训练集均值,标准化用训练集均值与标准差;σ=0 时输出 0 或跳过列并记录规则。
- 题目说 category 编整数,但对线性模型这可能引入虚假顺序;如题目允许可改 one-hot,提交文件格式仍按 OA 指示。
解题路线
- 读两份 CSV 并核 schema、行数、ID/target 列;选择训练特征列后建立类别、数值和标准化列清单。
- 在 train 上 fit 类别词表、缺失填充值、scaler 参数;对 train/test 用同一对象 transform,禁止对 test 独立 fit。
- 处理未知类别、全缺失列、0 方差与数据类型混杂;输出列顺序、索引、文件名和目标列按评测契约固定。
- 对 processed_train 与 processed_test 检查特征列完全一致、无非预期 NAN/inf、ID 对齐、train 统计和 transform 可复现。
- 为下一题建模保留验证切分;更严谨时应先划 train 内的验证集,再只用 fit 子集拟合预处理,防验证泄漏。
手动走一遍
训练例 train 类别 [red,blue]、数值 [2,NaN,4],均值 3;test 类别 green 应走未知类别分支,数值 NaN 填 3。不能把 test 的 green 纳入训练映射后让评估与训练特征含义漂移。
规模与取舍
N_train+N_test 行、F 列,线性扫描约 O((N_train+N_test)F) 时间;类别词表 O(不同类别数) 空间,输出矩阵约 O(行数×特征数)。具体 pandas/scikit-learn 操作受稀疏/稠密表示影响。
易错点与追问
容易失分的边界
- 对 test 重新计算均值/标准差,训练与推理尺度不一致。
- 把 test 标签或未来房价用于填充,数据泄漏。
- 未知类别让编码器报错却无策略。
- ordinal 编码被模型误解成大小顺序而未说明。
- 输出列顺序与评测期望不一致。
继续深挖
- 高基数类别怎样编码?
- 时间切分时如何防未来信息泄漏?
- 类别只在 test 出现怎么办?
- 需要回滚预处理版本时如何保存映射?
