特征漂移指标 PSI

2024-02-25 15:40
文章标签 指标 特征 漂移 psi

本文主要是介绍特征漂移指标 PSI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

特征漂移指标 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-4min_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

这篇关于特征漂移指标 PSI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745934

相关文章

AI学习指南机器学习篇-朴素贝叶斯处理连续特征和离散特征

AI学习指南机器学习篇-朴素贝叶斯处理连续特征和离散特征 在机器学习领域,朴素贝叶斯是一种常用的分类算法,它的简单性和高效性使得它在实际应用中得到了广泛的应用。然而,在使用朴素贝叶斯算法进行分类时,我们通常会面临一个重要的问题,就是如何处理连续特征和离散特征。因为朴素贝叶斯算法基于特征的条件独立性假设,所以对于不同类型的特征,我们需要采取不同的处理方式。 在本篇博客中,我们将探讨如何有效地处理

文华财经T8自动化交易程序策略模型指标公式源码

文华财经T8自动化交易程序策略模型指标公式源码: //定义变量 //资金管理与仓位控制 8CS:=INITMONEY;//初始资金 8QY:=MONEYTOT;//实际权益 8QY1:=MIN(MA(8QY,5*R),MA(8QY,2*R)); FXBL:=N1; DBKS:8QY1*N1;//计算单笔允许亏损额度 BZDKS:=MAX(AA-BB,N*1T)*UNIT; SZDKS:=MAX(

【Flink metric】Flink指标系统的系统性知识:以便我们实现特性化数据的指标监控与分析

文章目录 一. Registering metrics:向flink注册新自己的metrics1. 注册metrics2. Metric types:指标类型2.1. Counter2.2. Gauge2.3. Histogram(ing)4. Meter 二. Scope:指标作用域1. User Scope2. System Scope ing3. User Variables 三.

Adaboost集成学习 | Adaboost集成学习特征重要性分析(Python)

目录 效果一览基本介绍模型设计程序设计参考资料 效果一览 基本介绍 Adaboost集成学习特征重要性分析(Python)Adaboost(自适应增强)是一种常用的集成学习方法,用于提高机器学习算法的准确性。它通过组合多个弱分类器来构建一个强分类器。在Adaboost中,每个弱分类器都被赋予一个权重,这些权重根据其在训练过程中的表现进行调整。因此,Adaboost可以通

机器学习算法(二):1 逻辑回归的从零实现(普通实现+多项式特征实现非线性分类+正则化实现三个版本)

文章目录 前言一、普通实现1 数据集准备2 逻辑回归模型3 损失函数4 计算损失函数的梯度5 梯度下降算法6 训练模型 二、多项式特征实现非线性分类1 数据准备与多项式特征构造2 逻辑回归模型 三、逻辑回归 --- 正则化实现1 数据准备2 逻辑回归模型3 正则化损失函数4 计算损失函数的梯度5 梯度下降6 训练模型 总结 前言 今天我们开始介绍逻辑回归的从零开始实现代码了,

IBM IMM1服务器硬件监控指标解读

在复杂多变的IT环境中,服务器的稳定运行对于保障业务的连续性至关重要。IBM IMM1(Integrated Management Module 1)作为IBM服务器的一个重要组件,提供了强大的远程管理和监控功能。     监控易作为一款专业的IT基础设施监控软件,为运维团队提供了全面的IBM服务器硬件监控解决方案。本文将基于监控易中针对IBM IMM1的监控指标进行解读,帮助运维团队更

首次使用回声状态网络 (ESN) 和语音特征进行帕金森病 (PD) 预测

帕金森病(Parkinson's disease, PD)是一种使人衰弱的神经退行性疾病,它需要进行精确和早期的诊断,以便为患者提供有效的治疗和护理。这种疾病是由James Parkinson在1817年首次确定的,其特征是多巴胺生成神经元的退化。多巴胺的不足导致了一系列症状,包括静止性震颤、肌肉僵硬、运动迟缓(姿势不稳定)、以及其他重要特征,如睡眠障碍、心律失常、便秘和语音变化,这

MATLAB-SSA-CNN-SVM,基于SSA麻雀优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)

MATLAB-SSA-CNN-SVM,基于SSA麻雀优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1.数据均为Excel数据,直接替换数据就可以运行程序。 2.所有程序都经过验证,保证程序可以运行。 3.具有良好的编程习惯,程序均包含简要注释。 结果展示 获取方式 https://mbd.pub/o/bread/mbd-ZpeYkpZw

选股策略之MACD指标选股

股市有风险,投资需谨慎!!!股市有风险,投资需谨慎!!!股市有风险,投资需谨慎!!! MACD的详细介绍请移步:macd百度百科 话不多说,上代码: # -*- coding: utf-8 -*-'''实现功能:1.macd指标计算2.记录金叉死叉数据并输出CSV文件'''import pandas as pdfrom datetime import datetime,timedelta

FreeBSD服务器监控:核心指标解读与应用建议(Telnet)

随着企业IT环境的日益复杂,对服务器性能和稳定性的监控变得至关重要。特别是针对FreeBSD这类广泛应用的服务器操作系统,进行高效的监控和管理更是运维团队的核心任务。本文将针对监控易中FreeBSD服务器的核心监控指标进行解读,并提供相应的应用建议,帮助运维团队更好地掌握和管理FreeBSD服务器的运行状态。 一、CPU监控     CPU是服务器的核心部件,其性能直接影响到整个系统的