Keras持续预测默认填充值,如何降低其对模型效果的影响
解决方法
替换填充值并做特征缩放
- 先把所有-999999填充值替换为对应特征列的有效值均值、中位数,或者直接替换为0。你现在用的极端值和正常有效值的数值差距过大,模型很容易把它当成强信号学习,替换成和有效值分布接近的数值可以直接削弱这个问题。
- 对每个输入特征列做标准化或者min-max归一化,把所有值压缩到统一的小区间内,避免填充值的数值权重远高于正常有效值。
新增缺失值掩码列
不需要改动原有任何行列的内容,只需要给每个存在缺失的参数列新增1个对应的掩码列即可:
- 掩码列仅取0和1两个值:原列是有效值的位置掩码填0,原列是填充值的位置掩码填1,相当于明确告诉模型哪些位置的数值是真实的、哪些是填充的,模型会自动降低填充位置的权重。
- 输出侧的-999999问题可以用掩码损失解决:自定义损失函数,计算损失的时候直接忽略输出为-999999的位置,不让这部分的误差参与反向传播,模型就不会刻意拟合填充值。Keras下的实现参考:
import tensorflow as tf def masked_categorical_loss(y_true, y_pred): # 识别非填充值的位置 mask = tf.cast(tf.not_equal(y_true, -999999), tf.float32) # 仅计算有效位置的分类损失 loss = tf.keras.losses.sparse_categorical_crossentropy(y_true * mask, y_pred) loss = loss * mask # 返回平均损失,避免除以0 return tf.reduce_sum(loss) / tf.maximum(tf.reduce_sum(mask), 1e-8)
如果是回归任务,把交叉熵损失替换为MSE、MAE等对应回归损失即可。
调整训练权重
可以给不同样本设置训练权重:某行填充值占比越高,给的训练权重越低,降低大量缺省的样本对模型参数的影响。也可以结合掩码逻辑给单条样本内的不同位置设置权重,进一步削弱填充值的干扰。
优化模型结构
在输入层后加入适量的Dropout层,随机失活部分神经元,降低模型对高频填充特征的依赖;也可以增加轻量的注意力模块,让模型自动学习有效特征的权重,自动忽略填充值的影响。
所有方案都不需要修改原有数据集的行列结构,原有列的有效值可以完全保留。
内容的提问来源于stack exchange,提问作者user12965285
相关产品推荐
相关产品推荐

