XGB-6: 单调性约束Monotonic Constraints

news2024/9/23 13:29:28

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

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

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.coloradmin.cn/o/1440585.html

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

相关文章

机器学习 | 深入集成学习的精髓及实战技巧挑战

目录 xgboost算法简介 泰坦尼克号乘客生存预测(实操) lightGBM算法简介 《绝地求生》玩家排名预测(实操) xgboost算法简介 XGBoost全名叫极端梯度提升树,XGBoost是集成学习方法的王牌,在Kaggle数据挖掘比赛中,大部分获胜者用了XGBoost。…

【平衡小车入门】(PID、FreeRTOS、hal库)

本篇博客记录自己复刻的平衡小车 前言一、硬件需求二、最终效果三、整体流程第一步:stm32通过DRV8833电机驱动模块使用PWM驱动直流减速电机第二步:理解PID算法在平衡小车中的应用第三步:PID调参 四、源代码获取 前言 从代码上看,…

安装Pytorch中的torchtext之CUDA版的正确方式

安装Pytorch和torchtext: Previous PyTorch Versions | PyTorch Installing previous versions of PyTorchhttps://pytorch.org/get-started/previous-versions/ 上面的命令如下: pip install torch2.1.2 torchvision0.16.2 torchaudio2.1.2 --index-…

【RPA】智能自动化的未来:AI + RPA

伴随着人工智能(AI)技术的迅猛进步,机器人流程自动化(RPA)正在经历一场翻天覆地的变革。AI为RPA注入了新的活力,尤其在处理复杂任务和制定决策方面。通过融合自然语言处理(NLP)、机器…

【我与Java的成长记】之String类详解

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 Java笔记传送门 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 文章目录 系列文章目录🌈 *信念如阳光,照亮前行的每一步* 前言一、字符串构…

Mongodb启动为Windows服务开机自启动

注意:mongodb的安装目录不应有中文,如果有,服务启动的路径会出现乱码,导致找不到对应的文件 1.安装好mongoDB 2.创建data目录,并在其中创建db目录和log目录 3.在log目录中创建mongodb.log文件 4.打开cmd(用…

【网络攻防实验】【北京航空航天大学】【实验一、入侵检测系统(Intrusion Detection System, IDS)实验】

实验一、入侵检测系统实验 1、 虚拟机准备 本次实验使用1台 Kali Linux 虚拟机和1台 Windows XP 虚拟机,虚拟化平台选择 Oracle VM VirtualBox,如下图所示。 2、 Snort环境搭建 实验前,先确保Kali Linux虚拟机能够访问外网,将网络模式设置为“网络地址转换”: 2.1 安装…

计算两个数相除后的余数返回值为浮点型math.fmod(x, y)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算两个数相除后的余数 返回值为浮点型 math.fmod(x, y) [太阳]选择题 请问以下代码执行math.fmod()后输出的结果是? import math print("【执行】math.fmod(10, 4)"…

redis特点

一、redis线程模型有哪些,单线程为什么快? 1、IO模型维度的特征 IO模型使用了多路复用器,在linux系统中使用的是EPOLL 类似netty的BOSS,WORKER使用一个EventLoopGroup(threads1) 单线程的Reactor模型,每次循环取socket中的命令…

【数据结构】一篇文章带你学会八大排序

一、排序的概念1. 排序的使用:2. 稳定性:3. 内部排序:4. 外部排序︰5. 排序的用途: 二、排序的原理及实现1. 插入排序1.1 直接插入排序1.1.1 直接插入排序在现实中的应用1.1.2 直接插入排序的思想及个人理解1.1.3 直接插入排序的排…

嵌入式系统中的故障容错和恢复机制有哪些常用的方法和技术?

嵌入式系统是一种在特定应用领域内运行的计算机系统,其对系统可靠性和稳定性有着较高的要求。在嵌入式系统中,故障容错和恢复机制是至关重要的,因为它们能够确保系统在面临故障和异常情况时能够继续正常工作或者快速恢复正常状态。本文将介绍…

MPLS VPN功能组件(4)

数据转发过程 VPN数据的转发 顶层公网标签 由LDP分配,指示LSR如何将标签报文从始发的源PE通过LSP标签交换到达目的PE 内层私网标签(VPN标签) 由MP-BGP分配,在将每一条客户路由变为VPNv4路由前缀时会自动为每一条VPNv4前缀关联一个标签 内层私网标签用于指示目的PE将该标签报…

“手把手教你玩转函数递归,建议收藏!“

目录 1. 什么是递归 2. 递归的限制条件 3. 递归的举例 4. 递归与迭代 正⽂开始 1. 递归是什么? 递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃…

Pandas数据预处理之数据标准化-提升机器学习模型性能的关键步骤【第64篇—python:数据预处理】

文章目录 Pandas数据预处理之数据标准化:提升机器学习模型性能的关键步骤1. 数据标准化的重要性2. 使用Pandas进行数据标准化2.1 导入必要的库2.2 读取数据2.3 数据标准化 3. 代码解析4. 进一步优化4.1 最小-最大缩放4.2 自定义标准化方法 5. 处理缺失值和异常值5.1…

MCS-51系列单片机简介

MCS-51系列单片机简介 MCS-51系列单片机是因特尔(Intel)公司生产的一个系列单片机的名称。比如:8051/8751/8031、8052/8752/8032、80C51/87C51/80C31、80C52/87C52/80C32等,都属于这一系列的单片机。 MCS-51系列单片机从功能上,可分为51和52…

深度学习入门笔记(九)自编码器

自编码器是一个无监督的应用,它使用反向传播来更新参数,它最终的目标是让输出等于输入。数学上的表达为,f(x) x,f 为自编码器,x 为输入数据。 自编码器会先将输入数据压缩到一个较低维度的特征,然后利用这…

Java图形化界面编程—— LayoutManager布局管理器笔记

2.4 LayoutManager布局管理器 之前,我们介绍了Component中有一个方法 setBounds() 可以设置当前容器的位置和大小,但是我们需要明确一件事,如果我们手动的为组件设置位置和大小的话,就会造成程序的不通用性,例如&…

数字图像处理实验记录七(彩色图像处理实验)

一、基础知识 经过前面的实验可以得知,彩色图像中的RGB图像就是一个三维矩阵,有3个维度,它们分别存储着R元素,G元素,B元素的灰度信息,最后将它们合起来,便是彩色图像。 这一次实验涉及CMYK和HS…

Java 获取、创建 stream 流操作对象的几种方法

Java 获取、创建 stream 流操作对象的几种方法 package com.zhong.streamdemo.createstreamdemo;import java.util.*; import java.util.stream.Stream;/*** ClassName : CreateStream* Description : 创建 stream 操作对象* Author : zhx* Date: 2024-02-08 13:10*/ public c…

查看网络配置的ipconfig命令

ipconfig是调试计算机网络的常用命令,通常大家使用它显示计算机中网络适配器的IP地址、子网掩码及默认网关。其实这只是ipconfig的不带参数用法,而它的带参数用法,在网络中应用也是相当不错的。 1.语法 ipconfig [/all] [/renew[Adapter]] [/…