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行数据预测下一行,LSTM根本无法捕捉任何时序依赖;
- 任务类型错误:把离散分类问题当成回归任务,MSE损失会迫使模型输出所有样本的均值(这是最小化平方误差的最优解);
- 模型结构冗余:堆叠4层LSTM且全部返回序列,对于1步输入来说过于复杂,容易欠拟合;
- 预处理不当:MinMaxScaler适合连续值回归,离散分类任务更适合独热编码。
改进建议
- 拉长输入窗口:比如用前10-20行的三列数据作为输入,预测下一行的数值;
- 转换为分类任务:对每列的0-9做独热编码,输出层用
softmax激活,损失函数改用categorical_crossentropy; - 简化模型结构:先从1-2层LSTM开始尝试,根据验证集效果调整单元数和层数;
- 加入基准线对比:先统计每列数值的出现频率,用频率最高的数值作为基准预测,模型效果必须超过这个基准才有实际意义。
内容的提问来源于stack exchange,提问作者NumberLover
相关产品推荐
相关产品推荐

