尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

数学建模竞赛时间序列预测:从ARIMA到机器学习实战指南

数学建模竞赛时间序列预测:从ARIMA到机器学习实战指南 1. 项目概述从竞赛题目到时间序列的实战路径每年一到数学建模竞赛季无论是国赛、美赛还是各类校赛总能看到大量与预测、趋势分析相关的题目。这类题目往往给出一段历史数据要求你预测未来走势、分析周期性规律或识别异常点。我参加过也指导过不少比赛发现很多队伍一看到时间序列数据第一反应就是去找ARIMA模型的代码“套一下”结果往往因为没吃透原理、参数瞎调、检验步骤缺失导致模型预测结果离谱论文解释苍白无力。这个项目就是想彻底拆解数学建模竞赛中时间序列模型的应用提供一个从数据理解、模型选择、代码实现到结果分析的完整、可复现的实战框架。它不仅仅是几个模型的代码堆砌而是聚焦于解决竞赛场景下的几个核心痛点如何在有限时间内通常3-4天快速判断数据特性并选择合适的模型如何用Python最常用的竞赛工具高效地完成从平稳性检验到预测评估的全流程如何将模型输出转化为有说服力的论文图表和论述无论你是初次接触建模的新手还是想提升解题效率的老手这套融合了原理、代码与竞赛技巧的“组合拳”都能让你在面对时间序列题时思路更清晰操作更稳健。2. 竞赛场景下时间序列建模的核心思路拆解2.1 竞赛题目的典型特征与建模目标数学建模竞赛中的时间序列数据通常有几个鲜明特点数据量有限可能只有几十到几百个时间点、背景领域性强经济、环境、疾病传播等、任务目标明确短期预测、趋势分析、周期挖掘。这决定了我们的建模思路不能照搬学术研究或工业界的大数据方案必须追求“快、准、稳”。快体现在流程自动化。我们需要一套代码模板能快速完成数据可视化、平稳性检验、模型拟合等基础步骤把时间留给更关键的模型调优和论文写作。准体现在模型选择的合理性。不是越复杂的模型越好而是最适合数据特征和问题要求的模型最好。一个简单的指数平滑可能比胡乱调参的LSTM更有效。稳体现在结果的可解释性和稳健性。竞赛论文需要清晰的逻辑链条你的模型为什么有效参数怎么来的预测不确定性如何这些都必须能自圆其说。因此核心建模目标可以归纳为三点第一识别序列模式判断其趋势上升、下降、无、季节性周期长度、以及是否存在周期性不一定是固定周期的季节性第二建立预测模型对未来若干步进行点预测和区间预测第三提供决策洞见将预测结果与赛题背景结合给出有实际意义的结论或建议。2.2 模型选型逻辑从简单到复杂的决策树面对一个时间序列新手容易犯的错是直接上最复杂的模型。我的经验是遵循一个从简到繁的决策流程可以避免过度拟合并节省大量时间。第一步画图观察。使用简单的折线图观察数据整体走势。如果序列看起来非常平滑趋势明显且无复杂波动可以优先尝试指数平滑模型如Holt-Winters。它的优势在于原理简单、参数少、计算快对于有明显趋势和季节性的序列效果直观论文里也容易解释。第二步检验平稳性。如果序列波动较大或者看起来有“均值回归”的特性就需要进行更严格的统计分析。这里的关键是ADF检验。如果序列是平稳的p值小于0.05那么ARIMA模型家族包括AR、MA、ARMA就是主力武器。ARIMA的核心思想是用历史值和历史误差的线性组合来预测未来其数学形式优雅在经济学等领域有深厚背景写在论文里很有说服力。第三步判断季节性。在平稳性检验基础上观察自相关图。如果自相关系数在固定的滞后阶数如12对应月度数据出现峰值则表明存在季节性。对于既有季节性又需差分平稳的序列就该使用季节性ARIMA模型。第四步考虑复杂情况。当数据存在长期依赖、非线性关系或者外部变量如促销活动、天气影响显著时前述传统线性模型可能力不从心。这时可以考虑机器学习/深度学习模型如基于树模型的LightGBM或者循环神经网络。但在竞赛中应用这些模型需要格外小心一是数据量可能不够容易过拟合二是模型黑箱性强论文解释难度大。通常我建议将其作为传统模型的补充对比而不是首选。注意在竞赛论文中清晰阐述你的模型选型逻辑本身就是一个加分项。不要只写“我们采用了ARIMA模型”而要写“通过对序列进行可视化分析图1和ADF平稳性检验p值xx我们发现该序列为非平稳序列。经过一阶差分后序列平稳图2且自相关图显示在滞后12阶存在显著峰值表明存在年度季节性。因此我们选用季节性ARIMA模型进行建模。”这样的论述体现了严谨的科学流程。3. 核心模型原理与代码实现解析3.1 指数平滑模型快速 baseline 的建立指数平滑可以理解为一种“加权移动平均”越近的历史数据权重越高。在竞赛中它常被我用来建立第一个预测基线因为其实现速度快结果易于理解。简单指数平滑适用于没有明显趋势和季节性的序列。其核心是更新水平分量。Python中statsmodels库的SimpleExpSmoothing可以轻松实现。关键参数是平滑系数通常由模型自动优化选择。Holt-Winters三指数平滑是竞赛中的利器它同时考虑了水平、趋势和季节性三个分量。对于有明确年度、季度或月度周期的数据如月度销售额、每日气温效果往往立竿见影。它分为加法模型和乘法模型当季节性波动的幅度不随序列水平变化时用加法模型当波动幅度随序列水平增长而增大时用乘法模型。这个选择至关重要可以通过观察历史序列图做出初步判断。import pandas as pd import numpy as np from statsmodels.tsa.holtwinters import ExponentialSmoothing import matplotlib.pyplot as plt # 示例模拟月度数据 np.random.seed(42) trend np.linspace(0, 20, 100) seasonality 10 * np.sin(2 * np.pi * np.arange(100) / 12) noise np.random.normal(0, 1, 100) data trend seasonality noise index pd.date_range(start2015-01-01, periods100, freqM) ts pd.Series(data, indexindex) # 拟合Holt-Winters加法模型 model_hw ExponentialSmoothing(ts, trendadd, seasonaladd, seasonal_periods12).fit() # 预测未来12个月 forecast_hw model_hw.forecast(12) # 绘图 plt.figure(figsize(12, 6)) plt.plot(ts, labelObserved) plt.plot(model_hw.fittedvalues, labelFitted, linestyle--) plt.plot(forecast_hw.index, forecast_hw, labelForecast, colorred) plt.fill_between(forecast_hw.index, model_hw.forecast(12) - 1.96*model_hw.sse/len(ts)**0.5, model_hw.forecast(12) 1.96*model_hw.sse/len(ts)**0.5, colorred, alpha0.2, label95% Confidence Interval) plt.legend() plt.title(Holt-Winters Additive Model Forecast) plt.show() # 输出关键模型摘要 print(model_hw.summary())这段代码演示了完整的流程。注意seasonal_periods12的设定这告诉模型数据的季节性周期是12个月。fill_between用于绘制预测区间增加了结果的可信度。在论文中这样的图表配上对模型参数如平滑系数的解释能很好地展示你的工作。3.2 ARIMA模型家族处理平稳与非平稳序列的基石ARIMA模型是时间序列分析的中流砥柱也是竞赛中最常被要求使用和解释的模型之一。它的核心是三个参数p自回归阶数、d差分阶数、q移动平均阶数。第一步平稳性检验与差分。这是ARIMA建模的前提。我们使用ADF检验来判断。如果p值大于0.05则认为序列非平稳需要进行差分。差分的阶数d就是使序列平稳所需的最小差分次数。from statsmodels.tsa.stattools import adfuller from statsmodels.graphics.tsaplots import plot_acf, plot_pacf # ADF检验函数 def adf_test(timeseries): print(Results of Augmented Dickey-Fuller Test:) dftest adfuller(timeseries, autolagAIC) dfoutput pd.Series(dftest[0:4], index[Test Statistic, p-value, #Lags Used, Number of Observations Used]) for key, value in dftest[4].items(): dfoutput[Critical Value (%s) % key] value print(dfoutput) if dfoutput[p-value] 0.05: print(结论序列平稳) else: print(结论序列非平稳) adf_test(ts) # 检验原始序列 # 如果非平稳进行一阶差分 ts_diff ts.diff().dropna() adf_test(ts_diff) # 检验差分后序列第二步确定p和q。在序列平稳后我们通过观察自相关图和偏自相关图来初步确定p和q。ACF图拖尾、PACF图在p阶后截尾提示AR(p)模型反之ACF图在q阶后截尾、PACF图拖尾提示MA(q)模型两者都拖尾则用ARMA(p,q)或ARIMA(p,d,q)。在实际竞赛中我常结合信息准则来最终定阶。# 绘制ACF和PACF图 fig, axes plt.subplots(1, 2, figsize(15,4)) plot_acf(ts_diff, lags40, axaxes[0]) plot_pacf(ts_diff, lags40, axaxes[1], methodywm) plt.show()第三步模型拟合与评估。使用statsmodels的ARIMA或更便捷的auto_arima需安装pmdarima库进行模型拟合。auto_arima可以自动搜索最优的(p,d,q)参数组合在时间紧迫的竞赛中非常有用。# 使用auto_arima自动定阶强烈推荐竞赛使用 from pmdarima import auto_arima import warnings warnings.filterwarnings(ignore) stepwise_model auto_arima(ts, start_p1, start_q1, max_p5, max_q5, m12, # m12表示考虑年度季节性 start_P0, seasonalTrue, dNone, DNone, traceTrue, error_actionignore, suppress_warningsTrue, stepwiseTrue) print(stepwise_model.summary()) # 拟合最优模型 best_model stepwise_model.fit(ts) # 预测 forecast_arima, conf_int best_model.predict(n_periods12, return_conf_intTrue)auto_arima的traceTrue参数会打印搜索过程这可以直接截图放到论文附录证明你的参数选择是系统性的而非随意指定。return_conf_intTrue则返回预测区间用于绘制置信带。3.3 季节性ARIMA应对周期性波动的标准解法当数据具有固定周期的季节性时如电力负荷的日周期、零售销售的周周期就需要在ARIMA模型中引入季节性分量记为SARIMA(p,d,q)(P,D,Q,s)。其中大写的(P,D,Q)是季节性部分的参数s是季节周期长度。在代码实现上statsmodels的SARIMAX函数或pmdarima的auto_arima设置seasonalTrue和ms可以方便地处理。关键在于确定季节周期s。这需要结合数据背景月度数据s12季度数据s4和自相关图在滞后s阶处的峰值来综合判断。# 使用SARIMAX进行手动建模示例当auto_arima结果不理想时用于微调 from statsmodels.tsa.statespace.sarimax import SARIMAX # 假设通过分析我们确定一个SARIMA(1,1,1)(1,1,1,12)模型 model_sarima SARIMAX(ts, order(1, 1, 1), seasonal_order(1, 1, 1, 12), enforce_stationarityFalse, enforce_invertibilityFalse) results_sarima model_sarima.fit(dispFalse) print(results_sarima.summary()) # 诊断图检查残差是否为白噪声 results_sarima.plot_diagnostics(figsize(15, 10)) plt.show()plot_diagnostics会生成一组四宫格图包括标准化残差、残差直方图加核密度估计、正态Q-Q图以及残差的ACF图。一个好的模型其残差应该近似为白噪声ACF图无显著自相关且接近正态分布。在论文中附上这张诊断图并给出合理解释能极大增强模型的可信度。3.4 机器学习模型作为补充与对比的进阶选择当传统时序方法效果不佳或数据中包含丰富的外部特征时可以考虑机器学习模型。这里以LightGBM为例因为它处理表格数据效率高能自动处理特征交互且对缺失值不敏感。核心思路是将时间序列预测问题转化为监督学习问题。我们通过创建“滞后特征”来构建特征矩阵用t-1,t-2,t-3时刻的值来预测t时刻的值。还可以加入滚动统计特征如过去3期的均值、标准差、时间特征星期几、第几个月、以及外部变量。import lightgbm as lgb from sklearn.metrics import mean_absolute_error, mean_squared_error # 创建滞后特征 def create_lag_features(df, lags): df_lag df.copy() for lag in lags: df_lag[flag_{lag}] df_lag[value].shift(lag) return df_lag # 假设df是一个包含‘value’列的DataFrame索引为时间 df ts.reset_index() df.columns [date, value] lags [1, 2, 3, 12, 24] # 滞后1,2,3期以及去年同期12前年同期24 df_lag create_lag_features(df, lags) # 添加时间特征 df_lag[month] df_lag[date].dt.month df_lag[dayofweek] df_lag[date].dt.dayofweek df_lag df_lag.dropna() # 删除因创建滞后特征产生的NaN行 # 划分训练集和测试集 split_idx int(len(df_lag) * 0.8) train df_lag.iloc[:split_idx].drop([date], axis1) test df_lag.iloc[split_idx:].drop([date], axis1) X_train, y_train train.drop(value, axis1), train[value] X_test, y_test test.drop(value, axis1), test[value] # 训练LightGBM模型 model_lgb lgb.LGBMRegressor(n_estimators100, learning_rate0.05, random_state42) model_lgb.fit(X_train, y_train) # 预测与评估 y_pred model_lgb.predict(X_test) print(fMAE: {mean_absolute_error(y_test, y_pred):.4f}) print(fRMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.4f}) # 特征重要性可视化 lgb.plot_importance(model_lgb, figsize(10, 6)) plt.show()特征重要性图能直观显示哪些滞后项或时间特征对预测贡献最大这个分析过程本身就可以成为论文中的一个亮点说明你不仅用了模型还理解了数据的内在驱动因素。实操心得在竞赛中我通常将机器学习模型作为“第二梯队”。先用传统时序方法如SARIMA建立一个稳健的基线模型和预测结果。然后用LightGBM等模型再跑一次对比两者的预测精度如MAE, RMSE。如果机器学习模型提升显著可以在论文中重点讨论其优势如能融合更多特征如果提升不大则坚定使用传统模型因为其可解释性更强更符合很多赛题对“模型透明度”的隐含要求。切忌盲目追求复杂模型。4. 完整竞赛流程实现与关键环节剖析4.1 数据预处理与探索性分析模板竞赛拿到的原始数据常常是“脏”的。一个健壮的预处理流程能避免后续很多麻烦。我习惯将预处理和探索性分析写成一个函数或一个独立的Jupyter Notebook单元确保可复现。缺失值处理时间序列的缺失值不能简单删除或填0。常用方法包括前向填充、后向填充、线性插值或者使用该时间点的历史同期均值填充。选择哪种方法需要结合数据特点。例如气温数据用线性插值可能合理而日销售额数据用前向填充假设今天没记录就用昨天的值可能更符合业务逻辑。异常值检测与处理可以使用统计方法如3σ原则或可视化箱线图来识别异常值。处理方式可以是盖帽法将超出阈值的数据替换为阈值、直接删除如果异常点极少且有合理理由或者视为缺失值并用上述方法处理。关键是要在论文中记录你处理了哪些异常值以及理由。序列平稳化除了差分对数和幂变换也是常用方法特别是当序列方差随时间增长时异方差。可以通过观察序列图或使用Box-Cox变换来寻找最优的变换参数。# 一个综合的预处理与EDA示例函数 def ts_preprocess_and_eda(series, nameTime Series): 对输入序列进行预处理和基础EDA。 print(f {name} 分析报告 ) # 1. 基本信息 print(f1. 数据概况:) print(f 时间范围: {series.index.min()} 至 {series.index.max()}) print(f 数据长度: {len(series)}) print(f 缺失值数量: {series.isnull().sum()}) if series.isnull().sum() 0: # 使用前向填充处理缺失值 series_filled series.fillna(methodffill) print( *已使用前向填充处理缺失值*) else: series_filled series.copy() # 2. 描述性统计与异常值简单使用百分位法 Q1 series_filled.quantile(0.25) Q3 series_filled.quantile(0.75) IQR Q3 - Q1 lower_bound Q1 - 1.5 * IQR upper_bound Q3 1.5 * IQR outliers series_filled[(series_filled lower_bound) | (series_filled upper_bound)] print(f2. 异常值检测IQR法:) print(f 疑似异常值数量: {len(outliers)}) if len(outliers) 0: # 这里选择不处理仅记录实际竞赛中需根据背景决定 print(f 异常值索引示例: {outliers.index[:3].tolist()}) # 3. 可视化 fig, axes plt.subplots(2, 2, figsize(15, 10)) # 3.1 原始序列 axes[0, 0].plot(series_filled) axes[0, 0].set_title(Raw Time Series) axes[0, 0].grid(True) # 3.2 分布直方图 axes[0, 1].hist(series_filled, bins30, edgecolorblack) axes[0, 1].set_title(Distribution) axes[0, 1].axvline(series_filled.mean(), colorred, linestyle--, labelfMean: {series_filled.mean():.2f}) axes[0, 1].legend() # 3.3 滚动统计均值和标准差 rolling_mean series_filled.rolling(window12).mean() rolling_std series_filled.rolling(window12).std() axes[1, 0].plot(series_filled, labelOriginal) axes[1, 0].plot(rolling_mean, colorred, labelRolling Mean (12)) axes[1, 0].plot(rolling_std, colorblack, labelRolling Std (12)) axes[1, 0].set_title(Rolling Statistics) axes[1, 0].legend() # 3.4 季节性分解使用简单移动平均 from statsmodels.tsa.seasonal import seasonal_decompose decomposition seasonal_decompose(series_filled, modeladditive, period12) # 假设周期为12 decomposition.trend.plot(axaxes[1, 1], titleTrend Component) axes[1, 1].set_title(Decomposed Trend) plt.tight_layout() plt.show() # 4. 平稳性检验 print(3. 平稳性检验 (ADF Test):) adf_test(series_filled) return series_filled # 调用函数 cleaned_series ts_preprocess_and_eda(ts, 示例月度数据)这个函数生成了一份迷你报告和一组诊断图几乎涵盖了论文中“数据预处理与初步分析”章节所需的所有素材。你可以直接将这些输出整理到论文中。4.2 模型训练、验证与预测流程在竞赛中我们通常没有真正的“未来数据”来测试模型。因此在训练集上划分出一部分作为验证集来评估模型泛化能力至关重要。对于时间序列不能随机划分必须按时间顺序划分。def train_validate_test_split(series, test_size0.2): 按时间顺序划分训练集和测试集。 split_idx int(len(series) * (1 - test_size)) train series.iloc[:split_idx] test series.iloc[split_idx:] return train, test train_data, test_data train_validate_test_split(cleaned_series, test_size0.2) # 使用训练集训练模型以SARIMA为例 model_final SARIMAX(train_data, order(1,1,1), seasonal_order(1,1,1,12)).fit(dispFalse) # 在测试集上进行预测注意这是“模拟未来” forecast_test model_final.get_forecast(stepslen(test_data)) forecast_mean forecast_test.predicted_mean forecast_ci forecast_test.conf_int() # 计算测试集上的评估指标 from sklearn.metrics import mean_absolute_percentage_error mape mean_absolute_percentage_error(test_data, forecast_mean) * 100 print(f模型在预留测试集上的MAPE为: {mape:.2f}%) # 可视化对比 plt.figure(figsize(12,6)) plt.plot(train_data.index, train_data, labelTraining Data) plt.plot(test_data.index, test_data, labelActual Test Data, colororange) plt.plot(test_data.index, forecast_mean, labelForecast, colorred) plt.fill_between(test_data.index, forecast_ci.iloc[:, 0], forecast_ci.iloc[:, 1], colorred, alpha0.2, label95% Confidence Interval) plt.legend() plt.title(Model Performance on Test Set) plt.show()滚动预测是更严格的验证方式它模拟了实时预测的场景用截至t时刻的数据预测t1时刻然后将真实值加入训练集再预测t2时刻如此往复。这个过程计算量更大但评估结果更可靠。如果时间允许可以在论文中展示滚动预测的结果。4.3 预测结果的可视化与论文呈现技巧在数学建模论文中“一张好图胜过千言万语”。时间序列预测的结果可视化不仅要美观更要信息丰富、清晰易懂。核心图表历史拟合与未来预测图必须包含历史数据的拟合曲线、测试集的预测曲线或仅未来预测、以及置信区间。用不同颜色和线型清晰区分。预测误差分析图绘制预测值与实际值的残差序列图。理想的残差图应该围绕0轴随机波动无任何趋势或模式。如果存在模式说明模型有未捕捉的信息。模型诊断图如前文提到的SARIMAX的plot_diagnostics图展示残差的白噪声性和正态性。多模型对比图如果你尝试了多个模型如Holt-Winters, SARIMA, LightGBM将它们对测试集的预测结果画在同一张图上并标注各自的误差指标如MAPE, RMSE能直观显示孰优孰劣。论文表述要点描述模型时不要只写“我们使用了SARIMA模型”。要写出具体的模型阶数SARIMA(1,1,1)(1,1,1,12)并解释参数含义例如“其中季节性差分阶数D1表示我们对序列进行了季节性差分以消除年度周期性趋势”。展示结果时除了给出预测数值表格一定要强调预测区间。“模型预测下个月销售额为120万元其95%置信区间为[115, 125]万元”这样的表述比单纯一个点预测更有信息量也体现了对不确定性的考量。分析误差时主动分析预测误差可能的原因。是模型本身的局限还是期间发生了未在模型中考量的特殊事件如疫情、政策变化这种结合背景的分析能体现你的思考深度。5. 常见问题、避坑指南与竞赛实战技巧5.1 模型拟合失败与参数选择困境问题1模型无法收敛报出大量警告或错误。原因最常见的原因是参数(p,d,q)或(P,D,Q,s)设置不当导致模型不可逆或不平稳。或者数据中存在极端异常值。解决使用auto_arima自动定阶它内置了稳健的参数搜索逻辑。如果必须手动指定确保d和D的取值经过ADF检验和季节性检验确认。通常d和D取1或2就够了。在SARIMAX中设置enforce_stationarityFalse和enforce_invertibilityFalse可以绕过一些严格的数学条件检查有时能帮助模型拟合但需谨慎并检查最终残差是否符合要求。仔细检查并处理数据中的异常值。问题2auto_arima运行时间过长。原因参数搜索空间(max_p, max_q, max_P, max_Q)设置过大或者季节性周期s设置错误导致计算量剧增。解决合理限制搜索范围。对于竞赛数据量通常max_p, max_q, max_P, max_Q设为3或5足矣。使用stepwiseTrue默认进行逐步搜索比网格搜索快得多。准确判断季节周期s。通过业务常识月度12、季度4和自相关图峰值位置共同确定。问题3预测结果是一条直线或明显偏离实际。原因可能是模型未能捕捉到趋势或季节性或者用于预测的历史数据窗口太短。解决检查模型摘要中的参数是否显著p值小于0.05。如果不显著说明该参数项可能多余。检查是否正确地包含了趋势和季节性成分。对于Holt-Winters确保trend和seasonal参数设置正确对于SARIMA确保D季节性差分不为0且季节性参数P, Q至少有一个不为0。尝试使用包含外部变量的模型如SARIMAX的exog参数或者切换到能处理更复杂模式的机器学习模型。5.2 评估指标解读与模型选择在对比多个模型时需要依赖量化指标。常用的有MAE平均绝对误差。对异常值不敏感解释直观平均误差多少单位。RMSE均方根误差。对较大误差惩罚更重其量纲与原始数据相同。MAPE平均绝对百分比误差。适用于不同量级序列的比较但当真实值接近0时MAPE会趋于无穷大需小心使用。避坑技巧不要只看一个指标同时查看MAE和RMSE。如果RMSE远大于MAE说明预测中存在少量但误差很大的点需要检查这些点是否为特殊事件。在验证集上比较最终模型选择必须基于在未参与训练的验证集/测试集上的表现。在训练集上表现好可能是过拟合。考虑业务损失如果赛题有明确的业务背景如预测过高导致库存积压的成本与预测过低导致缺货的成本不同可以自定义一个与业务损失函数一致的评估指标。5.3 竞赛时间管理与论文写作要点数学建模竞赛是团队战也是时间战。在时间序列任务上我建议采用以下节奏第一天赛题发布日上午全队深入讨论赛题明确问题本质是预测、分类还是关联分析时间序列是核心还是辅助确定评估标准。下午数据预处理和探索性分析EDA。完成数据清洗、可视化并形成初步结论序列是否平稳有无趋势/季节性。这个阶段的产出图表和结论可以直接用于论文。晚上建立第一个简单的基线模型如简单指数平滑或Naïve Forecast。这个模型可能很简陋但它提供了一个性能下限并验证了整个代码流程的可行性。第二天核心建模日上午尝试2-3个核心模型。通常我会并行跑一个auto_arimaSARIMA、一个Holt-Winters、一个基于特征工程的LightGBM。记录每个模型的运行时间和在验证集上的初步表现。下午分析上午各模型的结果。选择1-2个最有希望的模型进行精细调优。例如根据auto_arima的结果微调SARIMA参数或为LightGBM调整特征组合。晚上确定最终模型并在整个训练集上重新训练因为之前可能为了验证而划分了部分数据。生成对“未来”的正式预测结果。开始撰写论文的“模型建立”部分。第三天论文整合与收尾日上午完成所有分析包括模型对比、误差分析、敏感性分析例如改变置信水平看预测区间变化。绘制所有最终图表。下午集中精力撰写和润色论文。确保从问题重述、假设、数据预处理、模型原理、求解过程到结果分析逻辑链条完整。图表清晰编号正确引用得当。晚上检查全文特别是摘要和结论。摘要要独立成文概括问题、方法、模型、结果和结论。最终排版、提交。论文写作心法假设要合理且明确例如“假设未来一年外部经济环境不发生剧烈变化”、“假设数据中的缺失值对整体趋势无系统性影响”。模型描述要具体给出模型全称、参数值、选择依据。公式如果简洁可以写上如果复杂可引用教材。图表是王牌确保每张图都有编号和标题在正文中要有对图表的描述和分析“如图1所示序列呈现明显的上升趋势和年度季节性…”。分析要深入不仅要说“模型预测准确”还要说“为什么准确”捕捉了趋势和季节性以及“误差从哪里来”可能忽略了某些突发事件。代码与附录将核心、整洁的代码放在附录中。评委有时会看代码来评估你的工作质量。
返回列表