当前位置:首页>python>数学建模三大高频模型Python实战:预测·优化·分类

数学建模三大高频模型Python实战:预测·优化·分类

  • 2026-10-11 06:48:38
数学建模三大高频模型Python实战:预测·优化·分类

数学建模三大高频模型Python实战:预测·优化·分类

数学建模竞赛中,有三类问题几乎每年必考:未来会怎样(预测)、怎样最好(优化)、属于哪一类(分类)。掌握这三类模型的Python实现,是备赛同学最直接的能力升级路径。

这篇文章不讲复杂理论,只讲「能跑通、能改参数、能直接用在比赛里」的代码实战。建议把代码复制到你的Jupyter Notebook里,边跑边理解。

一、时间序列预测:ARIMA模型实战

预测类题目在国赛中非常常见,比如预测人口、销量、气温、股价、疫情发展趋势等。ARIMA模型是经典且稳健的选择,适合短期到中期预测。

什么时候用ARIMA?

  • 数据是时间序列,且有一定趋势或季节性
  • 样本量不是特别小(至少30期以上)
  • 你需要一个可解释、可复现的基线模型

模型思路简述

ARIMA(p,d,q) 包含三个部分:AR是自回归,用过去值预测当前值;I是差分,把非平稳序列变成平稳序列;MA是移动平均,用过去预测误差修正当前值。比赛中不必手动推参数,可以用AIC准则自动选择。

Python代码示例

import pandas as pd import numpy as np from statsmodels.tsa.arima.model import ARIMA import matplotlib.pyplot as plt # 构造示例数据:某城市过去60个月的客流量 dates = pd.date_range(start='2021-01', periods=60, freq='M') np.random.seed(42) values = np.cumsum(np.random.randn(60)) + 100 ts = pd.Series(values, index=dates) # 拟合ARIMA(1,1,1)模型 model = ARIMA(ts, order=(1, 1, 1)) result = model.fit() # 预测未来12个月 forecast = result.get_forecast(steps=12) forecast_mean = forecast.predicted_mean forecast_ci = forecast.conf_int() # 可视化 plt.figure(figsize=(10, 5)) plt.plot(ts, label='历史数据') plt.plot(forecast_mean.index, forecast_mean, label='预测值', color='red') plt.fill_between(forecast_ci.index, forecast_ci.iloc[:, 0], forecast_ci.iloc[:, 1], color='pink', alpha=0.3) plt.title('基于ARIMA的月度客流量预测') plt.legend() plt.show() 

实战建议

  • 先做ADF检验判断平稳性,如果不平稳就进行差分
  • 用AIC或BIC自动选择(p,d,q)参数,不要拍脑袋定参数
  • 预测结果要给出置信区间,而不是单点值
  • 如果数据有季节性,可以尝试SARIMA模型

替代方案

如果ARIMA效果一般,可以尝试指数平滑、Prophet、LSTM神经网络或XGBoost回归。建议在建模时至少对比两种方法,用均方误差或平均绝对误差作为评价标准。

二、线性规划与整数规划:资源分配的最优解

优化类题目几乎每年国赛都有,比如生产调度、物流配送、投资组合、人员排班、资源配置等。掌握线性规划和整数规划,可以解决大部分基础优化问题。

什么时候用线性规划?

  • 目标函数是线性的(最大化利润、最小化成本)
  • 约束条件可以写成线性不等式
  • 决策变量是连续的或整数的

模型思路简述

任何一个优化问题都可以抽象成三个要素:决策变量、目标函数、约束条件。线性规划要求这三个要素都是线性的。如果决策变量必须是整数(比如车辆数、人员数),那就是整数规划。PuLP是Python里非常友好的建模库,把数学语言直接翻译成代码即可。

Python代码示例:PuLP求解生产计划

import pulp # 定义问题:最大化利润 model = pulp.LpProblem('Production_Plan', pulp.LpMaximize) # 决策变量:产品A和B的产量 x = pulp.LpVariable('Product_A', lowBound=0, cat='Integer') y = pulp.LpVariable('Product_B', lowBound=0, cat='Integer') # 目标函数:利润 = 3*x + 5*y model += 3 * x + 5 * y # 约束条件 model += 2 * x + y <= 100 # 原材料1限制 model += x + 3 * y <= 150 # 原材料2限制 # 求解 model.solve() print('产品A产量:', pulp.value(x)) print('产品B产量:', pulp.value(y)) print('最大利润:', pulp.value(model.objective)) 

实战建议

  • 把实际问题抽象成「目标函数 + 约束条件」是建模关键,动笔前先列清楚
  • 如果问题规模小,整数规划可以直接求解;规模大时考虑启发式算法
  • 结果要做敏感性分析,比如原材料上限变化对利润的影响
  • 多目标优化时,可以用加权法或帕累托前沿分析

替代方案

对于非线性目标或复杂约束,可以尝试scipy.optimize.minimize、遗传算法、模拟退火或粒子群算法。选择标准不是模型多高级,而是能否稳定跑出合理结果。

三、机器学习分类:随机森林预测客户流失

分类问题在国赛中也很常见,比如信用评估、疾病诊断、客户流失预测、垃圾邮件识别、故障检测等。随机森林是一个鲁棒性强、调参友好的模型,非常适合作为基线模型。

什么时候用随机森林?

  • 数据集有多个特征,特征之间关系复杂
  • 你需要一个泛化能力强的基线模型
  • 比赛时间有限,不想花大量时间调参

模型思路简述

随机森林是集成学习的代表。它先构造多棵决策树,每棵树用随机抽取的样本和特征训练,最后把多棵树的结果投票或平均。因为引入了随机性,模型不容易过拟合,对异常值也比较鲁棒。

Python代码示例

from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, classification_report # 构造示例数据集 X, y = make_classification(n_samples=1000, n_features=10, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练随机森林模型 clf = RandomForestClassifier(n_estimators=100, random_state=42) clf.fit(X_train, y_train) # 预测与评估 y_pred = clf.predict(X_test) print('准确率:', accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred)) # 特征重要性 importances = pd.Series(clf.feature_importances_) print('特征重要性:') print(importances.sort_values(ascending=False)) 

实战建议

  • 比赛前准备好一套完整的数据预处理模板:缺失值填充、异常值处理、特征编码
  • 不要只给一个准确率,要给出混淆矩阵、召回率、精确率等指标
  • 利用特征重要性做解释,让评委理解你的模型为什么有效
  • 样本不平衡时,可以使用过采样、欠采样或调整类别权重

替代方案

如果随机森林表现不够理想,可以尝试XGBoost、LightGBM、支持向量机或神经网络。对于二分类问题,逻辑回归也是一个优秀的可解释基线模型。

四、三个模型的组合使用思路

真实的国赛题目往往不是单一模型能解决的。比如一道智慧物流题,可能需要:

  • 预测
    :用ARIMA预测未来一周各区域的订单量
  • 优化
    :用整数规划安排配送车辆和路线
  • 分类
    :用随机森林把订单按紧急程度分类

把这三类模型组合起来,就能形成一条完整的解题链路。这也是评委最喜欢看到的「系统工程思维」。

五、模型选择速查表

遇到新题目不知道用哪个模型?参考下面这张速查表:

问题类型
常见关键词
推荐模型
预测未来值
未来、趋势、增长、销量
ARIMA、指数平滑、XGBoost
资源分配
最大利润、最小成本、调度
线性规划、整数规划、遗传算法
类别判断
是否、分类、识别、评估
随机森林、逻辑回归、SVM
综合评价
排名、打分、权重
AHP、熵权法、TOPSIS
路径网络
最短、最优路径、网络流
Dijkstra、最小生成树、网络流

记住,速查表只是起点。真正决定用哪个模型的,是数据特点、问题约束和你的团队熟悉度。

六、给你的即战力工具包

  • 数据处理
    :pandas、numpy
  • 可视化
    :matplotlib、seaborn
  • 预测
    :statsmodels、scikit-learn
  • 优化
    :pulp、scipy.optimize
  • 分类
    :scikit-learn、xgboost

建议你现在就把上面的三段代码分别跑一遍,然后尝试修改参数、替换数据。只有自己跑通过,比赛时才不会手忙脚乱。

数学建模不是背公式,而是把问题翻译成代码、让代码给出答案。这个夏天,让Python成为你的第二大脑。

最新文章

随机文章