如何基于日期列数据完成未来销量预测并优化模型误差
预测值和训练集数量一致的原因
你调用model_rf.predict(X_train)时传入的是训练集的特征矩阵,输出结果自然和训练集样本数一致。要预测2022-01这类未来时间段的销量,必须先手动构造对应时间段的特征输入,再传入模型做预测。
RMSE是否过高的判断
你当前计算的是训练集上的误差,参考价值很低:
- RMSE没有绝对的高低标准,和你的销量数值量级直接挂钩。如果你的单天销量本身就是千万级,795万的RMSE属于正常范围,你可以用
RMSE / 销量均值计算误差的相对占比来判断是否符合预期。 - 训练集R² 0.92只能说明模型对训练数据的拟合程度,不能代表模型的真实泛化能力,你拆分的测试集完全没有用到,应该先计算测试集上的误差再做判断。
现有代码的核心问题和改进方案
- 禁止随机拆分时间序列数据:用
sample随机抽取80%数据做训练集是典型错误,会造成数据泄露——相当于用未来的数据训练模型来预测过去,得到的拟合指标完全失真。正确做法是先把数据按日期升序排序,取前80%时间段的数据作为训练集,后20%作为测试集。 - 年份独热编码错误:对
Year列做独热编码会导致模型无法预测训练集未覆盖的年份,比如训练集只有2019-2021年的数据,特征里就没有Year_2022列,模型无法处理2022年的预测输入。建议把年份改为数值型特征,不要做独热编码。 - 未来特征构造方法:以预测2022年1月为例,先用
pd.date_range(start='2022-01-01', end='2022-01-31')生成该月所有日期,再提取年、月、日、星期几、年积日等特征,之后和训练集的特征列做对齐,缺失的列补0,多余的列删除后就可以传入模型预测。 - 模型选型优化:随机森林属于树模型,不擅长时间序列的趋势外推,如果你的销量有明显的增长/下降、季节性规律,更推荐用Prophet、ARIMA这类专门的时间序列模型,开发成本更低,预测效果也更好。
- 补充测试集误差计算:在训练完模型后加上以下代码即可得到真实的泛化误差:
X_test = test[predictors_train].values y_test = test[target_column_train].values pred_test_rf = model_rf.predict(X_test) print("测试集RMSE:", np.sqrt(mean_squared_error(y_test,pred_test_rf))) print("测试集R²:", r2_score(y_test, pred_test_rf))
内容的提问来源于stack exchange,提问作者Sbeastan
相关产品推荐
相关产品推荐

