Keras自定义损失实现:价格涨跌幅预测中对反向结果加重惩罚
Keras自定义涨跌方向敏感损失函数实现
核心逻辑说明
你遇到的问题本质是MSE/RMSE只关注数值拟合误差,不对涨跌方向错误做差异化惩罚,导致模型优先拟合数值大小,忽略方向正确性。自定义损失的核心是在基础数值损失上叠加两层惩罚:
- 符号相反(方向预测错误):叠加高倍惩罚,强制模型优先保证方向正确
- 同方向但预测绝对值超过真实值:叠加小额惩罚,满足权重倾斜要求
自定义损失代码实现
import tensorflow as tf from tensorflow import keras def direction_sensitive_loss(alpha=10.0, beta=0.2, base_loss_weight=1.0): """ 方向敏感自定义损失函数 :param alpha: 方向预测错误的惩罚系数,数值越大越优先保证方向正确,建议初始值5~20之间调试 :param beta: 同方向预测值绝对值超过真实值的额外惩罚系数,建议初始值0.1~0.5之间调试 :param base_loss_weight: 基础MSE损失的权重 """ def loss(y_true, y_pred): # 基础MSE损失 base_mse = keras.losses.mean_squared_error(y_true, y_pred) # 1. 计算方向错误惩罚项 # 符号乘积<0代表方向相反,等于0的情况(涨跌幅为0)可按需调整处理逻辑 sign_diff = tf.cast(tf.sign(y_true) * tf.sign(y_pred) < 0, tf.float32) # 乘以真实值绝对值,保证涨跌幅越大的样本方向错误惩罚越高 direction_penalty = alpha * sign_diff * tf.abs(y_true) # 2. 计算同方向绝对值超标的额外惩罚 same_sign = tf.cast(tf.sign(y_true) * tf.sign(y_pred) > 0, tf.float32) abs_over = tf.cast(tf.abs(y_pred) > tf.abs(y_true), tf.float32) over_penalty = beta * same_sign * abs_over * (tf.abs(y_pred) - tf.abs(y_true)) # 汇总总损失 total_loss = base_loss_weight * base_mse + direction_penalty + over_penalty return tf.reduce_mean(total_loss) return loss
模型编译调用示例
# 初始化损失函数,可按需调整alpha、beta参数适配业务需求 custom_loss = direction_sensitive_loss(alpha=10.0, beta=0.2) model.compile(optimizer='adam', loss=custom_loss, metrics=['mse'])
参数调优建议
- 如果方向准确率低于预期,逐步调大
alpha值,例如调整到15、20,直到方向准确率达标 - 如果同方向超额预测的占比过高,适当调大
beta值即可 - 不要将alpha设置过大,否则会导致模型为了保证方向完全不敢预测接近0的数值,出现数值拟合精度下降过多的问题
内容的提问来源于stack exchange,提问作者iKey
相关产品推荐
相关产品推荐

