网站首页 > 博客文章 正文
开始
│
├─ 数据加载与预处理
│ ├─ 加载多井钻井数据
│ ├─ 选择关键特征列
│ ├─ 合并多井数据集
│ ├─ 处理缺失值与异常值
│ └─ 创建时间戳特征
│
├─ 特征工程
│ ├─ 数据变换(Box-Cox处理偏度)
│ └─ 计算物理特征(平均比能MSE)
│
├─ 数据分析
│ ├─ 分布可视化
│ ├─ 相关性分析
│ └─ 特征选择
│
├─ 模型构建
│ ├─ 数据分割(训练集/测试集)
│ ├─ 特征归一化
│ ├─ XGBoost模型训练
│ └─ 支持向量机模型训练(对比)
│
├─ 模型评估
│ ├─ R^2分数计算
│ ├─ 误差指标分析(MAE/MSE/RMSE)
│ ├─ 预测结果可视化
│ └─ 特征重要性分析
│
└─ 模型应用
├─ 模型保存与加载
└─ 新数据预测
结束
详细算法步骤
数据准备阶段 :
加载五口井的钻井历史数据
选择关键特征列(井深、钻速、转速、扭矩、钻压等)
合并多井数据并添加井标识
创建统一时间戳特征
数据清洗与预处理 :
替换无效值(-999.25)为NaN
删除恒定不变的特征列(工具面)
删除包含空值的记录行
基于领域知识过滤异常值(转速0-100 RPM,钻压<40 Klbs等)
特征工程 :
对偏态特征(钻压、扭矩)进行Box-Cox变换
基于钻井物理公式计算平均比能(MSE)
选择最终特征集(包含物理特征MSE)
数据分析 :
绘制特征分布图和箱线图
计算斯皮尔曼和皮尔逊相关系数
分析各特征与钻速(ROP)的相关性
模型构建 :
将数据分割为训练集(70%)和测试集(30%)
使用MinMaxScaler进行特征归一化
构建XGBoost回归模型
构建支持向量机模型作为对比基准
模型评估 :
计算R^2分数评估模型拟合优度
计算MAE、MSE、RMSE误差指标
绘制实际值vs预测值散点图
分析特征重要性排序
模型应用 :
将训练好的模型保存为pkl文件
加载模型对新钻井数据进行预测
可视化预测钻速随井深的变化趋势
该算法在信号分析中的应用
信号预处理 | ||
特征融合 | ||
动态建模 | ||
趋势分析 | ||
异常检测 | ||
相关性分析 | ||
多源信号同步 | ||
信号压缩 |
机器学习与深度学习结合方式
特征工程引导 | ||
混合架构 | ||
迁移学习 | ||
强化学习整合 | ||
对抗训练 | ||
注意力机制 | ||
端到端学习 | ||
不确定性量化 | ||
模型蒸馏 |
# 导入必要的库
import numpy as np # 数值计算库
import pandas as pd # 数据处理库
import matplotlib.pyplot as plt # 数据可视化库
import seaborn as sns # 高级数据可视化库
import warnings # 警告处理
warnings.filterwarnings('ignore') # 忽略所有警告
# 加载MIP-3HA井的钻井数据
MIP3A = pd.read_csv(r'datasets\MIP-3H Top.csv') # 读取CSV文件
# 数据预处理函数:选择关键特征列
def slice_columns(data):
# 定义需要保留的关键特征列
columns = ['Hole Depth', 'Rate Of Penetration', 'Bit Depth', 'Hook Load',
'Standpipe Pressure', 'Rotary RPM', 'Rotary Torque', 'Weight on Bit',
'Block Height', 'On Bottom Hours', 'Circulating Hours', 'Tool Face',
'Inclination', 'Azimuth', 'Differential Pressure', 'YYYY/MM/DD', 'HH:MM:SS']
df = data[columns] # 选择指定列
return df
# 多井数据合并函数
def combine_and_transform():
# 定义要合并的井数据集
wells = [MIP3A, MIP3B, MIP5A, MIP5B, MIPSW]
well_names = ['MIP3A', 'MIP3B', 'MIP5A', 'MIP5B', 'MIPSW'] # 井标识
combined_df = pd.DataFrame() # 创建空DataFrame
# 遍历每口井的数据
for well, well_name in zip(wells, well_names):
df = slice_columns(well) # 选择关键特征
df['Well ID'] = well_name # 添加井标识列
combined_df = pd.concat([combined_df, df], ignore_index=True) # 合并数据
# 创建时间戳列:合并日期和时间
combined_df['TimeStamp'] = pd.to_datetime(combined_df['YYYY/MM/DD'] + ' ' + combined_df['HH:MM:SS'])
return combined_df
# 调用函数合并多井数据
df = combine_and_transform()
# 数据清洗:替换无效值为NaN
df = df.replace(-999.25, np.NaN)
# 删除工具面列(数据无变化)和空值行
df = df.drop(columns='Tool Face')
df = df.dropna()
# 异常值处理函数
def process_outliers(df):
# 转速过滤:保留0-100 RPM之间的合理值
df = df[(df['Rotary RPM'] > 0) & (df['Rotary RPM'] < 100)]
# 钻压过滤:保留小于40 Klbs的值
df = df[df['Weight on Bit'] < 40]
# 扭矩过滤:保留小于4900 ft-lbs的值
df = df[df['Rotary Torque'] < 4900]
# 差压过滤:保留190-770 psi之间的值
df = df[(df['Differential Pressure'] > 190) & (df['Differential Pressure'] < 770)]
# 钻速过滤:保留小于385 ft/hr的值
df = df[df['Rate Of Penetration'] < 385]
return df
# 应用异常值处理
df_clean = process_outliers(df)
# Box-Cox变换函数(处理数据偏度)
from scipy.stats import boxcox
def boxcox_transform(df, column_name):
# 确保所有值为正(Box-Cox要求)
df[column_name] = df[column_name] - df[column_name].min() + 0.1
# 应用Box-Cox变换
transformed, _ = boxcox(df[column_name])
df[column_name] = transformed # 替换原数据
return df
# 对钻压和扭矩进行Box-Cox变换
df_clean = boxcox_transform(df_clean, 'Weight on Bit')
df_clean = boxcox_transform(df_clean, 'Rotary Torque')
# 平均比能(MSE)特征工程
import math
def create_mse(df):
mse_values = [] # 存储MSE计算结果
hole_diameter = 8.5 # 井眼直径(英寸)
# 遍历每行数据计算MSE
for i in range(len(df)):
rpm = df['Rotary RPM'].iloc[i] # 转速
torque = df['Rotary Torque'].iloc[i] # 扭矩
rop_avg = df['Rate Of Penetration'].iloc[i] # 平均钻速
wob = df['Weight on Bit'].iloc[i] # 钻压
# MSE计算公式(避免除零错误)
if rop_avg != 0:
mse = ((480 * torque * rpm) / (hole_diameter**2 * rop_avg)) + \
((4 * wob) / (hole_diameter**2 * math.pi))
else:
mse = 0
mse_values.append(mse)
df['MSE'] = mse_values # 添加MSE列
return df
# 应用MSE特征工程
df_clean = create_mse(df_clean)
# 特征选择
selected = ['Rate Of Penetration', 'Rotary Torque', 'Rotary RPM', 'Weight on Bit',
'Differential Pressure', 'Hook Load', 'MSE', 'Hole Depth']
df_final = df_clean[selected]
# 数据标准化和相关性分析
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
datanorm = scaler.fit_transform(df_final)
# 计算斯皮尔曼相关系数
from scipy import stats
rho, pval = stats.spearmanr(datanorm)
# 数据分割(训练集70%,测试集30%)
from sklearn.model_selection import train_test_split
y = df_final[['Rate Of Penetration']] # 目标变量(钻速)
X = df_final.drop(['Rate Of Penetration'], axis=1) # 特征变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=1000)
# 特征归一化(MinMax缩放)
from sklearn import preprocessing
X_train_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
X_train = X_train_scaler.fit_transform(X_train)
y_train_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
y_train = y_train_scaler.fit_transform(y_train)
# XGBoost模型构建
from xgboost import XGBRegressor
xgb_model = XGBRegressor(
objective='reg:squarederror', # 回归任务
n_estimators=200, # 树的数量
reg_lambda=1, # L2正则化
max_depth=3, # 树的最大深度
learning_rate=0.1, # 学习率
reg_alpha=0.1 # L1正则化
)
# 模型训练
xgb_model.fit(X_train, y_train)
# 模型评估
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
y_pred = xgb_model.predict(X_test)
# 计算评估指标
r2 = r2_score(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
# 特征重要性可视化
feature_imp = pd.Series(xgb_model.feature_importances_, index=X.columns)
feature_imp.sort_values().plot(kind='barh')
# 模型保存与加载
import joblib
joblib.dump(xgb_model, 'rop_model_xgb.pkl') # 保存模型
loaded_model = joblib.load('rop_model_xgb.pkl') # 加载模型
# 新数据预测
new_data = pd.read_csv('freshdrillingdata.csv') # 加载新数据
# 注意:新数据需要与训练数据相同的预处理
predicted_rop = loaded_model.predict(new_data) # 预测ROP
https://www.zhihu.com/consult/people/792359672131756032?isMe=1
擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测
猜你喜欢
- 2025-08-02 [电子学报文章精选]一种基于特征融合的恶意代码快速检测方法
- 2024-08-13 【图像处理】生物特征融合综合概述
- 2024-08-13 融合创新!全局特征+局部特征,性能优于Transformer
- 2024-08-13 一种用于360度全景视频超分的单帧多帧联合网络
- 2024-08-13 三种VPN特点,怎么选择合适的VPN
- 2024-08-13 基于深浅特征融合的人脸识别(基于深度图的人脸识别)
- 2024-08-13 媒介融合时代采编工作新特点及工作措施
- 2024-08-13 多尺度特征融合:为检测学习更好的语义信息(附论文下载)
- 2024-08-13 AF-S3Net:稀疏语义分割网络的特征融合与自适应特征选择
- 2024-08-13 Attention结合特征融合炸场!升级版AFF全面开源,涨点猛猛猛
你 发表评论:
欢迎- 最近发表
-
- Python 中 必须掌握的 20 个核心函数—len()函数
- 用PLC的指针实现字符串转byte(Codesys平台)一文极简搞懂指针
- EXCEL如何用函数读取复杂字符串中的数据
- 2025-07-19:计算字符串的镜像分数。用go语言,给定一个字符串 s
- 2025-07-10:字符相同的最短子字符串Ⅰ。用go语言,给定一个长度
- 基于物理特征融合与机器学习的多井协同钻井速率实时预测与优化(
- [电子学报文章精选]一种基于特征融合的恶意代码快速检测方法
- 强大的可视化流程图编辑神器 — LogicFlow
- 前端框架太卷了!字节企业级框架Arco Design Mobile开源了
- Vue独立组件——11个最佳Vue.js日期选择器组件
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- vueproxytable (64)
- npminstallsave (63)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)