数据策略与特征工程
一、数据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 | 用随机目标训练对比 | 区分真/假重要性 | 需额外训练 |
二十二、PCA 降维
| 维度 | 说明 |
|---|---|
| 核心思想 | 用主成分分析将高维特征投影到低维空间,保留主要方差 |
| 典型应用 | 高维嵌入降维(如 1536→64、768→256) |
| 优势 | 减少计算量、降低过拟合风险、加速训练 |
| 实现方式 | StandardScaler 标准化后 fit_transform |
| 竞赛经验 | 嵌入维度>512 时建议 PCA 降维,通常保留 95% 方差 |
| 适用场景 | 预训练模型嵌入、高维特征压缩 |
二十三、StratifiedGroupKFold 交叉验证
| 维度 | 说明 |
|---|---|
| 核心思想 | 同时保持类别分层(Stratified)和组别隔离(Group) |
| 分层依据 | 按 primary_label 保持类别比例 |
| 分组依据 | 按 author 分组,防止同一作者数据跨折泄露 |
| 优势 | 防止数据泄露的同时保持类别分布一致 |
| 适用场景 | 多来源数据、存在组别相关性的分类任务 |
二十四、OOF 元特征工程
| 维度 | 说明 |
|---|---|
| 核心思想 | 用交叉验证的 Out-of-Fold 预测构建诚实的验证特征 |
| 实现方式 | GroupKFold(5) 按站点分组,验证站点排除 |
| 元特征类型 | 原始 logit、OOF 先验 logit、OOF 融合分数、前/后/均值/最大融合分数 |
| 优势 | 避免数据泄露,构建诚实验证集 |
| 适用场景 | 多模型集成、Stacking 元特征构建 |