机器学习模型中的因果关系:引入单调约束

news2025/1/9 21:07:52

单调约束是使机器学习模型可行的关键,但它们仍未被广泛使用欢迎来到雲闪世界。

碳ausality 正在迅速成为每个数据科学家工具包中必不可少的组成部分。

这是有充分理由的。

事实上,因果模型在商业中具有很高的价值,因为它们为“假设”情景提供了更可靠的估计,特别是在用于做出影响业务结果的决策时。

在本文中,我将展示如何通过简单的更改(实际上添加一行代码)将传统的 ML 模型(如随机森林、LightGBM、CatBoost 等)转变为回答因果问题的可靠工具。

因果 ML 模型与传统 ML 模型

假设我们在一家房地产公司工作,公司的业务是购买房屋,然后以更高的价格转售。

我们收集了过去交易过的房屋数据。数据集包含 3 个变量:

  • “平方英尺”,房屋的平方英尺数;
  • “整体状况”,对房产整体状况的数字评分,评分范围为 1 至 9(分数越高越好);
  • “房屋售价”,即房屋最终售出的价格。

以下是数据集中的前 5 栋房屋:

[作者图片]

与以相同方式处理所有特征的传统 ML 模型相比,因果 ML 模型区分了两种类型的特征:

  • 协变量特征,仅可观察到的特征;
  • 处理特征,这些特征可能会受到决策者(在本例中为我们的公司)的影响。

在我们的案例中,我们当然无法改变房屋的面积。我们能做的是通过装修改善房产状况,希望这会影响目标变量(即我们能够以更高的价格出售房屋)。

因此“平方英尺”是一个协变量特征,“整体状况”是一个治疗特征。

[作者图片]

因果模型的主要优势是能够回答因果(或“假设”)问题。

例如,假设我们公司刚刚购买了一栋新房,建筑面积为 3,000 平方英尺,当前状况评级为 5。该公司有两种选择:

  • 按原样出售房屋;
  • 花费 30,000 美元翻新房屋,将状况评级从 5 提高到 7,然后出售。

[作者图片]

公司应该做什么?

“我们应该装修这所房子吗?”

我们是数据科学家,所以我们首先想到的就是训练一个机器学习模型来预测房屋在装修前后的最终价格。

假设我们决定为此目的使用决策树。我们首先在训练数据集上拟合模型:

从sklearn.tree导入DecisionTreeRegressor 

decision_tree = DecisionTreeRegressor( 
  max_depth= 3 , 
  min_samples_leaf= 10
 ) 

decision_tree.fit(X_train, y_train)

然后,我们使用该模型预测两种情况下(有或无装修)的销售价格。

X = [ 
  [3_000, 5],3_000 , 5 ], 
  [ 3_000 , 7 ] 
]

决策树.预测(X)

以下是结果:

[作者图片]

我希望你不要与销售部门分享这些结果——他们可能会禁止你再次说“机器学习”

他们说得对。这个结果显然是荒谬的。通过翻修改善房屋状况怎么会降低其价值,使其从 36 万美元降至 24.7 万美元呢?

我们的模型肯定有问题。

由于该模型仅基于两个特征,我们可以在二维热图中直观地看到预测阈值:

[作者图片]

这个模型中有几件事完全没有意义:

  • 对于面积在 1,150 到 1,500 平方英尺之间的房屋,将其状况从 5 或更低改善到 6 或更高,会使其价值从 174,000 美元降低到 145,000 美元。
  • 同样,对于面积超过 2,300 平方英尺的房屋,将其状况从 5 或更低改善到 6 或更高,会使其价值从 36 万美元降低到 24.7 万美元。

我们不能相信这些预测。我们确信房屋装修后的价值不可能低于装修前的价值,所以我们需要一种方法将这一常识“转移”到我们的模型中。

引入单调约束

我们的 ML 模型的一个理想特性是,在我们改善房屋状况后,模型应该预测一个大于或等于原始值的值。相反,如果房屋状况更糟,则该值应该更小或相等。

因此,让我们以数据点(面积为 3,000 平方英尺且状况评级为 5 的房屋)为例,并可视化我们希望模型捕捉到的这个属性。

[作者图片]

这被称为“单调约束”,因为它没有说明关系的类型(线性、二次……),而只说明了关系的方向(非减少与非增加)

这个要求比线性约束(即线性回归施加的约束)弱得多,这是很好的,因为:

自然界中很少有关系是线性的,但自然界中的许多关系都是单调的。

这就是为什么线性回归通常表现不佳的原因:它对模型施加了线性约束,这在大多数实际情况下是一个不切实际的强假设。

薪水会随着经验的增加而增加吗?会,但只是单调增加,而不是线性增加。冰淇淋销量会随着温度的升高而增加吗?会,但只是单调增加,而不是线性增加。你懂的。

对于每个特征,我们可以想象以下三种情况之一:

  • +1:当特征增加时,预测必须大于或等于;
  • 0:没有单调约束(默认);
  • -1:当特征增加时,预测必须更小或相等。

基于我们所说的,我们需要在称为“整体状况”的特征上添加“+1”单调约束,以确保更好的分数始终对应于更高或相同的价格。

但是“平方英尺”又如何呢?

从视觉上看,这是仅对特征“整体条件”应用单调约束与将其应用于两个特征之间的区别:

[作者图片]

让我们看看左边的图。如果我们只对“整体状况”应用单调约束,我们就无法对面积不同的房屋做出任何判断。在这种情况下,我们会得到:

  • (平方英尺:3,000,整体状况:5)-> 价格:x;
  • (平方英尺:3,000,整体状况:7)-> 价格:y ≥ x
  • (平方英尺:4,000,整体状况:7) -> 价格:z,可能高于或低于xy,因为对变量“平方英尺”没有限制。

相反,在右侧的图中,我们对两个特征都应用了正约束,因此:

  • (平方英尺:3,000,整体状况:5)-> 价格:x;
  • (平方英尺:3,000,整体状况:7)-> 价格:y ≥ x
  • (平方英尺:4,000,整体状况:7)-> 价格:z ≥ y ≥ x

我认为第二种情况更符合我们的直觉。

请注意,在这些图中,我们观察了单调约束对坐标为 (3,000, 5) 的单个数据点的影响,但相同的推理也适用于数据集内的任何数据点

让我们看看将这些单调约束应用到我们的预测模型后会发生什么。

在 Python 中强制执行单调约束

好消息是,单调约束得到了最流行的 Python ML 库(如 Scikit-learn、LightGBM 和 CatBoost)的支持,只需添加一行代码即可应用。

就我们的决策树而言:

decision_tree_with_constraints = DecisionTreeRegressor(
  max_depth=3, 3, 
  min_samples_leaf=10,
  monotonic_cst=[1,1] # this line of code adds monotonic constraints
)

decision_tree_with_constraints.fit(X_train, y_train)

我们现在可以将非约束模型(左图)的预测热图与约束模型(右图)的预测热图进行比较。

[作者图片]

新的预测(右侧图表)更有意义。事实上,它们对于“平方英尺”和“总体状况”而言都是非减少的。

但决策树可能过于简单。所以,现在让我们尝试使用性能更高的模型,例如 CatBoost。

catboost = CatBoostRegressor(
  silent=TrueTrue
)

catboost_with_constraints = CatBoostRegressor(
  silent=True, 
  monotone_constraints={"square feet": 1, "overall condition": 1}

我们可以使用 CatBoost 来模拟假设情景。例如:如果我们改变面积分别为 500、1,000、2,000 或 3,000 平方英尺的房屋的“整体状况”,会发生什么?

这也被称为敏感性分析,因为它根据输入变量(房屋的整体状况)的变化来测量结果(我们的模型预测的销售价格)的敏感性。

[作者图片]

受约束的版本比不受约束的版本好得多。

事实上,在约束模型中,面积较小的房屋(500 至 1,000 平方英尺)的预测价格会平稳上升。与此同时,面积较大的房屋(2,000 至 3,000 平方英尺)的状况评分提高会导致价格大幅上涨。

这给出了一个非常直接的商业见解:如果一栋房子面积很大,但状况很差(评分为 4 分或更低),那么对其进行翻新以高得多的价格出售是合理的。但是,将房屋状况改善到 5 分以上是没有意义的,因为这不会带来实质性的额外价值。

受约束模型的预测比不受约束模型的预测更容易解释。但它们的表现如何呢?例如 R 平方?

[作者图片]

不仅约束模型的样本外性能要好得多(57% 对 53%),而且约束模型的 R 平方也明显低于无约束模型的 R 平方(55% 对 72%)。

这意味着,与不受约束的模型相比,具有单调约束的模型过度拟合的程度要小得多

这很有道理:通过施加单调约束,我们将一些关于世界的知识“转移”到模型中。这基本上就像是免费数据!

结论

在本文中,我们已经看到,向 ML 模型添加单调约束可能是一个好主意,原因如下:

  • 提高回答影响商业决策的“假设”问题的可靠性;
  • 在您选择的指标(例如 R 平方)方面表现更佳;
  • 更少的过度拟合,因为我们直接将我们对世界的一些知识(或常识)转移到模型中。

换句话说,单调约束似乎是两个相反极端之间的最佳点:允许模型完全自由(传统的“让数据说话”方法)与强加不切实际的强烈假设(例如线性回归)。

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

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

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

相关文章

经典文献阅读之--WidthFormer(基于Transformer的BEV方案量产方案)

0. 简介 《WidthFormer: Toward Efficient Transformer-based BEV View Transformation》提出了WidthFormer,这是一种基于Transformer的新颖鸟瞰视角(Birds-Eye-View, BEV)三维检测方法,专为实时自动驾驶应用而设计。WidthFormer…

网络安全 day5 --- 反弹SHELL不回显带外正反向连接防火墙出入站文件下载

免责声明 本免责声明适用于作者所有文章内容。使用者需明确,网络安全技术仅供学习和合法研究使用,不得用于任何非法活动,如未经授权的入侵、攻击或数据窃取,所有相关法律责任由使用者自行承担。由于网络安全操作可能带来系统崩溃、…

程序中的零值比较

前言:什么是零值? 在C/C中,“零值”通常指的是数值类型的零(0),对于指针来说则是空指针(nullptr 或 NULL)。下面我们将分别讨论如何比较整型、字符、浮点数和指针与“零值”的比较。…

顺序表与链表练习

目录 1.在长度为n(n > 1)的单链表上,设有头和尾两个引用,执行( )操作与链表的长度有关。 2.下列关于链表的说法那个是正确的( ) 3. 关于链表和顺序表间的区别,叙述错误的是( ) 4.在长度为 n 的顺序表下标为 i…

oatpp apiclient 客户端get,post请求python fastapi demo

最新用fastapi搞了个服务端,python功能太强了,就是环境不好弄,弄好后,不要轻易换python版本,不要装多个python版本 前面搞了个oatpp webapi服务端,现在要用客户端,为什么用opatpp客户端,因为他不再带其他库了 demo: 我的请求比较简单,就是向python 的 fastapi服务端…

CSP-J基础之常见的竞赛题库

文章目录 CSP-J基础之常见的竞赛题库1. 可达 (KEDA)2. 洛谷 (Luogu)3. Codeforces 洛谷账号的注册总结 CSP-J基础之常见的竞赛题库 在备战CSP-J(Certified Software Professional Junior)及其他信息学竞赛时,选手们常需要借助在线题库来进行…

GIS圈大事件!Cesium被收购了,是好是坏?

大家好,我是日拱一卒的攻城师不浪,致力于技术与艺术的融合。这是2024年输出的第34/100篇文章。 Cesium开发交流群V:brown_7778(备注来意) 一觉醒来,突然看到Cesium官方发的消息,宣布通过收购的方…

第十三届山东省ICPC

vp链接&#xff1a;https://codeforces.com/gym/104417 A. Orders 根据题意模拟&#xff0c;分别按照 a&#xff0c;b 排序&#xff0c;排序后再判断该订单是否能完成。 #include <bits/stdc.h> using namespace std;#define int long longconst int N 105; int n, k…

C#索引器(Indexer)

索引器(Indexer)允许一个对象可以像数组一样使用下标的方式来访问. 当为类定义一个索引器时,该类的行为就会像一个虚拟数组(virtual array) 一样.可以使用数组访问运算符[]来访问该类的成员. 语法 一维索引器的语法如下: element-type this[int index] { // get 访问器 …

Minimax-秋招正式批-面经(SQL相关)

1. 谈谈对聚簇索引的理解 聚簇索引 InnoDB通过主键聚集数据&#xff0c;如果没有定义主键&#xff0c;InnoDB会选择非空的唯一索引代替。如果没有这样的索引&#xff0c;InnoDB会隐式定义一个主键来作为聚簇索引聚簇索引就是按照每张表的主键构造一颗B树&#xff0c;同时叶子…

中国书法——孙溟㠭浅析碑帖《越州石氏帖》

孙溟㠭浅析碑帖《越州石氏帖》 《越州石氏帖》 是一部汇集多本摹刻的帖&#xff0c;南宋时期的会稽石邦哲&#xff08;字熙明&#xff09;把家藏的一些法书碑帖集中一起摹刻成的&#xff0c;宋理宗时临安书商陈思《宝刻丛编》有记載这部帖的目录。现在还存有宋代时拓的残缺本…

golang hertz框架入门

两种模式新建项目 1、手动新建项目 2、使用hz工具新建项目 一、手动创建项目&#xff0c;并拉取框架 1、新建项目目录 hertz_demo_w 2、在项目跟目录新建main.go 文件 package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.…

WPS如何查看已添加到词典的单词

WPS Office&#xff08;12.1.0.17827&#xff09; ① 点击文件&#xff0c;在文件中找到选项 ② 找到拼写检查并点击自定义词典 ③ 如果要删除已添加到词典的"错词"&#xff0c;则点击修改 ④ 选择"错词", 点击删除

电工基础知识

1、电工常用的电工工具 2、PPR常用配件名称 3、铜芯导线如何选择线鼻子 4、丝锥孔径对照表 5、三相电机接线方法_星形_角型 6、内六角螺铨尺寸表 7、常用螺母规格尺寸 8、常用螺栓螺母名称 9、灭火器分类使用 10、电缆颜色使用代码 11、电缆铜铝鼻子 12、空气开关

力扣第一题:两数之和

文章目录 需求分析代码结尾 需求 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你…

Hexo博客构建记录

开学了&#xff0c;准备让休息了两个月的大脑重新活动一下筋骨&#xff0c;就尝试了一下Hexo博客的简单构建。在这里记录一下&#xff0c;方便以后使用。 以下是笔者搭建时用到的教程 简单搭建教程 简单&#xff0c;虽然个人感觉布局有点乱&#xff0c;关于上传文章的介绍略…

如何下载各个版本的tomcat-比如tomcat9

1&#xff0c;找到tomcat官网https://tomcat.apache.org/ Apache Tomcat - Welcome! 找到tomcat9&#xff0c;或者archives 1.1&#xff0c;找到对应版本 1.2&#xff0c;找到小版本 1.3&#xff0c;找到bin 2&#xff0c;Index of /dist/tomcat/tomcat-9/v9.0.39/bin 2.1&a…

七牛云存储OSS基本使用测试(超详细!!!)

首先就是注册&#xff0c;然后实名认证&#xff0c;这没什么可教的 认账成功后&#xff0c;点击对象存储Kodo 点击左侧空间管理&#xff0c;新建空间 输入一个名字&#xff0c;存储区域选择距离你地址比较近的&#xff0c;访问控制选择公开(这样别人在访问时也可以看到) 这样就…

”CSS 网格“二维布局系统(补充)——WEB开发系列32

CSS 网格布局是一种二维布局系统&#xff0c;用于网页设计。通过使用网格&#xff0c;你可以将内容以行和列的形式进行排列。此外&#xff0c;网格布局还能够简便地实现一些复杂的布局结构。 一、什么是网格布局&#xff1f; CSS网格布局是一种二维布局系统&#xff0c;它允许…

基于IMX6ULL的Cortex-A中断原理讲解,以及编写其中断向量表

首先借助STM32我们需要了解中断系统是如何构成的 会有一个中断源&#xff0c;也就是能够向CPU发出中断请求的设备或事件。中断源不分硬件和软件&#xff0c;也就是产生中断信号&#xff0c;就会执行中断服务函数 但是CPU是如何知道中断源产生后就找到对应的中断…