小白如何写Python算法-计算模型稳定性评估指标PSI(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 小白如何写Python算法-计算模型稳定性评估指标PSI(下)

计算出得到KL散度

image.png

由上式可知

相对熵KL(A||C) > KL(A||B)
说明A和B之间的概率分布在信息量角度更为接近
而通过概率分布可视化观察,也认为A和B更为接近,两者吻合


相对熵与PSI之间的关系


PSI公式变形

image.png

将PSI计算公式变形后可以分解为2项


image.png

结论

  • PSI本质上是实际分布(A)与预期分布(E)的KL散度的一个对称化操作
  • 双向计算相对熵,并把两部分相对熵相加,从而更为全面地描述两个分布的差异

image.png


PSI指标的业务应用


实际评估需要分不同粒度

  • 时间粒度(按月、按样本集)
  • 订单层次(放贷层、申请层)
  • 人群(若没有分群建模,可忽略)

时间窗

时间窗尽可能至今为止
有可能建模时间窗稳定
但近期时间窗出现不稳定

评估过程

  • 先在放贷样本上计算PSI,剔除不稳定的特征;
  • 再对申请样本抽样(可能数据太大)
  • 计算PSI再次筛选

建议先看变量数据分布(EDD)

PSI只是一个宏观的指标
建议先看变量数据分布(EDD)
看分位数跨时间变化来检验数据质量

PSI计算细节也予以保留

无法得知PSI上升时,数据分布是左偏还是右偏
建议把PSI计算细节也予以保留
便于在模型不稳定时,第一时间排查问题


PSI源码


https://gitee.com/pingfanrenbiji/population-stability-index-argo/blob/master/psi.py

image.png

结合具体业务实现需求


经过上面的学习 咱们已经知道了PSI是个什么玩意了
而且还有了实现好的算法源码
该算法需要2方面的数据 
一个是实际数据(训练数据)
实际数据即是训练数据集中的标签列 
比如贷款数据样本 
标签列为是否按时还款
另一个是预期数据(预测数据根据模型得到的预测结果)
预期样本是
根据训练出来的模型
对于即将要贷款的用户进行预测是否会还款
接下来就要结合自己公司的业务来得到这块数据调用算法就可以了


搭建python服务

公司让我来做psi
因为我是用java开发的嘛 
其实是想让我用java来实现psi
我当时就感觉不太合理 java不合适写算法
后来的调研也确认了这个想法
算法还是得需要用ptyhon来写
且都已经实现好了 理解了原理之后 
直接就可以用了
用python写的话 对于写java的我来说
有点难度 但稍微克服一下就可以了


python web框架 flask

源码demo
https://gitee.com/pingfanrenbiji/simple-model-monitor-demo

基本语法记录一下
  • restful api
from flask_restful import reqparse, abort, Api, Resource
@app.route('/test/<jobid>', methods=['POST'])
def test_psi_last(jobid):
    return "成功"


注意:参数用<> 而非{}

  • sql查询语句执行 返回元组类型
import pymysql
 jobid = '1111111'
 # 创建数据库连接
 conn = pymysql.connect(
        host=mysql_host,
        user=mysql_user,
        password=mysql_password,
        db=mysql_db,
        port=mysql_port
 )
# 获取操作游标,也就是开始操作
cur = conn.cursor() 
# 定义查询sql语句 该sql返回一条数据
sql = """
      select id from studio_algor_param_record where job_no=%s order by createtime desc limit 1;
    """
#执行查询
cur.execute(sql, (jobid))
# 获取查询结果
mid = cur.fetchall()
#关闭连接
conn.close()
# mid是tuple元组数据类型((xxxx,))
res_list = [x[0] for x in mid]
# 获取xxxx字符串
mid = res_list[0]
  • 通过pandas执行sql查询返回dataframe类型
# 数据库连接的获取同上
# 查询sql语句 返回list集合
sql = 'select predict_result from studio_model_predict_result where mid =\'' + mid + '\''
# 通过pandas执行sql语句得到dataframe类型的数据结果
df = pd.read_sql(sql, con=conn)
  • 插入sql
# 数据库连接的获取同上
# 获取操作游标,也就是开始操作
cur = conn.cursor() 
# 插入sql语句
sql = """
      insert into studio_job_step_files (id,jobid,file_type,path,remark)
      values (%s,%s,%s,%s,%s)
    """
# 生成uuid唯一id
id = str(uuid.uuid1()).replace('-', '')
# 执行sql
cur.execute(sql, (id, jobid, '100', py_test, result))
# 提交事务
conn.commit()
# 关闭连接
conn.close()
  • 使用alluxo(内存文件系统)

alluxio client源码

https://gitee.com/pingfanrenbiji/simple-model-monitor-demo/tree/master/alluxio

连接alluxio

import alluxio
client = alluxio.Client(alluxio_ip, alluxio_port)

获取文件

got = None
# alluxio文件路径
path = "/poc/d1e5a1efbe764f9d80b200d3a90c5bdf"
with client.open(path, 'r') as f:
  got = f.read()

写入本地文件

# 本地文件路径
py_test_csv = "test.csv"
# 将读取到的alluxio文件写入本地文件
with open(py_test_csv, 'w') as f:
  f.write(got.decode('utf-8'))
注:write方法需要字符串类型的参数
got是字节流类型 通过decode解码得到字符串类型

读取csv文件得到dataframe类型的数据

df = pd.read_csv(py_test_csv, sep=",")
# 获取执行列
df['y']

上传文件

# 将dataframe类型的数据写入alluxio文件
# result_detail是dataframe类型的数据
with client.open(py_test, 'w') as f:
f.write(bytes(result_detail.to_json().encode("utf8")))


后记


上述过程花了2天时间
从对PSI概念不了解到慢慢了解
没有写过Python工程的代码 连if else语法都要现学 到学会使用Python语言解决问题
所以呀
要相信自己的潜力 
以解决问题为目标 不断学习相关的知识
想办法使用能够使用的资源 
你一定可以战胜它的


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
39 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
9天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
31 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
9天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
48 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
14天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
30 2
|
21天前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
53 3
|
26天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
72 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
30天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
14天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。