TFJS训练股票预测模型损失下降但准确率无法超过0.508如何解决
TensorFlow.js股票二分类模型准确率停滞问题排查与解决
核心问题根因
你遇到的准确率卡壳、损失持续下降的问题,本质是配置错误+金融数据特性共同导致的:
- 输入特征未做归一化:特征中交易量量级是百万级,其余价格类特征都是个位数,大数值特征会完全主导梯度更新,小特征的信号直接被淹没,模型学不到有效特征关联
- 损失函数与输出层、标签不匹配:你用2输出softmax层搭配
binaryCrossentropy损失本身就是错误搭配,如果你用one-hot格式的二分类标签,应该用categoricalCrossentropy损失 - 数据集类别不平衡+金融数据低信噪比:你卡的0.5088准确率,刚好就是你的数据集中盈利样本的占比,模型偷懒直接全部预测为占比更高的类别,所以准确率卡在该值不动,损失下降只是模型在不断提升多数类的预测置信度,不会改变分类结果
- 未拆分训练集验证集:全量数据训练无法区分是模型欠拟合还是过拟合到训练集的多数类
可直接落地的修改方案
1. 补充特征归一化
先统计全数据集各特征的极值,在数据预处理环节做min-max归一化,把所有特征缩放到0-1区间:
async function run() { const csvUrl = 'SOXLcateg.csv'; const trainingData = tf.data.csv(csvUrl, { columnConfigs: { next_day_inc: { isLabel: true } } }); // 新增:统计所有特征的最大最小值用于归一化 const allXs = await trainingData.map(({xs}) => Object.values(xs)).toArray(); const xsTensor = tf.tensor2d(allXs); const [xMax, xMin] = [xsTensor.max(0), xsTensor.min(0)]; const convertedData = trainingData.map(({ xs, ys }) => { // 标签简化为单值二分类,不需要冗余one-hot编码 const label = ys.next_day_inc == "profit" ? 1 : 0; // 对输入特征做归一化 const normalizedX = tf.tensor1d(Object.values(xs)).sub(xMin).div(xMax.sub(xMin)).arraySync(); return { xs: normalizedX, ys: label }; }).batch(32); // batch size调整为32,避免过大批量导致的更新滞后 const numOfFeatures = (await trainingData.columnNames()).length - 1;
2. 修正模型结构和损失函数匹配
改成适配二分类任务的标准配置:
const model = tf.sequential(); model.add(tf.layers.dense({ inputShape: [numOfFeatures], activation: "relu", units: 16 })); model.add(tf.layers.dropout({rate: 0.3})); // 新增dropout层缓解过拟合 model.add(tf.layers.dense({ activation: "sigmoid", units: 1 })); model.compile({ loss: "binaryCrossentropy", optimizer: tf.train.adam(0.001), metrics: ["accuracy"] })
3. 补充训练集验证集拆分
不要用全量数据训练,至少拆分70%为训练集、30%为验证集,训练时传入validationData参数,观察验证集准确率变化,避免过拟合到训练集。
4. 后续优化建议
不要直接用原始的OHLCV绝对数值当特征,换成相对特征效果会好很多,比如当日涨跌幅、5日涨跌幅、量比、收盘价偏离5日均线比例等,金融时序数据用相对指标比绝对指标有效得多。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

