基于约 10k 条油井生产数据预测油气管道腐蚀速率的二分类项目。对比 5 种传统机器学习模型与 2 种深度学习模型的效果。
目标: 根据 8 个油井生产参数预测腐蚀速率 (CR) 是否为高 (CR > 0.211) / 低 (CR ≤ 0.211)。
| 模型 | 调参后准确率 |
|---|---|
| SVM (RBF) | 0.9747 |
| Deep MLP | 0.9634 |
| TabNet | 0.9255 |
| Gradient Boosting | 0.9268 |
| Random Forest | 0.9045 |
| KNN | 0.9028 |
| Decision Tree | 0.8319 |
├── traditional_machine_learning_models.py # 阶段一:传统 ML (SVM, RF, KNN, GB, DT)
├── deep_learning_models.py # 阶段二:深度学习 (Deep MLP, TabNet)
├── generated_dataset.csv # 数据集 (~10,292 样本, 8 特征)
├── models/ # 训练好的模型 (pickle)
│ ├── svm_model.pkl
│ ├── rf_model.pkl
│ ├── knn_model.pkl
│ ├── gb_model.pkl
│ ├── dt_model.pkl
│ ├── scaler.pkl
│ └── feature_names.pkl
├── results/ # 实验结果 (CSV + PNG 可视化)
├── tests/ # 单元测试 (unittest)
├── requirements.txt
├── LICENSE
└── README.md
10,292 条样本,8 个数值特征:
| 特征 | 说明 |
|---|---|
| Wellhead Temp. (C) | 井口温度 (°C) |
| Wellhead Press (psi) | 井口压力 (psi) |
| MMCFD- gas | 天然气产量 (百万立方英尺/日) |
| BOPD | 原油产量 (桶/日) |
| BWPD | 日产水量 (桶/日) |
| BSW (%) | 基本沉淀物和水百分比 |
| CO2 mol. (%) | CO2 摩尔百分比 (25°C, 1 atm) |
| Gas Grav. | 气体比重 |
目标: CR-corrosion defect — 连续值,代码中以 0.211 为阈值二值化。
数据来源: 来源于 Oil-and-gas-pipeline-leakage(Abimbola-ai,AIIP Capstone 项目,源仓库未附带开源许可协议)。
说明: 源数据主体为作者随机生成(seed=42)、CR-corrosion defect 目标经回归模型预测补全,并混入少量原始 data.csv 样本,并非纯实测数据;本项目直接使用原文件,未做改动。
# 创建虚拟环境 (conda 示例)
conda create -n corrosion python=3.11
conda activate corrosion
# 安装依赖 (CPU)
pip install -r requirements.txt
# 如需 PyTorch CUDA 版本,根据 CUDA 版本选择:
# CUDA 12.x:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126
# 注: pytorch-tabnet 已在 requirements.txt 中,无需单独安装说明:本仓库开发时实际使用的环境名为
pytorch_env(本地 conda 环境),上面的corrosion只是通用示例名,可按需替换。
# 阶段一:传统机器学习
python traditional_machine_learning_models.py
# 阶段二:深度学习 (建议先运行阶段一,用于生成对比图)
python deep_learning_models.py两个脚本均为独立运行。阶段二的对比图会读取阶段一产出的 CSV 结果文件,因此建议按顺序执行。
- 全局配置(数据路径、随机种子、二值化阈值等)以模块级常量定义在脚本顶部;网格搜索参数空间与深度学习超参数内联在各函数中,均可直接修改
- 阶段一(sklearn)随机种子固定为
42,可复现;深度学习部分未固定 PyTorch 随机种子,多次运行结果可能略有差异 - Matplotlib 使用
Agg非交互后端,可在无 GUI 环境中运行 - 所有结果输出到
results/,模型保存到models/
- 加载数据 → MinMax 缩放 → 70/30 分层划分
- 默认参数: 训练并评估 5 个分类器
- 网格搜索调参: GridSearchCV + 5 折交叉验证
- 调参后: 使用最佳参数重新训练并评估
- 保存模型、结果 CSV、可视化图表
可视化输出: 混淆矩阵、ROC 曲线、PR 曲线、特征重要性、相关性热力图、雷达图等图表
- 数据按 70/15/15 划分为训练 / 验证 / 测试集(从训练集中再切 15% 做验证)
- Deep MLP: 5 层隐藏层
[256,256,128,128,64]+ BatchNorm + ReLU + Dropout(0.3) + 2 个残差块。AdamW 优化器,ReduceLROnPlateau 调度,Early Stopping,梯度裁剪 - TabNet: 注意力特征选择 + 多步决策。n_d=16, n_a=16, n_steps=3
- Early Stopping 与学习率调度只使用验证集,测试集仅在最终评估时使用一次
- 与阶段一 SVM 结果对比
- 本项目数据为复现论文而生成的合成数据(详见"数据集"一节),并非真实工业实测数据,所有指标只代表该合成分布下的表现,不能直接外推到真实管道场景。
- 当前模型在合成数据上准确率普遍在 0.83–0.97、ROC-AUC 在 0.85–0.99,说明该二分类任务区分度较高、偏"容易",高指标不足以证明模型之间的真实差距,解读时应避免以"模型很强"作为结论。
- 训练管线已做验证集隔离(70/15/15),早停与调度不接触测试集;但 MinMaxScaler 仍基于全量数据拟合,若要严格避免信息泄漏,可改为仅在训练集上拟合后再变换验证集与测试集。
- 深度学习部分未固定 PyTorch 随机种子,多次运行结果可能略有波动。
| 模型 | 最佳参数 |
|---|---|
| SVM | C=1000, gamma=0.1, kernel=rbf |
| Random Forest | bootstrap=True, max_depth=None, max_features=sqrt, n_estimators=200 |
| KNN | metric=manhattan, n_neighbors=31, weights=distance |
| Gradient Boosting | learning_rate=0.2, max_depth=5, max_features=log2, n_estimators=200 |
| Decision Tree | criterion=gini, max_depth=10, min_samples_leaf=2, min_samples_split=2 |