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

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

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

  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)}')

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony开发案例:【分布式遥控器】

1.概述 目前家庭电视机主要通过其自带的遥控器进行操控,实现的功能较为单一。例如,当我们要在TV端搜索节目时,电视机在遥控器的操控下往往只能完成一些字母或数字的输入,而无法输入其他复杂的内容。分布式遥控器将手机的输入能力…

5-pytorch-torch.nn.Sequential()快速搭建神经网络

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言torch.nn.Sequential()快速搭建网络法1 生成数据2 快速搭建网络3 训练、输出结果 总结 前言 本文内容还是基于4-pytorch前馈网络简单(分类&#xf…

滤波器笔记(杂乱)

线性相位是时间平移,相位不失真 零、基础知识 1、用相量表示正弦量 https://zhuanlan.zhihu.com/p/345546880 https://www.zhihu.com/question/347763932/answer/1103938667 A s i n ( ω t θ ) ⇔ A e j θ ⇔ A ∠ θ Asin(\omega t\theta) {\Leftrightarrow…

IBM SPSS Statistics for Mac中文激活版:强大的数据分析工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析工具,为Mac用户提供了高效、精准的数据分析体验。 IBM SPSS Statistics for Mac中文激活版下载 该软件拥有丰富的统计分析功能,无论是描述性统计、推论性统计,还是高级的多元统计分析&am…

企业邮箱迁移是什么?如何通过IMAP/POP协议进行邮箱迁移?

使用公司邮箱工作的过程中,公司可能遇到公司规模的扩大或技术架构升级,可能要换公司邮箱。假如马上使用新的公司邮箱,业务处理要被终断。企业邮箱转移是公司更换邮箱不可或缺的一步,不仅是技术操作,更是企业信息安全、…

Unity MySql安装部署与Unity连接 下篇

一、前言 上篇讲到了如何安装与部署本地MySql;本篇主要讲Unity与MySql连接、创建表、删除表,然后就是对表中数据的增、删、改、查等操作。再讲这些之前会说一些安装MySql碰到的一些问题和Unity连接的问题。 当把本地MySql部署好之后,我们可能…

Pytorch搭建GoogleNet神经网络

一、创建卷积模板文件 因为每次使用卷积层都需要调用Con2d和relu激活函数,每次都调用非常麻烦,就将他们打包在一起写成一个类。 in_channels:输入矩阵深度作为参数输入 out_channels: 输出矩阵深度作为参数输入 经过卷积层和relu激活函数…

AI:156-利用Python进行自然语言处理(NLP):情感分析与文本分类

本文收录于专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 每一个案例都附带关键代码,详细讲解供大家学习,希望可以帮到大家。正…

JDK5.0新特性

目录 1、JDK5特性 1.1、静态导入 1.2 增强for循环 1.3 可变参数 1.4 自动装箱/拆箱 1.4.1 基本数据类型包装类 1.5 枚举类 1.6 泛型 1.6.1 泛型方法 1.6.2 泛型类 1.6.3 泛型接口 1.6.4 泛型通配符 1、JDK5特性 JDK5中新增了很多新的java特性,利用这些新…

你的RPCvs佬的RPC

一、课程目标 了解常见系统库的hook了解frida_rpc 二、工具 教程Demo(更新)jadx-guiVS CodejebIDLE 三、课程内容 1.Hook_Libart libart.so: 在 Android 5.0(Lollipop)及更高版本中,libart.so 是 Android 运行时(ART&#x…

计算机网络----第十二天

交换机端口安全技术和链路聚合技术 1、端口隔离技术: 用于在同vlan内部隔离用户; 同一隔离组端口不能通讯,不同隔离组端口可以通讯; 2、链路聚合技术: 含义:把连接到同一台交换机的多个物理端口捆绑为一个逻辑端口…

【前后端的那些事】SpringBoot 基于内存的ip访问频率限制切面(RateLimiter)

文章目录 1. 什么是限流2. 常见的限流策略2.1 漏斗算法2.2 令牌桶算法2.3 次数统计 3. 令牌桶代码编写4. 接口测试5. 测试结果 1. 什么是限流 限流就是在用户访问次数庞大时,对系统资源的一种保护手段。高峰期,用户可能对某个接口的访问频率急剧升高&am…

十大排序——6.插入排序

这篇文章我们来介绍一下插入排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 插入排序的要点如下所示: 首先将数组分为两部分[ 0 ... low-1 ],[ low ... arr.length-1 ],然后,我们假设左边[ 0 ... low-1 ]是已排好序的部分…

Spring Boot 多环境配置:YML 文件的三种高效方法

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

力扣:141. 环形链表

力扣:141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾…

uni-app学习

目录 一、安装HBuilderX 二、创第一个uni-app 三、项目目录和文件作用 四、全局配置文件(pages.json) 4.1 globalStyle(全局样式) 导航栏:背景颜色、标题颜色、标题文本 导航栏:开启下拉刷新、下拉背…

LeetCode 409—— 最长回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 要想组成回文串,那么只有最中间的字符可以是奇数个,其余字符都必须是偶数个。 所以,我们先遍历一遍字符串,统计出每个字符出现的次数。 然后如果某个字符出现了偶…

【数据分享】历次人口普查数据(一普到七普)

国之情,民之意,查人口,定大计。 第七次人口普查已经结束,那么,为了方便大家把七普数据与之前的数据做对比,地理遥感生态网整理了从一普到七普人口数据,并且把第七次人口普查的数据也一并分享给…

当全连接队列满了,tcp客户端收到服务端RST信令的模拟

当tcp服务端全连接队列满了后,并且服务端也不accept取出连接,客户端再次连接时,服务端能够看到SYN_RECV状态。但是客户端看到的是ESTABLISHED状态,所以客户端自认为成功建立了连接,故其写往服务端写数据,发…

JVM之本地方法栈和程序计数器和堆

本地方法栈 本地方法栈是为虚拟机执行本地方法时提供服务的 JNI:Java Native Interface,通过使用 Java 本地接口程序,可以确保代码在不同的平台上方便移植 不需要进行 GC,与虚拟机栈类似,也是线程私有的,…