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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 小白如何写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语言解决问题
所以呀
要相信自己的潜力 
以解决问题为目标 不断学习相关的知识
想办法使用能够使用的资源 
你一定可以战胜它的


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22小时前
|
存储 算法 调度
力扣中级算法(Python)
力扣中级算法(Python)
|
23小时前
|
算法 Python
力扣初级算法(Python)(二)
力扣初级算法(Python)(二)
|
1天前
|
机器学习/深度学习 传感器 算法
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
|
2天前
|
算法 数据可视化 Python
【KMeans】Python实现KMeans算法及其可视化
【KMeans】Python实现KMeans算法及其可视化
|
2天前
|
搜索推荐 算法 UED
基于Python的推荐系统算法实现与评估
本文介绍了推荐系统的基本概念和主流算法,包括基于内容的推荐、协同过滤以及混合推荐。通过Python代码示例展示了如何实现基于内容的推荐和简化版用户-用户协同过滤,并讨论了推荐系统性能评估指标,如预测精度和覆盖率。文章强调推荐系统设计的迭代优化过程,指出实际应用中需考虑数据稀疏性、冷启动等问题。【6月更文挑战第11天】
35 3
|
3天前
|
存储 算法 数据可视化
算法金 | D3blocks,一个超酷的 Python 库
D3Blocks是一个基于d3.js的Python图形库,用于创建吸引人的数据可视化图表,如D3graph、Elasticgraph和Sankey图。拥有超过470个Star,其特点包括简易性、功能丰富、易用性、可定制性和及时更新。通过pip安装后,用户能轻松创建粒子图和其他图表。文中展示了实战应用,如能源数据集的网络图,通过调整节点和边的属性实现个性化展示。关注作者,享受智能乐趣。
39 8
算法金 | D3blocks,一个超酷的 Python 库
|
1天前
|
开发者 Python
GitHub飙升!京东认证的“Python编程入门三剑客”究竟好在哪?
Python凭借着简单易学、功能强大,已经跃居TIOB编程语言榜首,并且已经开始了它的霸榜之旅。如何选择一套适合自己的Python学习教程,是每个Python爱好者面临的首要问题。
|
2天前
|
存储 设计模式 算法
Python基础教程(第3版)中文版 第19章 趣味编程 (笔记)
Python基础教程(第3版)中文版 第19章 趣味编程 (笔记)
|
2天前
|
Shell Python
GitHub星标破千Star!Python游戏编程的初学者指南
Python 是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。 目前的编程书籍大多分为两种类型。第一种,与其说是教编程的书,倒不如说是在教“游戏制作软件”,或教授使用一种呆板的语言,使得编程“简单”到不再是编程。而第二种,它们就像是教数学课一样教编程:所有的原理和概念都以小的应用程序的方式呈现给读者。
|
2天前
|
机器学习/深度学习 存储 自然语言处理
惊艳!老司机熬夜总结的Python高性能编程,高效、稳定、快速!
Python 语言是一种脚本语言,其应用领域非常广泛,包括数据分析、自然语言处理机器学习、科学计算、推荐系统构建等。 能够轻松实现和代码跑得够快之间的取舍却是一个世人皆知且令人惋惜的现象而这个问题其实是可以解决的。 有些人想要让顺序执行的过程跑得更快。有些人需要利用多核架构、集群,或者图形处理单元的优势来解决他们的问题。有些人需要可伸缩系统在保证可靠性的前提下酌情或根据资金多少处理更多或更少的工作。有些人意识到他们的编程技巧,通常是来自其他语言,可能不如别人的自然。