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

基于LSTM的极值分类问题:数据不平衡与双阶段分类咨询

模型改进建议(针对类别不平衡问题)

1. 损失函数与训练策略调整

  • 采用类别权重加权:给少数类(1和2)分配更高的权重,降低多数类(0)对损失的影响。示例代码:
# 根据实际类别占比计算权重,假设0类占95%,1、2类各占2.5%
class_weights = {0: 1.0, 1: 38.0, 2: 38.0}
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, class_weight=class_weights, epochs=50, batch_size=32)
  • 使用Focal Loss:主动降低易分类样本(大量0类)的损失权重,让模型聚焦于难分类的极值样本。
  • 调整预测阈值:若模型输出0类的概率低于设定阈值(如0.8),则优先考虑1或2类的预测结果,避免过度偏向0类。

2. 数据层面优化

  • 过采样少数类:对1、2类样本进行重复采样,或基于时序上下文生成合成样本(比如给极值点的CLOSE、VOL添加微小高斯噪声,生成新的极值样本),注意保持时序连续性。
  • 欠采样多数类:采用滑动窗口式欠采样,在保证时序完整的前提下,剔除部分0类样本,降低其占比。
  • 时序特征增强:添加衍生特征(如相邻时间步的价格差、成交量变化率、滑动窗口内的极值统计量),让模型更容易捕捉极值点的特征模式。

3. 模型结构优化

  • 添加注意力机制:让模型自动聚焦于对极值判断关键的时序片段,提升少数类的识别能力。示例:
from tensorflow.keras.layers import Attention

model = Sequential()
model.add(LSTM(units=100, return_sequences=True, dropout=0.2))
model.add(Attention())  # 新增注意力层
model.add(LSTM(units=50, return_sequences=False, dropout=0.2))
model.add(Dense(3, activation='softmax'))
  • 加入早停机制:用验证集监控少数类的召回率,当召回率不再提升时停止训练,避免模型过度拟合多数类。

双阶段分类模型实现指导

双阶段模型核心是先做「0类/非0类二分类」,再对非0类做「局部最大值/最小值二分类」,具体实现步骤如下:

1. 第一阶段:二分类模型(区分0类与非0类)

  • 重构标签:将原标签中的1、2统一标记为1,0保持为0,形成二分类任务。
  • 模型构建与训练:
stage1_model = Sequential()
stage1_model.add(LSTM(units=100, return_sequences=True, dropout=0.2))
stage1_model.add(LSTM(units=50, return_sequences=False, dropout=0.2))
stage1_model.add(Dense(1, activation='sigmoid'))
# 同样设置类别权重,保证模型关注非0类
stage1_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['recall'])
stage1_model.fit(X_train_stage1, y_train_stage1, class_weight={0:1, 1:20}, epochs=30)
  • 训练重点:优先优化召回率,尽量覆盖所有真实的极值点,哪怕牺牲部分精度。

2. 第二阶段:极值分类模型(区分1和2类)

  • 构建数据集:提取真实标签为1、2的样本,以及第一阶段误判为非0的0类样本(可选),组成仅包含两类的训练集。
  • 模型构建与训练:
stage2_model = Sequential()
stage2_model.add(LSTM(units=80, return_sequences=True, dropout=0.2))
stage2_model.add(LSTM(units=40, return_sequences=False, dropout=0.2))
stage2_model.add(Dense(2, activation='softmax'))
stage2_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
stage2_model.fit(X_train_stage2, y_train_stage2, epochs=30)

3. 推理流程

import numpy as np

def two_stage_predict(new_data):
    # 第一阶段判断是否为非0类
    stage1_prob = stage1_model.predict(new_data, verbose=0)[0][0]
    if stage1_prob < 0.5:  # 阈值可根据验证集调整
        return 0
    # 第二阶段判断极值类型
    stage2_pred = stage2_model.predict(new_data, verbose=0)
    return 1 if np.argmax(stage2_pred) == 0 else 2

注意事项

  • 时序数据需按时间顺序划分训练/测试集,禁止随机打乱,避免数据泄露。
  • 两个阶段的阈值都需基于验证集调优,优先保证极值点的识别率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:15:25