📑 本页目录(点开跳转)
- 🎯 一句话
- 一、数据EDA(探索性数据分析)
- 二、验证集构造策略
- 三、样本不均衡解决方案
- 四、数据增强策略
- 五、伪标签(Pseudo-Labeling)
- 六、Label Smoothing(标签平滑)
- 七、TTA(Test Time Augmentation,测试时增强)
- 八、缺失值填充:按缺失原因分类处理
- 九、异常值检测与选择性删除
- 十、目标变量变换
- 十一、特征编码与组合
- 十二、社交媒体文本特征工程
- 十三、全量数据重训练(Full Retrain)
- 十四、领域自适应预训练
- 十五、无标注语料利用
- 十六、半监督迁移学习
- 十七、评价指标深度解析
- 十八、比赛提交注意事项
- 十九、特征交叉高级方法
- 二十、数据清洗进阶
- 二十一、特征工程自动化
- 🔗 这一章连到哪里
- ✅ 检查点
- 🛑 可以停在这里
数据策略与特征工程
⏱ 45 分钟 | ⭐⭐ 表格赛的胜负手
🎯 一句话
竞赛里排名的差距,大部分不是模型造成的,是数据和特征造成的。这一章是全套教程里最长的一章,不要一次读完——按你当前赛题的需要挑着看:先看二(验证集构造)和十七(评价指标),这两节决定你的分数是不是真的。
一、数据EDA(探索性数据分析)
| 维度 | 说明 |
|---|---|
| 文本长度分布 | 统计训练集、测试集的文本长度(字符数/词数),判断是否需要截断或滑动窗口 |
| 类别分布统计 | 统计各类别样本数量,识别长尾分布和极端不平衡问题 |
| 缺失值分析 | 检查标注数据是否存在缺失、漏标、错标现象 |
| 标注质量检查 | 抽样检查标注实体边界是否准确,位置偏移是否常见 |
| 分布一致性检验 | 使用KS检验比较训练集和测试集的文本长度、词频分布是否一致 |
| 对抗验证 | 训练分类器区分训练集/测试集,识别分布差异特征(详见本节下方) |
| 右偏分布处理 | 医疗文本常呈右偏分布,需针对性设计截断策略 |
1.1 对抗验证(Adversarial Validation)
| 维度 | 说明 |
|---|---|
| 问题背景 | 训练集与测试集分布不一致时,本地CV分数与线上LB分数不匹配 |
| 核心方法 | 给训练集打标签0、测试集打标签1,训练二分类器区分两个数据集 |
| 判断标准 | AUC接近0.5说明分布一致;AUC接近1.0说明分布差异大 |
| 利用方式 | 将分类器预测为"像测试集"的训练样本赋予更高权重,或仅用这些样本做验证集 |
| 代码思路 | model.fit(train_features, is_test_label) → 取预测概率高的训练样本作为验证集 |
二、验证集构造策略
| 方法 | 说明 | 适用场景 |
|---|---|---|
| 官方验证集 | 利用比赛提供的validation.csv,与线上分数大致匹配 | 最稳定 |
| 历史数据构建 | 使用历史相似比赛数据,按标签构建额外验证集 | 当前数据不足时 |
| K折交叉验证 | 5折交叉验证,5份验证集结果平均作为最终CV分数 | 通用推荐 |
| StratifiedKFold | 保持类别比例的分层K折 | 类别不均衡时 |
| 时间划分 | 按时间顺序划分(时序数据) | 时间序列任务 |
| 关键原则 | 说明 |
|---|---|
| 数据固定 | 交叉验证时固定随机种子和折划分,确保实验可复现 |
| 分布一致性 | 验证集分布应与测试集分布保持一致,避免过拟合 |
| 线下线上一致 | 线下验证分数与线上A榜分数一致→结果可靠;线下远高于线上→过拟合风险大 |
三、样本不均衡解决方案
3.1 采样策略
| 策略 | 原理 | 效果 |
|---|---|---|
| 等概率采样 | 每个样本等概率被抽到 | 大类占比远高于小类,模型偏向大类 |
| 等类别采样 | 先等概率选类别,再在类别内选样本 | 小类样本被过度重复 |
| 折中方案 | 对每个类别频率取P次方(0<P<1),如开根号 | 将100:1的差距平滑至10:1 |
3.2 精准权重公式
| 维度 | 说明 |
|---|---|
| WeightedRandomSampler | 将每个样本的权重设为所属类别频率倒数开根号,放入DataLoader中 |
| 原理 | 采样权重与类别频率成反比,小类样本出现概率相对偏高 |
| 示例 | 最大类1900条、小类16条,差距达百倍;取倒数开根号后差距缩小至约10:1 |
3.3 类别权重(Class Weight)
| 维度 | 说明 |
|---|---|
| CrossEntropyLoss | 在交叉熵损失函数中直接加入类别权重,小类权重设为频率倒数或用Softmax归一化 |
| BCE Loss | 在BCE Loss计算中调节positive weight赋予正样本更高权重 |
| 手动设定 | 也可手动设定小类权重(如30/100),但类别多时难调 |
| PyTorch实现 | 计算每类频率倒数→softmax归一化→传入loss的weight参数 |
3.4 Focal Loss
| 维度 | 说明 |
|---|---|
| 核心公式 | FL(p_t) = -alpha_t * (1-p_t)^gamma * log(p_t) |
| Alpha参数 | 控制正负样本权重平衡,通常0.25或按类别频率调整 |
| Gamma参数 | 控制难分样本的聚焦程度,论文推荐2 |
| 调优建议 | 论文经验值不是所有场景都有效,需根据验证集调整 |
| 适用场景 | 小类样本极少时,alpha+gamma自适应关注难分样本 |
3.5 Dice Loss 与 OHEM
| 维度 | 说明 |
|---|---|
| Dice Loss | 源于F1指标的Dice系数,能有效处理负样本信息 |
| 分母平方优化 | 借鉴VNet做法,将Dice Loss分母项平方处理再求和,配合平滑系数,让梯度下降更稳定 |
| OHEM原理 | 在线困难样本挖掘,筛选出模型预测错误且赋予高置信度的"困难负样本" |
| 阈值筛选 | 通过计算keep_number,只筛选"顽固负样本"投入损失计算 |
| 组合效果 | Dice Loss + OHEM组合使用,提升模型在挑战性样本上的训练质量 |
四、数据增强策略
4.1 文本增强
| 方法 | 说明 | 注意事项 |
|---|---|---|
| 同义词替换 | 使用同义词词典或Word2Vec相似度替换文本中的词汇 | 替换比例通常10%~30% |
| 回译增强 | 中文→英文→日文→中文,通过多语言翻译引入变化 | 依赖翻译质量,速度较慢 |
| 随机操作(EDA) | 随机插入/删除/交换,增加模型鲁棒性 | 替换比例通常10% |
| 实体替换 | 将文本中的实体替换为同类型其他实体 | 需与原实体类型相同 |
| Mixup | 在Embedding空间做线性插值,非原始文本 | 正则化效果,提高泛化能力 |
| 对抗增强 | FGM等对抗训练方法,在文本分类中应用较多 | 见训练策略章节 |
4.2 数据生成与自动标注
| 维度 | 说明 |
|---|---|
| 问题背景 | 小类别样本数量极少,模型难以学习其特征 |
| 爬虫获取 | 从网站爬取特定类别的实体名称(如电影名、书名、游戏名等) |
| 替换增强 | 用爬取到的实体替换原文中的同类实体,保持标注不变 |
| 插入增强 | 将爬取到的实体插入到原文本的O(非实体)位置,并添加对应标注 |
| 类别平衡 | 针对样本少的类别重点生成,使各类别样本数量趋于平衡 |
| 注意事项 | 生成数据需符合真实语境,避免产生不合逻辑的句子 |
五、伪标签(Pseudo-Labeling)
5.1 K折伪标签(自动化降噪)
| 维度 | 说明 |
|---|---|
| 问题背景 | 医疗数据人工标注主观性强,存在大量漏标和错标 |
| 核心原则 | 严禁在全量训练集上直接生成伪标签以防过拟合 |
| 实现方式 | 利用K折交叉验证(如5折),让模型仅在它未见过的验证集(Fold 0)上生成预测结果 |
| 融合策略 | 融合多个模型生成的高质量伪标签来替代人工标签重新训练 |
| 本质作用 | 相当于利用AI群体完成自动纠错和降噪 |
5.2 半监督伪标签(比赛后期冲刺)
| 维度 | 说明 |
|---|---|
| 适用时机 | 当模型开发到一定瓶颈时 |
| 实现方式 | 用已经集成的、性能最强的高分模型,去对庞大的无标注测试集(或外部语料)进行预测,打上"伪标签" |
| 置信度阈值 | 通常取0.9+,过低会引入噪声 |
| 混合训练 | 将带有高置信度伪标签的样本与原训练集混合,再重新训练新模型 |
| 核心优势 | 往往能压榨出最后的一点分数 |
六、Label Smoothing(标签平滑)
| 维度 | 说明 |
|---|---|
| 问题背景 | 多分类任务中one-hot标签存在两个问题:(1) 标注错误时模型学到错误信息;(2) 丢失类间关系信息 |
| 核心思想 | 对one-hot标签进行软化,加入均匀噪声,本质是一种正则化策略 |
| 公式 | 设类别数为K,平滑系数为ε:y_i = (1-ε)·1 + ε/K(真实类别);y_j = ε/K(其他类别) |
| 信息论解释 | one-hot信息熵极低,软化后信息熵增大,提供更丰富的类间关系先验;梯度方差更小,训练更稳定 |
| PyTorch实现 | nn.CrossEntropyLoss(label_smoothing=0.1) |
| 调优建议 | ε通常取0.05~0.1,需根据验证集表现调整;过大会导致模型欠拟合 |
| 适用阶段 | 分类后期提分,通常提升0.1~0.5个百分点 |
七、TTA(Test Time Augmentation,测试时增强)
| 维度 | 说明 |
|---|---|
| 核心思想 | 在测试阶段对测试数据做变换,用变换后的数据预测,将结果加入训练集,间接学习测试数据分布 |
| 与伪标签的区别 | 伪标签直接用原始测试数据预测后加入训练集;TTA对测试数据先做变换(如同义词替换、回译等),模型看到的是变换后的样本 |
| 实现流程 | (1) 对测试样本做数据增强;(2) 用当前模型对增强后的测试样本预测;(3) 将增强样本+预测标签加入训练集;(4) 重新训练模型 |
| 适用条件 | 比赛规则未明确禁止时可以使用 |
| 注意事项 | 过度使用可能导致过拟合测试集;增强变换应保持语义不变 |
八、缺失值填充:按缺失原因分类处理
| 维度 | 说明 |
|---|---|
| 核心原则 | 不能盲目统一填充,需根据缺失的业务含义分类处理 |
| NA = 不存在该设施 | 填"None",涉及特征:PoolQC, MiscFeature, Alley, Fence, FireplaceQu, GarageType/Finish/Qual/Cond, BsmtQual/Cond/Exposure/FinType1/2, MasVnrType |
| NA = 数值为零 | 填0,涉及特征:GarageYrBlt/Area/Cars, BsmtFinSF1/2, BsmtUnfSF, TotalBsmtSF, BsmtFullBath, BsftHalfBath, MasVnrArea |
| NA = 局部统计量 | 按Neighborhood分组取中位数填充,典型特征:LotFrontage |
| 分组填充代码 | all_data.groupby("Neighborhood")["LotFrontage"].transform(lambda x: x.fillna(x.median())) |
| 核心优势 | 保留业务语义信息,比全局均值/中位数填充更精准 |
九、异常值检测与选择性删除
| 维度 | 说明 |
|---|---|
| 问题背景 | 训练集中存在少量极端异常样本,会严重干扰模型学习 |
| 检测方法 | 通过散点图分析特征与目标变量的关系,识别偏离整体趋势的离群点 |
| 典型异常 | 居住面积极大但售价极低的样本(如GrLivArea > 4000且SalePrice < 300000) |
| 删除策略 | 仅删除确认的异常点,保留其他高价值样本(如高价豪宅) |
| 核心优势 | 提升模型对正常样本的拟合精度,避免被异常点拉偏 |
十、目标变量变换
| 维度 | 说明 |
|---|---|
| 问题背景 | 房价等连续型目标变量通常呈右偏分布,直接回归会导致模型对高值样本过拟合 |
| log1p变换 | 使用np.log1p()而非np.log(),避免零值取对数产生负无穷 |
| 预测还原 | 预测完成后使用np.expm1()将结果还原回原始量纲 |
| Box-Cox变换 | 偏度>0.75的特征做变换,比log适应性更强 |
| 核心优势 | 使目标变量分布更接近正态,降低极端值对损失函数的影响 |
| 适用场景 | 房价预测、销售额预测等右偏连续变量回归任务 |
十一、特征编码与组合
11.1 数值转类别/有序编码
| 维度 | 说明 |
|---|---|
| 语义修正 | 修正语义错误(如建筑类型MSSubClass实为类别但被当作数值),用astype(str)转换 |
| 有序特征 | 有序类别用Label Encoding保留等级关系(如Ex>Gd>TA>Fa>Po) |
| 无序特征 | 无序类别用One-Hot Encoding |
11.2 组合特征工程
| 维度 | 说明 |
|---|---|
| 领域知识构造 | 根据业务逻辑构造新特征(如总面积=地下室+1层+2层) |
| 交叉特征 | 多个特征之间的交互(如特征0 * 特征1、特征0 / 特征2) |
| 聚合特征 | 按分组统计(如按类别分组计算均值/中位数) |
11.3 特征选择方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 过滤法 | 按统计指标(方差/相关系数/互信息)筛选 | 快速初筛,计算快 |
| 包裹法 | 以模型性能为评价标准搜索特征子集(如RFE) | 精确但耗时 |
| 嵌入法 | 利用模型自身特征重要性筛选(如L1正则/树模型importance) | 实用推荐 |
| 排列重要性 | 打乱某特征后观察性能下降程度 | 比内置importance更可靠 |
十二、社交媒体文本特征工程
| 维度 | 说明 |
|---|---|
| 问题背景 | 推文等社交媒体文本包含大量结构化信号(URL、@、#等),仅用文本内容会丢失这些信息 |
| 文本统计特征 | text_len(字符数)、word_count(词数)、avg_word_len(平均词长) |
| 社交媒体特征 | hashtag_count(#标签数)、mention_count(@提及数)、url_count(链接数) |
| 语义辅助特征 | digit_count(数字字符数)、uppercase_ratio(大写字母占比) |
| 缺失值二值化 | has_keyword(是否有关键词)、has_location(是否有地点),将缺失信息转化为有效特征 |
| 特征标准化 | 使用StandardScaler对非文本特征进行标准化,消除量纲差异 |
| 与文本模型融合 | 将上述特征与BERT/DeBERTa的CLS向量拼接,形成混合输入送入分类器 |
| 核心优势 | 弥补预训练模型对社交媒体特有符号的感知不足,提升分类边界 |
十三、全量数据重训练(Full Retrain)
| 维度 | 说明 |
|---|---|
| 问题背景 | 交叉验证或留出法仅用部分数据训练,浪费了验证集样本的信息 |
| 实现方式 | 先通过GridSearchCV或留出法确定最优超参数,再用全量训练数据重新训练最终模型 |
| 关键前提 | 超参数已通过验证集确认有效,全量训练不会引入过拟合风险 |
| 核心优势 | 充分利用所有标注数据,通常能比部分数据训练提升0.5~1个百分点 |
| 注意事项 | 全量重训练后无法用验证集评估,需依赖之前交叉验证的分数作为参考 |
十四、领域自适应预训练
| 维度 | 说明 |
|---|---|
| 问题背景 | 通用预训练模型(如BERT)在特定领域(如医疗、金融)表现不佳 |
| 实现条件 | 在算力允许的条件下 |
| 数据来源 | 利用比赛官方提供的海量无标签文本(如70G+)或外部数据集,语料需与目标任务领域相关 |
| 实现方式 | 使用掩码语言模型(MLM)接口让模型继续进行预训练,学习领域特定的语言模式和术语 |
| 注意事项 | 数据量过少(如仅1000条)时不建议做继续预训练,容易过拟合 |
| 实施步骤 | 数据预处理→继续预训练→保存新权重→在下游任务Fine-tuning |
| 最终效果 | 帮助AI提前适应领域语境,提升下游任务表现 |
十五、无标注语料利用
| 维度 | 说明 |
|---|---|
| 语料来源 | 比赛官方提供的无标注数据集、网络爬虫获取的相关领域文本 |
| 应用场景 | 继续预训练、对比学习(SimCSE/ConSERT)、数据增强 |
| 对比学习 | 对同一样本进行不同数据增强,拉近正样本对、推远负样本对 |
| 核心原则 | 语料需与目标任务领域相关,否则可能引入噪声 |
十六、半监督迁移学习
| 维度 | 说明 |
|---|---|
| 适用场景 | 官方训练集数据量较少,模型性能遇到瓶颈 |
| 实现方式 | 从网上寻找与赛题相关的外部数据集,结合半监督学习方法 |
| 知识蒸馏 | 用高分模型对无标注数据生成伪标签,再重新训练新模型 |
| 代价评估 | 需要大量时间寻找合适数据集并调整训练流程,投入产出比需权衡 |
十七、评价指标深度解析
| 维度 | 说明 |
|---|---|
| Macro-F1计算 | 对每个类别单独计算F1后取平均,小类表现对最终分数影响大 |
| 位置敏感性 | NER任务中实体位置偏移会导致零分,即使实体文本正确 |
| 严格匹配要求 | 预测实体的起始和结束位置必须与标注完全一致 |
| 召回率优化 | 解码逻辑过于严格会丢失部分预测结果,需平衡精确率和召回率 |
| 零分排查 | 提交分数为0通常是因为位置计算错误或结果文件格式问题 |
十八、比赛提交注意事项
| 维度 | 说明 |
|---|---|
| 环境配置 | 注意包的版本,按照官网要求配置 |
| 结果验证 | 提交分数为0肯定有问题,检查结果文件是否有问题 |
| 代码检查 | 找认识的人检查代码,确保提交格式正确 |
| 性能平衡 | 模型越大占用资源越多,加双向LSTM会更慢,平衡性能和资源 |
十九、特征交叉高级方法
自动特征交叉
| 方法 | 原理 | 适用场景 |
|---|---|---|
| FM(Factorization Machine) | 用隐向量内积自动学习二阶交叉,参数量O(n*k) | 结构化数据分类 |
| DeepFM | FM自动二阶 + DNN高阶交叉,共享Embedding | 通用首选 |
| DCN(Deep & Cross Network) | 交叉网络显式建模有界阶特征交叉 | 显式交叉需求 |
| AutoInt | 多头自注意力机制自动学习特征交互 | 高阶稀疏特征 |
| xDeepFM | CIN压缩交互网络学习向量级交叉 | 更精细的交叉 |
特征哈希(Feature Hashing)
| 维度 | 说明 |
|---|---|
| 核心思想 | 用哈希函数将高维稀疏特征映射到固定低维空间 |
| 公式 | hash_index = hash(feature_name) % bucket_size |
| 优势 | 无需维护词表,内存固定,适合在线学习 |
| 劣势 | 哈希冲突导致信息损失 |
| 适用场景 | 超高维类别特征(如用户ID、物品ID) |
二十、数据清洗进阶
重复样本处理
| 维度 | 说明 |
|---|---|
| 问题 | 训练集中存在完全重复或近似重复的样本,导致模型对重复样本过拟合 |
| 精确去重 | 完全相同的样本只保留一条 |
| 模糊去重 | 用MinHash/SimHash检测相似度>阈值的样本对 |
| 跨集去重 | 训练集与测试集有重叠样本时,删除训练集中的重叠部分 |
| 竞赛价值 | 数据泄露检测的关键步骤 |
标签噪声清洗
| 方法 | 原理 | 适用场景 |
|---|---|---|
| Confident Learning | 估计联合分布P(y_hat, y_true),筛选噪声标签 | 通用噪声标签 |
| Cross-Validation Filter | K折交叉验证,删除多数折预测与标签不一致的样本 | 简单有效 |
| Loss排序过滤 | 按训练loss排序,删除loss最高的N%样本 | 高置信噪声 |
| 协同教学(Co-teaching) | 两个网络互相选择干净样本训练 | 深度噪声标签 |
数据泄露检测
| 泄露类型 | 说明 | 检测方法 |
|---|---|---|
| 目标泄露 | 特征中包含目标变量的直接信息 | 特征与目标相关性异常高 |
| 时间泄露 | 使用了未来信息 | 检查特征时间戳是否晚于预测时间 |
| 跨集泄露 | 训练集和测试集有重叠 | 对抗验证AUC接近1.0 |
| 预处理泄露 | 预处理时使用了测试集信息(如用全量数据做归一化) | 检查预处理流程 |
二十一、特征工程自动化
自动特征生成
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Featuretools | 自动生成聚合/转换特征 | 关系型数据 |
| AutoFeat | 自动特征合成+选择 | 回归/分类 |
| TSFresh | 自动提取时序特征(700+) | 时间序列 |
特征重要性评估进阶
| 方法 | 原理 | 优势 | 劣势 |
|---|---|---|---|
| 树模型importance | 基于分裂增益 | 快速 | 偏向高基数特征 |
| 排列重要性 | 打乱特征后性能下降 | 更可靠 | 计算量大 |
| SHAP值 | Shapley值的近似 | 可解释性最强 | 计算量最大 |
| Leave-one-out | 逐个删除特征训练 | 最直接 | 极其耗时 |
| Null Importance | 用随机目标训练对比 | 区分真/假重要性 | 需额外训练 |
🔗 这一章连到哪里
| 去哪 | 为什么 |
|---|---|
| ML基础 16 特征工程基础 | 编码、缺失值、分箱、交叉的原理版;这里只给菜谱,那里讲为什么这么切 |
| ML基础 05 评估与过拟合 | 「验证集构造比模型更重要」的底层原因:CV 估的是泛化误差,划错了估计就是偏的 |
| 模型上线之后 04 训练推理一致性 | 特征工程最容易出事的地方:训练时算得出、推理时算不出 |
| 模型上线之后 02 离线好不等于线上好 | CV 涨了 LB 不涨,和线下线上不一致是同一类问题 |
✅ 检查点
- 为什么说「验证集构造」比模型选择更重要?
- 样本不均衡有哪几类解法?什么时候该动损失函数而不是动采样?
- 伪标签的两个前提是什么?什么情况下它会害你?
- TTA 和模型集成的关系是什么?为什么它几乎是白赚的?
- 缺失值为什么要「按缺失原因分类处理」,而不是统一填中位数?
- 目标变量变换(如 log1p)在什么情况下必须做?评估时要注意什么?
👀 答案
- 因为验证集是你唯一的尺子。尺子错了,后面所有的改动方向都是错的——你会朝着「在错误验证集上更好」的方向优化,最后 LB 崩掉。而模型选错最多是分数低一点,方向不会反。
- ①重采样(过采样/欠采样)②调整类别权重 ③改损失函数(Focal Loss 等)④阈值调整。当少数类样本本身很难分(而不只是少)时,该动损失函数——重采样只是让模型多看几遍,Focal Loss 才是让它把注意力放到难样本上。
- ①当前模型精度已经足够高(否则你在放大自己的错误)②比赛规则允许使用测试集。害你的情况:模型有系统性偏差时,伪标签会把这个偏差固化并放大——错误的预测变成了「真理」,再也纠正不回来。
- TTA 是同一个模型在不同输入视角下的集成。几乎白赚是因为它不需要额外训练——只在推理时多跑几遍,而集成降方差的收益照样拿到。代价只是推理时间变成 N 倍。
- 因为缺失本身可能是信号。「用户没填收入」和「系统采集失败」是完全不同的两件事:前者携带信息(可能是特定人群),后者是随机噪声。统一填中位数会抹掉前者的信息。所以要加一列「是否缺失」,并按原因分组处理。
- 目标严重右偏(长尾)时必须做——否则少数极大值会主导 MSE,模型被它们拽跑。⚠️ 评估时要注意:如果指标是在原始尺度上算的,预测完必须变换回去,且
expm1回来的是中位数不是均值,严格的话要做偏差校正。
🛑 可以停在这里
⚡ 走神救援
⭐竞赛里排名的差距大部分来自数据和特征,不是模型。这章很长,别一次读完,按赛题需要挑着看——先看「验证集构造」和「评价指标」两节,因为验证集是你唯一的尺子,尺子错了后面所有改动方向都是错的。几个关键点:①样本不均衡——少数类「难分」时该动损失函数(Focal),只是「少」时才用重采样②伪标签的两个前提:模型已经够准 + 规则允许;模型有系统性偏差时它会把偏差固化放大③TTA 几乎白赚(不用额外训练,只是推理时间 ×N)④缺失值要按缺失原因分类处理——「没填」和「采集失败」是两回事,统一填中位数会抹掉信号,记得加一列「是否缺失」⑤目标严重右偏时必须 log1p,但评估要变换回原尺度且注意 expm1 回来的是中位数。