You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:48:00