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

文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[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 样本集数量分布

四、最后

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

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

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

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

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

相关文章

Uni-APP+Vue3+鸿蒙 开发菜鸟流程

参考文档 文档中心 运行和发行 | uni-app官网 AppGallery Connect DCloud开发者中心 环境要求 Vue3jdk 17 Java Downloads | Oracle 中国 【鸿蒙开发工具内置jdk17,本地不使用17会报jdk版本不一致问题】 开发工具 HBuilderDevEco Studio【目前只下载这一个就…

Unity-Editor扩展Odin + 自定义EditorWindow记录

没有上下文,可能你不知道这是什么(关于Odin Inspector) 在写一个 Odin 插件的完整文章,卡了三天,之后会放出 使用Unity的人之中 1/10 可能会使用Editor扩展,而这之中的又1/10的 人可能会用Odin这个Editor的附加扩展 -…

FIFO系列 - FIFO使用中需要注意的若干问题

FIFO使用中需要注意的若干问题 文章目录 FIFO使用中需要注意的若干问题前言场景1:包数据FIFO设计之冗余法场景2、FIFO数据传输之流控总结前言 场景1:包数据FIFO设计之冗余法 场景:类似图像、文字等码流数据是不需要重复被访问的,因此使用FIFO进行缓存(如果需要被存储,一…

计算机毕业设计 | springboot+vue大学城水电管理系统 校园学校物业水电管理(附源码+文档)

1,绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理大学城水电管理系统的相关信息成…

5-对象的访问权限

对象的访问权限知识点 对象的分类 在数据库中,数据库的表、索引、视图、缺省值、规则、触发器等等、都可以被称为数据库对象,其中对象主要分为两类 1、模式(schema)对象:模式对象可以理解为一个存储目录、包含视图、索引、数据类型、函数和…

药方新解:Spring Boot中药实验管理系统设计

3系统分析 3.1可行性分析 通过对本中药实验管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本中药实验管理系统采用SSM框架,JAVA作为开发语…

动态规划-完全背包问题——279.完全平方数

1.题目解析 题目来源 279.完全平方数——力扣 测试用例 2.算法原理 1.状态表示 完全背包问题通常都是使用一个二维数组来表示其状态,这里是 dp[i][j]:在[1,i]区间选择平方数,当此时已选择平方数的总和完全等于j时所选择的最小平方数个数 …

二叉树的层序遍历

一、题目 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,null,null,15,7}, 该二叉树层序遍历的结果是 [[3],[9,20],[15,7]] 二、解决方案 2.0 树…

模型训练过程的显存占用实测

依赖项说明 pip install nvitop pip install timm pip install peft后续的显存占用数据截图,均基于nvitop命令实现 1、模型显存占用说明 1.1 理论占用值 在 一文讲明白大模型显存占用(只考虑单卡)与大模型显存占用分析都对模型训练过程中…

后端分层解耦

引入 在上篇所举的例子中,我们将所有的代码均放在HelloControl方法之中,这样会导致代码的复用性、可读性较差,难以维护。因此我们需 三层架构 在之前的代码中,代码大体可以分为三部分:数据访问、数据逻辑处理、响应数…

AIGC 入门全攻略:开启智能创作新时代

一、AIGC 初印象 AIGC,即人工智能生成内容,是继专业生产内容(PGC)、用户生产内容(UGC)之后的新型内容创作方式。它涵盖了文本生成、图像与视频创作、音频生成等多个领域,正在以惊人的速度改变着…

约克VRF地暖中央空调,让你舒适过冬

想要冬季过得舒服,采暖必须要到位!对于没有集中供暖的南方地区来说,冬季室内阴冷刺骨。 选购地暖中央空调时,强效制热的能力必不可少,让我们可以享受温暖的室内温度,有效减少室内忽冷忽热的温度变化。 约克…

基于Java Springboot宠物领养救助平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

使用原生 OpenTelemetry 解锁各种可能性:优先考虑可靠性,而不是专有限制

作者:来自 Elastic Bahubali Shetti•Miguel Luna Elastic 现在支持使用 OTel Operator 在 Kubernetes 上部署和管理 Elastic Distributions of OpenTelemetry (EDOT)。SRE 现在可以访问开箱即用的配置和仪表板,这些配置和仪表板旨在通过 Elastic Observ…

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型

本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统,旨在通过技能匹配的方式对招聘信息进行分析与预测,帮助求职者根据自身技能找到最合适的职位,同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…

安装 python-pcl 遇到的问题

安装python-pcl 成功安装错误尝试尝试一尝试二尝试三 本人环境 Ubuntu 22.04.4LTS ros2-humble cpython 3.0.11 python 3.10.12 libpcl-dev 1.12.1dfsg-3build1 pcl-tools 1.12.1dfsg-3build1 代码摘抄来源:Breadcrumbsouster-ros-extras/scripts/ros2_pcl_filters.…

【C++进阶篇】——string类的使用

文章目录 前言:1. string的介绍2. string类对象的常见构造3. string类对象的容量操作4. string类对象的访问5. 迭代器6. string类对象的修改操作7. string类对象的字符串运算8.string类成员函数9.string类非成员函数10.string类常量成员 前言: std::str…

vmware虚拟机给创建的centos扩展磁盘步骤

1.先看看原来的磁盘信息,目前磁盘是20g的,重点关注红色箭头指向的地方,一个17g 可用11g,接下来要对其进行扩展 df -h2.关闭当前虚拟机,先进行磁盘扩展,目前我扩展到了50g。 3.重新开启虚拟机,…

开源物业管理系统助力智能社区提升服务效率与用户体验

内容概要 开源物业管理系统是一种灵活、智能的解决方案,专为社区物业管理而生。随着智能社区的发展,这种系统变得越来越重要。它不仅帮助物业管理者高效地处理日常事务,还提升了居民的生活体验。在这个日新月异的时代,开源物业管…

深入理解 Redis跳跃表 Skip List 原理|图解查询、插入

1. 简介 跳跃表 ( skip list ) 是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 在 Redis 中,跳跃表是有序集合键的底层实现之一,那么这篇文章我们就来讲讲跳跃表的实现原理。 2. …