当前位置: 首页 > news >正文

KS曲线python实现

目录

  • 实战

实战

# 导入第三方模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 自定义绘制ks曲线的函数
def plot_ks(y_test, y_score, positive_flag):# 对y_test重新设置索引y_test.index = np.arange(len(y_test))# 构建目标数据集target_data = pd.DataFrame({'y_test':y_test, 'y_score':y_score})# 按y_score降序排列target_data.sort_values(by = 'y_score', ascending = False, inplace = True)# 自定义分位点cuts = np.arange(0.1,1,0.1)# 计算各分位点对应的Score值index = len(target_data.y_score)*cutsscores = np.array(target_data.y_score)[index.astype('int')]# 根据不同的Score值,计算Sensitivity和SpecificitySensitivity = []Specificity = []for score in scores:# 正例覆盖样本数量与实际正例样本量positive_recall = target_data.loc[(target_data.y_test == positive_flag) & (target_data.y_score>score),:].shape[0]positive = sum(target_data.y_test == positive_flag)# 负例覆盖样本数量与实际负例样本量negative_recall = target_data.loc[(target_data.y_test != positive_flag) & (target_data.y_score<=score),:].shape[0]negative = sum(target_data.y_test != positive_flag)Sensitivity.append(positive_recall/positive)Specificity.append(negative_recall/negative)# 构建绘图数据plot_data = pd.DataFrame({'cuts':cuts,'y1':1-np.array(Specificity),'y2':np.array(Sensitivity), 'ks':np.array(Sensitivity)-(1-np.array(Specificity))})# 寻找Sensitivity和1-Specificity之差的最大值索引max_ks_index = np.argmax(plot_data.ks)plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y1.tolist()+[1], label = '1-Specificity')plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y2.tolist()+[1], label = 'Sensitivity')# 添加参考线plt.vlines(plot_data.cuts[max_ks_index], ymin = plot_data.y1[max_ks_index], ymax = plot_data.y2[max_ks_index], linestyles = '--')# 添加文本信息plt.text(x = plot_data.cuts[max_ks_index]+0.01,y = plot_data.y1[max_ks_index]+plot_data.ks[max_ks_index]/2,s = 'KS= %.2f' %plot_data.ks[max_ks_index])# 显示图例plt.legend()# 显示图形plt.show()# 导入虚拟数据
virtual_data = pd.read_excel(r'virtual_data.xlsx')
# 应用自定义函数绘制k-s曲线
plot_ks(y_test = virtual_data.Class, y_score = virtual_data.Score,positive_flag = 'P')   

在这里插入图片描述

http://www.lryc.cn/news/506720.html

相关文章:

  • 解决matplotlib中文乱码问题
  • 实操给桌面机器人加上超拟人音色
  • git stash 的文件如何找回
  • 皮肤伤口分割数据集labelme格式248张5类别
  • uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
  • 双内核架构 Xenomai 4 安装教程
  • 【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.
  • neo4j 图表数据导入到 TuGraph
  • 启动报错java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus
  • 【ubuntu18.04】ubuntu18.04挂在硬盘出现 Wrong diagnostic page; asked for 1 got 8解决方案
  • kubeadm安装K8s高可用集群之集群初始化及master/node节点加入calico网络插件安装
  • 游戏何如防抓包
  • 【LeetCode】每日一题 2024_12_19 找到稳定山的下标(模拟)
  • 运维 mysql、redis 、RocketMQ性能排查
  • [SAP ABAP] 将内表数据转换为HTML格式
  • LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库
  • 使用C语言连接MySQL
  • PyTorch 2.0 以下版本中设置默认使用 GPU 的方法
  • 信号槽【QT】
  • 【UE5 C++课程系列笔记】10——动态单播/多播的基本使用
  • 点击展示大图预览
  • 【C++】分书问题:深入解析、回溯法高级应用与理论拓展
  • java开发入门学习五-流程控制
  • 【FFmpeg 教程 一】截图
  • 北邮,成电计算机考研怎么选?
  • 深入了解京东API接口:如何高效获取商品详情与SKU信息
  • C++常见内存泄漏案例分析以及解决方案
  • [LeetCode-Python版]206. 反转链表(迭代+递归两种解法)
  • 70 mysql 中事务的隔离级别
  • C语言二叉树