Commit d52dee3f authored by 舒皓月's avatar 舒皓月

20191126_0

parent f1f5f1aa
...@@ -5,108 +5,169 @@ ...@@ -5,108 +5,169 @@
- 本项目主要用于风控模型监控. - 本项目主要用于风控模型监控.
- 运用统计绘图分析, 来检测入模特征, 客群变化, 模型性能. - 运用统计绘图分析, 来检测入模特征, 客群变化, 模型性能.
- 基本流程: - 基本流程:
- 数据库取数 --> 整合/处理数据 --> 绘图 --> 统计 - 数据库取数 --> 整合/统计 --> 绘图
- 主要统计图类别: - 主要统计信息:
- VLM - VLM
- PSI
- AUC
- PSI # 使用前提
- Lift Chart - 准备一个包含需要查询模型分的excel, 包含其中文名和英文名(mongo中的字段名).
- 项目中的model_score.xlsx包含大部分在使用的模型分.
# VLM # VLM
- 重写完成, 代码流程改天写. - 使用方法
# PSI & Lift Chart 在234服务器中, 将项目中的VLM_time.py放在自己的某一文件夹下, 然后在notebook中操作如下.
- 因为这两个指标的统计都需要用到模型分, 所以放到一起. ```python
# 导入脚本
## 计算流程 from VLM_time import *
# 创建对象
- 首先对需要计算的模型分, 在指定的统一时间跨度内进行数据抽取(在MySQL和MongoDB中). 包括如下一些主要字段: vlm_mm = VLMMonitor(excel_path='./model_score.xlsx',
- 模型分1, 模型分2, ... sheet_name='model',
- 订单号, 申请时间, 申请类型, 渠道类型, 逾期天数. save_path='./vlm/',
- 根据预定义逾期阈值, 得到是否逾期标签. if_read=True, if_save=True,
- 根据该模型分有记录的第一个月, 计算分箱规则(由模型分等频分箱区间, PSI在申请集上计算, AUC在放款集上计算). alpha=0.01, min_user_group=600,
- 分别对全样本, 首申/复申/复贷, 以及各达标客群(客群数量大于预设阈值), 计算每月统计信息. start_date='2019-09-01', end_date='2019-11-01')
- PSI统计信息: # 运行
- 样本量. vlm.run()
- 各分箱样本量 ```
- 各分箱样本量占比
- 以该客群模型分有记录的第一个月为基准的PSI. - 对象参数说明(使用时主要设置时间即可):
- Lift Chart统计信息:
- 样本量 - excel_path: excel路径.
- 各分箱样本量 - sheet_name: excel页名称.
- 各分箱逾期率 - save_path: 输出保存路径.
- AUC - if_read & if_save: if_read表示是否从数据库取数据, 若为false则从本地取数据. if_save表示是否保存数据.这两个参数主要用于debug, 默认为true即可.
- 以该客群模型分有记录的第一个月为基准的AUC ratio. - alpha: mk-test显著性阈值.
- 统计表格信息, 方便筛选排序查看, 包含以下字段: - min_user_group: 最小客群数量, 用于过滤特别小的客群. 一般不用调整, 默认即可.
- 模型分名称. - start_date & end_date: 需要查询的起始和终止时间, 根据需求设定.
- a月样本量, b月样本量...
- a月PSI, b月PSI... - 输出
- a月AUC, AUCR, b月AUC, AUCR...
- 某个客群是否异常(AUC明显下降, PSI较大). - 图片, 保存在save_path下的image中.
- NOTE: - 相关统计信息, 保存在save_path下的info中
- 当某月样本量很小, 或者没有样本时, 标记为NaN. 对应的PSI, AUC也为NaN.
- 当某月样本量比较小, 导致AUC计算异常(如某些分箱没有样本, 全为非逾期样本), 则标记为-999. - info的一些使用方法
- 对于PSI的计算, 采用平滑处理, 根据PSI计算公式, 一旦某箱为0, 而基准月该分箱只要不为0, 就会导致计算异常, 因此计算PSI时为每箱的占比在原基础上增加0.001, 使计算更加稳定.
- 读取info
![F6010A07-103A-4cdf-95A6-41848F3DE07D](image/F6010A07-103A-4cdf-95A6-41848F3DE07D.png)
- 挑选出某个模型分的信息.
![66EEADB8-4133-4338-AAB0-8FE48526CBBF](image/66EEADB8-4133-4338-AAB0-8FE48526CBBF.png)
## 使用方法 - 挑选出均值超过三倍标准差的客群.
- 准备一个Excel表格, 其中放置模型分名称, 以及对应的在数据库中的字段名. ![77F951A3-088F-4af0-AF74-C6F66BC8EAE6](image/77F951A3-088F-4af0-AF74-C6F66BC8EAE6.png)
- 创建一个模型监控对象(这样我们就有对象了^v^). - 挑选出有趋势的客群, 并按p值排序.
```python ![D39E34EF-592A-4bfe-95D8-694B3B7BBFEC](image/D39E34EF-592A-4bfe-95D8-694B3B7BBFEC.png)
# 创建对象.
mm = ModelMonitor(excel_path='./model_score.xlsx', sheet_name='mongo_model', save_path='./image/', passdue_day=15, num_month=4, min_user_group=1000, max_psi=0.1, min_aucr=0.9, if_read=True, if_save=True)
# 执行run方法.
mm.run()
```
- excel_path: Excel文件路径. # PSI
- sheet_name: Excel的目标页. - 使用方法
- save_path: 统计图存放路径. 在234服务器中, 将项目中的PSI_time.py放在自己的某一文件夹下, 然后在notebook中操作如下.
不用自己再另外手动创建文件夹, 代码会判断文件夹是否存在并创建. ```python
# 导入脚本
from PSI_time import *
# 创建对象
psi_mm = PSIMonitor(excel_path='./model_score.xlsx', sheet_name='model',
min_user_group=500, max_psi=0.1, interval_days=30,
save_path='./psi/',
if_save=True, if_read=True,
date_list=('2019-07-01', '2019-08-01', '2019-09-01', '2019-10-01','2019-11-01'))
# 运行
psi_mm.run()
```
- passdue_day: 定于逾期天数, 默认15. - 对象参数说明(使用时主要设置date_list即可):
- excel_path: excel路径.
- sheet_name: excel页名称.
- save_path: 输出保存路径.
- if_read & if_save: if_read表示是否从数据库取数据, 若为false则从本地取数据. if_save表示是否保存数据.这两个参数主要用于debug, 默认为true即可.
- max_psi: PSI异常阈值, 超过该值则视为客群分布变化过大.
- min_user_group: 最小客群数量, 用于过滤特别小的客群. 一般不用调整, 默认即可.
- interval_days: 时间跨度, 与date_list对应, 默认30天.
- date_list: 时间区间, 如这里包含4个区间(4个月), 每个区间约30天.
- num_month: 想要统计近期几个月(包含运行程序时所在的日期前一天, 如运行时为7.1, 则不包含7月数据, 如运行时为7.10, 则将7月9天算作7月数据). - 输出
- min_user_group: 最小客群数量. - 图片, 保存在save_path下的image中.
- 相关统计信息, 保存在save_path下的info中
这个参数越大, 颗粒越粗, 最后的统计图(客群数量)会越少. - info的一些使用方法
反之颗粒越小, 最后统计图会越多. - 读取info
- max_psi: 最大PSI, 大于则视为该客群异常, 基准月的PSI默认为大于5倍该值为异常. ![DDFBB70E-2A39-4292-94B8-9487474BFA35](image/DDFBB70E-2A39-4292-94B8-9487474BFA35.png)
- min_aucr: 最小AUCR, 小于则视为该客群异常. - 选取某个模型分
- if_read: 是否从数据库读取数据. ![1D7A7A0A-8B66-4f31-A5F3-F21C1FA5BADA](image/1D7A7A0A-8B66-4f31-A5F3-F21C1FA5BADA.png)
默认为False, 即从本地获取数据. - 挑选出PSI过大的客群.
- if_save: 是否将数据库抽取的数据保存到本地. ![9DF6F484-6FA3-4b60-BA42-8D27A1B025AA](image/9DF6F484-6FA3-4b60-BA42-8D27A1B025AA.png)
# AUC
## 输出 - 使用方法
- 图片保存在./image中. 在234服务器中, 将项目中的AUC_time.py放在自己的某一文件夹下, 然后在notebook中操作如下.
- PSI: ./image/PSI
- Lift Chart: ./image/AUC ```python
- 统计信息. # 导入脚本
- PSI统计信息: ./psi_info.csv from AUC_time import *
- AUC统计信息: ./auc_info.csv # 创建对象
auc_mm = AUCMonitor(excel_path='./model_score.xlsx', sheet_name='model',
passdue_day=15, save_path='./auc/',
min_user_group=500, interval_days=15, min_auc=0.55,
date_list=('2019-07-01', '2019-07-15', '2019-08-01', '2019-08-15', '2019-09-01', '2019-09-15'),
if_read=True)
# 运行
auc_mm.run()
```
- 对象参数说明(使用时主要设置date_list即可):
- excel_path: excel路径.
- sheet_name: excel页名称.
- save_path: 输出保存路径.
- if_read: 表示是否从数据库取数据, 若为false则从本地取数据.
- passdue_day: 首逾多少天算坏样本.
- min_auc: AUC阈值, 小于该值则表示模型分区分度低.
- min_user_group: 最小客群数量, 用于过滤特别小的客群. 一般不用调整, 默认即可.
- interval_days: 时间跨度, 与date_list对应, 默认15天.
- date_list: 时间区间, 如这里包含4个区间, 每个区间约15天.
- 输出
- 图片, 保存在save_path下的image中.
- 相关统计信息, 保存在save_path下的info中
- info的一些使用方法
- 读取info
![135AB666-12A0-486e-9314-5F61678CED1D](image/135AB666-12A0-486e-9314-5F61678CED1D.png)
- 选择某个模型并查看其各客群AUC
![8EC5983E-542C-4c41-A390-817CAC0C05A3](image/8EC5983E-542C-4c41-A390-817CAC0C05A3.png)
# TODO # TODO
- 添加对存在MySQL中模型分计算PSI, AUC的代码. - 自动出简略监控报告的脚本.
- 增加模型重要特征的VLM. - 将图片保存到pdf中.
# 版本信息 # 版本信息
...@@ -140,6 +201,11 @@ ...@@ -140,6 +201,11 @@
- 增加过滤空跑数据的功能. - 增加过滤空跑数据的功能.
- 增强代码鲁棒性. - 增强代码鲁棒性.
- V 0.1.0
- 全部数据从mongo中获取.
- VLM, PSI, AUC分开计算.
# 贡献 # 贡献
- 王家华 (jiahua.wang@quantgroup.cn) - 王家华 (jiahua.wang@quantgroup.cn)
......
# coding=utf-8
'''
自动写无人分析版的月监控报告.
'''
from docx import Document
from docx.shared import Cm
import warnings
warnings.filterwarnings('ignore')
class AutoReportor:
'''
自动写报告.
逻辑流程:
1. 获取原始信息.
2. 挑选重要信息.
3. 按照一定规则汇总信息, 写总结.
4. 分别对每个模型进行展示.
'''
def __init__(self):
pass
def get_info(self):
pass
def filter_info(self):
pass
def summary(self):
pass
def show_detail(self):
pass
def format(self):
pass
def run(self):
# 获取vlm, psi, auc信息.
# 提取重要信息.
# 初始化doc.
# 根据规则写总结.
# 写每个模型的信息.
# 统一格式.
# 保存.
pass
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment