一、什么是监督学习?先用“做题”类比一下
监督学习 的核心特点是:
每个样本都有一个“标准答案”(标签),模型通过大量“带答案的题目”来学习规律。
地学里常见的“题目 + 答案”例子:
-
某个深度点:
-
题目:GR、RT、DEN、AC 等测井曲线数值
-
答案:该处岩性 = 砂岩 / 泥岩 / 灰岩 / 混合细粒岩(分类问题)
-
-
某个岩心段:
-
题目:测井响应 + 地球化学指标
-
答案:实验测得孔隙度、渗透率(回归问题)
-
模型的目标:
给它一堆“题目 + 标准答案”,它自己总结出“解题规律”;
以后再给它没有答案的新题,它也能给出一个 尽量接近地质真实 的预测。
二、回归:预测一个“数”,比如孔隙度
先从最地质工程化的例子讲起:
例子:用测井曲线预测孔隙度
假设你有几口井的如下数据(简化):
-
输入特征(X):
-
GR(自然伽马)
-
DEN(密度)
-
AC(声波时差)
-
-
输出标签(y):
-
岩心测得的孔隙度 φ(单位 %)
-
问题:
能否训练一个模型,让它根据 GR、DEN、AC,预测对应深度的孔隙度?
1. 用一个非常简单的模型来理解:线性回归
先不管复杂算法,想象模型就是一个“公式”:
预测孔隙度
= w₀ + w₁·GR + w₂·DEN + w₃·AC
这里的 w₀、w₁、w₂、w₃ 就是模型的“参数”。
学习(训练) 的本质,就是要找到一组合适的 w,使得这个公式算出来的结果尽量接近真实的孔隙度。
2. 模型如何“感知自己错了没有”?
我们得有一个指标来衡量“预测得好不好”,常见的是 均方误差(MSE):
MSE = 所有样本 (预测值 - 真实值)² 的平均
-
差得越离谱,这个值越大;
-
预测得越准,这个值越小。
所以,训练的目标可以理解为一句话:
找到一组 w₀、w₁、w₂、w₃,
使得 MSE 尽可能小。
3. “学习”的过程可以想象成这样
-
一开始,模型 瞎猜一组参数:
-
比如 w₀ = 0, w₁ = 0, w₂ = 0, w₃ = 0,
-
此时,无论输入什么,预测都是 0%。
-
-
用这组参数,对所有训练样本做一遍预测:
-
对每个样本 i,都得到预测孔隙度 φ̂ᵢ。
-
-
计算误差:
-
真实孔隙度 = φᵢ
-
预测孔隙度 = φ̂ᵢ
-
误差 eᵢ = φ̂ᵢ − φᵢ
-
把所有 eᵢ² 平均起来,就是当前的 MSE。
-
-
看看如果稍微“调整参数”,误差能不能变小:
-
把与孔隙度相关性很强的曲线(比如 AC)对应的 w₃ 往某个方向调,
-
如果 MSE 变小,说明调的方向对;再往这个方向继续调。
-
如果 MSE 变大,说明调“错边”了,往反方向调。
-
-
重复第 2~4 步很多很多次,直到误差不再明显下降。
-
这就是所谓的“迭代训练过程”,
-
常见的优化方法叫“梯度下降”。
-
最后,我们就得到了一组比较合理的参数 w₀、w₁、w₂、w₃。
这时,给模型一个新井的数据(只有 GR、DEN、AC,没有岩心孔隙度),
模型就会根据当前公式给出一个孔隙度预测值。
4. 回归任务的常见评估指标
训练完之后,我们一般会关心:
-
RMSE(均方根误差):误差的“平均幅度”是多少?
-
R²(判定系数):预测结果与真实值的相关程度,有点类似“相关系数的平方”。
同时,也要 画图看一眼:
-
实测 vs 预测 点云图(是否靠近 y = x 直线)
-
某段井的孔隙度剖面:
-
实测曲线
-
预测曲线
-
看看哪里差得比较厉害,是否有明显的地质原因(比如裂缝发育、异常高孔段等)。
-
三、分类:预测一个“类”,比如岩性类型
再看地学中更典型的任务:
例子:根据测井曲线识别岩性
假设你有如下数据:
-
输入特征(X):GR、RT、DEN、CALI 等
-
输出标签(y):岩性类别:
-
0 = 泥岩
-
1 = 砂岩
-
2 = 灰岩
-
3 = 混合细粒岩
-
这次,输出不再是一个连续数字,而是一个 离散的类别。
1. 模型不再输出一个数,而是输出“属于各类型的概率”
一个典型的分类模型(比如逻辑回归、随机森林、神经网络)在某个深度点的输出往往是:
-
属于泥岩的概率:P(泥岩) = 0.70
-
属于砂岩的概率:P(砂岩) = 0.20
-
属于灰岩的概率:P(灰岩) = 0.05
-
属于混合细粒岩的概率:P(混合细粒岩) = 0.05
然后,选概率最大的那个作为预测类别:
0.70 最大 → 预测为 “泥岩”
2. 分类问题的“好坏”怎么度量?
直觉上,我们希望:
-
正确类别的概率越大越好,
-
错误类别的概率越小越好。
这类问题常用的一个损失叫 交叉熵损失(Cross-Entropy Loss),大意是:
真正类别的预测概率越接近 1,损失越小;
越接近 0,损失越大(甚至趋向无穷大)。
例如:真实类别是“砂岩”:
-
如果模型给:P(砂岩) = 0.9,则损失很小
-
如果模型给:P(砂岩) = 0.1,则损失很大
训练的目的同样可以概括为:
调整模型参数,使所有样本的交叉熵损失尽量小。
3. 分类任务常看哪些指标?
训练完分类模型后,我们会关注:
-
总体准确率(Accuracy)
-
所有样本中,预测对了的比例。
-
-
混淆矩阵(Confusion Matrix)
-
每一行是真实岩性,每一列是预测岩性。
-
可以看到:
-
某种岩性常被混淆为哪种(比如泥岩常被错分为混合细粒岩)。
-
某类样本数量是否太少(样本极度不平衡)。
-
-
-
分每一类的识别率(召回率 / Recall)
-
对页岩油评价来说,可能最关心的是“高品质储层能不能认出来”,
-
那就重点看该类的召回率,而不是只看总体准确率。
-
地质角度上,我们往往更关心:
哪些岩性容易被混淆?
这种混淆在地质上是否合理?
是否需要重新调整岩性划分标准或者样本标注?
四、为什么总是在说“训练集”和“测试集”?
不论是预测孔隙度,还是识别岩性,你可能经常听到一个说法:
要把数据分成训练集和测试集。
原因很简单:
我们不想只知道模型在“见过的井”上表现如何,更想知道:
在“没见过的新井”上,它还能不能保持比较可靠的效果?
所以通常会:
-
把所有样本打乱。
-
拿出一部分(比如 70%)做 训练集:用来“教模型”。
-
剩下的(比如 30%)做 测试集:训练过程中不让模型看到,最后 一次性评估。
更严谨一点的做法是:
-
甚至按井来划分:
-
某几口井全部做训练井,
-
剩下 1~2 口井作为独立测试井。
-
-
这样更接近真实场景:
-
模型在“老井”上训练,
-
用来预测“新布井”的情况。
-
五、用一条简化流程串一下:模型到底是怎么“学会”的?
以“根据测井预测孔隙度”为例,一句话版流程:
-
准备数据:
-
收集多口井的 GR、DEN、AC + 孔隙度(岩心或实验数据)。
-
-
划分训练集 / 测试集:
-
比如:80% 深度点训练,20% 深度点测试;
-
或者:按井划分,某口井专门留作测试。
-
-
定义模型结构:
-
比如简单的线性回归,
-
或者稍复杂一点的随机森林 / 神经网络。
-
-
定义损失函数:
-
回归用 MSE,分类用交叉熵之类。
-
-
开始训练:
-
反复把训练集数据扔给模型,
-
根据损失函数调整参数,使误差变小。
-
-
在测试集上评估:
-
计算 RMSE、R² 或准确率、混淆矩阵,
-
看效果是否 acceptable。
-
-
结合地质常识审查结果:
-
是否出现明显不合理的预测?
-
是否对某些岩性或某些段预测特别差?
-
需要不需要调整数据、特征或岩性划分?
-
-
最后,才是应用到实际工作:
-
用来预测未钻井测井曲线、未取心井的孔隙度,
-
或者辅助划分储层级别、甜点区段。
-
六、结语:先把“回归 + 分类”打牢,再谈复杂算法
在 AI 的世界里,模型的名字可以五花八门:线性回归、随机森林、SVM、XGBoost、CNN、LSTM……
但它们在监督学习框架下,本质都在做类似的几件事:
-
输入:一组你准备好的特征(测井、地震、地球化学等);
-
输出:一个数(回归)或一个类别(分类);
-
通过优化“预测 vs 真实”的差距,让模型越来越接近我们希望的结果。
对我们这样的地学背景来说,真正重要的并不是掌握多少种模型名字,而是:
知道什么时候这是一个“回归问题”,什么时候是“分类问题”;
知道什么数据能用来做标签,什么特征是有地质意义的;
知道评估模型时,不能只看一个数字,而要结合地质解释。
文章评论