🧑 博主简介:曾任某智慧城市类企业
算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个性化解决方案等服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:xf982831907)
💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
【机器学习案列-44】运输逾期预测机器学习案例
- 一、项目概述
- 1.1 项目背景
- 1.2 项目目标
- 1.3 数据集描述
- 二、数据探索与可视化
- 2.1 数据质量分析
- 2.2 运输状态分布
- 2.3 数值特征分布
- 2.4 特征相关性分析
- 2.5 仓库与承运商分析
- 三、特征工程
- 3.1 目标变量构建
- 3.2 异常值处理
- 3.3 特征构造
- 3.4 特征编码
- 3.5 最终特征列表(13个)
- 四、模型构建与评估
- 4.1 实验设计
- 4.2 模型列表及超参数
- 4.3 模型结果汇总(实际运行数据)
- 4.4 结果深度分析
- (1)模型表现两极分化
- (2)AUC-ROC 接近随机水平
- (3)最佳模型详细分析:Decision Tree
- 4.5 特征重要性分析
- 4.6 Precision-Recall 曲线分析
- 五、模型预测能力不足的原因分析
- 5.1 数据层面的原因
- 5.2 改进方向建议
- 六、业务洞察与建议
- 6.1 基于数据探索的关键发现
- 6.2 运营建议
- 七、结论
- 7.1 实验结论
- 7.2 核心价值
- 项目的完整代码可以联系我获取:
一、项目概述
1.1 项目背景
本案例基于美国物流绩效数据集(US Logistics Performance Dataset),该数据集包含2000 条模拟的美国各地物流运输记录。系统涵盖7 家承运商(UPS、FedEx、DHL、Amazon Logistics、LaserShip、OnTrac、USPS)从10 个仓库发往美国各大城市的运输数据,时间跨度为 2023 年全年。数据集包含有意设计的现实世界特征,如缺失值(约 2%)和异常值(约 3%),适合用于物流优化和延迟预测方面的机器学习模型开发。
1.2 项目目标
构建机器学习分类模型,预测货物运输是否会逾期(Delayed),辅助物流决策优化:
- 业务目标:提前识别高风险运输,采取干预措施降低逾期率
- 技术目标:在不平衡数据条件下,尽可能提升逾期识别的召回率
- 优化方向:为承运商选择、路线优化、风险预警提供数据支持
1.3 数据集描述
| 字段 | 类型 | 说明 |
|---|---|---|
| Shipment_ID | string | 运输唯一编号(SH10000~SH11165) |
| Origin_Warehouse | string | 出发仓库(10个:MIA/LA/BOS/SF/ATL/CHI/HOU/SEA/NYC/DEN) |
| Destination | string | 目的地城市(10个城市) |
| Carrier | string | 承运商(7家) |
| Shipment_Date | date | 发货日期 |
| Delivery_Date | date | 送达日期(含32个缺失值) |
| Weight_kg | float | 货物重量(kg) |
| Cost | float | 运输成本($,含41个缺失值) |
| Status | string | 运输状态:Delivered/Delayed/Lost/In Transit/Returned |
| Distance_miles | int | 运输距离(英里) |
| Transit_Days | int | 运输天数 |
二、数据探索与可视化
2.1 数据质量分析
缺失值统计:
| 列名 | 缺失数量 | 缺失比例 |
|---|---|---|
| Delivery_Date | 32 | 1.6% |
| Cost | 41 | 2.05% |
| 其他列 | 0 | 0% |
` — 缺失值集中在 Delivery_Date 和 Cost 两列。
处理策略:
Delivery_Date:直接删除(不参与建模)Shipment_Date:直接删除(不参与建模)Cost:使用中位数($196.42)填充
2.2 运输状态分布
| 状态 | 数量 | 占比 |
|---|---|---|
| Delivered(已送达) | 1,648 | 82.4% |
| Delayed(逾期) | 199 | 10.0% |
| In Transit(在途中) | 76 | 3.8% |
| Lost(丢失) | 45 | 2.3% |
| Returned(退回) | 32 | 1.6% |
核心发现:逾期(Delayed)占 10.0%(199/2000),属于中度不平衡分类问题。正负样本比约为 1:9,需要使用类别权重平衡策略(class_weight='balanced')或过采样/欠采样技术。
2.3 数值特征分布
| 特征 | 均值 | 中位数 | 分布特征 |
|---|---|---|---|
| Weight_kg | 30.2 | 20.7 | 严重右偏,存在极端异常值(max=5404.2 kg) |
| Cost | $205.2 | $196.4 | 右偏分布,少数运输成本极高 |
| Distance_miles | 1,275.9 | 1,262.5 | 近似均匀分布,均值与中位数接近 |
| Transit_Days | 4.2 | 4.0 | 离散型分布,峰值在 3~5 天 |
2.4 特征相关性分析
| 特征对 | 相关系数 | 解读 |
|---|---|---|
| Transit_Days ↔ Distance_miles | 0.761 | 强正相关:距离越远运输天数越多 |
| Cost ↔ Distance_miles | 0.436 | 中度正相关:距离越远成本越高 |
| Cost ↔ Transit_Days | 0.343 | 弱中度正相关 |
| Cost ↔ Weight_kg | 0.021 | 几乎无关 |
| Distance_miles ↔ Weight_kg | -0.010 | 几乎无关 |
| Transit_Days ↔ Weight_kg | -0.006 | 几乎无关 |
关键发现:重量与成本、距离几乎不相关,说明该数据集中重量并不是成本的主要决定因素。距离与运输天数高度相关(r=0.761),存在多重共线性风险。
2.5 仓库与承运商分析
各仓库运输量(从高到低):
| 仓库 | 运输量 | 逾期率 |
|---|---|---|
| Warehouse_LA | ~220 | 10.3% |
| Warehouse_SF | ~215 | 11.2% |
| Warehouse_HOU | ~210 | 11.8%(最高) |
| Warehouse_ATL | ~205 | 10.7% |
| Warehouse_MIA | ~200 | 11.5% |
| Warehouse_CHI | ~195 | 10.8% |
| Warehouse_DEN | ~192 | 8.0% |
| Warehouse_BOS | ~190 | 8.2% |
| Warehouse_SEA | ~188 | 8.8% |
| Warehouse_NYC | ~170 | 5.8%(最低) |
各承运商逾期率(从高到低):
| 承运商 | 逾期率 |
|---|---|
| DHL | ~14%(最高) |
| Amazon Logistics | ~12.5% |
| OnTrac | ~9.5% |
| UPS | ~9% |
| FedEx | ~8.5% |
| LaserShip | ~8.5% |
| USPS | ~7%(最低) |
各目的地逾期率 Top 10:
| 目的地 | 逾期率 |
|---|---|
| Boston | ~16.5%(最高) |
| Detroit | ~14% |
| Phoenix | ~11.5% |
| New York | ~11% |
| Seattle | ~10% |
| Dallas | ~9.5% |
| Minneapolis | ~9.5% |
| San Francisco | ~9% |
| Chicago | ~9% |
| Houston | ~8.5% |
还有一些距离vs成本散点分析、运输天数箱线图等分析不在进行一一展示;
三、特征工程
3.1 目标变量构建
Is_Delayed = 1 (Status == "Delayed") → 199 条(10.0%) Is_Delayed = 0 (其他所有状态) → 1801 条(90.0%)3.2 异常值处理
使用IQR(四分位距)方法对 Cost 和 Weight_kg 进行截断处理:
- 下界 = Q1 - 1.5 × IQR
- 上界 = Q3 + 1.5 × IQR
- 超出范围的数值被截断到边界值(Cap 处理,不删除样本)
3.3 特征构造
| 新特征 | 计算方式 | 说明 |
|---|---|---|
| Cost_per_kg | Cost / (Weight_kg + 0.01) | 单位重量成本 |
| Cost_per_mile | Cost / (Distance_miles + 1) | 单位距离成本 |
| Days_per_mile | Transit_Days / (Distance_miles + 1) | 单位距离运输天数(运输效率指标) |
| Weight_Category | pd.cut(Weight_kg, 5级) | 重量分级: Light/Medium/Heavy/Very_Heavy/Extra_Heavy |
| Distance_Category | pd.cut(Distance_miles, 5级) | 距离分级: Short/Medium/Long/Very_Long/Extra_Long |
| Cost_Category | pd.cut(Cost, 5级) | 成本分级: Low/Medium/High/Very_High/Extra_High |
| Warehouse_City | 从仓库名映射 | 仓库所在城市 |
3.4 特征编码
- Label Encoding:对 Carrier、Warehouse_City、Destination、Weight_Category、Distance_Category、Cost_Category 进行标签编码
- Standard Scaling:仅对 Logistic Regression 和 KNN 模型使用 StandardScaler 标准化
3.5 最终特征列表(13个)
数值特征(7个):Weight_kg, Cost, Distance_miles, Transit_Days, Cost_per_kg, Cost_per_mile, Days_per_mile
编码特征(6个):Carrier_Encoded, Warehouse_Encoded, Destination_Encoded, Weight_Cat_Encoded, Dist_Cat_Encoded, Cost_Cat_Encoded
四、模型构建与评估
4.1 实验设计
| 参数 | 设置 |
|---|---|
| 数据拆分 | 80% 训练(1600条)/ 20% 测试(400条) |
| 随机种子 | 42 |
| 分层采样 | 是(stratify=y),保证训练/测试集逾期比例一致 |
| 交叉验证 | 5 折分层交叉验证(StratifiedKFold) |
| 类别不平衡处理 | class_weight=‘balanced’ / scale_pos_weight / is_unbalance |
4.2 模型列表及超参数
| 模型 | 关键参数 |
|---|---|
| Logistic Regression | max_iter=1000, class_weight=‘balanced’ |
| Decision Tree | max_depth=8, class_weight=‘balanced’ |
| Random Forest | n_estimators=200, max_depth=10, class_weight=‘balanced’ |
| Gradient Boosting | n_estimators=200, max_depth=5, learning_rate=0.1 |
| KNN | n_neighbors=10, weights=‘distance’ |
| XGBoost | n_estimators=200, max_depth=6, lr=0.1, scale_pos_weight=auto |
| LightGBM | n_estimators=200, max_depth=6, lr=0.1, is_unbalance=True |
4.3 模型结果汇总(实际运行数据)
| 模型 | Accuracy | Precision | Recall | F1-Score | AUC-ROC | CV F1均值 | CV F1标准差 |
|---|---|---|---|---|---|---|---|
| Logistic Regression | 0.5000 | 0.1304 | 0.3750 | 0.1304 | 0.4831 | 0.1642 | 0.0279 |
| Decision Tree | 0.5425 | 0.1719 | 0.4750 | 0.1719 | 0.5152 | 0.1480 | 0.0290 |
| Random Forest | 0.8925 | 0.0000 | 0.0000 | 0.0000 | 0.4496 | 0.0111 | 0.0222 |
| Gradient Boosting | 0.8850 | 0.0000 | 0.0000 | 0.0000 | 0.4488 | 0.0424 | 0.0377 |
| KNN | 0.9000 | 0.0000 | 0.0000 | 0.0000 | 0.5092 | 0.0000 | 0.0000 |
| XGBoost | 0.8575 | 0.0656 | 0.0500 | 0.0656 | 0.4397 | 0.0413 | 0.0457 |
| LightGBM | 0.8575 | 0.0952 | 0.0750 | 0.0952 | 0.4707 | 0.0834 | 0.0478 |
4.4 结果深度分析
(1)模型表现两极分化
实际运行结果揭示了一个关键现象——模型表现呈现两极分化:
- 激进型模型(Random Forest、Gradient Boosting、KNN):Accuracy 高达 88.5%~90%,但Recall=0——它们将所有样本都预测为"未逾期",完全无法识别逾期运输。高 Accuracy 是类别不平衡下的"伪像"。
- 敏感型模型(Decision Tree、Logistic Regression):能识别出部分逾期(Recall 37.5%~47.5%),但 Precision 极低(13%~17.2%),产生大量误报。
- 中间型模型(XGBoost、LightGBM):仅识别出极少数逾期(Recall 5%~7.5%),效果有限。
(2)AUC-ROC 接近随机水平
所有模型的 AUC-ROC 都在0.44~0.52之间,接近随机猜测的 0.5 水平:
| 模型 | AUC-ROC | 判别能力 |
|---|---|---|
| Decision Tree | 0.5152(最高) | ≈ 随机水平 |
| KNN | 0.5092 | ≈ 随机水平 |
| Logistic Regression | 0.4831 | < 随机水平 |
| LightGBM | 0.4707 | < 随机水平 |
| Random Forest | 0.4496 | < 随机水平 |
| Gradient Boosting | 0.4488 | < 随机水平 |
| XGBoost | 0.4397 | < 随机水平 |
所有 ROC 曲线紧贴对角线(随机基线),无明显分离。
(3)最佳模型详细分析:Decision Tree
混淆矩阵(Decision Tree,测试集 400 条):
| 预测:未逾期 | 预测:逾期 | |
|---|---|---|
| 真实:未逾期 | 198 | 162 |
| 真实:逾期 | 21 | 19 |
分类报告:
| 类别 | Precision | Recall | F1-Score | Support |
|---|---|---|---|---|
| 未逾期 | 0.90 | 0.55 | 0.68 | 360 |
| 逾期 | 0.10 | 0.47 | 0.17 | 40 |
| 加权平均 | 0.82 | 0.54 | 0.63 | 400 |
解读:
- 测试集中有 40 条逾期样本,模型正确识别了 19 条(Recall=47.5%)
- 但同时误判了 162 条未逾期样本为"逾期"(大量误报,Precision 仅 10.5%)
- 整体 Accuracy 仅 54.25%——接近随机水平
4.5 特征重要性分析
各模型的特征重要性排名存在差异,但以下特征在多数模型中排名靠前:
| 排名 | Decision Tree | Random Forest | Gradient Boosting | XGBoost | LightGBM |
|---|---|---|---|---|---|
| 1 | Cost_per_kg | Cost_per_kg | Cost | Cost_per_kg | Days_per_mile |
| 2 | Cost | Weight_kg | Cost_per_mile | Distance_miles | Weight_kg |
| 3 | Weight_kg | Cost_per_mile | Cost_per_kg | Weight_kg | Cost_per_mile |
| 4 | Distance_miles | Cost | Days_per_mile | Cost | Cost |
| 5 | Days_per_mile | Days_per_mile | Weight_kg | Carrier_Encoded | Cost_per_kg |
核心发现:
- Cost_per_kg(单位重量成本)在 4/5 的树模型中排名第一,是最重要的预测特征
- Weight_kg(重量)在所有模型中均进入 Top 5
- 衍生特征(Cost_per_mile、Days_per_mile、Cost_per_kg)贡献显著,说明特征工程有效
- Transit_Days重要性普遍较低,与相关性分析一致——它本身与逾期关系不强
4.6 Precision-Recall 曲线分析
在 10% 正样本比例下,随机猜测的 Precision 基线为 10%。从 PR 曲线来看:
- Decision Tree在 Recall > 0.2 后 Precision 稳定在 10%~15%,略高于基线
- Logistic Regression表现类似,Precision 在 8%~12% 区间波动
- 其余模型的 PR 曲线接近或低于基线
五、模型预测能力不足的原因分析
本次实验中所有模型的预测能力均较弱(AUC 接近 0.5),需要从数据和业务角度分析原因:
5.1 数据层面的原因
| 原因 | 分析 |
|---|---|
| 特征预测力不足 | 现有特征(重量、成本、距离、天数、承运商、仓库、目的地)与"是否逾期"之间的关联性本身就很弱。逾期可能更多取决于外部因素(天气、交通、节假日拥堵、仓库操作效率等),而这些信息在数据集中不存在。 |
| 类别不平衡 | 正样本仅占 10%(199/2000),模型学习到的逾期模式有限 |
| 模拟数据特性 | 该数据集为模拟生成数据,逾期标签可能是随机分配的,与特征之间没有强因果关系 |
| 多重共线性 | Distance_miles 与 Transit_Days 高度相关(r=0.761),部分特征信息冗余 |
5.2 改进方向建议
| 方向 | 具体措施 | 预期效果 |
|---|---|---|
| 增加特征 | 引入季节性特征(月份/季度)、节假日标记、天气数据、交通拥堵指数 | 可能显著提升模型性能 |
| 高级采样 | 使用 SMOTE、ADASYN 等过采样技术,或 SMOTEENN 混合采样 | 缓解类别不平衡 |
| 超参调优 | 使用 Optuna/Hyperopt 进行贝叶斯超参优化 | 提升 5%~15% |
| 阈值调优 | 调整分类阈值(降低阈值提高 Recall) | 可根据业务需求灵活调整 |
| 集成策略 | Stacking/Voting 集成多个弱模型 | 提升鲁棒性 |
| 异常检测思路 | 将逾期视为异常,使用 Isolation Forest、One-Class SVM 等方法 | 适合极端不平衡场景 |
六、业务洞察与建议
6.1 基于数据探索的关键发现
- 承运商差异显著:DHL 逾期率最高(~14%),USPS 最低(~7%),差距达 2 倍
- 目的地影响明显:Boston 目的地逾期率高达 16.5%,Houston 仅 8.5%
- 仓库差异:HOU(休斯顿)仓库逾期率 11.8% 最高,NYC(纽约)5.8% 最低
- 重量等级影响有限:不同重量等级的逾期率差异不大(9.3%~10.5%)
- 特征间关系:距离与运输天数强相关(r=0.761),重量与成本几乎无关(r=0.021)
6.2 运营建议
| 建议 | 优先级 | 依据 |
|---|---|---|
| 对 Boston、Detroit 目的地的运输加强跟踪 | 高 | 逾期率 14%~16.5%,远高于平均 |
| 评估 DHL 承运商的服务质量 | 高 | 逾期率 14%,显著高于其他承运商 |
| 对 HOU/MIA/SF 仓库出发的运输预留更多缓冲时间 | 中 | 逾期率 11%~12% |
| 优先选择 USPS/FedEx 承运低时效要求的货物 | 中 | 逾期率最低(7%~8.5%) |
| 建立实时运输监控系统 | 高 | 当前数据无法有效预测逾期,需更多实时数据 |
| 收集天气、节假日、交通等外部数据 | 高 | 现有特征预测力不足,需外部数据补充 |
七、结论
7.1 实验结论
| 维度 | 结论 |
|---|---|
| 最佳模型 | Decision Tree(F1=0.1719, AUC=0.5152),仅略优于随机 |
| 预测能力 | 所有模型的 AUC-ROC 均在 0.44~0.52 之间,预测能力接近随机水平 |
| 根本原因 | 现有特征与逾期标签之间缺乏强关联性,逾期行为可能由数据集中未包含的外部因素驱动 |
| 数据探索价值 | 虽然预测模型效果不佳,但 EDA 揭示了有价值的业务洞察(承运商/目的地/仓库的逾期率差异) |
7.2 核心价值
本案例的真正价值不在于构建了一个高精度的预测模型(当前数据不支持),而在于:
- 完整的 ML 工程实践:从数据清洗、特征工程、模型训练到评估的全流程
- 不平衡分类问题的真实挑战:展示了在类别不平衡 + 弱信号条件下模型的真实表现
- 数据探索的业务价值:通过 EDA 发现了承运商、目的地、仓库维度的逾期率差异
- 模型诊断能力:通过分析"为什么模型不好",理解了特征预测力的局限性
- 改进方向明确:为后续优化提供了清晰的路径(增加外部特征、高级采样、阈值调优等)
项目的完整代码可以联系我获取:
注:博主目前收集了6900+份相关数据集,有想要的可以领取部分数据,关注下方公众号或添加微信: