You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DataPreparer归一化后Random Forest、SVM数据全为负的原因及解决方法

问题背景

当前开展二分类预测建模任务,目标为预测在线访客是否会最终购买网站商品,选用Random Forest Classifier与SVM两类模型开展对比实验。完成适配建模要求的训练集、验证集、测试集拆分后,计划对数据依次执行哑变量转换、标准化、归一化处理,但经DataPreparer处理后所有数据集的输出数值全部为负值,需要定位问题原因并给出修正方案。
本次数据处理调用的代码如下:

data_preparer = DataPreparer(one_hot_encoder, standard_scaler)
data_preparer.prepare_data(fitting_splits.train_set).head()
data_preparer.prepare_data(fitting_splits.validation_set).head()
产生原因
  • 预处理算子拟合逻辑错误:从代码调用方式看,你每次传入不同数据集调用prepare_data时,大概率算子会在当前传入的数据集上重新拟合再做转换,而不是使用训练集上拟合好的统计量做转换。如果算子内部的标准化、归一化公式写反了分子顺序(比如把(x - 均值)/标准差错写为(均值 - x)/标准差),只要原特征取值整体大于计算出的均值,输出就会全为负值。
  • 预处理范围错误:你把独热编码生成的0-1哑变量也纳入了标准化/归一化的处理范围。哑变量本身只有0、1两个取值,如果某列哑变量在拟合时的均值大于0.5,取值为0的样本转换后就会得到负值;如果验证集、测试集里的哑变量取值和训练集分布差异大,比如某列哑变量在验证集里全为0,转换后该列就会全为负值,多列叠加后很容易出现整体数值全负的情况。
  • 预处理顺序错误:你提到计划依次做哑变量转换、标准化、归一化,但初始化DataPreparer时只传入了独热编码器和标准化器,没有传入归一化算子,大概率是你提前手动做的归一化和DataPreparer内置的处理逻辑冲突了。比如你提前用MinMaxScaler把特征缩到了[0,1]区间,后续标准化时如果计算出的特征均值大于当前子集的所有特征值,做减法后就会全为负值。
  • 数据泄露导致统计量失配:如果你在拆分数据集之前就对全量数据做了缩放、编码处理,拆分后的子集再传入DataPreparer做二次拟合转换时,算子计算出的均值、最值等统计量和子集本身的分布完全不匹配,也会出现数值全负的异常。
  • 额外提醒:Random Forest Classifier是基于树分裂的模型,对特征尺度不敏感,完全不需要做标准化、归一化处理,没必要和SVM共用一套预处理流程。
修正方案
  • 修正算子拟合逻辑:所有编码、缩放类预处理算子,必须仅在训练集上执行拟合操作,再用拟合完成的算子分别转换验证集、测试集,禁止在不同子集上重复拟合同一个算子。你需要检查DataPreparer的内部实现,确保处理训练集时走fit_transform逻辑,处理验证、测试集时只走transform逻辑,不更新算子内部保存的均值、标准差、类别取值等统计量。
  • 调整预处理覆盖范围:独热编码生成的哑变量不要纳入标准化、归一化的处理范围,仅对连续型数值特征做缩放操作,既可以避免无意义的负值产生,也不会破坏哑变量的取值含义。
  • 理顺预处理顺序:严格按照「拆分数据集→在训练集上拟合独热编码器,转换所有子集→对连续特征做标准化(SVM场景不需要额外做归一化,标准化输出已经适配SVM的训练要求)」的流程操作,不要在拆分前对全量数据做任何拟合类预处理,避免数据泄露。
  • 做模型差异化预处理:喂给Random Forest的数据集只需要做缺失值填充、类别特征独热编码即可,不需要做任何特征缩放;喂给SVM的数据集在上述处理基础上,再对连续特征做标准化即可,不需要给两类模型强行套用相同的处理逻辑。

内容的提问来源于stack exchange,提问作者Eri Bytyci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:00:56