TensorFlow自定义损失函数实战:解决回归预测偏差问题

闻溪
闻溪
发布时间:2026-10-13 | 3人浏览过
原创

本文通过商品销量预测实例,详解如何在TensorFlow中自定义损失函数。针对均方误差无法反映预测偏差成本差异的问题,通过设定预测偏高与偏低的惩罚权重,构建分段损失函数。代码展示如何利用tf.where实现非对称惩罚,并对比不同权重设置对模型最终参数的影响,帮助开发者优化特定业务场景下的模型表现。

自定义损失函数的背景与动机

在回归任务中,默认通常使用均方误差(MSE)作为损失函数,但实际业务场景中,预测偏差带来的后果往往并不对称,因此需要根据具体情况调整损失函数的定义。

以商品销量预估为例,假设单件商品的成本为1元,售价为10元。

若采用均方误差计算,当预测值比实际值多1个单位时,损失约为1元;而当预测值比实际值少1个单位时,损失则高达9元(即少赚的利润)。

显然,在这种成本结构下,预测偏高带来的损失远小于预测偏低导致的利润损失,因此模型应倾向于做出偏高的预测。

为此,我们需要自定义一个分段损失函数,分别处理预测值yhat大于真实值y,以及预测值yhat小于真实值y的情况。

此处沿用吴恩达课程中的符号约定,yhat表示预测值,y表示真实值。

TensorFlow代码实现与数据生成


import tensorflow as tf
from numpy.random import RandomState
batch_size = 8
# 两个输入节点
x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
# 回归问题一般只有一个输出节点
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y-input")
# 定义了一个单层的神经网络前向传播的过程,这里就是简单加权和
w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))
y = tf.matmul(x, w1)
# 定义预测多了和预测少了的成本
loss_less = 10
loss_more = 1
#在windows下,下面用这个where替代,因为调用tf.select会报错
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_)*loss_more, (y_-y)*loss_less))
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
#通过随机数生成一个模拟数据集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
"""
设置回归的正确值为两个输入的和加上一个随机量,之所以要加上一个随机量是
为了加入不可预测的噪音,否则不同损失函数的意义就不大了,因为不同损失函数
都会在能完全预测正确的时候最低。一般来说,噪音为一个均值为0的小量,所以
这里的噪音设置为-0.05, 0.05的随机数。
"""
Y = [[x1 + x2 + rdm.rand()/10.0-0.05] for (x1, x2) in X]
with tf.Session() as sess:
 init = tf.global_variables_initializer()
 sess.run(init)
 steps = 5000
 for i in range(steps):
  start = (i * batch_size) % dataset_size
  end = min(start + batch_size, dataset_size)
  sess.run(train_step, feed_dict={x:X[start:end], y_:Y[start:end]})
 print(sess.run(w1))

[[ 1.01934695]
[ 1.04280889]

具体的损失函数实现逻辑如上所述。

在生成训练数据时,真实标签y由x1与x2之和构成,因此理论上回归结果应接近[1, 1]。但由于引入了自定义的非对称损失函数,模型训练结果会倾向于预测值偏高。

若将预测偏低(loss_less)与预测偏高(loss_more)的权重对调,观察结果变化:

[[ 0.95525807] [ 0.9813394 ]]

不同损失函数对模型结果的影响分析

该案例表明,即使神经网络结构相同,不同的损失函数定义会对训练出的模型参数产生显著影响。

本实例参考自《Tensorflow实战 Google深度学习框架》。

总结

以上介绍了TensorFlow中自定义损失函数的示例,希望对读者有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表