FeatureTools生成特征下两类不平衡数据集建模效果差异巨大原因求解
问题成因
1. 特征工程存在严重数据泄漏与分布偏移
你在方案二中先拆分训练测试集,再合并二者用FeatureTools做深度特征合成(DFS)的逻辑完全错误。生成personal_id、category_id这类维度的统计特征时,会同时用到训练集和测试集的样本信息:不仅训练集的特征会混入测试集的标签/分布信息,测试集的特征也会因为训练集的存在发生偏移,和实际线上推理时能拿到的特征分布完全不一致。
你观测到「训练测试集personal_id重叠时效果更差」,就是因为重叠id的聚合特征会被测试集里海量的负样本信息拉偏,模型学到的特征规律完全无法适配真实推理场景。移除personal_id后少了最大的偏移来源,效果自然会变好。
2. 训练与测试集样本分布严重不匹配
方案一的测试集是从1:4的采样数据集里分层拆分而来,测试集本身正负比例也是1:4,负样本都是和正样本关联度较高的采样结果,本身分布和训练集高度一致,所以结果好看。但方案二的测试集是真实的1:200不平衡分布,负样本是未经过采样的原生海量数据,大量负样本的特征分布是训练集里完全没出现过的,模型根本没学到这类样本的区分规则,自然会大量误判。
3. 高基数分类变量泛化性差
personal_id这类高基数分类变量,模型只会拟合训练集里出现过的id的规律,遇到测试集里未出现的id时,随机森林会默认将其划分到占比更高的多数类分支,直接导致正样本召回率极低。
解决方法
- 严格隔离训练测试集做特征工程
永远不要合并训练测试集做特征生成,所有聚合类特征的统计规则只能在训练集上计算,再映射到测试集。可以仅用训练集构造EntitySet生成DFS特征规则,再把规则应用到测试集样本上,从根源避免特征泄漏和分布偏移。 - 对齐训练与测试分布,优化不平衡处理逻辑
如果你的最终应用场景就是要在1:200的真实分布上推理,不要完全依赖欠采样处理不平衡,避免丢失负样本的通用分布特征:可以给随机森林设置class_weight='balanced'参数,或者改用Focal Loss这类对不平衡友好的损失函数,训练集可以保留更多原始负样本,保证和真实分布的对齐。 - 优化高基数分类变量处理逻辑
对personal_id这类高基数分类变量,不要直接用于特征生成:可以做带平滑的目标编码,或者仅保留出现次数高于阈值的id,低频id统一归为未知类,降低OOV(未出现值)的影响,如果该特征贡献不高直接移除也可。 - 调整模型决策阈值
不平衡场景下默认的0.5分类阈值会严重偏向多数类,你可以根据测试集的Precision-Recall曲线调整阈值,在可接受的精度范围内提升正样本的召回率。
内容的提问来源于stack exchange,提问作者mcsahin
相关产品推荐
相关产品推荐

