模型评价指标—count_table

对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、F1值、KS曲线、ROC曲线、AUC面积等。
也可以自己定义函数,把模型结果分割成n(100)份,计算top1的准确率、覆盖率。

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

本文目录
  1. 详细介绍count_table

  2. 用Python如何计算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的具体代码和调用语句:

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实现实例已讲解完毕,感兴趣的同学可以自己尝试实现一下。

往期回顾:

3D星空图
3D星空图V2版
520表白代码合集
用python绘制皮卡丘

娱乐圈排行榜动态条形图绘制

扫一扫关注我

13162366985

投稿微信号、手机

请使用浏览器的分享功能分享到微信等