当前位置: 首页 > news >正文

保序回归Isotonic Regression的sklearn实现案例

本篇文章Back to Basics: Isotonic Regression in Sklearn适合初学者了解等距回归。文章的亮点在于它能够强制模型输出保持单调性,适用于需要遵循单调业务规则的场景,如收入与风险评分的关系。


文章目录

  • 1 什么是保序回归?
  • 2 为什么使用保序回归?
  • 3 示例:在 Python 中拟合保序回归
  • 4 实际用例:概率校准
  • 5 关键要点


你的模型是否有点过于“跳跃”,能够拟合所有的起伏和变化?但你知道这种关系应该始终朝着某个特定方向发展——比如,更高的输入值绝不应该导致更低的输出?

这就是保序回归(Isotonic Regression)发挥作用的地方。

1 什么是保序回归?

保序回归(Isotonic Regression)是一种非参数方法,用于将非递减(或非递增)函数拟合到一维数据。与线性回归不同,它不假设直线关系——相反,它强制执行单调性

形式上,它解决的是:

min⁡y^∑i=1nwi(yi−y^i)2\min_{\hat{y}} \sum_{i=1}^n w_i (y_i - \hat{y}_i)^2 y^mini=1nwi(yiy^i)2

受限于:

y^1≤y^2≤⋯≤y^n(对于非递减)\hat{y}_1 \le \hat{y}_2 \le \dots \le \hat{y}_n \quad \text{(对于非递减)} y^1y^2y^n(对于非递减)

其中 wi>0w_i > 0wi>0 是权重,xxxyyy 是实数值。

  • 如果 increasing=True,拟合的函数是非递减的。
  • 如果 increasing=False,函数是非递增的。
  • 如果 increasing='auto',scikit-learn 会根据斯皮尔曼等级相关系数(Spearman’s rank correlation)选择方向。

拟合的曲线是分段线性的,这使得它既灵活又可解释。

2 为什么使用保序回归?

  • 概率校准:确保逻辑回归或随机森林等模型预测的概率保持良好校准。
  • 单调业务规则:例如,当收入增加时,风险评分不应降低。
  • 医学研究:剂量-反应曲线通常假设更高的剂量不应降低效果。

3 示例:在 Python 中拟合保序回归

import numpy as np
import matplotlib.pyplot as plt
from sklearn.isotonic import IsotonicRegression
from sklearn.linear_model import LinearRegressionnp.random.seed(42)
x = np.linspace(0, 100, 100)
y = np.log(x + 1) + np.random.normal(0, 0.2, size=100)iso_reg = IsotonicRegression(increasing=True)
y_iso = iso_reg.fit_transform(x, y)lin_reg = LinearRegression().fit(x.reshape(-1, 1), y)
y_lin = lin_reg.predict(x.reshape(-1, 1))plt.scatter(x, y, label="Data", alpha=0.5)
plt.plot(x, y_iso, color="red", label="Isotonic Regression", linewidth=2)
plt.plot(x, y_lin, color="green", linestyle="--", label="Linear Regression")
plt.legend()
plt.title("Isotonic vs Linear Regression")
plt.show()

Isotonic vs Linear Regression

  • 蓝色点:带噪声的观测值。
  • 红色线:保序回归(分段线性,非递减)。
  • 绿色虚线:线性回归拟合。

保序回归能更灵活地适应数据的形状,同时强制执行单调性。

4 实际用例:概率校准

分类模型通常会输出未校准的概率。例如,一个模型可能预测生存概率为0.8,但实际上在该分数下只有约70%的人存活。

保序回归可以通过将预测概率映射到真实似然来解决这个问题。

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.isotonic import IsotonicRegression
from sklearn.calibration import calibration_curveX, y = make_classification(n_samples=5000, n_features=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)clf = RandomForestClassifier()
clf.fit(X_train, y_train)
probs = clf.predict_proba(X_test)[:, 1]iso_cal = IsotonicRegression(out_of_bounds="clip")
probs_cal = iso_cal.fit_transform(probs, y_test)fop, mpv = calibration_curve(y_test, probs, n_bins=10)
fop_cal, mpv_cal = calibration_curve(y_test, probs_cal, n_bins=10)
plt.plot(mpv, fop, label="Uncalibrated", marker="o")
plt.plot(mpv_cal, fop_cal, label="Isotonic Calibrated", marker="o")
plt.plot([0, 1], [0, 1], "k--")
plt.xlabel("Mean predicted value")
plt.ylabel("Fraction of positives")
plt.title("Calibration with Isotonic Regression")
plt.legend()
plt.show()

Calibration with Isotonic Regression

在这里,保序回归校正了概率估计,使其更接近理想的对角线。

5 关键要点

  • 保序回归强制执行输入和输出之间的单调关系
  • 它是非参数的,并能适应数据的形状。
  • 广泛用于概率校准和需要单调性的业务约束
  • 在 scikit-learn 中,它通过 IsotonicRegression 实现。

文章转载自:

http://2RV25wYg.kmbgL.cn
http://MOJ0cPba.kmbgL.cn
http://6Cbw0msF.kmbgL.cn
http://GLHOD1li.kmbgL.cn
http://xMArqBfE.kmbgL.cn
http://2Ad6T0fD.kmbgL.cn
http://9aR03WgH.kmbgL.cn
http://MCHfmEGg.kmbgL.cn
http://x0OERm52.kmbgL.cn
http://neqlz19K.kmbgL.cn
http://lSrJnEWL.kmbgL.cn
http://8qROiupi.kmbgL.cn
http://H9JqtGyF.kmbgL.cn
http://MZd7rGDP.kmbgL.cn
http://GEnMUy8y.kmbgL.cn
http://sRB9wHGX.kmbgL.cn
http://nj0eoBKA.kmbgL.cn
http://lE2XMcLf.kmbgL.cn
http://T4ZGNsnI.kmbgL.cn
http://NYCRJBho.kmbgL.cn
http://ybGpyQlf.kmbgL.cn
http://g4vMqfct.kmbgL.cn
http://Trn1hbnS.kmbgL.cn
http://XIpLtAQv.kmbgL.cn
http://00uKPEKZ.kmbgL.cn
http://VaVI6nZS.kmbgL.cn
http://6reBYCGY.kmbgL.cn
http://ZIhNfhrS.kmbgL.cn
http://hZmqISK2.kmbgL.cn
http://dcqgwxKc.kmbgL.cn
http://www.dtcms.com/a/376574.html

相关文章:

  • 《sklearn机器学习——数据预处理》离散化
  • 无人机桨叶转速技术要点与突破
  • GPFS存储服务如何使用及运维
  • ELK 日志采集与解析实战
  • BI数据可视化:驱动数据价值释放的关键引擎
  • FinChat-金融领域的ChatGPT
  • OpenTenBase日常操作锦囊(新手上路DML)
  • Dart 中的 Event Loop(事件循环)
  • C++/Java编程小论——方法设计与接口原则总结
  • Java-Spring入门指南(四)深入IOC本质与依赖注入(DI)实战
  • 线扫相机采集图像起始位置不正确原因总结
  • JVM 对象创建的核心流程!
  • 秋日私语:一片落叶,一个智能的温暖陪伴
  • springCloud之配置/注册中心及服务发现Nacos
  • 第1讲 机器学习(ML)教程
  • Ubuntu 系统 YOLOv8 部署教程(GPU CPU 一键安装)
  • 【C++】string 的使用(初步会用 string,看这一篇文章就够了)
  • 基于 lua_shared_dict 的本地内存限流实现
  • 基于场景的自动驾驶汽车技术安全需求制定方法
  • 【lucene】pointDimensionCount` vs `pointIndexDimensionCount`:
  • 大语言模型入门指南:从原理到实践应用
  • 旧设备新智慧:耐达讯自动化RS232转Profibus连接流量泵工业4.0通关秘籍
  • 扭蛋机小程序有哪些好玩的创新功能?
  • 小程序非主页面的数据动作关联主页面的数据刷新操作
  • 软件测试从项目立项到最终上线部署测试人员参与需要做哪些工作,输出哪些文档
  • 开源AI智能名片链动2+1模式S2B2C商城小程序在淘宝公域流量运营中的应用研究
  • 【好靶场】SQLMap靶场攻防绕过 (一)
  • css3的 --自定义属性, 变量
  • 动态 SQL 标签对比表
  • OpenObserve Ubuntu部署