特征漂移指标 PSI

news2024/11/25 22:30:28

特征漂移指标 PSI

背景描述

稳定性指的是参与对比两者相同指标差异性很小。机器学习使用训练数据(训练集和验证集)建模,使用测试数据模拟生产环境数据测试模型结果,其建模的假设是:训练数据涵盖了该问题所有的案例数据,即训练数据和测试(生产)数据之间的差异是很小的。

但实际上这个假设是很难成立的,原因:

  1. 受限于数据收集方法,不可能收集到该问题的所有案例数据。
  2. 模型投产后,生产环境的数据随时间会受到自然环境、政策环境、市场环境等影响而发生变化并且不可预知。

模型的输出很可能是决策的依据,如果模型不能适应新数据,这是很大的风险点。因此,监控数据的稳定性并且及时更新模型是一件很重要的事情。

群体稳定性指标

群体稳定指标(Population Stability Index,PSI)反映了验证样本在各分箱段的分布与建模样本分布的稳定性,通常被用来筛选特征变量、评估模型稳定性。计算方法如下所示:

在这里插入图片描述

这里就先遵循拿来主义,“这个公式为什么就能表示稳定性”在此不做深究。下面对公式说一些说明:

A (actual)表示实际分布,即生产数据,E(expected)表示期望分布,即训练数据。期望生产数据尽可能和训练数据的分布一样。i 表示每个分箱。这个公式的意思是:将每个分箱下的生产数据和期望数据做数学计算后再将结果求和

PSI稳定性
0~0.1稳定性很好
0.1~0.2稍微有点不稳定
大于 0.2不稳定,分析生产数据并判断是否要重新训练模型

PSI 代码实现

1.创建模拟数据

size = 5000
# 期望数据
p2 = np.random.normal(loc = 3, scale = 1, size = size)
# 实际数据
a2 = np.random.normal(loc = 3.5, scale = 0.75, size = size)
  1. 计算每个分箱的边界,推荐分箱数位 10-20,此处设置 10 个分箱
num_bins = 10
eps = 1e-4

min_val = min(min(p2), min(a2))
max_val = max(max(a2), max(p2))
bins = [min_val + (max_val - min_val)*(i)/num_bins for i in range(num_bins+1)]
bins[0] = min_val - eps # 修正下界
bins[-1] = max_val + eps # 修正上界

print(bins)
# [-0.4810252475657688, 0.229173950184835, 0.9392731479354388, 1.649372345686043, 2.3594715434366464, 3.0695707411872504, 3.7796699389378547, 4.489769136688458, 5.199868334439062, 5.909967532189666, 6.620166729940269]
  1. 将实际数据和期望数据分箱
# 计算数组总的元素属于哪个分箱
bins_p2 = pd.cut(p2, bins = bins, labels = range(1,num_bins+1))
# 将元素和封箱号对齐
df_p2 = pd.DataFrame({'p2': p2, 'bin': bins_p2})
# 统计每个封箱中的元素数量
grp_p2 = df_p2.groupby('bin').count()
# 计算每个分箱中元素数量占总数的百分比
grp_p2['percent_p2'] = grp_p2['p2'] / sum(grp_p2['p2'])

# 对实际数据也进行分享操作
bins_a2 = pd.cut(a2, bins = bins, labels = range(1,num_bins+1))
df_a2 = pd.DataFrame({'a2': a2, 'bin': bins_a2})
grp_a2 = df_a2.groupby('bin').count()
grp_a2['percent_a2'] = grp_a2['a2'] / sum(grp_a2['a2'])

# 比较 p2 和 a2 的分箱数据
psi_df = grp_p2.join(grp_a2, on = "bin", how = "inner")
print(psi_df)
binp2percent_p2a2percent_a2
1120.00240000.0000
2750.01500330.0006
33380.067614360.0072
49190.1838373090.0618
512970.25945210610.2122
612930.25865218830.3766
77040.14082812230.2446
82780.0556114300.0860
9700.014003540.0108
10130.00260110.0002
  1. 计算各分箱的 psi
# 当 percent_p* 是 0 时,给其加上 eps。防止 0 参与运算抛异常。
psi_df['percent_p2'] = psi_df['percent_p2'].apply(lambda x: eps if x == 0 else x)
psi_df['percent_a2'] = psi_df['percent_a2'].apply(lambda x: eps if x == 0 else x)
# 计算每行的 psi
psi_df['psi'] = (psi_df['percent_p2'] - psi_df['percent_a2']) * np.log(psi_df['percent_p2'] / psi_df['percent_a2'])

print(psi_df)
binp2percent_p2a2percent_a2psi
1120.00240000.00000.007312
2750.01500330.00060.046364
33380.067614360.00720.135310
49190.1838373090.06180.133038
512970.25945210610.21220.009500
612930.25865218830.37660.044313
77040.14082812230.24460.057291
82780.0556114300.08600.013248
9700.014003540.01080.000832
10130.00260110.00020.006158
  1. 各分箱的 psi 求和
psi = psi_df['psi'].sum()

print(psi)
# 0.4533650280982507

通过上述代码实现可以看出:特征漂移实际是在计算预期数据和实际数据的分布差异情况。。

工程中的实际应用:PSI 和 CSI

PSI

以回归算法 ElasticNet() 拟合 y = a1*x1 + a2*x2 + a3*x3 + b 函数为例演示 psi 在工程中的使用。

size = 5000
# 合成训练需要的数据
x1 = np.random.normal(loc = 0, scale = 2, size = size)
x2 = np.random.normal(loc = 3, scale = 1, size = size)
x3 = np.random.normal(loc = 5, scale = 2, size = size)
y = [-2*x1 + 3.1415*x2 + 2.7183*x3 + 1.6180 for (x1, x2, x3) in zip(x1,x2,x3)]

# 划分训练集和验证集
X = pd.DataFrame({'x1': x1, 'x2': x2, 'x3': x3})
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

# 训练模型(该模型尽可能拟合出 y = a1*x1 + a2*x2 + a3*x3 + b 表达式)
model = ElasticNet()
model.fit(X_train, y_train)

# 验证结果(模型线下的评测结果)
y_pred = model.predict(X_test)

# 再合成生产环境(线上)数据
z1 = np.random.normal(loc = 0, scale = 2, size = size)  
z2 = np.random.normal(loc = 3.5, scale = 0.75, size = size)  
z3 = np.random.normal(loc = 8, scale = 3, size = size)
# 计算模型的线上推理结果
Z = pd.DataFrame({'x1': z1, 'x2': z2, 'x3': z3})
z_pred = model.predict(Z)

"""
此时线下模型效果 y_pred 和线上模型效果 z_pred 都是一维的,令 p2 = y_pred, a2 = z_pred。
套用“PSI 代码实现部分”就可以计算出群体性稳定指标 PSI,最终判定出模型稳定性处于什么程度。
"""

通过计算 训练模型时的推理结果 和 线上模型的推理结果 的 psi 就能初步得出模型的稳定程度。

CSI

psi 只能宏观判断出模型的稳定程度,如果不稳定,到底是哪些特征引起的不稳定?此时就需要使用特征稳定性指标(CSI)进行判断。计算方式没有什么变化,只是用的数据不一样而已。

上述代码中训练数据特征 x1、x2、x3,线上数据特征 z1、z2、z3。

令 p2 = x1, a2 = z1, 计算出 psi1;
令 p2 = x2, a2 = z2, 计算出 psi2;
令 p2 = x3, a2 = z3, 计算出 psi3;
通过 psi* 就能看出是哪个特征引起的不稳定。

名词解释

  1. 在机器学习中,回归和分类分别适用什么场景?

    归回使用预测值连续的场景。回归问题的目标是找到输入特征与输出值之间的关系,以便能够对未知数据进行预测。房价预测就是个典型的回归问题。分类问题适用于样本划分不同类型的场景。当目标变量是离散的、具有预定义类别的数据时,分类算法被用来预测样本的类别。分类任务的目标是构建一个模型,该模型根据输入特征将样本划分到正确的类型中。垃圾邮件分类就是分类问题。

  2. 模型评价指标已经能判断模型效果了,为什么还要用 psi 判断要不要重新训练模型?

    两种评价的目的不一样,模型指标是判断模型训练的好不好,准确率有多高,能不能投产使用。psi 是模型已经上线了,受环境影响生产中的数据时刻在变化,psi 判断当前模型能不能适应这些变化的数据。psi 还有个作用是用来筛选特征。

参考资料

https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783

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

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

相关文章

(附源码)基于springboot鲜花商城小程序-计算机毕设 84731

基于springboot微信小程序的鲜花商城 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,微信小程序的鲜花商…

Find My遥控器|苹果Find My技术与遥控器结合,智能防丢,全球定位

在日常生活中,遥控器是很重要的部分。使用遥控器去操作各种不同的设备,不仅可以省心和省力,同时还能有效增加效率。遥控器是一种无线发射装置,通过现代的数字编码技术,将按键信息进行编码,通过红外线二极管…

电子敲木鱼小程序源码系统 支持广告视频流量主 带完整搭建教程

大家好啊!好久不见。今天罗峰来给大家分享一款电子敲木鱼小程序源码系统。相信大家都听说这个电子敲木鱼小程序,是当代年轻人缓解压力的一款小程序。今天罗峰就来给大家介绍一下他的功能,这款小程序自带广告视频流量,帮你轻松赚钱…

【C++】类与对象 上

前言 感觉自己的基础还是不够好 最近打算在学新知识的同时 把之前的一些知识点再复习一下 引入 在C语言的学习中 我们学习过结构体 我们用结构体来描述复杂的对象 在结构体中只能定义变量 而在C的结构体中 我们可以在C中 定义函数 下面给出一个简单的例子 创建一个结构体 并…

新一代存储介质技术SCM探讨

什么是SCM介质? SCM介质现状 SCM介质产品形态和在存储系统中的应用 高性能SSD 字节型DIMM形态 小结 什么是SCM介质? SCM(Storage Class Memory)是当前业界非常热门的新介质形态,同时具备持久化(Storage Cla…

LangChain+LLM实战---Midjourney(v5.1) Prompt深度剖析

原文:Anatomy of Midjourney Promps: In-Depth Study for effective Prompting Strategies — V5.1 examples 作者:Michael King 你是否曾经发现自己盯着Midjourney的空白画布,手指悬停在键盘上,让我问自己:“我应该…

Python中最常用的10个内置函数!

更多资料获取 📚 个人网站:涛哥聊Python Python作为一种多用途编程语言,拥有丰富的内置函数库,这些函数可以极大地提高开发效率。本文将介绍Python中最常用的10个内置函数,它们的功能各有不同,但在实际编程…

【unity实战】实现类似英雄联盟的buff系统(附项目源码)

文章目录 先来看看最终效果前言开始BUFF系统加几个BUFF测试1. 逐层消失,升级不重置剩余时间的BUFF2. 一次性全部消失,升级重置剩余时间的BUFF3. 永久BUFF,类似被动BUFF4. 负面BUFF,根据当前BUFF等级计算每秒收到伤害值&#xff0c…

腾讯会议录制视频全攻略,让会议记录更轻松

随着远程办公和线上教学的兴起,腾讯会议已成为一种常见的在线会议工具,用于实现远程办公、在线教育和协作。然而,许多用户不知道如何记录这些重要的会议,特别是希望将其保留作为会议纪要或培训资料。在本文中,我们将探…

康耐视深度学习ViDi-Tool菜单介绍

Train 训练该工具中所有标注的图像 Process 处理该工具中所有的图像 Abort 中止当前训练或处理任务 Rename 更改当前工具的名称 Clone 克隆当前所选工具 Import导出当前所选工具 Export导入相对应的工具 Edit Models编辑工具中的模型 Update Parameters更新当前工具参数 工具菜…

CODESYS开发教程12-任务配置

今天继续我们的小白教程,老鸟就不要在这浪费时间了😊。 前面一期我们介绍了CODESYS的库管理器。这一期就来介绍一下CODESYS工程中“任务配置”的使用。看过前面教程的朋友可能记得,在工程的基本组成中有简单介绍过如何使用任务配置添加任务&…

Python中使用Tkinter和Difflib模块实现文本比对功能

目录 一、引言 二、Tkinter简介 三、Difflib简介 四、实现文本比对功能 五、代码展示 六、注意事项 总结 一、引言 在Python中,Tkinter和Difflib是两个非常实用的模块。Tkinter是Python的标准图形用户界面(GUI)库,可以用来创建桌面应用程序。Dif…

【0基础】全网最细致【PYTHON入门】教学

前言 可以说很多人学编程,不玩点爬虫确实少了很多意思,不管是业余、接私活还是职业爬虫,爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫,目的是让准备学爬虫或者刚开始起步的小伙伴们,对爬虫有一个更深更全的认知…

动态壁纸软件Live Wallpaper HD mac中文版功能特色

Live Wallpaper HD mac提供了一系列美丽的主题场景,将为您的桌面增添活力。从城市景观、日落到遥远的星系,每个屏幕都有特别的触感,可以定制您的天气小部件和时钟样式,并使用您喜爱的图片创建您自己的个性化壁纸。 Living Wallpap…

使用 Rust 进行程序

首先,我们需要安装必要的库。在终端中运行以下命令来安装 scraper 和 reqwest 库: rust cargo install scraper reqwest 然后,我们可以开始编写程序。以下是一个基本的爬虫程序,用于爬取 上的图片: rust use reqwe…

QT实现的一个MVP设计模式demo

最近做qt 项目,发现网上基于MVP设计模式的QT例程很少,这里写一个demo示例可作为参考: 一、简要概述 MVP是由MVC发展而来,总体目的与作用相同。都是为了软件构架有层次之分,使得核心逻辑、界面控制、数据这三者分层清晰明了。减少…

椭圆滤波器

之前的文章 信号去噪 中列出了7种常用的信号去噪算法,对于后两种算法——深度学习和奇异值分解(SVD),我现在也不太理解,就先不写了。 很多朋友留言又提了一些算法,今天一起来聊聊椭圆滤波器。 椭圆滤波器(Elliptic F…

极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

引言 前端性能已成为网站和应用成功的关键要素之一。用户期望快速加载的页面和流畅的交互,而前端框架的选择对于实现这些目标至关重要。然而,传统的前端框架在某些情况下可能面临性能挑战且存在技术壁垒。 在这个充满挑战的背景下,我们引入…

新大陆NVH200-AP(U)扫码枪在上位机软件开发中的应用

前言: 由于本次使用的是USB接口的扫码枪 1、先安装Nset软件,使用扫码枪扫描“启动设置条码”,然后扫描“USB CDC串口”条码 2、打开NSet软件,点击“刷新按钮” 就能找到扫码枪设备 3、设置条码后缀 点击“高级设置”,然后点击“数据编辑”,在“后缀”那里设置结束符…

〔001〕虚幻 UE5 安装教程

✨ 目录 🎈 下载启动程序🎈 注册个人账户🎈 选择引擎版本🎈 选择安装选项🎈 虚幻商城的使用🎈 每月免费插件🎈 安装插件🎈 下载启动程序 下载地址:https://www.unrealengine.com/zh-CN/download点击上面地址,下载 UE5 启动程序并安装🎈 注册个人账户 打开商…