机器学习方法在测井解释上的应用-以岩性分类为例

news2024/11/24 4:10:11

机器学习在测井解释上的应用越来越广泛,主要用于提高油气勘探和开发的效率和精度。通过使用机器学习算法,可以从测井数据中自动识别地质特征,预测岩石物理性质,以及优化油气储层的评估和管理。

以下是机器学习在测井解释中的一些关键应用:

  1. 岩性分类:机器学习模型能够分析测井数据,如声波、电阻率、伽玛射线等,来识别不同的岩石类型和沉积环境。

  2. 孔隙度和渗透性预测:使用机器学习算法可以根据测井数据预测岩石的孔隙度和渗透性,这对于评估储层质量和油气潜力非常关键。

  3. 储层特征化:机器学习方法可以帮助解释和量化储层的复杂特性,如裂缝、岩层压实度和含油饱和度等。

  4. 时间序列分析:在动态测井解释中,机器学习模型能够分析时间序列数据,监测储层的变化,优化生产策略。

  5. 自动化和精确性:通过自动化的数据处理和分析,机器学习可以减少人为误差,提高解释的精确性和效率。

使用这些技术,地球物理学家和工程师可以更准确地评估油气田的潜力,优化开采计划,从而降低风险和成本。

本文介绍零基础配置机器学习环境完成测井解释中的常见任务——岩性分类

1. 配置实验环境

1.1 安装conda

Conda 是一个开源的包管理系统和环境管理系统,它支持多种语言,如 Python、R、Ruby、Lua、Scala、Java、JavaScript、C/C++ 等。Conda 主要用于科学计算领域,帮助用户管理依赖关系和环境,从而方便在不同项目之间切换不同的库版本。

Conda 的主要特点包括:

  1. 跨平台支持:支持 Linux、Windows 和 macOS。

  2. 环境管理:用户可以创建隔离的环境以避免不同库之间的依赖冲突。每个环境可以拥有不同的库版本,使得多项目开发更为便捷。

  3. 便捷的包管理:Conda 允许用户从其仓库中安装、升级和删除软件包。这些软件包预编译好了,可以避免用户自己编译的复杂性。

  4. 大型生态系统:Conda 通过 Anaconda 和 Miniconda 发行版,为用户提供了大量预编译的科学计算和数据科学相关的软件包。

使用 Conda 的基本命令很简单,比如:

  • 创建新环境:conda create --name myenv python=3.9
  • 激活环境:conda activate myenv
  • 安装包:conda install numpy
  • 列出环境中的包:conda list

这样的特性使 Conda 成为科学研究和数据科学领域非常受欢迎的工具之一。

参考安装方法:Conda安装及使用方法

这里安装成功即可,记得执行配置清华源(国内网速);

1.2 Conda安装Python环境

打开终端,windows打开cmd;

依次执行以下命令:

# 1. 创建环境
conda create -n well-logging python=3.9

image-20240416211401414

# 激活环境
conda activate well-logging

image-20240416211443162

# 安装包
pip install jupyter
pip install matplotlib
pip install pandas
pip install scikit-learn

2. 准备数据

打开vscode ,选择python环境即可

在这里插入图片描述

2.1 测井数据准备

以csv存储的数据为基础,需要包含研究的测井响应特征以判别的标签;这里Core Lithology 作为岩性标签,为了方便研究这里已经将对应的标签进行数据编号;其中 1=粗砂岩 2=中砂岩 3=细砂岩 4=粉砂岩 5=白云岩 6=石灰岩 7=泥岩

image-20240416212737742

2.2 导入环境

2.2.1 导入基本环境

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors as colors
from mpl_toolkits.axes_grid1 import make_axes_locatable
from pandas import set_option
set_option("display.max_rows", 10)#设置要显示的默认行数,显示的最大行数是10
pd.options.mode.chained_assignment = None #为了在增加列表行数的时候防止出现setting with copy warning

2.2.2 读取数据显示

# 模型训练的数据
training_data = pd.read_csv('./train.csv')
training_data
# 预测的数据
testing_data = pd.read_csv('./test.csv')
testing_data

image-20240416214304940

2.2.3 查看数据分布(可选,防止测井响应特征存在缺失情况)

查看数目、均值、方差、误差分布图

# 1=粗砂岩  2=中砂岩   3=细砂岩
# 4=粉砂岩 5=白云岩 6=石灰岩 7=泥岩 ,不同的颜色选项
facies_colors = ['#F4D03F', '#F5B041','#DC7633','#6E2C00',
       '#1B4F72','#2E86C1', '#AED6F1']

# 类别不支持中文, 编为英文
facies_labels = ['CS', 'MS', 'FS', 'SS', 'DM',
                 'LS', 'MDS']
#facies_color_map is a dictionary that maps facies labels
#to their respective colors
facies_color_map = {}
for ind, label in enumerate(facies_labels):
    facies_color_map[label] = facies_colors[ind]
testing_data.describe()


image-20240416214727742

2.2.3 查看训练数据的标签数量

#count the number of unique entries for each facies, sort them by facies number (instead of by number of entries)
#计算每个相的唯一条目数,然后按相数(而不是条目数)对它们进行排序
facies_counts = training_data['Core Lithology'].value_counts().sort_index()
#use facies labels to index each count
#使用相标签索引每个计数
facies_counts.index = facies_labels

facies_counts.plot(kind='bar',color=facies_colors, 
                   title='Distribution of Training Data by Facies')
# 各个岩性数据点统计
facies_counts

image-20240416214838440

2.2.4 提取对应数据

除Core Lithology 列,其余均为需要研究的测井响应特征、这里全部提取;

# 训练数据
correct_facies_labels = training_data['Core Lithology'].values
correct_facies_labels_test = testing_data['Core Lithology'].values
# 测试数据
feature_vectors = training_data.drop(['Core Lithology'], axis=1)
feature_vectors_test = testing_data.drop(['Core Lithology'], axis=1)

feature_vectors.describe()
feature_vectors_test.describe()

image-20240416215132651

3. 数据建模

3.1 数据标准化

Scikit包含一个预处理模块,可以“标准化”数据(赋予每个变量零均值和单位方差,也称为白化)。 许多机器学习算法都假定特征将是标准的正态分布数据(即:均值和单位方差为零的高斯)。 用于标准化训练集的因素必须应用于将输入到分类器的任何后续功能集中。 StandardScalar类可以适合于训练集,并在以后用于标准化任何训练数据。

from sklearn import preprocessing
# 数据标准化
scaler = preprocessing.StandardScaler().fit(feature_vectors)
scaled_features = scaler.transform(feature_vectors)


scaler_test = preprocessing.StandardScaler().fit(feature_vectors_test)
scaled_features_test = scaler.transform(feature_vectors_test)

# 数据标准化后数据
feature_vectors

3

3.2 数据划分

X_train = scaled_features
X_test = scaled_features_test
y_train = correct_facies_labels
y_test = correct_facies_labels_test

3.3 数据建模

常用的几种分类方法

# 支持向量机(Support Vector Machine)
from sklearn.svm import SVC
# k近邻分类
from sklearn.neighbors import KNeighborsClassifier
# 逻辑回归
from sklearn.linear_model import LogisticRegression
# 决策树
from sklearn.tree import DecisionTreeClassifier
# 随机森林(Random Forest)
from sklearn.tree import DecisionTreeClassifier
# 梯度提升树(Gradient Boosting Machines)
from sklearn.ensemble import GradientBoostingClassifier


## 定义模型,这里调用支持向量机
clf = SVC()
# 调用方式如下:
# clf = KNeighborsClassifier()

3.4 模型训练

clf.fit(X_train,y_train)

3.5 模型预测

predicted_labels = clf.predict(X_test)

See the file classification_utilities.py in this repo for the display_cm() function.

3.6 评估指标

我们需要一些指标来评估分类器的效果。 混淆矩阵是可用于描述分类模型性能的表。 Scikit-learn通过提供实际和预测的相貌标签,使我们能够轻松创建混淆矩阵。

混淆矩阵只是2D数组。 混淆矩阵C [i] [j]的条目等于预测具有相j的观测次数,但已知具有相i。

精度和回忆度是能够更深入地了解分类器对单个相的执行情况的指标。精度是给定一个样本的分类结果,这个样本实际上属于这个类别的概率。召回率是样本将被正确分类为给定类的概率。使用混淆矩阵可以很容易地计算出精确度和查全率

from sklearn.metrics import confusion_matrix
from classification_utilities import display_cm, display_adj_cm
# 混淆矩阵,还有其他例如,准确率、召回率
conf = confusion_matrix(y_test, predicted_labels)

3.7 不同超参数调参

svm算法存在不同过的超参数,需要显示参数过程,以实际准确率作为评估标准,显示不同超参数情况下模型准确率

#model selection takes a few minutes, change this variable
#to true to run the parameter loop
from sklearn.svm import SVC
def accuracy(conf):
    total_correct = 0.
    nb_classes = conf.shape[0]
    for i in np.arange(0,nb_classes):
        total_correct += conf[i][i]
    acc = total_correct/sum(sum(conf))
    return acc
def accuracy_adjacent(conf, adjacent_facies):
    nb_classes = conf.shape[0]
    total_correct = 0.
    for i in np.arange(0,nb_classes):
        total_correct += conf[i][i]
        for j in adjacent_facies[i]:
            total_correct += conf[i][j]
    return total_correct / sum(sum(conf))

do_model_selection = True

if do_model_selection:
    C_range = np.array([.01, 1, 5, 10, 20, 50, 100, 1000, 5000, 10000])
    gamma_range = np.array([0.0001, 0.001, 0.01, 0.1, 1, 10])
    
    fig, axes = plt.subplots(3, 2, 
                        sharex='col', sharey='row',figsize=(10,10))
    plot_number = 0
    for outer_ind, gamma_value in enumerate(gamma_range):
        row = int(plot_number / 2)
        column = int(plot_number % 2)
        cv_errors = np.zeros(C_range.shape)
        train_errors = np.zeros(C_range.shape)
        for index, c_value in enumerate(C_range):
            
            clf = SVC(C=c_value, gamma=gamma_value)
            clf.fit(X_train,y_train)
            
            train_conf = confusion_matrix(y_train, clf.predict(X_train))
            cv_conf = confusion_matrix(y_test, clf.predict(X_test))
        
            cv_errors[index] = accuracy(cv_conf)
            train_errors[index] = accuracy(train_conf)

        ax = axes[row, column]
        ax.set_title('Gamma = %g'%gamma_value)
        ax.semilogx(C_range, cv_errors, label='CV error')
        ax.semilogx(C_range, train_errors, label='Train error')
        plot_number += 1
        ax.set_ylim([0.2,1])
        
    ax.legend(bbox_to_anchor=(1.05, 0), loc='lower left', borderaxespad=0.)
    fig.text(0.5, 0.03, 'C value', ha='center',
             fontsize=14)
             
    fig.text(0.04, 0.5, 'Classification Accuracy', va='center', 
             rotation='vertical', fontsize=14)

image-20240416221039797

3.8 交叉验证

clf = SVC(C=10, gamma=1)        
clf.fit(X_train, y_train)

cv_conf = confusion_matrix(y_test, clf.predict(X_test))

print('Optimized facies classification accuracy = %.2f' % accuracy(cv_conf))
print(f'准确率{accuracy(cv_conf)}')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为配置路由式Proxy ARP示例

配置路由式Proxy ARP示例 组网图形 图1 配置路由式Proxy ARP组网图 路由式Proxy ARP简介配置注意事项组网需求配置思路操作步骤配置文件 路由式Proxy ARP简介 企业内部进行子网划分时,可能会出现两个子网网络属于同一网段,但是却不属于同一物理网络的情…

新a_bogus算法还原大赏

新a_bogus算法还原大赏 记得加我我们的学习群哦:529528142 1、本次新ab是继承之前旧ab的过程,新ab分为上半部分和下半部分,上半部分是之前的旧ab,下半部分我们开始讲解。 s.apply(l, u).length 172这是断住ab的条件,…

【介绍下负载均衡原理及算法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

深入掌握k8s核心概念--Pod(二)

详解Pod的配置管理与调度特性等剖析 Kubernetes 中 Pod 的配置管理(ConfigMap)、调度策略、回滚与扩缩容详解一、Pod 配置管理:ConfigMap创建 ConfigMap 示例使用 ConfigMap 的 Pod 示例 二、玩转 Pod 调度:Kubernetes 高级调度策…

【笔记】ASP.NET Core Web API之Token验证

在实际开发中经常需要对外提供接口以便客户获取数据,由于数据属于私密信息,并不能随意供其他人访问,所以就需要验证客户身份。那么如何才能验证客户的身份呢?一个简单的小例子,简述ASP.NET Core Web API开发过程中&…

CTFHUB-技能树-Web前置技能-文件上传(前端验证—MIME绕过、00截断、00截断-双写后缀)

CTFHUB-技能树-Web前置技能-文件上传(前端验证—MIME绕过、00截断、00截断-双写后缀) 文章目录 CTFHUB-技能树-Web前置技能-文件上传(前端验证—MIME绕过、00截断、00截断-双写后缀)前端验证—MIME绕过有关MIMEMIME的作用 解题时有…

RACE IPEMD:构建安全基石的密码学原理与实践

title: RACE IPEMD:构建安全基石的密码学原理与实践 date: 2024/4/16 16:53:56 updated: 2024/4/16 16:53:56 tags: IPEMD哈希算法SHA-1SHA-2/3消息摘要数字签名安全分析 前言 在当今信息爆炸的时代,数据安全和隐私保护变得尤为重要。密码学作为信息安…

C语言100题练习打卡(2)

14&#xff0c;将一个正整数分解质因数。 例如&#xff1a;输入90&#xff0c;打印出902*3*3*5 #include<stdio.h> /*分析&#xff1a; * 1&#xff0c;如果这话质数恰巧等于&#xff08;小于的时候&#xff0c;继续执行循环&#xff09;n&#xff0c; 则说明分解质因数…

案例分析-redis

案例需求&#xff1a;在7002这个slave节点执行手动故障转移&#xff0c;重新夺回master地位 步骤如下&#xff1a; 1&#xff09;利用redis-cli连接7002这个节点 2&#xff09;执行cluster failover命令 如图&#xff1a; 效果&#xff1a; 4.5.RedisTemplate访问分片集群 …

Gitea是一个开源、轻量级的自托管Git解决方案

Gitea介绍 Gitea是一个由Go语言编写的、轻量级的、自托管的Git解决方案&#xff0c;类似于GitHub、GitLab等平台。它是用Go语言编写的开源软件&#xff0c;提供了Git版本控制系统的基本功能&#xff0c;包括代码托管、问题跟踪、代码审查、Wiki等。Gitea的设计目标是简单易用、…

ssm 体检预约管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 体检预约管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c; 系统主要采用B/S…

深度学习 Lecture 7 迁移学习、精确率、召回率和F1评分

一、迁移学习&#xff08;Transfer learning) 用来自不同任务的数据来帮助我解决当前任务。 场景&#xff1a;比如现在我想要识别从0到9度手写数字&#xff0c;但是我没有那么多手写数字的带标签数据。我可以找到一个很大的数据集&#xff0c;比如有一百万张图片的猫、狗、汽…

SD-WAN企业组网:多样化的应用场景

随着企业网络环境的快速发展&#xff0c;SD-WAN技术正成为实现站点间网络互通的关键所在。它不仅支持企业站点对因特网、SaaS云应用和公有云等多种业务的高效访问&#xff0c;更能满足多样化的业务需求。深入探讨SD-WAN的组网应用场景&#xff0c;我们能够发现其广泛的适用性和…

Day 14 网络协议

常见网络设备&#xff1a;交换机 路由器 中继器 多协议网关&#xff08;路由器的前身&#xff09; 交换机&#xff1a;用于连接统一网络的设备&#xff0c;实现内网设备通信。 从广义上分为&#xff1a;局域网交换机&#xff0c;广域网交换机 从网络构成分为&#xff1a;接…

UbuntuServer22.04安装docker

通过ubuntuserver安装docker是搭建开发环境最便捷的方式之一。下面介绍一下再ubuntu22.04上如何安装docker。相关内容参考官网链接&#xff1a;Install Docker Engine on Ubuntu 根据官网推荐&#xff0c;利用apt命令的方式安装&#xff0c;首先需要设置docker仓库&#xff0c…

【个人博客搭建】(5)Sqlsugar实体创建数据库数据

1、在appsettings.json文件中配置SqlServer数据库连接字符串信息。&#xff08;后续考虑添加MySQL数据库等类型&#xff09; "DBS": [/*对应下边的 DBTypeMySql 0,SqlServer 1,*/{"ConnId": "plateau.poetize.2024","DBType": 1,&qu…

分类损失函数与评估指标

目录 1 评估指标 1.1 准确率 1.2 精确率 1.3 召回率 1.4 F1 score 1.5 ROC曲线 1.6 AUC 1.7 PRC曲线的优势 2 损失函数 1. 负对数似然损失 2. 交叉熵损失 3. 指数损失 3 分类问题为什么用交叉熵损失不用 MSE 损失 1 评估指标 混淆矩阵 TP(True Positive) ---- 正…

锂电池充放电管理-单片机通用

锂电池充放电管理-单片机通用 一、锂电池充放电检测的原理二、power.c的实现三、power.h的实现四、锂电池检测和充电电路 一、锂电池充放电检测的原理 ①两节锂电池通过电阻分压检测ADC&#xff0c;再根据电压划分电量等级&#xff1b;②充电使用的是锂电池充电IC方案&#xf…

区块链与数字身份:Web3的身份验证革命

随着数字化时代的发展&#xff0c;个人身份认证在日常生活和商业活动中变得越来越重要。然而&#xff0c;传统的身份认证方式存在着许多问题&#xff0c;如安全性不足、数据泄露、信息篡改等。而区块链技术的出现为数字身份认证带来了全新的解决方案。本文将深入探讨区块链与数…

无人零售行业展望:智能化与便利性引领未来

无人零售行业展望&#xff1a;智能化与便利性引领未来 无人零售&#xff0c;这一依靠智能化技术如人工智能、物联网、和大数据的零售模式&#xff0c;正逐步成为全球零售行业的新趋势。该模式允许消费者在没有店员的情况下自助完成购物&#xff0c;提供了24小时服务&#xff0…