在信贷领域AUC&KS指标能提现模型的学习效果,但是在评估模型的相对好坏,以及制定使用方案的时候还是需要通过率&逾期率曲线进行评估模型的。

横坐标为累计通过率,纵坐标为累计逾期率,此时比较相同的通过率情况下,逾期率越高,曲线位置就越靠近上方。

1、可以理解曲线下的面积越小越好,跟AUC曲线是相反的逻辑。

2、要看细节部分,在某个局部区间通过率下是否局部更好,是否可以交叉使用

3、是否整个曲线都是缠绕的,如果是的话,考虑选择AUC评估指标吧。

本文代码分为两个部分

首先计算通过率&逾期率指标,然后绘制通过率逾期率曲线。

# 简化版的通过率逾期率
def get_pass_and_overdue_with_list(pred_result_and_real_label: List[Tuple[float, float]]) -> Tuple[List, List]:"""输入预测概率和实际label,输出通过率和逾期率序列pred_result_and_real_label = data[['ruleset_111_mexico_loan_xgboost_score','first1_overdue3']].values.tolist():param pred_result_and_real_label: 包含预测概率和实际label的元组组成的列表,注意元组的第一个元素为预测概率:return: 通过率和逾期率序列"""# 按照元组中的第一个元素,也就是预测值进行升序排列,可变对象已更改pred_result_and_real_label.sort(key=lambda x: x[0])# 获取序列的长度the_length = len(pred_result_and_real_label)print(f"the_length {the_length} ")# pass_ratepass_rate = []# overdue_rateoverdue_rate = []# 遍历过程中每个节点的总逾期数目overdue_sum = 0.0for i in range(the_length):# 实时计算通过率并保存pass_rate.append((i + 1.0) / the_length)# 实时计算总逾期数目overdue_sum += pred_result_and_real_label[i][1]# 使用实时计算的总逾期数目计算当前在总样本上的逾期率并保存overdue_rate.append(overdue_sum / (i + 1.0))return pass_rate, overdue_ratedef get_auc_ks(data, prob_col='prob', label_col='overdue'):""":param data::param prob_col::param label_col::return:"""from sklearn.metrics import roc_curve, aucfpr, tpr, thresholds = roc_curve(data[label_col], data[prob_col])auc_value = auc(fpr, tpr)ks = max(tpr - fpr)return auc_value, ksdef get_pass_and_overdue_by_dataframe(data, prob_col='prob', label_col='overdue', float_round=5):""":param data::param prob_col::param label_col::param float_round::return:"""from tqdm import tqdmdata[prob_col] = data[prob_col].apply(lambda x: float(str(x)[0:float_round]))data.sort_values(by=prob_col, ascending=True, inplace=True)data['flag'] = 1data_agg = data.groupby(prob_col).agg({'flag': 'sum', label_col: 'sum'})data_agg.reset_index(drop=False, inplace=True)probs = list(set(data_agg[prob_col]))probs.sort()ttl_cnt = data.shape[0]pass_rats = []overdue_rats = []for prob_ in tqdm(probs):pass_rat = data_agg[data_agg[prob_col] <= prob_]['flag'].sum() / ttl_cntpass_rats.append(pass_rat)cum_overdue = data_agg[data_agg[prob_col] <= prob_][label_col].sum()overdue_rat = cum_overdue / data[data[prob_col] <= prob_].shape[0]overdue_rats.append(overdue_rat)return pass_rats, overdue_ratsdef get_auc_ks_pass_overdue_rat(data, prob_col='prob', label_col='overdue', float_round=5, plot=False):""":param data::param prob_col::param label_col::param float_round::param plot::return:"""print(f'get_auc_ks_pass_overdue_rat prob_col:{prob_col} label_col:{label_col}')data = data[[prob_col, label_col]].copy()num = data.shape[0]auc_value, ks = get_auc_ks(data, prob_col=prob_col, label_col=label_col)pass_rats, overdue_rats = get_pass_and_overdue_by_dataframe(data, prob_col=prob_col, label_col=label_col,float_round=float_round)if plot == True:plt.figure(figsize=(6, 6))# 开始画图 modes_metrics oot_dstx_num,oot_zcfl_numplt.title(f'{label_col}|num:{num}')plt.plot(pass_rats, overdue_rats, color='green', label=f'auc:{auc_value:.4f}_ks:{ks:.4f}')plt.legend()  # 显示图例plt.xlabel('pass_rat')plt.ylabel('cum_overdue')plt.grid()plt.show()return auc_value, ks, pass_rats, overdue_rats, numdef get_auc_ks_pass_overdue_rat_with_data_type(train_data, data_type='data_type', dstx='dstx', zcfl='zcfl', prob_col='prob', label_col='overdue', float_round=5, plot=False):"""计算正常分流&大赦天下的模型指标:param train_data: dataframe:param data_type: dstx&zcfl:param dstx: dstx的标记:param zcfl: zcfl的标记:param prob_col: 预测概率值列:param label_col: 标签列:param float_round: 保留精度:param plot: 是否绘制通过预期曲线:return:"""data = train_data[train_data[data_type] == dstx][[prob_col, label_col]].copy()oot_dstx_auc_value, oot_dstx_ks, oot_dstx_pass_rats, oot_dstx_overdue_rats, oot_dstx_num = get_auc_ks_pass_overdue_rat(data\, prob_col=prob_col\, label_col=label_col\, float_round=5\, plot=False)data = train_data[train_data[data_type] == zcfl][[prob_col, label_col]].copy()oot_zcfl_auc_value, oot_zcfl_ks, oot_zcfl_pass_rats, oot_zcfl_overdue_rats, oot_zcfl_num = get_auc_ks_pass_overdue_rat(data \, prob_col=prob_col \, label_col=label_col \, float_round=5 \, plot=False)if plot:fig, axs = plt.subplots(2, 1)plt.rcParams['figure.figsize'] = (9, 12.0)axs[0].plot(oot_dstx_pass_rats, oot_dstx_overdue_rats)axs[0].set_ylim(0, 0.5)axs[0].set_xlim(0, 1)axs[0].set_title(f'oot dstx nocv fpd3|num:{oot_dstx_num}')axs[0].set_xlabel('pass_rat')axs[0].set_ylabel('cum_overdue')  # ,fontproperties = fontaxs[0].grid(True)axs[0].legend(["auc:%.4f ks:%.4f" % (oot_dstx_auc_value, oot_dstx_ks)], loc="lower left")axs[1].plot(oot_zcfl_pass_rats, oot_zcfl_overdue_rats)axs[1].set_ylim(0, 0.5)axs[1].set_xlim(0, 1)axs[1].set_title(f'oot zcfl nocv fpd3|num:{oot_zcfl_num}')axs[1].set_xlabel('pass_rat')axs[1].set_ylabel('cum_overdue')  # ,fontproperties = fontaxs[1].grid(True)axs[1].legend(["auc:%.4f ks:%.4f" % (oot_zcfl_auc_value, oot_zcfl_ks)], loc="lower left")return oot_dstx_auc_value, oot_dstx_ks, oot_dstx_pass_rats, oot_dstx_overdue_rats, oot_dstx_num, \oot_zcfl_auc_value, oot_zcfl_ks, oot_zcfl_pass_rats, oot_zcfl_overdue_rats, oot_zcfl_num

绘制通过率逾期率曲线

def plot_dstx_zcfl_pass_overdue(modes_metrics, label='fpd3', line_desc=None,
                                colors=['skyblue', 'green', 'blue', 'y', 'r']):
    """
    一张图绘制两个子图,分别绘制zcfl & dstx的通过率逾期率
    :param modes_metrics: each row contains oot_dstx_auc_value, oot_dstx_ks, oot_dstx_pass_rats,  oot_dstx_overdue_rats,
     oot_dstx_num, oot_zcfl_auc_value, oot_zcfl_ks, oot_zcfl_pass_rats, oot_zcfl_overdue_rats, oot_zcfl_num
    :param label: overdue label
    :param line_desc: 图例描述
    :param colors: 图例颜色
    :return: None
    """
    import matplotlib.font_manager as fm
    font_size=12
    # 设置family、size 
    font = fm.FontProperties(fname='/data/simhei.ttf', size=font_size)
    plt.rcParams['figure.figsize'] = (9, 12.0)
    fig, axs = plt.subplots(2, 1)
    if line_desc is None:
        line_desc = ['']*len(modes_metrics)
        
    for i in range(len(modes_metrics)):
        oot_dstx_auc_value, oot_dstx_ks, oot_dstx_pass_rats, oot_dstx_overdue_rats, oot_dstx_num = modes_metrics[i][0:5]
        axs[0].plot(oot_dstx_pass_rats, oot_dstx_overdue_rats, color=colors[i],
                    label=f'auc:{oot_dstx_auc_value:.4f}|ks:{oot_dstx_ks:.4f}_{line_desc[i]}' )
    axs[0].set_ylim(0, 0.4)
    axs[0].set_xlim(0, 1)
    axs[0].set_title(f'oot dstx nocv {label}|num:{oot_dstx_num}')
    axs[0].set_xlabel('pass_rat')
    axs[0].set_ylabel('cum_overdue', fontproperties=font)
    axs[0].legend(loc="lower right",prop=font)  # 显示图例
    axs[0].grid(True)

for i in range(len(modes_metrics)):
        oot_dstx_auc_value, oot_dstx_ks, oot_dstx_pass_rats, oot_dstx_overdue_rats, oot_dstx_num = modes_metrics[i][5:]
        axs[1].plot(oot_dstx_pass_rats, oot_dstx_overdue_rats, color=colors[i],
                    label=f'auc:{oot_dstx_auc_value:.4f}|ks:{oot_dstx_ks:.4f}_{line_desc[i]}' )
    axs[1].set_ylim(0, 0.4)
    axs[1].set_xlim(0, 1)
    axs[1].set_title(f'oot zcfl nocv {label}|num:{oot_dstx_num}')
    axs[1].set_xlabel('pass_rat')
    axs[1].set_ylabel('cum_overdue' , fontproperties = font)
    axs[1].legend(loc="lower right",prop=font)  # 显示图例
    axs[1].grid(True)

绘图结果如上图

计算通过率逾期率并绘制通过率逾期率曲线相关推荐

  1. python 曲线分析_大数据分析之Python计算KS值并绘制KS曲线

    本篇教程探讨了大数据分析之Python计算KS值并绘制KS曲线,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. python实现KS曲线,相关使用方法请参考上篇博客-R语言实现K ...

  2. 【MATLAB编程实战】【例题实战】绘制曲面、曲线,求解偏导,计算极值点,二重积分,曲线积分,收敛性,麦克劳林展开式

    欢迎关注,本专栏主要更新MATLAB仿真.界面.基础编程.画图.算法.矩阵处理等操作,拥有丰富的实例练习代码,欢迎订阅该专栏!(等该专栏建设成熟后将开始收费,快快上车吧~~) [MATLAB编程实战] ...

  3. 【Android UI】贝塞尔曲线 ⑦ ( 使用 德卡斯特里奥算法 公式计算的 方法绘制三阶贝塞尔曲线示例 )

    文章目录 一.使用 德卡斯特里奥算法 公式计算的 方法绘制三阶贝塞尔曲线 二.代码示例 贝塞尔曲线参考 : https://github.com/venshine/BezierMaker 一.使用 德 ...

  4. C++:实现计算和绘制一个年历曲线各种轨道参数(附完整源码)

    C++:实现计算和绘制一个年历曲线各种轨道参数 # include <cmath> # include <cstdlib> # include <cstring> ...

  5. 交叉验证分析每一折(fold of Kfold)验证数据的评估指标并绘制综合ROC曲线

    交叉验证分析每一折(fold of Kfold)验证数据的评估指标并绘制综合ROC曲线 Receiver Operating Characteristic (ROC) with cross valid ...

  6. matlab绘制贝叶斯曲线,Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线

    原文链接:http://tecdat.cn/?p=15508 绘制ROC曲线通过Logistic回归进行分类 加载样本数据.load fisheriris通过使用与versicolor和virgini ...

  7. lisp 非对称缓和曲线_利用AutoLISP语言绘制带缓和曲线的铁路曲线平面图

    利用 AutoLISP 语言绘制带缓和曲线的铁路曲线平面图 [ 摘要 ] 通过 AutoLISP 编程方法的剖析 , 探讨了基于 Visual LISP(VLISP) 编程软件环境下 , 利用 Aut ...

  8. python绘制三维曲线图_机器学习的绘图库有哪些?如何运用python绘制机器学习常见曲线?...

    专栏引荐 绘图的变量 单变量 查看单变量最方便的无疑是displot()函数,默许绘制一个直方图,并你核密度估计(KDE) sns.set(color_codes=True) np.random.se ...

  9. 贝塞尔曲线是什么?如何用 Canvas 绘制三阶贝塞尔曲线?

    大家好,我是前端西瓜哥. 今天谈谈贝塞尔曲线是什么以及它的原理,并说说如何用 Canvas 技术绘制一条三阶贝塞尔曲线. 贝塞尔曲线是什么? 贝塞尔曲线,是通过几个简单的参数描述一条曲线的一种参数曲线 ...

最新文章

  1. python dataframe 分位数_Python pandas.DataFrame.quantile函数方法的使用
  2. java 简单 语言_将简单的表达式语言放入java中
  3. Nature封面:人类还在看提词器,AI的辩论能力却出现了重大进展
  4. Make uploadify button text support multiple languages(使uploadify的buttonText支持多国语言)
  5. 如何基于OceanBase构建应用和数据库的异地多活
  6. Cocos2d-x 脚本语言Lua中的面向对象
  7. java恶意小程序_小程序java实现校验一张图片是否含有违法违规内容security.imgSecCheck...
  8. MySQL的库表详细操作
  9. android ramdisk
  10. 对jvm 同步锁的理解
  11. web文件怎么传到服务器,web文件传到服务器
  12. 浏览器市场占有率_全球市场占有率第一的谷歌浏览器添加对ipfs://的支持!
  13. xp系统什么梗_老式电脑,装个什么样的系统最好用?
  14. macbook配置java环境变量_配置java环境变量
  15. token怎么获取 php,如何用php获取某个页面中的input的csrf_token?
  16. 2016年最值得关注的16个网页设计趋势
  17. 如何查看CSND私密文章
  18. Excel-制作简单的环形柱状图
  19. Git与GitHub的了解与运用
  20. 宏与宏病毒——学习笔记

热门文章

  1. 初中七年级计算机课教学总结怎么写,初中计算机教学工作总结范文
  2. 一款适合小白的jmeter入门文档,性能测试工具-jmeter使用教程
  3. 电容在电路中各种作用的基本常识
  4. android 11.0 12.0自定义开机向导app
  5. 【Android】对话框AlertDialog的使用(一)
  6. 【Python技能树共建】Beautiful Soup
  7. 数学分析课程笔记(张平):函数
  8. 基于视觉信息的网页分块算法(VIPS)
  9. 已解决:好用的集成PHP环境 一键安装包PHPNow--Win7下安装phpnow的方法出现[ Apache_pn ] 错误的解决 !(亲自测试通过)
  10. 开始LeetCode刷题的第一天