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

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

本文通过商品销量预测实例,详解如何在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。