我的输入数据结构如下:
X1 | X2 | X3 | ... | 输出(标签)118.12341 | 118.12300 | 118.12001 | ... | [介于0和1之间的值] 例如 0.423645
我使用tensorflow
来解决预测Output
变量未来值的回归问题。为此,我构建了一个前馈神经网络,包含三个隐藏层,使用relu
激活函数,以及一个带有linear activation
的单节点输出层。该网络使用adam
优化器进行反向传播训练。
我的问题是在训练网络几千个周期后,我发现输入特征和输出的这些高度小数值仅能预测到小数点后第二位,例如:
真实值 = 0.456751 | 预测值 = 0.452364
然而,这是不被接受的,我需要至少到小数点后第四位的精度才能接受这个值。
问:是否有任何可靠的技术可以正确解决这个问题以获得更好的结果(可能是某种转换算法)?
提前感谢。
回答:
假设你使用的是常规的MSE损失函数,这可能不适合你对每个实例误差的相对低容忍度。进一步解释,MSE定义如下:预测值与真实值差异的平方的平均值
。
假设你有4个实例,以及两个训练函数生成的每实例错误率如下:
F1错误率:(4, 0.0004, 0.0002, 0.0002)
F2错误率:(0.9, 0.9, 0.9, 0.9)
显然,MSE会选择F2,因为F2的平均MSE是0.81,而F1的平均MSE大约是16。
因此,总结来说,MSE对小于1的值差异赋予的权重太小,而对大于1的值差异则因为平方
函数的应用而夸大了权重。
你可以尝试使用MAE,即平均绝对误差,它的唯一区别是不对各个误差进行平方运算,而是计算绝对值。还有许多其他回归损失函数可以对较小的错误赋予显著的权重,例如HUBER
损失函数,使用小delta值(<0),你可以在这里阅读更多关于这些损失函数的信息这里。
另一种可能的解决方案是将其转换为分类问题,例如,如果预测值与输出值在小数点后第四位完全相同,则预测为真,否则为假。