You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Keras股票预测模型训练无明显学习进展问题求助

问题分析与解决方案:Keras模型Loss/Accuracy无明显学习进展

你遇到的这个情况是深度学习新手非常常见的问题——模型看起来完全没在学习,loss和accuracy几乎卡在初始状态。咱们从你的代码和训练输出入手,一步步拆解问题并给出解决办法:

1. 模型结构过于简单,拟合能力不足

你的模型只有一个输出神经元+Sigmoid激活,连隐藏层都没有!股票技术指标背后的规律往往是非线性的,这种仅含输出层的模型本质是个线性模型,根本没法捕捉数据里的复杂关系,自然学不到东西。

改进方案:

添加1-2层隐藏层,引入非线性激活函数(比如ReLU)来提升模型拟合能力:

model = Sequential()
model.add(Dense(16, input_dim=3, activation='relu'))  # 第一层隐藏层,16个神经元
model.add(Dense(8, activation='relu'))               # 第二层隐藏层,8个神经元
model.add(Dense(1, activation='sigmoid'))            # 输出层保持Sigmoid做二分类

2. 输入数据未做标准化/归一化

股票技术指标的数值范围可能差异极大(比如一个指标在0-1之间,另一个可能是几百),这种数据会导致梯度更新不稳定,模型难以收敛。从你的初始loss≈0.69就能看出来——这刚好是二分类问题中随机猜测的交叉熵损失(当模型输出全是0.5时,binary_crossentropy的计算值就是≈0.693),说明模型从一开始就没学到有效信息。

改进方案:

用标准化工具对输入数据做预处理,把所有指标缩放到相近的数值范围:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
# 注意:只在训练集上拟合scaler,测试集用同一个scaler做转换
data_scaled = scaler.fit_transform(trainingsetdata.as_matrix())
labels = trainingsetlabel.as_matrix()

3. 优化器与学习率可能不匹配

你使用的rmsprop优化器默认学习率可能不适合你的数据,另外对于新手场景,Adam优化器通常会比rmsprop表现更稳定。

改进方案:

更换优化器或自定义学习率:

from keras.optimizers import Adam

model.compile(optimizer=Adam(learning_rate=0.001), 
              loss='binary_crossentropy', 
              metrics=['accuracy'])

4. 数据本身的潜在问题

股票数据噪声极大,还有可能是以下原因导致模型学不动:

  • 标签定义不合理:比如预测次日涨跌,但涨跌本身随机性极强,指标和标签可能没有显著相关性;
  • 标签分布不平衡:如果标签中某一类占比极高(比如90%是涨),模型会倾向于预测多数类,导致accuracy卡在多数类比例附近;
  • 样本量太小:你的训练样本只有400条(380训练+20验证),样本量不足也会让模型难以学习到稳定模式。

检查建议:

  • 先做简单统计分析:计算每个技术指标和标签的相关性(比如皮尔逊相关系数),确认指标是否真的和预测目标有关;
  • 检查标签分布:如果不平衡,可以尝试过采样、欠采样或使用class_weight参数调整损失权重。

5. 训练流程的小细节优化

  • 你在训练前就执行了model.evaluate,这时候模型还没训练,结果是随机初始化权重的表现,属于正常现象,可以注释掉;
  • 可以考虑增加verbose=1查看更详细的训练过程,或者添加EarlyStopping回调防止过拟合。

修改后的完整代码示例:

from keras.models import Sequential
from keras.layers import Dense
from sklearn.preprocessing import StandardScaler
from keras.optimizers import Adam

# 数据预处理
scaler = StandardScaler()
data_scaled = scaler.fit_transform(trainingsetdata.as_matrix())
labels = trainingsetlabel.as_matrix()

# 模型定义
model = Sequential()
model.add(Dense(16, input_dim=3, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 编译模型
model.compile(optimizer=Adam(learning_rate=0.001), 
              loss='binary_crossentropy', 
              metrics=['accuracy'])

# 训练模型
model.fit(data_scaled, labels, 
          batch_size=32, 
          epochs=100, 
          validation_split=0.05, 
          verbose=2)

# 评估模型
score = model.evaluate(data_scaled, labels, batch_size=32, verbose=1)
print(score)

试试这些调整,应该能看到loss和accuracy的明显变化了!

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

火山引擎 最新活动