前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >模型评价指标—count_table

模型评价指标—count_table

作者头像
阿黎逸阳
发布2023-08-21 18:57:21
1470
发布2023-08-21 18:57:21
举报
文章被收录于专栏:阿黎逸阳的代码

对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、F1值、KS曲线、ROC曲线、AUC面积等。

也可以自己定义函数,把模型结果分割成n(100)份,计算top1的准确率、覆盖率。

之前阐述了混淆矩阵F1值KS曲线ROC曲线AUC面积,本文是该系列的完结篇,介绍自定义函数count_table

一、详细介绍count_table

count_table是根据业务需要自定义的一个函数,是分类问题的一个衡量指标。

由于当时所在的公司需要建立模型,从商户交易流水中获取有用的信息,判断该商户是否有赌博、欺诈、伪卡、盗刷、洗钱等风险。

而公司的运营人员是有限的,这时需要模型从海量商户中捞出有以上风险特征的商户,推送给运营人员进行排查。

这时更关注的是模型评分top部分的准确率,基于这个需要,就自己写了count_table函数来衡量模型的优秀程度。

count_table的表结构如下:

每一列代表的含义详解:‍

group:组别,代表该行是第几组。

group_num:该组含的样本数。一般是均分的,比如10个样本,分5组,那每组含的样本数为2。

group_cumsum:该组累计样本数。从第一组累积到该组,总计的样本数。

y_sum:该组标签为1的样本数,在风险领域一般定义有风险的样本标签为1。

y_cumsum:该组累计标签为1的样本数。

group_bad_rate:该组坏样本率,即该组标签为1的样本数除以该组含的样本数。

coverage_rate:累计到该组的坏样本覆盖率,即该组累计标签为1的样本数除以该组累计样本数。

min_score:该组样本的最低得分,如果是概率的话即为最低概率。

max_score:该组样本的最高得分,如果是概率的话即为最高概率。

二、用Python如何计算count_table

接下来就来看下count_table的具体代码和调用语句:

代码语言:javascript
复制
def count_table(predict, y, num=100):
  '''
  predict为预测值
  y为真实值
  num为分组的数量
  '''
  num=num
  check_table=pd.concat([predict, y], axis=1)
  check_table_1=check_table.sort_values(by="predict",ascending=False).reset_index(drop=True)
  check_table_1['rank']=np.floor((check_table_1.index / len(check_table_1) * num) + 1)
  check_table_1=check_table_1.astype(float)
  group=pd.DataFrame(check_table_1['rank'].drop_duplicates().reset_index(drop=True))
  group=group.astype(int)
  group_num=pd.DataFrame(check_table_1['rank'].value_counts().reset_index(drop=True))
  count_table=pd.concat([group,group_num], axis=1)
  count_table.columns=['group', 'group_num']
  count_table['group_cumsum']=count_table['group_num'].cumsum()
  count_table['y_sum']=pd.DataFrame(check_table_1.groupby(by=['rank'])['y'].sum().reset_index(drop=True))
  count_table['y_cumsum']=count_table['y_sum'].cumsum()
  count_table['group_bad_rate']=count_table['y_sum']/count_table['group_num']
  count_table['coverage_rate']=count_table['y_cumsum']/sum(count_table['y_sum'])
  count_table['min_score'] = pd.DataFrame(check_table_1.groupby(by=['rank'])['predict'].min().reset_index(drop=True))
  count_table['max_score'] = pd.DataFrame(check_table_1.groupby(by=['rank'])['predict'].max().reset_index(drop=True))
  return count_table

count_table=count_table(train_date['predict'], train_date['y'], 30)
count_table

train_date['predict']:模型预测值或预测分数。

train_date['y']:真实值。

30:分的组数,可以自己随意定义。

得到结果如下:

可以发现,当概率大于0.954时,该组坏样本数为39,总计样本数为40,该组坏样本率为0.975,坏样本覆盖率为0.13。‍

至此,count_table介绍和Python实现实例已讲解完毕,感兴趣的同学可以自己尝试实现一下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿黎逸阳的代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档