使用机器学习方法选择水力压裂候选井

图片



今天,我们将告诉您如何使用机器学习(以下简称ML)为水力压裂(HF)候选井开发搜索系统,以及搜索系统的结果。让我们弄清楚为什么需要水力压裂,机器学习与水力压裂有什么关系,以及为什么我们的经验不仅对石油工人有用,而且为什么。



在切口下,详细说明了问题,描述了我们的IT解决方案,选择了指标,创建了ML管道,开发了用于发布产品模型的体系结构。



我们在这里这里的以前的文章中写过为什么要进行压裂



为什么在这里进行机器学习?一方面,水力压裂比钻井便宜,但成本仍然很高,另一方面,不可能在每口井都做到这一点-不会有效果。一位地质专家正在寻找合适的地方。由于运营公司的数量众多(数以万计),因此通常会忽略期权,并且公司不会获得可能的利润。机器学习的使用可以大大加快信息分析的速度。但是,创建ML模型只是成功的一半。有必要使其以恒定模式工作,将其连接到数据服务,绘制精美的界面并使其易于使用,以便用户两次单击即可进入应用程序并解决其问题。



从石油行业中摘录,可以注意到所有公司都在解决类似的任务。每个人都希望:



A.自动处理和分析大型数据流。

B.降低成本,不要错过收益。

C.使这样的系统快速有效。



从本文中,您将了解我们如何实现这样的系统,使用了哪些工具以及在将ML引入生产的棘手道路上遇到了哪些障碍。我们确信,无论活动领域如何,想要使例程自动化的每个人都会对我们的经验感兴趣。



如何以“传统”方式选择水力压裂井



当选择水力压裂的候选井时,石油工人将依靠他丰富的经验并查看不同的图形和表格,然后他预测在哪里进行水力压裂。但是可靠地,没人知道在几千米深处发生了什么,因为从地下看它并不那么容易(您可以在上一篇文章中阅读更多内容)。通过“传统”方法进行数据分析需要大量的人工成本,但不幸的是,它不能保证对水力压裂结果的准确预测(扰流器-ML也是如此)。



如果我们描述当前识别水力压裂候选井的过程,则将包括以下阶段:从公司信息系统中卸载油井数据,处理获得的数据,进行专家分析,达成解决方案,进行水力压裂以及分析结果。看起来很简单,但并不完全。



图片

当前候选井



选择过程这种“手动”方法的主要缺点是例行常规,数量增加,人们开始淹没工作,过程和方法不透明。



问题的提法



在2019年,我们的数据分析团队面临着创建自动化系统的任务,该系统用于选择水力压裂候选井。对于我们来说,听起来像是-模拟所有油井的状态,假设现在有必要对它们进行水力压裂,然后按产油量增长最大的顺序对油井进行排名,并选择车队将前往的Top-N油井并采取措施以提高采油量。



使用ML模型,形成了指示符,指示了在特定井上进行水力压裂的可行性:计划的水力压裂之后的采油活动以及该事件的成功。



在我们的案例中,石油生产率是指每月产生的石油量(立方米)。该指标是根据两个值计算的:液体流速和含水率。石油工人称液体为油和水的混合物-正是这种混合物是油井的产物。含水率是给定混合物中水含量的比例。为了计算压裂后的预期产油量,使用了两个回归模型:一个预测压裂后的流体流速,另一个预测含水率。使用模型数据返回的值,使用以下公式计算石油产量预测:



图片



压裂成功是一个二进制目标变量。使用水力压裂后获得的产油率增加的实际值确定。如果增长大于领域专家确定的某个阈值,则成功属性的值等于1,否则等于0。因此,我们形成了用于解决分类问题的标记。



至于指标……任何机器学习课程都告诉我们,指标应该来自业务并反映客户的利益。我们认为,这是机器学习项目的主要成败所在。一组数据科学家可以根据需要随时改善模型的质量,但是如果它不能以任何方式增加客户的业务价值,那么这种模型注定会失败。毕竟,对于客户而言,在水力压裂后获得对油井性能参数进行“物理”预测的准确候选人至关重要。



对于回归问题,选择了以下指标:



图片



您问为什么没有一个指标-每个指标都反映了自己的真实性。对于平均生产率高的领域,MAE将很大而MAPE会很小。如果我们选择一个平均生产率较低的油田,情况将相反。



针对分类问题选择了以下指标:



图片

wiki),



ROC – AUC曲线下的面积(wiki)。



我们遇到的



错误错误1-为所有字段构建一个通用模型。



在分析了数据集之后,很明显,数据从一个字段更改为另一个字段。这并不奇怪,因为矿床通常具有不同的地质结构。

我们的假设是,如果我们将所有可用的数据用于训练,然后将其驱动到模型中,那么它本身就会揭示出地质结构的规律性,这是失败的。在特定字段的数据上训练的模型显示的预测质量高于使用有关所有可用字段的信息创建的模型的预测质量。

对于每个领域,测试了不同的机器学习算法,并根据交叉验证的结果,选择了MAPE最低的算法。



图片



错误2-缺乏对数据的深入了解。



如果您想为真实的物理过程创建一个好的机器学习模型,请了解该过程是如何发生的。



最初,我们的团队没有领域专家,所以我们混乱无序。 las,我们在分析预测时没有注意到模型的错误,他们基于结果得出了错误的结论。

错误#3-基础设施不足。



首先,我们为不同的字段和不同的参数下载了许多不同的csv文件。在某个时候,已经积累了无法承受的大量文件和模型。复制已进行的实验变得不可能,文件丢失并且引起混乱。



1.技术部分



今天,我们的候选人自动选择系统如下所示:



图片



每个组件都是一个执行特定功能的独立容器。



2.1 ETL =数据加载



一切都始于数据。特别是如果我们要构建机器学习模型。我们选择Pentaho Data Integration作为集成系统。



图片

转换之一的屏幕截图



主要优点:



  • 自由系统;
  • 大量用于连接各种数据源和转换数据流的组件;
  • 网络界面的可用性;
  • 通过REST API进行管理的能力;
  • 记录。


除了上述所有内容外,我们在开发该产品的集成方面还具有丰富的经验。为什么在ML项目中需要数据集成?在准备数据集的过程中,始终需要执行复杂的计算,将数据转换为单一形式,“沿途”计算新指标,随时间变化的参数等。



对于水力压裂的每个事实,要卸载400多个描述当时井的运行的参数。活动,相邻井的操作以及先前执行的水力压裂信息。此外,进行数据转换和预处理。



我们选择PostgreSQL作为已处理数据的存储库。它具有使用json的大量方法。由于我们以这种格式存储最终数据集,因此这成为决定性因素。



由于添加了新功能,机器学习项目与输入数据的不断变化相关联,因此,Data Vault被用作数据库架构(链接至Wiki)。这种存储设计方案使您可以快速添加有关对象的新数据,而又不会破坏表和查询的完整性。



2.2数据和模型服务



在梳理和计算了必要的指标之后,数据被上传到数据库。它们存储在这里,正在等待datasinter带它们创建ML模型。为此,有DataService-用Python编写并使用gRPC协议的服务。它允许您获取数据集及其元数据(要素类型,其描述,数据集大小等),加载和卸载预测,通过训练/测试管理过滤和划分参数。数据库中的预测以json格式存储,这使您可以快速接收数据并不仅存储预测值,而且还存储每个功能对该特定预测的影响。



图片

用于数据服务的样本原型文件。



创建模型时,应将其保存-为此,将使用ModelService,该服务也使用gRPC用Python编写。该服务的功能不仅限于保存和加载模型。此外,它允许您监视指标,功能的重要性,还可以实现模型+数据集连接,以便在出现新数据时随后自动创建预测。



图片

我们的模型服务的结构如下所示。



2.3 ML模型



在某个时刻,我们的团队意识到自动化也应该影响ML模型的创建。这种需求是由加快做出预测和检验假设的过程所驱动的。然后,我们决定开发并实现自己的AutoML库到我们的管道中。



最初,考虑了使用现成的AutoML库的可能性,但事实证明现有解决方案不够灵活,无法完成我们的任务,并且一次也没有所有必需的功能(应工作人员的要求,我们可以写一篇有关AutoML的文章)。我们仅注意,我们开发的框架包含用于预处理数据集,生成和选择特征的类​​。作为机器学习模型,我们使用了之前最成功使用的一组熟悉的算法:xgboost库,catboost,Sklearn的随机森林,Pytorch上的完全连接的神经网络等实现梯度增强。经过训练,AutoML返回了sklearn管道,其中提到的类以及ML模型,在针对所选指标的交叉验证中显示出最佳结果。



除模型外,还针对任何迹象对特定预测的影响形成报告。这样的报告使地质学家可以在一个神秘的黑匣子的底下看。因此,AutoML使用DataService接收标记的数据集,并在训练后形成最终模型。接下来,我们可以通过加载测试数据集,生成预测并计算质量指标来获得模型质量的最终估计值。最后阶段是将生成的模型的二进制文件,其描述,度量上载到ModelService,同时将有关特征影响的预测和信息返回到DataService。



因此,我们的模型被放置在试管中,准备投入生产。我们可以随时使用它根据新的相关数据生成预测。



2.4接口



我们产品的最终用户是地质学家,他需要以某种方式与ML模型进行交互。对他来说,最方便的方法是使用专用软件中的模块。我们已经实现了。



我们的用户可以使用的前端看起来像是一个在线商店:您可以选择所需的字段并获得最可能成功的油井的列表。在井卡中,用户可以看到水力压裂后的预测增长,并自己决定是否要将其添加到“篮子”中,并进行更详细的考虑。



图片

应用程序中的模块接口。



图片

这就是附录中井卡的外观。



除了预测的油和液体增加量外,用户还可以找出影响建议结果的特征。在使用shap方法创建模型的阶段计算出功能的重要性,然后使用DataService将其加载到软件界面中。



图片


该应用程序清楚地显示了哪些功能对于模型预测最重要。



用户还可以查看感兴趣井的类似物。使用Kd树算法在客户端实现对类似物的搜索



图片


该模块显示具有相似地质参数的井。



2.我们如何改进ML模型



图片



似乎值得在可用数据上运行AutoML,我们将感到高兴。但是,碰巧发生了这样的情况,即自动获得的预测质量无法与数据烧结的结果进行比较。事实是,分析师经常提出并检验各种假设以改进模型。如果该想法提高了对真实数据进行预测的准确性,则可以在AutoML中实现。因此,通过添加新功能,我们改进了自动预测,足以继续进行分析和建模,而无需分析师的参与。以下是在我们的AutoML中已经过测试和实现的一些假设:



1.更改填充方法



在最初的模型中,我们用均值填补了特征中几乎所有的空白,但绝对类别除外-对于它们,使用了最常见的含义。后来,在领域专家和分析师的共同努力下,有可能选择最合适的值来填补80%的功能空白。我们还尝试了使用sklearn和missingpy库的其他一些填充方法。恒定填充量和KNNImputer-最高5%MAPE可获得最佳结果。



图片

用不同方法填补空白的实验结果。



2.特征的产生



添加新功能对我们来说是一个反复的过程。为了改进模型,我们尝试根据领域专家的建议,根据科学文章的经验和我们对数据的结论,添加新功能。



图片

测试团队提出的假设有助于引入新功能。



第一个是基于聚类确定的功能。实际上,我们只是根据地质参数在数据集中选择了聚类,并基于聚类为其他特征生成了基本统计信息-这使质量略有提高。



图片

基于聚类选择创建特征的过程。



我们还添加了我们浸入区域区域时发明的迹象:将累计采油量标准化到井龄(以月为单位),累计注入量标准化到井龄(以月为单位),Dupuis公式中包含的参数。但是从sklearn的PolynomialFeatures生成标准集并没有使我们提高质量。



3.



特征选择我们多次进行特征选择:既与领域专家一起手动进行,也使用标准特征选择方法。经过几次迭代,我们决定从数据中删除一些不会影响目标的功能。因此,我们设法减少了数据集的大小,同时保持了相同的质量,从而有可能显着加快模型的创建速度。



现在关于接收到的指标...



在其中一个领域,我们获得了以下模型质量指标:



图片



应该指出的是,水力压裂的结果还取决于许多无法预测的外部因素。因此,我们不能谈论将MAPE减小为0。



结论



使用ML选择水力压裂候选井是一个雄心勃勃的项目,该项目汇集了7名人员:数据工程师,数据专家,领域专家和管理人员。今天,该项目实际上已经准备好启动,并且已经在公司的多个子公司中进行了测试。



该公司愿意进行试验,因此从清单中选择了约20口井并进行了压裂。预测值与初始产油率(MAPE)的实际值之间的偏差约为10%。这是一个非常好的结果!



我们不要狡猾:特别是在初期,我们建议的几口井被证明是不合适的选择。



写下问题和评论-我们将尽力回答。



订阅我们的博客,我们还有许多有趣的想法和项目,我们一定会写的!



All Articles