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
相关产品推荐
相关产品推荐

