当前位置: 首页 > news >正文

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930.


本文目录

  • 一、前言
  • 二、文献阅读-基于深度学习的复杂储层流体性质测井识别
    • 2.1 摘要
    • 2.2 当前研究不足
    • 2.3 本文创新
    • 2.4 论文中图表分析
    • 2.5 论文框架总结
    • 2.6 本文存在不足与研究展望
  • 三.模型复现-从实现的角度
    • 实现1—数据集样本优化
      • (1)数据集介绍
      • (2)混合采样技术
        • 1)对大样本类下采样
        • 2)对小样本类上采样
    • 实现2—神经网络结构的优化
    • 实现3—论文中的图表
      • (1)表1
      • (2)表2
      • (3)图5
  • 四、最后


一、前言

  • 本文复现一篇典型应用深度学习模型进行识别分类任务的论文。
  • 当然,作为计算机的学生,对这篇论文的理解会基于计算机领域角度,侧重深度学习。而论文第2部分-区域概况与测井响应特征、后文3.2节中识别结果分析,包含了大量地质资料特征分析与解释,这些专业知识是我们计算机学生不具备的,却是做交叉学科融合的同学更应该重点学习的,也是一大亮点与难点。
  • 废话不多唠,进入正题。

二、文献阅读-基于深度学习的复杂储层流体性质测井识别

2.1 摘要

先看一下该论文的摘要部分,对论文有个宏观认识,主要内容已标出:

在这里插入图片描述

图2.1 论文摘要部分

(1) 目的

  • 解决复杂储层流体性质识别率低、严重依赖人工经验的问题,提出一种优化深度神经网络识别流体性质的方法。

(2) 方法

  1. 将深度学习方法引入到复杂储层流体识别中;
  2. 组合优化常规神经网络,提高网络模型的性能;
  3. 实验对比了4种组合优化方法对模型性能的影响。

(3) 创新

  1. 利用混合采用技术进行样本数据集均衡化,避免样本不均衡
  2. 在网络中使用 ReLu + Softmax激活函数,提高的模型多分类问题的准确率;
  3. 在网络中使用 Dropout正则化 ,有效防止模型过拟合。

(4) 结果与结论

  • 优化后的模型对 4 种性质流体识别准确率达82. 7%,单一流体识别率也均较高。本文使用的组合优化方法的识别效果明显优于其他方法,提高了对小样本类别的识别率。

2.2 当前研究不足

  • 仅利用单一的测井资料或者储层参数无法准确识别储层流体性质 。
  • 传统识别方法综合多种测井资料及储层参数解释为主要识别手段,智能化程度低。
  • 现常用的 BP 神经网络等识别方法网络结构简单,只能挖掘到样本浅层的特征信息。

2.3 本文创新

  • 新方法-引入深度学习方法研究流体性质识别;
  • 新模型-优化常规神经网络;
  • 新结果-对比多种组合优化方法对模型的影响。

2.4 论文中图表分析

  • 图1 单个神经元前馈传递过程。神经网络基础原理。
  • 图2 不同类型的激活函数。神经网络基础原理。
  • 图3 Dropout正则化示意图。神经网络基础原理。Dropout正则化 模型训练过程中按照一定比例随机丢弃一些“神经元”,每一次训练的网络结构均不同,降低了网络结构复杂的关联性,学习到的样本特征更具鲁棒性,从而避免过拟合。
  • 图4 深度神经网络结构。典型多层神经网络,输入9个特征参数—输出4个类别概率
  • 图5 样本集数量分布。数据集样本数量分布。
  • 图6 人工解释结论与模型预测结果对比。模型预测结果对比。
  • 图7 不同优化方法的识别效果F值对比。本文选用的组合方法最优。
  • 表1 目标区测井资料统计。关于数据集的统计信息。
  • 表2 识别结果混淆矩阵。混淆矩阵是神经网络多分类器中常用的评价手段。评价模型对不同类别的识别效果。

2.5 论文框架总结

案例:一个案例,对车排子油田某井区12 口井储层流体性质识别。
方法:对样本数据和神经网络结构进行优化,建立储层测井参数与流体性质之间的神经网络模型。

影响因素:

  1. 数据集样本均衡化方法;
  2. 神经网络模型中激活函数的组合;
  3. 避免模型过拟合方法。

评价指标:

  • 划分大小样本标准:每种类别中样本数的平均值 k;
  • 模型性能评价指标:精准率( Precision ) ,召回率( Recall ) ,F 值( F-measure ) 。

2.6 本文存在不足与研究展望

  1. 组合优化方法对比,是简单的“正反面”形式的方法组合对比,没有与其它优化模型方法对比;
  2. 本文是单一常规神经网络模型的应用,没有与其它经典模型进行对比;
  3. 本文验证了基于优化组合策略的深度神经网络方法在实际应用中的优越性,为其它模型优化提供了一种思路。

三.模型复现-从实现的角度

实现1—数据集样本优化

(1)数据集介绍

由于论文的原始数据集无法获取,在复现过程中选用葡萄酒(WINE)数据集。这两个数据集(论文数据集和葡萄酒数据集)都可以完成分类任务

Wine数据集:数据是对生长在意大利同一地区但来自三个不同品种的葡萄酒进行化学分析的结果,数据集中确定了三种葡萄酒中13种成分的含量。即有3个类别,13种特征参数(葡萄酒的13种成分含量)。数据集下载:https://download.csdn.net/download/mdong9/90005091

每个样本的第一个属性是类别(1或2或3),其余按顺序均有如下13个属性:

  • Alcohol
  • Malic acid
  • Ash
  • Alcalinity of ash
  • Magnesium
  • Total phenols
  • Flavanoids
  • Nonflavanoid phenols
  • Proanthocyanins
  • Color intensity
  • Hue
  • OD280/OD315 of diluted wines
  • Proline

在这里插入图片描述

图3.1 Wine数据集部分

(2)混合采样技术

论文中的混合采样技术其实就是一种解决不同类别中样本数不平衡策略。比如Wine数据集中,三种葡萄酒的样本数分别是59(label=1)、71(label=2)、48(label=3),很明显第2类葡萄酒样本数最多,第三类最少,夸张的讲这就是一个样本数不均衡的数据集(其实还好)。

而混合采样技术来解决样本不均衡问题,思路是:

  1. 计算每类中样本数的平均值 k,以k 为分界,大于 k 的类别为大样本类,反之则为小样本类。
  2. 对于大样本类下采样,下采样过程中采用 K-means 聚类算法减少多样本类别的样本数。
  3. 对于小样本类上采样,上采样过程中采用 Smote 算法增加少样本类别的样本数。

经过上述步骤的混合采样后每类样本大小均为 k,原始不均衡样本数据集就变成了均衡样本数据集。

知道思路后,下面就一步步来将Wine数据集变成三类样本数平衡的数据集。在Wine数据集中,平均值 k = ( 59 + 71 + 48 ) / 3 = 59.33 k = (59 + 71 + 48) / 3 = 59.33 k=(59+71+48)/3=59.33 ,取整后刚好是类别1的样本数59,则类别2是大样本类,类别3是小样本类。

1)对大样本类下采样

对于大样本类,K-means 算法将样本聚为 k类,仅保留距离每个聚类中心最近的一个样本,聚类后的 k 个样本在降采样的基础上仍保留了原始数据的全部特征。

方便理解,这里给出一个下采样的例子:

"""
在这个示例中,我们将通过 K-means 聚类算法将一组多样本类别减少到 5 个类别。
"""
from sklearn.cluster import KMeans  
import numpy as np  # 假设你有一个多样本类别的数据集,这里我们随机生成一些数据作为例子  
X = np.random.rand(100, 10)  # 100个样本,每个样本有10个特征  # 设置聚类的数量  
n_clusters = 5  # 创建 KMeans 对象  
kmeans = KMeans(n_clusters=n_clusters, random_state=0)  # 进行聚类  
y_kmeans = kmeans.fit_predict(X)  # 输出结果  
print("Cluster centers:")  
print(kmeans.cluster_centers_)  
print("\nLabels:")  
print(y_kmeans)# 获取每个聚类的中心
cluster_centers = kmeans.cluster_centers_# 找到每个样本到其所属聚类中心的距离
distances = np.linalg.norm(X[:, np.newaxis] - cluster_centers, axis=2)# 对于每个聚类,找到距离其中心最近的样本的索引
nearest_indices = np.argmin(distances, axis=0)# 输出结果
print("Nearest indices:")
print(nearest_indices)

输出结果:

Cluster centers:
[[0.56870198 0.33340756 0.74812813 0.50208413 0.80879522 0.756915730.28995045 0.58835733 0.53986648 0.52429174][0.24773952 0.29674511 0.39650162 0.65400547 0.28843251 0.559490720.48438144 0.39485121 0.65630189 0.31650354][0.69576183 0.38668387 0.51523792 0.71425985 0.50791891 0.276707770.67150517 0.69364469 0.50809951 0.71037073][0.48304122 0.75197772 0.21397284 0.43701465 0.61980822 0.610628740.49566418 0.50509653 0.42412438 0.71218052][0.65337793 0.6093431  0.78001226 0.25850624 0.32640479 0.319900740.44351127 0.52801434 0.55983808 0.43707075]]Labels:
[0 2 1 0 0 1 3 2 4 0 0 0 2 2 4 1 2 1 1 3 0 0 1 3 3 0 3 0 0 4 0 4 3 0 1 1 14 4 4 4 2 3 2 2 3 2 1 1 0 0 3 3 3 1 3 4 1 3 3 4 1 4 2 4 0 2 4 4 4 0 2 1 03 0 3 2 1 2 1 4 3 3 2 2 4 2 3 0 1 3 0 4 2 4 1 2 2 4]
Nearest indices:
[10 35 46  6 29]
2)对小样本类上采样

对于小样本类,Smote 算法以欧式距离为标准计算每个样本到其他所有样本的距离,并得到距离其最近的 p 个样本,即“p 近邻”。根据样本不均衡比例确定上采样倍率,对于每个少数类样本 n i n_i ni 从其“p 近邻”中随机选择若干个样本n分别与原样本按照公式构建新样本 n n e w n_{new} nnew

公式: n n e w = n i + R ( n − n i ) n_{new} = n_i + R(n - n_i) nnew=ni+R(nni) ,R为一个均匀分布在0 ~ 1间的随机数。

Smote 通过创建合成样本来增加少数类的数量。Smote 就是使用欧式距离作为距离度量标准的。在Smote 算法中,首先为每个少数类样本找到其k个最近邻样本,然后从这些邻居中随机选择一个,最后通过插值生成一个新的合成样本。

方便理解,这里给出一个上采样的例子:

from imblearn.over_sampling import SMOTE  
from sklearn.datasets import make_classification  
from sklearn.model_selection import train_test_split  
from sklearn import metrics  # 创建一个不平衡的数据集  
X, y = make_classification(n_classes=2, class_sep=2,   weights=[0.1, 0.9], n_informative=3,   n_redundant=1, flip_y=0, n_features=20,   n_clusters_per_class=1, n_samples=1000, random_state=10)  # 数据划分为训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 输出原始数据集大小
print('Original dataset shape %s' % Counter(comb_y))# 初始化SMOTE实例  
smote = SMOTE(random_state=42)  # 对训练集进行过采样处理  
X_res, y_res = smote.fit_resample(X_train, y_train)  # 输出重采样后的数据集大小  
print('Resampled dataset shape %s' % Counter(y_res))

输出结果:

Original dataset shape Counter({1: 628, 0: 72})
Resampled dataset shape Counter({1: 628, 0: 628})

理解了上述两个步骤后,我们来完成对Wine数据集的混合采样优化,代码如下:

# 导入需要用到的包
from collections import Counterimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans# 1.数据集
# 读取Excel文件
df = pd.read_excel('./dataset/wine.xlsx')
wine = df# 2.数据集样本优化,混合采样技术
# 在Wine数据集中,平均值k = (59 + 71 + 48) / 3 = 59.33,取整后刚好是类别1的样本数59,则类别2是大样本类,类别3是小样本类。# 2.1 对类别2的样本下采样----KMeans
mask = (wine['label'] == 2)
cls_2 = wine.loc[mask]
print(cls_2)
cls_2_X = np.array(cls_2.iloc[:, 1:])  # 类别2的样本# 设置聚类的数量
n_clusters = 59  # 将样本聚为k类,仅保留距离每个聚类中心最近的一个样本
# 创建 KMeans 对象
kmeans = KMeans(n_clusters=n_clusters, random_state=0)
# 进行聚类
labels = kmeans.fit_predict(cls_2_X)  # 对数据进行聚类,并返回每个样本的类别标签
# 获取每个聚类的中心
cluster_centers = kmeans.cluster_centers_
# 找到每个样本到其所属聚类中心的距离
# print(cls_2_X[:, np.newaxis])
distances = np.linalg.norm(cls_2_X[:, np.newaxis] - cluster_centers, axis=2)
# 对于每个聚类,找到距离其中心最近的样本的索引
nearest_indices = np.argmin(distances, axis=0)# 输出结果
print("Nearest indices:")
print(nearest_indices + 59)  # 每个聚类中心最近的一个样本的索引,+59得到原始索引# 新类别2样本
nearest_idx = nearest_indices + 59
new_cls_2 = wine.iloc[nearest_idx, :]# 2.2 对类别3的样本上采样----SMOTE
mask = (wine['label'] == 3)
cls_3 = wine.loc[mask]
cls_3_X = np.array(cls_3.iloc[:, 1:])  # 类别3的样本mask = (wine['label'] == 1)
cls_1 = wine.loc[mask]  # 类别1comb_dataset = pd.concat([cls_1, new_cls_2, cls_3])  # 组合样本comb_X = comb_dataset.iloc[:, 1:]
comb_y = comb_dataset.label
print('Original dataset shape %s' % Counter(comb_y))# 初始化SMOTE实例
smote = SMOTE(random_state=42)# 对数据集进行过采样处理
X_res, y_res = smote.fit_resample(comb_X, comb_y)# 输出重采样后的数据集大小
print('Resampled dataset shape %s' % Counter(y_res))# 组合出优化后的数据集
new_dataset = X_res.assign(label=y_res)# 保存优化后的数据集
new_dataset.to_excel('./dataset/new_wine.xlsx', index=False)

Wine数据集经混合采样优化后达到均衡,三类样本数为59(label=1)、59(label=2)、59(label=3)。到这里就成功复现了论文中的混合采样技术。

实现2—神经网络结构的优化

从代码实现的角度对本文中储层流体性质识别模型进行复现,对该模型的学习完全可以作为深度学习入门的过程。先来了解一下本文的神经网络结构,一图胜千言:

图3.2 储层流体性质识别网络结构

图3.2 储层流体性质识别网络结构

论文中提到的网络结构优化,是在网络中引入了 ReLU激活函数Softmax 层Dropout 正则化,使得网络模型更好地适应多分类问题,防止出现“过拟合”现象,有效提高训练模型的稳定性。

该网络的代码实现:

class MLP(nn.Module):def __init__(self, input_size, output_size):super(MLP, self).__init__()self.fc1 = nn.Linear(input_size, 20)    # 输入层->隐藏层1self.fc2 = nn.Linear(20, 25)            # 隐藏层1->隐藏层2self.fc3 = nn.Linear(25, 30)            # 隐藏层2->隐藏层3self.fc4 = nn.Linear(30, 25)            # 隐藏层3->隐藏层4self.fc5 = nn.Linear(25, 15)            # 隐藏层4->隐藏层5self.fc6 = nn.Linear(15, output_size)   # 隐藏层5->输出层self.dropout = nn.Dropout(p=0.2)  # Dropout层,设置丢弃概率为0.2def forward(self, x):x = F.relu(self.fc1(x))     # 应用激活函数ReLux = self.dropout(x)         # 应用Dropout层x = F.relu(self.fc2(x))x = self.dropout(x)x = F.relu(self.fc3(x))x = self.dropout(x)x = F.relu(self.fc4(x))x = self.dropout(x)x = F.relu(self.fc5(x))x = self.dropout(x)x = self.fc6(x)return F.softmax(x, dim=0)  # 在这里使用softmax函数

下面我们就利用这个网络结构,用Wind数据集去训练出一个识别葡萄酒类别的模型,完成识别分类任务,近似的去复现复杂储层流体性质识别模型。

完整的模型训练和应用模型识别葡萄酒类别的代码如下:

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optimimport pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, f1_score'''
教程:B站我是土堆 + 博客
'''class MLP(nn.Module):def __init__(self, input_size, output_size):super(MLP, self).__init__()self.fc1 = nn.Linear(input_size, 20)    # 输入层->隐藏层1self.fc2 = nn.Linear(20, 25)            # 隐藏层1->隐藏层2self.fc3 = nn.Linear(25, 30)            # 隐藏层2->隐藏层3self.fc4 = nn.Linear(30, 25)            # 隐藏层3->隐藏层4self.fc5 = nn.Linear(25, 15)            # 隐藏层4->隐藏层5self.fc6 = nn.Linear(15, output_size)   # 隐藏层5->输出层self.dropout = nn.Dropout(p=0.2)  # Dropout层,设置丢弃概率为0.2def forward(self, x):x = F.relu(self.fc1(x))     # 应用激活函数ReLux = self.dropout(x)         # 应用Dropout层x = F.relu(self.fc2(x))x = self.dropout(x)x = F.relu(self.fc3(x))x = self.dropout(x)x = F.relu(self.fc4(x))x = self.dropout(x)x = F.relu(self.fc5(x))x = self.dropout(x)x = self.fc6(x)return F.softmax(x, dim=0)  # 在这里使用softmax函数# 归一化处理
def normalize_features(input_tensor):# 计算每个特征的最大值和最小值v_min = torch.min(input_tensor)v_max = torch.max(input_tensor)# 对特征进行归一化normalized_res = (input_tensor - v_min) / (v_max - v_min)return normalized_res# 设置超参数
num_epochs = 200
learning_rate = 0.001# 创建模型实例
model = MLP(13, 3)  # (input_size,output_size)
print(model)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()  # 使用交叉熵作为损失函数
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 输入数据,训练集数据
# 读取 Excel 文件
dataset = pd.read_excel(r'./dataset/new_wine.xlsx')X = torch.tensor(dataset.iloc[:, :-1].values).float()
y = dataset.iloc[:, -1]# 对输入张量的特征进行归一化
normalized_input = normalize_features(X)# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(normalized_input, y, test_size=0.2, random_state=42)# 训练模型
for epoch in range(num_epochs):model.train()  # 设置为训练模式for i in range(len(X_train)):outputs = model(X_train[i])  # 前向传播# 计算损失loss = criterion(outputs.unsqueeze(0),  # 注意这里需要多一个维度,表示样本的数量torch.tensor([y_train.iloc[i] - 1]))  # 索引从0开始,因此类别[1],[2],[3]->[0],[1],[2]# 反向传播和优化optimizer.zero_grad()  # 清空梯度loss.backward()  # 反向传播,计算梯度optimizer.step()  # 更新权重if (epoch + 1) % 10 == 0:print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')# 保存模型
torch.save(model.state_dict(), 'model.pth')  # 保存模型参数到文件'model.pth'中# 设置模型为评估模式
model.eval()y_true = torch.tensor(y_test.tolist())  # 真实值
y_pred = []  # 模型的预测值
# 进行预测
with torch.no_grad():  # 关闭梯度计算以节省内存for i in range(len(X_test)):pre_y = model(X_test[i])# 使用 torch.argmax() 找到最大值的索引_, predicted_class = torch.max(pre_y, 0)# print("Predicted class:", predicted_class.item() + 1)y_pred.append(predicted_class.item() + 1)y_pred = torch.tensor(y_pred)
# 使用 sklearn 的函数来计算 Precision, Recall 和 F1-score
precision = precision_score(y_true.numpy(), y_pred.numpy(), average='macro')
recall = recall_score(y_true.numpy(), y_pred.numpy(), average='macro')
f1 = f1_score(y_true.numpy(), y_pred.numpy(), average='macro')print(f'Precision: {precision}, Recall: {recall}, F1-score: {f1}')

过程中输出的内容:

MLP((fc1): Linear(in_features=13, out_features=20, bias=True)(fc2): Linear(in_features=20, out_features=25, bias=True)(fc3): Linear(in_features=25, out_features=30, bias=True)(fc4): Linear(in_features=30, out_features=25, bias=True)(fc5): Linear(in_features=25, out_features=15, bias=True)(fc6): Linear(in_features=15, out_features=3, bias=True)(dropout): Dropout(p=0.2, inplace=False)
)
Epoch [10/100], Loss: 1.0862
Epoch [20/100], Loss: 1.0778
Epoch [30/100], Loss: 1.0782
Epoch [40/100], Loss: 1.2110
Epoch [50/100], Loss: 1.5514
Epoch [60/100], Loss: 1.5169
Epoch [70/100], Loss: 1.4014
Epoch [80/100], Loss: 1.5513
Epoch [90/100], Loss: 1.5514
Epoch [100/100], Loss: 1.1985
Precision: 0.8260869565217391, Recall: 0.6493506493506493, F1-score: 0.5789341377576672

就我目前训练得到的模型实验情况来看,模型各项评价指标都比较低,说明论文中的网络结构不太适合我们选用的Wine数据集,这是很正常的。因为论文的网络结构是用于测井数据集的,针对这个数据集不断实验训练模型,最终才确定了这样一个网络结构。如果想适配我们选用的Wine数据集,也需要做大量调超参、优化网络结构的模型训练实验。

到这里就成功复现了论文中优化后的模型。我这里给出了一个简单识别葡萄酒类别的例子,完成了深度学习模型进行识别分类任务基本流程,可以作为参考。但是想得到性能优秀的模型,比如针对自己的特定数据集的识别模型,还有很多实验、工作要做,这也是必经之路。

实现3—论文中的图表

这里只复现论文中的表1、表2和图5,比较重要。因为没有去做对比实验,所以没有复现图7,这个对比实验比较简单,知道了表2中的F值如何来的,就能得到图7。

(1)表1

论文中表1:
在这里插入图片描述

针对Wine数据集,我们也生成一个和表1一样的资料统计表:
在这里插入图片描述

图3.3 葡萄酒资料统计

当然还要做出轻微的修改,label行需要删掉。资料统计表通过下面代码生成:

import pandas as pd# 1.数据集资料统计
# 读取Excel文件
df = pd.read_excel('./dataset/wine.xlsx')# 数据集的基本描述
view = df.describe(percentiles=[], include='all').T
view.to_excel('./results/资料统计.xlsx')

(2)表2

论文中表2:
在这里插入图片描述
计算评价指标的公式:
在这里插入图片描述
针对Wine数据集,我们也做一个和表2一样的识别结果混淆矩阵,得到这个表中数据麻烦一点,需要我们在模型训练那块代码中打印出这些数据。然后评价指标值,我们可以根据论文中给的公式,再依据表中的数据,手动计算出来(偷个懒,不写代码算,代码中也计算了这些评价指标,但是针对所有类别的平均,没有算单个类别)。

直接贴出某一次训练模型时候打印的值:

真实类别:[1, 1, 3, 1, 2, 1, 3, 3, 2, 3, 1, 3, 1, 3, 1, 2, 2, 2, 1, 2, 1, 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, 3, 3, 1, 1, 1]
预测类别:[3, 1, 2, 1, 3, 1, 2, 3, 2, 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, 2, 1, 3, 3, 3, 2, 3, 3, 2, 3, 1, 1, 3, 2, 1, 1, 1]

填入表中:

表3.1 葡萄酒识别结果混淆矩阵

在这里插入图片描述

(3)图5

论文中图5:
在这里插入图片描述
针对Wine数据集,我们也生成一个样本集数量分布,这里我使用的是代码进行数据统计+Excel绘制饼状图的方式。

代码进行数据统计,在将样本集划分为训练集和测试集的时候,我打印每个类别的样本数。代码如下:

# 导入需要用到的包
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split# 1.数据集资料统计
# 读取Excel文件
df = pd.read_excel('./dataset/wine.xlsx')
print(df)# 2.样本集数量分布
# 划分训练集和测试集,再绘制饼状图
wine = df
X = wine.iloc[:, 1:]
y = wine.label# 拆分成训练集和测试集,训练集80%和测试集20%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
print('------训练集样本数量---------')
print(y_train.value_counts())
print('------测试集样本数量---------')
print(y_test.value_counts())

输出结果:

------训练集样本数量---------
2    54
1    48
3    40
Name: label, dtype: int64
------测试集样本数量---------
2    17
1    11
3     8
Name: label, dtype: int64

将数值用Excel表画成饼状图,如下图:

在这里插入图片描述

图3.4 样本集数量分布

四、最后

至此,《基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例》论文复现之旅也将行至终点,当然还有很多细节没考虑到,后面肯定还会完善这块模型内容,期待。不得不说,这个搭建模型的整个过程完全可以作为深度学习入门,也让我更理解了之前学的碎片化知识,收获满满。

纸上得来终觉浅,绝知此事要躬行。动手学深度学习才是最快提升方法,没有之一,共勉之。

以上就是本文的全部内容,欢迎点赞评论,指出不足,笔者由衷感谢!~

相关文章:

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…...

树的直径计算:算法详解与实现

树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…...

conda创建 、查看、 激活、删除 python 虚拟环境

1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all ​​ 助力快速掌握数据集…...

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器,将OpenCV中lib库里的o…...

NVIDIA NIM 开发者指南:入门

NVIDIA NIM 开发者指南:入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…...

探索Python网络请求新纪元:httpx库的崛起

文章目录 **探索Python网络请求新纪元:httpx库的崛起**第一部分:背景介绍第二部分:httpx库是什么?第三部分:如何安装httpx库?第四部分:简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…...

学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着

ArcGIS水文分析实战教程(7)细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程(6)河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程(5)细说流向与流量-CSDN博客 ArcGIS …...

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。 上线是按正常流程走的,开发、备案、审核,没有任何违规&#xf…...

【C++】拷贝构造 和 赋值运算符重载

目录: 一、拷贝构造 (一)拷贝函数的特点 二、赋值运算符重载 (一)运算符重载 (二)赋值运算符重载 正文 一、拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何…...

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…...

「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号

本篇将继续讲解PTA平台上的题目 L1-005 考试座位号,通过考生准考证号与座位号的对应关系,掌握简单的数据查询与映射操作,进一步提升Cangjie编程语言的实际应用能力。 关键词 PTA刷题数据查询映射操作输入输出Cangjie语言 一、L1-005 考试座位…...

Vue3引用高德地图,进行位置标记获取标记信息

首先安装地图插件 cnpm i amap/amap-jsapi-loader --save封装地图子组件 <template><el-dialogtitle"选择地点"width"740px"class"select-map-dialog"v-model"dialogShow":close-on-click-modal"false":modal-or…...

《C++设计模式:重塑游戏角色系统类结构的秘籍》

在游戏开发领域&#xff0c;游戏角色系统的类结构设计至关重要。一个良好的类结构可以使游戏更易于扩展、维护和优化&#xff0c;而 C中的设计模式为我们提供了强大的工具来实现这一目标。 一、理解游戏角色系统的复杂性 游戏角色系统通常具有高度的复杂性。每个角色都有自己…...

深入浅出 Go 语言:现代编程的高效选择

深入浅出 Go 语言:现代编程的高效选择 引言 Go 语言(也称 Golang)是由 Google 开发的一种现代编程语言,面向高效、简单和并发。自 2009 年问世以来,它已迅速成长为许多企业和开发者首选的语言,尤其是在后端开发、云计算和微服务领域。 本文旨在从 Go 语言的设计哲学、…...

RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)

RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整&#xff0c;全面重新设计业务逻辑代码&#xff0c;代码量减少一半以上&#xff0c;开发更加高效。全系统引入全新字体图标&#xff0c;整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar&#xff0c;让开发更加…...

vue路由的钩子函数?

在 Vue 中&#xff0c;路由的钩子函数可以用来在导航过程中执行一些操作&#xff0c;比如进行权限验证、页面加载前后的处理等。常用的路由钩子函数包括全局前置守卫、全局解析守卫、全局后置钩子以及路由独享守卫。下面是这些路由守卫函数的简要说明&#xff1a; 全局前置守卫…...

【Java】枚举类映射

在数据库中常用数字来代替字符串类型&#xff0c;编写一个枚举映射类 当数据库的介质类型要存储数字&#xff0c;前端可以任意传参&#xff0c;通过枚举转换后端都会转成数字对应类型 import lombok.Getter;/*** <p>* 存档介质类型* </p>** author Jyang* date 2…...

精华帖分享|浅谈金融时间序列分析与股价随机游走

本文来源于量化小论坛公共讨论区板块精华帖&#xff0c;作者为正扬&#xff0c;发布于2024年6月3日。 以下为精华帖正文&#xff1a; 01 引 时间序列分析是个很唬人的术语&#xff0c;实际上它也不是一个很容易接近的话题。我本科曾经短暂地学过一点点&#xff0c;又看到互联…...

任意文件下载漏洞

1.漏洞简介 任意文件下载漏洞是指攻击者能够通过操控请求参数&#xff0c;下载服务器上未经授权的文件。 攻击者可以利用该漏洞访问敏感文件&#xff0c;如配置文件、日志文件等&#xff0c;甚至可以下载包含恶意代码的文件。 这里再导入一个基础&#xff1a; 你要在网站下…...

LeetCode 445.两数相加 II

题目&#xff1a; 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 思路&#xff1a;反转链表 两数相加 I 代码&…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...