当前位置: 首页 > news >正文

五一数学建模B题复盘:用Python搞定快递需求预测与成本优化(附完整代码)

数学建模竞赛实战:Python实现快递需求预测与成本优化全流程解析

去年参加五一数学建模竞赛的经历让我深刻体会到,从问题理解到代码落地的过程中藏着无数"魔鬼细节"。本文将围绕快递需求分析赛题,用Python工具链完整还原特征工程、时序预测、分类建模、路径优化四大核心环节,特别分享那些在比赛文档里不会写的实操技巧。

1. 数据清洗与特征工程实战

拿到快递运输数据的第一件事不是急着建模,而是理解数据背后的业务逻辑。我们使用的数据集包含发货城市、收货城市、日期、运输量等字段,但原始数据就像未经雕琢的玉石——需要先解决几个关键问题:

import pandas as pd # 读取数据时的常见陷阱 raw_data = pd.read_excel('附件1.xlsx', parse_dates=['日期']) # 必须显式指定日期解析 print(f"时间范围: {raw_data['日期'].min()} 至 {raw_data['日期'].max()}")

典型数据问题及处理方案

问题类型检测方法处理方案代码示例
缺失值isna().sum()时间序列线性插值data['运输量'].interpolate(method='time')
异常值3σ原则或IQR盖帽法处理np.clip(data['运输量'], lower, upper)
日期不连续生成完整日期范围重新采样填充pd.date_range(start, end).difference(data['日期'])

提示:快递数据中0值需要谨慎处理——可能是无需求也可能是数据缺失,建议结合业务判断

构建有效的特征需要从时间和空间两个维度思考:

# 时间特征扩展示例 data['星期'] = data['日期'].dt.dayofweek data['是否周末'] = data['星期'].isin([5,6]).astype(int) data['月份'] = data['日期'].dt.month # 空间特征构建 city_pairs = data.groupby(['发货城市','收货城市'])['运输量'].mean().reset_index() data = data.merge(city_pairs, on=['发货城市','收货城市'], suffixes=('','_均值'))

2. 运输量预测模型构建

预测特定城市对的日运输量是个典型的时序回归问题。我们测试了多种算法后发现LightGBM+时序特征的组合在验证集上表现最优。以下是关键实现步骤:

2.1 数据准备与验证策略

由于数据具有明显的时间属性,绝对不能使用随机划分:

from sklearn.model_selection import TimeSeriesSplit tss = TimeSeriesSplit(n_splits=5) for train_idx, test_idx in tss.split(X): X_train, X_test = X.iloc[train_idx], X.iloc[test_idx] y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]

2.2 特征重要性分析

构建完模型后,用SHAP值分析发现影响预测的关键因素:

import lightgbm as lgb import shap model = lgb.LGBMRegressor() model.fit(X_train, y_train) explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test)

预测效果对比表

模型MAERMSE训练时间(s)
SVR45.268.70.81120
随机森林39.862.30.8485
LightGBM32.154.60.8815

注意:实际比赛中需要预测多天的数据时,建议采用滚动预测策略,用前一天的预测结果作为后一天的特征

3. 运输通断分类模型

判断某条线路是否能正常发货本质上是个二分类问题,但样本极度不均衡——正常线路占比超过90%。我们采用了一套组合方案:

from imblearn.over_sampling import SMOTE from sklearn.ensemble import GradientBoostingClassifier # 处理样本不均衡 smote = SMOTE(random_state=42) X_res, y_res = smote.fit_resample(X_train, y_train) # 使用类别权重 model = GradientBoostingClassifier( loss='deviance', max_depth=5, n_estimators=200, min_samples_leaf=50 )

分类阈值优化技巧

from sklearn.metrics import precision_recall_curve probs = model.predict_proba(X_test)[:, 1] precision, recall, thresholds = precision_recall_curve(y_test, probs) # 找到满足业务需求的最佳阈值 optimal_idx = np.argmax(precision * recall) optimal_threshold = thresholds[optimal_idx]

4. 运输路径成本优化

这是典型的带约束的整数规划问题,我们选择PuLP库实现。核心在于如何将实际问题转化为数学模型:

from pulp import * # 初始化问题 prob = LpProblem("Transport_Cost_Minimization", LpMinimize) # 决策变量:路径选择 x = LpVariable.dicts("route", [(i,j,k) for i in origins for j in destinations for k in paths[(i,j)]], cat='Binary') # 目标函数:总成本最小化 prob += lpSum([fixed_cost[k]*x[(i,j,k)] + variable_cost[(i,j,k)]*demand[(i,j)] for (i,j,k) in x]) # 约束条件:每个OD对不超过5条路径 for i in origins: for j in destinations: prob += lpSum([x[(i,j,k)] for k in paths[(i,j)]]) <= 5 # 求解 status = prob.solve(PULP_CBC_CMD(msg=False))

优化效果对比

日期原始方案成本优化后成本降本比例
4-23¥184,520¥152,38017.4%
4-24¥192,650¥158,92017.5%
4-25¥178,930¥147,21017.7%

在实现过程中发现几个关键点:

  1. 将固定成本分摊到单位运输量可以简化模型
  2. 提前过滤掉运输量为0的OD对能大幅减少计算量
  3. 对无法满足的约束条件需要设计fallback机制

5. 完整项目架构设计

为保证代码可维护性和复现性,推荐以下项目结构:

/project │── /data # 原始数据 │── /notebooks # 探索性分析 │── /src │ ├── features # 特征工程 │ ├── models # 各问题模型 │ └── utils # 工具函数 │── config.yaml # 参数配置 │── pipeline.py # 主流程控制

关键依赖版本:

# requirements.txt pandas==1.5.3 numpy==1.23.5 scikit-learn==1.2.2 lightgbm==3.3.5 pulp==2.7.0

在最终提交的代码中,我特别添加了以下保障措施:

  • 所有随机种子固定
  • 关键步骤的输入输出检查
  • 运行时长预估和进度条
  • 中间结果的自动缓存

比赛结束后复盘,最大的收获不是奖项而是这种从实际问题到数学建模再到代码实现的完整闭环经验。下次如果再遇到类似问题,我会更关注数据中的异常模式挖掘,尝试将图神经网络应用到运输网络建模中。

http://www.gsyq.cn/news/1424550.html

相关文章:

  • 为什么你的游戏手柄需要ViGEmBus:终极Windows控制器兼容解决方案
  • 用CTGAN搞定表格数据生成:从原理到实战,手把手教你生成高质量合成数据
  • 自媒体算法获流逻辑:通过受众定位与内容迭代,沉淀精准垂直流量
  • C51开发中NULL指针比较问题与内存管理技巧
  • 用Python+LMDI模型拆解碳排放:手把手教你分析GDP、人口、能源结构对碳排的贡献
  • 别再乱升级内核了!CentOS 7稳定升级指南:用ELRepo长期支持版+GRUB参数避坑‘pstore’错误
  • web第二次课后作业
  • Java+AI 实现极简 RAG+Agent 智能问答(入门必看)
  • 告别图片变形!手把手教你用Python+OpenCV实现YOLO必备的Letterbox自适应缩放(附完整代码)
  • 2026现阶段,武安市单招培训源头公司哪家可靠?深度剖析武安市新途教育咨询有限公司 - 2026年企业资讯
  • 光伏螺栓技术全解析:材质选型防腐与售后保障推荐 - 优质品牌商家
  • OpenCL GPU内存检测架构设计与实践指南
  • 2026光伏螺栓选型推荐及靠谱厂家技术维度解析:河北10.9s钢结构螺栓/河北光伏螺栓/河北六角螺栓/排行一览 - 优质品牌商家
  • 云克隆多因子检测技术|标准曲线拟合实操教程
  • 从SBM到超效率SBM:一篇讲清DEA模型家族的区别与Python选型指南
  • 2026年4g远传水表实测评测:四川超声波水表/四川铜阀门/四川闸阀/四川阀门/四川预付费水表/七大维度选型参考 - 优质品牌商家
  • 破局全厂数据孤岛:移动机器人统一调度与数字孪生演进指南
  • 光OFDM系统中非线性效应及缓解方法解析【附数据】
  • 探秘2026年当下漳州可靠的水果店运营源头公司:全链路赋能新零售 - 2026年企业资讯
  • 基于Arduino与Visuino的线性执行器时序控制系统设计与实现
  • 2026年q2第三方控价选型推荐:线上控价/专业控价/京东控价/化妆品控价/品牌控价/技术与服务双维度解析 - 优质品牌商家
  • 无标识视觉感知下核电厂区外来人员轨迹建模与推演技术解析
  • Hotkey Detective:3分钟精准定位Windows热键冲突的终极方案
  • D41: 多租户架构的 AI 服务设计
  • 2026年5月,专业儿童帽企业的硬核实力与深度服务解析 - 2026年企业资讯
  • 合作获客平台怎么选?10大渠道深度解析,智能匹配工具成新趋势!
  • 2026年q2:美业新商机/美业项目/自主创业项目/连锁品牌加盟/EF时尚假发核心业务与技术体系全解析 - 优质品牌商家
  • C++23标准几个特性结合使用 学习阶段可能有点过度设计,评论区有源码
  • 基于Arduino与超声波传感器的高尔夫自动喂球器设计与实现
  • 2026年AI写作辅助平台深度评测:6款工具专业水准得分排名