XGB-6: 单调性约束Monotonic Constraints

在建模问题或项目中,通常情况下,可接受模型的函数形式会以某种方式受到约束。这可能是由于业务考虑,或者由于正在研究的科学问题的类型。在某些情况下,如果对真实关系有非常强烈的先验信念,可以使用约束来提高模型的预测性能

在这种情况下的一种常见约束类型是,某些特征与预测响应呈单调关系

f ( x 1 , x 2 , … , x , … , x n − 1 , x n ) ≤ f ( x 1 , x 2 , … , x ′ , … , x n − 1 , x n ) f(x_1, x_2, \ldots, x, \ldots, x_{n-1}, x_n) \leq f(x_1, x_2, \ldots, x', \ldots, x_{n-1}, x_n) f(x1,x2,,x,,xn1,xn)f(x1,x2,,x,,xn1,xn)

无论何时 x ≤ x ′ x \leq x' xx是一个增加约束;或者

f ( x 1 , x 2 , … , x , … , x n − 1 , x n ) ≥ f ( x 1 , x 2 , … , x ′ , … , x n − 1 , x n ) f(x_1, x_2, \ldots, x, \ldots, x_{n-1}, x_n) \geq f(x_1, x_2, \ldots, x', \ldots, x_{n-1}, x_n) f(x1,x2,,x,,xn1,xn)f(x1,x2,,x,,xn1,xn)

无论何时 x ≤ x ′ x \leq x' xx是一个递减约束;

XGBoost具有对增强模型中使用的任何特征执行单调性约束的能力。

简单示例

为了说明,创建一些模拟数据,其中包含两个特征和一个响应,符合以下方案

y = 5 x 1 + sin ⁡ ( 10 π x 1 ) − 5 x 2 − cos ⁡ ( 10 π x 2 ) + N ( 0 , 0.01 ) x 1 , x 2 ∈ [ 0 , 1 ] y = 5 x_1 + \sin(10 \pi x_1) - 5 x_2 - \cos(10 \pi x_2) + N(0, 0.01) x_1, x_2 \in [0, 1] y=5x1+sin(10πx1)5x2cos(10πx2)+N(0,0.01)x1,x2[0,1]

响应通常随着 x 1 x_1 x1特征的增加而增加,但叠加了正弦变化,导致真实效果是非单调的。对于 x 2 x_2 x2特征,变化是减小的,具有正弦变化。

https://raw.githubusercontent.com/dmlc/web-data/master/xgboost/monotonic/two.feature.sample.data.png

现在对这些数据进行拟合,而不施加任何单调性约束:

https://raw.githubusercontent.com/dmlc/web-data/master/xgboost/monotonic/two.feature.no.constraint.png

黑色曲线显示了从模型中推断出的每个特征的趋势。为了制作这些图,将突出显示的特征 x 1 x_1 x1传递给模型,其值在一维网格上变化,而所有其他特征(在这种情况下只有一个其他特征)被设置为它们的平均值。可以看到该模型很好地捕捉了周期波动的总体趋势。

这是相同的模型,但使用了单调性约束进行拟合:

https://raw.githubusercontent.com/dmlc/web-data/master/xgboost/monotonic/two.feature.with.constraint.png

从上图可以看到约束的效果。对于每个变量,趋势的一般方向仍然明显,但振荡行为不再存在,因为这违反了强加的约束。

在 XGBoost 中强制执行单调约束

在XGBoost中强制执行单调性约束非常简单。这里将使用Python进行示例,但相同的一般思想可以推广到其他平台。

假设以下代码在没有单调性约束的情况下拟合模型:

model_no_constraints = xgb.train(params, dtrain,num_boost_round = 1000, evals = evallist,early_stopping_rounds = 10)

然后拟合单调性约束只需要添加单个参数

params_constrained = params.copy()
params_constrained['monotone_constraints'] = (1, -1)model_with_constraints = xgb.train(params_constrained, dtrain,num_boost_round = 1000, evals = evallist,early_stopping_rounds = 10)

在这个例子中,训练数据 X 有两列,通过使用参数值 (1,-1),告诉 XGBoost 对第一个预测器施加递增约束,并对第二个预测器施加递减约束。

其他一些例子:

  • (1, 0): 对第一个预测器施加递增约束,对第二个预测器没有约束
  • (0, -1): 对第一个预测器没有约束,对第二个预测器施加递减约束

注意

‘hist’ tree construction algorithm的注意事项。如果将tree_method设置为histapprox,启用单调性约束可能会导致树变得不必要地浅。这是因为hist方法减少了在每个分裂处考虑的候选分裂数。单调性约束可能会清除所有可用的分裂候选项,如果发生这种情况,将不会进行分裂。为减少影响,可能需要增加max_bin参数以考虑更多的分裂候选项。

使用特征名称

XGBoost的Python包支持使用特征名称而不是特征索引来指定约束。假设有一个包含列 [ " f 0 " , " f 1 " , " f 2 " ] ["f0", "f1", "f2"] ["f0","f1","f2"]的数据框,可以将单调性约束指定为 " f 0 " : 1 , " f 2 " : − 1 {"f0": 1, "f2": -1} "f0":1,"f2":1,而"f1"将默认为0(无约束)。

import xgboost as xgb
import numpy as np
import matplotlib.pyplot as plt# Simulated data
np.random.seed(42)
num_samples = 1000
X = np.random.rand(num_samples, 2)def calculate_y(X):x1 = X[:, 0]x2 = X[:, 1]return 5 * x1 + np.sin(10 * np.pi * x1) - 5 * x2 - np.cos(10 * np.pi * x2) + np.random.normal(0, 0.01, len(X))y = calculate_y(X)# Fitting a model without monotonicity constraints
params = {'objective': 'reg:squarederror', 'booster': 'gbtree'}
model = xgb.XGBRegressor(**params)
model.fit(X, y)y_pred = model.predict(X)# Fitting a model with monotonicity constraints
params_constrained = {'objective': 'reg:squarederror', 'booster': 'gbtree', 'monotone_constraints': '(1, -1)'}
model_constrained = xgb.XGBRegressor(**params_constrained)
model_constrained.fit(X, y)y_constrained_pred = model_constrained.predict(X)fig, axs = plt.subplots(2, 2, figsize=(12, 10))axs[0, 0].scatter(X[:, 0], y_pred)
axs[0, 0].set_xlabel('X1')
axs[0, 0].set_ylabel('Y')
axs[0, 0].set_title('X1-Y Relationship')axs[0, 1].scatter(X[:, 1], y_pred)
axs[0, 1].set_xlabel('X2')
axs[0, 1].set_ylabel('Y')
axs[0, 1].set_title('X2-Y Relationship')axs[1, 0].scatter(X[:, 0], y_constrained_pred)
axs[1, 0].set_xlabel('X1')
axs[1, 0].set_ylabel('Y')
axs[1, 0].set_title('X1-Y constraints Relationship')axs[1, 1].scatter(X[:, 1], y_constrained_pred)
axs[1, 1].set_xlabel('X2')
axs[1, 1].set_ylabel('Y')
axs[1, 1].set_title('X2-Y constraints Relationship')plt.tight_layout()plt.show()

KbeCA.png

参考

  • https://xgboost.readthedocs.io/en/latest/tutorials/monotonic.html

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot167基于springboot的医院后台管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

【QT】day6

#include "home.h" #include "ui_home.h"Home::Home(QWidget *parent): QWidget(parent), ui(new Ui::Home) {ui->setupUi(this);// 从配置文件读取用户名QSettings settings("kim", "ad");username settings.value("usernam…

K8S之运用亲和性设置Pod的调度约束

亲和性 Node节点亲和性硬亲和实践软亲和性实践 Pod节点亲和性和反亲和性pod亲和性硬亲和实践 pod反亲和性 Pod 的yaml文件里 spec 字段中包含一个 affinity 字段,使用一组亲和性调度规则,指定pod的调度约束。 kubectl explain pods.spec.affinity 配置…

Spring第二天

一、第三方资源配置管理 说明:以管理DataSource连接池对象为例讲解第三方资源配置管理 1 管理DataSource连接池对象 问题导入 配置数据库连接参数时,注入驱动类名是用driverClassName还是driver? 1.1 管理Druid连接池【重点】 数据库准备…

Mybatis是否支持延迟加载?

前言 随着互联网应用的不断发展,数据库访问成为了应用开发中的一个重要环节。在这个背景下,MyBatis作为一种优秀的持久层框架,提供了灵活的SQL映射配置和强大的功能,为开发者提供了便捷的数据库访问解决方案。本文将深入探讨MyBat…

Optimism为 CQT提供价值 20 万美元的生态系统资助,以表彰其支持

Covalent Network(CQT) 是 Web3 生态系统中关键的“数据可用性”层,在与 Optimism Collective 多年的合作中取得了骄人的成果。Covalent Network(CQT)对于 Optimism 跨链数据的增长产生了直接的影响,而这一…

Unity类银河恶魔城学习记录5-1.5-2 P62-63 Creating Player Manager and Skill Manager源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerManager.cs using System.Collections; using System.Collections.G…

读千脑智能笔记08_人工智能的未来(下)

1. 机器智能存在的风险 1.1. “人工智能”这个名字应用到几乎所有涉及机器学习的领域 1.2. 技术专家对人工智能的态度也从“人工智能可能永远不会实现”快速转变为“人工智能可能在不久的将来毁灭所有人类” 1.3. 每一项新技术都可能会被滥用…

UE4运用C++和框架开发坦克大战教程笔记(十九)(第58~60集)完结

UE4运用C和框架开发坦克大战教程笔记(十九)(第58~60集)完结 58. 弹窗显示与隐藏59. UI 面板销毁60. 框架完成与总结 58. 弹窗显示与隐藏 这节课我们先来补全 TransferMask() 里对于 Overlay 布局类型面板的遮罩转移逻辑&#xff…

华为第二批难题五:AI技术提升六面体网格生成自动化问题

有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实,OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码,还没有仔细去学习。 “HybridOctree_Hex”的开发者说:六面体网格主要是用在数值模拟领域的,比如汽车…

第十六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像质量评估

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列博文目录前言一、图像质量评估方法和相关函数的介绍二、均方误差示例代码三、峰值信噪比示例代码四、结构相似性指数示例代码五、视频质量评估示例代码六、OpenCV均方根误差计算示例代码七、OpenC…

Go语言每日一题——链表篇(七)

传送门 牛客面试笔试必刷101题 ----------------删除链表的倒数第n个节点 题目以及解析 题目 解题代码及解析 解析 这一道题与昨天的题目在解题思路上有一定的相似之处,都是基于双指针定义快慢指针,这里我们让快指针先走n步,又因为n一定…