网站首页 > 技术文章 正文
开始│├─ 数据加载与预处理│ ├─ 加载多井钻井数据│ ├─ 选择关键特征列│ ├─ 合并多井数据集│ ├─ 处理缺失值与异常值│ └─ 创建时间戳特征│├─ 特征工程│ ├─ 数据变换(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()# 数据清洗:替换无效值为NaNdf = 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 boxcoxdef 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 mathdef create_mse(df):mse_values = [] # 存储MSE计算结果hole_diameter = 8.5 # 井眼直径(英寸)# 遍历每行数据计算MSEfor 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 = 0mse_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 StandardScalerscaler = StandardScaler()datanorm = scaler.fit_transform(df_final)# 计算斯皮尔曼相关系数from scipy import statsrho, pval = stats.spearmanr(datanorm)# 数据分割(训练集70%,测试集30%)from sklearn.model_selection import train_test_splity = 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 preprocessingX_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 XGBRegressorxgb_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_errory_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 joblibjoblib.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-07-23 基于多域特征融合的齿轮箱故障智能诊断(Python)
- 2025-04-26 Python语言怎么和土木工程专业结合使用
- 2024-07-18 如何用Python实现神奇切图算法Seam Carving?
- 2024-07-18 双十一刚过你的手还好吗?这些Colab技巧帮你愉快薅谷歌羊毛
- 2024-07-18 python笔记五:循环语句while 条件(随机函数用法)
- 最近发表
-
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
- [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
- 超详细手把手搭建在ubuntu系统的FFmpeg环境
- Nginx运维之路(Docker多段构建新版本并增加第三方模
- 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
- Go 人脸识别教程_piwigo人脸识别
- 安卓手机安装Termux——搭建移动服务器
- ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
- Rust开发环境搭建指南:从安装到镜像配置的零坑实践
- Windows系统安装VirtualBox构造本地Linux开发环境
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (73)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)
