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

Keras中实现方向准确率自定义损失函数技术求助

实现Keras方向准确率损失函数

以下是符合你需求的张量操作实现,核心是比较真实收盘价与预测收盘价的相邻涨跌方向是否一致,最终以1 - 方向准确率作为损失:

import tensorflow.keras.backend as K

def directional_loss(y_true, y_pred):
    # 计算真实收盘价的相邻差值(当前K线 - 前一根K线)
    diff_true = y_true[:, 1:] - y_true[:, :-1]
    # 获取真实涨跌方向:涨=1,平=0,跌=-1
    sign_true = K.sign(diff_true)
    
    # 计算预测收盘价的相邻差值
    diff_pred = y_pred[:, 1:] - y_pred[:, :-1]
    # 获取预测涨跌方向
    sign_pred = K.sign(diff_pred)
    
    # 判断涨跌方向是否一致,转换为浮点型便于计算
    direction_match = K.cast(K.equal(sign_true, sign_pred), K.floatx())
    
    # 计算方向准确率(正确匹配数 / 总样本数)
    directional_acc = K.mean(direction_match)
    
    # 损失为1减去准确率,损失越小表示方向预测越准确
    return 1 - directional_acc

关键细节说明

  • 张量维度处理:假设输入的y_true和y_pred形状为(batch_size, sequence_length),即每个批次包含多条K线的收盘价序列。如果你的输入是一维张量(如(batch_size,)),需先通过K.expand_dims(y_true, axis=1)扩展为二维序列格式。
  • 平盘情况处理:默认逻辑中,真实平盘且预测平盘会被判定为正确;若需要排除平盘样本(仅统计有涨跌的情况),可添加过滤逻辑:
    # 过滤掉真实平盘的样本
    mask = K.not_equal(sign_true, 0)
    sign_true_filtered = K.boolean_mask(sign_true, mask)
    sign_pred_filtered = K.boolean_mask(sign_pred, mask)
    
    # 计算匹配度,避免空张量报错
    if K.shape(sign_true_filtered)[0] > 0:
        direction_match = K.cast(K.equal(sign_true_filtered, sign_pred_filtered), K.floatx())
        directional_acc = K.mean(direction_match)
    else:
        directional_acc = K.constant(0.0)
    
  • 损失逻辑:用1 - 准确率作为损失,模型训练时会通过最小化损失来最大化方向预测的正确性,符合Keras损失函数的优化逻辑。

内容的提问来源于stack exchange,提问作者Infinity Cliff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:15:25