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

Python机器学习预测序列随机数:可行性、难度与模型选型咨询

关于0-9三列数值序列的机器学习预测问题

我拥有一个包含3列数据的数据集,每列数值为0-9,共约6700行。现咨询:是否可构建机器学习模型预测下一组三个数值(每列各一个)?若可行,实现难度如何,推荐使用何种模型?

我是机器学习新手,此前尝试过基于TensorFlow的多种LSTM模型,但输出结果更接近平均值而非有效预测,附上一次尝试的代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel('Numbers1.xlsx', sheet_name='midday training')
dataset_train = df.iloc[:, 1:]
dataset_train = dataset_train.iloc[::-1]
time_series_data = np.array(df)
training_set = time_series_data[:, 1:4]


from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range=(0, 1))
training_set_scaled = sc.fit_transform(training_set)

x_train = []
y_train = []
for i in range(1, 6003):
    x_train.append(training_set_scaled[i-1:i, :3])
    y_train.append(training_set_scaled[i, :3])
x_train, y_train = np.array(x_train), np.array(y_train)

x_train = np.reshape(x_train, (6002,1,3))
                     
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout

regressor = Sequential()

regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (x_train.shape[1], 3)))
regressor.add(Dropout(.2))
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(.2))
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(.2))
regressor.add(LSTM(units = 50))
regressor.add(Dropout(.2))

regressor.add(Dense(units = 3))

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')

regressor.fit(x_train, y_train, epochs = 20, batch_size = 32)

dataset_test = pd.read_excel('Numbers1.xlsx', sheet_name='midday')
dataset_test = dataset_test.iloc[:, 1:]
dataset_test = dataset_test.iloc[::-1]
real = dataset_test

dataset_total = pd.concat((dataset_train, dataset_test), axis = 0)
inputs = dataset_total[len(dataset_total) - len(dataset_test) - 1:].values
inputs = sc.transform(inputs)
x_test = []

for i in range(1, 6734):
    x_test.append(inputs[i-1:i, :3])
x_test = np.array(x_test)
x_test = np.reshape(x_test, (6733,1,3))
predicted = regressor.predict(x_test)
predicted = sc.inverse_transform(predicted)

问题解答

1. 能否用模型预测?

取决于你的数据是否存在可捕捉的规律:

  • 如果是完全随机的序列(比如彩票、随机数生成器输出),任何模型都无法有效预测——因为下一个值和历史数据无关联;
  • 如果数据是某种规则生成的(比如周期性、依赖前几轮的状态),则可以尝试用模型挖掘规律。

2. 实现难度

对于新手来说属于中等难度:

  • 最大的挑战是验证数据是否有规律,以及找到适配的模型结构;
  • 如果数据有明显模式,通过调整预处理和模型参数,新手也能做出有效果的预测。

3. 推荐模型

针对这类多变量离散时间序列,推荐几种方向:

  • 改进版LSTM/GRU:你的现有代码有明显问题,调整后可以继续使用;
  • 时间序列Transformer:比如TST,擅长捕捉长序列的依赖关系;
  • 马尔可夫链:作为基准模型,先验证数据是否存在概率转移规律;
  • 多分类模型:把每列的0-9当成分类标签,用CNN、XGBoost等模型,需要构造历史窗口特征。

你的LSTM代码问题分析

输出接近平均值的核心原因:

  1. 输入窗口过短:只用前1行数据预测下一行,LSTM根本无法捕捉任何时序依赖;
  2. 任务类型错误:把离散分类问题当成回归任务,MSE损失会迫使模型输出所有样本的均值(这是最小化平方误差的最优解);
  3. 模型结构冗余:堆叠4层LSTM且全部返回序列,对于1步输入来说过于复杂,容易欠拟合;
  4. 预处理不当:MinMaxScaler适合连续值回归,离散分类任务更适合独热编码。

改进建议

  1. 拉长输入窗口:比如用前10-20行的三列数据作为输入,预测下一行的数值;
  2. 转换为分类任务:对每列的0-9做独热编码,输出层用softmax激活,损失函数改用categorical_crossentropy;
  3. 简化模型结构:先从1-2层LSTM开始尝试,根据验证集效果调整单元数和层数;
  4. 加入基准线对比:先统计每列数值的出现频率,用频率最高的数值作为基准预测,模型效果必须超过这个基准才有实际意义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:35:22